diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..b06e065 --- /dev/null +++ b/.classpath @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f6328d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/bin/ +*~ diff --git a/.project b/.project new file mode 100644 index 0000000..ff5ee35 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + Sector-game + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..8000cd6 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/lib/OpenAL32.dll b/lib/OpenAL32.dll new file mode 100644 index 0000000..6dd2600 Binary files /dev/null and b/lib/OpenAL32.dll differ diff --git a/lib/OpenAL64.dll b/lib/OpenAL64.dll new file mode 100644 index 0000000..00c98c0 Binary files /dev/null and b/lib/OpenAL64.dll differ diff --git a/lib/commons-io-2.4-src.zip b/lib/commons-io-2.4-src.zip new file mode 100644 index 0000000..96cb6ee Binary files /dev/null and b/lib/commons-io-2.4-src.zip differ diff --git a/lib/commons-io-2.4.jar b/lib/commons-io-2.4.jar new file mode 100644 index 0000000..90035a4 Binary files /dev/null and b/lib/commons-io-2.4.jar differ diff --git a/lib/commons-logging-1.1.1.jar b/lib/commons-logging-1.1.1.jar new file mode 100644 index 0000000..8758a96 Binary files /dev/null and b/lib/commons-logging-1.1.1.jar differ diff --git a/lib/httpclient-4.2.2.jar b/lib/httpclient-4.2.2.jar new file mode 100644 index 0000000..5f768c4 Binary files /dev/null and b/lib/httpclient-4.2.2.jar differ diff --git a/lib/httpcomponents-client-4.2.2-src.zip b/lib/httpcomponents-client-4.2.2-src.zip new file mode 100644 index 0000000..e988ae1 Binary files /dev/null and b/lib/httpcomponents-client-4.2.2-src.zip differ diff --git a/lib/httpcore-4.2.2.jar b/lib/httpcore-4.2.2.jar new file mode 100644 index 0000000..a64cd2f Binary files /dev/null and b/lib/httpcore-4.2.2.jar differ diff --git a/lib/jdom-2.0.3-sources.zip b/lib/jdom-2.0.3-sources.zip new file mode 100644 index 0000000..b6b7ef2 Binary files /dev/null and b/lib/jdom-2.0.3-sources.zip differ diff --git a/lib/jdom-2.0.3.jar b/lib/jdom-2.0.3.jar new file mode 100644 index 0000000..821fa3e Binary files /dev/null and b/lib/jdom-2.0.3.jar differ diff --git a/lib/jinput-dx8.dll b/lib/jinput-dx8.dll new file mode 100644 index 0000000..6d27ad5 Binary files /dev/null and b/lib/jinput-dx8.dll differ diff --git a/lib/jinput-dx8_64.dll b/lib/jinput-dx8_64.dll new file mode 100644 index 0000000..6730589 Binary files /dev/null and b/lib/jinput-dx8_64.dll differ diff --git a/lib/jinput-raw.dll b/lib/jinput-raw.dll new file mode 100644 index 0000000..ce1d162 Binary files /dev/null and b/lib/jinput-raw.dll differ diff --git a/lib/jinput-raw_64.dll b/lib/jinput-raw_64.dll new file mode 100644 index 0000000..3d2b3ad Binary files /dev/null and b/lib/jinput-raw_64.dll differ diff --git a/lib/jinput.jar b/lib/jinput.jar new file mode 100644 index 0000000..7c2b6b0 Binary files /dev/null and b/lib/jinput.jar differ diff --git a/lib/jogg-0.0.7.jar b/lib/jogg-0.0.7.jar new file mode 100644 index 0000000..ecb0260 Binary files /dev/null and b/lib/jogg-0.0.7.jar differ diff --git a/lib/jorbis-0.0.15.jar b/lib/jorbis-0.0.15.jar new file mode 100644 index 0000000..4cf51f9 Binary files /dev/null and b/lib/jorbis-0.0.15.jar differ diff --git a/lib/libjinput-linux.so b/lib/libjinput-linux.so new file mode 100644 index 0000000..3cdc439 Binary files /dev/null and b/lib/libjinput-linux.so differ diff --git a/lib/libjinput-linux64.so b/lib/libjinput-linux64.so new file mode 100644 index 0000000..de1ee5f Binary files /dev/null and b/lib/libjinput-linux64.so differ diff --git a/lib/libjinput-osx.jnilib b/lib/libjinput-osx.jnilib new file mode 100644 index 0000000..59a3eab Binary files /dev/null and b/lib/libjinput-osx.jnilib differ diff --git a/lib/liblwjgl.jnilib b/lib/liblwjgl.jnilib new file mode 100644 index 0000000..cbb5b4c Binary files /dev/null and b/lib/liblwjgl.jnilib differ diff --git a/lib/liblwjgl.so b/lib/liblwjgl.so new file mode 100644 index 0000000..5a02874 Binary files /dev/null and b/lib/liblwjgl.so differ diff --git a/lib/liblwjgl64.so b/lib/liblwjgl64.so new file mode 100644 index 0000000..4572589 Binary files /dev/null and b/lib/liblwjgl64.so differ diff --git a/lib/libopenal.so b/lib/libopenal.so new file mode 100644 index 0000000..7742faf Binary files /dev/null and b/lib/libopenal.so differ diff --git a/lib/libopenal64.so b/lib/libopenal64.so new file mode 100644 index 0000000..d1e45e5 Binary files /dev/null and b/lib/libopenal64.so differ diff --git a/lib/lwjgl-source-2.8.4.zip b/lib/lwjgl-source-2.8.4.zip new file mode 100644 index 0000000..f48fd31 Binary files /dev/null and b/lib/lwjgl-source-2.8.4.zip differ diff --git a/lib/lwjgl.dll b/lib/lwjgl.dll new file mode 100644 index 0000000..6819404 Binary files /dev/null and b/lib/lwjgl.dll differ diff --git a/lib/lwjgl.jar b/lib/lwjgl.jar new file mode 100644 index 0000000..a0fb56d Binary files /dev/null and b/lib/lwjgl.jar differ diff --git a/lib/lwjgl64.dll b/lib/lwjgl64.dll new file mode 100644 index 0000000..e66ab2a Binary files /dev/null and b/lib/lwjgl64.dll differ diff --git a/lib/lwjgl_util.jar b/lib/lwjgl_util.jar new file mode 100644 index 0000000..9973b24 Binary files /dev/null and b/lib/lwjgl_util.jar differ diff --git a/lib/slick-util-src.zip b/lib/slick-util-src.zip new file mode 100644 index 0000000..7ca6790 Binary files /dev/null and b/lib/slick-util-src.zip differ diff --git a/lib/slick-util.jar b/lib/slick-util.jar new file mode 100644 index 0000000..86a64a7 Binary files /dev/null and b/lib/slick-util.jar differ diff --git a/php-server/class.DbUtil.php b/php-server/class.DbUtil.php new file mode 100644 index 0000000..c560ab2 --- /dev/null +++ b/php-server/class.DbUtil.php @@ -0,0 +1,390 @@ + $score){ + + }else{ + // UPDATE + self::query("UPDATE `SECTOR_SCORES` SET `time`='$time', `score`='$score' WHERE `lid` = '$lid' AND `uid` = '$uid' LIMIT 1;"); + if($scoreOld != $score) $change = "true"; + } + } + + self::getLevelScores($lid, $change, $lastRecord); + + exit(); + } + + public static function refreshLogin($uid){ + $token = Util::uniqueString(20); + + self::query(" + UPDATE `SECTOR_USERS` + SET `auth_token` = '$token' + WHERE `uid` = '$uid' + LIMIT 1; + "); + + $result = self::query("SELECT `name`,`email`,`reg_time`,`country` FROM `SECTOR_USERS` WHERE `uid` = '$uid';"); + + $row = mysql_fetch_assoc($result); + + $name = $row["name"]; + $email = $row["email"]; + $reg_time = $row["reg_time"]; + $country = $row["country"]; + + echo XmlGen::sessionInfo($uid, $token, $name, $email, $reg_time, $country); + } + + + + public static function addLevel($title, $filename){ + + $result = self::query("SELECT COUNT(*) FROM `SECTOR_LEVELS` WHERE `filename` = '".mysql_real_escape_string($filename)."';"); + $row = mysql_fetch_array($result); + $cnt = $row[0]; + + if($cnt>0) XmlGen::error_exit("LEVEL_ALREADY_ADDED"); + + $result = self::query("SELECT COUNT(*) FROM `SECTOR_LEVELS` WHERE `title` = '".mysql_real_escape_string($title)."';"); + $row = mysql_fetch_array($result); + $cnt = $row[0]; + + if($cnt>0) XmlGen::error_exit("LEVEL_NAME_NOT_UNIQUE"); + + $result = self::query("SELECT `value` FROM `SECTOR_INFO` WHERE `key` = 'LEVELS_PATH_RELATIVE_TO_SERVER';"); + $row = mysql_fetch_array($result); + $path = $row[0]; + + $result = self::query("SELECT `value` FROM `SECTOR_INFO` WHERE `key` = 'LEVELS_PATH';"); + $row = mysql_fetch_array($result); + $apath = $row[0]; + + $fpath = $path.$filename; + + + if(!file_exists($fpath)){ + XmlGen::error_exit("FILE_NOT_FOUND","Level file does not exist: ".$fpath); + } + + if(substr($filename,strlen($filename)-4) != ".xml"){ + XmlGen::error_exit("BAD_FILE_FORMAT", "Level file must be XML: ".$fpath); + } + + + // generate a LID + $lid = ""; + while(true){ + $lid = "L-".Util::uniqueString(9); + $result = self::query("SELECT COUNT(*) FROM `SECTOR_LEVELS` WHERE `lid` = '$lid';"); + $row = mysql_fetch_row($result); + if($row[0] == 0) break; + } + + + $hash = md5_file($fpath); + + $title = mysql_real_escape_string($title); + $filename = mysql_real_escape_string($filename); + + $time = time(); + + + self::query(" + INSERT + INTO `SECTOR_LEVELS` + (`lid`,`title`,`filename`,`checksum`,`time`) + VALUES + ('$lid','$title','$filename','$hash','$time'); + "); + + echo XmlGen::levelAddedInfo($lid, $title, $apath.$filename, $hash, $time); + + exit(); + } + + public static function query($q){ + $res = mysql_query($q) or die(XmlGen::error("INTERNAL_ERROR", "DbError: ".mysql_error())); + return $res; + } +} diff --git a/php-server/class.SimpleDocument.php b/php-server/class.SimpleDocument.php new file mode 100644 index 0000000..7969919 --- /dev/null +++ b/php-server/class.SimpleDocument.php @@ -0,0 +1,35 @@ +createElement($rootName, $attribs); + + $this->rootNode = $this->appendChild($rootElement); + } + + public function createAttribute($name, $value){ + $a = parent::createAttribute($name); + $a->value = $value; + return $a; + } + + public function createElement($name='element', $attribs = null, $inner=''){ + $elem = parent::createElement($name,$inner); + + if($attribs != null){ + foreach($attribs as $key => $value){ + $a = $this->createAttribute($key, $value); + $elem->appendChild($a); + } + } + + return $elem; + } + + public function appendChildToRoot(DOMElement $element){ + return $this->rootNode->appendChild($element); + } +} diff --git a/php-server/class.Util.php b/php-server/class.Util.php new file mode 100644 index 0000000..99923a8 --- /dev/null +++ b/php-server/class.Util.php @@ -0,0 +1,38 @@ +appendChildToRoot( $doc->createElement("hash", null, $hash) ); + return $doc->saveXML(); + } + + public static function deleteMessage(){ + self::sendHeaders(); + $doc = new SimpleDocument("status"); + $doc->appendChildToRoot( $doc->createElement("msg", null, "Profile deleted.") ); + return $doc->saveXML(); + } + + public static function infoTable($info){ + self::sendHeaders(); + $doc = new SimpleDocument("info"); + foreach($info as $k => $v){ + $eElem = $doc->createElement("entry"); + $enode = $doc->appendChildToRoot($eElem); + + $enode->appendChild($doc->createElement("key", null, $k)); + $enode->appendChild($doc->createElement("value", null, $v)); + } + return $doc->saveXML(); + } + + public static function userList($users){ + self::sendHeaders(); + $doc = new SimpleDocument("users"); + foreach($users as $u){ + $userElem = $doc->createElement("user"); + $unode = $doc->appendChildToRoot($userElem); + + $unode->appendChild($doc->createElement("name", null, $u[0])); + $unode->appendChild($doc->createElement("reg_time", null, $u[1])); + $unode->appendChild($doc->createElement("country", null, $u[2])); + } + return $doc->saveXML(); + } + + public static function levelList($data){ // `lid`,`title`,`filename`,`checksum`,`time` + self::sendHeaders(); + $doc = new SimpleDocument("levels"); + foreach($data as $l){ + $level = $doc->createElement("level"); + + $lnode = $doc->appendChildToRoot($level); + $lnode->appendChild($doc->createElement("lid", null, $l[0])); + $lnode->appendChild($doc->createElement("title", null, $l[1])); + $lnode->appendChild($doc->createElement("url", null, $l[2])); + $lnode->appendChild($doc->createElement("checksum", null, $l[3])); + $lnode->appendChild($doc->createElement("created", null, $l[4])); + } + return $doc->saveXML(); + } + + public static function scoreList($lid, $data, $changeFlag=null, $lastRecord=null){ // username, uid, time, score + self::sendHeaders(); + $attrs = array(); + if($changeFlag!=null) $attrs["score_improved"] = $changeFlag; + if($changeFlag!=null) $attrs["last_score"] = $lastRecord; + $doc = new SimpleDocument("scores", $attrs); + foreach($data as $l){ + $level = $doc->createElement("score"); + + $lnode = $doc->appendChildToRoot($level); + $lnode->appendChild($doc->createElement("uid", null, $l[1])); + $lnode->appendChild($doc->createElement("name", null, $l[0])); + $lnode->appendChild($doc->createElement("time", null, $l[2])); + $lnode->appendChild($doc->createElement("score", null, $l[3])); + } + return $doc->saveXML(); + } + + public static function levelAddedInfo($lid, $title, $url, $hash, $time){ + self::sendHeaders(); + $doc = new SimpleDocument("level"); + + $doc->appendChildToRoot( $doc->createElement("lid", null, $lid) ); + $doc->appendChildToRoot( $doc->createElement("title", null, $title) ); + $doc->appendChildToRoot( $doc->createElement("url", null, $url) ); + $doc->appendChildToRoot( $doc->createElement("checksum", null, $hash) ); + $doc->appendChildToRoot( $doc->createElement("created", null, $time) ); + + return $doc->saveXML(); + } + + public static function sessionInfo($uid, $token, $name=null, $email=null, $reg_time=null, $country=null){ + self::sendHeaders(); + $doc = new SimpleDocument("session"); + + $doc->appendChildToRoot( $doc->createElement("uid", null, $uid) ); + $doc->appendChildToRoot( $doc->createElement("auth_token", null, $token) ); + + $doc->appendChildToRoot( $doc->createElement("name", null, $name) ); + $doc->appendChildToRoot( $doc->createElement("email", null, $email) ); + $doc->appendChildToRoot( $doc->createElement("reg_time", null, $reg_time) ); + $doc->appendChildToRoot( $doc->createElement("country", null, $country) ); + + return $doc->saveXML(); + } + + public static function error($error, $msg=""){ + self::sendHeaders(); + global $ERR; + $e = $ERR[$error]; + $doc = new SimpleDocument("error"); + + $doc->appendChildToRoot( $doc->createElement("code", null, $e[0]) ); + $doc->appendChildToRoot( $doc->createElement("message", null, $e[1]) ); + $doc->appendChildToRoot( $doc->createElement("cause", null, $msg) ); + + return $doc->saveXML(); + } + + public static function error_exit($error, $msg=""){ + self::sendHeaders(); + global $ERR; + $e = $ERR[$error]; + $doc = new SimpleDocument("error"); + + $doc->appendChildToRoot( $doc->createElement("code", null, $e[0]) ); + $doc->appendChildToRoot( $doc->createElement("message", null, $e[1]) ); + $doc->appendChildToRoot( $doc->createElement("cause", null, $msg) ); + + echo $doc->saveXML(); + exit(); + } + + + + public static function hacking_exit(){ + + srand(round(time()/7200)); + + if(rand(0,10)==0){ + $full_url_path = "http://".$_SERVER['HTTP_HOST'].preg_replace("#/[^/]*\.php$#simU", "/", $_SERVER["PHP_SELF"])."nothingHere.txt"; + + $ch = curl_init(); + $timeout = 5; + curl_setopt($ch, CURLOPT_URL, $full_url_path); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + echo curl_exec($ch); + curl_close($ch); + +/* echo " + +404 Not Found + + +

Not Found

+The requested document was not found on this server. +

+


+
+Web Server at ".$_SERVER['SERVER_NAME']." +
+ +";*/ + + exit(); + } + + self::sendHeaders(); + + $doc = new SimpleDocument("error"); + + $msgs = array( + 15 => "Internal server error.", + "Database connection timed out.", + "Service temporarily overloaded.", + "Service temporarily not available.", + "Operation not permitted.", + "Session has expired.", + "Brandwidth limit reached, aborting.", + "Access denied.", + "Unauthorised server access.", + "Invalid command exception.", + "Operation aborted.", + "Bad database entry format.", + ); + + + $e = rand(15,15+count($msgs)-1); + + $doc->appendChildToRoot( $doc->createElement("code", null, $e) ); + $doc->appendChildToRoot( $doc->createElement("message", null, $msgs[$e]) ); + $doc->appendChildToRoot( $doc->createElement("cause", null, "") ); + + echo $doc->saveXML(); + exit(); + } +} \ No newline at end of file diff --git a/php-server/db-structure-mysql.php b/php-server/db-structure-mysql.php new file mode 100644 index 0000000..84366b0 --- /dev/null +++ b/php-server/db-structure-mysql.php @@ -0,0 +1,75 @@ + + + + + Alpha 14 test level + Challenge level with bosses + MightyPork + 14 + + + + + + 40000 + NORMAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/php-server/mysql.php b/php-server/mysql.php new file mode 100644 index 0000000..e62bd8c --- /dev/null +++ b/php-server/mysql.php @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/php-server/server.php b/php-server/server.php new file mode 100644 index 0000000..9922328 --- /dev/null +++ b/php-server/server.php @@ -0,0 +1,281 @@ + array(0, "No command received."), + "INVALID_COMMAND" => array(1, "Invalid command requested."), + "INTERNAL_ERROR" => array(2, "Internal server error."), + "INCOMPLETE_COMMAND" => array(3, "Incomplete command received"), + "REGISTRATION_FAILED" => array(4, "Registration failed."), + "LOGIN_FAILED" => array(5, "Login failed."), + "INVALID_TOKEN" => array(6, "Authentication failed."), + "FILE_NOT_FOUND" => array(7, "File does not exist."), + "BAD_FILE_FORMAT" => array(8, "Bad file format."), + "LEVEL_ALREADY_ADDED" => array(9, "Level file is already registered to the Global Leaderboard."), + "LEVEL_NAME_NOT_UNIQUE" => array(10, "Title already used by other level."), + "NO_SUCH_LEVEL" => array(11, "No such level exists."), + "HACKING_DETECTED" => array(12, "Access denied."), +); + +define("CFG_FAKE_ERROR_FOR_HACKERS",true); + + + +require_once("mysql.php"); + +require_once("class.SimpleDocument.php"); +require_once("class.XmlGen.php"); +require_once("class.DbUtil.php"); +require_once("class.Util.php"); + + + +if(isset($_REQUEST["cmd"]) && ($_REQUEST["cmd"]=="ADD_LEVEL")){}else{ //||$_REQUEST["cmd"]=="HASH" + + // Check if the request came from a genuine Sector game + $headers = apache_request_headers(); + + if( + $headers["User-Agent"] != "Sector/HttpHelper" + or !isset($headers["X-SECTOR-VERSION"]) + or isset($headers["Cookie"]) + or isset($headers["Accept-Encoding"]) + or isset($headers["Accept-Language"]) + or isset($headers["Accept-Charset"]) + or isset($headers["Accept"]) + ){ + if(CFG_FAKE_ERROR_FOR_HACKERS){ + XmlGen::hacking_exit(); + }else{ + XmlGen::error_exit("HACKING_DETECTED","Unauthorized server access."); + } + } + + $_REQUEST["VERSION"] = $headers["X-SECTOR-VERSION"]+0; +} + + + + + +if(!isset($_REQUEST["cmd"])){ + XmlGen::error_exit("NO_COMMAND"); +} + + + + +switch($_REQUEST["cmd"]){ + + case "REGISTER": + // check if name and password exist + if(!isset($_REQUEST["name"]) || !isset($_REQUEST["password"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND","Missing 'name' or 'password'."); + } + + // trim, null -> "" + if(!isset($_REQUEST["email"])) $_REQUEST["email"] = ""; + if(!isset($_REQUEST["country"])) $_REQUEST["country"] = ""; + + $name = trim($_REQUEST["name"]); + $email = trim($_REQUEST["email"]); + $password = trim($_REQUEST["password"]); + $country = trim($_REQUEST["country"]); + + // check name and password length + if(strlen($_REQUEST["name"])==0 || strlen($_REQUEST["password"])==0){ + XmlGen::error_exit("INCOMPLETE_COMMAND","Zero-length 'name' or 'password'."); + } + + // register and return uid+auth_token + DbUtil::registerNewUser( + $name, + $password, + $email, + $country + ); + + exit(); + + + + case "EDIT_PROFILE": + // check if name and password exist + if(!isset($_REQUEST["uid"]) || !isset($_REQUEST["auth_token"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND","Missing 'uid' or 'auth_token'."); + } + + if(!DbUtil::isTokenValid($_REQUEST["uid"], $_REQUEST["auth_token"])){ + XmlGen::error_exit("INVALID_TOKEN"); + } + + // replace not set variables with nulls + if(!isset($_REQUEST["email"])) $_REQUEST["email"] = ""; + if(!isset($_REQUEST["country"])) $_REQUEST["country"] = ""; + if(!isset($_REQUEST["name"])) $_REQUEST["name"] = null; + if(!isset($_REQUEST["password"])) $_REQUEST["password"] = null; + + $uid = $_REQUEST["uid"]; + $name = Util::trimNullSafe($_REQUEST["name"]); + $email = trim($_REQUEST["email"]); + $password = Util::trimNullSafe($_REQUEST["password"]); + $country = trim($_REQUEST["country"]); + + // register and return uid+auth_token + DbUtil::modifyProfile( + $uid, + $name, + $password, + $email, + $country + ); + + exit(); + + + + case "DELETE_PROFILE": + // check if name and password exist + if(!isset($_REQUEST["uid"]) || !isset($_REQUEST["auth_token"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND","Missing 'uid' or 'auth_token'."); + } + + if(!DbUtil::isTokenValid($_REQUEST["uid"], $_REQUEST["auth_token"])){ + XmlGen::error_exit("INVALID_TOKEN"); + } + + $uid = $_REQUEST["uid"]; + + // register and return uid+auth_token + DbUtil::deleteProfile( + $uid + ); + + exit(); + + + case "ADD_LEVEL": + // check if name and password exist + if(!isset($_REQUEST["title"]) || !isset($_REQUEST["filename"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND","Missing 'title' or 'filename'."); + } + + $title = trim($_REQUEST["title"]); + $file = trim($_REQUEST["filename"]); + + DbUtil::addLevel( + $title, + $file + ); + + exit(); + + + + case "GET_LEVELS": + DbUtil::getLevels(); + exit(); + + + + case "GET_SCORES": + if(!isset($_REQUEST["lid"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND","Missing 'lid'."); + } + + DbUtil::getLevelScores($_REQUEST["lid"]); + + exit(); + + + + case "LOG_IN": + // check if name and password exist + if(!isset($_REQUEST["name"]) || !isset($_REQUEST["password"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND","Missing 'name' or 'password'."); + } + + $name = trim($_REQUEST["name"]); + $password = trim($_REQUEST["password"]); + + // log in and return uid+auth_token + DbUtil::logIn( + $name, + $password + ); + + exit(); + + + + case "GET_PROFILE_INFO": + if(!isset($_REQUEST["uid"]) || !isset($_REQUEST["auth_token"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND", "Missing 'uid' or 'auth_token'."); + } + + if(!DbUtil::isTokenValid($_REQUEST["uid"], $_REQUEST["auth_token"])){ + XmlGen::error_exit("INVALID_TOKEN"); + } + + // log in and return uid+auth_token + DbUtil::refreshLogin( + $_REQUEST["uid"], + $_REQUEST["auth_token"] + ); + + exit(); + + + + case "SUBMIT_SCORE": + if(!isset($_REQUEST["uid"]) || !isset($_REQUEST["auth_token"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND", "Missing 'uid' or 'auth_token'."); + } + + if(!isset($_REQUEST["lid"]) || !isset($_REQUEST["score"])){ + XmlGen::error_exit("INCOMPLETE_COMMAND", "Missing 'lid' or 'score'."); + } + + if(!DbUtil::isTokenValid($_REQUEST["uid"], $_REQUEST["auth_token"])){ + XmlGen::error_exit("INVALID_TOKEN"); + } + + // log in and return uid+auth_token + DbUtil::submitScore( + $_REQUEST["uid"], + $_REQUEST["lid"], + $_REQUEST["score"] + ); + + exit(); + + + +// case "HASH": +// // check if name and password exist +// if(!isset($_REQUEST["password"]) || !isset($_REQUEST["name"])){ +// XmlGen::error_exit("INCOMPLETE_COMMAND", "Missing 'name' or 'password'."); +// } +// +// echo XmlGen::hashCode(Util::calcSecureHash($_REQUEST["name"],$_REQUEST["password"])); +// +// exit(); + + + + case "GET_INFO": + DbUtil::getInfo(); + exit(); + + + + case "GET_USERS": + DbUtil::getUsers(); + + exit(); + + + + default: + XmlGen::error_exit("INVALID_COMMAND"); +} diff --git a/res/drivers/base.xml b/res/drivers/base.xml new file mode 100644 index 0000000..418f8a8 --- /dev/null +++ b/res/drivers/base.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/bird.xml b/res/drivers/bird.xml new file mode 100644 index 0000000..f1da4f5 --- /dev/null +++ b/res/drivers/bird.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/burger.xml b/res/drivers/burger.xml new file mode 100644 index 0000000..434da85 --- /dev/null +++ b/res/drivers/burger.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/cube.xml b/res/drivers/cube.xml new file mode 100644 index 0000000..7555e62 --- /dev/null +++ b/res/drivers/cube.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/driver_doc.xml b/res/drivers/driver_doc.xml new file mode 100644 index 0000000..8b13fe3 --- /dev/null +++ b/res/drivers/driver_doc.xml @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/falcon.xml b/res/drivers/falcon.xml new file mode 100644 index 0000000..ea30623 --- /dev/null +++ b/res/drivers/falcon.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/fighter.xml b/res/drivers/fighter.xml new file mode 100644 index 0000000..eca53f6 --- /dev/null +++ b/res/drivers/fighter.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/manifest.xml b/res/drivers/manifest.xml new file mode 100644 index 0000000..4a9eb3e --- /dev/null +++ b/res/drivers/manifest.xml @@ -0,0 +1,19 @@ + + + + + + + + base.xml + burger.xml + fighter.xml + falcon.xml + bird.xml + shark.xml + cube.xml + powerup.xml + mine.xml + + + \ No newline at end of file diff --git a/res/drivers/mine.xml b/res/drivers/mine.xml new file mode 100644 index 0000000..b021fbb --- /dev/null +++ b/res/drivers/mine.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/powerup.xml b/res/drivers/powerup.xml new file mode 100644 index 0000000..17ba231 --- /dev/null +++ b/res/drivers/powerup.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drivers/shark.xml b/res/drivers/shark.xml new file mode 100644 index 0000000..0480bc2 --- /dev/null +++ b/res/drivers/shark.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/fonts/atomic_clock_radio.ttf b/res/fonts/atomic_clock_radio.ttf new file mode 100644 index 0000000..800ddcd Binary files /dev/null and b/res/fonts/atomic_clock_radio.ttf differ diff --git a/res/fonts/digital_dream/bold.ttf b/res/fonts/digital_dream/bold.ttf new file mode 100644 index 0000000..1b45373 Binary files /dev/null and b/res/fonts/digital_dream/bold.ttf differ diff --git a/res/fonts/digital_dream/bold_italic.ttf b/res/fonts/digital_dream/bold_italic.ttf new file mode 100644 index 0000000..83c1313 Binary files /dev/null and b/res/fonts/digital_dream/bold_italic.ttf differ diff --git a/res/fonts/digital_dream/italic.ttf b/res/fonts/digital_dream/italic.ttf new file mode 100644 index 0000000..c193bef Binary files /dev/null and b/res/fonts/digital_dream/italic.ttf differ diff --git a/res/fonts/digital_dream/narrow.ttf b/res/fonts/digital_dream/narrow.ttf new file mode 100644 index 0000000..01b4d61 Binary files /dev/null and b/res/fonts/digital_dream/narrow.ttf differ diff --git a/res/fonts/digital_dream/narrow_bold.ttf b/res/fonts/digital_dream/narrow_bold.ttf new file mode 100644 index 0000000..4f5e0fb Binary files /dev/null and b/res/fonts/digital_dream/narrow_bold.ttf differ diff --git a/res/fonts/digital_dream/narrow_italic.ttf b/res/fonts/digital_dream/narrow_italic.ttf new file mode 100644 index 0000000..c8111e8 Binary files /dev/null and b/res/fonts/digital_dream/narrow_italic.ttf differ diff --git a/res/fonts/digital_dream/narrow_italic_bold.ttf b/res/fonts/digital_dream/narrow_italic_bold.ttf new file mode 100644 index 0000000..2ddde01 Binary files /dev/null and b/res/fonts/digital_dream/narrow_italic_bold.ttf differ diff --git a/res/fonts/digital_dream/normal.ttf b/res/fonts/digital_dream/normal.ttf new file mode 100644 index 0000000..2d1827e Binary files /dev/null and b/res/fonts/digital_dream/normal.ttf differ diff --git a/res/fonts/lcd_a/mono/bold.ttf b/res/fonts/lcd_a/mono/bold.ttf new file mode 100644 index 0000000..61f0fb2 Binary files /dev/null and b/res/fonts/lcd_a/mono/bold.ttf differ diff --git a/res/fonts/lcd_a/mono/heavy.ttf b/res/fonts/lcd_a/mono/heavy.ttf new file mode 100644 index 0000000..5da425d Binary files /dev/null and b/res/fonts/lcd_a/mono/heavy.ttf differ diff --git a/res/fonts/lcd_a/mono/light.ttf b/res/fonts/lcd_a/mono/light.ttf new file mode 100644 index 0000000..746bd09 Binary files /dev/null and b/res/fonts/lcd_a/mono/light.ttf differ diff --git a/res/fonts/lcd_a/mono/normal.ttf b/res/fonts/lcd_a/mono/normal.ttf new file mode 100644 index 0000000..2f72345 Binary files /dev/null and b/res/fonts/lcd_a/mono/normal.ttf differ diff --git a/res/fonts/lcd_a/prop/bold.ttf b/res/fonts/lcd_a/prop/bold.ttf new file mode 100644 index 0000000..f0d3d27 Binary files /dev/null and b/res/fonts/lcd_a/prop/bold.ttf differ diff --git a/res/fonts/lcd_a/prop/heavy.ttf b/res/fonts/lcd_a/prop/heavy.ttf new file mode 100644 index 0000000..a14c7f0 Binary files /dev/null and b/res/fonts/lcd_a/prop/heavy.ttf differ diff --git a/res/fonts/lcd_a/prop/light.ttf b/res/fonts/lcd_a/prop/light.ttf new file mode 100644 index 0000000..cfb1545 Binary files /dev/null and b/res/fonts/lcd_a/prop/light.ttf differ diff --git a/res/fonts/lcd_a/prop/normal.ttf b/res/fonts/lcd_a/prop/normal.ttf new file mode 100644 index 0000000..d8ed8cf Binary files /dev/null and b/res/fonts/lcd_a/prop/normal.ttf differ diff --git a/res/fonts/lcd_b/bold.ttf b/res/fonts/lcd_b/bold.ttf new file mode 100644 index 0000000..064ad47 Binary files /dev/null and b/res/fonts/lcd_b/bold.ttf differ diff --git a/res/fonts/lcd_b/boldi.ttf b/res/fonts/lcd_b/boldi.ttf new file mode 100644 index 0000000..65642f9 Binary files /dev/null and b/res/fonts/lcd_b/boldi.ttf differ diff --git a/res/fonts/lcd_b/italic.ttf b/res/fonts/lcd_b/italic.ttf new file mode 100644 index 0000000..2aae3d8 Binary files /dev/null and b/res/fonts/lcd_b/italic.ttf differ diff --git a/res/fonts/lcd_b/normal.ttf b/res/fonts/lcd_b/normal.ttf new file mode 100644 index 0000000..0925877 Binary files /dev/null and b/res/fonts/lcd_b/normal.ttf differ diff --git a/res/fonts/simple/narrow.ttf b/res/fonts/simple/narrow.ttf new file mode 100644 index 0000000..f3c420d Binary files /dev/null and b/res/fonts/simple/narrow.ttf differ diff --git a/res/fonts/simple/normal.ttf b/res/fonts/simple/normal.ttf new file mode 100644 index 0000000..3286806 Binary files /dev/null and b/res/fonts/simple/normal.ttf differ diff --git a/res/fonts/simple/outline.ttf b/res/fonts/simple/outline.ttf new file mode 100644 index 0000000..1b87468 Binary files /dev/null and b/res/fonts/simple/outline.ttf differ diff --git a/res/fonts/simple/wide.ttf b/res/fonts/simple/wide.ttf new file mode 100644 index 0000000..6b9ab77 Binary files /dev/null and b/res/fonts/simple/wide.ttf differ diff --git a/res/fonts/spaceage.ttf b/res/fonts/spaceage.ttf new file mode 100644 index 0000000..85a62a8 Binary files /dev/null and b/res/fonts/spaceage.ttf differ diff --git a/res/images/designer_icons.png b/res/images/designer_icons.png new file mode 100644 index 0000000..9455c94 Binary files /dev/null and b/res/images/designer_icons.png differ diff --git a/res/images/particles_blend.png b/res/images/particles_blend.png new file mode 100644 index 0000000..cdf7886 Binary files /dev/null and b/res/images/particles_blend.png differ diff --git a/res/images/particles_plain.png b/res/images/particles_plain.png new file mode 100644 index 0000000..369cd0e Binary files /dev/null and b/res/images/particles_plain.png differ diff --git a/res/images/shield.png b/res/images/shield.png new file mode 100644 index 0000000..d71fcc8 Binary files /dev/null and b/res/images/shield.png differ diff --git a/res/levels/designer.xml b/res/levels/designer.xml new file mode 100644 index 0000000..78973e3 --- /dev/null +++ b/res/levels/designer.xml @@ -0,0 +1,108 @@ + + + + + Ship Building Site + Infinite money! + MightyPork + 15 + + + + + + FREE + 30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/levels/manifest.xml b/res/levels/manifest.xml new file mode 100644 index 0000000..2ab64db --- /dev/null +++ b/res/levels/manifest.xml @@ -0,0 +1,9 @@ + + + + + + designer.xml + + + \ No newline at end of file diff --git a/res/levels/template.xml b/res/levels/template.xml new file mode 100644 index 0000000..e06bc85 --- /dev/null +++ b/res/levels/template.xml @@ -0,0 +1,56 @@ + + + + + + TITLE + DESCRIPTION + AUTHOR + MIN_GAME_VERSION + + + + + MONEY + TIME_LIMIT (optional) + LOCKED or NORMAL or FREE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/models/asteroids/asteroid02.mtl b/res/models/asteroids/asteroid02.mtl new file mode 100644 index 0000000..edf137d --- /dev/null +++ b/res/models/asteroids/asteroid02.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl Material.001 +Ns 92.156863 +Ka 0.000000 0.000000 0.000000 +Kd 0.512000 0.512000 0.512000 +Ks 0.000000 0.000000 0.000000 +Ni 1.000000 +d 0.000000 +illum 2 +map_Kd limestone.jpg +map_Disp limestone.jpg diff --git a/res/models/asteroids/asteroid02.obj b/res/models/asteroids/asteroid02.obj new file mode 100644 index 0000000..efaae92 --- /dev/null +++ b/res/models/asteroids/asteroid02.obj @@ -0,0 +1,5467 @@ +# Blender v2.65 (sub 0) OBJ File: '' +# www.blender.org +mtllib asteroid02.mtl +o Cube_Cube_Material +v 0.024039 -0.733202 -0.029963 +v 0.142776 -0.760645 -0.040465 +v 0.149930 -0.749667 0.008766 +v 0.254457 -0.722015 -0.026572 +v 0.321832 -0.728378 0.011140 +v 0.289877 -0.721309 -0.096177 +v 0.427704 -0.757444 -0.087601 +v 0.488990 -0.752909 -0.015986 +v 0.516631 -0.744630 -0.037928 +v 0.553554 -0.660241 -0.112000 +v 0.625434 -0.668656 0.061971 +v 0.640142 -0.638805 -0.043586 +v 0.038290 -0.733057 -0.116233 +v 0.079702 -0.756449 -0.110430 +v 0.200590 -0.714118 -0.160219 +v 0.417070 -0.759302 -0.187140 +v 0.616585 -0.617646 -0.189347 +v -0.062780 -0.725527 -0.174097 +v 0.322125 -0.752695 -0.189054 +v 0.497990 -0.678691 -0.214866 +v 0.061291 -0.659338 -0.229218 +v 0.550035 -0.663937 -0.216444 +v 0.200472 -0.686291 -0.272829 +v 0.279717 -0.736535 -0.237332 +v -0.008250 -0.695518 -0.297491 +v 0.397067 -0.685734 -0.274044 +v 0.568198 -0.555929 -0.271208 +v 0.151859 -0.679127 -0.343765 +v 0.317173 -0.614199 -0.330937 +v 0.477384 -0.618895 -0.319126 +v 0.239927 -0.642299 -0.346213 +v 0.458222 -0.581551 -0.382426 +v 0.532947 -0.500950 -0.353572 +v 0.053707 -0.669949 -0.369003 +v 0.213077 -0.639950 -0.398391 +v -0.063066 -0.689061 -0.448694 +v 0.123247 -0.655390 -0.414306 +v 0.290632 -0.502962 -0.393909 +v -0.023715 -0.669870 -0.459096 +v 0.462622 -0.492852 -0.425402 +v 0.226792 -0.554470 -0.436302 +v 0.355453 -0.496445 -0.394171 +v -0.048223 -0.580501 -0.491713 +v 0.127256 -0.598183 -0.495739 +v 0.203487 -0.548229 -0.478390 +v 0.065567 -0.530466 -0.526453 +v 0.347480 -0.454708 -0.459432 +v 0.399808 -0.450622 -0.464734 +v 0.434952 -0.432368 -0.453608 +v 0.230125 -0.472739 -0.506417 +v 0.056105 -0.756089 0.054037 +v 0.020304 -0.690028 0.130102 +v 0.017148 -0.681548 0.228421 +v 0.034174 -0.655217 0.306192 +v -0.074492 -0.572083 0.309101 +v 0.055411 -0.648167 0.383217 +v 0.097296 -0.569743 0.500254 +v -0.059495 -0.546480 0.493572 +v 0.028411 -0.508563 0.495352 +v 0.108499 -0.734440 0.091937 +v 0.121162 -0.702697 0.147021 +v 0.079796 -0.683091 0.231549 +v 0.128580 -0.635103 0.456930 +v 0.120226 -0.643119 0.314663 +v 0.184559 -0.690716 0.211874 +v 0.177631 -0.622102 0.406060 +v 0.142822 -0.543028 0.500396 +v 0.189718 -0.746454 0.091101 +v 0.197293 -0.570240 0.457498 +v 0.197194 -0.528262 0.536697 +v 0.249153 -0.709501 0.077016 +v 0.236773 -0.710299 0.167793 +v 0.238060 -0.612389 0.334556 +v 0.354958 -0.722861 0.268758 +v 0.260911 -0.675980 0.280600 +v 0.238382 -0.588471 0.438918 +v 0.374217 -0.696109 0.090237 +v 0.314478 -0.720250 0.130044 +v 0.337156 -0.612147 0.408895 +v 0.322705 -0.553577 0.522479 +v 0.432786 -0.705273 0.208748 +v 0.322780 -0.647113 0.328878 +v 0.399643 -0.644091 0.324238 +v 0.365151 -0.556441 0.459433 +v 0.447741 -0.702653 0.087388 +v 0.446667 -0.535597 0.483239 +v 0.543867 -0.694172 0.304600 +v 0.500207 -0.576043 0.430481 +v 0.587106 -0.700372 0.153953 +v 0.626860 -0.674933 0.277281 +v 0.538892 -0.604470 0.376444 +v 0.688630 -0.654365 0.170624 +v 0.628036 -0.630230 0.314428 +v 0.532612 -0.506428 0.432809 +v -0.055283 -0.736810 0.064546 +v -0.106206 -0.697701 0.007838 +v -0.187179 -0.699276 -0.014268 +v -0.267877 -0.665975 -0.029242 +v -0.332012 -0.681820 0.051181 +v -0.342830 -0.669489 -0.000785 +v -0.421019 -0.624050 0.014329 +v -0.481029 -0.610301 -0.019706 +v -0.539747 -0.556058 -0.043359 +v -0.045919 -0.711467 0.112217 +v -0.250921 -0.674176 0.117920 +v -0.378339 -0.641253 0.079078 +v -0.463558 -0.507339 0.089283 +v -0.147082 -0.677446 0.124864 +v -0.404982 -0.570973 0.143173 +v -0.080578 -0.674320 0.186314 +v -0.332083 -0.575434 0.148477 +v -0.459648 -0.510436 0.164297 +v -0.183793 -0.606113 0.197072 +v -0.237725 -0.569933 0.192587 +v -0.105801 -0.593288 0.232587 +v -0.282094 -0.540015 0.222413 +v -0.389169 -0.545738 0.219693 +v -0.491564 -0.480907 0.242250 +v -0.059596 -0.594655 0.271050 +v -0.253936 -0.499356 0.306203 +v -0.400504 -0.484399 0.272247 +v -0.166006 -0.565508 0.311082 +v -0.340475 -0.499009 0.316475 +v -0.213936 -0.516102 0.321181 +v -0.010836 -0.619240 0.451528 +v -0.108131 -0.547826 0.361817 +v -0.407858 -0.451109 0.357774 +v -0.203443 -0.492981 0.426462 +v -0.308630 -0.505201 0.384816 +v -0.125907 -0.510346 0.396287 +v -0.290532 -0.493214 0.427434 +v -0.383299 -0.461817 0.386609 +v -0.410458 -0.435927 0.421044 +v -0.124499 -0.513771 0.545275 +v -0.364564 -0.443480 0.447796 +v -0.064366 -0.722525 -0.058656 +v -0.068282 -0.734105 -0.255423 +v -0.056689 -0.727697 -0.373260 +v -0.144087 -0.709775 -0.389944 +v -0.154010 -0.525057 -0.476165 +v -0.195940 -0.699408 -0.134652 +v -0.175414 -0.695720 -0.207581 +v -0.191820 -0.668920 -0.271060 +v -0.212012 -0.663074 -0.369584 +v -0.210720 -0.630394 -0.412803 +v -0.203062 -0.490099 -0.508708 +v -0.218271 -0.670907 -0.042114 +v -0.239245 -0.575668 -0.475101 +v -0.275671 -0.684997 -0.246835 +v -0.340314 -0.717505 -0.182968 +v -0.310261 -0.606272 -0.406447 +v -0.300565 -0.537566 -0.463662 +v -0.370615 -0.649001 -0.125662 +v -0.369123 -0.673071 -0.233042 +v -0.369944 -0.675209 -0.339141 +v -0.372166 -0.537706 -0.406005 +v -0.352413 -0.503789 -0.476001 +v -0.469839 -0.621279 -0.076531 +v -0.466201 -0.592775 -0.189874 +v -0.429076 -0.626574 -0.302991 +v -0.391974 -0.599834 -0.367763 +v -0.485888 -0.582592 -0.124652 +v -0.427022 -0.458161 -0.439808 +v -0.446593 -0.530966 -0.321577 +v -0.409838 -0.506935 -0.426067 +v -0.496660 -0.509502 -0.267724 +v -0.448570 -0.461081 -0.380876 +v -0.497347 -0.493174 -0.149207 +v -0.477875 -0.445957 -0.443733 +v -0.015354 0.826828 -0.016728 +v 0.097592 0.866251 0.072077 +v 0.067052 0.857636 -0.046516 +v -0.021481 0.795563 -0.168081 +v 0.071079 0.776888 -0.238438 +v 0.040927 0.780266 -0.311724 +v 0.020764 0.726597 -0.401226 +v -0.018738 0.768880 -0.360384 +v 0.082906 0.660859 -0.529864 +v -0.004138 0.575959 -0.515210 +v 0.125353 0.744564 -0.375729 +v 0.081255 0.727510 -0.464128 +v 0.073337 0.512457 -0.563066 +v 0.223148 0.880086 -0.151420 +v 0.170099 0.760133 -0.307930 +v 0.146146 0.636738 -0.557005 +v 0.212288 0.900633 0.043308 +v 0.189849 0.884525 -0.060591 +v 0.170732 0.758032 -0.457833 +v 0.247104 0.756706 -0.439272 +v 0.210133 0.664386 -0.512811 +v 0.209663 0.559737 -0.524884 +v 0.268181 0.885111 -0.005656 +v 0.282726 0.752974 -0.332734 +v 0.318397 0.834701 0.032449 +v 0.356798 0.896901 -0.064951 +v 0.351917 0.883506 -0.137194 +v 0.319063 0.608469 -0.513703 +v 0.388970 0.856625 -0.004174 +v 0.367280 0.787292 -0.271944 +v 0.342537 0.702670 -0.377667 +v 0.401831 0.832039 -0.155037 +v 0.337233 0.475272 -0.508178 +v 0.481108 0.786376 -0.042735 +v 0.440286 0.688217 -0.357299 +v 0.393354 0.581361 -0.448283 +v 0.499846 0.761684 -0.210556 +v 0.514991 0.716397 0.039545 +v 0.459147 0.525217 -0.418254 +v 0.558098 0.749991 -0.103843 +v 0.521353 0.639751 -0.331039 +v 0.402537 0.497301 -0.455184 +v 0.427761 0.454064 -0.460861 +v 0.562165 0.656063 0.034370 +v 0.589445 0.703442 -0.071950 +v 0.627371 0.646140 -0.248290 +v 0.518250 0.565200 -0.377760 +v 0.641748 0.637228 -0.010083 +v 0.684571 0.634771 -0.119264 +v -0.121162 0.817761 -0.067581 +v -0.102298 0.777256 0.027432 +v -0.236911 0.748820 -0.000739 +v -0.316134 0.639234 -0.044937 +v -0.364112 0.667294 -0.000546 +v -0.485658 0.685407 0.030632 +v -0.672058 0.651890 -0.060326 +v -0.197085 0.791522 -0.088888 +v -0.332266 0.633029 -0.113429 +v -0.502504 0.637860 -0.109540 +v -0.129360 0.809076 -0.136765 +v -0.401559 0.636867 -0.152117 +v -0.079588 0.807113 -0.191898 +v -0.273905 0.643934 -0.169520 +v -0.477409 0.604341 -0.180391 +v -0.627867 0.559720 -0.185772 +v -0.200044 0.721165 -0.207138 +v -0.357411 0.613757 -0.186731 +v -0.113226 0.794590 -0.256303 +v -0.293845 0.644284 -0.252597 +v -0.594495 0.544024 -0.279648 +v -0.228406 0.669037 -0.276792 +v -0.373402 0.572310 -0.246126 +v -0.479009 0.531103 -0.276661 +v -0.108621 0.740197 -0.407383 +v -0.125882 0.761709 -0.356760 +v -0.327665 0.581909 -0.285204 +v -0.232092 0.666000 -0.346588 +v -0.520298 0.481906 -0.349516 +v -0.186501 0.685568 -0.404838 +v -0.339246 0.571638 -0.340217 +v -0.436681 0.517099 -0.347451 +v -0.241466 0.574255 -0.406458 +v -0.301243 0.563932 -0.397419 +v -0.074367 0.629678 -0.468835 +v -0.163703 0.609427 -0.453925 +v -0.380267 0.549913 -0.387740 +v -0.441353 0.511419 -0.415618 +v -0.139656 0.553515 -0.474185 +v -0.237562 0.523983 -0.468168 +v -0.307892 0.532649 -0.458233 +v -0.443616 0.455090 -0.465778 +v -0.265634 0.460446 -0.509906 +v -0.001084 0.849751 0.093777 +v -0.119961 0.760322 0.187853 +v -0.034615 0.769571 0.172011 +v -0.007469 0.741175 0.276687 +v -0.045860 0.709726 0.292258 +v -0.035837 0.618949 0.360602 +v 0.023155 0.641051 0.368500 +v -0.039102 0.557711 0.413744 +v -0.083230 0.542064 0.465380 +v -0.102434 0.723694 0.274190 +v -0.161065 0.758836 0.121182 +v -0.161787 0.706740 0.369345 +v -0.114316 0.609078 0.407858 +v -0.191463 0.751155 0.210478 +v -0.174019 0.739255 0.287394 +v -0.152616 0.509097 0.494661 +v -0.262492 0.766233 0.106508 +v -0.251710 0.703386 0.362651 +v -0.220146 0.560801 0.443091 +v -0.218528 0.489379 0.490886 +v -0.324690 0.780520 0.173505 +v -0.280023 0.765683 0.250362 +v -0.412699 0.755831 0.170361 +v -0.348880 0.744076 0.287291 +v -0.329660 0.637201 0.434428 +v -0.359359 0.502840 0.543413 +v -0.418345 0.674060 0.348345 +v -0.383157 0.633605 0.405860 +v -0.364354 0.590136 0.482067 +v -0.519778 0.725170 0.145036 +v -0.509758 0.712498 0.299553 +v -0.506952 0.555795 0.447032 +v -0.412747 0.517728 0.495890 +v -0.461782 0.604683 0.382114 +v -0.688759 0.690503 0.048285 +v -0.732291 0.718096 0.127290 +v -0.636279 0.645032 0.300870 +v -0.567111 0.595057 0.375339 +v -0.693575 0.706966 0.197478 +v -0.497108 0.488882 0.488874 +v 0.323389 0.787048 0.157770 +v 0.444180 0.737106 0.112230 +v 0.567359 0.661271 0.083082 +v 0.055492 0.848751 0.148408 +v 0.219052 0.793193 0.164188 +v 0.553717 0.676666 0.121105 +v 0.611797 0.561623 0.139367 +v 0.043695 0.795075 0.218536 +v 0.400928 0.693712 0.185366 +v 0.484471 0.686762 0.172458 +v 0.129943 0.758072 0.234483 +v 0.210635 0.783414 0.222524 +v 0.337876 0.709962 0.206635 +v 0.519611 0.611993 0.225793 +v 0.557671 0.545244 0.218698 +v 0.359565 0.663176 0.273277 +v 0.208670 0.705585 0.344096 +v 0.263247 0.729127 0.271672 +v 0.490879 0.606111 0.277629 +v 0.107853 0.679802 0.337749 +v 0.299085 0.707746 0.329593 +v 0.550289 0.586382 0.294515 +v 0.346364 0.637162 0.353121 +v 0.399188 0.589645 0.314504 +v 0.138479 0.683610 0.389552 +v 0.246188 0.648124 0.416200 +v 0.305387 0.621318 0.380187 +v 0.406312 0.567439 0.394272 +v 0.471358 0.532058 0.392383 +v 0.065700 0.639259 0.424958 +v 0.159053 0.632645 0.468522 +v 0.234618 0.627992 0.521615 +v 0.366472 0.550958 0.448740 +v 0.033630 0.559010 0.515760 +v 0.438510 0.533993 0.456407 +v 0.151856 0.603879 0.535834 +v 0.321135 0.524741 0.482253 +v 0.212720 0.558700 0.593378 +v 0.373182 0.483385 0.493711 +v 0.081256 0.532435 0.559946 +v 0.262457 0.558223 0.583860 +v 0.777818 0.008542 0.038080 +v 0.790485 -0.079588 -0.112413 +v 0.774198 -0.057751 -0.226511 +v 0.731818 0.005564 -0.227889 +v 0.666492 -0.083149 -0.323174 +v 0.656829 0.003517 -0.299886 +v 0.555204 -0.049357 -0.375319 +v 0.552053 0.006243 -0.408160 +v 0.522837 -0.060378 -0.519701 +v 0.829599 -0.107772 0.051968 +v 0.558383 -0.139468 -0.393975 +v 0.774310 -0.126784 -0.078247 +v 0.670054 -0.197732 -0.292449 +v 0.521699 -0.118626 -0.431860 +v 0.503801 -0.145608 -0.479234 +v 0.837230 -0.197945 0.046256 +v 0.743862 -0.234776 -0.196724 +v 0.718267 -0.229056 -0.251875 +v 0.826498 -0.276467 0.000289 +v 0.538844 -0.223204 -0.351298 +v 0.493946 -0.231565 -0.462756 +v 0.742025 -0.260787 -0.121474 +v 0.525189 -0.260511 -0.324039 +v 0.515083 -0.230709 -0.418363 +v 0.744793 -0.360549 -0.106638 +v 0.687178 -0.302010 -0.195595 +v 0.616401 -0.286341 -0.283525 +v 0.805838 -0.423491 0.003209 +v 0.735654 -0.397830 -0.077060 +v 0.683327 -0.372910 -0.148139 +v 0.658170 -0.382322 -0.209667 +v 0.472523 -0.296112 -0.391195 +v 0.553229 -0.348327 -0.295062 +v 0.700945 -0.447788 -0.126155 +v 0.461237 -0.356632 -0.409941 +v 0.720024 -0.538487 0.017311 +v 0.509348 -0.447550 -0.385151 +v 0.673724 -0.548152 -0.129832 +v 0.640556 -0.519659 -0.231853 +v 0.563137 -0.453824 -0.316855 +v 0.775790 0.105691 -0.007351 +v 0.741548 0.154831 -0.060740 +v 0.739851 0.181802 -0.005436 +v 0.744009 0.278239 -0.076537 +v 0.768375 0.274411 0.037247 +v 0.794851 0.363933 0.006166 +v 0.776759 0.437333 -0.062547 +v 0.709008 0.519036 -0.044865 +v 0.688781 0.505090 0.014997 +v 0.666376 0.552321 0.048787 +v 0.758520 0.069433 -0.110098 +v 0.759143 0.142187 -0.140651 +v 0.755551 0.277771 -0.114992 +v 0.713703 0.496762 -0.148092 +v 0.689295 0.601885 -0.155270 +v 0.759083 0.195725 -0.189152 +v 0.744209 0.379270 -0.250386 +v 0.717271 0.096816 -0.271241 +v 0.715976 0.261370 -0.220683 +v 0.696455 0.498152 -0.217186 +v 0.708839 0.176861 -0.306363 +v 0.646803 0.602455 -0.264720 +v 0.649305 0.243213 -0.297905 +v 0.686272 0.531599 -0.301255 +v 0.669290 0.440841 -0.340044 +v 0.602410 0.058318 -0.339329 +v 0.567444 0.117370 -0.355257 +v 0.582197 0.326173 -0.349469 +v 0.562604 0.190839 -0.336950 +v 0.478323 0.446467 -0.398053 +v 0.508385 0.252171 -0.354660 +v 0.514928 0.395913 -0.386086 +v 0.461207 0.149483 -0.395887 +v 0.510505 0.058751 -0.453069 +v 0.461508 0.219070 -0.389657 +v 0.472255 0.298976 -0.398969 +v 0.442910 0.405234 -0.434256 +v 0.442336 0.373342 -0.462305 +v 0.442145 0.295579 -0.474603 +v 0.791758 -0.008143 0.108418 +v 0.832015 0.077397 0.218899 +v 0.835536 -0.044112 0.301695 +v 0.825344 -0.010130 0.368949 +v 0.671841 0.101827 0.498848 +v 0.695426 0.008180 0.487058 +v 0.710373 -0.069497 0.542689 +v 0.657472 0.019726 0.626221 +v 0.826055 0.103244 0.128752 +v 0.770048 0.103368 0.339007 +v 0.756150 0.075105 0.415751 +v 0.641636 0.094606 0.580190 +v 0.808519 0.150388 0.176464 +v 0.778091 0.153499 0.288862 +v 0.736494 0.120241 0.447961 +v 0.797389 0.237836 0.101924 +v 0.724560 0.212948 0.357974 +v 0.625741 0.166739 0.484904 +v 0.781988 0.250681 0.205403 +v 0.728063 0.228956 0.275226 +v 0.514455 0.207980 0.560727 +v 0.592689 0.255600 0.425702 +v 0.569145 0.243164 0.474892 +v 0.745246 0.311272 0.172530 +v 0.684013 0.305751 0.249560 +v 0.650920 0.356725 0.304545 +v 0.591790 0.313365 0.370579 +v 0.525366 0.304820 0.496903 +v 0.745232 0.396238 0.143587 +v 0.689314 0.394261 0.210416 +v 0.730904 0.447135 0.054732 +v 0.467305 0.362052 0.467937 +v 0.735766 0.449207 0.112984 +v 0.559466 0.377698 0.356071 +v 0.521480 0.376546 0.442732 +v 0.595187 0.432355 0.240758 +v 0.583722 0.423743 0.298441 +v 0.640404 0.497665 0.154856 +v 0.576473 0.507177 0.289803 +v 0.557411 0.483222 0.351120 +v 0.466586 0.439897 0.440915 +v 0.865738 -0.294592 0.131452 +v 0.812324 -0.397765 0.092715 +v 0.751280 -0.467518 0.090090 +v 0.724110 -0.560009 0.176108 +v 0.849047 -0.155099 0.123934 +v 0.846393 -0.054189 0.207636 +v 0.896039 -0.274991 0.211692 +v 0.917733 -0.269694 0.268888 +v 0.843844 -0.410128 0.230850 +v 0.725244 -0.573009 0.264735 +v 0.881295 -0.180098 0.348312 +v 0.819461 -0.430147 0.304285 +v 0.724714 -0.582020 0.335430 +v 0.877622 -0.287623 0.398895 +v 0.686350 -0.563409 0.372997 +v 0.776892 -0.386376 0.460127 +v 0.749634 -0.438415 0.382941 +v 0.760677 -0.168651 0.514504 +v 0.805025 -0.157250 0.484715 +v 0.770432 -0.277313 0.493660 +v 0.556292 -0.472736 0.436654 +v 0.599165 -0.430207 0.458306 +v 0.743090 -0.194631 0.575340 +v 0.612195 -0.339381 0.516282 +v 0.541201 -0.398313 0.488305 +v 0.669125 -0.159846 0.652117 +v 0.646272 -0.255570 0.619086 +v 0.641564 -0.054747 0.651985 +v 0.556240 -0.333050 0.532615 +v 0.486143 -0.459235 0.488216 +v 0.051248 -0.006290 0.747552 +v 0.125696 -0.068309 0.754131 +v 0.186082 0.029771 0.833117 +v 0.287273 -0.022712 0.838384 +v 0.359579 -0.019271 0.857749 +v 0.491436 -0.038411 0.793987 +v 0.561008 -0.017901 0.745028 +v -0.029601 -0.104777 0.740590 +v 0.254205 -0.154204 0.791095 +v 0.452497 -0.087728 0.778834 +v 0.561360 -0.093394 0.694232 +v 0.420763 -0.185853 0.778999 +v 0.492879 -0.128685 0.714296 +v -0.026000 -0.205253 0.730462 +v 0.085492 -0.165965 0.757559 +v 0.223324 -0.231990 0.765640 +v 0.343093 -0.213928 0.751355 +v 0.507307 -0.239944 0.666640 +v 0.612968 -0.204723 0.667962 +v 0.087274 -0.281272 0.708929 +v 0.382719 -0.288542 0.659730 +v -0.014047 -0.269339 0.667998 +v 0.177918 -0.301103 0.718869 +v 0.256162 -0.338942 0.630210 +v 0.453164 -0.293599 0.645485 +v 0.519969 -0.321685 0.596460 +v 0.026149 -0.324918 0.649331 +v 0.161341 -0.344500 0.650598 +v 0.322274 -0.352245 0.634871 +v 0.114745 -0.353233 0.645943 +v 0.004624 -0.365157 0.603186 +v 0.460675 -0.392968 0.611291 +v -0.012871 -0.448274 0.563390 +v 0.091528 -0.457104 0.627430 +v 0.223598 -0.442211 0.593110 +v 0.341590 -0.421902 0.627411 +v 0.193483 -0.495438 0.578064 +v 0.466513 -0.491355 0.532953 +v -0.039246 -0.469075 0.541737 +v 0.075009 -0.487675 0.546566 +v 0.363037 -0.515252 0.563119 +v 0.428269 -0.489736 0.576206 +v 0.025903 0.061808 0.757538 +v 0.003358 0.154359 0.771375 +v -0.029359 0.261093 0.729470 +v 0.035990 0.351149 0.656822 +v -0.027369 0.342032 0.626397 +v 0.043053 0.422710 0.559449 +v -0.040313 0.509807 0.555464 +v 0.093369 0.121883 0.833589 +v 0.056350 0.247959 0.736172 +v 0.130895 0.417802 0.648120 +v 0.154507 0.185748 0.837029 +v 0.121814 0.342390 0.714561 +v 0.138584 0.495403 0.591463 +v 0.172315 0.279972 0.788712 +v 0.263128 0.216519 0.855738 +v 0.234113 0.387128 0.709183 +v 0.248070 0.505555 0.605182 +v 0.313240 0.074348 0.860853 +v 0.292062 0.144033 0.880793 +v 0.273798 0.319483 0.737246 +v 0.367122 0.274452 0.732531 +v 0.248201 0.437603 0.613895 +v 0.413575 0.036594 0.851377 +v 0.375540 0.132289 0.821856 +v 0.327458 0.386648 0.659925 +v 0.411695 0.202601 0.701068 +v 0.341704 0.399949 0.565372 +v 0.398773 0.331831 0.584635 +v 0.505856 0.127550 0.779719 +v 0.414089 0.289908 0.642155 +v 0.516816 0.055353 0.762455 +v 0.410310 0.347120 0.497871 +v 0.576853 0.116497 0.621426 +v 0.474518 0.248920 0.622359 +v 0.411325 0.442008 0.491792 +v 0.472850 0.284461 0.537291 +v -0.041034 -0.009357 0.704270 +v -0.122505 0.028880 0.689901 +v -0.219023 0.140606 0.704586 +v -0.177307 -0.016410 0.678516 +v -0.288513 0.045332 0.714795 +v -0.308658 -0.056035 0.714409 +v -0.396492 0.036936 0.698919 +v -0.437077 -0.008006 0.730427 +v -0.501181 0.024898 0.687730 +v -0.525098 -0.013242 0.662652 +v -0.568014 0.065257 0.597904 +v -0.345437 0.101586 0.669049 +v -0.553564 0.146848 0.605301 +v -0.073109 0.115563 0.702250 +v -0.283666 0.128581 0.705531 +v -0.171236 0.183614 0.732765 +v -0.437356 0.163752 0.673463 +v -0.459330 0.221264 0.665577 +v -0.097750 0.226197 0.737763 +v -0.205067 0.272394 0.716533 +v -0.365794 0.247955 0.711375 +v -0.584795 0.277426 0.599736 +v -0.510224 0.297513 0.619036 +v -0.378104 0.301415 0.683704 +v -0.121985 0.348567 0.650442 +v -0.235934 0.331014 0.681620 +v -0.347341 0.344139 0.604816 +v -0.443111 0.353233 0.569860 +v -0.533961 0.373937 0.554846 +v -0.063961 0.387504 0.624642 +v -0.198278 0.379211 0.628328 +v -0.227573 0.392165 0.578525 +v -0.301110 0.379399 0.585280 +v -0.156984 0.426581 0.590758 +v -0.388995 0.457217 0.575732 +v -0.477784 0.468367 0.539813 +v -0.088673 0.479145 0.568229 +v -0.233115 0.448439 0.506320 +v -0.049628 -0.343951 0.652596 +v -0.103534 -0.097164 0.739216 +v -0.099141 -0.295831 0.645801 +v -0.169679 -0.227213 0.663358 +v -0.106347 -0.378392 0.611625 +v -0.151501 -0.481338 0.566745 +v -0.163513 -0.078083 0.706988 +v -0.155503 -0.305302 0.619185 +v -0.183126 -0.434649 0.577187 +v -0.173199 -0.168069 0.678390 +v -0.222637 -0.367007 0.615370 +v -0.264732 -0.255662 0.630105 +v -0.272279 -0.099615 0.725875 +v -0.290411 -0.209860 0.682729 +v -0.259472 -0.320186 0.630628 +v -0.242545 -0.402198 0.570736 +v -0.288915 -0.368662 0.558537 +v -0.275547 -0.452085 0.489641 +v -0.394189 -0.076692 0.744100 +v -0.357941 -0.169693 0.711876 +v -0.342522 -0.321404 0.619808 +v -0.416017 -0.278993 0.659102 +v -0.328960 -0.410289 0.529024 +v -0.483577 -0.197622 0.637890 +v -0.376648 -0.394569 0.563859 +v -0.446642 -0.264847 0.637278 +v -0.461694 -0.386451 0.568424 +v -0.521060 -0.086372 0.686640 +v -0.553781 -0.242240 0.633930 +v -0.512323 -0.356016 0.545145 +v -0.662784 -0.044376 0.634490 +v -0.696815 -0.164711 0.651181 +v -0.691001 -0.250022 0.635387 +v -0.628718 -0.324095 0.592779 +v -0.489326 -0.400464 0.473440 +v -0.883026 0.065396 -0.014237 +v -0.760856 -0.064550 -0.064864 +v -0.872032 -0.105604 0.081386 +v -0.958268 -0.001479 0.131263 +v -0.869373 -0.103072 0.146578 +v -0.865196 -0.110280 0.273923 +v -0.963988 0.000923 0.276950 +v -0.857329 -0.091005 0.337851 +v -0.790585 -0.077533 0.419638 +v -0.812958 0.027389 0.493623 +v -0.745770 -0.103182 0.518290 +v -0.723720 -0.045611 0.576068 +v -0.741417 -0.137983 -0.056254 +v -0.841699 -0.208821 0.141614 +v -0.818249 -0.211882 0.208031 +v -0.799781 -0.177719 0.361554 +v -0.744562 -0.211598 0.603280 +v -0.791520 -0.236909 0.304836 +v -0.793806 -0.212708 0.483284 +v -0.689012 -0.268873 -0.050458 +v -0.732499 -0.313092 0.268922 +v -0.762869 -0.298157 0.065591 +v -0.786694 -0.289778 0.452132 +v -0.735127 -0.288397 0.554416 +v -0.735818 -0.289342 0.168764 +v -0.722770 -0.348903 0.018078 +v -0.728948 -0.339871 0.229953 +v -0.720968 -0.337757 0.488651 +v -0.701917 -0.388718 0.135294 +v -0.722025 -0.378614 0.194057 +v -0.708228 -0.393352 0.423626 +v -0.671659 -0.398455 -0.051217 +v -0.624154 -0.390606 0.282669 +v -0.651632 -0.429867 0.079335 +v -0.592496 -0.439834 0.385059 +v -0.611190 -0.433594 -0.064847 +v -0.536224 -0.416385 0.142853 +v -0.538152 -0.417086 0.226314 +v -0.504963 -0.465376 0.316751 +v -0.505974 -0.450846 0.345381 +v -0.585369 -0.493822 0.008917 +v -0.493255 -0.453979 0.112077 +v -0.954340 0.097093 0.091867 +v -0.917088 0.201475 -0.033574 +v -0.940033 0.244036 0.105028 +v -0.905550 0.298340 0.014859 +v -0.886009 0.411916 -0.040613 +v -0.897114 0.434414 0.110510 +v -0.859162 0.489452 0.094736 +v -0.857879 0.519899 -0.000715 +v -0.809174 0.603749 0.083213 +v -0.774044 0.603035 -0.030881 +v -0.977592 0.178390 0.168089 +v -0.920209 0.312259 0.196400 +v -0.971255 0.138187 0.301736 +v -0.925566 0.427676 0.284158 +v -0.806537 0.570172 0.276539 +v -0.826545 0.591540 0.202875 +v -0.749980 0.662385 0.218147 +v -0.857886 0.509846 0.309615 +v -0.934103 0.059964 0.338356 +v -0.929408 0.215823 0.334895 +v -0.900015 0.366470 0.377068 +v -0.927043 0.304511 0.435489 +v -0.930239 0.194122 0.467237 +v -0.861779 0.467675 0.381182 +v -0.682651 0.562451 0.404079 +v -0.874220 0.123003 0.507168 +v -0.842428 0.408739 0.432710 +v -0.723150 0.504170 0.442570 +v -0.865039 0.333057 0.477640 +v -0.867214 0.213387 0.518216 +v -0.639367 0.299779 0.539564 +v -0.680930 0.107042 0.595932 +v -0.611364 0.547785 0.451561 +v -0.669137 0.249092 0.557924 +v -0.554558 0.415909 0.503979 +v -0.554458 0.461185 0.484553 +v -0.834670 0.042981 -0.047796 +v -0.801059 0.066768 -0.167322 +v -0.742241 0.027160 -0.237217 +v -0.641027 -0.061823 -0.301754 +v -0.700341 0.010901 -0.339887 +v -0.645982 -0.005891 -0.414272 +v -0.630882 0.001481 -0.495412 +v -0.602643 0.056029 -0.544275 +v -0.561491 0.085687 -0.565152 +v -0.797788 0.155924 -0.232983 +v -0.683890 0.106920 -0.485112 +v -0.747026 0.120320 -0.304695 +v -0.712048 0.132332 -0.449601 +v -0.622870 0.205210 -0.520352 +v -0.862086 0.242710 -0.197949 +v -0.707825 0.224501 -0.392923 +v -0.880250 0.245332 -0.106479 +v -0.718414 0.230904 -0.297566 +v -0.558573 0.233937 -0.561363 +v -0.869598 0.332721 -0.131365 +v -0.721066 0.311187 -0.308989 +v -0.598686 0.306517 -0.438586 +v -0.781365 0.373363 -0.240484 +v -0.681971 0.323736 -0.386005 +v -0.577628 0.312220 -0.487584 +v -0.554511 0.313321 -0.545035 +v -0.818795 0.476311 -0.125605 +v -0.681148 0.376937 -0.284389 +v -0.514333 0.429816 -0.406289 +v -0.536751 0.358123 -0.470456 +v -0.629505 0.417968 -0.342375 +v -0.756436 0.515631 -0.164217 +v -0.672926 0.459382 -0.273248 +v -0.461930 0.393929 -0.473660 +v -0.592927 0.464480 -0.346005 +v -0.657148 -0.341038 -0.103339 +v -0.662253 -0.195040 -0.104928 +v -0.675838 -0.270147 -0.112139 +v -0.582865 -0.390482 -0.107088 +v -0.659428 -0.100680 -0.187096 +v -0.628925 -0.172409 -0.165822 +v -0.592372 -0.348093 -0.161452 +v -0.561913 -0.392241 -0.223800 +v -0.521369 -0.428463 -0.169955 +v -0.621723 -0.168015 -0.228732 +v -0.646648 -0.247396 -0.202733 +v -0.606472 -0.288645 -0.304202 +v -0.585084 -0.378765 -0.280571 +v -0.625702 -0.241096 -0.351273 +v -0.510900 -0.430515 -0.292530 +v -0.594861 -0.114636 -0.311067 +v -0.582889 -0.359237 -0.338780 +v -0.633676 -0.059048 -0.413163 +v -0.610164 -0.125832 -0.425509 +v -0.591714 -0.213324 -0.405216 +v -0.555777 -0.405588 -0.359811 +v -0.568264 -0.193663 -0.444242 +v -0.539742 -0.323529 -0.420569 +v -0.485876 -0.433811 -0.387906 +v -0.611449 -0.079180 -0.464717 +v -0.504277 -0.414272 -0.466371 +v -0.501784 -0.271157 -0.491151 +v -0.473584 -0.350254 -0.472963 +v -0.487196 -0.160632 -0.488815 +v -0.484925 -0.086720 -0.490742 +v 0.044267 0.005017 -0.667755 +v 0.105769 0.061351 -0.677047 +v 0.172571 0.055718 -0.658432 +v 0.114510 -0.047842 -0.699129 +v 0.225985 -0.088153 -0.738059 +v 0.290281 0.029749 -0.703734 +v 0.380458 0.014553 -0.661396 +v 0.472827 0.081250 -0.549022 +v 0.421085 0.003113 -0.603228 +v 0.471578 -0.013705 -0.551075 +v 0.286986 0.103795 -0.709168 +v 0.378124 0.127367 -0.645051 +v 0.021206 0.101278 -0.617058 +v 0.435583 0.129781 -0.629568 +v 0.018868 0.167382 -0.554626 +v 0.142977 0.136556 -0.631511 +v 0.269270 0.212168 -0.677157 +v 0.466900 0.130698 -0.565909 +v 0.088831 0.167081 -0.602318 +v 0.404908 0.225114 -0.586795 +v 0.330145 0.255940 -0.645566 +v 0.014228 0.221082 -0.566360 +v 0.107227 0.232763 -0.609402 +v 0.269800 0.281561 -0.652248 +v 0.445012 0.217782 -0.506741 +v -0.004307 0.288317 -0.537102 +v 0.067668 0.291882 -0.542928 +v 0.127796 0.301730 -0.562971 +v 0.196009 0.316890 -0.586157 +v 0.384418 0.308424 -0.545274 +v 0.293630 0.334978 -0.575510 +v -0.026620 0.372250 -0.525250 +v 0.099372 0.397450 -0.566315 +v 0.194857 0.402576 -0.550992 +v 0.275556 0.396717 -0.524025 +v 0.382330 0.403225 -0.494708 +v 0.008850 0.453861 -0.535924 +v 0.135881 0.448797 -0.549950 +v 0.225510 0.424563 -0.508046 +v -0.026905 -0.051396 -0.691923 +v 0.032402 -0.157156 -0.700897 +v -0.050208 -0.173962 -0.692583 +v -0.066662 -0.240983 -0.671866 +v 0.037909 -0.307943 -0.737908 +v 0.027877 -0.344815 -0.726379 +v -0.056429 -0.403518 -0.619849 +v -0.020861 -0.416118 -0.602620 +v 0.003792 -0.475033 -0.583016 +v 0.157895 -0.228643 -0.797488 +v 0.078475 -0.440904 -0.647772 +v 0.124276 -0.352728 -0.776324 +v 0.126366 -0.397287 -0.714729 +v 0.134220 -0.463739 -0.565067 +v 0.192456 -0.151161 -0.775935 +v 0.177453 -0.432696 -0.587221 +v 0.193225 -0.328830 -0.781307 +v 0.249863 -0.237254 -0.770165 +v 0.279242 -0.382891 -0.722740 +v 0.251018 -0.425054 -0.619354 +v 0.292900 -0.045417 -0.741923 +v 0.331203 -0.334492 -0.718514 +v 0.333227 -0.194705 -0.749680 +v 0.370598 -0.254629 -0.732350 +v 0.314458 -0.396428 -0.600455 +v 0.311907 -0.445026 -0.526698 +v 0.406230 -0.147816 -0.674879 +v 0.388859 -0.364460 -0.635249 +v 0.372672 -0.432947 -0.530982 +v 0.396912 -0.268999 -0.653471 +v 0.430244 -0.093789 -0.604305 +v 0.422399 -0.196690 -0.552199 +v 0.437580 -0.329748 -0.572908 +v 0.422767 -0.377149 -0.527551 +v 0.476054 -0.083017 -0.572568 +v 0.474723 -0.295836 -0.522336 +v 0.470880 -0.183676 -0.498396 +v -0.060671 0.002229 -0.709222 +v -0.159187 -0.064268 -0.649237 +v -0.135854 0.049058 -0.665769 +v -0.217953 -0.006277 -0.685867 +v -0.303883 -0.050568 -0.654696 +v -0.331375 0.007173 -0.696773 +v -0.388314 0.026565 -0.637519 +v -0.381280 -0.082849 -0.541476 +v -0.459464 -0.065031 -0.529196 +v -0.094610 -0.093904 -0.666102 +v -0.348516 -0.097034 -0.583305 +v -0.274524 -0.134899 -0.631958 +v -0.326511 -0.153864 -0.599379 +v -0.157094 -0.155819 -0.674317 +v -0.206882 -0.161088 -0.636069 +v -0.278744 -0.177132 -0.583178 +v -0.443959 -0.173854 -0.531992 +v -0.108507 -0.259169 -0.633755 +v -0.222301 -0.210763 -0.615149 +v -0.377321 -0.202104 -0.594403 +v -0.188278 -0.275336 -0.641788 +v -0.326426 -0.253957 -0.590786 +v -0.431200 -0.246757 -0.514534 +v -0.246111 -0.305653 -0.640777 +v -0.399720 -0.304562 -0.518573 +v -0.093820 -0.373362 -0.656486 +v -0.171149 -0.335968 -0.654725 +v -0.352107 -0.299745 -0.542981 +v -0.340892 -0.365132 -0.550408 +v -0.184160 -0.421190 -0.609859 +v -0.247508 -0.399907 -0.608727 +v -0.118255 -0.447321 -0.545643 +v -0.389555 -0.433097 -0.514770 +v -0.215778 -0.455897 -0.525806 +v -0.304531 -0.439524 -0.533255 +v -0.088775 0.117685 -0.634210 +v -0.111896 0.379021 -0.535684 +v -0.097364 0.251323 -0.570961 +v -0.103190 0.452412 -0.516185 +v -0.153910 0.139608 -0.641405 +v -0.141073 0.204674 -0.614483 +v -0.170204 0.361322 -0.586841 +v -0.191893 0.452121 -0.563759 +v -0.265555 0.106821 -0.694228 +v -0.210936 0.308124 -0.658434 +v -0.243890 0.420876 -0.582315 +v -0.302545 0.275837 -0.695613 +v -0.262742 0.353376 -0.638770 +v -0.347453 0.066882 -0.697078 +v -0.405819 0.196434 -0.708295 +v -0.361655 0.369698 -0.619832 +v -0.341734 0.406721 -0.551590 +v -0.317178 0.456071 -0.492920 +v -0.404369 0.114335 -0.714017 +v -0.421427 0.298170 -0.646992 +v -0.413714 0.362619 -0.551632 +v -0.445759 0.048121 -0.626129 +v -0.528967 0.246638 -0.614363 +v -0.456497 0.325270 -0.553383 +v -0.389318 0.433613 -0.488742 +v -0.521496 0.162919 -0.624174 +vt 0.793284 0.919665 +vt 0.790880 0.909651 +vt 0.799967 0.910714 +vt 0.282299 0.168596 +vt 0.309811 0.184564 +vt 0.296775 0.191392 +vt 0.310993 0.214263 +vt 0.309568 0.234668 +vt 0.327893 0.215542 +vt 0.341626 0.250957 +vt 0.334023 0.272209 +vt 0.498363 0.014749 +vt 0.512299 0.032656 +vt 0.465290 0.040291 +vt 0.484845 0.047144 +vt 0.291568 0.156368 +vt 0.374781 0.225423 +vt 0.315831 0.162645 +vt 0.343665 0.272451 +vt 0.321226 0.180023 +vt 0.922853 0.768755 +vt 0.915293 0.780803 +vt 0.915276 0.771058 +vt 0.352513 0.215704 +vt 0.454822 0.123057 +vt 0.519106 0.009004 +vt 0.521006 0.051684 +vt 0.502013 0.071649 +vt 0.332154 0.191603 +vt 0.544040 0.002700 +vt 0.541261 0.026226 +vt 0.309971 0.123301 +vt 0.572411 0.851819 +vt 0.558508 0.868614 +vt 0.862101 0.752530 +vt 0.867908 0.784813 +vt 0.851378 0.753416 +vt 0.844326 0.775087 +vt 0.896838 0.882584 +vt 0.901604 0.874524 +vt 0.535102 0.035838 +vt 0.905174 0.888172 +vt 0.896550 0.891744 +vt 0.905176 0.897357 +vt 0.850403 0.800392 +vt 0.337219 0.175576 +vt 0.356781 0.201275 +vt 0.807699 0.810969 +vt 0.822855 0.807911 +vt 0.801390 0.819250 +vt 0.529856 0.078876 +vt 0.816669 0.837990 +vt 0.773904 0.700139 +vt 0.547906 0.065094 +vt 0.330914 0.155835 +vt 0.520005 0.390895 +vt 0.351013 0.181363 +vt 0.845775 0.809469 +vt 0.845387 0.843059 +vt 0.567042 0.043647 +vt 0.338082 0.125756 +vt 0.354149 0.138856 +vt 0.608649 0.017809 +vt 0.594335 0.011205 +vt 0.587535 0.017196 +vt 0.829360 0.876582 +vt 0.572496 0.025634 +vt 0.581340 0.031398 +vt 0.572487 0.073875 +vt 0.611610 0.004714 +vt 0.622847 0.017562 +vt 0.045667 0.896779 +vt 0.040406 0.912974 +vt 0.039140 0.900255 +vt 0.550842 0.048888 +vt 0.639341 0.009010 +vt 0.741197 0.453623 +vt 0.859113 0.837256 +vt 0.705891 0.386408 +vt 0.642572 0.238419 +vt 0.245992 0.851012 +vt 0.330494 0.896257 +vt 0.322709 0.913686 +vt 0.046905 0.913542 +vt 0.647866 0.009480 +vt 0.632607 0.040050 +vt 0.598939 0.073174 +vt 0.584857 0.090902 +vt 0.658682 0.022317 +vt 0.860640 0.876727 +vt 0.846558 0.895521 +vt 0.610144 0.455247 +vt 0.583942 0.458492 +vt 0.593673 0.368627 +vt 0.593684 0.426131 +vt 0.602603 0.428839 +vt 0.646501 0.043400 +vt 0.864222 0.898740 +vt 0.617219 0.259992 +vt 0.623022 0.063262 +vt 0.621049 0.069309 +vt 0.615580 0.064947 +vt 0.871065 0.893296 +vt 0.901108 0.812396 +vt 0.647175 0.074663 +vt 0.721444 0.380779 +vt 0.616248 0.078497 +vt 0.612069 0.087532 +vt 0.193824 0.168324 +vt 0.214551 0.190950 +vt 0.197643 0.203020 +vt 0.176053 0.195358 +vt 0.166178 0.225475 +vt 0.154730 0.191151 +vt 0.154509 0.211830 +vt 0.276195 0.186780 +vt 0.252572 0.170941 +vt 0.259251 0.197913 +vt 0.230740 0.177601 +vt 0.235858 0.196732 +vt 0.190033 0.227666 +vt 0.220753 0.211954 +vt 0.285394 0.208177 +vt 0.248261 0.216657 +vt 0.201149 0.236474 +vt 0.168911 0.240010 +vt 0.221079 0.246221 +vt 0.187281 0.247437 +vt 0.289680 0.225353 +vt 0.782531 0.919902 +vt 0.512148 0.636704 +vt 0.782883 0.909651 +vt 0.270139 0.226663 +vt 0.261419 0.264402 +vt 0.242821 0.243809 +vt 0.196952 0.256007 +vt 0.165581 0.255265 +vt 0.297193 0.254266 +vt 0.657633 0.920978 +vt 0.284362 0.243167 +vt 0.215107 0.277716 +vt 0.181914 0.281175 +vt 0.276119 0.277746 +vt 0.235725 0.265516 +vt 0.244266 0.281978 +vt 0.200200 0.290169 +vt 0.306017 0.276721 +vt 0.200967 0.313194 +vt 0.173099 0.298821 +vt 0.264945 0.310132 +vt 0.220095 0.318156 +vt 0.325683 0.300513 +vt 0.304220 0.313807 +vt 0.278639 0.332730 +vt 0.239232 0.325401 +vt 0.266166 0.339450 +vt 0.088594 0.876873 +vt 0.257757 0.485309 +vt 0.082994 0.888158 +vt 0.432230 0.046226 +vt 0.416201 0.042753 +vt 0.473024 0.870704 +vt 0.239404 0.385107 +vt 0.470674 0.881569 +vt 0.477564 0.888046 +vt 0.467776 0.898756 +vt 0.266865 0.140989 +vt 0.266684 0.128629 +vt 0.286789 0.132813 +vt 0.259903 0.108004 +vt 0.229626 0.100922 +vt 0.251046 0.092590 +vt 0.320903 0.599928 +vt 0.235132 0.078475 +vt 0.257513 0.084868 +vt 0.922307 0.880841 +vt 0.914105 0.876536 +vt 0.223664 0.039659 +vt 0.187414 0.055319 +vt 0.607199 0.606567 +vt 0.252658 0.151518 +vt 0.272162 0.161928 +vt 0.227198 0.914152 +vt 0.232574 0.924515 +vt 0.241598 0.071588 +vt 0.219340 0.070024 +vt 0.322869 0.296182 +vt 0.237309 0.128929 +vt 0.193800 0.072616 +vt 0.222337 0.057495 +vt 0.229283 0.152591 +vt 0.200180 0.088853 +vt 0.651367 0.631709 +vt 0.652511 0.635388 +vt 0.482751 0.455694 +vt 0.635183 0.641486 +vt 0.208164 0.131469 +vt 0.197619 0.115870 +vt 0.206625 0.152613 +vt 0.181568 0.107955 +vt 0.175494 0.084112 +vt 0.206908 0.167908 +vt 0.154014 0.086527 +vt 0.164529 0.125901 +vt 0.347212 0.306698 +vt 0.763815 0.914791 +vt 0.755512 0.921683 +vt 0.182685 0.145495 +vt 0.153699 0.106721 +vt 0.134711 0.065683 +vt 0.174284 0.164440 +vt 0.167979 0.137209 +vt 0.124733 0.849154 +vt 0.137363 0.868715 +vt 0.120057 0.878664 +vt 0.139256 0.657572 +vt 0.133125 0.094618 +vt 0.142822 0.150170 +vt 0.144427 0.119069 +vt 0.161549 0.167044 +vt 0.131451 0.886309 +vt 0.136305 0.130376 +vt 0.254738 0.375853 +vt 0.132127 0.102022 +vt 0.497560 0.922133 +vt 0.491614 0.921578 +vt 0.132651 0.129751 +vt 0.270234 0.899650 +vt 0.258691 0.894301 +vt 0.269607 0.889877 +vt 0.117780 0.113625 +vt 0.131629 0.178144 +vt 0.118660 0.140479 +vt 0.313092 0.150211 +vt 0.323919 0.118574 +vt 0.553844 0.836015 +vt 0.446487 0.462427 +vt 0.235421 0.859093 +vt 0.249858 0.880929 +vt 0.326571 0.114576 +vt 0.350435 0.108074 +vt 0.302494 0.093794 +vt 0.341457 0.090010 +vt 0.630131 0.471959 +vt 0.623270 0.487891 +vt 0.617749 0.466368 +vt 0.590683 0.509934 +vt 0.553507 0.440892 +vt 0.286769 0.095401 +vt 0.724029 0.911242 +vt 0.728627 0.921194 +vt 0.720118 0.919704 +vt 0.230724 0.879672 +vt 0.310651 0.084708 +vt 0.227620 0.849102 +vt 0.322382 0.073889 +vt 0.620747 0.510286 +vt 0.604385 0.501268 +vt 0.579080 0.489238 +vt 0.262323 0.099076 +vt 0.581390 0.496210 +vt 0.300576 0.421327 +vt 0.359145 0.888393 +vt 0.353743 0.880987 +vt 0.294375 0.068712 +vt 0.161832 0.912776 +vt 0.302832 0.069706 +vt 0.161948 0.921568 +vt 0.746227 0.707169 +vt 0.888616 0.893470 +vt 0.559988 0.495287 +vt 0.284699 0.057112 +vt 0.599545 0.523135 +vt 0.573977 0.519562 +vt 0.572299 0.500536 +vt 0.547439 0.497220 +vt 0.260264 0.054174 +vt 0.647851 0.556590 +vt 0.632066 0.558968 +vt 0.287399 0.043410 +vt 0.307278 0.035748 +vt 0.619029 0.543743 +vt 0.580455 0.543694 +vt 0.564593 0.528043 +vt 0.236760 0.036402 +vt 0.657633 0.591211 +vt 0.639857 0.609213 +vt 0.642996 0.582245 +vt 0.607631 0.568316 +vt 0.630441 0.580092 +vt 0.283835 0.031607 +vt 0.610252 0.565585 +vt 0.597807 0.548656 +vt 0.622538 0.605543 +vt 0.249216 0.034470 +vt 0.256598 0.030989 +vt 0.588038 0.569710 +vt 0.569211 0.548233 +vt 0.555831 0.553441 +vt 0.566986 0.565592 +vt 0.638633 0.622076 +vt 0.617783 0.592728 +vt 0.598862 0.610851 +vt 0.587075 0.592298 +vt 0.377357 0.908820 +vt 0.378100 0.895039 +vt 0.389346 0.899124 +vt 0.382339 0.909847 +vt 0.651076 0.528615 +vt 0.008657 0.712280 +vt 0.774449 0.482008 +vt 0.795575 0.513467 +vt 0.822108 0.501951 +vt 0.834902 0.517240 +vt 0.857516 0.530454 +vt 0.840236 0.535481 +vt 0.896740 0.534889 +vt 0.871312 0.567159 +vt 0.893532 0.558297 +vt 0.861629 0.503143 +vt 0.876795 0.521659 +vt 0.917725 0.540579 +vt 0.458330 0.873596 +vt 0.442914 0.887088 +vt 0.439855 0.869309 +vt 0.814322 0.447874 +vt 0.851089 0.485070 +vt 0.913052 0.522400 +vt 0.759874 0.472599 +vt 0.771340 0.440985 +vt 0.786744 0.450393 +vt 0.880044 0.500178 +vt 0.067217 0.916442 +vt 0.175918 0.800371 +vt 0.790038 0.428317 +vt 0.867752 0.461413 +vt 0.886708 0.479596 +vt 0.909526 0.500116 +vt 0.176470 0.845975 +vt 0.159301 0.848532 +vt 0.162618 0.832353 +vt 0.093503 0.863464 +vt 0.096395 0.873480 +vt 0.810922 0.413160 +vt 0.827501 0.361056 +vt 0.832381 0.341693 +vt 0.849165 0.366472 +vt 0.824917 0.420265 +vt 0.923694 0.481182 +vt 0.920347 0.583833 +vt 0.852305 0.349058 +vt 0.863705 0.434029 +vt 0.900335 0.467497 +vt 0.860906 0.369113 +vt 0.844170 0.410976 +vt 0.866711 0.374936 +vt 0.912987 0.467411 +vt 0.684507 0.327973 +vt 0.674001 0.342123 +vt 0.668944 0.310027 +vt 0.883295 0.333610 +vt 0.884541 0.355087 +vt 0.902550 0.434205 +vt 0.890617 0.452844 +vt 0.650188 0.365436 +vt 0.652411 0.341636 +vt 0.873036 0.398772 +vt 0.858401 0.377801 +vt 0.912120 0.415173 +vt 0.918726 0.446145 +vt 0.918545 0.459717 +vt 0.651093 0.322640 +vt 0.881103 0.310110 +vt 0.907245 0.335002 +vt 0.621958 0.367991 +vt 0.633034 0.350974 +vt 0.631746 0.362125 +vt 0.635489 0.331569 +vt 0.896032 0.295752 +vt 0.917497 0.317139 +vt 0.914438 0.340312 +vt 0.926838 0.326756 +vt 0.951399 0.333789 +vt 0.879936 0.381085 +vt 0.907304 0.382894 +vt 0.927076 0.445791 +vt 0.930788 0.427616 +vt 0.796418 0.378965 +vt 0.647212 0.312227 +vt 0.919966 0.295324 +vt 0.276820 0.910909 +vt 0.271832 0.894473 +vt 0.281929 0.898776 +vt 0.732225 0.340906 +vt 0.690181 0.356982 +vt 0.625045 0.312714 +vt 0.010619 0.692763 +vt 0.006808 0.675886 +vt 0.019508 0.677663 +vt 0.208449 0.840087 +vt 0.189804 0.839796 +vt 0.207566 0.813920 +vt 0.715755 0.617407 +vt 0.739269 0.594637 +vt 0.745950 0.635337 +vt 0.716047 0.672934 +vt 0.186520 0.827788 +vt 0.189190 0.799947 +vt 0.208223 0.777100 +vt 0.199261 0.774821 +vt 0.756913 0.589245 +vt 0.768414 0.503408 +vt 0.765027 0.528329 +vt 0.777968 0.538610 +vt 0.761557 0.550266 +vt 0.768312 0.598416 +vt 0.767362 0.620270 +vt 0.792525 0.529736 +vt 0.786627 0.588567 +vt 0.768863 0.639164 +vt 0.762343 0.681450 +vt 0.807937 0.546471 +vt 0.789617 0.566442 +vt 0.783771 0.612770 +vt 0.898406 0.788167 +vt 0.837934 0.668790 +vt 0.903803 0.761349 +vt 0.891879 0.752476 +vt 0.891893 0.743230 +vt 0.784179 0.682888 +vt 0.797688 0.570191 +vt 0.679515 0.697012 +vt 0.802034 0.595722 +vt 0.800126 0.598972 +vt 0.798310 0.624413 +vt 0.798366 0.654469 +vt 0.840533 0.560905 +vt 0.826259 0.557883 +vt 0.524014 0.853563 +vt 0.531225 0.843105 +vt 0.810086 0.615170 +vt 0.510744 0.860777 +vt 0.616418 0.750522 +vt 0.819595 0.597027 +vt 0.816239 0.673754 +vt 0.796806 0.602745 +vt 0.508026 0.835549 +vt 0.228874 0.913733 +vt 0.222890 0.911856 +vt 0.223500 0.900103 +vt 0.230108 0.892344 +vt 0.816719 0.652988 +vt 0.845711 0.607613 +vt 0.823005 0.591511 +vt 0.838003 0.621038 +vt 0.824471 0.625028 +vt 0.860959 0.590014 +vt 0.850869 0.589571 +vt 0.830986 0.641843 +vt 0.611568 0.904343 +vt 0.603236 0.914004 +vt 0.831705 0.659191 +vt 0.832441 0.660878 +vt 0.209162 0.900091 +vt 0.192453 0.900115 +vt 0.202765 0.881234 +vt 0.876403 0.592474 +vt 0.494394 0.910304 +vt 0.483052 0.906637 +vt 0.494737 0.896634 +vt 0.859982 0.592934 +vt 0.867046 0.614977 +vt 0.853855 0.630443 +vt 0.847449 0.670052 +vt 0.833764 0.684834 +vt 0.907251 0.570380 +vt 0.899783 0.592963 +vt 0.898772 0.619430 +vt 0.879946 0.631132 +vt 0.869573 0.646180 +vt 0.864370 0.661564 +vt 0.068167 0.715952 +vt 0.061628 0.704620 +vt 0.085010 0.706845 +vt 0.171796 0.708786 +vt 0.217755 0.691431 +vt 0.119488 0.717157 +vt 0.143854 0.698618 +vt 0.154485 0.692936 +vt 0.158984 0.722036 +vt 0.029771 0.709589 +vt 0.059736 0.688163 +vt 0.196207 0.721213 +vt 0.364412 0.744325 +vt 0.347010 0.719676 +vt 0.357219 0.713674 +vt 0.175434 0.705510 +vt 0.755421 0.520451 +vt 0.742524 0.521707 +vt 0.741490 0.509583 +vt 0.174232 0.704584 +vt 0.328674 0.694927 +vt 0.363671 0.683183 +vt 0.342932 0.671672 +vt 0.360000 0.659711 +vt 0.349516 0.651481 +vt 0.728030 0.515283 +vt 0.728155 0.527932 +vt 0.713276 0.524903 +vt 0.332010 0.716004 +vt 0.342255 0.651196 +vt 0.160275 0.677909 +vt 0.744980 0.536758 +vt 0.720999 0.546133 +vt 0.739118 0.525477 +vt 0.912688 0.743230 +vt 0.201959 0.850539 +vt 0.905122 0.757704 +vt 0.741439 0.555586 +vt 0.100826 0.903231 +vt 0.097248 0.893382 +vt 0.105532 0.895000 +vt 0.119500 0.682439 +vt 0.128888 0.671921 +vt 0.268480 0.670164 +vt 0.364428 0.518305 +vt 0.350288 0.514028 +vt 0.517368 0.915290 +vt 0.148393 0.670425 +vt 0.163269 0.663514 +vt 0.697737 0.559947 +vt 0.216743 0.859341 +vt 0.218487 0.869611 +vt 0.190150 0.855741 +vt 0.759626 0.777569 +vt 0.192453 0.880287 +vt 0.192455 0.872027 +vt 0.085160 0.672218 +vt 0.066712 0.661406 +vt 0.099961 0.669138 +vt 0.343957 0.549078 +vt 0.160857 0.636175 +vt 0.689911 0.582820 +vt 0.120389 0.653389 +vt 0.327061 0.529792 +vt 0.201842 0.630992 +vt 0.353039 0.482554 +vt 0.077441 0.647066 +vt 0.320408 0.505971 +vt 0.323852 0.481976 +vt 0.121271 0.638826 +vt 0.318799 0.524394 +vt 0.682791 0.612337 +vt 0.056412 0.637619 +vt 0.060274 0.618953 +vt 0.081520 0.615449 +vt 0.099356 0.633281 +vt 0.054519 0.599343 +vt 0.141221 0.608285 +vt 0.143943 0.643397 +vt 0.157154 0.628495 +vt 0.169811 0.636184 +vt 0.091259 0.618997 +vt 0.119666 0.617573 +vt 0.689504 0.663523 +vt 0.665814 0.664609 +vt 0.062515 0.566431 +vt 0.088447 0.580158 +vt 0.115277 0.596111 +vt 0.460180 0.912728 +vt 0.451147 0.913815 +vt 0.457806 0.901371 +vt 0.115621 0.571701 +vt 0.113785 0.607579 +vt 0.115946 0.599360 +vt 0.171649 0.611945 +vt 0.262262 0.910548 +vt 0.254247 0.921525 +vt 0.254774 0.911621 +vt 0.159216 0.604499 +vt 0.750497 0.490402 +vt 0.752648 0.466610 +vt 0.920133 0.267521 +vt 0.803402 0.356842 +vt 0.797564 0.320773 +vt 0.818879 0.314693 +vt 0.854418 0.308792 +vt 0.887243 0.290292 +vt 0.407282 0.585170 +vt 0.744418 0.461065 +vt 0.781433 0.348166 +vt 0.764134 0.339496 +vt 0.794068 0.347361 +vt 0.878110 0.287439 +vt 0.062156 0.727943 +vt 0.034497 0.726152 +vt 0.838300 0.287051 +vt 0.856524 0.283920 +vt 0.752655 0.319340 +vt 0.771455 0.303551 +vt 0.405872 0.880114 +vt 0.397150 0.861300 +vt 0.580689 0.612195 +vt 0.802467 0.316068 +vt 0.785589 0.307511 +vt 0.793624 0.287450 +vt 0.819075 0.291129 +vt 0.861864 0.259345 +vt 0.778175 0.352217 +vt 0.895988 0.257258 +vt 0.817800 0.270411 +vt 0.450915 0.737961 +vt 0.411941 0.829875 +vt 0.412728 0.860538 +vt 0.772227 0.273507 +vt 0.846331 0.253945 +vt 0.083936 0.723450 +vt 0.094691 0.730239 +vt 0.753623 0.296074 +vt 0.794391 0.271270 +vt 0.824315 0.248137 +vt 0.140655 0.912624 +vt 0.857515 0.242841 +vt 0.313150 0.683038 +vt 0.317454 0.652667 +vt 0.319926 0.674417 +vt 0.172424 0.910869 +vt 0.173867 0.892958 +vt 0.176452 0.902623 +vt 0.805103 0.252293 +vt 0.117280 0.749767 +vt 0.106525 0.734551 +vt 0.405680 0.820179 +vt 0.775035 0.248476 +vt 0.792500 0.247666 +vt 0.812970 0.229950 +vt 0.844869 0.244973 +vt 0.857325 0.212269 +vt 0.865813 0.225790 +vt 0.131552 0.733190 +vt 0.755278 0.264127 +vt 0.829196 0.216958 +vt 0.128514 0.702766 +vt 0.141025 0.752812 +vt 0.755732 0.247521 +vt 0.755200 0.229809 +vt 0.798267 0.219245 +vt 0.814351 0.211576 +vt 0.160925 0.755263 +vt 0.482977 0.920024 +vt 0.491129 0.922132 +vt 0.154675 0.773581 +vt 0.786168 0.210420 +vt 0.176602 0.731879 +vt 0.168303 0.769037 +vt 0.801042 0.196100 +vt 0.810950 0.186380 +vt 0.828500 0.194638 +vt 0.673317 0.275830 +vt 0.757393 0.204073 +vt 0.286501 0.893043 +vt 0.297107 0.904063 +vt 0.284164 0.900262 +vt 0.536279 0.216953 +vt 0.561440 0.193441 +vt 0.563816 0.213813 +vt 0.593605 0.193409 +vt 0.600928 0.205854 +vt 0.628572 0.188277 +vt 0.617744 0.216465 +vt 0.482912 0.216597 +vt 0.456471 0.192922 +vt 0.537358 0.259029 +vt 0.526339 0.203113 +vt 0.591223 0.168941 +vt 0.494473 0.184642 +vt 0.555124 0.165008 +vt 0.604169 0.172168 +vt 0.618941 0.165690 +vt 0.518557 0.158584 +vt 0.537782 0.158913 +vt 0.502038 0.152095 +vt 0.456511 0.171921 +vt 0.458107 0.150977 +vt 0.583202 0.147509 +vt 0.600403 0.144919 +vt 0.613945 0.140436 +vt 0.627362 0.151698 +vt 0.524541 0.137728 +vt 0.576587 0.134696 +vt 0.497237 0.125518 +vt 0.554235 0.134834 +vt 0.459372 0.114518 +vt 0.487576 0.115676 +vt 0.511813 0.118730 +vt 0.531585 0.116109 +vt 0.598976 0.124397 +vt 0.563041 0.117640 +vt 0.626650 0.124191 +vt 0.501824 0.099852 +vt 0.602328 0.106433 +vt 0.463867 0.076138 +vt 0.561145 0.093934 +vt 0.486496 0.246358 +vt 0.499907 0.258554 +vt 0.490234 0.264558 +vt 0.508484 0.289127 +vt 0.483084 0.287250 +vt 0.489861 0.311283 +vt 0.711154 0.301748 +vt 0.963900 0.228636 +vt 0.970447 0.245492 +vt 0.952272 0.273498 +vt 0.936660 0.261857 +vt 0.944365 0.309217 +vt 0.641830 0.490369 +vt 0.501912 0.216624 +vt 0.509068 0.236634 +vt 0.471008 0.296132 +vt 0.518685 0.254927 +vt 0.165960 0.892851 +vt 0.165076 0.906646 +vt 0.154649 0.895661 +vt 0.421582 0.903130 +vt 0.421369 0.912959 +vt 0.519241 0.288407 +vt 0.412836 0.916512 +vt 0.412819 0.905922 +vt 0.965268 0.280997 +vt 0.841364 0.281857 +vt 0.954357 0.298003 +vt 0.502648 0.258430 +vt 0.533162 0.270198 +vt 0.551887 0.313084 +vt 0.531319 0.350201 +vt 0.548249 0.348753 +vt 0.552019 0.239007 +vt 0.544777 0.282720 +vt 0.549433 0.336326 +vt 0.552443 0.300809 +vt 0.875908 0.804274 +vt 0.880053 0.789038 +vt 0.889487 0.814341 +vt 0.576434 0.374936 +vt 0.420707 0.819586 +vt 0.416733 0.834664 +vt 0.412855 0.819316 +vt 0.570574 0.276617 +vt 0.885847 0.831707 +vt 0.585416 0.323832 +vt 0.577377 0.347794 +vt 0.935920 0.385658 +vt 0.580405 0.222252 +vt 0.590434 0.239008 +vt 0.594612 0.287388 +vt 0.430731 0.850902 +vt 0.427181 0.865617 +vt 0.415287 0.869519 +vt 0.576747 0.265181 +vt 0.591238 0.253701 +vt 0.919292 0.815629 +vt 0.912049 0.828462 +vt 0.605848 0.265704 +vt 0.617153 0.304114 +vt 0.917750 0.833132 +vt 0.596332 0.341449 +vt 0.215309 0.914357 +vt 0.219761 0.922638 +vt 0.511628 0.313283 +vt 0.616130 0.236800 +vt 0.311823 0.476567 +vt 0.317621 0.476188 +vt 0.877446 0.833387 +vt 0.618452 0.256016 +vt 0.624372 0.278489 +vt 0.637033 0.301544 +vt 0.642338 0.290944 +vt 0.894025 0.836787 +vt 0.894206 0.847131 +vt 0.645925 0.254091 +vt 0.640889 0.271560 +vt 0.317558 0.455869 +vt 0.446789 0.218122 +vt 0.432037 0.242107 +vt 0.420851 0.210309 +vt 0.970893 0.116417 +vt 0.962475 0.135027 +vt 0.959964 0.092093 +vt 0.919838 0.106131 +vt 0.887043 0.103609 +vt 0.900603 0.082321 +vt 0.896777 0.057755 +vt 0.868450 0.068435 +vt 0.448546 0.249038 +vt 0.930845 0.123583 +vt 0.941926 0.093499 +vt 0.906743 0.113977 +vt 0.867591 0.090485 +vt 0.845522 0.088428 +vt 0.957809 0.154452 +vt 0.936055 0.140760 +vt 0.462815 0.280160 +vt 0.907327 0.145839 +vt 0.874900 0.119647 +vt 0.970853 0.160780 +vt 0.960382 0.179259 +vt 0.286721 0.907643 +vt 0.292258 0.918883 +vt 0.942233 0.174632 +vt 0.923482 0.162789 +vt 0.871070 0.151712 +vt 0.837725 0.123073 +vt 0.858882 0.140522 +vt 0.623232 0.250635 +vt 0.936168 0.194160 +vt 0.912388 0.182761 +vt 0.953177 0.195618 +vt 0.956299 0.202218 +vt 0.893113 0.187167 +vt 0.866871 0.190164 +vt 0.873780 0.171813 +vt 0.843030 0.152471 +vt 0.828746 0.143638 +vt 0.939868 0.240919 +vt 0.858022 0.223740 +vt 0.327933 0.819627 +vt 0.328181 0.850429 +vt 0.711146 0.435580 +vt 0.311808 0.821219 +vt 0.315221 0.811249 +vt 0.933690 0.216450 +vt 0.913091 0.208893 +vt 0.845458 0.175911 +vt 0.830494 0.171923 +vt 0.312596 0.847091 +vt 0.932965 0.233062 +vt 0.885700 0.215578 +vt 0.876623 0.205676 +vt 0.905621 0.239829 +vt 0.869307 0.226878 +vt 0.152209 0.912318 +vt 0.149575 0.923058 +vt 0.144441 0.912323 +vt 0.262295 0.920855 +vt 0.262324 0.910548 +vt 0.448085 0.098431 +vt 0.475286 0.663804 +vt 0.466070 0.845468 +vt 0.480315 0.846625 +vt 0.435090 0.184510 +vt 0.427568 0.148880 +vt 0.436342 0.122227 +vt 0.295333 0.917981 +vt 0.292258 0.906785 +vt 0.300443 0.910440 +vt 0.427461 0.070890 +vt 0.465660 0.836473 +vt 0.476494 0.819316 +vt 0.482290 0.826394 +vt 0.407897 0.157666 +vt 0.405760 0.121125 +vt 0.390737 0.159983 +vt 0.409522 0.067190 +vt 0.975291 0.102589 +vt 0.972928 0.057172 +vt 1.000000 0.061191 +vt 0.389758 0.112163 +vt 0.280804 0.322326 +vt 0.277843 0.357317 +vt 0.973995 0.030779 +vt 0.995944 0.042907 +vt 0.254144 0.393690 +vt 0.248631 0.373256 +vt 0.264046 0.377939 +vt 0.369152 0.152449 +vt 0.372588 0.121134 +vt 0.212407 0.396327 +vt 0.233583 0.382747 +vt 0.247127 0.359976 +vt 0.920942 0.039683 +vt 0.935997 0.046269 +vt 0.508763 0.123640 +vt 0.822063 0.075231 +vt 0.220752 0.417960 +vt 0.209496 0.413134 +vt 0.209232 0.341598 +vt 0.587755 0.907911 +vt 0.588143 0.893533 +vt 0.213724 0.330349 +vt 0.203562 0.353948 +vt 0.910178 0.027360 +vt 0.189934 0.403755 +vt 0.180492 0.367738 +vt 0.187679 0.344044 +vt 0.881051 0.022928 +vt 0.163174 0.406337 +vt 0.149993 0.383481 +vt 0.868281 0.046694 +vt 0.172275 0.354984 +vt 0.557437 0.898509 +vt 0.551912 0.899716 +vt 0.482276 0.891634 +vt 0.212734 0.330505 +vt 0.871495 0.012895 +vt 0.130079 0.384543 +vt 0.157587 0.349864 +vt 0.049280 0.412200 +vt 0.047494 0.277395 +vt 0.024471 0.304407 +vt 0.050054 0.363835 +vt 0.042203 0.346227 +vt 0.069566 0.371083 +vt 0.837995 0.047997 +vt 0.094438 0.832084 +vt 0.114494 0.837830 +vt 0.065168 0.306161 +vt 0.040525 0.328256 +vt 0.076823 0.357460 +vt 0.103286 0.377776 +vt 0.090672 0.386253 +vt 0.851576 0.034155 +vt 0.359448 0.906394 +vt 0.363710 0.920019 +vt 0.358561 0.920020 +vt 0.331136 0.917691 +vt 0.333307 0.899054 +vt 0.338500 0.904956 +vt 0.086057 0.347924 +vt 0.098275 0.362853 +vt 0.051113 0.483085 +vt 0.082069 0.880744 +vt 0.073182 0.896122 +vt 0.181044 0.912422 +vt 0.187684 0.921727 +vt 0.331852 0.842954 +vt 0.353796 0.853322 +vt 0.345830 0.868271 +vt 0.087481 0.322194 +vt 0.082199 0.869683 +vt 0.069118 0.831844 +vt 0.084064 0.848626 +vt 0.124411 0.357398 +vt 0.058511 0.230986 +vt 0.084829 0.254494 +vt 0.057998 0.262462 +vt 0.079147 0.293399 +vt 0.122164 0.324140 +vt 0.081857 0.227199 +vt 0.093353 0.276250 +vt 0.122772 0.285786 +vt 0.132937 0.339687 +vt 0.095282 0.231006 +vt 0.110841 0.266233 +vt 0.130404 0.305122 +vt 0.111587 0.251840 +vt 0.154015 0.333787 +vt 0.470052 0.915025 +vt 0.476775 0.915820 +vt 0.477071 0.924871 +vt 0.111611 0.220870 +vt 0.913218 0.909574 +vt 0.905176 0.899828 +vt 0.907744 0.891990 +vt 0.169245 0.341348 +vt 0.110858 0.898949 +vt 0.124717 0.248856 +vt 0.110226 0.914478 +vt 0.907851 0.922390 +vt 0.905637 0.914217 +vt 0.913790 0.912954 +vt 0.143363 0.273739 +vt 0.145940 0.304318 +vt 0.126637 0.212108 +vt 0.127918 0.240262 +vt 0.150538 0.261420 +vt 0.173199 0.318087 +vt 0.186203 0.323967 +vt 0.168830 0.334461 +vt 0.084658 0.910136 +vt 0.225974 0.673798 +vt 0.144621 0.229313 +vt 0.131796 0.201372 +vt 0.017438 0.260168 +vt 0.004041 0.285959 +vt 0.005522 0.255701 +vt 0.212021 0.889207 +vt 0.219598 0.898746 +vt 0.216790 0.913207 +vt 0.347371 0.825474 +vt 0.360200 0.812819 +vt 0.729469 0.914803 +vt 0.281023 0.688979 +vt 0.303401 0.715745 +vt 0.260315 0.710448 +vt 0.264346 0.700181 +vt 0.240553 0.732092 +vt 0.229691 0.710891 +vt 0.215267 0.737844 +vt 0.310669 0.754948 +vt 0.229958 0.734894 +vt 0.293510 0.730695 +vt 0.191181 0.744215 +vt 0.268296 0.741998 +vt 0.241283 0.707284 +vt 0.009943 0.336696 +vt 0.311657 0.740513 +vt 0.293707 0.755323 +vt 0.235786 0.759586 +vt 0.197756 0.757722 +vt 0.023206 0.338899 +vt 0.266436 0.757274 +vt 0.735479 0.127242 +vt 0.753591 0.128060 +vt 0.744658 0.148775 +vt 0.759616 0.172109 +vt 0.734382 0.176371 +vt 0.756436 0.187929 +vt 0.646406 0.221840 +vt 0.748582 0.072380 +vt 0.775532 0.115506 +vt 0.741246 0.104060 +vt 0.774944 0.038514 +vt 0.785507 0.048256 +vt 0.760502 0.056057 +vt 0.776816 0.073404 +vt 0.770187 0.151606 +vt 0.795137 0.101447 +vt 0.786703 0.174000 +vt 0.795590 0.129899 +vt 0.800834 0.150256 +vt 0.814052 0.036231 +vt 0.805808 0.074330 +vt 0.819660 0.059243 +vt 0.814879 0.164561 +vt 0.815568 0.123728 +vt 0.023462 0.238729 +vt 0.361761 0.631941 +vt 0.339344 0.603278 +vt 0.360902 0.613016 +vt 0.007933 0.919451 +vt 0.000105 0.912356 +vt 0.006995 0.900765 +vt 0.083678 0.800376 +vt 0.092988 0.824313 +vt 0.091257 0.830789 +vt 0.281231 0.586627 +vt 0.078286 0.825729 +vt 0.293602 0.573200 +vt 0.277493 0.561665 +vt 0.283953 0.547022 +vt 0.664298 0.719873 +vt 0.130180 0.816110 +vt 0.151733 0.840330 +vt 0.129909 0.833455 +vt 0.355084 0.642904 +vt 0.339681 0.639366 +vt 0.356852 0.633348 +vt 0.176268 0.868697 +vt 0.162306 0.882014 +vt 0.156563 0.866631 +vt 0.172484 0.852717 +vt 0.273798 0.584119 +vt 0.243452 0.559838 +vt 0.256794 0.543883 +vt 0.010605 0.242783 +vt 0.351694 0.622995 +vt 0.112718 0.824753 +vt 0.111588 0.792591 +vt 0.102769 0.813525 +vt 0.634513 0.895063 +vt 0.624051 0.907584 +vt 0.630052 0.880296 +vt 0.327262 0.616644 +vt 0.352481 0.570106 +vt 0.343477 0.579419 +vt 0.339340 0.554494 +vt 0.326083 0.649994 +vt 0.318426 0.644714 +vt 0.242805 0.593921 +vt 0.720118 0.909651 +vt 0.718759 0.919356 +vt 0.711625 0.921038 +vt 0.262204 0.674953 +vt 0.256318 0.662816 +vt 0.265471 0.658158 +vt 0.326649 0.562455 +vt 0.246166 0.620802 +vt 0.251699 0.599686 +vt 0.216706 0.571669 +vt 0.389777 0.847509 +vt 0.371639 0.837487 +vt 0.369573 0.828584 +vt 0.316725 0.592876 +vt 0.218527 0.591859 +vt 0.390378 0.837396 +vt 0.390323 0.847712 +vt 0.383901 0.867711 +vt 0.370492 0.911753 +vt 0.373922 0.921852 +vt 0.365072 0.921517 +vt 0.245786 0.636378 +vt 0.229770 0.624110 +vt 0.241136 0.736825 +vt 0.222476 0.694375 +vt 0.334810 0.757246 +vt 0.251390 0.707156 +vt 0.366101 0.856818 +vt 0.229821 0.655597 +vt 0.213878 0.629706 +vt 0.201295 0.606723 +vt 0.193919 0.590483 +vt 0.331562 0.782566 +vt 0.330546 0.782102 +vt 0.222374 0.680149 +vt 0.198720 0.654333 +vt 0.205763 0.638741 +vt 0.202168 0.624444 +vt 0.319940 0.894761 +vt 0.223636 0.679019 +vt 0.335768 0.800186 +vt 0.210901 0.683951 +vt 0.195616 0.675328 +vt 0.218680 0.680343 +vt 0.377227 0.886186 +vt 0.262370 0.730185 +vt 0.343346 0.451019 +vt 0.231918 0.568369 +vt 0.336014 0.441197 +vt 0.183230 0.631488 +vt 0.176383 0.584820 +vt 0.335966 0.816872 +vt 0.183569 0.694077 +vt 0.174059 0.654708 +vt 0.187846 0.649458 +vt 0.196337 0.647882 +vt 0.163064 0.590197 +vt 0.319731 0.471713 +vt 0.091154 0.212219 +vt 0.409836 0.907357 +vt 0.403433 0.892076 +vt 0.408788 0.883490 +vt 0.081594 0.202462 +vt 0.131514 0.814117 +vt 0.126795 0.805579 +vt 0.147883 0.785844 +vt 0.040708 0.223040 +vt 0.104704 0.564364 +vt 0.053886 0.208930 +vt 0.620568 0.895408 +vt 0.052947 0.219336 +vt 0.057699 0.189772 +vt 0.097565 0.193029 +vt 0.117105 0.174894 +vt 0.126181 0.784561 +vt 0.135961 0.778568 +vt 0.048507 0.190317 +vt 0.082292 0.186104 +vt 0.104973 0.169432 +vt 0.029083 0.200065 +vt 0.581949 0.899844 +vt 0.579001 0.892994 +vt 0.583330 0.882813 +vt 0.065725 0.169516 +vt 0.087767 0.165544 +vt 0.106885 0.785097 +vt 0.080478 0.784302 +vt 0.093153 0.775581 +vt 0.022251 0.174757 +vt 0.040063 0.160079 +vt 0.190497 0.271909 +vt 0.073129 0.160460 +vt 0.099756 0.154226 +vt 0.087603 0.808775 +vt 0.022097 0.164822 +vt 0.091193 0.144743 +vt 0.002347 0.147231 +vt 0.027775 0.149488 +vt 0.067871 0.141935 +vt 0.100885 0.131293 +vt 0.311382 0.571132 +vt 0.047266 0.124564 +vt 0.033636 0.111517 +vt 0.086007 0.123951 +vt 0.076172 0.103377 +vt 0.297666 0.542129 +vt 0.004384 0.110780 +vt 0.271435 0.921879 +vt 0.271406 0.912043 +vt 0.684068 0.910247 +vt 0.052792 0.113289 +vt 0.031732 0.089583 +vt 0.031869 0.924705 +vt 0.032915 0.916117 +vt 0.039131 0.919437 +vt 0.004973 0.064392 +vt 0.047812 0.111032 +vt 0.067733 0.089601 +vt 0.277761 0.516117 +vt 0.299836 0.492332 +vt 0.021119 0.059074 +vt 0.046643 0.066605 +vt 0.095013 0.087188 +vt 0.479535 0.750336 +vt 0.505171 0.706346 +vt 0.527651 0.747785 +vt 0.510690 0.780132 +vt 0.886675 0.778628 +vt 0.532191 0.762005 +vt 0.533687 0.784624 +vt 0.524992 0.800481 +vt 0.262715 0.790792 +vt 0.274318 0.777693 +vt 0.285294 0.796631 +vt 0.275273 0.743907 +vt 0.298875 0.827163 +vt 0.266148 0.816150 +vt 0.289801 0.850433 +vt 0.239579 0.480054 +vt 0.265748 0.476753 +vt 0.266499 0.496172 +vt 0.242431 0.461473 +vt 0.245715 0.472462 +vt 0.561242 0.742471 +vt 0.544211 0.761499 +vt 0.570620 0.750252 +vt 0.555941 0.776994 +vt 0.307329 0.791408 +vt 0.226773 0.446837 +vt 0.296830 0.742297 +vt 0.298072 0.469958 +vt 0.577428 0.766235 +vt 0.295281 0.785600 +vt 0.532033 0.762753 +vt 0.277790 0.447693 +vt 0.521635 0.698081 +vt 0.556203 0.680803 +vt 0.555122 0.796906 +vt 0.551405 0.915465 +vt 0.541618 0.914260 +vt 0.541607 0.902807 +vt 0.309053 0.482624 +vt 0.546702 0.822121 +vt 0.545929 0.840643 +vt 0.532742 0.847354 +vt 0.573400 0.750667 +vt 0.588061 0.722779 +vt 0.605770 0.735243 +vt 0.585644 0.772003 +vt 0.624976 0.776189 +vt 0.598814 0.781328 +vt 0.029518 0.027693 +vt 0.037991 0.037552 +vt 0.019378 0.040228 +vt 0.544545 0.864977 +vt 0.295030 0.449095 +vt 0.606975 0.728144 +vt 0.051725 0.019677 +vt 0.058655 0.031964 +vt 0.575832 0.707540 +vt 0.581768 0.690100 +vt 0.598812 0.705788 +vt 0.439766 0.919655 +vt 0.441760 0.912302 +vt 0.449603 0.908512 +vt 0.605428 0.719598 +vt 0.449607 0.919413 +vt 0.634991 0.750488 +vt 0.069874 0.018391 +vt 0.079688 0.030512 +vt 0.102497 0.017400 +vt 0.109909 0.011564 +vt 0.119318 0.035682 +vt 0.628715 0.713003 +vt 0.585236 0.668431 +vt 0.607514 0.681031 +vt 0.123348 0.009169 +vt 0.645755 0.718757 +vt 0.102450 0.054278 +vt 0.161918 0.014247 +vt 0.159542 0.047959 +vt 0.138553 0.007811 +vt 0.253851 0.173560 +vt 0.141456 0.052149 +vt 0.594988 0.649998 +vt 0.615188 0.655220 +vt 0.630180 0.682290 +vt 0.650550 0.687960 +vt 0.125030 0.069957 +vt 0.189927 0.022439 +vt 0.172591 0.051255 +vt 0.621210 0.670895 +vt 0.626737 0.656932 +vt 0.644293 0.671163 +vt 0.099788 0.433043 +vt 0.117366 0.444614 +vt 0.095071 0.445711 +vt 0.394970 0.766039 +vt 0.415167 0.779080 +vt 0.402236 0.781798 +vt 0.050270 0.489259 +vt 0.052052 0.518452 +vt 0.037541 0.510390 +vt 0.706672 0.698003 +vt 0.681063 0.687704 +vt 0.483836 0.776764 +vt 0.229427 0.551360 +vt 0.443429 0.759087 +vt 0.075395 0.491486 +vt 0.177067 0.551976 +vt 0.474806 0.796574 +vt 0.123544 0.468143 +vt 0.233258 0.890947 +vt 0.872589 0.778615 +vt 0.487642 0.612338 +vt 0.882277 0.782839 +vt 0.497999 0.817177 +vt 0.890420 0.754376 +vt 0.087996 0.478003 +vt 0.097929 0.532471 +vt 0.079029 0.524709 +vt 0.069632 0.548465 +vt 0.046215 0.551229 +vt 0.123765 0.492088 +vt 0.113099 0.516655 +vt 0.194608 0.423564 +vt 0.194423 0.437674 +vt 0.180088 0.426089 +vt 0.520487 0.807477 +vt 0.172803 0.442449 +vt 0.168746 0.465084 +vt 0.142365 0.433438 +vt 0.152579 0.495806 +vt 0.173355 0.489856 +vt 0.194669 0.439446 +vt 0.198700 0.476779 +vt 0.133518 0.518054 +vt 0.127294 0.569382 +vt 0.209929 0.463210 +vt 0.155579 0.520245 +vt 0.143725 0.558316 +vt 0.268775 0.862891 +vt 0.182228 0.510002 +vt 0.219257 0.486308 +vt 0.207451 0.499824 +vt 0.193217 0.558389 +vt 0.140822 0.588282 +vt 0.292914 0.881968 +vt 0.237266 0.526716 +vt 0.240815 0.507321 +vt 0.214584 0.544870 +vt 0.437065 0.921548 +vt 0.431583 0.908853 +vt 0.905370 0.805062 +vt 0.474634 0.643946 +vt 0.461805 0.678327 +vt 0.451333 0.651651 +vt 0.437525 0.617326 +vt 0.419065 0.606503 +vt 0.409414 0.596480 +vt 0.462398 0.710061 +vt 0.433304 0.702800 +vt 0.447674 0.631471 +vt 0.413366 0.636444 +vt 0.478811 0.730180 +vt 0.431817 0.678223 +vt 0.410941 0.649403 +vt 0.392053 0.624953 +vt 0.416763 0.724279 +vt 0.330197 0.750780 +vt 0.314327 0.780289 +vt 0.313458 0.755448 +vt 0.396668 0.633225 +vt 0.424328 0.744303 +vt 0.406679 0.682642 +vt 0.379373 0.609128 +vt 0.360850 0.706875 +vt 0.330429 0.778561 +vt 0.402902 0.744070 +vt 0.389618 0.683852 +vt 0.378817 0.809047 +vt 0.454975 0.820528 +vt 0.449709 0.845074 +vt 0.459909 0.833890 +vt 0.369767 0.908860 +vt 0.366793 0.890120 +vt 0.375187 0.886186 +vt 0.384516 0.710161 +vt 0.800415 0.732173 +vt 0.323491 0.790380 +vt 0.314432 0.804186 +vt 0.527818 0.865985 +vt 0.315172 0.791053 +vt 0.518224 0.865006 +vt 0.523600 0.886483 +vt 0.656700 0.908752 +vt 0.653643 0.917665 +vt 0.649804 0.909493 +vt 0.379666 0.626490 +vt 0.373526 0.627659 +vt 0.366037 0.612700 +vt 0.372480 0.743543 +vt 0.772977 0.735474 +vt 0.058007 0.463434 +vt 0.796029 0.718022 +vt 0.325811 0.718261 +vt 0.025641 0.906992 +vt 0.018954 0.914343 +vt 0.811062 0.727362 +vt 0.768381 0.750098 +vt 0.822999 0.730729 +vt 0.837886 0.716254 +vt 0.851618 0.701010 +vt 0.854896 0.715726 +vt 0.372383 0.765176 +vt 0.736808 0.727935 +vt 0.745259 0.713518 +vt 0.785541 0.706977 +vt 0.657629 0.892428 +vt 0.642274 0.894838 +vt 0.641152 0.879120 +vt 0.857150 0.681387 +vt 0.871908 0.714868 +vt 0.710968 0.725789 +vt 0.790769 0.705786 +vt 0.806478 0.692590 +vt 0.565118 0.661411 +vt 0.532355 0.670658 +vt 0.548942 0.667256 +vt 0.618550 0.648511 +vt 0.580011 0.642338 +vt 0.500201 0.663370 +vt 0.721459 0.785403 +vt 0.563613 0.638134 +vt 0.519540 0.655852 +vt 0.536249 0.649832 +vt 0.562503 0.621652 +vt 0.582391 0.616893 +vt 0.510850 0.663325 +vt 0.352549 0.914486 +vt 0.344497 0.916113 +vt 0.349197 0.899758 +vt 0.531867 0.647639 +vt 0.530580 0.620425 +vt 0.552999 0.614372 +vt 0.311915 0.536682 +vt 0.315144 0.526811 +vt 0.318031 0.535206 +vt 0.490470 0.633106 +vt 0.504427 0.851890 +vt 0.493678 0.872797 +vt 0.501789 0.862048 +vt 0.567836 0.594098 +vt 0.511225 0.620296 +vt 0.461455 0.627421 +vt 0.492344 0.893450 +vt 0.541348 0.606933 +vt 0.549858 0.595355 +vt 0.477755 0.613776 +vt 0.490951 0.623886 +vt 0.499862 0.607853 +vt 0.487788 0.595776 +vt 0.525389 0.589084 +vt 0.555390 0.574500 +vt 0.462271 0.611608 +vt 0.538573 0.567573 +vt 0.502329 0.576996 +vt 0.526300 0.565732 +vt 0.479305 0.578524 +vt 0.462416 0.582927 +vt 0.744410 0.896697 +vt 0.737940 0.862475 +vt 0.633988 0.879133 +vt 0.750953 0.880774 +vt 0.751432 0.850977 +vt 0.744604 0.625592 +vt 0.781847 0.839894 +vt 0.680003 0.197627 +vt 0.646646 0.216893 +vt 0.661093 0.196855 +vt 0.643616 0.196426 +vt 0.533741 0.873991 +vt 0.549942 0.871012 +vt 0.701225 0.196183 +vt 0.684106 0.226148 +vt 0.727972 0.880619 +vt 0.708220 0.862691 +vt 0.639124 0.832255 +vt 0.705238 0.215265 +vt 0.671956 0.230036 +vt 0.654697 0.234236 +vt 0.726435 0.843930 +vt 0.756799 0.815592 +vt 0.769878 0.824979 +vt 0.879280 0.864066 +vt 0.442816 0.879198 +vt 0.712465 0.841554 +vt 0.057053 0.897430 +vt 0.068822 0.891737 +vt 0.047277 0.896825 +vt 0.498904 0.836016 +vt 0.483211 0.832014 +vt 0.502590 0.825305 +vt 0.705126 0.243009 +vt 0.693030 0.254344 +vt 0.678201 0.239560 +vt 0.669711 0.253292 +vt 0.872127 0.853784 +vt 0.500423 0.854205 +vt 0.488137 0.855685 +vt 0.729202 0.824256 +vt 0.745295 0.802370 +vt 0.689610 0.840856 +vt 0.674373 0.831183 +vt 0.689306 0.819822 +vt 0.705866 0.809786 +vt 0.714091 0.830106 +vt 0.721936 0.800674 +vt 0.728877 0.834764 +vt 0.872411 0.907706 +vt 0.879081 0.905418 +vt 0.877376 0.918107 +vt 0.760789 0.795127 +vt 0.677420 0.261099 +vt 0.662573 0.268719 +vt 0.751051 0.767422 +vt 0.736043 0.778371 +vt 0.251486 0.791888 +vt 0.789199 0.625021 +vt 0.240005 0.781535 +vt 0.223502 0.791743 +vt 0.699676 0.519272 +vt 0.225651 0.775655 +vt 0.490462 0.847714 +vt 0.706929 0.784054 +vt 0.720214 0.765842 +vt 0.671400 0.362826 +vt 0.843299 0.910447 +vt 0.837167 0.907157 +vt 0.843296 0.903209 +vt 0.235754 0.817547 +vt 0.177319 0.784920 +vt 0.167172 0.790470 +vt 0.613913 0.772119 +vt 0.161971 0.786705 +vt 0.318115 0.549081 +vt 0.318004 0.536682 +vt 0.312479 0.536978 +vt 0.698362 0.786922 +vt 0.699447 0.775439 +vt 0.244672 0.792175 +vt 0.676520 0.288835 +vt 0.668672 0.307221 +vt 0.903908 0.835359 +vt 0.894693 0.848716 +vt 0.715859 0.769592 +vt 0.154279 0.807793 +vt 0.903019 0.865940 +vt 0.843298 0.917590 +vt 0.837653 0.913196 +vt 0.207403 0.912351 +vt 0.454030 0.898781 +vt 0.418909 0.880885 +vt 0.583150 0.821589 +vt 0.426934 0.875449 +vt 0.469280 0.453316 +vt 0.475586 0.431557 +vt 0.484721 0.457174 +vt 0.320547 0.886084 +vt 0.314045 0.865001 +vt 0.327926 0.863189 +vt 0.531173 0.451094 +vt 0.536891 0.419912 +vt 0.536311 0.449602 +vt 0.570432 0.434480 +vt 0.913928 0.807737 +vt 0.921007 0.795484 +vt 0.921991 0.805364 +vt 0.508547 0.426360 +vt 0.545927 0.563588 +vt 0.783752 0.902116 +vt 0.693814 0.161914 +vt 0.501764 0.396371 +vt 0.495281 0.421920 +vt 0.523194 0.402285 +vt 0.692458 0.049360 +vt 0.679462 0.055651 +vt 0.788912 0.889848 +vt 0.722185 0.096106 +vt 0.558641 0.288000 +vt 0.531072 0.303970 +vt 0.676053 0.919927 +vt 0.666480 0.915499 +vt 0.670789 0.909819 +vt 0.535961 0.405049 +vt 0.358731 0.853872 +vt 0.358680 0.837732 +vt 0.365070 0.844788 +vt 0.725109 0.142609 +vt 0.715740 0.143552 +vt 0.715027 0.123537 +vt 0.698038 0.089400 +vt 0.718787 0.085079 +vt 0.521369 0.380388 +vt 0.133692 0.910445 +vt 0.178522 0.875226 +vt 0.124370 0.908155 +vt 0.119992 0.897705 +vt 0.666655 0.062456 +vt 0.650790 0.061118 +vt 0.794602 0.856510 +vt 0.597055 0.895167 +vt 0.609946 0.882241 +vt 0.613386 0.900753 +vt 0.689602 0.105634 +vt 0.708268 0.173763 +vt 0.704398 0.140845 +vt 0.709825 0.156667 +vt 0.691291 0.129180 +vt 0.896976 0.832004 +vt 0.890868 0.833132 +vt 0.901793 0.821071 +vt 0.793295 0.833896 +vt 0.660799 0.101888 +vt 0.662684 0.088001 +vt 0.671522 0.077214 +vt 0.653379 0.067652 +vt 0.673900 0.158904 +vt 0.660877 0.124690 +vt 0.139654 0.903277 +vt 0.133713 0.901188 +vt 0.137972 0.889010 +vt 0.638130 0.082796 +vt 0.657966 0.173812 +vt 0.646478 0.146466 +vt 0.646637 0.114558 +vt 0.630027 0.099382 +vt 0.057051 0.920977 +vt 0.049406 0.924246 +vt 0.054654 0.915305 +vt 0.646302 0.179034 +vt 0.627647 0.078798 +vt 0.430109 0.893212 +vt 0.430547 0.903130 +vt 0.686643 0.883069 +vt 0.651985 0.858019 +vt 0.634809 0.868696 +vt 0.206168 0.825576 +vt 0.000969 0.777373 +vt 0.019462 0.784262 +vt 0.426278 0.503757 +vt 0.437645 0.521709 +vt 0.421840 0.524083 +vt 0.420431 0.545915 +vt 0.462478 0.573682 +vt 0.454531 0.574203 +vt 0.634359 0.832041 +vt 0.649154 0.840407 +vt 0.443569 0.504342 +vt 0.459159 0.512075 +vt 0.455297 0.538387 +vt 0.648598 0.823908 +vt 0.466994 0.530034 +vt 0.579148 0.856314 +vt 0.556648 0.738218 +vt 0.590510 0.864731 +vt 0.588570 0.879012 +vt 0.466521 0.497811 +vt 0.575945 0.875577 +vt 0.448209 0.501611 +vt 0.477128 0.559802 +vt 0.474971 0.518770 +vt 0.487624 0.654213 +vt 0.573356 0.889723 +vt 0.566388 0.898152 +vt 0.491044 0.470932 +vt 0.465415 0.480415 +vt 0.481654 0.501589 +vt 0.510754 0.911252 +vt 0.513568 0.897821 +vt 0.518302 0.913088 +vt 0.560844 0.874464 +vt 0.567860 0.870681 +vt 0.573970 0.878482 +vt 0.503895 0.520041 +vt 0.520433 0.589204 +vt 0.602197 0.919138 +vt 0.492332 0.486429 +vt 0.532629 0.658415 +vt 0.617139 0.872668 +vt 0.600188 0.875643 +vt 0.479601 0.536522 +vt 0.496085 0.556297 +vt 0.496184 0.537726 +vt 0.609598 0.843955 +vt 0.619717 0.853386 +vt 0.605670 0.858483 +vt 0.492316 0.522878 +vt 0.636357 0.682913 +vt 0.510510 0.546679 +vt 0.513224 0.455416 +vt 0.596167 0.824666 +vt 0.603252 0.819240 +vt 0.618318 0.838857 +vt 0.500421 0.497277 +vt 0.507528 0.532924 +vt 0.507341 0.478385 +vt 0.529530 0.480177 +vt 0.523820 0.494934 +vt 0.521989 0.523925 +vt 0.782883 0.910647 +vt 0.788895 0.912298 +vt 0.790880 0.922747 +vt 0.547251 0.473767 +vt 0.541137 0.533327 +vt 0.541444 0.516502 +vt 0.549904 0.564162 +vt 0.202674 0.911265 +vt 0.207432 0.901121 +vt 0.209298 0.914242 +vt 0.688635 0.876099 +vt 0.250411 0.801828 +vt 0.665113 0.854770 +vt 0.684097 0.853553 +vt 0.249116 0.810078 +vt 0.250945 0.835356 +vt 0.693520 0.903678 +vt 0.677135 0.892238 +vt 0.006341 0.885581 +vt 0.009328 0.867313 +vt 0.028990 0.879416 +vt 0.007794 0.892933 +vt 0.256930 0.823498 +vt 0.667810 0.874550 +vt 0.099499 0.880494 +vt 0.711692 0.684996 +vt 0.106442 0.892421 +vt 0.036649 0.804551 +vt 0.020674 0.830212 +vt 0.019596 0.848504 +vt 0.045878 0.859828 +vt 0.919222 0.626049 +vt 0.900228 0.635730 +vt 0.911354 0.604229 +vt 0.107645 0.862693 +vt 0.118262 0.868934 +vt 0.868889 0.682153 +vt 0.933074 0.646074 +vt 0.917181 0.650588 +vt 0.301386 0.913581 +vt 0.309526 0.916279 +vt 0.301380 0.923353 +vt 0.315913 0.912907 +vt 0.319524 0.923944 +vt 0.402972 0.532370 +vt 0.048998 0.810873 +vt 0.507591 0.758509 +vt 0.053961 0.825804 +vt 0.901878 0.668875 +vt 0.885353 0.656570 +vt 0.151118 0.880922 +vt 0.391397 0.532965 +vt 0.062338 0.802905 +vt 0.371029 0.553049 +vt 0.382708 0.547030 +vt 0.933253 0.702254 +vt 0.906041 0.693994 +vt 0.882157 0.678123 +vt 0.413303 0.562865 +vt 0.459144 0.607677 +vt 0.563663 0.635425 +vt 0.882470 0.694317 +vt 0.389934 0.584442 +vn -0.189093 -0.978576 -0.081149 +vn 0.110538 -0.993744 -0.013764 +vn -0.069491 -0.970306 0.231635 +vn 0.205298 -0.968444 0.141087 +vn 0.129215 -0.987365 0.091464 +vn -0.095950 -0.976836 0.191168 +vn -0.103275 -0.992706 0.061769 +vn 0.126102 -0.991302 -0.036958 +vn 0.283456 -0.909513 0.303934 +vn 0.463576 -0.865902 -0.187811 +vn 0.546342 -0.816858 -0.184973 +vn 0.714286 -0.638386 -0.286752 +vn 0.646382 -0.741234 -0.180822 +vn -0.211676 -0.933958 -0.287820 +vn -0.158971 -0.943846 -0.289529 +vn -0.114689 -0.961608 -0.249184 +vn -0.174688 -0.984283 -0.025636 +vn 0.311686 -0.904904 -0.289773 +vn 0.687002 -0.614917 -0.387127 +vn 0.882229 -0.368694 -0.292795 +vn 0.335002 -0.817560 -0.468276 +vn 0.009461 -0.998688 -0.049989 +vn 0.106998 -0.968627 -0.224250 +vn 0.522782 -0.752007 -0.401410 +vn -0.081301 -0.934202 -0.347301 +vn -0.172796 -0.867092 -0.467177 +vn 0.785272 -0.241279 -0.570147 +vn 0.168676 -0.714438 -0.679037 +vn 0.612140 -0.475173 -0.632038 +vn 0.084841 -0.978362 -0.188604 +vn 0.055849 -0.606250 -0.793268 +vn 0.492630 -0.655507 -0.572375 +vn 0.486892 -0.873348 0.012421 +vn 0.193609 -0.975829 -0.101108 +vn 0.484359 -0.757897 -0.436995 +vn 0.284585 -0.563372 -0.775628 +vn 0.723014 -0.243385 -0.646504 +vn 0.475570 -0.659230 -0.582415 +vn 0.233955 -0.857875 -0.457472 +vn 0.412152 -0.700339 -0.582751 +vn -0.019044 -0.669454 -0.742576 +vn 0.083590 -0.696890 -0.712272 +vn 0.599933 -0.619983 -0.505600 +vn 0.370281 -0.366955 -0.853328 +vn 0.737419 0.065615 -0.672201 +vn 0.326731 -0.533097 -0.780389 +vn -0.030122 -0.545732 -0.837397 +vn -0.242653 -0.455824 -0.856349 +vn 0.101932 -0.586505 -0.803491 +vn 0.448561 -0.639241 -0.624592 +vn 0.243995 -0.762535 -0.599139 +vn 0.235755 -0.890652 -0.388775 +vn 0.216468 -0.606281 -0.765191 +vn 0.285257 -0.845851 -0.450697 +vn 0.690634 -0.235450 -0.683767 +vn -0.407880 -0.887509 0.214270 +vn -0.289529 -0.912503 0.288888 +vn -0.142888 -0.982849 0.116489 +vn -0.391369 -0.815119 0.427045 +vn 0.019471 -0.471389 0.881680 +vn -0.238380 -0.751579 0.615009 +vn -0.140629 -0.482589 0.864437 +vn -0.073641 -0.900815 0.427839 +vn -0.041963 -0.908170 0.416456 +vn -0.128636 -0.921873 0.365429 +vn -0.214820 -0.927152 0.306925 +vn -0.023103 -0.959746 0.279824 +vn 0.232063 -0.828272 0.509934 +vn 0.139134 -0.951994 0.272622 +vn 0.187048 -0.969970 0.155309 +vn -0.114170 -0.926542 0.358348 +vn 0.336314 -0.910550 0.240272 +vn 0.089785 -0.662160 0.743950 +vn -0.041780 -0.911008 0.410199 +vn 0.120365 -0.771691 0.624470 +vn 0.204749 -0.978240 0.032594 +vn -0.080935 -0.982910 0.165166 +vn 0.101077 -0.895718 0.432936 +vn -0.324198 -0.713675 0.620869 +vn -0.024537 -0.893551 0.448225 +vn -0.128208 -0.820673 0.556780 +vn 0.046815 -0.994018 0.098605 +vn 0.055147 -0.986602 -0.153478 +vn 0.011048 -0.888730 0.458266 +vn 0.135777 -0.816004 0.561815 +vn 0.136326 -0.984924 0.106388 +vn -0.134434 -0.782464 0.607959 +vn 0.046999 -0.826167 0.561418 +vn 0.256050 -0.785943 0.562761 +vn -0.034181 -0.974883 0.219947 +vn 0.379192 -0.703848 0.600635 +vn 0.067965 -0.743767 0.664937 +vn 0.137486 -0.901791 0.409680 +vn 0.380169 -0.580462 0.720054 +vn 0.161931 -0.974700 0.153996 +vn 0.470992 -0.802698 0.365795 +vn 0.422559 -0.532731 0.733207 +vn 0.411267 -0.674032 0.613605 +vn 0.719169 -0.586627 0.372326 +vn 0.729606 -0.575335 0.369610 +vn 0.764824 -0.639912 0.074099 +vn 0.430982 -0.369579 0.823176 +vn -0.244240 -0.956664 0.158330 +vn -0.318827 -0.947142 -0.035005 +vn -0.211249 -0.977172 0.022004 +vn -0.209693 -0.977722 0.007782 +vn -0.211066 -0.825953 0.522691 +vn -0.137089 -0.990265 0.022828 +vn -0.296640 -0.948820 0.108249 +vn -0.269356 -0.959807 -0.078768 +vn -0.559404 -0.762383 0.325266 +vn -0.751366 -0.568377 0.335215 +vn -0.837001 -0.546007 -0.035524 +vn -0.071566 -0.859828 0.505478 +vn -0.531419 -0.730949 0.428114 +vn -0.550707 -0.776605 0.305826 +vn -0.215339 -0.775811 0.593066 +vn -0.442305 -0.776605 0.448561 +vn -0.281716 -0.807672 0.517960 +vn -0.183264 -0.757225 0.626850 +vn -0.728446 -0.662587 0.174017 +vn -0.409925 -0.774743 0.481338 +vn -0.426740 -0.799310 0.423048 +vn -0.274453 -0.775048 0.569140 +vn -0.163518 -0.872829 0.459792 +vn -0.356822 -0.809564 0.466109 +vn -0.488113 -0.758782 0.431196 +vn -0.374676 -0.826289 0.420484 +vn -0.242958 -0.937986 0.247230 +vn -0.524583 -0.846339 0.091983 +vn -0.302438 -0.873714 0.380932 +vn -0.262764 -0.925108 0.274026 +vn -0.268777 -0.950407 0.156407 +vn -0.398755 -0.852046 0.339091 +vn -0.496200 -0.793725 0.351787 +vn -0.270760 -0.927885 0.256233 +vn -0.231544 -0.941923 0.243233 +vn -0.132359 -0.972167 0.193213 +vn -0.283456 -0.872707 0.397443 +vn -0.171087 -0.896817 0.407910 +vn -0.491104 -0.837519 0.239418 +vn -0.391125 -0.795831 0.462203 +vn -0.248787 -0.913968 0.320475 +vn -0.106876 -0.786096 0.608753 +vn -0.308817 -0.811426 0.496139 +vn 0.066012 -0.997620 0.019013 +vn 0.183294 -0.957457 -0.222816 +vn -0.203864 -0.966002 -0.158940 +vn -0.410504 -0.841426 -0.351360 +vn -0.085482 -0.519700 -0.850032 +vn -0.237281 -0.621998 -0.746147 +vn -0.115513 -0.992187 0.046907 +vn -0.184454 -0.971618 -0.148045 +vn -0.336314 -0.873409 -0.352153 +vn -0.247261 -0.660970 -0.708487 +vn -0.334819 -0.937651 -0.092990 +vn -0.073702 -0.581133 -0.810450 +vn 0.034181 -0.973785 -0.224799 +vn 0.072176 -0.493973 -0.866451 +vn -0.329753 -0.943632 -0.027589 +vn -0.343791 -0.586413 -0.733390 +vn -0.367779 -0.529160 -0.764641 +vn -0.107669 -0.707327 -0.698599 +vn -0.512833 -0.837825 0.187170 +vn -0.484634 -0.856319 -0.178350 +vn -0.392529 -0.816889 -0.422590 +vn -0.589190 -0.528642 -0.611011 +vn -0.383984 -0.653798 -0.651936 +vn -0.526353 -0.834590 -0.162420 +vn -0.808191 -0.587298 -0.043001 +vn -0.774316 -0.560106 -0.294382 +vn -0.594104 -0.343089 -0.727500 +vn -0.771996 -0.548662 -0.320841 +vn -0.745811 -0.344798 -0.569933 +vn -0.352916 -0.636555 -0.685690 +vn -0.475723 -0.773614 -0.418500 +vn -0.684500 -0.676809 -0.270852 +vn -0.897549 -0.350383 -0.267617 +vn -0.907651 -0.337565 -0.249367 +vn -0.537187 -0.841731 -0.053529 +vn -0.505631 -0.830439 -0.233772 +vn -0.321604 0.945616 -0.048219 +vn -0.102756 0.976135 0.191290 +vn -0.303415 0.942045 -0.143101 +vn 0.020814 0.981506 -0.190161 +vn -0.037599 0.969146 -0.243568 +vn 0.097018 0.963347 -0.250038 +vn -0.080966 0.812708 -0.576952 +vn -0.134037 0.974548 -0.179601 +vn -0.280740 0.525101 -0.803369 +vn -0.255226 0.438429 -0.861751 +vn -0.353587 0.226783 -0.907468 +vn -0.079226 0.978149 -0.192114 +vn -0.356334 0.800409 -0.481979 +vn -0.171941 0.061647 -0.983154 +vn -0.289346 0.033326 -0.956633 +vn -0.134404 0.923765 -0.358501 +vn -0.047945 0.941588 -0.333262 +vn 0.126133 0.308695 -0.942747 +vn 0.150792 0.941099 0.302591 +vn -0.151708 0.985015 -0.081973 +vn -0.031098 0.913083 -0.406568 +vn 0.296091 0.109012 -0.948882 +vn 0.216742 0.938932 0.267159 +vn 0.185949 0.896390 -0.402295 +vn 0.297861 0.858943 -0.416456 +vn 0.288278 0.410657 -0.864986 +vn 0.268349 -0.011414 -0.963225 +vn 0.380474 0.919553 0.098086 +vn 0.369671 0.805444 0.463210 +vn 0.325419 0.882290 -0.340007 +vn 0.433699 0.298227 -0.850246 +vn 0.409680 0.826411 0.386212 +vn 0.298410 0.780023 -0.549944 +vn 0.462355 0.690970 -0.555620 +vn 0.561663 0.780877 -0.273324 +vn 0.319865 0.061739 -0.945433 +vn 0.592059 0.785272 0.181005 +vn 0.378246 0.573687 -0.726493 +vn 0.676901 0.390728 -0.623768 +vn 0.466140 0.791070 -0.396069 +vn 0.655934 0.753319 0.046907 +vn 0.472823 0.535203 -0.699942 +vn 0.560778 0.192236 -0.805322 +vn 0.520402 0.241554 -0.819025 +vn 0.648000 0.710776 0.273537 +vn 0.704672 0.681417 0.197699 +vn 0.686117 0.697867 0.205451 +vn 0.648762 0.627674 -0.430219 +vn 0.385510 0.309366 -0.869259 +vn 0.733482 0.506546 -0.453169 +vn 0.634724 0.093570 -0.767022 +vn 0.642293 0.633503 0.431349 +vn 0.722404 0.656331 -0.217566 +vn 0.882504 0.414899 -0.221290 +vn 0.572863 0.060518 -0.817408 +vn -0.195654 0.973662 0.116794 +vn -0.343547 0.924253 0.166387 +vn -0.489395 0.858547 -0.152745 +vn 0.029939 0.946226 -0.322062 +vn 0.092532 0.908750 -0.406934 +vn -0.078982 0.913388 -0.399274 +vn -0.277413 0.827174 -0.488693 +vn -0.561876 0.821558 -0.096255 +vn -0.401196 0.882870 -0.243965 +vn -0.258950 0.947630 -0.186773 +vn -0.323801 0.925810 -0.194922 +vn -0.002625 0.936491 -0.350658 +vn 0.132389 0.973571 -0.186041 +vn -0.585803 0.793237 -0.166112 +vn -0.148045 0.844142 -0.515213 +vn -0.355358 0.789239 -0.500778 +vn -0.333842 0.919706 -0.206549 +vn -0.681936 0.690390 -0.241371 +vn -0.238136 0.909391 -0.340983 +vn -0.592273 0.792077 -0.147526 +vn -0.339915 0.772790 -0.535936 +vn -0.539445 0.824305 -0.171758 +vn -0.361614 0.824702 -0.434797 +vn -0.097171 0.850185 -0.517380 +vn -0.184149 0.711936 -0.677633 +vn -0.387219 0.865902 -0.316599 +vn -0.704367 0.684866 -0.186560 +vn -0.655965 0.694174 -0.296304 +vn -0.290872 0.763817 -0.576128 +vn -0.591327 0.539354 -0.599475 +vn -0.528550 0.827418 -0.189642 +vn -0.405042 0.898862 -0.167211 +vn -0.404889 0.622303 -0.669881 +vn -0.308939 0.814722 -0.490646 +vn -0.360698 0.368694 -0.856685 +vn -0.383862 0.879055 -0.282571 +vn -0.410627 0.768059 -0.491317 +vn -0.172308 0.388348 -0.905240 +vn -0.227363 0.650868 -0.724326 +vn -0.195685 0.700949 -0.685812 +vn -0.453047 0.445509 -0.772149 +vn -0.525559 0.550035 -0.649007 +vn 0.119236 0.249672 -0.960936 +vn 0.104709 0.456343 -0.883602 +vn -0.288491 0.684500 -0.669454 +vn -0.263680 0.610736 -0.746605 +vn -0.325694 0.577837 -0.748314 +vn -0.271065 0.763970 0.585498 +vn -0.217231 0.804163 0.553240 +vn -0.000244 0.782952 0.622059 +vn -0.036256 0.679678 0.732566 +vn -0.306131 0.804254 0.509323 +vn -0.177496 0.800043 0.573016 +vn -0.057070 0.850276 0.523179 +vn -0.334422 0.765496 0.549669 +vn -0.371776 0.918088 0.137181 +vn -0.105106 0.960967 0.255837 +vn 0.155278 0.924650 0.347667 +vn -0.123142 0.643300 0.755608 +vn -0.023408 0.993286 0.113071 +vn 0.138035 0.730430 0.668874 +vn 0.236305 0.565447 0.790185 +vn 0.094821 0.986267 0.135075 +vn 0.130039 0.940245 0.314646 +vn -0.195502 0.738731 0.644978 +vn 0.042390 0.992889 -0.110935 +vn -0.057802 0.765465 0.640858 +vn 0.116611 0.544359 0.830683 +vn -0.440901 0.542436 0.715079 +vn -0.101505 0.994720 -0.013337 +vn 0.034944 0.951537 0.305521 +vn -0.269936 0.948820 -0.163884 +vn -0.008911 0.707511 0.706595 +vn -0.095279 0.585589 0.804956 +vn -0.096988 0.873196 0.477554 +vn -0.080355 0.645741 0.759301 +vn 0.071902 0.585955 0.807123 +vn -0.348582 0.744987 0.568712 +vn -0.138401 0.984191 -0.110477 +vn -0.294259 0.829920 0.473922 +vn -0.211310 0.662465 0.718650 +vn -0.175970 0.713645 0.678030 +vn -0.296426 0.611713 0.733390 +vn -0.282083 0.732688 0.619312 +vn -0.273415 0.885189 -0.376354 +vn -0.485214 0.869869 -0.088687 +vn -0.206397 0.882595 0.422346 +vn -0.313517 0.723899 0.614521 +vn -0.179662 0.766778 0.616230 +vn -0.371197 0.510636 0.775506 +vn -0.152165 0.618488 0.770898 +vn -0.605701 0.448134 0.657460 +vn 0.840693 0.402509 0.362194 +vn 0.140477 0.868160 0.475936 +vn 0.354137 0.782250 0.512467 +vn 0.437666 0.771874 0.461074 +vn 0.798517 0.596576 0.080172 +vn -0.085238 0.888852 0.450148 +vn 0.738212 0.602710 0.302866 +vn -0.126530 0.804621 0.580096 +vn 0.328898 0.742515 0.583483 +vn 0.351421 0.768578 0.534532 +vn 0.037935 0.817988 0.573931 +vn 0.138524 0.938200 0.317148 +vn 0.375256 0.840022 0.391827 +vn 0.491379 0.660451 0.567736 +vn 0.695791 0.626240 0.351634 +vn 0.800897 0.549974 0.236732 +vn 0.705649 0.514695 0.486923 +vn 0.525132 0.744926 0.411389 +vn -0.188116 0.875027 0.445967 +vn 0.051576 0.845851 0.530900 +vn 0.283578 0.781335 0.555925 +vn 0.394452 0.792016 0.465896 +vn 0.448164 0.749565 0.487106 +vn 0.571642 0.666341 0.478713 +vn 0.552965 0.664510 0.502640 +vn -0.174200 0.922666 0.343974 +vn 0.457930 0.817896 0.348308 +vn 0.369274 0.724265 0.582263 +vn 0.463149 0.824396 0.325297 +vn 0.763359 0.270577 0.586535 +vn 0.923460 0.264870 0.277505 +vn -0.354564 0.821528 0.446455 +vn 0.585955 0.633534 0.505203 +vn -0.235420 0.843196 0.483291 +vn 0.334819 0.827021 0.451521 +vn 0.270272 0.668661 0.692679 +vn 0.482223 0.555956 0.676992 +vn -0.244789 0.758751 0.603595 +vn 0.525346 0.621876 0.580706 +vn -0.287851 0.409314 0.865780 +vn -0.060152 0.470809 0.880154 +vn 0.524522 0.511582 0.680532 +vn 0.568438 0.243477 0.785821 +vn 0.670339 0.261238 0.694510 +vn 0.599994 0.416578 0.682943 +vn 0.986541 -0.015137 -0.162603 +vn 0.892178 0.180578 -0.413953 +vn 0.851131 0.186071 -0.490829 +vn 0.590899 0.036378 -0.805902 +vn 0.626301 0.065127 -0.776818 +vn 0.737388 -0.049745 -0.673605 +vn 0.844691 0.123966 -0.520646 +vn 0.883541 -0.023469 -0.467727 +vn 0.856746 0.431623 -0.282235 +vn 0.974670 0.138432 -0.175542 +vn 0.955382 0.229743 -0.185461 +vn 0.711539 -0.143986 -0.687704 +vn 0.933103 -0.264718 -0.243294 +vn 0.496811 -0.293741 -0.816614 +vn 0.887356 -0.101016 -0.449843 +vn 0.877010 -0.276681 -0.392743 +vn 0.887204 -0.356090 -0.293313 +vn 0.696005 -0.361736 -0.620228 +vn 0.903897 -0.206244 -0.374645 +vn 0.939543 0.080844 -0.332713 +vn 0.893216 -0.037996 -0.447981 +vn 0.689230 -0.516160 -0.508408 +vn 0.835536 -0.413709 -0.361492 +vn 0.918363 -0.195654 -0.343883 +vn 0.767052 -0.179052 -0.616077 +vn 0.750237 -0.411115 -0.517747 +vn 0.650044 -0.338298 -0.680380 +vn 0.971068 -0.132328 -0.198645 +vn 0.477126 -0.279580 -0.833155 +vn 0.884457 -0.379131 -0.271920 +vn 0.861629 -0.133366 -0.489639 +vn 0.781060 -0.195318 -0.593066 +vn 0.814600 -0.086215 -0.573565 +vn 0.887143 -0.265114 -0.377667 +vn 0.651387 0.001038 -0.758721 +vn 0.916196 -0.194098 -0.350566 +vn 0.859218 -0.190466 -0.474776 +vn 0.864620 0.030000 -0.501480 +vn 0.846126 -0.504044 -0.173040 +vn 0.750999 0.093539 -0.653615 +vn 0.972320 0.124943 -0.197302 +vn 0.954741 0.294931 0.037751 +vn 0.947172 0.143956 -0.286538 +vn 0.992798 -0.094302 0.073641 +vn 0.993713 -0.003021 -0.111728 +vn 0.977050 0.050691 0.206854 +vn 0.934843 0.354930 0.007630 +vn 0.878231 0.438612 0.190527 +vn 0.848567 0.420392 0.321207 +vn 0.981353 0.037538 -0.188391 +vn 0.997314 0.031556 -0.065706 +vn 0.998596 -0.052370 0.003662 +vn 0.879116 0.448378 -0.161412 +vn 0.961791 0.105472 -0.252571 +vn 0.901517 -0.013306 -0.432478 +vn 0.790307 -0.143406 -0.595660 +vn 0.847072 -0.041841 -0.529801 +vn 0.908902 0.397046 -0.127323 +vn 0.657491 0.179083 -0.731834 +vn 0.771203 0.407086 -0.489395 +vn 0.552934 0.070650 -0.830195 +vn 0.536515 0.052461 -0.842250 +vn 0.576250 0.145848 -0.804132 +vn 0.380139 0.048799 -0.923612 +vn 0.384167 -0.187780 -0.903958 +vn 0.370708 0.139714 -0.918149 +vn 0.457533 -0.112491 -0.882015 +vn 0.457808 -0.020966 -0.888791 +vn 0.812372 0.238563 -0.532090 +vn 0.816279 0.021119 -0.577258 +vn 0.746788 -0.181555 -0.639760 +vn 0.660573 0.249702 -0.707999 +vn 0.717490 0.270943 -0.641682 +vn 0.931516 0.049165 -0.360302 +vn 0.928800 0.269967 -0.253761 +vn 0.890469 0.096438 -0.444624 +vn 0.966826 0.103549 -0.233375 +vn 0.975341 0.200537 0.091952 +vn 0.958922 0.232734 -0.162023 +vn 0.951323 0.263436 0.159917 +vn 0.821497 0.242317 0.516098 +vn 0.746239 0.340434 0.572008 +vn 0.791436 0.283090 0.541704 +vn 0.876644 0.305918 0.371319 +vn 0.804193 0.300150 0.512955 +vn 0.975005 0.033052 -0.219581 +vn 0.888028 0.335551 0.314280 +vn 0.921018 0.282266 0.268380 +vn 0.747337 0.238685 0.620045 +vn 0.732871 0.514023 0.445692 +vn 0.661122 0.579333 0.476699 +vn 0.934416 0.303537 0.186224 +vn 0.860073 0.410993 0.302194 +vn 0.937529 0.315256 -0.147008 +vn 0.747520 0.527329 0.403851 +vn 0.566363 0.606555 0.557939 +vn 0.831324 0.375317 0.409894 +vn 0.808161 0.493851 0.320841 +vn 0.655843 0.530229 0.537278 +vn 0.705100 0.582568 0.404218 +vn 0.686880 0.465835 0.557787 +vn 0.846492 0.390240 0.362102 +vn 0.773644 0.501267 0.387555 +vn 0.723716 0.592792 0.353252 +vn 0.719626 0.388409 0.575549 +vn 0.592303 0.463729 0.658864 +vn 0.569720 0.416578 0.708396 +vn 0.596423 0.625507 0.502976 +vn 0.827693 0.549944 0.111576 +vn 0.898770 0.271249 0.344371 +vn 0.574786 0.432722 0.694479 +vn 0.615864 0.529374 0.583453 +vn 0.358318 0.433485 0.826807 +vn 0.787408 0.592242 0.170965 +vn 0.819666 0.358074 0.447066 +vn 0.846370 0.355144 0.396832 +vn 0.718863 0.501358 0.481460 +vn 0.821375 -0.560320 -0.106479 +vn 0.951506 0.198706 -0.234718 +vn 0.940306 -0.171606 -0.293802 +vn 0.878536 -0.458754 -0.132817 +vn 0.879330 -0.473952 -0.046175 +vn 0.939146 -0.173925 -0.296121 +vn 0.736595 -0.674032 -0.055544 +vn 0.988067 -0.151555 -0.027131 +vn 0.753166 -0.655782 -0.051637 +vn 0.908017 0.263161 0.325907 +vn 0.816980 -0.538011 0.207434 +vn 0.636341 -0.672811 0.377300 +vn 0.850459 -0.197363 0.487564 +vn 0.367199 -0.491256 0.789788 +vn 0.487503 -0.558306 0.671255 +vn 0.486190 -0.642354 0.592425 +vn 0.785424 0.195807 0.587115 +vn 0.698508 0.195837 0.688253 +vn 0.626789 -0.262337 0.733665 +vn 0.349803 -0.485031 0.801477 +vn 0.243538 -0.606891 0.756523 +vn 0.807184 -0.054811 0.587695 +vn 0.188421 -0.642415 0.742790 +vn 0.462722 -0.485733 0.741539 +vn 0.617908 -0.051241 0.784539 +vn 0.403882 -0.604816 0.686331 +vn 0.731956 0.031129 0.680593 +vn 0.407910 -0.688620 0.599475 +vn 0.322611 -0.367168 0.872402 +vn 0.482955 -0.589404 0.647542 +vn -0.366344 -0.172063 0.914396 +vn -0.267647 -0.178045 0.946898 +vn -0.287851 -0.305582 0.907590 +vn 0.323099 0.050996 0.944975 +vn -0.025452 -0.114200 0.993103 +vn 0.526231 -0.301523 0.795038 +vn 0.689474 -0.029633 0.723685 +vn -0.268227 0.137028 0.953520 +vn -0.188665 0.024964 0.981719 +vn -0.149083 -0.324747 0.933958 +vn -0.139500 -0.260414 0.955351 +vn 0.532548 -0.382519 0.754997 +vn 0.475234 -0.275857 0.835475 +vn -0.117008 -0.143498 0.982696 +vn 0.335795 -0.486984 0.806269 +vn 0.565813 -0.318979 0.760308 +vn -0.258187 -0.361339 0.895962 +vn -0.013550 -0.452071 0.891873 +vn 0.070803 -0.667409 0.741295 +vn 0.328227 -0.542314 0.773370 +vn -0.204749 -0.567064 0.797784 +vn 0.158574 -0.630177 0.760063 +vn -0.156072 -0.541581 0.826014 +vn 0.015229 -0.688955 0.724631 +vn -0.012268 -0.588458 0.808405 +vn 0.259163 -0.541520 0.799707 +vn -0.111850 -0.618671 0.777612 +vn 0.048860 -0.659200 0.750359 +vn 0.042085 -0.379864 0.924070 +vn -0.059297 -0.490463 0.869411 +vn 0.462874 -0.373852 0.803705 +vn -0.097751 -0.562639 0.820887 +vn 0.000641 -0.338237 0.941038 +vn -0.155522 -0.549333 0.820978 +vn 0.082949 -0.407361 0.909452 +vn -0.121189 -0.598376 0.791955 +vn 0.046663 -0.637776 0.768792 +vn 0.362651 -0.620685 0.695120 +vn -0.238380 -0.785119 0.571612 +vn 0.145665 -0.705008 0.694021 +vn -0.543840 -0.258309 0.798395 +vn -0.444014 -0.001831 0.895993 +vn -0.447493 0.048067 0.892972 +vn -0.060640 0.540544 0.839106 +vn -0.277444 0.498520 0.821253 +vn -0.362133 0.645558 0.672323 +vn -0.163518 0.473312 0.865566 +vn -0.355083 0.592517 0.723045 +vn -0.292550 0.664327 0.687796 +vn 0.010437 0.650533 0.759392 +vn -0.336924 0.338237 0.878658 +vn -0.330058 0.386456 0.861202 +vn -0.234199 0.589801 0.772790 +vn 0.226295 0.127506 0.965667 +vn 0.119175 0.506333 0.854030 +vn 0.105655 0.714805 0.691244 +vn 0.391491 0.238166 0.888791 +vn 0.113529 -0.112003 0.987182 +vn 0.284738 0.610034 0.739402 +vn 0.394757 0.558580 0.729453 +vn 0.645283 0.479354 0.594806 +vn 0.388806 0.537156 0.748497 +vn 0.532884 0.715140 0.452254 +vn 0.504898 0.600971 0.619556 +vn 0.659810 0.565783 0.494461 +vn 0.611255 0.633229 0.474715 +vn 0.680105 0.678426 0.277718 +vn 0.629871 0.447096 0.635090 +vn 0.809717 0.110477 0.576281 +vn 0.589862 0.478256 0.650624 +vn 0.683737 0.616108 0.390942 +vn -0.136143 0.028687 0.990265 +vn -0.065828 -0.167852 0.983581 +vn -0.056215 0.153508 0.986541 +vn 0.037629 0.117588 0.992340 +vn 0.124302 0.063173 0.990204 +vn -0.001953 0.342967 0.939329 +vn -0.190924 0.310800 0.931089 +vn -0.546464 0.134587 0.826563 +vn -0.534165 0.216315 0.817194 +vn -0.375347 0.180944 0.909024 +vn -0.289743 -0.238716 0.926847 +vn -0.113132 -0.083285 0.990051 +vn -0.198004 0.042238 0.979278 +vn -0.332224 0.013123 0.943083 +vn -0.372509 0.039674 0.927152 +vn -0.190649 -0.177648 0.965423 +vn -0.117466 0.187414 0.975219 +vn -0.465712 0.055452 0.883175 +vn -0.038209 0.328745 0.943632 +vn -0.236061 0.130467 0.962920 +vn -0.423688 0.345927 0.837123 +vn -0.296487 0.517869 0.802393 +vn 0.075167 0.608448 0.790002 +vn -0.069124 0.680258 0.729698 +vn -0.247810 0.634877 0.731742 +vn -0.154515 0.686422 0.710562 +vn -0.211035 0.508194 0.834956 +vn -0.351268 0.513077 0.783166 +vn 0.181219 0.418683 0.889828 +vn -0.203101 0.760369 0.616871 +vn -0.272225 0.791223 0.547533 +vn 0.029267 0.650777 0.758660 +vn -0.255654 0.651845 0.713950 +vn -0.090609 0.402661 0.910825 +vn -0.419965 0.432630 0.797754 +vn -0.213752 0.636708 0.740867 +vn -0.287393 0.373608 0.881924 +vn -0.060060 -0.523667 0.849788 +vn -0.207221 -0.040956 0.977416 +vn -0.289743 -0.406842 0.866298 +vn -0.169408 -0.438734 0.882473 +vn -0.056368 -0.431806 0.900174 +vn -0.209204 -0.587207 0.781915 +vn -0.203650 0.101413 0.973754 +vn -0.171117 -0.275185 0.946013 +vn -0.136174 -0.311624 0.940367 +vn -0.231758 -0.436872 0.869137 +vn -0.211982 -0.448775 0.868129 +vn 0.103580 -0.458937 0.882382 +vn -0.087191 -0.082675 0.992737 +vn 0.147557 -0.464187 0.873318 +vn -0.097201 -0.318888 0.942778 +vn -0.448500 -0.577837 0.681845 +vn -0.214820 -0.587817 0.779931 +vn -0.024598 -0.091067 0.995514 +vn -0.003815 -0.323038 0.946348 +vn 0.095187 -0.601856 0.792871 +vn -0.116367 -0.805444 0.581103 +vn -0.272378 -0.441847 0.854701 +vn -0.164617 -0.279366 0.945952 +vn 0.058779 -0.804865 0.590503 +vn -0.350597 -0.738487 0.575915 +vn -0.325388 -0.076815 0.942442 +vn -0.491379 -0.379040 0.784112 +vn 0.011902 -0.402478 0.915342 +vn -0.319132 -0.746300 0.584063 +vn -0.459212 0.012024 0.888211 +vn -0.417096 0.256172 0.871975 +vn -0.337168 -0.421644 0.841700 +vn -0.123692 -0.765313 0.631611 +vn -0.229072 -0.899716 0.371471 +vn -0.757622 -0.255226 -0.600665 +vn -0.743858 -0.393872 -0.539903 +vn -0.829981 -0.428114 -0.357433 +vn -0.916135 -0.340587 -0.211371 +vn -0.864681 -0.499710 0.050600 +vn -0.819788 -0.554430 0.143223 +vn -0.967132 -0.145177 0.208686 +vn -0.756188 -0.447584 0.477279 +vn -0.864528 -0.240150 0.441420 +vn -0.855678 -0.318613 0.407697 +vn -0.696097 -0.371136 0.614551 +vn -0.920591 0.020997 0.389904 +vn -0.770165 0.063387 0.634632 +vn -0.862178 -0.504654 0.043733 +vn -0.818751 -0.563707 0.108798 +vn -0.950133 -0.224952 0.215918 +vn -0.826899 -0.110660 0.551317 +vn -0.878292 -0.476577 0.038179 +vn -0.960295 -0.024201 0.277840 +vn -0.724662 -0.316416 -0.612140 +vn -0.856227 -0.137852 -0.497848 +vn -0.851741 -0.475112 -0.220740 +vn -0.770531 -0.636799 -0.026887 +vn -0.877743 -0.465407 0.113620 +vn -0.893155 -0.424574 0.148259 +vn -0.667104 -0.571612 0.477676 +vn -0.870632 -0.424726 0.248085 +vn -0.479598 -0.753075 0.450331 +vn -0.839656 -0.469588 -0.272774 +vn -0.551012 -0.834284 0.018159 +vn -0.704398 -0.686117 0.181707 +vn -0.527635 -0.830897 0.176580 +vn -0.435011 -0.896115 -0.087954 +vn -0.687429 -0.591876 -0.420820 +vn -0.516160 -0.829585 0.212867 +vn -0.260872 -0.953459 0.151006 +vn -0.425489 -0.880551 0.208655 +vn -0.539720 -0.839229 -0.065828 +vn -0.623096 -0.604022 -0.496841 +vn -0.652943 -0.753655 0.074831 +vn 0.001953 -0.913144 0.407605 +vn -0.604358 -0.686850 0.403638 +vn -0.958220 -0.072512 -0.276589 +vn -0.952422 0.255257 -0.166478 +vn -0.966857 0.178350 -0.182653 +vn -0.938841 0.244270 -0.242592 +vn -0.924406 0.367412 -0.102176 +vn -0.876400 0.450148 -0.171056 +vn -0.792749 0.597797 -0.118961 +vn -0.604327 0.694937 -0.389599 +vn -0.920133 -0.017457 -0.391156 +vn -0.897641 0.440687 -0.000580 +vn -0.980224 0.184973 -0.070162 +vn -0.986755 0.160527 -0.023041 +vn -0.984741 0.019074 0.172796 +vn -0.951170 0.290994 0.102786 +vn -0.647908 0.658986 0.381939 +vn -0.879208 0.442854 0.175573 +vn -0.570391 0.705466 0.420576 +vn -0.692404 0.688711 0.214972 +vn -0.951537 0.303201 0.051271 +vn -0.920042 0.304666 0.246315 +vn -0.894192 0.312571 0.320444 +vn -0.871273 -0.014588 0.490555 +vn -0.658467 0.536302 0.527970 +vn -0.295419 0.826350 0.479415 +vn -0.630024 -0.307199 0.713218 +vn -0.510056 0.469527 0.720634 +vn -0.336283 0.478072 0.811365 +vn -0.445204 0.428144 0.786431 +vn -0.468673 0.157445 0.869198 +vn -0.355937 0.487686 0.797113 +vn -0.300668 0.089511 0.949492 +vn -0.367260 0.381787 0.848109 +vn -0.747551 -0.634297 -0.196905 +vn -0.802881 -0.491470 -0.337352 +vn -0.824671 -0.490371 -0.281747 +vn -0.673391 -0.432142 -0.599780 +vn -0.299387 -0.398663 -0.866817 +vn -0.520157 -0.234107 -0.821314 +vn -0.804193 -0.437819 -0.401929 +vn -0.758263 -0.197974 -0.621143 +vn -0.860134 -0.336467 -0.383343 +vn -0.778130 -0.159185 -0.607532 +vn -0.748375 -0.390606 -0.536027 +vn -0.921415 -0.090182 -0.377911 +vn -0.884915 0.006073 -0.465682 +vn -0.696249 0.275674 -0.662709 +vn -0.836970 -0.031526 -0.546281 +vn -0.852596 0.308084 -0.422010 +vn -0.944395 0.244636 -0.219611 +vn -0.846095 0.079836 -0.526994 +vn -0.745872 0.098880 -0.658681 +vn -0.905148 0.198767 -0.375683 +vn -0.741447 0.213874 -0.635975 +vn -0.644917 0.501846 -0.576342 +vn -0.638600 0.328562 -0.695853 +vn -0.706351 0.379864 -0.597278 +vn -0.732994 0.612659 -0.295541 +vn -0.569842 0.612720 -0.547563 +vn -0.744621 0.458937 -0.484664 +vn -0.639027 0.401105 -0.656270 +vn -0.624836 0.456282 -0.633503 +vn -0.491897 0.625690 -0.605396 +vn -0.530106 0.617115 -0.581469 +vn -0.597613 0.451216 -0.662740 +vn -0.459822 0.600543 -0.654103 +vn -0.434370 0.510300 -0.742210 +vn -0.710135 -0.369030 -0.599567 +vn -0.845149 -0.134678 -0.517258 +vn -0.937590 -0.116550 -0.327555 +vn -0.639912 -0.533189 -0.553331 +vn -0.780297 -0.479202 -0.401807 +vn -0.806238 -0.518601 -0.284585 +vn -0.933409 -0.094211 -0.346202 +vn -0.972076 -0.096286 -0.213935 +vn -0.728385 -0.685141 0.003845 +vn -0.805170 -0.560350 -0.194098 +vn -0.976989 0.024934 -0.211737 +vn -0.892026 -0.380749 -0.243507 +vn -0.816065 -0.577929 -0.002594 +vn -0.948485 -0.258370 -0.183203 +vn -0.932524 -0.126896 -0.338023 +vn -0.753685 -0.641652 -0.142064 +vn -0.907987 -0.365459 -0.204779 +vn -0.916410 -0.242897 -0.318094 +vn -0.710196 -0.676260 -0.195563 +vn -0.845271 -0.471847 -0.250710 +vn -0.854915 0.022614 -0.518235 +vn -0.739219 -0.110752 -0.664266 +vn -0.766839 -0.156102 -0.622517 +vn -0.653066 -0.385479 -0.651814 +vn -0.668538 -0.390667 -0.632740 +vn -0.571612 -0.228797 -0.787957 +vn -0.589587 0.001373 -0.807672 +vn -0.582873 -0.022950 -0.812220 +vn -0.532029 -0.262856 -0.804865 +vn -0.001343 0.299997 -0.953917 +vn -0.012757 0.150273 -0.988556 +vn -0.149174 0.255379 -0.955229 +vn -0.219581 0.372784 -0.901547 +vn -0.061007 0.348399 -0.935331 +vn 0.100162 0.240120 -0.965545 +vn 0.650319 0.109775 -0.751640 +vn 0.775384 0.016236 -0.631245 +vn 0.760826 0.196173 -0.618549 +vn 0.070223 0.088626 -0.993561 +vn 0.421247 0.215308 -0.880978 +vn -0.064241 0.571154 -0.818293 +vn -0.273446 0.318857 -0.907468 +vn 0.646626 0.194739 -0.737510 +vn 0.941374 0.202612 -0.269692 +vn -0.133641 0.300333 -0.944395 +vn -0.124912 0.294137 -0.947539 +vn -0.440230 0.256264 -0.860500 +vn 0.722983 0.409101 -0.556658 +vn -0.302011 0.309885 -0.901517 +vn 0.463576 0.458510 -0.758171 +vn -0.164495 0.097324 -0.981536 +vn -0.058992 0.576189 -0.815149 +vn 0.070864 0.275674 -0.958617 +vn -0.268685 0.221717 -0.937346 +vn -0.304361 0.332987 -0.892422 +vn -0.231819 0.501572 -0.833461 +vn 0.623585 0.430036 -0.652821 +vn 0.178930 0.684927 -0.706290 +vn -0.074343 0.067507 -0.994934 +vn -0.065340 0.006775 -0.997833 +vn 0.485000 0.268868 -0.832118 +vn 0.255287 0.439650 -0.861080 +vn 0.106479 0.479812 -0.870846 +vn 0.231513 0.353160 -0.906430 +vn 0.043764 -0.050142 -0.997772 +vn -0.285958 0.151524 -0.946165 +vn -0.183905 -0.131230 -0.974120 +vn -0.554369 -0.089908 -0.827387 +vn -0.427534 0.053591 -0.902402 +vn -0.182043 -0.769250 -0.612445 +vn -0.028382 -0.811609 -0.583483 +vn -0.059328 -0.678060 -0.732566 +vn -0.409864 -0.441664 -0.798059 +vn -0.150426 0.089114 -0.984588 +vn -0.226753 -0.459761 -0.858577 +vn -0.069369 -0.846644 -0.527573 +vn 0.275979 -0.731986 -0.622883 +vn 0.076815 0.353252 -0.932340 +vn 0.223212 -0.290414 -0.930479 +vn 0.144475 -0.871670 -0.468245 +vn 0.259651 -0.066836 -0.963378 +vn 0.327372 -0.721061 -0.610614 +vn 0.202216 -0.917020 -0.343699 +vn 0.146947 0.293466 -0.944578 +vn 0.393719 0.114048 -0.912107 +vn 0.553575 -0.378918 -0.741569 +vn 0.672567 -0.201117 -0.712149 +vn 0.649586 -0.575976 -0.496231 +vn 0.317850 -0.860317 -0.398450 +vn 0.863674 0.045412 -0.501968 +vn 0.908719 -0.135838 -0.394635 +vn 0.381909 -0.826777 -0.412946 +vn 0.807337 -0.071078 -0.585772 +vn 0.864254 -0.090426 -0.494827 +vn 0.868557 -0.252052 -0.426649 +vn 0.806696 -0.512497 -0.294198 +vn 0.707480 -0.129948 -0.694632 +vn -0.016785 0.117496 -0.992920 +vn -0.145268 -0.188208 -0.971313 +vn -0.131230 0.085482 -0.987640 +vn 0.144505 -0.277383 -0.949797 +vn -0.239540 -0.521012 -0.819239 +vn -0.335002 -0.341594 -0.878109 +vn -0.519730 -0.544816 -0.658010 +vn -0.545885 -0.202521 -0.812983 +vn -0.438093 -0.404462 -0.802759 +vn -0.306406 0.002350 -0.951872 +vn -0.221107 -0.456496 -0.861782 +vn -0.737236 -0.141972 -0.660512 +vn -0.238319 -0.186682 -0.953063 +vn -0.405744 0.152318 -0.901181 +vn -0.427992 -0.134800 -0.893643 +vn -0.596149 -0.015595 -0.802698 +vn -0.187933 -0.256050 -0.948210 +vn -0.448714 -0.101901 -0.887814 +vn -0.222541 -0.101932 -0.969573 +vn -0.492660 0.069277 -0.867428 +vn -0.405133 -0.194067 -0.893399 +vn -0.126347 0.108066 -0.986053 +vn -0.465255 -0.244575 -0.850673 +vn -0.383862 -0.003265 -0.923368 +vn -0.522935 -0.247719 -0.815546 +vn -0.460921 -0.197211 -0.865230 +vn -0.202643 -0.469985 -0.859066 +vn -0.112522 -0.089785 -0.989563 +vn -0.076815 -0.744316 -0.663381 +vn -0.383770 -0.503861 -0.773827 +vn -0.533799 -0.180548 -0.826075 +vn -0.150975 -0.721946 -0.675253 +vn -0.401593 -0.423811 -0.811823 +vn -0.250862 -0.594989 -0.763543 +vn 0.289468 0.511795 -0.808863 +vn 0.348857 0.352062 -0.868496 +vn 0.410291 0.234931 -0.881161 +vn 0.304270 0.301187 -0.903714 +vn 0.488815 0.492904 -0.719779 +vn 0.473647 0.247261 -0.845271 +vn 0.217963 0.043886 -0.974944 +vn 0.410901 0.303140 -0.859767 +vn -0.035432 0.675527 -0.736473 +vn 0.097507 0.343089 -0.934202 +vn -0.027039 0.519486 -0.854030 +vn -0.193609 -0.286355 -0.938353 +vn -0.270302 0.184240 -0.944975 +vn -0.268410 0.739769 -0.616962 +vn -0.173254 0.831538 -0.527726 +vn -0.300027 -0.242622 -0.922544 +vn -0.430799 0.587298 -0.685171 +vn -0.535051 0.672933 -0.510697 +vn -0.487716 -0.522843 -0.699088 +vn -0.671377 0.318613 -0.669088 +vn -0.336161 0.540391 -0.771325 +vn -0.707572 -0.101291 -0.699301 +g Cube_Cube_Material_Cube_Cube_Material_Material.001 +usemtl Material.001 +s 1 +f 1/1/1 2/2/2 51/3/3 +f 51/4/3 2/5/2 3/6/4 +f 3/6/4 2/5/2 4/7/5 +f 5/8/6 4/7/5 6/9/7 +f 5/8/6 6/9/7 7/10/8 +f 5/8/6 7/10/8 8/11/9 +f 9/12/10 10/13/11 11/14/12 +f 11/14/12 10/13/11 12/15/13 +f 1/16/1 13/17/14 14/18/15 +f 1/16/1 14/18/15 2/5/2 +f 2/5/2 6/9/7 4/7/5 +f 8/11/9 7/10/8 9/19/10 +f 14/18/15 15/20/16 2/5/2 +f 2/21/2 15/22/16 6/23/7 +f 6/9/7 19/24/17 7/10/8 +f 7/10/8 19/24/17 16/25/18 +f 9/12/10 7/26/8 10/13/11 +f 10/13/11 17/27/19 12/15/13 +f 12/15/13 17/27/19 380/28/20 +f 6/9/7 15/29/16 19/24/17 +f 7/26/8 16/30/18 20/31/21 +f 18/32/22 21/33/23 13/34/14 +f 13/35/14 21/36/23 14/37/15 +f 14/37/15 21/36/23 15/38/16 +f 7/39/8 20/40/21 22/41/24 +f 7/39/8 22/42/24 10/13/11 +f 10/43/11 22/42/24 17/44/19 +f 21/36/23 23/45/25 15/38/16 +f 15/29/16 23/46/25 24/47/26 +f 15/29/16 24/47/26 19/24/17 +f 19/48/17 24/49/26 16/50/18 +f 22/41/24 381/51/27 17/27/19 +f 24/49/26 26/52/28 16/50/18 +f 16/30/18 26/53/28 20/31/21 +f 22/41/24 27/54/29 381/51/27 +f 21/55/23 28/56/30 23/57/25 +f 23/58/25 29/59/31 24/49/26 +f 24/49/26 29/59/31 26/52/28 +f 26/53/28 30/60/32 20/31/21 +f 20/31/21 30/60/32 22/41/24 +f 22/41/24 30/60/32 27/54/29 +f 21/55/23 25/61/33 34/62/34 +f 21/55/23 34/62/34 28/56/30 +f 23/57/25 28/56/30 31/63/35 +f 23/64/25 31/63/35 29/65/31 +f 29/59/31 32/66/36 26/52/28 +f 26/67/28 32/68/36 30/60/32 +f 30/60/32 33/69/37 27/54/29 +f 28/70/30 35/71/38 31/63/35 +f 34/72/34 37/73/39 28/74/30 +f 28/75/30 37/76/39 35/71/38 +f 31/63/35 35/71/38 38/77/40 +f 31/63/35 38/78/40 29/79/31 +f 29/59/31 38/78/40 32/66/36 +f 30/60/32 32/80/36 33/69/37 +f 36/81/41 39/82/42 34/83/34 +f 34/72/34 39/84/42 37/85/39 +f 35/71/38 41/86/43 38/77/40 +f 32/80/36 40/87/44 33/69/37 +f 33/69/37 40/87/44 379/88/45 +f 37/76/39 44/89/46 41/86/43 +f 37/76/39 41/86/43 35/71/38 +f 38/78/40 42/90/47 32/66/36 +f 32/66/36 42/90/47 40/91/44 +f 39/92/42 43/93/48 46/94/49 +f 39/92/42 46/94/49 44/95/46 +f 39/92/42 44/89/46 37/96/39 +f 44/89/46 45/97/50 41/86/43 +f 42/90/47 48/98/51 40/91/44 +f 44/89/46 46/99/49 45/97/50 +f 38/100/40 47/101/52 42/102/47 +f 42/90/47 47/103/52 48/98/51 +f 45/97/50 50/104/53 851/105/54 +f 45/97/50 851/105/54 41/86/43 +f 41/86/43 851/105/54 47/106/52 +f 41/86/43 47/106/52 38/77/40 +f 40/87/44 48/107/51 49/108/55 +f 55/109/56 54/110/57 56/111/58 +f 125/112/59 57/113/60 58/114/61 +f 58/114/61 57/113/60 59/115/62 +f 51/4/3 60/116/63 52/117/64 +f 52/117/64 60/116/63 61/118/65 +f 53/119/66 52/117/64 62/120/67 +f 53/119/66 62/120/67 54/110/57 +f 56/111/58 63/121/68 125/112/59 +f 51/4/3 3/6/4 60/116/63 +f 52/117/64 61/118/65 62/120/67 +f 62/120/67 64/122/69 54/110/57 +f 54/110/57 64/122/69 56/111/58 +f 125/112/59 63/121/68 57/113/60 +f 60/116/63 68/123/70 61/118/65 +f 61/118/65 65/124/71 62/120/67 +f 62/120/67 65/124/71 64/122/69 +f 64/122/69 66/125/72 56/111/58 +f 56/111/58 66/125/72 63/121/68 +f 63/121/68 67/126/73 57/113/60 +f 3/6/4 68/123/70 60/116/63 +f 64/122/69 73/127/74 66/125/72 +f 63/121/68 66/125/72 69/128/75 +f 63/121/68 69/128/75 67/126/73 +f 3/6/4 4/7/5 71/129/76 +f 3/130/4 71/131/76 68/132/70 +f 68/123/70 71/131/76 72/133/77 +f 68/123/70 72/133/77 61/118/65 +f 61/118/65 72/133/77 65/124/71 +f 65/124/71 73/127/74 64/122/69 +f 4/7/5 5/8/6 71/129/76 +f 72/133/77 74/134/78 65/124/71 +f 65/124/71 74/134/78 75/135/79 +f 65/124/71 75/135/79 73/127/74 +f 73/127/74 76/136/80 66/125/72 +f 66/125/72 76/136/80 69/128/75 +f 67/126/73 69/128/75 70/137/81 +f 71/129/76 5/8/6 77/138/82 +f 71/131/76 77/139/82 78/140/83 +f 71/131/76 78/140/83 72/133/77 +f 72/133/77 78/140/83 74/134/78 +f 76/136/80 73/127/74 79/141/84 +f 69/128/75 76/136/80 80/142/85 +f 69/128/75 80/142/85 70/137/81 +f 78/140/83 77/138/82 81/143/86 +f 78/140/83 81/143/86 74/134/78 +f 74/134/78 82/144/87 75/135/79 +f 75/135/79 82/144/87 73/127/74 +f 73/127/74 82/144/87 79/141/84 +f 79/141/84 80/142/85 76/136/80 +f 5/8/6 8/11/9 77/138/82 +f 74/134/78 83/145/88 82/144/87 +f 82/144/87 83/145/88 79/141/84 +f 79/141/84 84/146/89 80/142/85 +f 8/11/9 85/147/90 77/138/82 +f 74/134/78 81/143/86 83/145/88 +f 79/141/84 86/148/91 84/146/89 +f 80/142/85 84/146/89 533/149/92 +f 77/138/82 85/147/90 81/143/86 +f 81/143/86 87/150/93 83/145/88 +f 83/145/88 88/151/94 79/141/84 +f 79/141/84 88/151/94 86/148/91 +f 84/146/89 86/148/91 533/149/92 +f 8/11/9 9/152/10 85/147/90 +f 85/147/90 9/152/10 89/153/95 +f 83/145/88 87/150/93 88/151/94 +f 85/147/90 89/153/95 90/154/96 +f 85/147/90 90/154/96 81/143/86 +f 81/143/86 90/154/96 87/150/93 +f 87/150/93 91/155/97 88/151/94 +f 90/154/96 93/156/98 87/150/93 +f 87/150/93 93/156/98 91/155/97 +f 86/157/91 492/158/99 530/159/100 +f 9/12/10 11/14/12 92/160/101 +f 9/12/10 92/160/101 89/153/95 +f 89/153/95 92/160/101 90/161/96 +f 91/162/97 94/163/102 88/164/94 +f 88/164/94 94/165/102 86/166/91 +f 86/166/91 94/165/102 492/158/99 +f 1/16/1 51/4/3 95/167/103 +f 95/167/103 96/168/104 136/169/105 +f 97/170/106 105/171/107 98/172/108 +f 98/173/108 105/171/107 99/174/109 +f 98/175/108 99/176/109 100/177/110 +f 102/178/111 107/179/112 103/180/113 +f 51/4/3 104/181/114 95/167/103 +f 96/168/104 95/167/103 105/171/107 +f 96/168/104 105/171/107 97/182/106 +f 99/183/109 106/184/115 100/185/110 +f 100/185/110 106/186/115 101/187/116 +f 101/187/116 107/179/112 102/178/111 +f 51/4/3 52/117/64 104/181/114 +f 95/167/103 104/181/114 108/188/117 +f 95/167/103 108/188/117 105/171/107 +f 99/174/109 105/171/107 106/186/115 +f 106/186/115 109/189/118 101/190/116 +f 104/181/114 110/191/119 108/188/117 +f 105/171/107 111/192/120 106/186/115 +f 106/186/115 111/192/120 109/189/118 +f 101/193/116 109/194/118 112/195/121 +f 101/193/116 112/195/121 107/196/112 +f 52/117/64 53/119/66 110/191/119 +f 52/117/64 110/191/119 104/181/114 +f 108/188/117 110/191/119 113/197/122 +f 108/188/117 113/197/122 114/198/123 +f 108/188/117 114/198/123 105/171/107 +f 105/171/107 114/198/123 111/192/120 +f 110/191/119 115/199/124 113/197/122 +f 114/198/123 116/200/125 111/192/120 +f 111/192/120 116/200/125 117/201/126 +f 111/192/120 117/201/126 109/189/118 +f 109/189/118 117/201/126 112/195/121 +f 110/191/119 53/119/66 119/202/127 +f 110/191/119 119/202/127 115/199/124 +f 113/197/122 116/200/125 114/198/123 +f 117/201/126 121/203/128 112/195/121 +f 53/119/66 54/110/57 119/202/127 +f 113/197/122 120/204/129 116/200/125 +f 121/203/128 118/205/130 112/195/121 +f 54/110/57 55/206/56 119/207/127 +f 119/202/127 55/109/56 115/199/124 +f 115/199/124 122/208/131 113/197/122 +f 113/197/122 122/208/131 120/204/129 +f 116/200/125 120/204/129 123/209/132 +f 116/200/125 123/209/132 117/201/126 +f 118/205/130 121/203/128 682/210/133 +f 55/109/56 126/211/134 115/199/124 +f 115/199/124 126/211/134 122/208/131 +f 122/208/131 124/212/135 120/204/129 +f 123/209/132 121/203/128 117/201/126 +f 56/213/58 125/214/59 55/215/56 +f 55/215/56 125/214/59 126/216/134 +f 121/203/128 123/209/132 127/217/136 +f 121/203/128 127/217/136 682/210/133 +f 122/208/131 126/211/134 128/218/137 +f 122/208/131 128/218/137 124/212/135 +f 120/204/129 129/219/138 123/209/132 +f 125/214/59 130/220/139 126/221/134 +f 126/211/134 130/220/139 128/218/137 +f 128/218/137 131/222/140 124/212/135 +f 124/212/135 131/222/140 120/204/129 +f 120/204/129 131/222/140 129/223/138 +f 129/219/138 132/224/141 123/209/132 +f 123/209/132 132/224/141 127/217/136 +f 125/112/59 58/114/61 130/220/139 +f 129/223/138 135/225/142 132/226/141 +f 132/224/141 133/227/143 127/217/136 +f 130/228/139 58/229/61 128/230/137 +f 129/223/138 131/222/140 135/231/142 +f 58/114/61 134/232/144 128/218/137 +f 131/222/140 128/218/137 626/233/145 +f 131/222/140 626/233/145 135/231/142 +f 132/224/141 135/231/142 133/227/143 +f 1/16/1 95/167/103 136/169/105 +f 1/16/1 136/169/105 13/234/14 +f 13/234/14 136/169/105 18/32/22 +f 21/33/23 18/32/22 137/235/146 +f 21/33/23 137/236/146 25/237/33 +f 25/61/33 138/238/147 34/239/34 +f 34/239/34 138/238/147 36/81/41 +f 25/61/33 137/240/146 138/241/147 +f 18/32/22 142/242/148 137/235/146 +f 137/240/146 139/243/149 138/241/147 +f 138/244/147 139/245/149 36/246/41 +f 39/92/42 36/246/41 140/247/150 +f 39/92/42 140/247/150 43/93/48 +f 43/93/48 140/247/150 834/248/151 +f 136/169/105 96/168/104 141/249/152 +f 136/169/105 141/249/152 18/32/22 +f 18/250/22 141/251/152 142/252/148 +f 96/168/104 97/182/106 141/249/152 +f 142/253/148 143/254/153 137/255/146 +f 137/240/146 143/254/153 139/243/149 +f 139/243/149 143/254/153 144/256/154 +f 139/245/149 144/257/154 145/258/155 +f 139/245/149 145/258/155 36/246/41 +f 36/246/41 145/258/155 140/259/150 +f 97/182/106 147/260/156 141/249/152 +f 140/259/150 145/258/155 148/261/157 +f 97/262/106 98/263/108 147/264/156 +f 147/260/156 98/175/108 141/249/152 +f 141/249/152 149/265/158 142/242/148 +f 142/266/148 149/267/158 143/268/153 +f 143/254/153 149/267/158 144/256/154 +f 144/257/154 148/269/157 145/258/155 +f 140/247/150 148/270/157 146/271/159 +f 98/175/108 150/272/160 141/249/152 +f 141/249/152 150/272/160 149/265/158 +f 144/257/154 151/273/161 148/269/157 +f 148/269/157 151/273/161 152/274/162 +f 148/275/157 152/274/162 896/276/163 +f 148/275/157 896/276/163 146/271/159 +f 98/175/108 153/277/164 150/272/160 +f 150/278/160 154/279/165 149/265/158 +f 149/267/158 154/280/165 155/281/166 +f 149/267/158 155/281/166 144/256/154 +f 144/257/154 155/282/166 151/273/161 +f 98/175/108 100/185/110 153/277/164 +f 155/282/166 156/283/167 151/273/161 +f 151/273/161 156/283/167 152/274/162 +f 152/274/162 157/284/168 896/276/163 +f 100/185/110 101/187/116 158/285/169 +f 100/286/110 158/287/169 153/288/164 +f 153/277/164 159/289/170 150/272/160 +f 150/278/160 159/290/170 154/279/165 +f 154/280/165 160/291/171 155/282/166 +f 155/282/166 160/292/171 161/293/172 +f 155/282/166 161/293/172 156/283/167 +f 152/274/162 156/283/167 157/284/168 +f 158/287/169 162/294/173 153/288/164 +f 154/280/165 159/290/170 160/291/171 +f 101/187/116 102/178/111 158/285/169 +f 153/277/164 162/295/173 159/296/170 +f 160/292/171 164/297/174 161/293/172 +f 161/293/172 164/297/174 156/283/167 +f 156/283/167 165/298/175 163/299/176 +f 156/283/167 163/299/176 157/284/168 +f 164/297/174 167/300/177 156/283/167 +f 156/283/167 167/300/177 165/298/175 +f 165/298/175 167/300/177 163/299/176 +f 102/301/111 103/180/113 158/287/169 +f 158/287/169 103/180/113 162/294/173 +f 159/302/170 162/294/173 168/303/178 +f 159/302/170 168/303/178 166/304/179 +f 159/302/170 166/304/179 160/292/171 +f 160/292/171 166/304/179 164/297/174 +f 103/180/113 168/303/178 162/294/173 +f 166/304/179 167/300/177 164/297/174 +f 167/305/177 780/306/180 169/307/181 +f 167/305/177 169/307/181 163/308/176 +f 170/309/182 171/310/183 172/311/184 +f 173/312/185 172/311/184 174/313/186 +f 173/312/185 174/313/186 175/314/187 +f 175/314/187 176/315/188 177/316/189 +f 176/315/188 178/317/190 253/318/191 +f 253/318/191 178/317/190 179/319/192 +f 175/314/187 180/320/193 176/315/188 +f 176/315/188 181/321/194 178/317/190 +f 178/317/190 182/322/195 179/319/192 +f 179/323/192 182/324/195 823/325/196 +f 172/311/184 183/326/197 174/313/186 +f 174/313/186 183/326/197 184/327/198 +f 176/315/188 180/320/193 181/321/194 +f 181/321/194 185/328/199 178/317/190 +f 178/317/190 185/328/199 182/322/195 +f 171/329/183 186/330/200 187/331/201 +f 171/329/183 187/331/201 172/311/184 +f 174/313/186 184/327/198 175/314/187 +f 175/314/187 184/327/198 180/320/193 +f 180/320/193 188/332/202 181/321/194 +f 181/321/194 188/332/202 185/328/199 +f 185/333/199 824/334/203 182/322/195 +f 186/330/200 192/335/204 187/331/201 +f 187/331/201 183/326/197 172/311/184 +f 184/327/198 183/326/197 193/336/205 +f 184/327/198 189/337/206 180/320/193 +f 180/320/193 189/337/206 188/332/202 +f 188/332/202 190/338/207 185/328/199 +f 185/339/199 190/340/207 191/341/208 +f 185/339/199 191/341/208 824/334/203 +f 192/342/204 195/343/209 187/331/201 +f 187/331/201 195/344/209 183/326/197 +f 184/327/198 193/336/205 189/337/206 +f 188/332/202 189/337/206 190/338/207 +f 192/345/204 194/346/210 195/347/209 +f 195/344/209 196/348/211 183/326/197 +f 183/326/197 196/348/211 193/336/205 +f 189/337/206 197/349/212 190/338/207 +f 190/338/207 197/349/212 191/350/208 +f 194/346/210 198/351/213 195/347/209 +f 196/348/211 199/352/214 193/336/205 +f 193/336/205 200/353/215 189/337/206 +f 195/354/209 201/355/216 196/356/211 +f 196/348/211 201/355/216 199/352/214 +f 189/337/206 200/357/215 197/349/212 +f 191/358/208 197/359/212 202/360/217 +f 198/351/213 203/361/218 201/362/216 +f 198/351/213 201/362/216 195/347/209 +f 199/352/214 201/355/216 204/363/219 +f 199/352/214 204/363/219 193/336/205 +f 193/336/205 204/363/219 200/364/215 +f 200/365/215 205/366/220 197/359/212 +f 201/355/216 206/367/221 204/363/219 +f 201/362/216 203/361/218 209/368/222 +f 201/355/216 209/368/222 206/367/221 +f 206/367/221 210/369/223 204/363/219 +f 204/363/219 208/370/224 200/364/215 +f 200/364/215 208/370/224 205/371/220 +f 197/359/212 205/366/220 211/372/225 +f 197/359/212 211/372/225 202/360/217 +f 203/361/218 207/373/226 209/374/222 +f 210/375/223 208/376/224 204/377/219 +f 205/366/220 208/378/224 211/372/225 +f 207/373/226 213/379/227 214/380/228 +f 207/373/226 214/380/228 209/374/222 +f 209/381/222 214/382/228 215/383/229 +f 209/368/222 215/384/229 206/367/221 +f 206/367/221 215/385/229 210/369/223 +f 208/386/224 210/369/223 216/387/230 +f 215/385/229 404/388/231 210/369/223 +f 211/372/225 208/378/224 212/389/232 +f 213/379/227 217/390/233 214/380/228 +f 214/391/228 218/392/234 397/393/235 +f 214/382/228 397/394/235 215/383/229 +f 216/395/230 412/396/236 208/378/224 +f 170/397/182 219/398/237 220/399/238 +f 220/400/238 219/401/237 221/402/239 +f 224/403/240 223/404/241 228/405/242 +f 224/403/240 228/405/242 225/406/243 +f 219/401/237 226/407/244 221/402/239 +f 221/402/239 226/408/244 222/409/245 +f 222/409/245 226/408/244 227/410/246 +f 222/411/245 228/405/242 223/404/241 +f 172/311/184 173/312/185 170/412/182 +f 170/412/182 173/312/185 219/413/237 +f 219/413/237 229/414/247 226/415/244 +f 222/411/245 227/416/246 230/417/248 +f 222/411/245 230/417/248 228/405/242 +f 173/312/185 231/418/249 219/413/237 +f 219/413/237 231/418/249 229/414/247 +f 226/415/244 232/419/250 227/416/246 +f 228/405/242 230/417/248 233/420/251 +f 228/405/242 233/420/251 234/421/252 +f 228/405/242 234/421/252 225/406/243 +f 229/414/247 231/418/249 237/422/253 +f 229/414/247 237/422/253 235/423/254 +f 229/414/247 235/423/254 226/415/244 +f 226/415/244 235/423/254 232/419/250 +f 227/416/246 232/419/250 236/424/255 +f 227/416/246 236/424/255 230/417/248 +f 173/312/185 175/314/187 237/422/253 +f 173/312/185 237/422/253 231/418/249 +f 235/425/254 238/426/256 232/427/250 +f 232/427/250 238/428/256 236/429/255 +f 236/424/255 233/420/251 230/417/248 +f 233/420/251 239/430/257 234/421/252 +f 235/431/254 240/432/258 238/433/256 +f 238/434/256 241/435/259 236/424/255 +f 236/424/255 241/435/259 233/420/251 +f 233/420/251 241/435/259 242/436/260 +f 233/420/251 242/436/260 239/430/257 +f 175/314/187 243/437/261 244/438/262 +f 175/314/187 244/438/262 237/422/253 +f 237/439/253 240/432/258 235/440/254 +f 238/434/256 245/441/263 241/435/259 +f 175/314/187 177/316/189 243/437/261 +f 237/439/253 244/442/262 240/432/258 +f 240/432/258 244/442/262 246/443/264 +f 240/432/258 246/444/264 238/433/256 +f 242/436/260 247/445/265 239/430/257 +f 177/316/189 176/315/188 243/437/261 +f 244/438/262 243/437/261 248/446/266 +f 244/442/262 248/447/266 246/443/264 +f 238/448/256 246/449/264 249/450/267 +f 238/448/256 249/450/267 245/451/263 +f 245/441/263 250/452/268 241/435/259 +f 241/435/259 250/452/268 242/436/260 +f 242/436/260 250/452/268 247/445/265 +f 248/446/266 251/453/269 246/454/264 +f 246/454/264 251/453/269 252/455/270 +f 246/454/264 252/455/270 249/456/267 +f 245/441/263 249/456/267 250/452/268 +f 176/315/188 253/318/191 243/437/261 +f 243/437/261 253/318/191 254/457/271 +f 243/437/261 254/457/271 248/458/266 +f 249/456/267 252/455/270 255/459/272 +f 249/456/267 255/459/272 250/452/268 +f 250/460/268 255/461/272 256/462/273 +f 250/452/268 256/463/273 247/445/265 +f 248/464/266 254/465/271 251/466/269 +f 253/318/191 179/319/192 257/467/274 +f 253/468/191 257/469/274 254/470/271 +f 254/471/271 257/467/274 258/472/275 +f 254/471/271 258/472/275 251/453/269 +f 251/453/269 258/472/275 259/473/276 +f 251/453/269 259/473/276 252/455/270 +f 252/455/270 259/473/276 255/459/272 +f 255/459/272 260/474/277 256/462/273 +f 255/459/272 259/473/276 260/474/277 +f 256/462/273 260/474/277 750/475/278 +f 179/319/192 823/476/196 901/477/279 +f 179/319/192 901/477/279 257/467/274 +f 257/467/274 901/477/279 905/478/280 +f 257/467/274 905/478/280 258/472/275 +f 258/472/275 261/479/281 259/473/276 +f 259/473/276 261/479/281 915/480/282 +f 259/473/276 915/480/282 922/481/283 +f 259/473/276 922/481/283 260/474/277 +f 265/482/284 264/483/285 266/484/286 +f 265/485/284 266/484/286 267/486/287 +f 265/485/284 267/486/287 268/487/288 +f 269/488/289 270/489/290 335/490/291 +f 170/397/182 220/399/238 262/491/292 +f 262/491/292 220/399/238 263/492/293 +f 262/491/292 263/492/293 264/493/285 +f 264/494/285 271/495/294 266/496/286 +f 335/490/291 270/489/290 541/497/295 +f 220/498/238 272/499/296 263/500/293 +f 264/494/285 263/501/293 271/495/294 +f 271/495/294 273/502/297 266/496/286 +f 266/496/286 273/502/297 267/503/287 +f 267/503/287 274/504/298 269/505/289 +f 269/505/289 274/504/298 270/506/290 +f 263/507/293 272/508/296 275/509/299 +f 263/501/293 276/510/300 271/495/294 +f 271/495/294 276/510/300 273/502/297 +f 267/503/287 273/502/297 274/504/298 +f 274/504/298 277/511/301 270/506/290 +f 270/489/290 277/512/301 541/497/295 +f 220/513/238 278/514/302 272/515/296 +f 263/516/293 275/517/299 276/518/300 +f 220/513/238 221/519/239 278/514/302 +f 276/520/300 279/521/303 273/522/297 +f 273/523/297 280/524/304 274/525/298 +f 274/526/298 280/527/304 277/528/301 +f 277/512/301 280/529/304 281/530/305 +f 278/514/302 221/519/239 282/531/306 +f 278/514/302 282/531/306 272/508/296 +f 272/532/296 282/533/306 283/534/307 +f 272/532/296 283/534/307 275/535/299 +f 275/535/299 283/536/307 276/537/300 +f 276/538/300 283/539/307 279/540/303 +f 273/541/297 279/542/303 280/527/304 +f 221/519/239 222/411/245 284/543/308 +f 221/519/239 284/543/308 282/531/306 +f 279/540/303 283/539/307 286/544/309 +f 279/542/303 286/545/309 280/527/304 +f 281/546/305 280/527/304 608/547/310 +f 222/411/245 223/404/241 284/543/308 +f 283/534/307 282/531/306 285/548/311 +f 283/539/307 285/548/311 286/544/309 +f 286/545/309 290/549/312 280/527/304 +f 280/527/304 287/550/313 608/547/310 +f 286/544/309 285/548/311 289/551/314 +f 286/545/309 289/552/314 290/549/312 +f 280/527/304 290/549/312 287/550/313 +f 223/404/241 291/553/315 284/543/308 +f 282/554/306 284/555/308 292/556/316 +f 282/554/306 292/556/316 285/548/311 +f 285/548/311 292/556/316 288/557/317 +f 285/548/311 288/557/317 289/551/314 +f 223/404/241 224/403/240 291/553/315 +f 291/558/315 292/556/316 284/555/308 +f 289/551/314 293/559/318 290/560/312 +f 290/560/312 294/561/319 287/562/313 +f 292/563/316 295/564/320 288/557/317 +f 288/557/317 295/564/320 289/551/314 +f 289/551/314 295/564/320 293/559/318 +f 224/403/240 296/565/321 297/566/322 +f 224/403/240 297/566/322 291/553/315 +f 291/558/315 300/567/323 298/568/324 +f 291/558/315 298/568/324 292/556/316 +f 292/556/316 298/568/324 299/569/325 +f 292/570/316 299/571/325 295/572/320 +f 290/560/312 293/559/318 294/561/319 +f 224/403/240 225/406/243 296/565/321 +f 291/553/315 297/566/322 300/573/323 +f 295/574/320 299/575/325 293/559/318 +f 294/561/319 293/559/318 606/576/326 +f 299/577/325 718/578/327 293/579/318 +f 293/559/318 301/580/328 606/576/326 +f 170/309/182 262/581/292 171/582/183 +f 203/361/218 198/351/213 207/373/226 +f 213/379/227 392/583/329 217/390/233 +f 186/584/200 306/585/330 192/345/204 +f 192/345/204 306/585/330 302/586/331 +f 192/345/204 302/586/331 194/346/210 +f 198/351/213 194/346/210 303/587/332 +f 198/351/213 303/587/332 207/373/226 +f 207/373/226 304/588/333 213/379/227 +f 213/379/227 304/588/333 392/583/329 +f 262/589/292 305/590/334 171/582/183 +f 171/591/183 305/592/334 306/585/330 +f 171/593/183 306/585/330 186/584/200 +f 194/346/210 302/586/331 303/587/332 +f 207/373/226 303/587/332 307/594/335 +f 207/373/226 307/594/335 304/588/333 +f 262/491/292 264/483/285 309/595/336 +f 262/491/292 309/595/336 305/596/334 +f 302/586/331 310/597/337 303/587/332 +f 303/587/332 310/597/337 311/598/338 +f 303/587/332 311/598/338 307/594/335 +f 264/483/285 265/482/284 309/595/336 +f 309/599/336 312/600/339 305/592/334 +f 305/592/334 312/600/339 306/585/330 +f 306/601/330 312/602/339 313/603/340 +f 306/604/330 313/605/340 319/606/341 +f 306/604/330 319/606/341 302/586/331 +f 302/586/331 319/606/341 314/607/342 +f 302/586/331 314/607/342 310/597/337 +f 311/598/338 315/608/343 307/594/335 +f 307/594/335 315/608/343 316/609/344 +f 307/594/335 316/609/344 304/588/333 +f 304/588/333 316/609/344 308/610/345 +f 319/606/341 317/611/346 314/607/342 +f 314/607/342 317/611/346 310/597/337 +f 312/602/339 321/612/347 318/613/348 +f 312/602/339 318/613/348 313/614/340 +f 313/605/340 318/615/348 319/606/341 +f 310/597/337 317/611/346 320/616/349 +f 310/597/337 320/616/349 311/598/338 +f 311/598/338 320/616/349 315/608/343 +f 265/617/284 321/618/347 309/595/336 +f 309/619/336 321/612/347 312/600/339 +f 319/606/341 322/620/350 317/611/346 +f 317/611/346 325/621/351 320/616/349 +f 315/622/343 320/616/349 323/623/352 +f 315/608/343 323/623/352 316/609/344 +f 265/624/284 268/625/288 321/626/347 +f 319/627/341 318/628/348 322/629/350 +f 322/620/350 324/630/353 325/621/351 +f 322/620/350 325/621/351 317/611/346 +f 268/487/288 326/631/354 321/632/347 +f 321/612/347 326/633/354 318/613/348 +f 318/615/348 327/634/355 328/635/356 +f 318/615/348 328/635/356 322/620/350 +f 322/620/350 328/635/356 324/630/353 +f 325/621/351 324/630/353 329/636/357 +f 320/637/349 461/638/358 323/623/352 +f 323/623/352 461/638/358 460/639/359 +f 268/487/288 331/640/360 326/631/354 +f 318/615/348 326/641/354 327/634/355 +f 325/621/351 329/636/357 330/642/361 +f 325/621/351 330/642/361 320/637/349 +f 320/637/349 330/642/361 461/638/358 +f 268/487/288 267/643/287 331/640/360 +f 326/631/354 331/640/360 332/644/362 +f 326/641/354 332/645/362 333/646/363 +f 326/641/354 333/646/363 327/634/355 +f 328/635/356 327/634/355 334/647/364 +f 328/635/356 334/647/364 324/630/353 +f 324/630/353 334/647/364 329/636/357 +f 267/643/287 269/488/289 335/490/291 +f 267/643/287 335/490/291 331/640/360 +f 329/636/357 334/647/364 336/648/365 +f 329/636/357 336/648/365 330/642/361 +f 331/640/360 335/490/291 337/649/366 +f 331/650/360 337/649/366 332/651/362 +f 332/644/362 337/649/366 333/652/363 +f 327/634/355 333/646/363 338/653/367 +f 327/634/355 338/653/367 334/647/364 +f 335/490/291 341/654/368 337/649/366 +f 337/649/366 339/655/369 333/652/363 +f 334/647/364 340/656/370 569/657/371 +f 334/647/364 569/657/371 336/648/365 +f 336/648/365 462/658/372 330/642/361 +f 335/490/291 541/497/295 341/654/368 +f 339/659/369 342/660/373 333/646/363 +f 333/646/363 342/660/373 338/653/367 +f 334/647/364 338/653/367 340/656/370 +f 336/648/365 569/657/371 462/658/372 +f 344/661/374 345/662/375 346/663/376 +f 346/664/376 347/665/377 348/666/378 +f 348/666/378 347/665/377 349/667/379 +f 348/666/378 349/667/379 350/668/380 +f 350/668/380 351/669/381 416/670/382 +f 343/671/383 352/672/384 344/673/374 +f 346/664/376 345/674/375 347/665/377 +f 347/665/377 353/675/385 349/667/379 +f 352/672/384 354/676/386 344/673/374 +f 345/674/375 355/677/387 347/665/377 +f 349/667/379 353/675/385 356/678/388 +f 349/667/379 356/678/388 350/668/380 +f 350/668/380 357/679/389 351/669/381 +f 354/676/386 359/680/390 344/673/374 +f 344/673/374 359/680/390 360/681/391 +f 344/673/374 360/681/391 345/674/375 +f 345/674/375 360/681/391 355/677/387 +f 350/668/380 356/678/388 357/679/389 +f 354/676/386 364/682/392 359/680/390 +f 358/683/393 361/684/394 364/682/392 +f 358/683/393 364/682/392 354/676/386 +f 347/665/377 355/677/387 362/685/395 +f 347/665/377 362/685/395 353/675/385 +f 353/675/385 366/686/396 356/678/388 +f 356/678/388 366/686/396 363/687/397 +f 356/678/388 363/687/397 357/679/389 +f 357/679/389 363/687/397 862/688/398 +f 364/682/392 368/689/399 359/680/390 +f 359/680/390 368/689/399 360/681/391 +f 355/677/387 360/681/391 365/690/400 +f 355/677/387 365/690/400 362/685/395 +f 362/685/395 366/686/396 353/675/385 +f 364/682/392 367/691/401 368/689/399 +f 368/689/399 369/692/402 360/681/391 +f 360/681/391 369/692/402 365/690/400 +f 361/684/394 370/693/403 371/694/404 +f 361/684/394 371/694/404 364/682/392 +f 364/682/392 371/694/404 367/691/401 +f 367/691/401 372/695/405 368/689/399 +f 368/689/399 373/696/406 369/692/402 +f 366/686/396 362/685/395 374/697/407 +f 366/686/396 374/697/407 363/687/397 +f 372/695/405 373/696/406 368/689/399 +f 369/692/402 373/696/406 375/698/408 +f 369/692/402 375/698/408 365/690/400 +f 362/685/395 365/690/400 374/697/407 +f 363/687/397 374/697/407 861/699/409 +f 371/694/404 370/693/403 376/700/410 +f 371/694/404 376/700/410 367/691/401 +f 367/691/401 376/700/410 372/695/405 +f 372/695/405 376/700/410 373/696/406 +f 365/690/400 375/698/408 377/701/411 +f 365/690/400 377/701/411 374/697/407 +f 370/693/403 378/702/412 376/700/410 +f 375/698/408 379/88/45 377/701/411 +f 376/700/410 380/28/20 381/51/27 +f 376/700/410 381/51/27 373/696/406 +f 373/696/406 381/51/27 382/703/413 +f 373/696/406 382/703/413 375/698/408 +f 375/698/408 382/703/413 379/88/45 +f 378/702/412 12/15/13 380/28/20 +f 378/702/412 380/28/20 376/700/410 +f 382/703/413 381/51/27 33/69/37 +f 382/703/413 33/69/37 379/88/45 +f 380/28/20 17/27/19 381/51/27 +f 381/51/27 27/54/29 33/69/37 +f 379/88/45 49/108/55 377/701/411 +f 379/88/45 40/87/44 49/108/55 +f 383/704/414 384/705/415 385/706/416 +f 385/706/416 386/707/417 387/708/418 +f 387/708/418 386/707/417 388/709/419 +f 388/709/419 386/707/417 389/710/420 +f 388/711/419 389/712/420 390/713/421 +f 388/711/419 390/713/421 391/714/422 +f 391/714/422 390/713/421 392/583/329 +f 392/583/329 390/713/421 218/715/234 +f 392/583/329 218/715/234 217/390/233 +f 343/716/383 344/717/374 393/718/423 +f 343/719/383 393/718/423 383/704/414 +f 383/704/414 393/718/423 394/720/424 +f 383/721/414 394/722/424 384/723/415 +f 385/724/416 384/725/415 395/726/425 +f 385/724/416 395/727/425 386/728/417 +f 389/712/420 396/729/426 390/713/421 +f 218/715/234 214/380/228 217/390/233 +f 386/707/417 395/726/425 389/730/420 +f 390/713/421 397/731/235 218/715/234 +f 344/661/374 346/664/376 393/718/423 +f 384/732/415 394/720/424 398/733/427 +f 384/732/415 398/733/427 395/726/425 +f 395/726/425 399/734/428 389/730/420 +f 390/735/421 396/736/426 397/394/235 +f 393/718/423 346/664/376 400/737/429 +f 393/718/423 400/737/429 394/720/424 +f 394/720/424 400/737/429 398/733/427 +f 398/733/427 401/738/430 395/726/425 +f 395/726/425 401/738/430 399/734/428 +f 389/730/420 399/734/428 402/739/431 +f 389/730/420 402/739/431 396/736/426 +f 400/737/429 403/740/432 398/733/427 +f 402/741/431 399/742/428 406/743/433 +f 396/736/426 402/741/431 404/388/231 +f 396/736/426 404/388/231 397/394/235 +f 397/394/235 404/388/231 215/744/229 +f 398/745/427 403/740/432 405/746/434 +f 398/745/427 405/746/434 401/747/430 +f 401/738/430 405/748/434 399/734/428 +f 402/741/431 406/743/433 404/749/231 +f 346/664/376 348/666/378 400/737/429 +f 399/734/428 405/748/434 407/750/435 +f 399/734/428 407/750/435 406/751/433 +f 404/388/231 406/752/433 210/369/223 +f 348/666/378 408/753/436 400/737/429 +f 400/737/429 408/753/436 409/754/437 +f 400/737/429 409/754/437 403/740/432 +f 405/748/434 410/755/438 407/750/435 +f 406/752/433 216/395/230 210/369/223 +f 403/756/432 409/757/437 411/758/439 +f 403/759/432 411/760/439 405/748/434 +f 405/748/434 411/760/439 410/755/438 +f 407/761/435 412/762/236 406/751/433 +f 348/666/378 350/668/380 408/753/436 +f 411/760/439 413/763/440 410/755/438 +f 410/755/438 414/764/441 407/750/435 +f 407/761/435 414/765/441 412/762/236 +f 406/766/433 412/396/236 216/395/230 +f 408/767/436 350/768/380 415/769/442 +f 408/753/436 415/770/442 409/754/437 +f 350/771/380 416/772/382 415/773/442 +f 409/754/437 415/770/442 417/774/443 +f 409/754/437 417/774/443 411/760/439 +f 411/760/439 417/774/443 413/763/440 +f 410/755/438 413/763/440 418/775/444 +f 410/755/438 418/775/444 414/764/441 +f 413/763/440 417/774/443 418/775/444 +f 414/764/441 419/776/445 412/396/236 +f 418/775/444 420/777/446 414/764/441 +f 412/396/236 419/776/445 212/389/232 +f 412/396/236 212/389/232 208/378/224 +f 416/778/382 794/779/447 415/773/442 +f 415/770/442 811/780/448 417/774/443 +f 417/774/443 811/780/448 421/781/449 +f 417/774/443 421/781/449 418/775/444 +f 418/775/444 421/781/449 420/777/446 +f 414/782/441 420/777/446 419/776/445 +f 422/783/450 423/784/451 468/785/452 +f 468/786/452 423/787/451 424/788/453 +f 432/789/454 426/790/455 427/791/456 +f 428/792/457 427/791/456 429/793/458 +f 343/719/383 430/794/459 422/783/450 +f 422/783/450 430/794/459 423/784/451 +f 424/788/453 423/787/451 431/795/460 +f 424/788/453 431/795/460 425/796/461 +f 425/796/461 431/795/460 432/789/454 +f 432/789/454 436/797/462 426/790/455 +f 427/791/456 426/790/455 433/798/463 +f 427/791/456 433/798/463 429/793/458 +f 429/793/458 433/798/463 567/799/464 +f 430/794/459 434/800/465 423/784/451 +f 423/787/451 434/800/465 435/801/466 +f 423/787/451 435/801/466 431/795/460 +f 432/789/454 431/795/460 436/797/462 +f 383/704/414 385/706/416 437/802/467 +f 383/704/414 437/802/467 343/719/383 +f 343/719/383 437/802/467 430/794/459 +f 431/795/460 435/801/466 438/803/468 +f 431/795/460 438/803/468 436/797/462 +f 436/797/462 439/804/469 426/790/455 +f 426/790/455 439/804/469 433/798/463 +f 430/805/459 437/806/467 434/800/465 +f 434/807/465 437/808/467 440/809/470 +f 434/800/465 440/809/470 441/810/471 +f 434/800/465 441/810/471 435/801/466 +f 436/797/462 443/811/472 439/804/469 +f 433/798/463 439/804/469 442/812/473 +f 433/798/463 442/812/473 567/799/464 +f 385/706/416 387/708/418 437/802/467 +f 435/801/466 441/810/471 438/803/468 +f 438/803/468 443/811/472 436/797/462 +f 443/811/472 444/813/474 439/804/469 +f 437/814/467 445/815/475 440/809/470 +f 440/809/470 446/816/476 441/810/471 +f 439/804/469 444/813/474 442/812/473 +f 437/817/467 387/818/418 445/815/475 +f 440/809/470 445/815/475 446/816/476 +f 446/816/476 447/819/477 441/810/471 +f 441/810/471 447/819/477 438/803/468 +f 438/803/468 455/820/478 448/821/479 +f 438/803/468 448/821/479 443/811/472 +f 444/813/474 443/811/472 449/822/480 +f 444/813/474 570/823/481 442/812/473 +f 388/711/419 452/824/482 387/825/418 +f 387/826/418 452/827/482 450/828/483 +f 387/826/418 450/829/483 445/830/475 +f 445/815/475 450/831/483 451/832/484 +f 445/815/475 451/832/484 446/816/476 +f 438/803/468 447/819/477 455/820/478 +f 444/813/474 449/822/480 570/823/481 +f 443/811/472 448/821/479 456/833/485 +f 443/811/472 456/833/485 449/822/480 +f 449/822/480 456/833/485 453/834/486 +f 452/827/482 454/835/487 450/828/483 +f 450/831/483 454/836/487 451/832/484 +f 451/832/484 457/837/488 446/816/476 +f 446/816/476 457/837/488 447/819/477 +f 448/821/479 455/820/478 456/833/485 +f 388/711/419 391/714/422 452/824/482 +f 451/832/484 454/836/487 457/837/488 +f 457/837/488 458/838/489 447/819/477 +f 447/819/477 458/838/489 455/820/478 +f 452/824/482 391/714/422 459/839/490 +f 452/824/482 459/839/490 454/836/487 +f 454/836/487 459/839/490 457/837/488 +f 391/714/422 392/583/329 459/839/490 +f 459/839/490 392/583/329 308/610/345 +f 459/839/490 460/840/359 457/837/488 +f 457/841/488 460/842/359 458/843/489 +f 458/838/489 460/639/359 461/638/358 +f 458/838/489 461/638/358 455/820/478 +f 455/820/478 461/638/358 462/658/372 +f 455/820/478 462/658/372 456/833/485 +f 456/833/485 462/658/372 453/834/486 +f 459/839/490 308/610/345 316/609/344 +f 459/839/490 316/609/344 460/840/359 +f 461/638/358 330/642/361 462/658/372 +f 392/583/329 304/588/333 308/610/345 +f 316/609/344 323/844/352 460/845/359 +f 354/676/386 352/672/384 358/683/393 +f 370/693/403 465/846/491 378/702/412 +f 378/702/412 11/14/12 12/15/13 +f 343/847/383 422/848/450 352/849/384 +f 358/683/393 352/672/384 467/850/492 +f 358/683/393 467/850/492 463/851/493 +f 358/683/393 463/851/493 361/684/394 +f 361/684/394 463/851/493 464/852/494 +f 361/684/394 464/852/494 370/693/403 +f 370/853/403 464/854/494 465/855/491 +f 465/846/491 466/856/495 378/702/412 +f 422/857/450 467/858/492 352/859/384 +f 11/14/12 378/702/412 92/160/101 +f 422/783/450 468/785/452 467/850/492 +f 467/850/492 469/860/496 463/851/493 +f 463/851/493 471/861/497 464/852/494 +f 465/846/491 464/852/494 466/856/495 +f 466/856/495 92/160/101 378/702/412 +f 467/850/492 468/785/452 470/862/498 +f 467/850/492 470/862/498 469/860/496 +f 463/851/493 469/860/496 471/861/497 +f 464/852/494 472/863/499 466/856/495 +f 92/160/101 466/856/495 90/161/96 +f 468/864/452 473/865/500 470/866/498 +f 471/861/497 474/867/501 464/852/494 +f 464/852/494 474/867/501 472/863/499 +f 466/856/495 472/863/499 90/161/96 +f 468/864/452 424/788/453 473/865/500 +f 470/862/498 474/867/501 469/860/496 +f 469/860/496 474/867/501 471/861/497 +f 474/867/501 475/868/502 472/863/499 +f 472/869/499 93/156/98 90/154/96 +f 473/865/500 476/870/503 470/871/498 +f 474/872/501 477/873/504 475/874/502 +f 472/869/499 475/868/502 93/156/98 +f 470/862/498 476/875/503 478/876/505 +f 470/862/498 478/876/505 474/867/501 +f 474/872/501 478/877/505 479/878/506 +f 474/872/501 479/878/506 477/873/504 +f 475/868/502 477/879/504 91/155/97 +f 475/868/502 91/155/97 93/156/98 +f 425/796/461 432/789/454 480/880/507 +f 425/796/461 481/881/508 424/788/453 +f 424/788/453 481/881/508 473/865/500 +f 476/882/503 473/865/500 482/883/509 +f 476/884/503 482/885/509 478/877/505 +f 479/878/506 483/886/510 477/873/504 +f 432/789/454 427/791/456 480/880/507 +f 425/796/461 480/880/507 481/881/508 +f 481/881/508 482/883/509 473/865/500 +f 483/886/510 94/887/102 477/888/504 +f 477/879/504 94/889/102 91/155/97 +f 481/881/508 480/880/507 482/883/509 +f 479/878/506 478/877/505 484/890/511 +f 479/878/506 484/890/511 483/886/510 +f 427/791/456 428/792/457 480/880/507 +f 480/880/507 428/792/457 485/891/512 +f 480/880/507 485/891/512 482/883/509 +f 482/892/509 486/893/513 478/877/505 +f 478/877/505 486/893/513 487/894/514 +f 478/877/505 487/894/514 484/890/511 +f 428/792/457 488/895/515 485/891/512 +f 485/896/512 489/897/516 482/892/509 +f 482/892/509 489/897/516 486/893/513 +f 428/792/457 429/793/458 490/898/517 +f 489/897/516 491/899/518 486/893/513 +f 487/900/514 492/901/99 484/890/511 +f 484/890/511 492/158/99 483/886/510 +f 483/902/510 492/158/99 94/903/102 +f 428/792/457 490/898/517 488/895/515 +f 488/895/515 511/904/519 485/891/512 +f 485/896/512 511/905/519 489/897/516 +f 489/897/516 518/906/520 491/899/518 +f 486/893/513 491/899/518 487/894/514 +f 493/907/521 494/908/522 495/909/523 +f 557/910/524 497/911/525 498/912/526 +f 499/913/527 490/898/517 429/793/458 +f 571/914/528 500/915/529 493/907/521 +f 494/908/522 501/916/530 495/909/523 +f 495/909/523 501/916/530 496/917/531 +f 497/911/525 502/918/532 498/912/526 +f 498/912/526 502/918/532 503/919/533 +f 498/912/526 503/919/533 499/920/527 +f 499/913/527 503/921/533 490/898/517 +f 500/922/529 507/923/534 493/924/521 +f 493/925/521 507/926/534 494/927/522 +f 496/917/531 501/916/530 504/928/535 +f 496/917/531 504/928/535 497/911/525 +f 497/911/525 504/928/535 502/918/532 +f 502/918/532 505/929/536 503/919/533 +f 500/930/529 506/931/537 507/932/534 +f 494/933/522 507/926/534 508/934/538 +f 494/935/522 508/936/538 501/937/530 +f 501/916/530 509/938/539 504/928/535 +f 490/898/517 503/921/533 488/895/515 +f 502/939/532 504/928/535 510/940/540 +f 502/939/532 510/940/540 505/941/536 +f 505/929/536 510/942/540 511/905/519 +f 505/929/536 511/905/519 503/919/533 +f 503/921/533 511/904/519 488/895/515 +f 506/943/537 512/944/541 507/945/534 +f 501/916/530 508/946/538 509/938/539 +f 509/938/539 513/947/542 504/928/535 +f 506/943/537 514/948/543 512/944/541 +f 512/944/541 515/949/544 507/945/534 +f 507/945/534 515/949/544 508/946/538 +f 508/946/538 515/949/544 516/950/545 +f 508/946/538 513/947/542 509/938/539 +f 513/947/542 517/951/546 504/928/535 +f 504/928/535 517/951/546 510/942/540 +f 510/942/540 518/906/520 511/905/519 +f 511/905/519 518/906/520 489/897/516 +f 514/948/543 519/952/547 512/944/541 +f 512/944/541 520/953/548 515/949/544 +f 513/947/542 508/946/538 521/954/549 +f 510/942/540 517/951/546 518/906/520 +f 515/949/544 520/953/548 516/950/545 +f 516/950/545 521/954/549 508/946/538 +f 513/947/542 521/954/549 517/951/546 +f 519/952/547 522/955/550 512/944/541 +f 512/944/541 522/955/550 520/953/548 +f 521/954/549 524/956/551 517/951/546 +f 517/957/546 524/958/551 518/959/520 +f 519/952/547 523/960/552 522/955/550 +f 521/961/549 528/962/553 524/963/551 +f 518/906/520 524/956/551 487/964/514 +f 518/906/520 487/964/514 491/899/518 +f 523/965/552 526/966/554 522/967/550 +f 522/968/550 526/969/554 527/970/555 +f 522/955/550 527/971/555 520/953/548 +f 520/953/548 527/971/555 516/950/545 +f 516/950/545 527/971/555 528/972/553 +f 516/950/545 528/972/553 521/954/549 +f 523/960/552 525/973/556 526/974/554 +f 526/974/554 529/975/557 527/971/555 +f 528/972/553 534/976/558 524/956/551 +f 524/956/551 534/976/558 530/977/100 +f 524/956/551 530/977/100 487/978/514 +f 487/979/514 530/159/100 492/980/99 +f 525/973/556 532/981/559 526/974/554 +f 526/974/554 532/981/559 529/975/557 +f 527/971/555 533/149/92 528/972/553 +f 528/972/553 533/149/92 534/976/558 +f 531/982/560 532/981/559 525/973/556 +f 532/981/559 67/126/73 529/975/557 +f 529/975/557 67/126/73 70/137/81 +f 529/975/557 80/142/85 527/971/555 +f 527/971/555 80/142/85 533/149/92 +f 531/982/560 59/115/62 532/981/559 +f 532/981/559 59/115/62 57/113/60 +f 532/981/559 57/113/60 67/126/73 +f 529/975/557 70/137/81 80/142/85 +f 533/149/92 86/148/91 534/976/558 +f 534/976/558 86/148/91 530/977/100 +f 535/983/561 542/984/562 536/985/563 +f 537/986/564 543/987/565 538/988/566 +f 541/989/295 540/990/567 341/991/368 +f 493/907/521 542/984/562 535/983/561 +f 536/992/563 542/993/562 543/994/565 +f 536/992/563 543/994/565 537/995/564 +f 543/994/565 546/996/568 538/997/566 +f 538/997/566 544/998/569 539/999/570 +f 539/999/570 544/998/569 540/1000/567 +f 493/907/521 495/909/523 542/984/562 +f 542/993/562 545/1001/571 543/994/565 +f 546/996/568 544/998/569 538/997/566 +f 540/1000/567 544/998/569 547/1002/572 +f 540/1000/567 547/1002/572 341/654/368 +f 545/1001/571 548/1003/573 543/994/565 +f 543/994/565 548/1003/573 546/996/568 +f 547/1002/572 339/1004/369 341/654/368 +f 495/909/523 553/1005/574 542/984/562 +f 542/993/562 553/1006/574 549/1007/575 +f 542/993/562 549/1007/575 545/1001/571 +f 545/1001/571 549/1007/575 548/1003/573 +f 546/996/568 548/1003/573 550/1008/576 +f 546/996/568 550/1008/576 544/998/569 +f 544/998/569 551/1009/577 547/1002/572 +f 339/1004/369 337/649/366 341/654/368 +f 495/909/523 496/917/531 552/1010/578 +f 495/909/523 552/1010/578 553/1005/574 +f 549/1007/575 554/1011/579 548/1003/573 +f 548/1012/573 554/1013/579 550/1014/576 +f 544/998/569 550/1008/576 556/1015/580 +f 544/1016/569 556/1015/580 551/1017/577 +f 547/1002/572 551/1009/577 339/1004/369 +f 549/1018/575 553/1019/574 555/1020/581 +f 549/1021/575 555/1020/581 554/1013/579 +f 551/1017/577 342/660/373 339/659/369 +f 496/917/531 497/1022/525 557/1023/524 +f 496/917/531 557/1023/524 552/1024/578 +f 552/1024/578 558/1025/582 553/1019/574 +f 554/1013/579 559/1026/583 550/1014/576 +f 550/1014/576 559/1026/583 556/1015/580 +f 552/1024/578 557/1023/524 558/1025/582 +f 558/1025/582 560/1027/584 553/1019/574 +f 553/1019/574 560/1027/584 555/1020/581 +f 554/1013/579 555/1020/581 559/1026/583 +f 559/1026/583 561/1028/585 556/1015/580 +f 342/660/373 551/1017/577 338/653/367 +f 555/1020/581 564/1029/586 562/1030/587 +f 555/1020/581 562/1030/587 559/1026/583 +f 559/1026/583 562/1030/587 561/1028/585 +f 556/1015/580 561/1028/585 340/656/370 +f 556/1015/580 340/656/370 551/1017/577 +f 551/1017/577 340/656/370 338/653/367 +f 557/1023/524 498/1031/526 563/1032/588 +f 557/1023/524 563/1032/588 558/1025/582 +f 558/1025/582 563/1032/588 560/1027/584 +f 560/1027/584 564/1029/586 555/1020/581 +f 498/1031/526 565/1033/589 563/1032/588 +f 562/1030/587 566/1034/590 561/1028/585 +f 498/1031/526 499/913/527 565/1033/589 +f 565/1033/589 567/799/464 563/1032/588 +f 560/1027/584 563/1032/588 568/1035/591 +f 560/1027/584 568/1035/591 564/1029/586 +f 564/1029/586 568/1035/591 562/1030/587 +f 566/1034/590 569/657/371 561/1028/585 +f 561/1028/585 569/657/371 340/656/370 +f 565/1033/589 499/913/527 567/799/464 +f 563/1032/588 567/799/464 442/812/473 +f 563/1032/588 442/812/473 568/1035/591 +f 568/1035/591 442/812/473 570/823/481 +f 568/1035/591 570/823/481 562/1030/587 +f 562/1030/587 570/823/481 566/1034/590 +f 566/1034/590 453/834/486 569/657/371 +f 499/913/527 429/793/458 567/799/464 +f 570/823/481 449/822/480 453/834/486 +f 570/823/481 453/834/486 566/1034/590 +f 569/657/371 453/834/486 462/658/372 +f 493/907/521 535/983/561 571/1036/528 +f 572/1037/592 573/1038/593 574/1039/594 +f 574/1040/594 575/1041/595 576/1042/596 +f 576/1043/596 575/1044/595 577/1045/597 +f 576/1043/596 577/1046/597 578/1047/598 +f 578/1048/598 577/1046/597 579/1049/599 +f 580/1050/600 579/1049/599 581/1051/601 +f 571/1052/528 535/1053/561 584/1054/602 +f 571/1055/528 584/1056/602 572/1057/592 +f 575/1058/595 585/1059/603 582/1060/604 +f 575/1058/595 582/1060/604 577/1061/597 +f 577/1046/597 587/1062/605 579/1049/599 +f 579/1049/599 583/1063/606 581/1064/601 +f 535/983/561 536/985/563 584/1065/602 +f 572/1066/592 584/1056/602 573/1038/593 +f 573/1038/593 585/1067/603 574/1039/594 +f 574/1068/594 585/1067/603 575/1069/595 +f 582/1070/604 587/1071/605 577/1072/597 +f 579/1049/599 587/1062/605 583/1063/606 +f 584/1056/602 586/1073/607 573/1038/593 +f 582/1074/604 585/1075/603 587/1076/605 +f 536/1077/563 589/1078/608 584/1056/602 +f 584/1056/602 589/1078/608 586/1073/607 +f 587/1062/605 588/1079/609 583/1063/606 +f 536/1080/563 537/1081/564 589/1082/608 +f 589/1083/608 590/1084/610 586/1085/607 +f 573/1038/593 591/1086/611 585/1075/603 +f 585/1075/603 591/1087/611 587/1076/605 +f 587/1088/605 591/1087/611 588/1079/609 +f 588/1079/609 592/1089/612 583/1063/606 +f 586/1090/607 590/1091/610 573/1092/593 +f 573/1038/593 590/1093/610 591/1086/611 +f 591/1087/611 593/1094/613 588/1079/609 +f 589/1095/608 537/1096/564 595/1097/614 +f 589/1095/608 595/1097/614 590/1091/610 +f 590/1098/610 596/1099/615 594/1100/616 +f 590/1101/610 594/1102/616 591/1087/611 +f 591/1087/611 594/1102/616 593/1094/613 +f 588/1079/609 593/1094/613 592/1089/612 +f 537/1103/564 538/997/566 539/1104/570 +f 537/1105/564 539/999/570 595/1106/614 +f 595/1097/614 596/1107/615 590/1091/610 +f 596/1108/615 597/1109/617 594/1102/616 +f 594/1102/616 598/1110/618 593/1094/613 +f 593/1094/613 599/1111/619 592/1089/612 +f 539/999/570 600/1112/620 595/1113/614 +f 595/1097/614 601/1114/621 596/1107/615 +f 596/1108/615 601/1114/621 602/1115/622 +f 596/1108/615 602/1115/622 603/1116/623 +f 596/1108/615 603/1116/623 597/1109/617 +f 594/1102/616 597/1117/617 598/1110/618 +f 593/1118/613 598/1110/618 599/1119/619 +f 539/999/570 540/990/567 600/1120/620 +f 600/1121/620 604/1122/624 595/1123/614 +f 595/1097/614 604/1124/624 601/1125/621 +f 601/1114/621 604/1122/624 602/1115/622 +f 603/1126/623 605/1127/625 597/1128/617 +f 597/1117/617 605/1129/625 598/1110/618 +f 598/1110/618 605/1129/625 606/576/326 +f 598/1110/618 606/576/326 599/1111/619 +f 599/1111/619 606/576/326 720/1130/626 +f 540/990/567 541/989/295 600/1120/620 +f 600/1120/620 541/989/295 607/1131/627 +f 600/1121/620 607/1132/627 604/1122/624 +f 604/1122/624 608/1133/310 602/1115/622 +f 602/1115/622 608/1134/310 603/1135/623 +f 606/576/326 721/1136/628 720/1130/626 +f 604/1122/624 607/1132/627 281/546/305 +f 604/1122/624 281/546/305 608/1133/310 +f 607/1132/627 277/512/301 281/546/305 +f 608/547/310 287/550/313 603/1126/623 +f 603/1126/623 287/550/313 605/1137/625 +f 605/1129/625 287/562/313 606/576/326 +f 606/576/326 301/580/328 721/1136/628 +f 607/1132/627 541/497/295 277/512/301 +f 287/562/313 294/561/319 606/576/326 +f 514/948/543 609/1138/629 519/952/547 +f 519/952/547 609/1138/629 523/960/552 +f 531/982/560 58/114/61 59/115/62 +f 571/1139/528 610/1140/630 500/1141/529 +f 514/948/543 611/1142/631 609/1138/629 +f 531/982/560 134/232/144 58/114/61 +f 571/1143/528 572/1144/592 610/1145/630 +f 500/1146/529 610/1147/630 612/1148/632 +f 500/1146/529 612/1149/632 506/1150/537 +f 506/943/537 612/1151/632 611/1142/631 +f 506/943/537 611/1142/631 514/948/543 +f 609/1138/629 611/1142/631 613/1152/633 +f 609/1138/629 613/1152/633 523/960/552 +f 523/960/552 613/1152/633 614/1153/634 +f 523/960/552 614/1153/634 525/973/556 +f 525/973/556 614/1153/634 531/982/560 +f 531/982/560 614/1153/634 134/232/144 +f 572/1144/592 574/1154/594 610/1145/630 +f 610/1145/630 574/1154/594 615/1155/635 +f 610/1147/630 618/1156/636 612/1148/632 +f 611/1142/631 612/1151/632 616/1157/637 +f 611/1142/631 616/1157/637 613/1152/633 +f 613/1152/633 617/1158/638 614/1153/634 +f 615/1159/635 618/1156/636 610/1147/630 +f 616/1160/637 619/1161/639 613/1162/633 +f 612/1151/632 620/1163/640 616/1157/637 +f 613/1152/633 619/1164/639 617/1158/638 +f 614/1153/634 626/233/145 134/232/144 +f 134/232/144 626/233/145 128/218/137 +f 574/1165/594 621/1166/641 615/1167/635 +f 615/1159/635 621/1168/641 622/1169/642 +f 615/1159/635 622/1169/642 618/1156/636 +f 618/1156/636 622/1169/642 612/1151/632 +f 612/1151/632 622/1169/642 620/1170/640 +f 620/1163/640 623/1171/643 616/1157/637 +f 616/1157/637 623/1171/643 619/1164/639 +f 619/1164/639 624/1172/644 617/1158/638 +f 617/1158/638 624/1172/644 614/1153/634 +f 574/1165/594 576/1173/596 621/1166/641 +f 621/1168/641 576/1174/596 622/1169/642 +f 619/1164/639 623/1171/643 625/1175/645 +f 619/1164/639 625/1175/645 624/1172/644 +f 624/1172/644 626/233/145 614/1153/634 +f 576/1174/596 627/1176/646 628/1177/647 +f 576/1174/596 628/1177/647 622/1169/642 +f 620/1170/640 629/1178/648 623/1171/643 +f 624/1172/644 631/1179/649 626/233/145 +f 576/1043/596 578/1047/598 627/1180/646 +f 628/1177/647 630/1181/650 622/1169/642 +f 620/1170/640 622/1169/642 629/1178/648 +f 623/1171/643 629/1178/648 625/1175/645 +f 625/1175/645 629/1178/648 631/1179/649 +f 625/1175/645 631/1179/649 624/1172/644 +f 627/1176/646 632/1182/651 628/1177/647 +f 622/1169/642 630/1181/650 629/1178/648 +f 629/1178/648 630/1181/650 633/1183/652 +f 629/1178/648 633/1183/652 631/1179/649 +f 631/1179/649 135/231/142 626/233/145 +f 632/1182/651 630/1181/650 628/1177/647 +f 630/1181/650 635/1184/653 633/1183/652 +f 578/1048/598 579/1049/599 580/1050/600 +f 578/1048/598 580/1050/600 636/1185/654 +f 578/1048/598 636/1185/654 627/1180/646 +f 627/1176/646 636/1186/654 632/1182/651 +f 630/1187/650 632/1188/651 634/1189/655 +f 630/1181/650 634/1190/655 635/1184/653 +f 631/1179/649 133/227/143 135/231/142 +f 636/1186/654 637/1191/656 632/1182/651 +f 634/1192/655 638/1193/657 635/1194/653 +f 633/1183/652 635/1184/653 631/1179/649 +f 631/1179/649 635/1184/653 133/227/143 +f 636/1186/654 640/1195/658 637/1191/656 +f 632/1182/651 637/1191/656 634/1196/655 +f 634/1196/655 637/1191/656 638/1197/657 +f 580/1050/600 581/1051/601 639/1198/659 +f 580/1050/600 639/1198/659 640/1199/658 +f 580/1050/600 640/1199/658 636/1185/654 +f 637/1191/656 640/1195/658 641/1200/660 +f 637/1191/656 641/1200/660 642/1201/661 +f 637/1191/656 642/1201/661 638/1197/657 +f 638/1197/657 643/1202/662 635/1184/653 +f 635/1184/653 643/1202/662 133/227/143 +f 644/1203/663 645/1204/664 646/1205/665 +f 644/1203/663 646/1205/665 647/1206/666 +f 647/1207/666 648/1208/667 649/1209/668 +f 647/1207/666 649/1209/668 650/1210/669 +f 650/1211/669 649/1212/668 651/1213/670 +f 651/1214/670 652/1215/671 704/1216/672 +f 704/1216/672 652/1215/671 653/1217/673 +f 653/1218/673 654/1219/674 655/1220/675 +f 647/1206/666 646/1205/665 648/1208/667 +f 652/1221/671 654/1219/674 653/1222/673 +f 646/1205/665 657/1223/676 648/1208/667 +f 648/1224/667 658/1225/677 649/1226/668 +f 651/1213/670 649/1226/668 659/1227/678 +f 651/1228/670 659/1229/678 652/1221/671 +f 654/1219/674 660/1230/679 655/1220/675 +f 655/1220/675 660/1230/679 640/1199/658 +f 655/1220/675 640/1199/658 639/1198/659 +f 658/1225/677 661/1231/680 649/1226/668 +f 649/1232/668 661/1233/680 659/1227/678 +f 659/1229/678 662/1234/681 652/1221/671 +f 654/1219/674 652/1221/671 662/1234/681 +f 656/1235/682 663/1236/683 646/1205/665 +f 646/1205/665 663/1236/683 665/1237/684 +f 646/1205/665 665/1237/684 657/1223/676 +f 657/1223/676 658/1225/677 648/1224/667 +f 658/1238/677 664/1239/685 661/1240/680 +f 662/1234/681 660/1230/679 654/1219/674 +f 660/1230/679 641/1241/660 640/1199/658 +f 658/1242/677 657/1243/676 668/1244/686 +f 658/1245/677 668/1246/686 664/1247/685 +f 659/1248/678 666/1249/687 662/1250/681 +f 662/1251/681 667/1252/688 660/1253/679 +f 660/1253/679 667/1252/688 641/1200/660 +f 657/1243/676 665/1254/684 668/1244/686 +f 662/1234/681 666/1249/687 667/1255/688 +f 667/1252/688 642/1201/661 641/1200/660 +f 668/1246/686 670/1256/689 664/1247/685 +f 659/1248/678 661/1233/680 666/1249/687 +f 666/1257/687 671/1258/690 667/1252/688 +f 667/1252/688 671/1258/690 642/1201/661 +f 665/1259/684 669/1260/691 672/1261/692 +f 665/1262/684 672/1263/692 673/1264/693 +f 665/1262/684 673/1265/693 668/1266/686 +f 668/1246/686 673/1265/693 670/1256/689 +f 664/1247/685 674/1267/694 661/1233/680 +f 661/1233/680 674/1267/694 666/1249/687 +f 666/1268/687 674/1269/694 671/1258/690 +f 671/1258/690 638/1197/657 642/1201/661 +f 664/1270/685 670/1271/689 676/1272/695 +f 664/1247/685 676/1273/695 674/1267/694 +f 675/1274/696 677/1275/697 669/1260/691 +f 669/1260/691 677/1275/697 672/1261/692 +f 673/1276/693 676/1272/695 670/1271/689 +f 674/1267/694 676/1273/695 678/1277/698 +f 674/1269/694 678/1278/698 643/1202/662 +f 674/1269/694 643/1202/662 671/1258/690 +f 671/1258/690 643/1202/662 638/1197/657 +f 677/1279/697 680/1280/699 672/1281/692 +f 672/1281/692 680/1282/699 681/1283/700 +f 672/1281/692 681/1283/700 673/1276/693 +f 673/1276/693 681/1283/700 676/1272/695 +f 679/1284/701 684/1285/702 677/1275/697 +f 681/1286/700 682/1287/133 676/1273/695 +f 676/1273/695 682/1287/133 678/1277/698 +f 678/1278/698 682/210/133 683/1288/703 +f 684/1289/702 107/179/112 677/1279/697 +f 677/1279/697 107/179/112 685/1290/704 +f 677/1279/697 685/1290/704 680/1280/699 +f 680/1291/699 685/1292/704 118/1293/130 +f 680/1291/699 118/1293/130 681/1286/700 +f 681/1286/700 118/1293/130 682/1287/133 +f 678/1278/698 683/1288/703 643/1202/662 +f 643/1202/662 683/1288/703 133/227/143 +f 684/1289/702 103/180/113 107/179/112 +f 685/1292/704 107/196/112 112/195/121 +f 685/1292/704 112/195/121 118/1293/130 +f 682/210/133 127/217/136 683/1288/703 +f 683/1288/703 127/217/136 133/227/143 +f 687/1294/705 688/1295/706 689/1296/707 +f 690/1297/708 689/1298/707 691/1299/709 +f 693/1300/710 694/1301/711 695/1302/712 +f 695/1303/712 694/1304/711 296/565/321 +f 644/1203/663 647/1206/666 686/1305/713 +f 644/1203/663 686/1305/713 688/1306/706 +f 644/1203/663 688/1306/706 687/1307/705 +f 693/1300/710 692/1308/714 694/1309/711 +f 694/1304/711 297/566/322 296/565/321 +f 686/1305/713 696/1310/715 688/1306/706 +f 688/1295/706 697/1311/716 689/1312/707 +f 689/1313/707 697/1314/716 691/1315/709 +f 647/1206/666 698/1316/717 686/1305/713 +f 686/1305/713 698/1316/717 696/1310/715 +f 697/1314/716 699/1317/718 691/1315/709 +f 691/1318/709 700/1319/719 692/1308/714 +f 692/1308/714 701/1320/720 694/1309/711 +f 694/1309/711 701/1320/720 702/1321/721 +f 694/1309/711 702/1321/721 297/1322/322 +f 297/1322/322 702/1321/721 300/573/323 +f 691/1318/709 699/1323/718 703/1324/722 +f 691/1318/709 703/1324/722 700/1319/719 +f 692/1308/714 700/1319/719 701/1320/720 +f 650/1325/669 704/1326/672 647/1327/666 +f 647/1206/666 704/1328/672 698/1316/717 +f 698/1329/717 705/1330/723 696/1331/715 +f 696/1331/715 705/1330/723 688/1295/706 +f 688/1295/706 705/1330/723 706/1332/724 +f 688/1295/706 706/1332/724 697/1311/716 +f 701/1320/720 700/1319/719 702/1321/721 +f 702/1321/721 700/1319/719 298/568/324 +f 702/1321/721 298/568/324 300/573/323 +f 705/1330/723 707/1333/725 706/1332/724 +f 697/1311/716 706/1332/724 699/1323/718 +f 650/1211/669 651/1214/670 704/1216/672 +f 704/1334/672 708/1335/726 698/1329/717 +f 698/1329/717 708/1335/726 705/1330/723 +f 699/1323/718 706/1332/724 709/1336/727 +f 699/1323/718 709/1336/727 703/1324/722 +f 703/1324/722 709/1336/727 710/1337/728 +f 703/1324/722 710/1337/728 700/1319/719 +f 700/1319/719 710/1337/728 299/569/325 +f 700/1319/719 299/569/325 298/568/324 +f 704/1334/672 711/1338/729 708/1335/726 +f 705/1330/723 708/1335/726 707/1333/725 +f 706/1332/724 707/1333/725 712/1339/730 +f 706/1332/724 712/1339/730 709/1336/727 +f 709/1336/727 712/1339/730 713/1340/731 +f 709/1336/727 713/1340/731 710/1337/728 +f 704/1216/672 653/1217/673 711/1341/729 +f 708/1335/726 714/1342/732 707/1333/725 +f 707/1333/725 714/1342/732 712/1339/730 +f 711/1343/729 715/1344/733 708/1335/726 +f 708/1335/726 715/1344/733 714/1342/732 +f 714/1342/732 715/1344/733 716/1345/734 +f 710/1337/728 718/1346/327 299/569/325 +f 653/1217/673 717/1347/735 711/1341/729 +f 711/1343/729 717/1348/735 715/1344/733 +f 713/1340/731 718/1346/327 710/1337/728 +f 653/1218/673 655/1220/675 717/1349/735 +f 715/1344/733 719/1350/736 716/1345/734 +f 714/1342/732 716/1345/734 720/1130/626 +f 714/1342/732 720/1130/626 712/1339/730 +f 712/1339/730 720/1130/626 713/1340/731 +f 713/1351/731 720/1352/626 721/1136/628 +f 713/1340/731 721/1136/628 718/1346/327 +f 715/1344/733 717/1348/735 719/1350/736 +f 718/1346/327 721/1136/628 301/580/328 +f 718/1346/327 301/580/328 293/559/318 +f 655/1220/675 639/1198/659 717/1349/735 +f 717/1348/735 592/1089/612 719/1350/736 +f 716/1345/734 599/1111/619 720/1130/626 +f 639/1198/659 581/1051/601 717/1349/735 +f 717/1353/735 581/1051/601 583/1063/606 +f 717/1348/735 583/1063/606 592/1089/612 +f 719/1350/736 592/1089/612 716/1345/734 +f 716/1345/734 592/1089/612 599/1111/619 +f 725/1354/737 724/1355/738 726/1356/739 +f 728/1357/740 729/1358/741 730/1359/742 +f 723/1360/743 731/1361/744 724/1355/738 +f 727/1362/745 732/1363/746 728/1357/740 +f 728/1357/740 732/1363/746 729/1358/741 +f 722/1364/747 644/1203/663 687/1307/705 +f 722/1364/747 687/1307/705 723/1360/743 +f 731/1361/744 733/1365/748 724/1355/738 +f 724/1355/738 733/1365/748 726/1356/739 +f 726/1356/739 733/1365/748 734/1366/749 +f 726/1356/739 734/1366/749 727/1362/745 +f 727/1362/745 734/1366/749 732/1363/746 +f 732/1363/746 735/1367/750 729/1358/741 +f 687/1307/705 736/1368/751 723/1360/743 +f 723/1360/743 736/1368/751 731/1361/744 +f 733/1369/748 737/1370/752 734/1371/749 +f 732/1363/746 734/1372/749 735/1367/750 +f 729/1358/741 735/1367/750 730/1359/742 +f 687/1307/705 738/1373/753 736/1368/751 +f 731/1361/744 736/1368/751 739/1374/754 +f 731/1361/744 739/1374/754 733/1365/748 +f 735/1367/750 740/1375/755 730/1359/742 +f 687/1307/705 689/1376/707 738/1373/753 +f 733/1369/748 739/1377/754 737/1370/752 +f 738/1373/753 689/1376/707 741/1378/756 +f 738/1373/753 741/1378/756 736/1368/751 +f 739/1374/754 736/1368/751 742/1379/757 +f 737/1380/752 743/1381/758 734/1382/749 +f 734/1382/749 743/1381/758 735/1383/750 +f 689/1376/707 690/1297/708 741/1378/756 +f 741/1384/756 744/1385/759 736/1386/751 +f 736/1368/751 744/1387/759 742/1388/757 +f 739/1389/754 742/1379/757 745/1390/760 +f 739/1389/754 745/1391/760 737/1392/752 +f 737/1393/752 745/1391/760 743/1394/758 +f 743/1395/758 746/1396/761 735/1397/750 +f 735/1398/750 746/1399/761 747/1400/762 +f 735/1398/750 747/1400/762 740/1375/755 +f 690/1297/708 748/1401/763 741/1378/756 +f 741/1378/756 748/1401/763 744/1402/759 +f 691/1318/709 692/1308/714 690/1403/708 +f 744/1402/759 749/1404/764 742/1388/757 +f 742/1405/757 749/1406/764 752/1407/765 +f 742/1408/757 752/1409/765 745/1410/760 +f 745/1410/760 750/475/278 743/1411/758 +f 743/1411/758 751/1412/766 746/1413/761 +f 692/1308/714 693/1300/710 690/1403/708 +f 690/1297/708 693/1414/710 748/1401/763 +f 748/1415/763 753/1416/767 744/1402/759 +f 744/1402/759 754/1417/768 749/1404/764 +f 749/1418/764 754/1419/768 752/1420/765 +f 745/1410/760 752/1409/765 750/475/278 +f 743/1411/758 750/475/278 751/1412/766 +f 746/1413/761 751/1412/766 755/1421/769 +f 746/1413/761 755/1421/769 747/1422/762 +f 693/1423/710 695/1303/712 753/1416/767 +f 693/1423/710 753/1416/767 748/1415/763 +f 753/1416/767 754/1417/768 744/1402/759 +f 751/1412/766 750/475/278 755/1421/769 +f 753/1416/767 234/421/252 754/1417/768 +f 754/1424/768 756/1425/770 752/1420/765 +f 752/1409/765 756/1425/770 750/475/278 +f 753/1416/767 695/1303/712 234/421/252 +f 754/1424/768 239/430/257 756/1425/770 +f 750/475/278 260/474/277 755/1421/769 +f 695/1303/712 296/565/321 225/406/243 +f 234/421/252 239/430/257 754/1417/768 +f 239/430/257 247/445/265 756/1425/770 +f 756/1425/770 247/445/265 750/475/278 +f 695/1303/712 225/406/243 234/421/252 +f 247/445/265 256/463/273 750/475/278 +f 644/1203/663 722/1364/747 645/1204/664 +f 646/1205/665 645/1204/664 656/1235/682 +f 665/1259/684 663/1236/683 757/1426/771 +f 665/1259/684 757/1426/771 669/1260/691 +f 677/1275/697 675/1274/696 679/1284/701 +f 722/1364/747 723/1360/743 645/1204/664 +f 656/1235/682 758/1427/772 663/1236/683 +f 663/1236/683 758/1427/772 759/1428/773 +f 669/1260/691 757/1426/771 675/1274/696 +f 679/1284/701 168/303/178 684/1429/702 +f 663/1236/683 759/1428/773 757/1426/771 +f 675/1274/696 757/1426/771 760/1430/774 +f 675/1274/696 760/1430/774 679/1284/701 +f 684/1429/702 168/303/178 103/180/113 +f 723/1360/743 724/1355/738 761/1431/775 +f 723/1360/743 761/1431/775 645/1204/664 +f 645/1204/664 761/1431/775 656/1235/682 +f 656/1235/682 761/1431/775 758/1432/772 +f 757/1426/771 763/1433/776 760/1430/774 +f 679/1284/701 760/1430/774 168/303/178 +f 761/1431/775 762/1434/777 758/1432/772 +f 758/1432/772 762/1434/777 767/1435/778 +f 758/1432/772 767/1435/778 759/1428/773 +f 759/1428/773 767/1435/778 763/1433/776 +f 759/1428/773 763/1433/776 757/1426/771 +f 763/1433/776 764/1436/779 760/1430/774 +f 760/1430/774 764/1436/779 765/1437/780 +f 760/1430/774 765/1437/780 168/303/178 +f 761/1431/775 766/1438/781 762/1434/777 +f 762/1439/777 766/1440/781 767/1441/778 +f 763/1433/776 767/1435/778 764/1436/779 +f 724/1355/738 725/1354/737 761/1431/775 +f 767/1442/778 768/1443/782 769/1444/783 +f 767/1445/778 769/1446/783 764/1447/779 +f 765/1437/780 166/304/179 168/303/178 +f 761/1431/775 772/1448/784 766/1449/781 +f 766/1449/781 770/1450/785 767/1451/778 +f 764/1436/779 769/1444/783 771/1452/786 +f 764/1436/779 771/1452/786 765/1437/780 +f 725/1354/737 772/1448/784 761/1431/775 +f 767/1442/778 770/1453/785 768/1443/782 +f 765/1437/780 771/1452/786 166/304/179 +f 726/1356/739 774/1454/787 725/1354/737 +f 725/1354/737 774/1454/787 772/1448/784 +f 766/1449/781 772/1455/784 770/1450/785 +f 768/1443/782 773/1456/788 769/1444/783 +f 769/1444/783 773/1456/788 777/1457/789 +f 769/1444/783 777/1457/789 771/1452/786 +f 771/1452/786 167/300/177 166/304/179 +f 726/1356/739 727/1362/745 774/1454/787 +f 774/1454/787 775/1458/790 772/1448/784 +f 772/1459/784 776/1460/791 770/1453/785 +f 775/1458/790 778/1461/792 772/1459/784 +f 772/1459/784 778/1461/792 776/1460/791 +f 770/1453/785 779/1462/793 768/1443/782 +f 768/1443/782 779/1462/793 773/1456/788 +f 777/1457/789 780/1463/180 771/1452/786 +f 771/1452/786 780/1463/180 167/300/177 +f 727/1362/745 728/1357/740 781/1464/794 +f 727/1362/745 781/1464/794 774/1454/787 +f 774/1454/787 781/1464/794 775/1458/790 +f 770/1453/785 776/1460/791 779/1462/793 +f 773/1456/788 779/1462/793 782/1465/795 +f 773/1456/788 782/1465/795 777/1457/789 +f 777/1457/789 782/1465/795 780/1463/180 +f 776/1460/791 778/1461/792 783/1466/796 +f 779/1462/793 776/1460/791 784/1467/797 +f 780/306/180 782/1465/795 169/307/181 +f 775/1458/790 781/1464/794 785/1468/798 +f 775/1458/790 785/1468/798 778/1461/792 +f 776/1460/791 783/1466/796 784/1467/797 +f 728/1357/740 786/1469/799 781/1464/794 +f 781/1464/794 786/1469/799 785/1468/798 +f 778/1461/792 785/1468/798 783/1466/796 +f 779/1462/793 784/1467/797 782/1465/795 +f 787/1470/800 788/1471/801 789/1472/802 +f 787/1470/800 789/1472/802 790/1473/803 +f 790/1473/803 789/1474/802 791/1475/804 +f 791/1475/804 789/1474/802 792/1476/805 +f 793/1477/806 794/1478/447 795/1479/807 +f 795/1479/807 794/1478/447 796/1480/808 +f 789/1472/802 797/1481/809 792/1482/805 +f 792/1483/805 798/1484/810 793/1477/806 +f 796/1480/808 794/1478/447 416/670/382 +f 787/1485/800 799/1486/811 788/1471/801 +f 788/1471/801 802/1487/812 789/1472/802 +f 797/1488/809 798/1484/810 792/1483/805 +f 793/1477/806 798/1484/810 800/1489/813 +f 793/1477/806 800/1489/813 794/1478/447 +f 794/1478/447 800/1489/813 804/1490/814 +f 799/1486/811 802/1491/812 788/1471/801 +f 802/1487/812 803/1492/815 789/1472/802 +f 789/1472/802 803/1492/815 797/1493/809 +f 794/779/447 804/1494/814 415/773/442 +f 799/1486/811 801/1495/816 805/1496/817 +f 799/1486/811 805/1496/817 802/1491/812 +f 798/1497/810 806/1498/818 800/1499/813 +f 805/1500/817 809/1501/819 802/1502/812 +f 803/1503/815 807/1504/820 797/1488/809 +f 797/1488/809 807/1504/820 798/1484/810 +f 798/1484/810 807/1504/820 806/1505/818 +f 800/1489/813 806/1506/818 804/1490/814 +f 804/1494/814 811/1507/448 415/773/442 +f 801/1508/816 808/1509/821 809/1501/819 +f 801/1508/816 809/1501/819 805/1500/817 +f 802/1510/812 810/1511/822 803/1492/815 +f 806/1506/818 811/780/448 804/1490/814 +f 808/1512/821 812/1513/823 813/1514/824 +f 808/1512/821 813/1514/824 814/1515/825 +f 808/1512/821 814/1515/825 809/1516/819 +f 809/1516/819 814/1515/825 815/1517/826 +f 809/1516/819 815/1517/826 802/1518/812 +f 802/1519/812 815/1520/826 810/1521/822 +f 803/1492/815 810/1511/822 807/1522/820 +f 807/1504/820 816/1523/827 806/1505/818 +f 806/1506/818 816/1524/827 811/780/448 +f 807/1522/820 810/1511/822 816/1525/827 +f 816/1524/827 421/781/449 811/780/448 +f 810/1511/822 815/1517/826 817/1526/828 +f 810/1511/822 817/1526/828 816/1525/827 +f 812/1527/823 818/1528/829 813/1529/824 +f 813/1529/824 818/1528/829 819/1530/830 +f 816/1525/827 817/1526/828 822/1531/831 +f 816/1524/827 420/777/446 421/781/449 +f 813/1529/824 819/1530/830 814/1532/825 +f 814/1533/825 820/1534/832 815/1517/826 +f 815/1517/826 820/1534/832 821/1535/833 +f 815/1517/826 821/1535/833 817/1526/828 +f 817/1526/828 821/1535/833 822/1536/831 +f 816/1537/827 822/1538/831 420/1539/446 +f 818/1528/829 823/1540/196 819/1530/830 +f 814/1533/825 819/1541/830 820/1534/832 +f 820/1542/832 825/1543/834 821/1544/833 +f 823/1540/196 182/1545/195 819/1530/830 +f 819/1546/830 182/1545/195 824/1547/203 +f 819/1548/830 824/1549/203 820/1534/832 +f 820/1542/832 824/334/203 825/1550/834 +f 821/1551/833 202/1552/217 822/1536/831 +f 822/1536/831 419/776/445 420/777/446 +f 825/1553/834 202/1554/217 821/1555/833 +f 822/1536/831 202/1552/217 212/389/232 +f 822/1536/831 212/389/232 419/776/445 +f 824/334/203 191/341/208 825/1556/834 +f 825/1553/834 191/1557/208 202/1554/217 +f 202/1537/217 211/1558/225 212/1559/232 +f 826/1560/835 787/1561/800 827/1562/836 +f 826/1560/835 827/1563/836 828/1564/837 +f 828/1565/837 827/1566/836 829/1567/838 +f 829/1568/838 827/1569/836 830/1570/839 +f 832/1571/840 836/1572/841 833/1573/842 +f 833/1573/842 836/1572/841 834/248/151 +f 834/248/151 46/1574/49 43/93/48 +f 787/1575/800 790/1576/803 827/1577/836 +f 831/1578/843 836/1572/841 832/1571/840 +f 834/248/151 836/1572/841 46/1574/49 +f 827/1579/836 790/1473/803 835/1580/844 +f 827/1579/836 835/1581/844 837/1582/845 +f 827/1579/836 837/1582/845 830/1583/839 +f 830/1583/839 837/1582/845 831/1578/843 +f 831/1578/843 837/1582/845 838/1584/846 +f 831/1578/843 838/1584/846 836/1572/841 +f 836/1585/841 839/1586/847 46/99/49 +f 790/1473/803 840/1587/848 835/1580/844 +f 837/1582/845 835/1581/844 842/1588/849 +f 838/1589/846 841/1590/850 836/1572/841 +f 836/1591/841 841/1592/850 839/1593/847 +f 790/1473/803 791/1475/804 840/1587/848 +f 839/1594/847 841/1595/850 45/1596/50 +f 839/1597/847 45/1596/50 46/99/49 +f 840/1598/848 791/1599/804 843/1600/851 +f 840/1598/848 843/1600/851 835/1581/844 +f 842/1588/849 844/1601/852 837/1602/845 +f 837/1582/845 844/1603/852 838/1584/846 +f 838/1589/846 844/1604/852 845/1605/853 +f 838/1589/846 845/1606/853 841/1607/850 +f 841/1608/850 50/1609/53 45/97/50 +f 791/1475/804 792/1476/805 846/1610/854 +f 791/1611/804 848/1612/855 843/1613/851 +f 835/1581/844 843/1600/851 847/1614/856 +f 835/1581/844 847/1614/856 842/1588/849 +f 842/1588/849 847/1614/856 844/1601/852 +f 846/1615/854 848/1616/855 791/1617/804 +f 843/1600/851 848/1616/855 849/1618/857 +f 843/1600/851 849/1618/857 847/1614/856 +f 841/1619/850 845/1620/853 50/1621/53 +f 792/1483/805 793/1622/806 846/1610/854 +f 847/1614/856 853/1623/858 844/1601/852 +f 844/1601/852 853/1623/858 850/1624/859 +f 844/1601/852 850/1624/859 845/1625/853 +f 845/1625/853 850/1624/859 851/105/54 +f 845/1625/853 851/105/54 50/1626/53 +f 846/1615/854 793/1477/806 852/1627/860 +f 846/1615/854 852/1627/860 848/1616/855 +f 848/1616/855 852/1627/860 849/1618/857 +f 849/1618/857 855/1628/861 847/1614/856 +f 847/1614/856 855/1628/861 853/1623/858 +f 850/1629/859 854/1630/862 851/1631/54 +f 849/1618/857 852/1627/860 855/1628/861 +f 850/1624/859 853/1623/858 854/1632/862 +f 793/1477/806 795/1479/807 856/1633/863 +f 793/1477/806 856/1633/863 852/1627/860 +f 852/1627/860 856/1633/863 857/1634/864 +f 852/1627/860 857/1634/864 855/1628/861 +f 855/1628/861 858/1635/865 853/1623/858 +f 853/1623/858 858/1635/865 859/1636/866 +f 851/1637/54 854/1638/862 47/1639/52 +f 795/1479/807 860/1640/867 856/1633/863 +f 855/1628/861 857/1634/864 858/1635/865 +f 853/1623/858 859/1636/866 854/1632/862 +f 854/1632/862 859/1636/866 48/107/51 +f 854/1632/862 48/107/51 47/1641/52 +f 795/1479/807 796/1480/808 860/1640/867 +f 856/1633/863 860/1640/867 857/1634/864 +f 857/1634/864 862/688/398 861/699/409 +f 857/1634/864 861/699/409 858/1635/865 +f 858/1635/865 861/699/409 859/1636/866 +f 859/1636/866 49/108/55 48/107/51 +f 796/1480/808 351/669/381 860/1640/867 +f 860/1640/867 862/688/398 857/1634/864 +f 859/1636/866 377/701/411 49/108/55 +f 796/1480/808 416/670/382 351/669/381 +f 351/669/381 357/679/389 860/1640/867 +f 860/1640/867 357/679/389 862/688/398 +f 862/688/398 363/687/397 861/699/409 +f 861/699/409 374/697/407 859/1636/866 +f 859/1636/866 374/697/407 377/701/411 +f 787/1561/800 826/1642/835 863/1643/868 +f 863/1644/868 864/1645/869 865/1646/870 +f 865/1647/870 864/1648/869 866/1649/871 +f 866/1650/871 867/1651/872 868/1652/873 +f 869/1653/874 870/1654/875 871/1655/876 +f 871/1655/876 728/1357/740 730/1359/742 +f 826/1656/835 872/1657/877 863/1644/868 +f 863/1644/868 872/1657/877 864/1645/869 +f 866/1650/871 864/1658/869 867/1651/872 +f 867/1651/872 864/1658/869 874/1659/878 +f 868/1652/873 867/1651/872 873/1660/879 +f 868/1652/873 873/1660/879 869/1653/874 +f 869/1653/874 873/1660/879 870/1654/875 +f 871/1655/876 786/1469/799 728/1357/740 +f 826/1656/835 828/1661/837 872/1657/877 +f 874/1659/878 875/1662/880 867/1651/872 +f 867/1651/872 875/1662/880 873/1660/879 +f 872/1663/877 828/1664/837 876/1665/881 +f 872/1663/877 876/1665/881 877/1666/882 +f 872/1663/877 877/1667/882 864/1668/869 +f 864/1669/869 877/1667/882 874/1659/878 +f 871/1655/876 870/1654/875 879/1670/883 +f 871/1655/876 879/1670/883 785/1468/798 +f 871/1655/876 785/1468/798 786/1469/799 +f 874/1659/878 877/1667/882 878/1671/884 +f 874/1659/878 878/1671/884 875/1662/880 +f 873/1672/879 882/1673/885 870/1654/875 +f 870/1654/875 882/1673/885 879/1674/883 +f 828/1565/837 829/1567/838 880/1675/886 +f 828/1565/837 880/1675/886 876/1676/881 +f 876/1676/881 881/1677/887 877/1667/882 +f 877/1667/882 881/1677/887 878/1671/884 +f 878/1678/884 884/1679/888 875/1680/880 +f 875/1681/880 884/1682/888 882/1683/885 +f 875/1681/880 882/1683/885 873/1672/879 +f 879/1670/883 783/1466/796 785/1468/798 +f 880/1684/886 883/1685/889 876/1686/881 +f 876/1676/881 883/1687/889 881/1677/887 +f 881/1688/887 884/1689/888 878/1690/884 +f 882/1691/885 885/1692/890 879/1670/883 +f 879/1670/883 885/1692/890 783/1466/796 +f 829/1567/838 830/1583/839 880/1675/886 +f 881/1693/887 883/1694/889 886/1695/891 +f 881/1696/887 886/1695/891 884/1689/888 +f 884/1697/888 890/1698/892 882/1691/885 +f 882/1691/885 890/1698/892 887/1699/893 +f 882/1691/885 887/1699/893 885/1692/890 +f 830/1583/839 831/1578/843 888/1700/894 +f 830/1583/839 888/1700/894 880/1675/886 +f 880/1701/886 888/1702/894 889/1703/895 +f 880/1701/886 889/1703/895 883/1694/889 +f 883/1694/889 889/1703/895 886/1704/891 +f 884/1697/888 886/1704/891 890/1705/892 +f 831/1578/843 832/1571/840 888/1700/894 +f 885/1692/890 887/1699/893 783/1466/796 +f 783/1466/796 887/1699/893 784/1467/797 +f 889/1706/895 888/1700/894 892/1707/896 +f 889/1706/895 892/1707/896 893/1708/897 +f 889/1706/895 893/1708/897 886/1704/891 +f 886/1704/891 893/1708/897 891/1709/898 +f 886/1704/891 891/1709/898 890/1705/892 +f 890/1698/892 891/1709/898 887/1699/893 +f 832/1710/840 894/1711/899 888/1712/894 +f 888/1700/894 894/1713/899 892/1707/896 +f 891/1709/898 895/1714/900 887/1699/893 +f 887/1699/893 782/1465/795 784/1467/797 +f 892/1707/896 894/1713/899 896/276/163 +f 892/1707/896 896/276/163 897/1715/901 +f 892/1707/896 897/1715/901 893/1708/897 +f 893/1708/897 897/1715/901 891/1709/898 +f 891/1709/898 897/1715/901 895/1714/900 +f 887/1699/893 895/1714/900 782/1465/795 +f 833/1573/842 834/248/151 832/1571/840 +f 895/1714/900 169/1716/181 782/1465/795 +f 832/1571/840 834/248/151 894/1713/899 +f 894/1717/899 146/1718/159 896/1719/163 +f 897/1715/901 896/276/163 157/284/168 +f 897/1715/901 157/284/168 895/1714/900 +f 895/1714/900 157/284/168 163/299/176 +f 834/248/151 140/247/150 894/1713/899 +f 894/1713/899 140/247/150 146/271/159 +f 895/1714/900 163/299/176 169/1716/181 +f 787/1485/800 863/1644/868 898/1720/902 +f 787/1485/800 898/1720/902 799/1486/811 +f 812/1527/823 899/1721/903 818/1528/829 +f 799/1486/811 898/1720/902 801/1495/816 +f 801/1495/816 898/1720/902 900/1722/904 +f 801/1495/816 900/1722/904 808/1723/821 +f 808/1512/821 900/1722/904 812/1513/823 +f 818/1724/829 901/1725/279 823/1540/196 +f 863/1644/868 865/1726/870 902/1727/905 +f 863/1644/868 902/1727/905 898/1720/902 +f 812/1728/823 900/1729/904 904/1730/906 +f 812/1728/823 904/1730/906 899/1731/903 +f 818/1724/829 899/1732/903 901/1725/279 +f 898/1720/902 902/1727/905 903/1733/907 +f 898/1720/902 903/1733/907 900/1722/904 +f 899/1734/903 905/1735/280 901/1736/279 +f 865/1647/870 866/1649/871 906/1737/908 +f 865/1647/870 906/1737/908 902/1738/905 +f 903/1739/907 907/1740/909 900/1729/904 +f 900/1729/904 907/1740/909 904/1730/906 +f 904/1741/906 908/1742/910 899/1743/903 +f 899/1734/903 908/1744/910 905/1745/280 +f 902/1738/905 906/1737/908 909/1746/911 +f 902/1738/905 909/1746/911 903/1739/907 +f 903/1739/907 909/1746/911 907/1740/909 +f 907/1747/909 910/1748/912 908/1742/910 +f 907/1747/909 908/1742/910 904/1741/906 +f 905/478/280 908/1742/910 261/479/281 +f 905/478/280 261/479/281 258/472/275 +f 866/1749/871 868/1750/873 906/1751/908 +f 906/1752/908 868/1753/873 911/1754/913 +f 906/1755/908 912/1756/914 909/1757/911 +f 907/1747/909 909/1746/911 913/1758/915 +f 907/1747/909 913/1758/915 910/1748/912 +f 910/1748/912 914/1759/916 908/1742/910 +f 908/1742/910 914/1759/916 915/480/282 +f 908/1742/910 915/480/282 261/479/281 +f 868/1652/873 869/1653/874 911/1754/913 +f 911/1754/913 916/1760/917 906/1761/908 +f 906/1755/908 916/1762/917 912/1763/914 +f 910/1748/912 913/1758/915 914/1759/916 +f 911/1754/913 869/1653/874 916/1764/917 +f 912/1765/914 917/1766/918 909/1746/911 +f 909/1746/911 917/1766/918 913/1758/915 +f 913/1758/915 917/1766/918 918/1767/919 +f 869/1653/874 919/1768/920 916/1764/917 +f 912/1763/914 916/1764/917 920/1769/921 +f 912/1765/914 920/1770/921 917/1766/918 +f 917/1766/918 921/1771/922 918/1767/919 +f 913/1758/915 918/1767/919 922/481/283 +f 913/1758/915 922/481/283 914/1759/916 +f 914/1759/916 922/481/283 915/480/282 +f 919/1768/920 923/1772/923 916/1764/917 +f 918/1767/919 755/1421/769 922/481/283 +f 869/1653/874 871/1655/876 919/1768/920 +f 919/1768/920 730/1359/742 923/1772/923 +f 916/1764/917 923/1772/923 920/1770/921 +f 917/1766/918 920/1770/921 921/1771/922 +f 871/1655/876 730/1359/742 919/1768/920 +f 921/1771/922 920/1770/921 747/1422/762 +f 921/1771/922 747/1422/762 918/1767/919 +f 918/1767/919 747/1422/762 755/1421/769 +f 755/1421/769 260/474/277 922/481/283 +f 923/1772/923 730/1359/742 740/1375/755 +f 923/1772/923 740/1375/755 920/1770/921 +f 920/1770/921 740/1375/755 747/1400/762 diff --git a/res/models/asteroids/asteroid03.mtl b/res/models/asteroids/asteroid03.mtl new file mode 100644 index 0000000..724d06f --- /dev/null +++ b/res/models/asteroids/asteroid03.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'None' +# Material Count: 1 +newmtl Material +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 1 +map_Kd limestone.jpg + + diff --git a/res/models/asteroids/asteroid03.obj b/res/models/asteroids/asteroid03.obj new file mode 100644 index 0000000..fd41114 --- /dev/null +++ b/res/models/asteroids/asteroid03.obj @@ -0,0 +1,7887 @@ +# Blender v2.63 (sub 0) OBJ File: '' +# www.blender.org +mtllib asteroid03.mtl +o Cube +v 0.000000 -0.741863 -0.000000 +v 0.079221 -0.761222 -0.000000 +v 0.157196 -0.749389 -0.000000 +v 0.230788 -0.722774 -0.000000 +v 0.313020 -0.726414 -0.000000 +v 0.404901 -0.738854 -0.000000 +v 0.507617 -0.751005 0.000000 +v 0.573123 -0.693982 0.000000 +v 0.000000 -0.743093 0.077680 +v 0.000000 -0.693407 0.147539 +v -0.000000 -0.683858 0.220461 +v -0.000000 -0.630877 0.277936 +v -0.000000 -0.619462 0.347255 +v -0.000000 -0.627197 0.430996 +v -0.000000 -0.586032 0.488312 +v -0.075773 -0.720663 -0.000000 +v -0.148761 -0.700486 -0.000000 +v -0.222047 -0.689835 -0.000000 +v -0.292790 -0.671325 -0.000000 +v -0.368808 -0.664101 -0.000000 +v -0.424920 -0.617379 -0.000000 +v -0.486845 -0.584164 -0.000000 +v 0.000000 -0.737964 -0.077244 +v 0.000000 -0.722854 -0.152619 +v 0.000000 -0.701260 -0.225079 +v 0.000000 -0.692433 -0.300542 +v 0.000000 -0.693805 -0.383150 +v 0.000000 -0.670238 -0.457633 +v 0.000000 -0.593195 -0.493941 +v 0.079059 -0.760745 -0.079060 +v 0.157168 -0.750525 -0.078018 +v 0.235618 -0.742070 -0.077328 +v 0.312090 -0.724760 -0.076277 +v 0.413977 -0.758109 -0.081049 +v 0.500289 -0.739427 -0.082036 +v 0.557422 -0.674153 -0.079172 +v 0.074976 -0.715800 -0.151139 +v 0.152518 -0.725655 -0.152518 +v 0.229901 -0.722031 -0.151959 +v 0.321742 -0.751410 -0.158594 +v 0.417569 -0.765527 -0.164400 +v 0.478845 -0.705053 -0.157392 +v 0.550413 -0.665347 -0.156895 +v 0.070790 -0.669978 -0.216380 +v 0.146802 -0.693707 -0.222226 +v 0.231096 -0.725385 -0.231096 +v 0.316906 -0.736902 -0.236067 +v 0.401232 -0.730718 -0.238272 +v 0.468158 -0.687180 -0.232118 +v 0.542965 -0.655546 -0.233307 +v 0.070995 -0.669159 -0.291580 +v 0.143678 -0.672563 -0.292301 +v 0.218246 -0.674598 -0.293216 +v 0.290583 -0.663608 -0.290583 +v 0.370803 -0.665852 -0.295375 +v 0.449923 -0.655823 -0.299146 +v 0.511480 -0.614803 -0.294743 +v 0.072323 -0.671481 -0.372004 +v 0.145566 -0.670746 -0.371220 +v 0.216154 -0.656483 -0.364433 +v 0.277301 -0.621009 -0.348152 +v 0.344648 -0.607551 -0.344648 +v 0.423304 -0.609495 -0.353342 +v 0.485838 -0.580549 -0.351689 +v 0.072522 -0.651558 -0.445775 +v 0.141918 -0.631959 -0.433201 +v 0.207531 -0.609119 -0.418945 +v 0.260015 -0.563357 -0.390839 +v 0.315533 -0.539474 -0.377707 +v 0.385483 -0.542046 -0.385483 +v 0.458807 -0.542070 -0.398179 +v 0.070029 -0.596880 -0.496633 +v 0.140073 -0.592156 -0.492630 +v 0.202934 -0.566143 -0.472007 +v 0.254882 -0.527006 -0.441261 +v 0.300880 -0.492002 -0.414269 +v 0.357935 -0.484754 -0.411747 +v 0.428636 -0.496370 -0.428636 +v 0.077711 -0.745008 0.077711 +v 0.073517 -0.699147 0.148247 +v 0.072654 -0.690535 0.221866 +v 0.070836 -0.667482 0.290962 +v 0.069996 -0.648382 0.360811 +v 0.071419 -0.641371 0.439455 +v 0.069174 -0.589658 0.490951 +v 0.156483 -0.746580 0.077672 +v 0.149500 -0.708597 0.149500 +v 0.145796 -0.688182 0.220729 +v 0.140877 -0.657762 0.286774 +v 0.138695 -0.636166 0.354311 +v 0.144623 -0.644738 0.441181 +v 0.136892 -0.578321 0.481708 +v 0.230603 -0.723278 0.075624 +v 0.228001 -0.715021 0.150683 +v 0.221759 -0.691721 0.221759 +v 0.212075 -0.653023 0.285013 +v 0.206771 -0.624992 0.348823 +v 0.208082 -0.610870 0.420049 +v 0.203597 -0.568094 0.473556 +v 0.306200 -0.708792 0.074760 +v 0.311500 -0.723979 0.153404 +v 0.312339 -0.724890 0.232631 +v 0.292367 -0.668188 0.292367 +v 0.275643 -0.616895 0.346074 +v 0.275907 -0.600910 0.414835 +v 0.277657 -0.577172 0.481382 +v 0.387058 -0.702551 0.075452 +v 0.388970 -0.707042 0.152779 +v 0.394578 -0.717296 0.234273 +v 0.376795 -0.677714 0.300156 +v 0.358350 -0.633958 0.358350 +v 0.350114 -0.603518 0.419412 +v 0.343685 -0.566600 0.474563 +v 0.478847 -0.704866 0.078294 +v 0.479208 -0.705633 0.157515 +v 0.472733 -0.694439 0.234405 +v 0.463057 -0.676377 0.307845 +v 0.434142 -0.626140 0.362330 +v 0.419307 -0.592559 0.419307 +v 0.407051 -0.554707 0.469182 +v 0.584622 -0.708729 0.083263 +v 0.579525 -0.702222 0.165370 +v 0.572055 -0.692198 0.245759 +v 0.559018 -0.674244 0.321730 +v 0.520042 -0.622868 0.375972 +v 0.493279 -0.584055 0.427657 +v 0.469145 -0.544209 0.469146 +v -0.076523 -0.731138 0.076523 +v -0.150147 -0.710090 0.074475 +v -0.220798 -0.686534 0.072291 +v -0.296002 -0.681145 0.072134 +v -0.362585 -0.652041 0.070365 +v -0.417834 -0.606520 0.067646 +v -0.455616 -0.544741 0.063859 +v -0.072660 -0.689363 0.146548 +v -0.143417 -0.674206 0.143417 +v -0.213136 -0.660158 0.140694 +v -0.276519 -0.630298 0.135682 +v -0.333860 -0.594346 0.130385 +v -0.403848 -0.584954 0.131967 +v -0.450167 -0.538371 0.127710 +v -0.069948 -0.660689 0.213901 +v -0.133310 -0.619600 0.202147 +v -0.196237 -0.599694 0.196237 +v -0.253847 -0.571055 0.188629 +v -0.316245 -0.559271 0.187190 +v -0.382975 -0.552063 0.189560 +v -0.434323 -0.518663 0.186803 +v -0.064906 -0.605064 0.267937 +v -0.127004 -0.584426 0.259391 +v -0.191431 -0.580850 0.257571 +v -0.245561 -0.548051 0.245561 +v -0.300966 -0.527594 0.239650 +v -0.371183 -0.532596 0.246997 +v -0.417910 -0.497809 0.241625 +v -0.063133 -0.580243 0.327796 +v -0.124309 -0.563769 0.318908 +v -0.186051 -0.555449 0.314350 +v -0.235762 -0.517947 0.296092 +v -0.296331 -0.514432 0.296331 +v -0.350991 -0.498448 0.293379 +v -0.405716 -0.481421 0.294808 +v -0.064743 -0.579706 0.401199 +v -0.121508 -0.535549 0.372997 +v -0.182264 -0.528902 0.368373 +v -0.237573 -0.510326 0.356953 +v -0.296634 -0.504476 0.354917 +v -0.349960 -0.488997 0.349960 +v -0.393296 -0.462281 0.342156 +v -0.065522 -0.558793 0.466670 +v -0.121857 -0.512901 0.430060 +v -0.181354 -0.502624 0.421593 +v -0.240273 -0.494831 0.415528 +v -0.303284 -0.496192 0.417654 +v -0.349394 -0.472589 0.401760 +v -0.393702 -0.455115 0.393702 +v -0.075471 -0.718870 -0.075472 +v -0.076175 -0.729489 -0.153516 +v -0.076972 -0.738144 -0.234571 +v -0.076809 -0.730353 -0.314154 +v -0.077640 -0.724273 -0.397583 +v -0.073858 -0.663892 -0.453428 +v -0.068883 -0.587199 -0.489017 +v -0.148458 -0.700365 -0.073624 +v -0.147622 -0.697976 -0.147622 +v -0.149953 -0.711013 -0.226916 +v -0.149820 -0.705031 -0.304425 +v -0.151819 -0.702212 -0.386608 +v -0.144913 -0.646106 -0.442036 +v -0.135196 -0.570942 -0.475882 +v -0.219454 -0.681499 -0.071835 +v -0.225582 -0.706091 -0.149057 +v -0.222089 -0.692910 -0.222089 +v -0.216760 -0.669403 -0.291241 +v -0.217401 -0.660669 -0.366509 +v -0.209671 -0.615915 -0.423229 +v -0.202746 -0.565591 -0.471569 +v -0.294177 -0.676198 -0.071664 +v -0.308432 -0.715762 -0.151850 +v -0.299927 -0.692248 -0.223295 +v -0.295958 -0.677403 -0.295958 +v -0.294689 -0.664151 -0.369944 +v -0.280162 -0.610964 -0.421259 +v -0.269663 -0.559564 -0.467301 +v -0.366495 -0.660113 -0.071178 +v -0.367437 -0.663009 -0.144029 +v -0.372232 -0.672216 -0.220842 +v -0.375025 -0.674210 -0.298744 +v -0.363905 -0.644664 -0.363905 +v -0.339146 -0.583206 -0.406185 +v -0.324477 -0.533125 -0.447507 +v -0.436139 -0.636025 -0.070840 +v -0.423690 -0.616728 -0.138694 +v -0.425499 -0.619515 -0.210806 +v -0.430916 -0.626078 -0.286558 +v -0.416259 -0.598677 -0.347501 +v -0.385203 -0.541628 -0.385203 +v -0.377552 -0.512693 -0.434687 +v -0.501815 -0.603468 -0.070808 +v -0.482627 -0.579486 -0.137161 +v -0.476244 -0.571481 -0.204748 +v -0.471194 -0.564433 -0.271874 +v -0.444790 -0.529765 -0.322549 +v -0.421998 -0.497239 -0.366702 +v -0.420275 -0.486496 -0.420276 +v -0.000000 0.834218 0.000000 +v -0.000000 0.826883 -0.084804 +v -0.000000 0.795913 -0.165222 +v -0.000000 0.793758 -0.249624 +v 0.000000 0.777788 -0.331886 +v 0.000000 0.729645 -0.400455 +v 0.000000 0.669805 -0.457365 +v 0.000000 0.603924 -0.502370 +v -0.081118 0.783531 0.000000 +v -0.161802 0.776087 0.000000 +v -0.238128 0.750435 0.000000 +v -0.301294 0.694482 0.000000 +v -0.374027 0.674910 0.000000 +v -0.455524 0.666829 -0.000000 +v -0.560069 0.677366 -0.000000 +v -0.000000 0.848119 0.086610 +v -0.000000 0.796778 0.165371 +v -0.000000 0.761279 0.241005 +v -0.000000 0.715062 0.308851 +v -0.000000 0.645987 0.360062 +v -0.000000 0.602380 0.415638 +v -0.000000 0.559380 0.467373 +v 0.087760 0.861653 0.000000 +v 0.182636 0.896865 0.000000 +v 0.273436 0.883492 0.000000 +v 0.364341 0.866168 0.000000 +v 0.438054 0.807517 0.000000 +v 0.509240 0.753627 0.000000 +v 0.564492 0.682996 0.000000 +v 0.086583 0.848551 -0.086582 +v 0.083799 0.816511 -0.168626 +v 0.080542 0.777518 -0.245077 +v 0.081143 0.775976 -0.330982 +v 0.079234 0.740095 -0.405248 +v 0.079445 0.715495 -0.485441 +v 0.076170 0.648784 -0.537464 +v 0.178813 0.875175 -0.088939 +v 0.173836 0.846166 -0.173836 +v 0.166587 0.802378 -0.251671 +v 0.160165 0.759713 -0.324843 +v 0.164054 0.763787 -0.416718 +v 0.161945 0.726561 -0.492276 +v 0.154931 0.656802 -0.543667 +v 0.277164 0.897759 -0.091446 +v 0.267844 0.862067 -0.177454 +v 0.255077 0.811854 -0.255077 +v 0.241413 0.755593 -0.324012 +v 0.246611 0.758705 -0.415105 +v 0.238755 0.708252 -0.481441 +v 0.223036 0.625313 -0.518969 +v 0.370738 0.883752 -0.091382 +v 0.359108 0.851477 -0.177525 +v 0.341287 0.801025 -0.254407 +v 0.325679 0.753687 -0.325678 +v 0.317498 0.720740 -0.398528 +v 0.308848 0.678747 -0.464571 +v 0.296602 0.618899 -0.514755 +v 0.443018 0.818046 -0.087086 +v 0.438969 0.809289 -0.173096 +v 0.418874 0.766309 -0.248876 +v 0.405708 0.734954 -0.323227 +v 0.379425 0.674575 -0.379425 +v 0.365317 0.631672 -0.437745 +v 0.354777 0.585931 -0.490187 +v 0.517865 0.767759 -0.085103 +v 0.515737 0.764132 -0.169898 +v 0.498643 0.735536 -0.247347 +v 0.475225 0.695420 -0.315903 +v 0.448491 0.648174 -0.374227 +v 0.417695 0.590151 -0.417695 +v 0.397926 0.541710 -0.458511 +v 0.587242 0.712059 -0.083656 +v 0.583842 0.707691 -0.166626 +v 0.572049 0.692190 -0.245756 +v 0.537833 0.647755 -0.309703 +v 0.505877 0.605343 -0.365916 +v 0.466927 0.551960 -0.405122 +v 0.434531 0.503332 -0.434531 +v -0.083657 0.814402 -0.083657 +v -0.167456 0.809771 -0.083209 +v -0.236395 0.744983 -0.077592 +v -0.292521 0.671708 -0.071237 +v -0.354849 0.636076 -0.068757 +v -0.441947 0.645387 -0.071854 +v -0.538836 0.650528 -0.076376 +v -0.083470 0.812751 -0.167973 +v -0.160518 0.770879 -0.160518 +v -0.228610 0.717266 -0.151091 +v -0.286806 0.657847 -0.140894 +v -0.348816 0.624930 -0.136462 +v -0.433286 0.632095 -0.141947 +v -0.511650 0.616248 -0.145610 +v -0.082528 0.799413 -0.250920 +v -0.159570 0.763836 -0.241228 +v -0.226007 0.707038 -0.226007 +v -0.284023 0.650418 -0.211330 +v -0.344946 0.617170 -0.204441 +v -0.408150 0.591997 -0.202138 +v -0.490597 0.589565 -0.210891 +v -0.081015 0.774627 -0.330485 +v -0.156388 0.739749 -0.317388 +v -0.218092 0.674061 -0.293012 +v -0.283237 0.644754 -0.283237 +v -0.331338 0.587723 -0.263885 +v -0.390694 0.563130 -0.259919 +v -0.457980 0.547910 -0.264372 +v -0.079498 0.742713 -0.406517 +v -0.155874 0.722619 -0.396587 +v -0.218846 0.665518 -0.368912 +v -0.278582 0.624188 -0.349757 +v -0.334556 0.588101 -0.334556 +v -0.382871 0.547405 -0.319814 +v -0.440330 0.524246 -0.319382 +v -0.073370 0.659393 -0.450636 +v -0.144836 0.645743 -0.441809 +v -0.208203 0.611252 -0.420289 +v -0.264796 0.574653 -0.398057 +v -0.326146 0.559131 -0.390507 +v -0.391274 0.550695 -0.391274 +v -0.440214 0.519425 -0.382279 +v -0.069000 0.588192 -0.489798 +v -0.134475 0.567805 -0.473405 +v -0.198353 0.552659 -0.461305 +v -0.262998 0.544885 -0.455560 +v -0.322970 0.530499 -0.445384 +v -0.377555 0.512696 -0.434690 +v -0.433791 0.502458 -0.433791 +v -0.081338 0.787337 0.081338 +v -0.080736 0.781545 0.162555 +v -0.077126 0.739839 0.235023 +v -0.074490 0.705951 0.305152 +v -0.069118 0.639655 0.356583 +v -0.065326 0.585096 0.404543 +v -0.064431 0.549572 0.459416 +v -0.160214 0.768064 0.079555 +v -0.158282 0.758236 0.158282 +v -0.155764 0.742932 0.235564 +v -0.155046 0.732656 0.314740 +v -0.147900 0.682491 0.376964 +v -0.135598 0.602105 0.414559 +v -0.131053 0.552911 0.461647 +v -0.242171 0.766627 0.079555 +v -0.243473 0.772119 0.161078 +v -0.239472 0.755585 0.239472 +v -0.233279 0.727156 0.313200 +v -0.225985 0.689480 0.380790 +v -0.205885 0.603894 0.415650 +v -0.197626 0.550519 0.459606 +v -0.320833 0.748461 0.078529 +v -0.329909 0.773281 0.162732 +v -0.327107 0.763731 0.243740 +v -0.315317 0.727093 0.315317 +v -0.302741 0.684128 0.380035 +v -0.288214 0.629990 0.433416 +v -0.271033 0.562581 0.469713 +v -0.387997 0.704489 0.075648 +v -0.411559 0.753237 0.161958 +v -0.412288 0.753022 0.244917 +v -0.390132 0.704118 0.310798 +v -0.374595 0.665267 0.374595 +v -0.360875 0.623447 0.432389 +v -0.353932 0.584457 0.488996 +v -0.483445 0.712276 0.079096 +v -0.499203 0.737653 0.164293 +v -0.492154 0.725244 0.244107 +v -0.480333 0.703414 0.319286 +v -0.439825 0.634866 0.367041 +v -0.427982 0.605514 0.427982 +v -0.413129 0.563362 0.476289 +v -0.580554 0.703558 0.082651 +v -0.592042 0.718077 0.169014 +v -0.573682 0.694247 0.246455 +v -0.556698 0.671343 0.320413 +v -0.513694 0.615014 0.371465 +v -0.490091 0.580172 0.424931 +v -0.469769 0.544946 0.469769 +v 0.088139 0.866713 0.088139 +v 0.177544 0.867869 0.088299 +v 0.260712 0.836107 0.085856 +v 0.342384 0.806884 0.084079 +v 0.420661 0.771905 0.082439 +v 0.488648 0.720663 0.080005 +v 0.559066 0.676244 0.079419 +v 0.084650 0.826220 0.170312 +v 0.165013 0.796292 0.165014 +v 0.247867 0.788339 0.164031 +v 0.334818 0.786428 0.165219 +v 0.394897 0.719164 0.155188 +v 0.479625 0.706302 0.157656 +v 0.543997 0.657220 0.155027 +v 0.079277 0.763569 0.241355 +v 0.158999 0.760701 0.240379 +v 0.241443 0.762692 0.241443 +v 0.313777 0.728674 0.233714 +v 0.377332 0.682504 0.223907 +v 0.444996 0.650441 0.220547 +v 0.519102 0.625480 0.223093 +v 0.075528 0.716872 0.309181 +v 0.151201 0.712331 0.307150 +v 0.228646 0.710959 0.307042 +v 0.306729 0.705051 0.306730 +v 0.363895 0.652177 0.289864 +v 0.425240 0.617195 0.282799 +v 0.501889 0.602812 0.289299 +v 0.071789 0.666183 0.369437 +v 0.149695 0.691526 0.381382 +v 0.224721 0.685238 0.378687 +v 0.291777 0.656925 0.366294 +v 0.355251 0.627986 0.355251 +v 0.407418 0.585100 0.340169 +v 0.477570 0.570320 0.345820 +v 0.070916 0.636722 0.436571 +v 0.145763 0.650123 0.444544 +v 0.221907 0.654761 0.447719 +v 0.281381 0.613844 0.423099 +v 0.343095 0.590520 0.410947 +v 0.404041 0.569762 0.404042 +v 0.458777 0.542033 0.398153 +v 0.070300 0.599181 0.498443 +v 0.145598 0.616199 0.511611 +v 0.226172 0.634544 0.526296 +v 0.281270 0.585128 0.487746 +v 0.331337 0.545081 0.457170 +v 0.396381 0.539510 0.456706 +v 0.449889 0.521469 0.449889 +v 0.782136 0.000000 0.000000 +v 0.779701 0.000000 -0.080792 +v 0.755446 0.000000 -0.158241 +v 0.732713 0.000000 -0.233425 +v 0.672623 0.000000 -0.293266 +v 0.612791 0.000000 -0.344033 +v 0.564372 0.000000 -0.392115 +v 0.531112 0.000000 -0.445165 +v 0.780809 0.080887 0.000000 +v 0.752553 0.157742 0.000000 +v 0.749115 0.237777 0.000000 +v 0.791654 0.336977 0.000000 +v 0.768758 0.419340 0.000000 +v 0.708760 0.481473 0.000000 +v 0.687689 0.568180 0.000000 +v 0.795278 0.000000 0.082117 +v 0.815828 0.000000 0.168657 +v 0.831745 0.000000 0.259705 +v 0.821343 0.000000 0.347880 +v 0.778680 0.000000 0.424131 +v 0.702200 0.000000 0.477414 +v 0.682220 0.000000 0.563883 +v 0.810535 -0.083414 0.000000 +v 0.817907 -0.169016 0.000000 +v 0.827968 -0.258702 0.000000 +v 0.817110 -0.346326 0.000000 +v 0.799660 -0.434260 0.000000 +v 0.741132 -0.501508 0.000000 +v 0.701574 -0.579088 0.000000 +v 0.798807 -0.082321 -0.082320 +v 0.791145 -0.081577 -0.164221 +v 0.762459 -0.079177 -0.241059 +v 0.699790 -0.073905 -0.302879 +v 0.619547 -0.067092 -0.346840 +v 0.553102 -0.061862 -0.384694 +v 0.534579 -0.062657 -0.447622 +v 0.768145 -0.160228 -0.079562 +v 0.762903 -0.159107 -0.159107 +v 0.747872 -0.156663 -0.236902 +v 0.690613 -0.147092 -0.299041 +v 0.618148 -0.135115 -0.345500 +v 0.560921 -0.126879 -0.388841 +v 0.521247 -0.123775 -0.436648 +v 0.764483 -0.241599 -0.079360 +v 0.748486 -0.237069 -0.156775 +v 0.730658 -0.232558 -0.232558 +v 0.663238 -0.214997 -0.288897 +v 0.596909 -0.198404 -0.334902 +v 0.547339 -0.188072 -0.379996 +v 0.509491 -0.183687 -0.427043 +v 0.767562 -0.327879 -0.080343 +v 0.719805 -0.309941 -0.152615 +v 0.678758 -0.294798 -0.219436 +v 0.631651 -0.278132 -0.278132 +v 0.553579 -0.250123 -0.314091 +v 0.530592 -0.246149 -0.369903 +v 0.502772 -0.243879 -0.421879 +v 0.730904 -0.400795 -0.078308 +v 0.685183 -0.378280 -0.148435 +v 0.658662 -0.365513 -0.216803 +v 0.601533 -0.338314 -0.269451 +v 0.547060 -0.313261 -0.313261 +v 0.499974 -0.294203 -0.351985 +v 0.470819 -0.288725 -0.397147 +v 0.709299 -0.481597 -0.078774 +v 0.685968 -0.466927 -0.153351 +v 0.652446 -0.446259 -0.221178 +v 0.590815 -0.408384 -0.271635 +v 0.544690 -0.381104 -0.318349 +v 0.508858 -0.363259 -0.363259 +v 0.473292 -0.349888 -0.402337 +v 0.679845 -0.561900 -0.079845 +v 0.663659 -0.549080 -0.156506 +v 0.638439 -0.529388 -0.227495 +v 0.593991 -0.494834 -0.285294 +v 0.549457 -0.460707 -0.333848 +v 0.521592 -0.441994 -0.383800 +v 0.465904 -0.402838 -0.402838 +v 0.769236 0.079787 -0.079787 +v 0.743761 0.155994 -0.077425 +v 0.755684 0.239251 -0.078562 +v 0.756715 0.323878 -0.079313 +v 0.772483 0.420941 -0.082496 +v 0.726454 0.492240 -0.080631 +v 0.699902 0.577678 -0.082218 +v 0.751585 0.078111 -0.157352 +v 0.757885 0.158219 -0.158219 +v 0.758744 0.239848 -0.158642 +v 0.747719 0.320364 -0.157895 +v 0.760849 0.415281 -0.163470 +v 0.723473 0.490347 -0.161291 +v 0.693919 0.572970 -0.163461 +v 0.731913 0.076407 -0.232907 +v 0.735230 0.154362 -0.233477 +v 0.722055 0.230172 -0.230172 +v 0.729032 0.313913 -0.233815 +v 0.740653 0.406156 -0.241232 +v 0.713029 0.484453 -0.240260 +v 0.673430 0.557159 -0.239382 +v 0.689256 0.072904 -0.298993 +v 0.702168 0.149278 -0.303355 +v 0.673876 0.218039 -0.292942 +v 0.669907 0.293037 -0.293037 +v 0.692264 0.384144 -0.306020 +v 0.691366 0.472634 -0.314187 +v 0.661788 0.549057 -0.316075 +v 0.608430 0.065972 -0.341454 +v 0.611410 0.133776 -0.342204 +v 0.584573 0.194728 -0.328787 +v 0.597938 0.268002 -0.336498 +v 0.611051 0.346464 -0.346464 +v 0.619108 0.429564 -0.358532 +v 0.583468 0.488197 -0.353364 +v 0.548511 0.061365 -0.381846 +v 0.535959 0.121595 -0.373253 +v 0.523544 0.180577 -0.364995 +v 0.506390 0.235907 -0.354438 +v 0.525474 0.307972 -0.368590 +v 0.531566 0.378465 -0.378465 +v 0.519836 0.440551 -0.382567 +v 0.522028 0.061172 -0.437748 +v 0.484872 0.115414 -0.407931 +v 0.465966 0.168901 -0.392498 +v 0.464165 0.226350 -0.391002 +v 0.475434 0.291373 -0.400877 +v 0.480387 0.354869 -0.408162 +v 0.473104 0.408935 -0.408935 +v 0.794967 0.081992 0.081992 +v 0.831613 0.085123 0.171249 +v 0.818002 0.084214 0.255881 +v 0.786394 0.082133 0.334826 +v 0.759668 0.081206 0.414733 +v 0.699605 0.077724 0.475583 +v 0.662211 0.077759 0.548028 +v 0.790566 0.164121 0.081527 +v 0.797102 0.165157 0.165157 +v 0.784457 0.163324 0.246816 +v 0.764556 0.161081 0.326651 +v 0.737445 0.158820 0.403837 +v 0.674352 0.150892 0.459674 +v 0.623938 0.147377 0.517721 +v 0.790083 0.248430 0.081682 +v 0.784276 0.246767 0.163292 +v 0.759773 0.240633 0.240633 +v 0.718349 0.230760 0.309852 +v 0.695473 0.227771 0.383761 +v 0.623243 0.211980 0.427849 +v 0.586929 0.209996 0.488505 +v 0.755303 0.323357 0.079179 +v 0.748590 0.320690 0.158061 +v 0.710356 0.306812 0.228474 +v 0.686021 0.299315 0.299316 +v 0.649054 0.288605 0.362318 +v 0.594507 0.273198 0.410743 +v 0.562404 0.270953 0.469572 +v 0.738964 0.404701 0.079121 +v 0.737161 0.403698 0.158764 +v 0.689277 0.380689 0.225925 +v 0.648644 0.362111 0.288440 +v 0.608294 0.345033 0.345034 +v 0.570102 0.332070 0.397652 +v 0.542894 0.330082 0.455402 +v 0.701530 0.476777 0.077933 +v 0.677656 0.461737 0.151592 +v 0.626273 0.429759 0.212934 +v 0.601414 0.415157 0.276121 +v 0.569439 0.397220 0.331713 +v 0.542564 0.385829 0.385830 +v 0.526314 0.387116 0.445871 +v 0.665153 0.550341 0.078107 +v 0.631042 0.523330 0.149010 +v 0.607245 0.504629 0.216898 +v 0.582605 0.485728 0.280125 +v 0.564244 0.472659 0.342333 +v 0.530214 0.449073 0.389855 +v 0.496056 0.428371 0.428371 +v 0.827310 -0.084763 0.084763 +v 0.842015 -0.173055 0.086034 +v 0.856219 -0.266079 0.087680 +v 0.842800 -0.355632 0.087492 +v 0.784840 -0.426928 0.083741 +v 0.740090 -0.500700 0.082108 +v 0.705955 -0.582440 0.082935 +v 0.848853 -0.086633 0.174242 +v 0.879396 -0.179714 0.179714 +v 0.896197 -0.277092 0.183668 +v 0.851136 -0.358980 0.177460 +v 0.803289 -0.436035 0.171904 +v 0.755676 -0.510457 0.168109 +v 0.721705 -0.594906 0.169848 +v 0.850205 -0.087134 0.264474 +v 0.894892 -0.183430 0.276739 +v 0.913464 -0.283258 0.283258 +v 0.864423 -0.365392 0.272541 +v 0.819417 -0.445200 0.264700 +v 0.760018 -0.514077 0.255060 +v 0.716912 -0.591670 0.254155 +v 0.837566 -0.086994 0.353702 +v 0.870562 -0.181135 0.366234 +v 0.889893 -0.279826 0.375076 +v 0.843498 -0.360670 0.360670 +v 0.787330 -0.432164 0.344337 +v 0.747631 -0.508589 0.338001 +v 0.710777 -0.588237 0.338317 +v 0.809768 -0.086252 0.439007 +v 0.826090 -0.176435 0.447185 +v 0.815895 -0.263650 0.443454 +v 0.813433 -0.354858 0.445350 +v 0.748652 -0.417861 0.417861 +v 0.682601 -0.470909 0.392817 +v 0.651981 -0.543573 0.392677 +v 0.728547 -0.080858 0.493539 +v 0.761857 -0.169417 0.514317 +v 0.757838 -0.254374 0.512703 +v 0.731018 -0.330969 0.497973 +v 0.693678 -0.398799 0.478123 +v 0.626321 -0.441915 0.441915 +v 0.580433 -0.490305 0.425115 +v 0.698698 -0.082076 0.576731 +v 0.720970 -0.169679 0.594326 +v 0.701642 -0.248967 0.579551 +v 0.647277 -0.309487 0.537452 +v 0.604898 -0.365660 0.505518 +v 0.560222 -0.410924 0.473711 +v 0.534397 -0.460837 0.460837 +v -0.000000 0.000000 0.728694 +v 0.078747 0.000000 0.755641 +v 0.169901 0.000000 0.823040 +v 0.261693 0.000000 0.839241 +v 0.363601 0.000000 0.864154 +v 0.450018 0.000000 0.832296 +v 0.521005 0.000000 0.772638 +v 0.587856 0.000000 0.712735 +v -0.000000 0.077623 0.742424 +v -0.000000 0.160367 0.767771 +v -0.000000 0.237210 0.746976 +v -0.000000 0.301216 0.694271 +v -0.000000 0.351125 0.627477 +v -0.000000 0.405892 0.586633 +v -0.000000 0.470812 0.563756 +v -0.074374 0.000000 0.704205 +v -0.146926 0.000000 0.689852 +v -0.223013 0.000000 0.693474 +v -0.307106 0.000000 0.710308 +v -0.400878 0.000000 0.730520 +v -0.480769 0.000000 0.707622 +v -0.540272 0.000000 0.652168 +v -0.000000 -0.077820 0.744737 +v -0.000000 -0.154894 0.736043 +v -0.000000 -0.230611 0.722109 +v -0.000000 -0.289307 0.661841 +v -0.000000 -0.351656 0.628578 +v -0.000000 -0.406205 0.587138 +v -0.000000 -0.467457 0.559486 +v 0.078876 -0.078876 0.758605 +v 0.160301 -0.079599 0.768570 +v 0.253010 -0.083238 0.807247 +v 0.348602 -0.085681 0.823743 +v 0.430171 -0.084415 0.791531 +v 0.506504 -0.083121 0.749446 +v 0.574183 -0.081693 0.695461 +v 0.079045 -0.159204 0.762247 +v 0.158619 -0.158619 0.760143 +v 0.250511 -0.165807 0.798095 +v 0.332995 -0.164295 0.781545 +v 0.428255 -0.168742 0.787379 +v 0.484167 -0.159196 0.713576 +v 0.563741 -0.160775 0.682230 +v 0.076735 -0.233875 0.735539 +v 0.156224 -0.236249 0.745458 +v 0.239398 -0.239398 0.755319 +v 0.321756 -0.239716 0.749660 +v 0.398454 -0.236603 0.725115 +v 0.475226 -0.235650 0.698393 +v 0.547699 -0.235333 0.661511 +v 0.073679 -0.302004 0.697418 +v 0.150432 -0.305633 0.708266 +v 0.226056 -0.303598 0.701903 +v 0.299947 -0.299947 0.687644 +v 0.369378 -0.294238 0.663032 +v 0.445771 -0.296396 0.649325 +v 0.514927 -0.296700 0.619114 +v 0.068876 -0.355422 0.637259 +v 0.140157 -0.357909 0.643524 +v 0.209128 -0.352745 0.632903 +v 0.283428 -0.355831 0.636212 +v 0.355716 -0.355716 0.628882 +v 0.435317 -0.363303 0.627943 +v 0.499429 -0.361338 0.597365 +v 0.070182 -0.432366 0.629944 +v 0.141846 -0.432989 0.631619 +v 0.208152 -0.420189 0.611093 +v 0.283038 -0.425602 0.617760 +v 0.360880 -0.432394 0.623455 +v 0.425250 -0.425250 0.601434 +v 0.483135 -0.418983 0.571701 +v 0.066953 -0.476184 0.570886 +v 0.139352 -0.490156 0.589023 +v 0.208148 -0.484188 0.581490 +v 0.278595 -0.483035 0.579238 +v 0.352834 -0.487451 0.582545 +v 0.425004 -0.490176 0.580276 +v 0.470659 -0.470659 0.545997 +v 0.083784 0.083785 0.815895 +v 0.082674 0.166397 0.803671 +v 0.078878 0.240179 0.759162 +v 0.074833 0.306484 0.709563 +v 0.072134 0.371095 0.669607 +v 0.066459 0.411035 0.595561 +v 0.065135 0.464097 0.555522 +v 0.174332 0.086678 0.849371 +v 0.175649 0.175650 0.856419 +v 0.167869 0.253580 0.809422 +v 0.156617 0.317841 0.740961 +v 0.151509 0.385845 0.700653 +v 0.144283 0.440180 0.643135 +v 0.141316 0.496901 0.597567 +v 0.270312 0.089118 0.872082 +v 0.268915 0.178174 0.866020 +v 0.257910 0.257910 0.822070 +v 0.237129 0.318318 0.740618 +v 0.233223 0.392832 0.713774 +v 0.216158 0.436213 0.636511 +v 0.217982 0.507163 0.610437 +v 0.356861 0.087808 0.846132 +v 0.346065 0.170917 0.816549 +v 0.333095 0.248245 0.779480 +v 0.313352 0.313353 0.722050 +v 0.302962 0.380311 0.684675 +v 0.281060 0.422614 0.613085 +v 0.278153 0.482256 0.578264 +v 0.442827 0.087046 0.817653 +v 0.417209 0.164254 0.764790 +v 0.391844 0.232630 0.711781 +v 0.379732 0.302500 0.683529 +v 0.359698 0.359698 0.636557 +v 0.333320 0.399159 0.572417 +v 0.329530 0.454625 0.541933 +v 0.514454 0.084508 0.762260 +v 0.488693 0.160730 0.720824 +v 0.454296 0.225193 0.665194 +v 0.433850 0.288501 0.630669 +v 0.399839 0.333885 0.573463 +v 0.378313 0.378314 0.531340 +v 0.378049 0.435268 0.513401 +v 0.559950 0.079552 0.677368 +v 0.538980 0.153566 0.650867 +v 0.497518 0.213854 0.598285 +v 0.471787 0.272211 0.565175 +v 0.437390 0.317295 0.520610 +v 0.418909 0.364059 0.493476 +v 0.421618 0.421618 0.488082 +v -0.073560 0.073560 0.696558 +v -0.146776 0.072774 0.690674 +v -0.224477 0.073542 0.700319 +v -0.305896 0.074682 0.707967 +v -0.377024 0.073367 0.681842 +v -0.466637 0.076163 0.685184 +v -0.538142 0.076272 0.649645 +v -0.074814 0.150818 0.713952 +v -0.152297 0.152296 0.724402 +v -0.225578 0.149054 0.706077 +v -0.304538 0.149877 0.705334 +v -0.376164 0.147575 0.680855 +v -0.460225 0.151079 0.675235 +v -0.518542 0.147616 0.624978 +v -0.077180 0.235183 0.740440 +v -0.151490 0.229203 0.719456 +v -0.229775 0.229775 0.720623 +v -0.310084 0.230935 0.718960 +v -0.387857 0.230233 0.703737 +v -0.459250 0.227668 0.673050 +v -0.520668 0.223763 0.627453 +v -0.072457 0.297258 0.684550 +v -0.147216 0.299284 0.691266 +v -0.225353 0.302664 0.699446 +v -0.304490 0.304489 0.699301 +v -0.376474 0.299900 0.677079 +v -0.446827 0.297096 0.650978 +v -0.514121 0.296242 0.618106 +v -0.069874 0.360221 0.647162 +v -0.139836 0.357119 0.641909 +v -0.214167 0.361127 0.649813 +v -0.281367 0.353248 0.631097 +v -0.343404 0.343404 0.605153 +v -0.416055 0.347331 0.598363 +v -0.477606 0.345845 0.570365 +v -0.067967 0.419671 0.609482 +v -0.136231 0.416426 0.605095 +v -0.199042 0.401954 0.582169 +v -0.264298 0.397304 0.573475 +v -0.340945 0.408353 0.586537 +v -0.407274 0.407274 0.574589 +v -0.472138 0.409578 0.558306 +v -0.066837 0.475412 0.569906 +v -0.133849 0.471252 0.565078 +v -0.193939 0.450993 0.539667 +v -0.254725 0.440986 0.526662 +v -0.334187 0.461183 0.550046 +v -0.411660 0.474571 0.561270 +v -0.468065 0.468065 0.542933 +v -0.076986 -0.076986 0.736541 +v -0.075797 -0.152766 0.725174 +v -0.074469 -0.227204 0.710539 +v -0.069786 -0.286886 0.656433 +v -0.069169 -0.356833 0.640170 +v -0.066085 -0.408889 0.592102 +v -0.064795 -0.461836 0.552648 +v -0.150735 -0.074772 0.713476 +v -0.148713 -0.148713 0.704145 +v -0.144159 -0.218293 0.679190 +v -0.138839 -0.282750 0.646984 +v -0.133926 -0.342575 0.612167 +v -0.133618 -0.408717 0.592751 +v -0.134894 -0.474843 0.569626 +v -0.228886 -0.075040 0.716840 +v -0.223791 -0.147854 0.699483 +v -0.216153 -0.216153 0.671505 +v -0.205131 -0.275782 0.628746 +v -0.205234 -0.346265 0.619831 +v -0.204093 -0.412063 0.598204 +v -0.198759 -0.462254 0.553855 +v -0.310153 -0.075778 0.719508 +v -0.302944 -0.149070 0.701066 +v -0.295718 -0.220128 0.681177 +v -0.277984 -0.277984 0.631271 +v -0.270382 -0.339480 0.603841 +v -0.262144 -0.394053 0.568390 +v -0.254625 -0.440810 0.526441 +v -0.407316 -0.079664 0.744361 +v -0.391103 -0.153645 0.711403 +v -0.375715 -0.222935 0.679243 +v -0.361117 -0.287646 0.646675 +v -0.340097 -0.340097 0.598779 +v -0.322873 -0.386559 0.553068 +v -0.315781 -0.435258 0.517970 +v -0.478132 -0.078169 0.703713 +v -0.459422 -0.150807 0.673948 +v -0.448728 -0.222411 0.656361 +v -0.437854 -0.291153 0.636935 +v -0.422534 -0.352704 0.608314 +v -0.397733 -0.397733 0.560340 +v -0.361407 -0.415807 0.489698 +v -0.560375 -0.079616 0.677907 +v -0.553733 -0.157861 0.669553 +v -0.525205 -0.225705 0.633169 +v -0.502715 -0.289767 0.603844 +v -0.483155 -0.349785 0.577230 +v -0.458588 -0.397991 0.541802 +v -0.414391 -0.414391 0.479547 +v -0.869292 0.000000 -0.000000 +v -0.946662 0.000000 0.094988 +v -0.959477 0.000000 0.193436 +v -0.952539 0.000000 0.291758 +v -0.877162 0.000000 0.368378 +v -0.827446 0.000000 0.447676 +v -0.783963 0.000000 0.528014 +v -0.706618 0.000000 0.583051 +v -0.898532 0.090896 -0.000000 +v -0.920720 0.186751 -0.000000 +v -0.909461 0.280327 -0.000000 +v -0.896833 0.375601 -0.000000 +v -0.871119 0.468763 -0.000000 +v -0.829528 0.556213 -0.000000 +v -0.761262 0.625982 -0.000000 +v -0.799248 0.000000 -0.082455 +v -0.768274 0.000000 -0.160454 +v -0.720696 0.000000 -0.230236 +v -0.692578 0.000000 -0.300595 +v -0.671871 0.000000 -0.372560 +v -0.645142 0.000000 -0.442102 +v -0.603539 0.000000 -0.502067 +v -0.820435 -0.084256 -0.000000 +v -0.775652 -0.161727 -0.000000 +v -0.746695 -0.237135 -0.000000 +v -0.723174 -0.311830 -0.000000 +v -0.696906 -0.384647 -0.000000 +v -0.633462 -0.434873 -0.000000 +v -0.585688 -0.488043 -0.000000 +v -0.882650 -0.089504 0.089504 +v -0.875263 -0.088947 0.178828 +v -0.881856 -0.090004 0.272920 +v -0.844489 -0.087652 0.356255 +v -0.790653 -0.084327 0.429745 +v -0.754412 -0.083659 0.509585 +v -0.720474 -0.084652 0.593861 +v -0.844884 -0.173553 0.086285 +v -0.839810 -0.172712 0.172711 +v -0.830846 -0.171770 0.259385 +v -0.810538 -0.169780 0.343821 +v -0.798446 -0.170942 0.433667 +v -0.767102 -0.170527 0.517592 +v -0.734752 -0.172846 0.605207 +v -0.803749 -0.252077 0.082921 +v -0.792312 -0.248944 0.164754 +v -0.781848 -0.246755 0.246755 +v -0.784234 -0.249605 0.334902 +v -0.797770 -0.258250 0.434469 +v -0.768698 -0.257794 0.519549 +v -0.726229 -0.257320 0.599065 +v -0.751625 -0.322000 0.078829 +v -0.728472 -0.313177 0.154254 +v -0.747183 -0.320815 0.239007 +v -0.743114 -0.321559 0.321559 +v -0.762628 -0.334381 0.419687 +v -0.735254 -0.332761 0.500678 +v -0.673692 -0.321479 0.558577 +v -0.702959 -0.387255 0.075493 +v -0.695563 -0.383356 0.150498 +v -0.692841 -0.382456 0.226986 +v -0.657852 -0.366762 0.292150 +v -0.696878 -0.390997 0.390997 +v -0.670337 -0.386195 0.462923 +v -0.606078 -0.366337 0.506471 +v -0.635366 -0.435730 0.070769 +v -0.595930 -0.410702 0.134290 +v -0.589935 -0.406850 0.201488 +v -0.589056 -0.407260 0.270891 +v -0.615318 -0.427096 0.356486 +v -0.595038 -0.420967 0.420967 +v -0.548120 -0.402427 0.463775 +v -0.570702 -0.476039 0.066931 +v -0.524196 -0.438977 0.124452 +v -0.521272 -0.436393 0.187689 +v -0.526276 -0.440677 0.254550 +v -0.534422 -0.448555 0.325221 +v -0.521416 -0.441849 0.383677 +v -0.488357 -0.421851 0.421850 +v -0.950876 0.095350 0.095350 +v -0.947934 0.191447 0.095314 +v -0.926242 0.284765 0.094029 +v -0.903144 0.377892 0.093224 +v -0.871330 0.468835 0.092453 +v -0.835940 0.560164 0.092486 +v -0.781049 0.641514 0.091820 +v -0.968750 0.097138 0.195061 +v -0.970422 0.195816 0.195816 +v -0.928469 0.285836 0.189543 +v -0.923075 0.385842 0.191070 +v -0.878243 0.472688 0.186798 +v -0.841835 0.564259 0.186348 +v -0.778465 0.639717 0.182893 +v -0.969171 0.097922 0.296220 +v -0.951608 0.193756 0.292106 +v -0.917674 0.284425 0.284425 +v -0.922059 0.387306 0.289027 +v -0.882421 0.476430 0.283471 +v -0.823759 0.554262 0.275137 +v -0.752991 0.620305 0.266412 +v -0.930338 0.095808 0.387923 +v -0.938826 0.194050 0.391723 +v -0.931877 0.291835 0.391039 +v -0.897868 0.381853 0.381853 +v -0.868138 0.472983 0.376907 +v -0.788518 0.534713 0.355302 +v -0.708996 0.586812 0.337508 +v -0.880034 0.093330 0.473052 +v -0.916484 0.194397 0.491388 +v -0.890093 0.285757 0.480233 +v -0.843664 0.367042 0.460620 +v -0.790014 0.439322 0.439322 +v -0.743961 0.510866 0.425950 +v -0.679100 0.565492 0.408237 +v -0.791170 0.087639 0.532390 +v -0.808668 0.179327 0.543548 +v -0.774378 0.259583 0.523129 +v -0.746166 0.337379 0.507651 +v -0.703389 0.404042 0.484445 +v -0.668152 0.469926 0.469926 +v -0.630652 0.531538 0.460375 +v -0.704513 0.082764 0.581305 +v -0.700940 0.165075 0.578513 +v -0.674775 0.239839 0.558226 +v -0.643701 0.307863 0.534591 +v -0.614281 0.371045 0.513102 +v -0.583897 0.427547 0.493149 +v -0.555786 0.478948 0.478948 +v -0.839767 0.085830 -0.085830 +v -0.819009 0.084018 -0.169060 +v -0.766693 0.079561 -0.242189 +v -0.733625 0.077119 -0.315361 +v -0.711203 0.076324 -0.391250 +v -0.682083 0.075827 -0.464713 +v -0.632100 0.074196 -0.524339 +v -0.887868 0.181017 -0.090052 +v -0.856556 0.175674 -0.175674 +v -0.789746 0.164287 -0.248249 +v -0.735035 0.155496 -0.315628 +v -0.726250 0.156595 -0.398362 +v -0.691431 0.154508 -0.470339 +v -0.633296 0.149528 -0.525109 +v -0.878619 0.272056 -0.089711 +v -0.868952 0.269710 -0.178708 +v -0.790375 0.249120 -0.249120 +v -0.718126 0.230696 -0.309767 +v -0.707410 0.231327 -0.389678 +v -0.648527 0.219944 -0.443789 +v -0.622001 0.221910 -0.516341 +v -0.875843 0.367821 -0.090631 +v -0.826930 0.349941 -0.172881 +v -0.788331 0.336460 -0.250777 +v -0.720611 0.312792 -0.312792 +v -0.694432 0.306894 -0.385240 +v -0.623280 0.285374 -0.429129 +v -0.594017 0.285306 -0.494855 +v -0.844692 0.455928 -0.089770 +v -0.804579 0.436666 -0.172160 +v -0.754984 0.413260 -0.245502 +v -0.674243 0.375041 -0.298757 +v -0.658704 0.371190 -0.371190 +v -0.600595 0.348536 -0.417508 +v -0.558300 0.338922 -0.467854 +v -0.796176 0.535495 -0.088181 +v -0.765816 0.516789 -0.170255 +v -0.700449 0.476523 -0.236298 +v -0.664509 0.455473 -0.302822 +v -0.607335 0.421897 -0.352176 +v -0.557593 0.395893 -0.395893 +v -0.521189 0.383518 -0.441663 +v -0.719117 0.592794 -0.084492 +v -0.676123 0.558920 -0.159371 +v -0.637272 0.528461 -0.227099 +v -0.623045 0.518071 -0.298485 +v -0.566685 0.474632 -0.343734 +v -0.530232 0.449087 -0.389867 +v -0.498983 0.430849 -0.430849 +v -0.742165 -0.077467 -0.077468 +v -0.729732 -0.153558 -0.076197 +v -0.681632 -0.219490 -0.071847 +v -0.674637 -0.293601 -0.071516 +v -0.669918 -0.371246 -0.072166 +v -0.613873 -0.422396 -0.068442 +v -0.564393 -0.471076 -0.066185 +v -0.706510 -0.074162 -0.149526 +v -0.666460 -0.142047 -0.142047 +v -0.655851 -0.211969 -0.139910 +v -0.649497 -0.283688 -0.139314 +v -0.622276 -0.347518 -0.135935 +v -0.572137 -0.395845 -0.129254 +v -0.537493 -0.449474 -0.127509 +v -0.669647 -0.070760 -0.216292 +v -0.644630 -0.137867 -0.208929 +v -0.644360 -0.208624 -0.208624 +v -0.628250 -0.275594 -0.204989 +v -0.592560 -0.332747 -0.197108 +v -0.571160 -0.395014 -0.195575 +v -0.519054 -0.434633 -0.186937 +v -0.647930 -0.068978 -0.283750 +v -0.604471 -0.130796 -0.266876 +v -0.625088 -0.204085 -0.274392 +v -0.623883 -0.275106 -0.275106 +v -0.598929 -0.336999 -0.268402 +v -0.564431 -0.391525 -0.260470 +v -0.517039 -0.433290 -0.250356 +v -0.633613 -0.068509 -0.353656 +v -0.598752 -0.131260 -0.336015 +v -0.622408 -0.206001 -0.347542 +v -0.603090 -0.270079 -0.339101 +v -0.595564 -0.338428 -0.338429 +v -0.562713 -0.392840 -0.328081 +v -0.507196 -0.426549 -0.309599 +v -0.632025 -0.070407 -0.433657 +v -0.604967 -0.136204 -0.416346 +v -0.590615 -0.201703 -0.407279 +v -0.569827 -0.262753 -0.394974 +v -0.559410 -0.326297 -0.390689 +v -0.548081 -0.389524 -0.389524 +v -0.498457 -0.422999 -0.367557 +v -0.577102 -0.067688 -0.481074 +v -0.555774 -0.131710 -0.463907 +v -0.544496 -0.195580 -0.454826 +v -0.539632 -0.260614 -0.451359 +v -0.517269 -0.315379 -0.434691 +v -0.519983 -0.382671 -0.440673 +v -0.499489 -0.431277 -0.431278 +v 0.000000 0.000000 -0.683910 +v 0.071636 0.000000 -0.672007 +v 0.145470 0.000000 -0.681411 +v 0.224222 0.000000 -0.698032 +v 0.308736 0.000000 -0.714746 +v 0.373515 0.000000 -0.673850 +v 0.420111 0.000000 -0.609609 +v 0.469283 0.000000 -0.561810 +v 0.000000 -0.073737 -0.696719 +v 0.000000 -0.149358 -0.703948 +v 0.000000 -0.225188 -0.701673 +v 0.000000 -0.308404 -0.713844 +v 0.000000 -0.376435 -0.679898 +v 0.000000 -0.420675 -0.610520 +v 0.000000 -0.488086 -0.585743 +v -0.074579 0.000000 -0.706627 +v -0.143573 0.000000 -0.670412 +v -0.223122 0.000000 -0.693888 +v -0.303097 0.000000 -0.699393 +v -0.364327 0.000000 -0.654821 +v -0.415903 0.000000 -0.602809 +v -0.476701 0.000000 -0.571253 +v 0.000000 0.068800 -0.638653 +v 0.000000 0.130622 -0.595336 +v 0.000000 0.187247 -0.558694 +v 0.000000 0.250531 -0.556247 +v 0.000000 0.308098 -0.538364 +v 0.000000 0.378343 -0.542118 +v 0.000000 0.446932 -0.533361 +v 0.070093 0.070093 -0.656097 +v 0.142661 0.070698 -0.666975 +v 0.220323 0.072130 -0.684753 +v 0.303687 0.074113 -0.701978 +v 0.366518 0.071183 -0.660160 +v 0.423951 0.068713 -0.616379 +v 0.469439 0.065938 -0.562312 +v 0.066022 0.133392 -0.613599 +v 0.135848 0.135848 -0.631421 +v 0.215576 0.142333 -0.669161 +v 0.300070 0.147614 -0.693369 +v 0.363045 0.142244 -0.654027 +v 0.431730 0.141419 -0.629602 +v 0.464768 0.131961 -0.556864 +v 0.062905 0.193178 -0.583029 +v 0.133666 0.202676 -0.621555 +v 0.212800 0.212800 -0.659416 +v 0.294744 0.219395 -0.678615 +v 0.357112 0.211753 -0.641714 +v 0.408110 0.202117 -0.591932 +v 0.448741 0.192975 -0.536829 +v 0.061570 0.254986 -0.569955 +v 0.128353 0.262054 -0.591558 +v 0.204465 0.274897 -0.626417 +v 0.284244 0.284244 -0.647338 +v 0.345730 0.275368 -0.616214 +v 0.401987 0.267398 -0.580803 +v 0.429079 0.247966 -0.511774 +v 0.059661 0.311094 -0.545771 +v 0.123811 0.317681 -0.561260 +v 0.194997 0.329234 -0.585474 +v 0.260649 0.327283 -0.579695 +v 0.325122 0.325122 -0.569919 +v 0.379760 0.317234 -0.542626 +v 0.421748 0.306190 -0.501256 +v 0.062719 0.389601 -0.561012 +v 0.127395 0.390363 -0.563359 +v 0.191251 0.386360 -0.557433 +v 0.253162 0.380491 -0.547162 +v 0.311093 0.372354 -0.531253 +v 0.370652 0.370652 -0.519897 +v 0.413887 0.359765 -0.487359 +v 0.066546 0.473480 -0.567449 +v 0.133114 0.468729 -0.561882 +v 0.190445 0.442831 -0.529383 +v 0.247524 0.428301 -0.510801 +v 0.314985 0.434137 -0.516583 +v 0.367880 0.423376 -0.498917 +v 0.412162 0.412162 -0.476915 +v 0.073851 -0.073851 -0.699952 +v 0.076432 -0.154024 -0.732419 +v 0.077417 -0.235881 -0.743055 +v 0.078865 -0.322139 -0.752002 +v 0.075872 -0.389072 -0.706709 +v 0.071812 -0.441705 -0.644997 +v 0.068805 -0.488495 -0.586535 +v 0.152181 -0.075502 -0.721802 +v 0.162186 -0.162186 -0.780310 +v 0.166138 -0.251002 -0.799909 +v 0.165418 -0.335210 -0.787478 +v 0.155196 -0.394917 -0.719204 +v 0.142318 -0.434382 -0.633851 +v 0.133239 -0.469158 -0.562426 +v 0.233563 -0.076629 -0.734368 +v 0.237953 -0.157369 -0.751748 +v 0.244436 -0.244435 -0.773483 +v 0.243062 -0.326205 -0.761360 +v 0.233840 -0.393857 -0.715841 +v 0.211762 -0.427413 -0.622551 +v 0.197392 -0.459060 -0.549830 +v 0.315508 -0.077157 -0.734025 +v 0.320310 -0.157868 -0.747574 +v 0.321093 -0.239216 -0.747914 +v 0.316824 -0.316823 -0.730959 +v 0.304973 -0.382831 -0.689664 +v 0.278346 -0.418517 -0.606672 +v 0.261848 -0.453533 -0.542350 +v 0.379787 -0.073941 -0.687546 +v 0.384590 -0.150999 -0.698085 +v 0.389399 -0.231160 -0.706848 +v 0.378016 -0.301131 -0.680132 +v 0.366062 -0.366061 -0.648820 +v 0.340945 -0.408354 -0.586537 +v 0.320072 -0.441301 -0.525448 +v 0.423993 -0.068720 -0.616446 +v 0.422584 -0.138318 -0.614957 +v 0.409073 -0.202599 -0.593461 +v 0.420926 -0.279942 -0.610442 +v 0.419946 -0.350557 -0.604338 +v 0.399416 -0.399416 -0.562854 +v 0.381859 -0.439724 -0.518827 +v 0.473953 -0.066617 -0.568050 +v 0.466773 -0.132545 -0.559403 +v 0.444987 -0.191368 -0.532099 +v 0.456016 -0.263258 -0.545455 +v 0.451483 -0.327300 -0.538045 +v 0.434621 -0.377495 -0.512612 +v 0.417477 -0.417477 -0.483192 +v -0.072240 -0.072240 -0.681158 +v -0.139649 -0.069179 -0.649635 +v -0.212519 -0.069478 -0.655509 +v -0.287141 -0.069852 -0.657124 +v -0.344685 -0.066644 -0.615100 +v -0.386451 -0.062169 -0.555935 +v -0.446306 -0.062459 -0.532907 +v -0.071736 -0.144718 -0.678825 +v -0.143869 -0.143870 -0.676765 +v -0.208407 -0.137517 -0.642705 +v -0.279739 -0.137313 -0.638922 +v -0.334543 -0.130663 -0.595743 +v -0.383666 -0.125125 -0.552634 +v -0.446908 -0.126762 -0.534243 +v -0.071816 -0.219400 -0.681295 +v -0.140151 -0.212328 -0.657175 +v -0.206753 -0.206754 -0.637615 +v -0.260956 -0.193978 -0.589752 +v -0.335934 -0.199024 -0.598991 +v -0.398433 -0.197283 -0.576584 +v -0.444620 -0.191211 -0.531636 +v -0.070747 -0.290620 -0.666554 +v -0.136703 -0.278535 -0.635696 +v -0.208779 -0.280632 -0.641501 +v -0.273258 -0.273258 -0.619140 +v -0.330944 -0.263570 -0.586942 +v -0.384596 -0.255881 -0.553587 +v -0.429157 -0.248010 -0.511872 +v -0.071479 -0.367945 -0.663105 +v -0.140932 -0.359815 -0.647423 +v -0.210722 -0.355396 -0.638253 +v -0.274374 -0.344484 -0.613748 +v -0.320596 -0.320597 -0.561198 +v -0.375386 -0.313608 -0.535910 +v -0.428671 -0.311105 -0.509821 +v -0.067506 -0.417032 -0.605227 +v -0.138405 -0.422839 -0.615366 +v -0.206377 -0.416635 -0.605455 +v -0.268862 -0.404198 -0.584263 +v -0.323693 -0.387549 -0.554588 +v -0.377441 -0.377441 -0.530038 +v -0.429558 -0.373167 -0.506447 +v -0.066384 -0.472401 -0.566077 +v -0.127945 -0.450973 -0.539391 +v -0.195886 -0.455543 -0.545399 +v -0.258111 -0.446951 -0.534120 +v -0.321578 -0.443423 -0.528073 +v -0.381471 -0.439270 -0.518275 +v -0.425699 -0.425699 -0.492901 +v -0.070747 0.070747 -0.663730 +v -0.065682 0.132720 -0.609729 +v -0.062443 0.191817 -0.577929 +v -0.061539 0.254865 -0.569627 +v -0.060158 0.313486 -0.550707 +v -0.059899 0.373445 -0.534970 +v -0.061247 0.438246 -0.522661 +v -0.142730 0.070733 -0.667378 +v -0.137663 0.137663 -0.641679 +v -0.131508 0.199465 -0.609704 +v -0.128699 0.262737 -0.593387 +v -0.126197 0.323554 -0.573271 +v -0.123648 0.379311 -0.545660 +v -0.125508 0.442604 -0.528790 +v -0.219976 0.072012 -0.683455 +v -0.217059 0.143331 -0.674639 +v -0.212574 0.212574 -0.658602 +v -0.215861 0.290046 -0.666261 +v -0.207747 0.350447 -0.628268 +v -0.196562 0.396991 -0.574297 +v -0.200072 0.465322 -0.557720 +v -0.301153 0.073460 -0.695109 +v -0.300480 0.147822 -0.694468 +v -0.302196 0.225001 -0.698216 +v -0.297768 0.297768 -0.682050 +v -0.283637 0.356093 -0.636730 +v -0.272405 0.409546 -0.592633 +v -0.256856 0.444740 -0.531356 +v -0.382363 0.074476 -0.692861 +v -0.393397 0.154578 -0.716096 +v -0.385651 0.228907 -0.699286 +v -0.373825 0.297787 -0.671835 +v -0.356215 0.356215 -0.629844 +v -0.333805 0.399743 -0.573314 +v -0.317456 0.437618 -0.520890 +v -0.444296 0.072264 -0.649173 +v -0.458858 0.150616 -0.673047 +v -0.456089 0.226089 -0.668038 +v -0.437696 0.291049 -0.636688 +v -0.410974 0.343118 -0.590561 +v -0.389032 0.389032 -0.547346 +v -0.371674 0.427813 -0.504321 +v -0.501536 0.070766 -0.603113 +v -0.519781 0.147977 -0.626548 +v -0.523549 0.224996 -0.631083 +v -0.493822 0.284719 -0.592725 +v -0.457169 0.331337 -0.545080 +v -0.434001 0.376965 -0.511857 +v -0.418627 0.418627 -0.484549 +v 0.469786 -0.469786 -0.425507 +v 0.497775 -0.497775 -0.389575 +v 0.525307 -0.525307 -0.341988 +v 0.558719 -0.558719 -0.288911 +v 0.593979 -0.593979 -0.228684 +v 0.619055 -0.619055 -0.158044 +v 0.624804 -0.624804 -0.079512 +v 0.645906 -0.645906 0.000000 +v 0.650285 -0.650285 0.082878 +v 0.674507 -0.674507 0.172219 +v 0.660022 -0.660022 0.253535 +v 0.625983 -0.625983 0.322582 +v 0.582156 -0.582156 0.377679 +v 0.531486 -0.531486 0.415187 +v 0.502581 -0.502581 0.454969 +v 0.413456 -0.456371 -0.456371 +v 0.359255 -0.457866 -0.457866 +v 0.310994 -0.475941 -0.475941 +v 0.253625 -0.488227 -0.488227 +v 0.195415 -0.505562 -0.505562 +v 0.132571 -0.519398 -0.519398 +v 0.067158 -0.531269 -0.531269 +v 0.000000 -0.537533 -0.537533 +v -0.066316 -0.524894 -0.524894 +v -0.128942 -0.505205 -0.505205 +v -0.193463 -0.500377 -0.500377 +v -0.259573 -0.500110 -0.500110 +v -0.321072 -0.491993 -0.491993 +v -0.372531 -0.475340 -0.475340 +v -0.413571 -0.456500 -0.456500 +v 0.444410 -0.402710 -0.444410 +v 0.450911 -0.353972 -0.450911 +v 0.474624 -0.310167 -0.474624 +v 0.485320 -0.252170 -0.485319 +v 0.492422 -0.190470 -0.492422 +v 0.500859 -0.127832 -0.500859 +v 0.520471 -0.065732 -0.520471 +v 0.502755 0.000000 -0.502755 +v 0.495896 0.062486 -0.495895 +v 0.472700 0.120634 -0.472700 +v 0.455670 0.176641 -0.455669 +v 0.452222 0.235602 -0.452221 +v 0.452959 0.296565 -0.452959 +v 0.452067 0.354850 -0.452067 +v 0.438299 0.397221 -0.438299 +v 0.460068 -0.508258 0.508258 +v 0.409387 -0.523852 0.523852 +v 0.350361 -0.538645 0.538645 +v 0.278528 -0.537977 0.537977 +v 0.205689 -0.532869 0.532869 +v 0.135166 -0.529553 0.529553 +v 0.065139 -0.515983 0.515983 +v -0.000000 -0.505662 0.505662 +v -0.066087 -0.523161 0.523161 +v -0.132389 -0.518689 0.518688 +v -0.189241 -0.489157 0.489157 +v -0.242771 -0.466544 0.466544 +v -0.302961 -0.463146 0.463146 +v -0.355978 -0.453553 0.453552 +v -0.396408 -0.437394 0.437394 +v 0.494825 -0.448001 0.494825 +v 0.519761 -0.406278 0.519761 +v 0.539479 -0.350885 0.539479 +v 0.585233 -0.302184 0.585234 +v 0.637295 -0.244983 0.637295 +v 0.660061 -0.168526 0.660062 +v 0.651534 -0.083043 0.651535 +v 0.646628 0.000000 0.646628 +v 0.616479 0.078413 0.616480 +v 0.574810 0.146735 0.574811 +v 0.536195 0.206941 0.536195 +v 0.515816 0.267435 0.515816 +v 0.495640 0.323362 0.495641 +v 0.467014 0.366206 0.467015 +v 0.458759 0.415601 0.458760 +v -0.431663 -0.431663 0.391259 +v -0.453768 -0.453768 0.356142 +v -0.475731 -0.475731 0.310861 +v -0.482986 -0.482986 0.251001 +v -0.487291 -0.487291 0.188539 +v -0.477422 -0.477422 0.121841 +v -0.508957 -0.508957 0.064211 +v -0.537841 -0.537841 -0.000000 +v -0.539220 -0.539220 -0.068208 +v -0.509914 -0.509914 -0.130146 +v -0.499414 -0.499414 -0.193101 +v -0.504945 -0.504945 -0.261994 +v -0.482887 -0.482887 -0.315355 +v -0.466635 -0.466635 -0.365918 +v -0.457889 -0.457889 -0.414819 +v -0.459008 -0.415824 0.459008 +v -0.491534 -0.384834 0.491534 +v -0.540896 -0.351775 0.540896 +v -0.603029 -0.311092 0.603028 +v -0.637914 -0.245216 0.637914 +v -0.657241 -0.167805 0.657240 +v -0.651296 -0.083011 0.651296 +v -0.621671 0.000000 0.621671 +v -0.595224 0.075605 0.595224 +v -0.600101 0.153199 0.600101 +v -0.599552 0.230781 0.599552 +v -0.583963 0.301548 0.583963 +v -0.553766 0.359855 0.553765 +v -0.524333 0.409752 0.524333 +v -0.510568 0.462143 0.510568 +v -0.468974 -0.424777 -0.468974 +v -0.474124 -0.371607 -0.474124 +v -0.486192 -0.317430 -0.486193 +v -0.493977 -0.256504 -0.493977 +v -0.489601 -0.189409 -0.489601 +v -0.494698 -0.126257 -0.494699 +v -0.501830 -0.063270 -0.501830 +v -0.533202 0.000000 -0.533202 +v -0.562916 0.071338 -0.562916 +v -0.567759 0.144932 -0.567759 +v -0.565090 0.217814 -0.565090 +v -0.559337 0.289221 -0.559337 +v -0.528640 0.344080 -0.528641 +v -0.486940 0.381343 -0.486940 +v -0.467032 0.423033 -0.467032 +v 0.463112 0.463112 -0.419511 +v 0.504684 0.504683 -0.394823 +v 0.557003 0.557003 -0.361887 +v 0.600561 0.600561 -0.309856 +v 0.644218 0.644218 -0.247588 +v 0.645581 0.645581 -0.164824 +v 0.651007 0.651007 -0.082973 +v 0.639504 0.639504 0.000000 +v 0.609349 0.609349 0.077471 +v 0.585981 0.585981 0.149590 +v 0.553649 0.553649 0.213509 +v 0.564851 0.564851 0.291981 +v 0.525373 0.525373 0.342029 +v 0.499069 0.499069 0.390559 +v 0.470120 0.470120 0.425807 +v 0.420056 0.463718 -0.463718 +v 0.375742 0.479567 -0.479567 +v 0.331783 0.509053 -0.509053 +v 0.269797 0.520533 -0.520533 +v 0.202725 0.524989 -0.524989 +v 0.141526 0.554432 -0.554432 +v 0.070925 0.559789 -0.559789 +v 0.000000 0.522928 -0.522928 +v -0.065182 0.516310 -0.516310 +v -0.128790 0.504610 -0.504610 +v -0.197062 0.509941 -0.509941 +v -0.254008 0.488992 -0.488992 +v -0.315502 0.483122 -0.483122 +v -0.372551 0.475367 -0.475367 +v -0.420158 0.463832 -0.463832 +v 0.431590 0.476558 0.476558 +v 0.382429 0.488369 0.488369 +v 0.328709 0.504158 0.504158 +v 0.284506 0.549919 0.549920 +v 0.221690 0.575392 0.575393 +v 0.143297 0.561361 0.561361 +v 0.069750 0.550899 0.550899 +v -0.000000 0.532720 0.532720 +v -0.066299 0.524763 0.524764 +v -0.128681 0.504179 0.504179 +v -0.191319 0.494678 0.494678 +v -0.254282 0.489540 0.489540 +v -0.339368 0.521134 0.521134 +v -0.398870 0.510009 0.510009 +v -0.455393 0.503053 0.503053 +v -0.518149 0.518149 0.468954 +v -0.561608 0.561608 0.438071 +v -0.588864 0.588864 0.381891 +v -0.629897 0.629897 0.324541 +v -0.667410 0.667410 0.256315 +v -0.711336 0.711336 0.181632 +v -0.707351 0.707351 0.090415 +v -0.676606 0.676606 -0.000000 +v -0.647236 0.647236 -0.082475 +v -0.590234 0.590234 -0.150677 +v -0.569499 0.569498 -0.219473 +v -0.537676 0.537676 -0.278378 +v -0.503936 0.503936 -0.328570 +v -0.490582 0.490582 -0.384111 +v -0.463776 0.463776 -0.420108 +v 0.444756 -0.444756 -0.444756 +v 0.481097 -0.481097 0.481097 +v -0.429571 -0.429571 0.429571 +v -0.444942 -0.444942 -0.444942 +v 0.441515 0.441515 -0.441515 +v 0.455183 0.455183 0.455184 +v -0.492104 0.492103 0.492103 +v -0.452886 0.452886 -0.452886 +vt 0.500000 0.500000 +vt 0.499936 0.479231 +vt 0.520706 0.479167 +vt 0.520770 0.499936 +vt 0.541476 0.479103 +vt 0.541539 0.499873 +vt 0.562245 0.479039 +vt 0.562309 0.499809 +vt 0.583015 0.478976 +vt 0.583079 0.499745 +vt 0.603784 0.478912 +vt 0.603848 0.499682 +vt 0.624554 0.478848 +vt 0.624618 0.499618 +vt 0.645324 0.478785 +vt 0.645387 0.499554 +vt 0.666093 0.478721 +vt 0.666157 0.499490 +vt 0.499873 0.458461 +vt 0.520642 0.458397 +vt 0.541412 0.458333 +vt 0.562181 0.458270 +vt 0.582951 0.458206 +vt 0.603721 0.458142 +vt 0.624490 0.458079 +vt 0.645260 0.458015 +vt 0.666030 0.457951 +vt 0.499809 0.437691 +vt 0.520579 0.437628 +vt 0.541348 0.437564 +vt 0.562118 0.437500 +vt 0.582887 0.437436 +vt 0.603657 0.437373 +vt 0.624427 0.437309 +vt 0.645196 0.437245 +vt 0.665966 0.437182 +vt 0.499745 0.416922 +vt 0.520515 0.416858 +vt 0.541284 0.416794 +vt 0.562054 0.416731 +vt 0.582824 0.416667 +vt 0.603593 0.416603 +vt 0.624363 0.416539 +vt 0.645132 0.416476 +vt 0.665902 0.416412 +vt 0.499681 0.396152 +vt 0.520451 0.396088 +vt 0.541221 0.396025 +vt 0.561990 0.395961 +vt 0.582760 0.395897 +vt 0.603530 0.395833 +vt 0.624299 0.395770 +vt 0.645069 0.395706 +vt 0.665838 0.395642 +vt 0.499618 0.375382 +vt 0.520387 0.375319 +vt 0.541157 0.375255 +vt 0.561927 0.375191 +vt 0.582696 0.375128 +vt 0.603466 0.375064 +vt 0.624235 0.375000 +vt 0.645005 0.374936 +vt 0.665775 0.374873 +vt 0.499554 0.354613 +vt 0.520324 0.354549 +vt 0.541093 0.354485 +vt 0.561863 0.354422 +vt 0.582632 0.354358 +vt 0.603402 0.354294 +vt 0.624172 0.354231 +vt 0.644941 0.354167 +vt 0.665711 0.354103 +vt 0.499490 0.333843 +vt 0.520260 0.333780 +vt 0.541030 0.333716 +vt 0.561799 0.333652 +vt 0.582569 0.333588 +vt 0.603338 0.333525 +vt 0.624108 0.333461 +vt 0.644878 0.333397 +vt 0.665647 0.333333 +vt 0.520833 0.520706 +vt 0.500064 0.520770 +vt 0.520897 0.541476 +vt 0.500127 0.541539 +vt 0.520961 0.562245 +vt 0.500191 0.562309 +vt 0.521025 0.583015 +vt 0.500255 0.583079 +vt 0.521088 0.603785 +vt 0.500319 0.603848 +vt 0.521152 0.624554 +vt 0.500382 0.624618 +vt 0.521216 0.645324 +vt 0.500446 0.645387 +vt 0.521279 0.666093 +vt 0.500510 0.666157 +vt 0.541603 0.520642 +vt 0.541667 0.541412 +vt 0.541730 0.562182 +vt 0.541794 0.582951 +vt 0.541858 0.603721 +vt 0.541922 0.624490 +vt 0.541985 0.645260 +vt 0.542049 0.666030 +vt 0.562373 0.520579 +vt 0.562436 0.541348 +vt 0.562500 0.562118 +vt 0.562564 0.582887 +vt 0.562627 0.603657 +vt 0.562691 0.624427 +vt 0.562755 0.645196 +vt 0.562819 0.665966 +vt 0.583142 0.520515 +vt 0.583206 0.541285 +vt 0.583270 0.562054 +vt 0.583333 0.582824 +vt 0.583397 0.603593 +vt 0.583461 0.624363 +vt 0.583525 0.645133 +vt 0.583588 0.665902 +vt 0.603912 0.520451 +vt 0.603976 0.541221 +vt 0.604039 0.561990 +vt 0.604103 0.582760 +vt 0.604167 0.603530 +vt 0.604230 0.624299 +vt 0.604294 0.645069 +vt 0.604358 0.665839 +vt 0.624681 0.520387 +vt 0.624745 0.541157 +vt 0.624809 0.561927 +vt 0.624873 0.582696 +vt 0.624936 0.603466 +vt 0.625000 0.624236 +vt 0.625064 0.645005 +vt 0.625127 0.665775 +vt 0.645451 0.520324 +vt 0.645515 0.541093 +vt 0.645579 0.561863 +vt 0.645642 0.582633 +vt 0.645706 0.603402 +vt 0.645770 0.624172 +vt 0.645833 0.644941 +vt 0.645897 0.665711 +vt 0.666221 0.520260 +vt 0.666284 0.541030 +vt 0.666348 0.561799 +vt 0.666412 0.582569 +vt 0.666476 0.603338 +vt 0.666539 0.624108 +vt 0.666603 0.644878 +vt 0.666667 0.665647 +vt 0.479294 0.520833 +vt 0.479230 0.500064 +vt 0.458525 0.520897 +vt 0.458461 0.500128 +vt 0.437755 0.520961 +vt 0.437691 0.500191 +vt 0.416985 0.521025 +vt 0.416922 0.500255 +vt 0.396216 0.521088 +vt 0.396152 0.500319 +vt 0.375446 0.521152 +vt 0.375382 0.500382 +vt 0.354676 0.521216 +vt 0.354613 0.500446 +vt 0.333907 0.521280 +vt 0.333843 0.500510 +vt 0.479358 0.541603 +vt 0.458588 0.541667 +vt 0.437819 0.541731 +vt 0.417049 0.541794 +vt 0.396279 0.541858 +vt 0.375510 0.541922 +vt 0.354740 0.541985 +vt 0.333971 0.542049 +vt 0.479422 0.562373 +vt 0.458652 0.562436 +vt 0.437882 0.562500 +vt 0.417113 0.562564 +vt 0.396343 0.562628 +vt 0.375574 0.562691 +vt 0.354804 0.562755 +vt 0.334034 0.562819 +vt 0.479485 0.583142 +vt 0.458716 0.583206 +vt 0.437946 0.583270 +vt 0.417176 0.583333 +vt 0.396407 0.583397 +vt 0.375637 0.583461 +vt 0.354868 0.583525 +vt 0.334098 0.583588 +vt 0.479549 0.603912 +vt 0.458779 0.603976 +vt 0.438010 0.604039 +vt 0.417240 0.604103 +vt 0.396471 0.604167 +vt 0.375701 0.604231 +vt 0.354931 0.604294 +vt 0.334162 0.604358 +vt 0.479613 0.624682 +vt 0.458843 0.624745 +vt 0.438074 0.624809 +vt 0.417304 0.624873 +vt 0.396534 0.624936 +vt 0.375765 0.625000 +vt 0.354995 0.625064 +vt 0.334225 0.625128 +vt 0.479676 0.645451 +vt 0.458907 0.645515 +vt 0.438137 0.645579 +vt 0.417368 0.645642 +vt 0.396598 0.645706 +vt 0.375828 0.645770 +vt 0.355059 0.645833 +vt 0.334289 0.645897 +vt 0.479740 0.666221 +vt 0.458971 0.666285 +vt 0.438201 0.666348 +vt 0.417431 0.666412 +vt 0.396662 0.666476 +vt 0.375892 0.666539 +vt 0.355123 0.666603 +vt 0.334353 0.666667 +vt 0.479167 0.479294 +vt 0.479103 0.458525 +vt 0.479039 0.437755 +vt 0.478976 0.416985 +vt 0.478912 0.396216 +vt 0.478848 0.375446 +vt 0.478784 0.354677 +vt 0.478721 0.333907 +vt 0.458397 0.479358 +vt 0.458333 0.458588 +vt 0.458270 0.437819 +vt 0.458206 0.417049 +vt 0.458142 0.396280 +vt 0.458079 0.375510 +vt 0.458015 0.354740 +vt 0.457951 0.333971 +vt 0.437627 0.479422 +vt 0.437564 0.458652 +vt 0.437500 0.437882 +vt 0.437436 0.417113 +vt 0.437373 0.396343 +vt 0.437309 0.375574 +vt 0.437245 0.354804 +vt 0.437181 0.334034 +vt 0.416858 0.479485 +vt 0.416794 0.458716 +vt 0.416730 0.437946 +vt 0.416667 0.417177 +vt 0.416603 0.396407 +vt 0.416539 0.375637 +vt 0.416476 0.354868 +vt 0.416412 0.334098 +vt 0.396088 0.479549 +vt 0.396025 0.458780 +vt 0.395961 0.438010 +vt 0.395897 0.417240 +vt 0.395833 0.396471 +vt 0.395770 0.375701 +vt 0.395706 0.354931 +vt 0.395642 0.334162 +vt 0.375319 0.479613 +vt 0.375255 0.458843 +vt 0.375191 0.438074 +vt 0.375127 0.417304 +vt 0.375064 0.396534 +vt 0.375000 0.375765 +vt 0.374936 0.354995 +vt 0.374873 0.334226 +vt 0.354549 0.479677 +vt 0.354485 0.458907 +vt 0.354422 0.438137 +vt 0.354358 0.417368 +vt 0.354294 0.396598 +vt 0.354230 0.375829 +vt 0.354167 0.355059 +vt 0.354103 0.334289 +vt 0.333779 0.479740 +vt 0.333716 0.458971 +vt 0.333652 0.438201 +vt 0.333588 0.417431 +vt 0.333525 0.396662 +vt 0.333461 0.375892 +vt 0.333397 0.355123 +vt 0.333333 0.334353 +vt 0.833333 0.500000 +vt 0.833397 0.479230 +vt 0.854167 0.479294 +vt 0.854103 0.500064 +vt 0.874936 0.479358 +vt 0.874873 0.500127 +vt 0.895706 0.479422 +vt 0.895642 0.500191 +vt 0.916475 0.479485 +vt 0.916412 0.500255 +vt 0.937245 0.479549 +vt 0.937181 0.500319 +vt 0.958015 0.479613 +vt 0.957951 0.500382 +vt 0.978784 0.479676 +vt 0.978721 0.500446 +vt 0.999554 0.479740 +vt 0.999490 0.500510 +vt 0.833461 0.458461 +vt 0.854230 0.458525 +vt 0.875000 0.458588 +vt 0.895770 0.458652 +vt 0.916539 0.458716 +vt 0.937309 0.458779 +vt 0.958078 0.458843 +vt 0.978848 0.458907 +vt 0.999618 0.458971 +vt 0.833524 0.437691 +vt 0.854294 0.437755 +vt 0.875064 0.437819 +vt 0.895833 0.437882 +vt 0.916603 0.437946 +vt 0.937373 0.438010 +vt 0.958142 0.438073 +vt 0.978912 0.438137 +vt 0.999681 0.438201 +vt 0.833588 0.416922 +vt 0.854358 0.416985 +vt 0.875127 0.417049 +vt 0.895897 0.417113 +vt 0.916667 0.417176 +vt 0.937436 0.417240 +vt 0.958206 0.417304 +vt 0.978975 0.417368 +vt 0.999745 0.417431 +vt 0.833652 0.396152 +vt 0.854421 0.396216 +vt 0.875191 0.396279 +vt 0.895961 0.396343 +vt 0.916730 0.396407 +vt 0.937500 0.396471 +vt 0.958270 0.396534 +vt 0.979039 0.396598 +vt 0.999809 0.396662 +vt 0.833716 0.375382 +vt 0.854485 0.375446 +vt 0.875255 0.375510 +vt 0.896024 0.375574 +vt 0.916794 0.375637 +vt 0.937564 0.375701 +vt 0.958333 0.375765 +vt 0.979103 0.375828 +vt 0.999873 0.375892 +vt 0.833779 0.354613 +vt 0.854549 0.354676 +vt 0.875319 0.354740 +vt 0.896088 0.354804 +vt 0.916858 0.354868 +vt 0.937627 0.354931 +vt 0.958397 0.354995 +vt 0.979167 0.355059 +vt 0.999936 0.355122 +vt 0.833843 0.333843 +vt 0.854613 0.333907 +vt 0.875382 0.333971 +vt 0.896152 0.334034 +vt 0.916921 0.334098 +vt 0.937691 0.334162 +vt 0.958461 0.334225 +vt 0.979230 0.334289 +vt 1.000000 0.334353 +vt 0.854039 0.520833 +vt 0.833270 0.520770 +vt 0.853975 0.541603 +vt 0.833206 0.541539 +vt 0.853912 0.562373 +vt 0.833142 0.562309 +vt 0.853848 0.583142 +vt 0.833078 0.583079 +vt 0.853784 0.603912 +vt 0.833015 0.603848 +vt 0.853721 0.624681 +vt 0.832951 0.624618 +vt 0.853657 0.645451 +vt 0.832887 0.645387 +vt 0.853593 0.666221 +vt 0.832824 0.666157 +vt 0.874809 0.520897 +vt 0.874745 0.541667 +vt 0.874681 0.562436 +vt 0.874618 0.583206 +vt 0.874554 0.603976 +vt 0.874490 0.624745 +vt 0.874427 0.645515 +vt 0.874363 0.666284 +vt 0.895578 0.520961 +vt 0.895515 0.541730 +vt 0.895451 0.562500 +vt 0.895387 0.583270 +vt 0.895324 0.604039 +vt 0.895260 0.624809 +vt 0.895196 0.645579 +vt 0.895132 0.666348 +vt 0.916348 0.521025 +vt 0.916284 0.541794 +vt 0.916221 0.562564 +vt 0.916157 0.583333 +vt 0.916093 0.604103 +vt 0.916029 0.624873 +vt 0.915966 0.645642 +vt 0.915902 0.666412 +vt 0.937118 0.521088 +vt 0.937054 0.541858 +vt 0.936990 0.562627 +vt 0.936926 0.583397 +vt 0.936863 0.604167 +vt 0.936799 0.624936 +vt 0.936735 0.645706 +vt 0.936672 0.666476 +vt 0.957887 0.521152 +vt 0.957824 0.541922 +vt 0.957760 0.562691 +vt 0.957696 0.583461 +vt 0.957632 0.604230 +vt 0.957569 0.625000 +vt 0.957505 0.645770 +vt 0.957441 0.666539 +vt 0.978657 0.521216 +vt 0.978593 0.541985 +vt 0.978529 0.562755 +vt 0.978466 0.583525 +vt 0.978402 0.604294 +vt 0.978338 0.625064 +vt 0.978275 0.645833 +vt 0.978211 0.666603 +vt 0.999426 0.521279 +vt 0.999363 0.542049 +vt 0.999299 0.562819 +vt 0.999235 0.583588 +vt 0.999172 0.604358 +vt 0.999108 0.625127 +vt 0.999044 0.645897 +vt 0.998980 0.666667 +vt 0.812500 0.520706 +vt 0.812564 0.499936 +vt 0.791730 0.520642 +vt 0.791794 0.499873 +vt 0.770961 0.520579 +vt 0.771024 0.499809 +vt 0.750191 0.520515 +vt 0.750255 0.499745 +vt 0.729422 0.520451 +vt 0.729485 0.499682 +vt 0.708652 0.520387 +vt 0.708716 0.499618 +vt 0.687882 0.520324 +vt 0.687946 0.499554 +vt 0.667113 0.520260 +vt 0.667176 0.499490 +vt 0.812436 0.541476 +vt 0.791667 0.541412 +vt 0.770897 0.541348 +vt 0.750127 0.541284 +vt 0.729358 0.541221 +vt 0.708588 0.541157 +vt 0.687819 0.541093 +vt 0.667049 0.541030 +vt 0.812373 0.562245 +vt 0.791603 0.562181 +vt 0.770833 0.562118 +vt 0.750064 0.562054 +vt 0.729294 0.561990 +vt 0.708525 0.561927 +vt 0.687755 0.561863 +vt 0.666985 0.561799 +vt 0.812309 0.583015 +vt 0.791539 0.582951 +vt 0.770770 0.582887 +vt 0.750000 0.582824 +vt 0.729230 0.582760 +vt 0.708461 0.582696 +vt 0.687691 0.582632 +vt 0.666922 0.582569 +vt 0.812245 0.603784 +vt 0.791476 0.603721 +vt 0.770706 0.603657 +vt 0.749936 0.603593 +vt 0.729167 0.603530 +vt 0.708397 0.603466 +vt 0.687627 0.603402 +vt 0.666858 0.603338 +vt 0.812181 0.624554 +vt 0.791412 0.624490 +vt 0.770642 0.624427 +vt 0.749873 0.624363 +vt 0.729103 0.624299 +vt 0.708333 0.624235 +vt 0.687564 0.624172 +vt 0.666794 0.624108 +vt 0.812118 0.645324 +vt 0.791348 0.645260 +vt 0.770579 0.645196 +vt 0.749809 0.645132 +vt 0.729039 0.645069 +vt 0.708270 0.645005 +vt 0.687500 0.644941 +vt 0.666730 0.644878 +vt 0.812054 0.666093 +vt 0.791284 0.666030 +vt 0.770515 0.665966 +vt 0.749745 0.665902 +vt 0.728976 0.665838 +vt 0.708206 0.665775 +vt 0.687436 0.665711 +vt 0.812627 0.479167 +vt 0.812691 0.458397 +vt 0.812755 0.437627 +vt 0.812819 0.416858 +vt 0.812882 0.396088 +vt 0.812946 0.375319 +vt 0.813010 0.354549 +vt 0.813073 0.333779 +vt 0.791858 0.479103 +vt 0.791921 0.458333 +vt 0.791985 0.437564 +vt 0.792049 0.416794 +vt 0.792113 0.396025 +vt 0.792176 0.375255 +vt 0.792240 0.354485 +vt 0.792304 0.333716 +vt 0.771088 0.479039 +vt 0.771152 0.458270 +vt 0.771216 0.437500 +vt 0.771279 0.416730 +vt 0.771343 0.395961 +vt 0.771407 0.375191 +vt 0.771470 0.354422 +vt 0.771534 0.333652 +vt 0.750319 0.478976 +vt 0.750382 0.458206 +vt 0.750446 0.437436 +vt 0.750510 0.416667 +vt 0.750573 0.395897 +vt 0.750637 0.375128 +vt 0.750701 0.354358 +vt 0.750765 0.333588 +vt 0.729549 0.478912 +vt 0.729613 0.458142 +vt 0.729676 0.437373 +vt 0.729740 0.416603 +vt 0.729804 0.395833 +vt 0.729868 0.375064 +vt 0.729931 0.354294 +vt 0.729995 0.333525 +vt 0.708779 0.478848 +vt 0.708843 0.458079 +vt 0.708907 0.437309 +vt 0.708970 0.416539 +vt 0.709034 0.395770 +vt 0.709098 0.375000 +vt 0.709162 0.354231 +vt 0.709225 0.333461 +vt 0.688010 0.478784 +vt 0.688073 0.458015 +vt 0.688137 0.437245 +vt 0.688201 0.416476 +vt 0.688265 0.395706 +vt 0.688328 0.374936 +vt 0.688392 0.354167 +vt 0.688456 0.333397 +vt 0.667240 0.478721 +vt 0.667304 0.457951 +vt 0.667368 0.437182 +vt 0.667431 0.416412 +vt 0.667495 0.395642 +vt 0.667559 0.374873 +vt 0.667622 0.354103 +vt 0.667686 0.333333 +vt 0.833333 0.166667 +vt 0.833270 0.145897 +vt 0.854039 0.145833 +vt 0.854103 0.166603 +vt 0.874809 0.145770 +vt 0.874873 0.166539 +vt 0.895578 0.145706 +vt 0.895642 0.166476 +vt 0.916348 0.145642 +vt 0.916412 0.166412 +vt 0.937118 0.145578 +vt 0.937181 0.166348 +vt 0.957887 0.145515 +vt 0.957951 0.166284 +vt 0.978657 0.145451 +vt 0.978721 0.166221 +vt 0.999427 0.145387 +vt 0.999490 0.166157 +vt 0.833206 0.125127 +vt 0.853976 0.125064 +vt 0.874745 0.125000 +vt 0.895515 0.124936 +vt 0.916284 0.124873 +vt 0.937054 0.124809 +vt 0.957824 0.124745 +vt 0.978593 0.124681 +vt 0.999363 0.124618 +vt 0.833142 0.104358 +vt 0.853912 0.104294 +vt 0.874681 0.104230 +vt 0.895451 0.104167 +vt 0.916221 0.104103 +vt 0.936990 0.104039 +vt 0.957760 0.103976 +vt 0.978530 0.103912 +vt 0.999299 0.103848 +vt 0.833079 0.083588 +vt 0.853848 0.083524 +vt 0.874618 0.083461 +vt 0.895387 0.083397 +vt 0.916157 0.083333 +vt 0.936927 0.083270 +vt 0.957696 0.083206 +vt 0.978466 0.083142 +vt 0.999235 0.083078 +vt 0.833015 0.062819 +vt 0.853784 0.062755 +vt 0.874554 0.062691 +vt 0.895324 0.062627 +vt 0.916093 0.062564 +vt 0.936863 0.062500 +vt 0.957632 0.062436 +vt 0.978402 0.062373 +vt 0.999172 0.062309 +vt 0.832951 0.042049 +vt 0.853721 0.041985 +vt 0.874490 0.041922 +vt 0.895260 0.041858 +vt 0.916030 0.041794 +vt 0.936799 0.041730 +vt 0.957569 0.041667 +vt 0.978338 0.041603 +vt 0.999108 0.041539 +vt 0.832887 0.021279 +vt 0.853657 0.021216 +vt 0.874427 0.021152 +vt 0.895196 0.021088 +vt 0.915966 0.021024 +vt 0.936735 0.020961 +vt 0.957505 0.020897 +vt 0.978275 0.020833 +vt 0.999044 0.020770 +vt 0.832824 0.000510 +vt 0.853593 0.000446 +vt 0.874363 0.000382 +vt 0.895133 0.000319 +vt 0.915902 0.000255 +vt 0.936672 0.000191 +vt 0.957441 0.000127 +vt 0.978211 0.000064 +vt 0.998981 0.000000 +vt 0.854167 0.187373 +vt 0.833397 0.187436 +vt 0.854230 0.208142 +vt 0.833461 0.208206 +vt 0.854294 0.228912 +vt 0.833524 0.228976 +vt 0.854358 0.249681 +vt 0.833588 0.249745 +vt 0.854421 0.270451 +vt 0.833652 0.270515 +vt 0.854485 0.291221 +vt 0.833716 0.291284 +vt 0.854549 0.311990 +vt 0.833779 0.312054 +vt 0.854613 0.332760 +vt 0.833843 0.332824 +vt 0.874936 0.187309 +vt 0.875000 0.208078 +vt 0.875064 0.228848 +vt 0.875127 0.249618 +vt 0.875191 0.270387 +vt 0.875255 0.291157 +vt 0.875319 0.311927 +vt 0.875382 0.332696 +vt 0.895706 0.187245 +vt 0.895770 0.208015 +vt 0.895833 0.228784 +vt 0.895897 0.249554 +vt 0.895961 0.270324 +vt 0.896024 0.291093 +vt 0.896088 0.311863 +vt 0.896152 0.332632 +vt 0.916475 0.187181 +vt 0.916539 0.207951 +vt 0.916603 0.228721 +vt 0.916667 0.249490 +vt 0.916730 0.270260 +vt 0.916794 0.291030 +vt 0.916858 0.311799 +vt 0.916921 0.332569 +vt 0.937245 0.187118 +vt 0.937309 0.207887 +vt 0.937373 0.228657 +vt 0.937436 0.249427 +vt 0.937500 0.270196 +vt 0.937564 0.290966 +vt 0.937627 0.311735 +vt 0.937691 0.332505 +vt 0.958015 0.187054 +vt 0.958078 0.207824 +vt 0.958142 0.228593 +vt 0.958206 0.249363 +vt 0.958270 0.270132 +vt 0.958333 0.290902 +vt 0.958397 0.311672 +vt 0.958461 0.332441 +vt 0.978784 0.186990 +vt 0.978848 0.207760 +vt 0.978912 0.228529 +vt 0.978975 0.249299 +vt 0.979039 0.270069 +vt 0.979103 0.290838 +vt 0.979167 0.311608 +vt 0.979230 0.332378 +vt 0.999554 0.186927 +vt 0.999618 0.207696 +vt 0.999681 0.228466 +vt 0.999745 0.249235 +vt 0.999809 0.270005 +vt 0.999873 0.290775 +vt 0.999936 0.311544 +vt 1.000000 0.332314 +vt 0.812627 0.187500 +vt 0.812564 0.166730 +vt 0.791858 0.187564 +vt 0.791794 0.166794 +vt 0.771088 0.187627 +vt 0.771025 0.166858 +vt 0.750319 0.187691 +vt 0.750255 0.166922 +vt 0.729549 0.187755 +vt 0.729485 0.166985 +vt 0.708779 0.187819 +vt 0.708716 0.167049 +vt 0.688010 0.187882 +vt 0.687946 0.167113 +vt 0.667240 0.187946 +vt 0.667176 0.167176 +vt 0.812691 0.208270 +vt 0.791922 0.208333 +vt 0.771152 0.208397 +vt 0.750382 0.208461 +vt 0.729613 0.208525 +vt 0.708843 0.208588 +vt 0.688073 0.208652 +vt 0.667304 0.208716 +vt 0.812755 0.229039 +vt 0.791985 0.229103 +vt 0.771216 0.229167 +vt 0.750446 0.229230 +vt 0.729676 0.229294 +vt 0.708907 0.229358 +vt 0.688137 0.229422 +vt 0.667368 0.229485 +vt 0.812819 0.249809 +vt 0.792049 0.249873 +vt 0.771279 0.249936 +vt 0.750510 0.250000 +vt 0.729740 0.250064 +vt 0.708970 0.250128 +vt 0.688201 0.250191 +vt 0.667431 0.250255 +vt 0.812882 0.270579 +vt 0.792113 0.270642 +vt 0.771343 0.270706 +vt 0.750573 0.270770 +vt 0.729804 0.270833 +vt 0.709034 0.270897 +vt 0.688265 0.270961 +vt 0.667495 0.271025 +vt 0.812946 0.291348 +vt 0.792176 0.291412 +vt 0.771407 0.291476 +vt 0.750637 0.291539 +vt 0.729868 0.291603 +vt 0.709098 0.291667 +vt 0.688328 0.291730 +vt 0.667559 0.291794 +vt 0.813010 0.312118 +vt 0.792240 0.312182 +vt 0.771470 0.312245 +vt 0.750701 0.312309 +vt 0.729931 0.312373 +vt 0.709162 0.312436 +vt 0.688392 0.312500 +vt 0.667622 0.312564 +vt 0.813073 0.332887 +vt 0.792304 0.332951 +vt 0.771534 0.333015 +vt 0.750765 0.333079 +vt 0.729995 0.333142 +vt 0.709225 0.333206 +vt 0.688456 0.333270 +vt 0.812500 0.145961 +vt 0.812436 0.125191 +vt 0.812373 0.104422 +vt 0.812309 0.083652 +vt 0.812245 0.062882 +vt 0.812181 0.042113 +vt 0.812118 0.021343 +vt 0.812054 0.000573 +vt 0.791730 0.146025 +vt 0.791667 0.125255 +vt 0.791603 0.104485 +vt 0.791539 0.083716 +vt 0.791476 0.062946 +vt 0.791412 0.042176 +vt 0.791348 0.021407 +vt 0.791284 0.000637 +vt 0.770961 0.146088 +vt 0.770897 0.125319 +vt 0.770833 0.104549 +vt 0.770770 0.083779 +vt 0.770706 0.063010 +vt 0.770642 0.042240 +vt 0.770579 0.021470 +vt 0.770515 0.000701 +vt 0.750191 0.146152 +vt 0.750127 0.125382 +vt 0.750064 0.104613 +vt 0.750000 0.083843 +vt 0.749936 0.063073 +vt 0.749873 0.042304 +vt 0.749809 0.021534 +vt 0.749745 0.000765 +vt 0.729422 0.146216 +vt 0.729358 0.125446 +vt 0.729294 0.104676 +vt 0.729230 0.083907 +vt 0.729167 0.063137 +vt 0.729103 0.042368 +vt 0.729039 0.021598 +vt 0.728976 0.000828 +vt 0.708652 0.146279 +vt 0.708588 0.125510 +vt 0.708525 0.104740 +vt 0.708461 0.083971 +vt 0.708397 0.063201 +vt 0.708333 0.042431 +vt 0.708270 0.021662 +vt 0.708206 0.000892 +vt 0.687882 0.146343 +vt 0.687819 0.125573 +vt 0.687755 0.104804 +vt 0.687691 0.084034 +vt 0.687627 0.063265 +vt 0.687564 0.042495 +vt 0.687500 0.021725 +vt 0.687436 0.000956 +vt 0.667113 0.146407 +vt 0.667049 0.125637 +vt 0.666985 0.104868 +vt 0.666922 0.084098 +vt 0.666858 0.063328 +vt 0.666794 0.042559 +vt 0.666730 0.021789 +vt 0.666667 0.001019 +vt 0.500000 0.166667 +vt 0.500064 0.187436 +vt 0.479294 0.187500 +vt 0.479230 0.166730 +vt 0.458525 0.187564 +vt 0.458461 0.166794 +vt 0.437755 0.187627 +vt 0.437691 0.166858 +vt 0.416985 0.187691 +vt 0.416922 0.166922 +vt 0.396216 0.187755 +vt 0.396152 0.166985 +vt 0.375446 0.187819 +vt 0.375382 0.167049 +vt 0.354676 0.187882 +vt 0.354613 0.167113 +vt 0.333907 0.187946 +vt 0.333843 0.167176 +vt 0.500127 0.208206 +vt 0.479358 0.208270 +vt 0.458588 0.208333 +vt 0.437819 0.208397 +vt 0.417049 0.208461 +vt 0.396279 0.208525 +vt 0.375510 0.208588 +vt 0.354740 0.208652 +vt 0.333971 0.208716 +vt 0.500191 0.228976 +vt 0.479422 0.229039 +vt 0.458652 0.229103 +vt 0.437882 0.229167 +vt 0.417113 0.229230 +vt 0.396343 0.229294 +vt 0.375574 0.229358 +vt 0.354804 0.229422 +vt 0.334034 0.229485 +vt 0.500255 0.249745 +vt 0.479485 0.249809 +vt 0.458716 0.249873 +vt 0.437946 0.249936 +vt 0.417176 0.250000 +vt 0.396407 0.250064 +vt 0.375637 0.250128 +vt 0.354868 0.250191 +vt 0.334098 0.250255 +vt 0.500319 0.270515 +vt 0.479549 0.270579 +vt 0.458779 0.270642 +vt 0.438010 0.270706 +vt 0.417240 0.270770 +vt 0.396471 0.270833 +vt 0.375701 0.270897 +vt 0.354931 0.270961 +vt 0.334162 0.271025 +vt 0.500382 0.291284 +vt 0.479613 0.291348 +vt 0.458843 0.291412 +vt 0.438074 0.291476 +vt 0.417304 0.291539 +vt 0.396534 0.291603 +vt 0.375765 0.291667 +vt 0.354995 0.291730 +vt 0.334225 0.291794 +vt 0.500446 0.312054 +vt 0.479676 0.312118 +vt 0.458907 0.312182 +vt 0.438137 0.312245 +vt 0.417368 0.312309 +vt 0.396598 0.312373 +vt 0.375828 0.312436 +vt 0.355059 0.312500 +vt 0.334289 0.312564 +vt 0.500510 0.332824 +vt 0.479740 0.332887 +vt 0.458971 0.332951 +vt 0.438201 0.333015 +vt 0.417431 0.333079 +vt 0.396662 0.333142 +vt 0.375892 0.333206 +vt 0.355122 0.333270 +vt 0.334353 0.333333 +vt 0.479167 0.145961 +vt 0.499936 0.145897 +vt 0.479103 0.125191 +vt 0.499873 0.125127 +vt 0.479039 0.104422 +vt 0.499809 0.104358 +vt 0.478976 0.083652 +vt 0.499745 0.083588 +vt 0.478912 0.062882 +vt 0.499681 0.062819 +vt 0.478848 0.042113 +vt 0.499618 0.042049 +vt 0.478784 0.021343 +vt 0.499554 0.021279 +vt 0.478721 0.000573 +vt 0.499490 0.000510 +vt 0.458397 0.146025 +vt 0.458333 0.125255 +vt 0.458270 0.104485 +vt 0.458206 0.083716 +vt 0.458142 0.062946 +vt 0.458079 0.042176 +vt 0.458015 0.021407 +vt 0.457951 0.000637 +vt 0.437627 0.146088 +vt 0.437564 0.125319 +vt 0.437500 0.104549 +vt 0.437436 0.083779 +vt 0.437373 0.063010 +vt 0.437309 0.042240 +vt 0.437245 0.021471 +vt 0.437181 0.000701 +vt 0.416858 0.146152 +vt 0.416794 0.125382 +vt 0.416730 0.104613 +vt 0.416667 0.083843 +vt 0.416603 0.063073 +vt 0.416539 0.042304 +vt 0.416476 0.021534 +vt 0.416412 0.000765 +vt 0.396088 0.146216 +vt 0.396025 0.125446 +vt 0.395961 0.104676 +vt 0.395897 0.083907 +vt 0.395833 0.063137 +vt 0.395770 0.042368 +vt 0.395706 0.021598 +vt 0.395642 0.000828 +vt 0.375319 0.146279 +vt 0.375255 0.125510 +vt 0.375191 0.104740 +vt 0.375127 0.083971 +vt 0.375064 0.063201 +vt 0.375000 0.042431 +vt 0.374936 0.021662 +vt 0.374873 0.000892 +vt 0.354549 0.146343 +vt 0.354485 0.125574 +vt 0.354422 0.104804 +vt 0.354358 0.084034 +vt 0.354294 0.063265 +vt 0.354230 0.042495 +vt 0.354167 0.021725 +vt 0.354103 0.000956 +vt 0.333779 0.146407 +vt 0.333716 0.125637 +vt 0.333652 0.104868 +vt 0.333588 0.084098 +vt 0.333525 0.063328 +vt 0.333461 0.042559 +vt 0.333397 0.021789 +vt 0.333333 0.001020 +vt 0.520706 0.145833 +vt 0.520770 0.166603 +vt 0.541476 0.145770 +vt 0.541539 0.166539 +vt 0.562245 0.145706 +vt 0.562309 0.166476 +vt 0.583015 0.145642 +vt 0.583079 0.166412 +vt 0.603784 0.145579 +vt 0.603848 0.166348 +vt 0.624554 0.145515 +vt 0.624618 0.166284 +vt 0.645324 0.145451 +vt 0.645387 0.166221 +vt 0.666093 0.145387 +vt 0.666157 0.166157 +vt 0.520642 0.125064 +vt 0.541412 0.125000 +vt 0.562181 0.124936 +vt 0.582951 0.124873 +vt 0.603721 0.124809 +vt 0.624490 0.124745 +vt 0.645260 0.124681 +vt 0.666030 0.124618 +vt 0.520579 0.104294 +vt 0.541348 0.104230 +vt 0.562118 0.104167 +vt 0.582887 0.104103 +vt 0.603657 0.104039 +vt 0.624427 0.103976 +vt 0.645196 0.103912 +vt 0.665966 0.103848 +vt 0.520515 0.083525 +vt 0.541284 0.083461 +vt 0.562054 0.083397 +vt 0.582824 0.083333 +vt 0.603593 0.083270 +vt 0.624363 0.083206 +vt 0.645132 0.083142 +vt 0.665902 0.083078 +vt 0.520451 0.062755 +vt 0.541221 0.062691 +vt 0.561990 0.062627 +vt 0.582760 0.062564 +vt 0.603530 0.062500 +vt 0.624299 0.062436 +vt 0.645069 0.062373 +vt 0.665838 0.062309 +vt 0.520387 0.041985 +vt 0.541157 0.041922 +vt 0.561927 0.041858 +vt 0.582696 0.041794 +vt 0.603466 0.041730 +vt 0.624235 0.041667 +vt 0.645005 0.041603 +vt 0.665775 0.041539 +vt 0.520324 0.021216 +vt 0.541093 0.021152 +vt 0.561863 0.021088 +vt 0.582632 0.021024 +vt 0.603402 0.020961 +vt 0.624172 0.020897 +vt 0.644941 0.020833 +vt 0.665711 0.020770 +vt 0.520260 0.000446 +vt 0.541030 0.000382 +vt 0.561799 0.000319 +vt 0.582569 0.000255 +vt 0.603338 0.000191 +vt 0.624108 0.000127 +vt 0.644878 0.000064 +vt 0.665647 0.000000 +vt 0.520833 0.187373 +vt 0.520897 0.208142 +vt 0.520961 0.228912 +vt 0.521025 0.249681 +vt 0.521088 0.270451 +vt 0.521152 0.291221 +vt 0.521216 0.311990 +vt 0.521279 0.332760 +vt 0.541603 0.187309 +vt 0.541667 0.208079 +vt 0.541730 0.228848 +vt 0.541794 0.249618 +vt 0.541858 0.270387 +vt 0.541922 0.291157 +vt 0.541985 0.311927 +vt 0.542049 0.332696 +vt 0.562373 0.187245 +vt 0.562436 0.208015 +vt 0.562500 0.228784 +vt 0.562564 0.249554 +vt 0.562627 0.270324 +vt 0.562691 0.291093 +vt 0.562755 0.311863 +vt 0.562819 0.332633 +vt 0.583142 0.187181 +vt 0.583206 0.207951 +vt 0.583270 0.228721 +vt 0.583333 0.249490 +vt 0.583397 0.270260 +vt 0.583461 0.291030 +vt 0.583525 0.311799 +vt 0.583588 0.332569 +vt 0.603912 0.187118 +vt 0.603976 0.207887 +vt 0.604039 0.228657 +vt 0.604103 0.249427 +vt 0.604167 0.270196 +vt 0.604230 0.290966 +vt 0.604294 0.311735 +vt 0.604358 0.332505 +vt 0.624681 0.187054 +vt 0.624745 0.207824 +vt 0.624809 0.228593 +vt 0.624873 0.249363 +vt 0.624936 0.270133 +vt 0.625000 0.290902 +vt 0.625064 0.311672 +vt 0.625127 0.332441 +vt 0.645451 0.186990 +vt 0.645515 0.207760 +vt 0.645579 0.228530 +vt 0.645642 0.249299 +vt 0.645706 0.270069 +vt 0.645770 0.290838 +vt 0.645833 0.311608 +vt 0.645897 0.332378 +vt 0.666221 0.186927 +vt 0.666284 0.207696 +vt 0.666348 0.228466 +vt 0.666412 0.249235 +vt 0.666476 0.270005 +vt 0.666539 0.290775 +vt 0.666603 0.311544 +vt 0.666667 0.332314 +vt 0.166667 0.500000 +vt 0.166603 0.479231 +vt 0.187373 0.479167 +vt 0.187436 0.499936 +vt 0.208142 0.479103 +vt 0.208206 0.499873 +vt 0.228912 0.479039 +vt 0.228976 0.499809 +vt 0.249681 0.478976 +vt 0.249745 0.499745 +vt 0.270451 0.478912 +vt 0.270515 0.499682 +vt 0.291221 0.478848 +vt 0.291284 0.499618 +vt 0.311990 0.478785 +vt 0.312054 0.499554 +vt 0.332760 0.478721 +vt 0.332824 0.499490 +vt 0.166539 0.458461 +vt 0.187309 0.458397 +vt 0.208078 0.458333 +vt 0.228848 0.458270 +vt 0.249618 0.458206 +vt 0.270387 0.458142 +vt 0.291157 0.458079 +vt 0.311927 0.458015 +vt 0.332696 0.457951 +vt 0.166476 0.437691 +vt 0.187245 0.437628 +vt 0.208015 0.437564 +vt 0.228784 0.437500 +vt 0.249554 0.437436 +vt 0.270324 0.437373 +vt 0.291093 0.437309 +vt 0.311863 0.437245 +vt 0.332632 0.437182 +vt 0.166412 0.416922 +vt 0.187181 0.416858 +vt 0.207951 0.416794 +vt 0.228721 0.416731 +vt 0.249490 0.416667 +vt 0.270260 0.416603 +vt 0.291030 0.416539 +vt 0.311799 0.416476 +vt 0.332569 0.416412 +vt 0.166348 0.396152 +vt 0.187118 0.396088 +vt 0.207887 0.396025 +vt 0.228657 0.395961 +vt 0.249427 0.395897 +vt 0.270196 0.395833 +vt 0.290966 0.395770 +vt 0.311735 0.395706 +vt 0.332505 0.395642 +vt 0.166284 0.375382 +vt 0.187054 0.375319 +vt 0.207824 0.375255 +vt 0.228593 0.375191 +vt 0.249363 0.375128 +vt 0.270132 0.375064 +vt 0.290902 0.375000 +vt 0.311672 0.374936 +vt 0.332441 0.374873 +vt 0.166221 0.354613 +vt 0.186990 0.354549 +vt 0.207760 0.354485 +vt 0.228530 0.354422 +vt 0.249299 0.354358 +vt 0.270069 0.354294 +vt 0.290838 0.354231 +vt 0.311608 0.354167 +vt 0.332378 0.354103 +vt 0.166157 0.333843 +vt 0.186927 0.333780 +vt 0.207696 0.333716 +vt 0.228466 0.333652 +vt 0.249235 0.333588 +vt 0.270005 0.333525 +vt 0.290775 0.333461 +vt 0.311544 0.333397 +vt 0.332314 0.333333 +vt 0.187500 0.520706 +vt 0.166730 0.520770 +vt 0.187564 0.541476 +vt 0.166794 0.541539 +vt 0.187627 0.562245 +vt 0.166858 0.562309 +vt 0.187691 0.583015 +vt 0.166922 0.583079 +vt 0.187755 0.603785 +vt 0.166985 0.603848 +vt 0.187819 0.624554 +vt 0.167049 0.624618 +vt 0.187882 0.645324 +vt 0.167113 0.645387 +vt 0.187946 0.666093 +vt 0.167176 0.666157 +vt 0.208270 0.520642 +vt 0.208333 0.541412 +vt 0.208397 0.562182 +vt 0.208461 0.582951 +vt 0.208525 0.603721 +vt 0.208588 0.624490 +vt 0.208652 0.645260 +vt 0.208716 0.666030 +vt 0.229039 0.520579 +vt 0.229103 0.541348 +vt 0.229167 0.562118 +vt 0.229230 0.582887 +vt 0.229294 0.603657 +vt 0.229358 0.624427 +vt 0.229422 0.645196 +vt 0.229485 0.665966 +vt 0.249809 0.520515 +vt 0.249873 0.541285 +vt 0.249936 0.562054 +vt 0.250000 0.582824 +vt 0.250064 0.603593 +vt 0.250127 0.624363 +vt 0.250191 0.645133 +vt 0.250255 0.665902 +vt 0.270579 0.520451 +vt 0.270642 0.541221 +vt 0.270706 0.561990 +vt 0.270770 0.582760 +vt 0.270833 0.603530 +vt 0.270897 0.624299 +vt 0.270961 0.645069 +vt 0.271025 0.665839 +vt 0.291348 0.520387 +vt 0.291412 0.541157 +vt 0.291476 0.561927 +vt 0.291539 0.582696 +vt 0.291603 0.603466 +vt 0.291667 0.624236 +vt 0.291730 0.645005 +vt 0.291794 0.665775 +vt 0.312118 0.520324 +vt 0.312181 0.541093 +vt 0.312245 0.561863 +vt 0.312309 0.582633 +vt 0.312373 0.603402 +vt 0.312436 0.624172 +vt 0.312500 0.644941 +vt 0.312564 0.665711 +vt 0.332887 0.520260 +vt 0.332951 0.541030 +vt 0.333015 0.561799 +vt 0.333079 0.582569 +vt 0.333142 0.603338 +vt 0.333206 0.624108 +vt 0.333270 0.644878 +vt 0.333333 0.665647 +vt 0.145961 0.520833 +vt 0.145897 0.500064 +vt 0.125191 0.520897 +vt 0.125127 0.500128 +vt 0.104422 0.520961 +vt 0.104358 0.500191 +vt 0.083652 0.521025 +vt 0.083588 0.500255 +vt 0.062882 0.521088 +vt 0.062819 0.500319 +vt 0.042113 0.521152 +vt 0.042049 0.500382 +vt 0.021343 0.521216 +vt 0.021279 0.500446 +vt 0.000573 0.521280 +vt 0.000510 0.500510 +vt 0.146025 0.541603 +vt 0.125255 0.541667 +vt 0.104485 0.541731 +vt 0.083716 0.541794 +vt 0.062946 0.541858 +vt 0.042176 0.541922 +vt 0.021407 0.541985 +vt 0.000637 0.542049 +vt 0.146088 0.562373 +vt 0.125319 0.562436 +vt 0.104549 0.562500 +vt 0.083779 0.562564 +vt 0.063010 0.562628 +vt 0.042240 0.562691 +vt 0.021471 0.562755 +vt 0.000701 0.562819 +vt 0.146152 0.583142 +vt 0.125382 0.583206 +vt 0.104613 0.583270 +vt 0.083843 0.583333 +vt 0.063074 0.583397 +vt 0.042304 0.583461 +vt 0.021534 0.583525 +vt 0.000765 0.583588 +vt 0.146216 0.603912 +vt 0.125446 0.603976 +vt 0.104676 0.604039 +vt 0.083907 0.604103 +vt 0.063137 0.604167 +vt 0.042368 0.604231 +vt 0.021598 0.604294 +vt 0.000828 0.604358 +vt 0.146279 0.624682 +vt 0.125510 0.624745 +vt 0.104740 0.624809 +vt 0.083971 0.624873 +vt 0.063201 0.624936 +vt 0.042431 0.625000 +vt 0.021662 0.625064 +vt 0.000892 0.625128 +vt 0.146343 0.645451 +vt 0.125574 0.645515 +vt 0.104804 0.645579 +vt 0.084034 0.645642 +vt 0.063265 0.645706 +vt 0.042495 0.645770 +vt 0.021725 0.645833 +vt 0.000956 0.645897 +vt 0.146407 0.666221 +vt 0.125637 0.666285 +vt 0.104868 0.666348 +vt 0.084098 0.666412 +vt 0.063328 0.666476 +vt 0.042559 0.666539 +vt 0.021789 0.666603 +vt 0.001020 0.666667 +vt 0.145833 0.479294 +vt 0.145770 0.458525 +vt 0.145706 0.437755 +vt 0.145642 0.416985 +vt 0.145578 0.396216 +vt 0.145515 0.375446 +vt 0.145451 0.354677 +vt 0.145387 0.333907 +vt 0.125064 0.479358 +vt 0.125000 0.458588 +vt 0.124936 0.437819 +vt 0.124873 0.417049 +vt 0.124809 0.396280 +vt 0.124745 0.375510 +vt 0.124681 0.354740 +vt 0.124618 0.333971 +vt 0.104294 0.479422 +vt 0.104230 0.458652 +vt 0.104167 0.437882 +vt 0.104103 0.417113 +vt 0.104039 0.396343 +vt 0.103976 0.375574 +vt 0.103912 0.354804 +vt 0.103848 0.334034 +vt 0.083525 0.479485 +vt 0.083461 0.458716 +vt 0.083397 0.437946 +vt 0.083333 0.417177 +vt 0.083270 0.396407 +vt 0.083206 0.375637 +vt 0.083142 0.354868 +vt 0.083078 0.334098 +vt 0.062755 0.479549 +vt 0.062691 0.458780 +vt 0.062627 0.438010 +vt 0.062564 0.417240 +vt 0.062500 0.396471 +vt 0.062436 0.375701 +vt 0.062373 0.354931 +vt 0.062309 0.334162 +vt 0.041985 0.479613 +vt 0.041922 0.458843 +vt 0.041858 0.438074 +vt 0.041794 0.417304 +vt 0.041730 0.396534 +vt 0.041667 0.375765 +vt 0.041603 0.354995 +vt 0.041539 0.334226 +vt 0.021216 0.479677 +vt 0.021152 0.458907 +vt 0.021088 0.438137 +vt 0.021025 0.417368 +vt 0.020961 0.396598 +vt 0.020897 0.375829 +vt 0.020833 0.355059 +vt 0.020770 0.334289 +vt 0.000446 0.479740 +vt 0.000382 0.458971 +vt 0.000319 0.438201 +vt 0.000255 0.417431 +vt 0.000191 0.396662 +vt 0.000127 0.375892 +vt 0.000064 0.355123 +vt 0.000000 0.334353 +vt 0.166667 0.166667 +vt 0.166603 0.145897 +vt 0.187373 0.145833 +vt 0.187436 0.166603 +vt 0.208142 0.145770 +vt 0.208206 0.166539 +vt 0.228912 0.145706 +vt 0.228976 0.166476 +vt 0.249682 0.145642 +vt 0.249745 0.166412 +vt 0.270451 0.145579 +vt 0.270515 0.166348 +vt 0.291221 0.145515 +vt 0.291284 0.166284 +vt 0.311990 0.145451 +vt 0.312054 0.166221 +vt 0.332760 0.145387 +vt 0.332824 0.166157 +vt 0.166539 0.125128 +vt 0.187309 0.125064 +vt 0.208079 0.125000 +vt 0.228848 0.124936 +vt 0.249618 0.124873 +vt 0.270387 0.124809 +vt 0.291157 0.124745 +vt 0.311927 0.124681 +vt 0.332696 0.124618 +vt 0.166476 0.104358 +vt 0.187245 0.104294 +vt 0.208015 0.104230 +vt 0.228784 0.104167 +vt 0.249554 0.104103 +vt 0.270324 0.104039 +vt 0.291093 0.103976 +vt 0.311863 0.103912 +vt 0.332633 0.103848 +vt 0.166412 0.083588 +vt 0.187181 0.083525 +vt 0.207951 0.083461 +vt 0.228721 0.083397 +vt 0.249490 0.083333 +vt 0.270260 0.083270 +vt 0.291030 0.083206 +vt 0.311799 0.083142 +vt 0.332569 0.083078 +vt 0.166348 0.062819 +vt 0.187118 0.062755 +vt 0.207887 0.062691 +vt 0.228657 0.062627 +vt 0.249427 0.062564 +vt 0.270196 0.062500 +vt 0.290966 0.062436 +vt 0.311735 0.062373 +vt 0.332505 0.062309 +vt 0.166284 0.042049 +vt 0.187054 0.041985 +vt 0.207824 0.041922 +vt 0.228593 0.041858 +vt 0.249363 0.041794 +vt 0.270133 0.041730 +vt 0.290902 0.041667 +vt 0.311672 0.041603 +vt 0.332441 0.041539 +vt 0.166221 0.021279 +vt 0.186990 0.021216 +vt 0.207760 0.021152 +vt 0.228530 0.021088 +vt 0.249299 0.021025 +vt 0.270069 0.020961 +vt 0.290838 0.020897 +vt 0.311608 0.020833 +vt 0.332378 0.020770 +vt 0.166157 0.000510 +vt 0.186927 0.000446 +vt 0.207696 0.000382 +vt 0.228466 0.000319 +vt 0.249235 0.000255 +vt 0.270005 0.000191 +vt 0.290775 0.000127 +vt 0.311544 0.000064 +vt 0.332314 0.000000 +vt 0.187500 0.187373 +vt 0.166730 0.187436 +vt 0.187564 0.208142 +vt 0.166794 0.208206 +vt 0.187628 0.228912 +vt 0.166858 0.228976 +vt 0.187691 0.249681 +vt 0.166922 0.249745 +vt 0.187755 0.270451 +vt 0.166985 0.270515 +vt 0.187819 0.291221 +vt 0.167049 0.291284 +vt 0.187882 0.311990 +vt 0.167113 0.312054 +vt 0.187946 0.332760 +vt 0.167176 0.332824 +vt 0.208270 0.187309 +vt 0.208333 0.208079 +vt 0.208397 0.228848 +vt 0.208461 0.249618 +vt 0.208525 0.270387 +vt 0.208588 0.291157 +vt 0.208652 0.311927 +vt 0.208716 0.332696 +vt 0.229039 0.187245 +vt 0.229103 0.208015 +vt 0.229167 0.228784 +vt 0.229230 0.249554 +vt 0.229294 0.270324 +vt 0.229358 0.291093 +vt 0.229422 0.311863 +vt 0.229485 0.332633 +vt 0.249809 0.187181 +vt 0.249873 0.207951 +vt 0.249936 0.228721 +vt 0.250000 0.249490 +vt 0.250064 0.270260 +vt 0.250127 0.291030 +vt 0.250191 0.311799 +vt 0.250255 0.332569 +vt 0.270579 0.187118 +vt 0.270642 0.207887 +vt 0.270706 0.228657 +vt 0.270770 0.249427 +vt 0.270833 0.270196 +vt 0.270897 0.290966 +vt 0.270961 0.311735 +vt 0.271025 0.332505 +vt 0.291348 0.187054 +vt 0.291412 0.207824 +vt 0.291476 0.228593 +vt 0.291539 0.249363 +vt 0.291603 0.270133 +vt 0.291667 0.290902 +vt 0.291730 0.311672 +vt 0.291794 0.332441 +vt 0.312118 0.186990 +vt 0.312182 0.207760 +vt 0.312245 0.228530 +vt 0.312309 0.249299 +vt 0.312373 0.270069 +vt 0.312436 0.290838 +vt 0.312500 0.311608 +vt 0.312564 0.332378 +vt 0.332887 0.186927 +vt 0.332951 0.207696 +vt 0.333015 0.228466 +vt 0.333079 0.249235 +vt 0.333142 0.270005 +vt 0.333206 0.290775 +vt 0.333270 0.311544 +vt 0.333333 0.332314 +vt 0.145961 0.187500 +vt 0.145897 0.166730 +vt 0.125191 0.187564 +vt 0.125127 0.166794 +vt 0.104422 0.187628 +vt 0.104358 0.166858 +vt 0.083652 0.187691 +vt 0.083588 0.166922 +vt 0.062882 0.187755 +vt 0.062819 0.166985 +vt 0.042113 0.187819 +vt 0.042049 0.167049 +vt 0.021343 0.187882 +vt 0.021279 0.167113 +vt 0.000574 0.187946 +vt 0.000510 0.167177 +vt 0.146025 0.208270 +vt 0.125255 0.208333 +vt 0.104485 0.208397 +vt 0.083716 0.208461 +vt 0.062946 0.208525 +vt 0.042176 0.208588 +vt 0.021407 0.208652 +vt 0.000637 0.208716 +vt 0.146088 0.229039 +vt 0.125319 0.229103 +vt 0.104549 0.229167 +vt 0.083779 0.229230 +vt 0.063010 0.229294 +vt 0.042240 0.229358 +vt 0.021471 0.229422 +vt 0.000701 0.229485 +vt 0.146152 0.249809 +vt 0.125382 0.249873 +vt 0.104613 0.249936 +vt 0.083843 0.250000 +vt 0.063074 0.250064 +vt 0.042304 0.250128 +vt 0.021534 0.250191 +vt 0.000765 0.250255 +vt 0.146216 0.270579 +vt 0.125446 0.270642 +vt 0.104676 0.270706 +vt 0.083907 0.270770 +vt 0.063137 0.270833 +vt 0.042368 0.270897 +vt 0.021598 0.270961 +vt 0.000828 0.271025 +vt 0.146279 0.291348 +vt 0.125510 0.291412 +vt 0.104740 0.291476 +vt 0.083971 0.291539 +vt 0.063201 0.291603 +vt 0.042431 0.291667 +vt 0.021662 0.291731 +vt 0.000892 0.291794 +vt 0.146343 0.312118 +vt 0.125574 0.312182 +vt 0.104804 0.312245 +vt 0.084034 0.312309 +vt 0.063265 0.312373 +vt 0.042495 0.312436 +vt 0.021725 0.312500 +vt 0.000956 0.312564 +vt 0.146407 0.332887 +vt 0.125637 0.332951 +vt 0.104868 0.333015 +vt 0.084098 0.333079 +vt 0.063328 0.333142 +vt 0.042559 0.333206 +vt 0.021789 0.333270 +vt 0.001020 0.333333 +vt 0.145833 0.145961 +vt 0.145770 0.125191 +vt 0.145706 0.104422 +vt 0.145642 0.083652 +vt 0.145579 0.062882 +vt 0.145515 0.042113 +vt 0.145451 0.021343 +vt 0.145387 0.000574 +vt 0.125064 0.146025 +vt 0.125000 0.125255 +vt 0.124936 0.104485 +vt 0.124873 0.083716 +vt 0.124809 0.062946 +vt 0.124745 0.042176 +vt 0.124681 0.021407 +vt 0.124618 0.000637 +vt 0.104294 0.146088 +vt 0.104230 0.125319 +vt 0.104167 0.104549 +vt 0.104103 0.083779 +vt 0.104039 0.063010 +vt 0.103976 0.042240 +vt 0.103912 0.021471 +vt 0.103848 0.000701 +vt 0.083525 0.146152 +vt 0.083461 0.125382 +vt 0.083397 0.104613 +vt 0.083333 0.083843 +vt 0.083270 0.063074 +vt 0.083206 0.042304 +vt 0.083142 0.021534 +vt 0.083078 0.000765 +vt 0.062755 0.146216 +vt 0.062691 0.125446 +vt 0.062627 0.104677 +vt 0.062564 0.083907 +vt 0.062500 0.063137 +vt 0.062436 0.042368 +vt 0.062373 0.021598 +vt 0.062309 0.000828 +vt 0.041985 0.146279 +vt 0.041922 0.125510 +vt 0.041858 0.104740 +vt 0.041794 0.083971 +vt 0.041730 0.063201 +vt 0.041667 0.042431 +vt 0.041603 0.021662 +vt 0.041539 0.000892 +vt 0.021216 0.146343 +vt 0.021152 0.125574 +vt 0.021088 0.104804 +vt 0.021025 0.084034 +vt 0.020961 0.063265 +vt 0.020897 0.042495 +vt 0.020833 0.021725 +vt 0.020770 0.000956 +vt 0.000446 0.146407 +vt 0.000382 0.125637 +vt 0.000319 0.104868 +vt 0.000255 0.084098 +vt 0.000191 0.063328 +vt 0.000127 0.042559 +vt 0.000064 0.021789 +vt 0.000000 0.001020 +vn -0.215857 -0.976348 -0.011200 +vn -0.175634 -0.977111 -0.119846 +vn -0.053224 -0.976470 -0.208930 +vn -0.046419 -0.997742 0.048402 +vn 0.113407 -0.982147 -0.150060 +vn 0.188055 -0.979675 0.069552 +vn 0.078524 -0.996887 0.001434 +vn 0.175756 -0.979736 0.095737 +vn -0.104373 -0.988861 0.105869 +vn -0.029878 -0.984741 0.171300 +vn 0.017090 -0.999237 0.034791 +vn -0.083926 -0.966247 0.243507 +vn 0.467940 -0.865169 -0.180181 +vn 0.277810 -0.954344 0.109653 +vn 0.604114 -0.756340 -0.250923 +vn 0.549699 -0.825190 -0.129734 +vn 0.661763 -0.707785 -0.247078 +vn 0.666768 -0.711539 -0.221595 +vn 0.092929 -0.967223 -0.236183 +vn -0.016114 -0.899991 -0.435560 +vn -0.077242 -0.934416 -0.347697 +vn -0.097690 -0.986511 -0.131138 +vn -0.151250 -0.987884 -0.034242 +vn 0.228339 -0.955412 -0.187139 +vn 0.531724 -0.801080 -0.274789 +vn 0.566607 -0.787347 -0.242866 +vn 0.701773 -0.662740 -0.261238 +vn 0.341258 -0.924528 -0.169500 +vn 0.062227 -0.954924 -0.290139 +vn -0.198981 -0.924619 -0.324717 +vn -0.158330 -0.911222 -0.380230 +vn -0.086398 -0.866421 -0.491745 +vn 0.218390 -0.812342 -0.540727 +vn 0.440199 -0.772362 -0.457839 +vn 0.541124 -0.719413 -0.435377 +vn 0.681967 -0.521378 -0.512864 +vn 0.380261 -0.924009 -0.039247 +vn 0.120365 -0.991607 -0.047090 +vn -0.083834 -0.979858 -0.181188 +vn 0.051057 -0.889431 -0.454176 +vn 0.089511 -0.733177 -0.674093 +vn 0.057680 -0.692648 -0.718955 +vn 0.275979 -0.706504 -0.651631 +vn 0.527116 -0.576098 -0.624653 +vn 0.654195 -0.384564 -0.651204 +vn 0.307657 -0.929197 -0.204627 +vn 0.193365 -0.968291 -0.158055 +vn 0.139561 -0.946287 -0.291543 +vn 0.346324 -0.809412 -0.474197 +vn 0.330607 -0.635853 -0.697378 +vn 0.030030 -0.593219 -0.804468 +vn 0.086886 -0.628590 -0.772851 +vn 0.463332 -0.532914 -0.708029 +vn 0.695181 -0.331553 -0.637745 +vn 0.129765 -0.727256 -0.673940 +vn 0.205084 -0.806299 -0.554796 +vn 0.275246 -0.789148 -0.549058 +vn 0.511185 -0.631672 -0.582781 +vn 0.538560 -0.503098 -0.675863 +vn 0.185553 -0.509018 -0.840510 +vn -0.092624 -0.530381 -0.842647 +vn 0.272713 -0.506302 -0.818049 +vn 0.646992 -0.251259 -0.719871 +vn -0.033845 -0.516923 -0.855342 +vn 0.128086 -0.562090 -0.817072 +vn 0.290323 -0.575610 -0.764428 +vn 0.515488 -0.541581 -0.663991 +vn 0.589099 -0.597797 -0.543626 +vn 0.359935 -0.727836 -0.583667 +vn -0.002167 -0.720847 -0.693075 +vn 0.103092 -0.544359 -0.832484 +vn 0.569720 -0.146489 -0.808649 +vn -0.101474 -0.625751 -0.773370 +vn 0.150700 -0.604541 -0.782159 +vn 0.286019 -0.530198 -0.798151 +vn 0.366436 -0.576098 -0.730613 +vn 0.411908 -0.728629 -0.547166 +vn 0.333293 -0.857387 -0.392102 +vn 0.189642 -0.871761 -0.451674 +vn 0.327769 -0.633869 -0.700522 +vn 0.665212 -0.159124 -0.729453 +vn -0.046968 -0.943327 0.328440 +vn -0.127293 -0.947600 0.292978 +vn -0.061525 -0.933561 0.353038 +vn -0.108188 -0.918455 0.380383 +vn -0.084353 -0.950102 0.300241 +vn -0.231544 -0.889981 0.392773 +vn -0.125950 -0.929533 0.346507 +vn -0.399213 -0.819056 0.411969 +vn -0.132694 -0.984680 0.113010 +vn -0.456710 -0.884793 0.092105 +vn -0.074892 -0.915220 0.395856 +vn -0.397687 -0.876278 0.271920 +vn -0.057741 -0.555498 0.829493 +vn -0.247871 -0.614215 0.749168 +vn -0.169103 -0.610889 0.773431 +vn -0.071352 -0.584155 0.808466 +vn 0.111393 -0.964538 0.239235 +vn -0.021332 -0.943327 0.331156 +vn -0.003601 -0.942351 0.334574 +vn 0.099979 -0.922910 0.371746 +vn 0.176153 -0.970489 0.164586 +vn 0.225745 -0.873623 0.430982 +vn 0.116977 -0.635823 0.762902 +vn -0.060488 -0.730399 0.680319 +vn 0.135533 -0.985961 0.097476 +vn -0.044496 -0.983947 0.172735 +vn -0.154302 -0.914548 0.373821 +vn -0.047212 -0.871029 0.488907 +vn 0.138798 -0.946501 0.291238 +vn 0.222480 -0.900235 0.374218 +vn 0.080599 -0.787713 0.610736 +vn -0.017762 -0.769433 0.638447 +vn 0.054140 -0.996155 0.068667 +vn 0.020478 -0.999359 -0.028352 +vn -0.092563 -0.944670 0.314646 +vn -0.161229 -0.801202 0.576189 +vn -0.060762 -0.901364 0.428755 +vn 0.009491 -0.929685 0.368145 +vn 0.001709 -0.871670 0.490066 +vn -0.029695 -0.759606 0.649678 +vn 0.010468 -0.987548 0.156926 +vn 0.107150 -0.992462 -0.059114 +vn 0.099185 -0.966155 0.238075 +vn -0.028596 -0.820246 0.571245 +vn -0.068575 -0.848689 0.524400 +vn 0.039033 -0.883023 0.467666 +vn 0.137425 -0.863521 0.485214 +vn 0.113681 -0.799463 0.589801 +vn 0.035737 -0.982299 0.183752 +vn 0.036836 -0.998627 0.036775 +vn 0.066500 -0.978973 0.192816 +vn 0.004578 -0.871059 0.491134 +vn 0.001953 -0.808924 0.587848 +vn 0.077853 -0.814753 0.574511 +vn 0.187628 -0.805597 0.561937 +vn 0.288644 -0.804559 0.518967 +vn 0.355205 -0.934599 -0.018036 +vn 0.201941 -0.977966 0.052644 +vn 0.181677 -0.951323 0.248909 +vn 0.195532 -0.820338 0.537370 +vn 0.183142 -0.663533 0.725364 +vn 0.301950 -0.623066 0.721488 +vn 0.447310 -0.578936 0.681692 +vn 0.618793 -0.617725 0.485244 +vn 0.669607 -0.723624 -0.167150 +vn 0.630024 -0.776330 -0.018403 +vn 0.532640 -0.799921 0.276376 +vn 0.378521 -0.726066 0.574023 +vn 0.280435 -0.526566 0.802515 +vn 0.411634 -0.428236 0.804437 +vn 0.575274 -0.398206 0.714469 +vn 0.731101 -0.419294 0.538163 +vn -0.211249 -0.952666 0.218604 +vn -0.248573 -0.966460 -0.064241 +vn -0.253883 -0.948149 0.191046 +vn -0.238716 -0.969115 -0.061678 +vn -0.225929 -0.947478 0.226295 +vn -0.188452 -0.981109 -0.043611 +vn -0.269845 -0.910154 0.314249 +vn -0.181158 -0.983367 -0.011811 +vn -0.418744 -0.823206 0.383282 +vn -0.390088 -0.916807 0.085269 +vn -0.605121 -0.702536 0.374432 +vn -0.555162 -0.788079 0.265877 +vn -0.666677 -0.617908 0.416700 +vn -0.597339 -0.706320 0.379803 +vn -0.539384 -0.657949 0.525468 +vn -0.702109 -0.663106 0.259346 +vn -0.226630 -0.855190 0.466109 +vn -0.270058 -0.791559 0.548143 +vn -0.264901 -0.747154 0.609546 +vn -0.315744 -0.673421 0.668416 +vn -0.267708 -0.730094 0.628681 +vn -0.473434 -0.737388 0.481735 +vn -0.716056 -0.626118 0.308573 +vn -0.683828 -0.672231 0.283608 +vn -0.335582 -0.780663 0.527146 +vn -0.306833 -0.755791 0.578448 +vn -0.326456 -0.748314 0.577380 +vn -0.359935 -0.736167 0.573107 +vn -0.160741 -0.826197 0.539903 +vn -0.309549 -0.820795 0.480026 +vn -0.566088 -0.761315 0.316050 +vn -0.667653 -0.741325 0.068087 +vn -0.398175 -0.786279 0.472427 +vn -0.264748 -0.856014 0.443953 +vn -0.354961 -0.843013 0.404065 +vn -0.394910 -0.819819 0.414594 +vn -0.135533 -0.890957 0.433302 +vn -0.259804 -0.851039 0.456282 +vn -0.357830 -0.863308 0.355846 +vn -0.466323 -0.876370 0.120365 +vn -0.465926 -0.862789 0.196142 +vn -0.268807 -0.897305 0.350078 +vn -0.343303 -0.855251 0.388104 +vn -0.361675 -0.875729 0.319773 +vn -0.162053 -0.945036 0.283853 +vn -0.286081 -0.889187 0.357036 +vn -0.236274 -0.898007 0.371105 +vn -0.240272 -0.942320 0.232948 +vn -0.590533 -0.787378 0.176763 +vn -0.383740 -0.861507 0.332469 +vn -0.269509 -0.889920 0.367870 +vn -0.233070 -0.943571 0.235145 +vn -0.196326 -0.965819 0.169225 +vn -0.388745 -0.898221 0.205084 +vn -0.289193 -0.901944 0.320658 +vn -0.085116 -0.915128 0.394055 +vn -0.463179 -0.774499 0.430769 +vn -0.425581 -0.880520 0.208655 +vn -0.271157 -0.926145 0.262062 +vn -0.162053 -0.926420 0.339763 +vn -0.212745 -0.913572 0.346507 +vn -0.418195 -0.867824 0.268227 +vn -0.392560 -0.879727 0.268166 +vn -0.195013 -0.926389 0.322092 +vn -0.072970 -0.726127 0.683645 +vn -0.285470 -0.869076 0.403974 +vn -0.393048 -0.886807 0.242988 +vn -0.234718 -0.893307 0.383190 +vn -0.225288 -0.856410 0.464492 +vn -0.382397 -0.816950 0.431684 +vn -0.344707 -0.870327 0.351665 +vn -0.248115 -0.938078 0.241646 +vn -0.233009 -0.972442 -0.006439 +vn -0.126011 -0.991821 0.019776 +vn 0.005737 -0.999237 -0.037965 +vn 0.054903 -0.996307 -0.065798 +vn -0.014435 -0.929777 -0.367809 +vn -0.119510 -0.601642 -0.789758 +vn -0.215155 -0.441969 -0.870815 +vn -0.318796 -0.528489 -0.786767 +vn -0.213813 -0.976348 0.031831 +vn -0.208319 -0.974548 0.082736 +vn -0.296335 -0.954405 -0.035340 +vn -0.391858 -0.915342 -0.092593 +vn -0.426252 -0.820948 -0.379864 +vn -0.340465 -0.543260 -0.767418 +vn -0.239570 -0.423109 -0.873806 +vn -0.223701 -0.499130 -0.837123 +vn -0.106784 -0.988311 0.108615 +vn -0.012024 -0.996979 0.076418 +vn -0.080203 -0.981079 -0.176153 +vn -0.196692 -0.965331 -0.171453 +vn -0.263955 -0.876827 -0.401807 +vn -0.229621 -0.643757 -0.729942 +vn -0.131046 -0.504624 -0.853298 +vn -0.063478 -0.524400 -0.849055 +vn -0.181646 -0.968963 0.167608 +vn -0.229011 -0.970885 0.070101 +vn -0.129887 -0.975799 -0.175787 +vn -0.040773 -0.979064 -0.199286 +vn -0.111454 -0.853816 -0.508469 +vn -0.219520 -0.629810 -0.745048 +vn -0.239387 -0.555376 -0.796381 +vn -0.159856 -0.543382 -0.824091 +vn -0.398480 -0.914701 0.067232 +vn -0.529221 -0.847285 0.044862 +vn -0.507096 -0.861843 -0.004791 +vn -0.435011 -0.877743 -0.200659 +vn -0.444960 -0.659108 -0.606250 +vn -0.477126 -0.468947 -0.743248 +vn -0.446059 -0.566271 -0.693045 +vn -0.298135 -0.609027 -0.734947 +vn -0.483261 -0.875179 -0.021790 +vn -0.564592 -0.816401 -0.121036 +vn -0.683798 -0.729026 0.030274 +vn -0.765282 -0.608539 -0.209632 +vn -0.709769 -0.368542 -0.600299 +vn -0.662008 -0.418897 -0.621479 +vn -0.560930 -0.615192 -0.553911 +vn -0.439589 -0.662374 -0.606616 +vn -0.678243 -0.728996 -0.092166 +vn -0.749809 -0.598285 -0.282479 +vn -0.831935 -0.552141 -0.054292 +vn -0.849269 -0.458419 -0.261788 +vn -0.735466 -0.362682 -0.572314 +vn -0.685568 -0.562090 -0.462569 +vn -0.603748 -0.676473 -0.421674 +vn -0.493851 -0.689291 -0.530045 +vn -0.844539 -0.477065 -0.243080 +vn -0.874569 -0.329234 -0.355937 +vn -0.943602 -0.313700 -0.105655 +vn -0.916929 -0.332774 -0.220099 +vn -0.795556 -0.421216 -0.435469 +vn -0.700156 -0.653829 -0.286752 +vn -0.556291 -0.773186 -0.304392 +vn -0.400830 -0.768975 -0.497940 +vn -0.367809 0.928800 -0.044557 +vn -0.258736 0.963500 -0.068453 +vn -0.279397 0.929991 -0.238777 +vn -0.215522 0.967040 -0.135411 +vn -0.217078 0.913419 -0.344218 +vn -0.023774 0.974578 -0.222663 +vn -0.062441 0.961791 -0.266457 +vn 0.061373 0.983337 -0.170965 +vn -0.011078 0.963164 -0.268593 +vn 0.035005 0.939787 -0.339885 +vn -0.182836 0.900845 -0.393719 +vn -0.096377 0.798059 -0.594775 +vn -0.324320 0.734062 -0.596606 +vn -0.303446 0.609607 -0.732292 +vn -0.311686 0.403760 -0.860103 +vn -0.385754 0.380779 -0.840327 +vn -0.246620 0.160527 -0.955687 +vn -0.345164 0.179968 -0.921110 +vn -0.074801 0.993255 0.088473 +vn -0.215796 0.951109 -0.220923 +vn -0.228431 0.888028 -0.398968 +vn -0.134953 0.881100 -0.453230 +vn -0.020905 0.967864 -0.250557 +vn -0.012513 0.963134 -0.268624 +vn 0.042329 0.745964 -0.664602 +vn 0.150761 0.348918 -0.924924 +vn 0.232337 0.070284 -0.970061 +vn 0.147496 0.947264 0.284371 +vn 0.018921 0.989044 -0.146184 +vn -0.027619 0.894375 -0.446425 +vn -0.006897 0.829798 -0.557970 +vn 0.084170 0.936338 -0.340831 +vn 0.248207 0.914518 -0.319407 +vn 0.314371 0.633931 -0.706595 +vn 0.271279 0.230079 -0.934568 +vn 0.284646 -0.003021 -0.958617 +vn 0.386547 0.851161 0.355052 +vn 0.394299 0.915983 -0.073946 +vn 0.307840 0.843684 -0.439772 +vn 0.215918 0.802149 -0.556688 +vn 0.258400 0.831904 -0.491012 +vn 0.456801 0.755669 -0.469314 +vn 0.500381 0.572832 -0.649159 +vn 0.330576 0.295114 -0.896420 +vn 0.140599 0.003265 -0.990051 +vn 0.559771 0.762474 0.324381 +vn 0.588244 0.808649 0.001404 +vn 0.485031 0.805628 -0.340098 +vn 0.373333 0.779870 -0.502396 +vn 0.363720 0.727134 -0.582171 +vn 0.468734 0.602313 -0.646107 +vn 0.603565 0.497909 -0.622669 +vn 0.566088 0.258217 -0.782830 +vn 0.363231 0.037873 -0.930906 +vn 0.615802 0.729942 0.296548 +vn 0.613025 0.785913 0.080630 +vn 0.539232 0.809198 -0.233161 +vn 0.456740 0.751396 -0.476180 +vn 0.429334 0.648762 -0.628285 +vn 0.430036 0.512101 -0.743461 +vn 0.538102 0.389721 -0.747337 +vn 0.606647 0.221015 -0.763604 +vn 0.510483 0.132847 -0.849544 +vn 0.633168 0.714042 0.298685 +vn 0.658711 0.743065 0.117771 +vn 0.633106 0.760002 -0.146733 +vn 0.533219 0.718680 -0.446242 +vn 0.458296 0.578448 -0.674795 +vn 0.452742 0.423627 -0.784539 +vn 0.472518 0.251015 -0.844783 +vn 0.570238 0.187567 -0.799738 +vn 0.612232 0.149907 -0.776299 +vn 0.690909 0.655354 0.305124 +vn 0.746696 0.660146 0.081332 +vn 0.774316 0.621387 -0.119510 +vn 0.704947 0.602832 -0.373577 +vn 0.517319 0.482192 -0.706992 +vn 0.438490 0.282968 -0.852992 +vn 0.472762 0.084994 -0.877071 +vn 0.601245 0.041108 -0.797967 +vn 0.731010 0.020600 -0.681997 +vn -0.177801 0.983917 0.016327 +vn -0.294320 0.948943 0.113437 +vn -0.391247 0.920042 -0.019929 +vn -0.238807 0.962310 0.130039 +vn -0.671255 0.723289 -0.161962 +vn -0.480636 0.866665 -0.133457 +vn -0.589129 0.760491 -0.273049 +vn -0.478439 0.788018 -0.387402 +vn -0.189154 0.933866 -0.303385 +vn -0.173070 0.876309 -0.449538 +vn 0.035096 0.952757 -0.301645 +vn 0.023499 0.924589 -0.380169 +vn -0.013764 0.915586 -0.401807 +vn 0.014924 0.939451 -0.342296 +vn -0.236244 0.819758 -0.521683 +vn -0.272408 0.881191 -0.386334 +vn -0.148412 0.975005 -0.165258 +vn -0.520371 0.827021 -0.212622 +vn -0.691488 0.692068 -0.206977 +vn -0.614948 0.769555 -0.171911 +vn -0.252449 0.941984 -0.221076 +vn -0.022004 0.939329 -0.342265 +vn -0.107913 0.889523 -0.443922 +vn -0.239296 0.814142 -0.529008 +vn -0.191504 0.962737 -0.190832 +vn -0.566515 0.798120 -0.204962 +vn -0.666585 0.719810 -0.193701 +vn -0.618305 0.763634 -0.185766 +vn -0.410260 0.854427 -0.318766 +vn -0.138859 0.867397 -0.477767 +vn -0.102664 0.857784 -0.503586 +vn -0.237861 0.861934 -0.447737 +vn -0.183630 0.924863 -0.332926 +vn -0.571490 0.781854 -0.249062 +vn -0.634266 0.741569 -0.218482 +vn -0.612598 0.764122 -0.202002 +vn -0.563677 0.786370 -0.252663 +vn -0.309030 0.865291 -0.394604 +vn -0.117557 0.854030 -0.506699 +vn -0.129551 0.823664 -0.552049 +vn -0.135075 0.753075 -0.643910 +vn -0.496567 0.682333 -0.536454 +vn -0.636128 0.637226 -0.435011 +vn -0.567858 0.715232 -0.407361 +vn -0.531541 0.806879 -0.257546 +vn -0.423475 0.891018 -0.163366 +vn -0.305429 0.912992 -0.270363 +vn -0.245857 0.841975 -0.480209 +vn -0.170049 0.487930 -0.856136 +vn -0.365429 0.422498 -0.829402 +vn -0.484237 0.494369 -0.721854 +vn -0.419141 0.684103 -0.596881 +vn -0.339030 0.816706 -0.466872 +vn -0.374218 0.868007 -0.326365 +vn -0.460128 0.834376 -0.303415 +vn -0.464919 0.745079 -0.478195 +vn -0.232704 0.386151 -0.892575 +vn -0.255409 0.437819 -0.861995 +vn -0.292337 0.566057 -0.770745 +vn -0.297830 0.670095 -0.679861 +vn -0.245125 0.716971 -0.652547 +vn -0.265084 0.715262 -0.646565 +vn -0.451766 0.647694 -0.613483 +vn -0.551683 0.586932 -0.592547 +vn -0.171148 0.242378 -0.954955 +vn -0.027223 0.438337 -0.898373 +vn -0.144841 0.619068 -0.771844 +vn -0.295694 0.614978 -0.730949 +vn -0.221717 0.599475 -0.769036 +vn -0.279885 0.570574 -0.772057 +vn -0.379406 0.511307 -0.771081 +vn -0.512619 0.533433 -0.672750 +vn -0.364177 0.927335 0.085940 +vn -0.376965 0.912961 0.156041 +vn -0.264504 0.913114 0.310221 +vn -0.270974 0.852046 0.447829 +vn -0.089541 0.911039 0.402448 +vn -0.157262 0.841853 0.516221 +vn 0.088839 0.803156 0.589068 +vn -0.122257 0.748863 0.651326 +vn 0.119938 0.644704 0.754936 +vn -0.219214 0.705344 0.674093 +vn 0.018525 0.727348 0.685995 +vn -0.352855 0.749840 0.559648 +vn -0.111179 0.834132 0.540208 +vn -0.358806 0.799951 0.480911 +vn -0.163671 0.786248 0.595782 +vn -0.212989 0.663259 0.717429 +vn -0.131169 0.991028 0.024934 +vn -0.040895 0.984344 0.171270 +vn 0.067232 0.960509 0.269967 +vn 0.162053 0.883938 0.438581 +vn 0.212500 0.628224 0.748405 +vn 0.159795 0.604236 0.780602 +vn -0.035371 0.718131 0.694998 +vn -0.231300 0.744530 0.626209 +vn -0.157445 0.973907 -0.163396 +vn 0.046541 0.997803 0.046937 +vn 0.081942 0.964232 0.251961 +vn 0.023865 0.900754 0.433637 +vn 0.056032 0.692740 0.718986 +vn 0.125706 0.549425 0.826014 +vn 0.046083 0.561571 0.826106 +vn -0.157262 0.624409 0.765069 +vn -0.307047 0.869411 -0.387036 +vn -0.151494 0.983154 -0.102023 +vn -0.067934 0.950499 0.303110 +vn -0.102847 0.852657 0.512223 +vn -0.075930 0.754509 0.651845 +vn 0.108127 0.640370 0.760369 +vn 0.244819 0.513138 0.822626 +vn 0.153142 0.511002 0.845820 +vn -0.192297 0.870296 -0.453413 +vn -0.208777 0.960784 -0.182318 +vn -0.189123 0.936644 0.294748 +vn -0.176489 0.791253 0.585437 +vn -0.225349 0.749626 0.622272 +vn -0.165532 0.738853 0.653188 +vn -0.032533 0.593860 0.803888 +vn 0.146794 0.507981 0.848750 +vn -0.050752 0.924284 -0.378216 +vn -0.187475 0.979125 -0.078127 +vn -0.249184 0.925291 0.285806 +vn -0.198828 0.773278 0.602039 +vn -0.223273 0.716544 0.660787 +vn -0.302591 0.746910 0.592059 +vn -0.281564 0.592822 0.754479 +vn -0.177740 0.602130 0.778344 +vn -0.045961 0.961516 -0.270791 +vn -0.130406 0.987091 0.092868 +vn -0.252174 0.891873 0.375378 +vn -0.267098 0.753258 0.601032 +vn -0.199408 0.707633 0.677816 +vn -0.222694 0.739158 0.635639 +vn -0.252327 0.582904 0.772332 +vn -0.298074 0.645344 0.703330 +vn -0.358440 0.911740 -0.200537 +vn -0.386029 0.896847 0.215888 +vn -0.302286 0.809473 0.503311 +vn -0.266182 0.774651 0.573595 +vn -0.176550 0.780267 0.599963 +vn -0.110202 0.698874 0.706687 +vn -0.184027 0.531938 0.826533 +vn -0.356853 0.587542 0.726218 +vn -0.138676 0.948149 0.285867 +vn 0.096408 0.892087 0.441450 +vn 0.206091 0.840541 0.500992 +vn 0.355937 0.794855 0.491409 +vn 0.479934 0.743614 0.465468 +vn 0.530473 0.768090 0.358592 +vn 0.661061 0.686300 0.303140 +vn 0.707419 0.589709 0.389569 +vn -0.024262 0.835719 0.548601 +vn 0.142216 0.833003 0.534623 +vn 0.154485 0.859188 0.487716 +vn 0.391186 0.777337 0.492599 +vn 0.440168 0.720084 0.536363 +vn 0.386975 0.780511 0.490921 +vn 0.646321 0.615650 0.450758 +vn 0.728568 0.504654 0.463088 +vn 0.006439 0.824488 0.565813 +vn 0.067324 0.842067 0.535112 +vn 0.122868 0.859432 0.496231 +vn 0.442366 0.747185 0.495987 +vn 0.487777 0.703574 0.516739 +vn 0.304270 0.779412 0.547594 +vn 0.566912 0.685293 0.457076 +vn 0.783197 0.535295 0.316233 +vn -0.068361 0.807886 0.585315 +vn -0.011505 0.870571 0.491867 +vn 0.131443 0.864162 0.485702 +vn 0.429304 0.771020 0.470290 +vn 0.554033 0.703269 0.445418 +vn 0.334819 0.808374 0.484115 +vn 0.411054 0.789453 0.455794 +vn 0.753746 0.544725 0.367595 +vn -0.246681 0.805750 0.538408 +vn -0.088198 0.899045 0.428816 +vn 0.213813 0.867275 0.449568 +vn 0.434370 0.736839 0.518021 +vn 0.513443 0.709677 0.482345 +vn 0.386059 0.807031 0.446791 +vn 0.377544 0.738609 0.558428 +vn 0.635426 0.470779 0.611988 +vn -0.365734 0.801782 0.472610 +vn -0.173650 0.881008 0.440016 +vn 0.278390 0.870876 0.405011 +vn 0.549303 0.702933 0.451766 +vn 0.419691 0.731193 0.537736 +vn 0.355602 0.808435 0.468947 +vn 0.542070 0.672140 0.504318 +vn 0.659536 0.426832 0.618671 +vn -0.374248 0.755089 0.538255 +vn -0.231758 0.790643 0.566668 +vn 0.242470 0.817072 0.522996 +vn 0.675466 0.625263 0.390851 +vn 0.463515 0.665792 0.584643 +vn 0.276650 0.668111 0.690695 +vn 0.587451 0.483749 0.648732 +vn 0.704917 0.283151 0.650288 +vn -0.327036 0.514267 0.792779 +vn -0.279092 0.526597 0.802972 +vn 0.181860 0.572802 0.799249 +vn 0.673147 0.450087 0.586718 +vn 0.590014 0.489822 0.641804 +vn 0.353557 0.443678 0.823450 +vn 0.542314 0.238868 0.805475 +vn 0.708335 0.157750 0.687979 +vn 0.976928 0.173009 -0.125004 +vn 0.965117 0.150945 -0.213813 +vn 0.982482 0.026215 -0.184393 +vn 0.968902 0.193091 -0.154637 +vn 0.975707 0.015900 -0.218360 +vn 0.943876 0.208777 -0.255898 +vn 0.859859 0.072146 -0.505356 +vn 0.854152 0.170568 -0.491226 +vn 0.629810 0.083071 -0.772271 +vn 0.646687 0.089297 -0.757469 +vn 0.554826 0.039583 -0.830988 +vn 0.585955 0.063478 -0.807825 +vn 0.763329 -0.038148 -0.644826 +vn 0.768944 0.076113 -0.634724 +vn 0.933836 -0.061129 -0.352397 +vn 0.904996 0.133976 -0.403729 +vn 0.890011 -0.039644 -0.454176 +vn 0.885128 0.168004 -0.433912 +vn 0.927580 0.038514 -0.371563 +vn 0.944121 -0.150548 -0.293161 +vn 0.954863 -0.239875 -0.175146 +vn 0.836482 -0.233467 -0.495743 +vn 0.590167 -0.200110 -0.782037 +vn 0.534349 -0.157659 -0.830409 +vn 0.703513 -0.137547 -0.697226 +vn 0.893887 -0.204535 -0.398816 +vn 0.863857 -0.290780 -0.411237 +vn 0.899167 -0.000580 -0.437574 +vn 0.897305 -0.068117 -0.436079 +vn 0.922758 -0.251442 -0.291940 +vn 0.768700 -0.378857 -0.515275 +vn 0.505753 -0.382946 -0.773003 +vn 0.515244 -0.393902 -0.761132 +vn 0.705222 -0.321726 -0.631733 +vn 0.879208 -0.206793 -0.429151 +vn 0.884060 -0.164220 -0.437513 +vn 0.883785 -0.221503 -0.412091 +vn 0.799554 -0.205329 -0.564379 +vn 0.810480 -0.350566 -0.469222 +vn 0.696677 -0.419507 -0.581896 +vn 0.495041 -0.368938 -0.786615 +vn 0.563707 -0.388958 -0.728629 +vn 0.714866 -0.443617 -0.540513 +vn 0.881771 -0.352886 -0.312876 +vn 0.932890 -0.161229 -0.322031 +vn 0.844050 -0.445692 -0.298196 +vn 0.775994 -0.277963 -0.566179 +vn 0.847438 -0.211982 -0.486648 +vn 0.770623 -0.175298 -0.612690 +vn 0.605518 -0.144047 -0.782647 +vn 0.646809 -0.106113 -0.755211 +vn 0.768853 -0.200049 -0.607288 +vn 0.892453 -0.308481 -0.329142 +vn 0.937498 -0.309732 -0.158513 +vn 0.856044 -0.460219 -0.235267 +vn 0.852504 -0.291421 -0.433882 +vn 0.906400 -0.142827 -0.397473 +vn 0.817164 -0.039705 -0.574969 +vn 0.702597 0.034394 -0.710746 +vn 0.757897 0.106449 -0.643574 +vn 0.741325 0.152501 -0.653523 +vn 0.869808 -0.017640 -0.493057 +vn 0.929472 -0.289071 -0.229102 +vn 0.828455 -0.521531 -0.204047 +vn 0.828639 -0.471145 -0.302194 +vn 0.854610 -0.395825 -0.336039 +vn 0.783135 -0.271798 -0.559252 +vn 0.717673 -0.121128 -0.685751 +vn 0.789850 -0.029817 -0.612537 +vn 0.741600 0.046480 -0.669179 +vn 0.744743 0.060518 -0.664571 +vn 0.865230 -0.156743 -0.476180 +vn 0.979766 0.155614 -0.125584 +vn 0.972839 0.151891 -0.174535 +vn 0.996246 0.084933 -0.016327 +vn 0.966582 0.125980 -0.223121 +vn 0.996734 -0.075930 -0.026307 +vn 0.981964 -0.075991 -0.172979 +vn 0.988708 -0.080111 -0.126438 +vn 0.999725 0.009552 0.020783 +vn 0.960570 0.269173 -0.069430 +vn 0.911740 0.378582 0.159154 +vn 0.901608 0.429456 0.050996 +vn 0.867061 0.450942 0.211707 +vn 0.900571 0.430647 0.058779 +vn 0.860805 0.435408 0.263405 +vn 0.977050 0.045381 -0.208045 +vn 0.989319 0.016266 -0.144688 +vn 0.985351 0.019532 -0.169286 +vn 0.981140 -0.056185 -0.184851 +vn 0.972655 0.155187 -0.172643 +vn 0.903897 0.399426 -0.152928 +vn 0.894955 0.423780 -0.139348 +vn 0.906919 -0.060762 -0.416852 +vn 0.906156 0.050630 -0.419874 +vn 0.865993 0.083712 -0.492935 +vn 0.878140 -0.100345 -0.467757 +vn 0.921598 0.050539 -0.384808 +vn 0.895657 0.334819 -0.292611 +vn 0.858547 0.428236 -0.281930 +vn 0.673818 -0.092776 -0.732994 +vn 0.669576 0.104953 -0.735252 +vn 0.601886 0.123905 -0.788873 +vn 0.640309 -0.137913 -0.755608 +vn 0.702200 -0.112369 -0.703024 +vn 0.723441 0.186468 -0.664693 +vn 0.659322 0.373424 -0.652547 +vn 0.521134 0.030885 -0.852901 +vn 0.399030 0.144383 -0.905484 +vn 0.367138 0.142766 -0.919126 +vn 0.401929 -0.131169 -0.906186 +vn 0.426160 -0.184271 -0.885678 +vn 0.385540 0.009369 -0.922605 +vn 0.376049 0.139775 -0.915983 +vn 0.664388 0.256294 -0.702048 +vn 0.491195 0.294015 -0.819910 +vn 0.414838 0.200171 -0.887570 +vn 0.469497 -0.066317 -0.880428 +vn 0.443678 -0.198828 -0.873836 +vn 0.397290 -0.051668 -0.916196 +vn 0.422285 0.028352 -0.906003 +vn 0.826228 0.367016 -0.427290 +vn 0.758782 0.437574 -0.482406 +vn 0.794031 0.244575 -0.556444 +vn 0.826868 -0.022675 -0.561907 +vn 0.785943 -0.160588 -0.597034 +vn 0.685080 0.005799 -0.728416 +vn 0.605884 0.045900 -0.794183 +vn 0.911435 0.255745 -0.322214 +vn 0.918058 0.368267 -0.146672 +vn 0.965300 0.229163 -0.125126 +vn 0.962340 0.064028 -0.264107 +vn 0.887997 0.014344 -0.459578 +vn 0.793908 0.149998 -0.589221 +vn 0.745567 0.135716 -0.652425 +vn 0.962584 0.083590 -0.257637 +vn 0.964568 0.150945 -0.216315 +vn 0.985534 0.138585 -0.097415 +vn 0.976959 0.133946 -0.166112 +vn 0.950621 0.259621 0.169958 +vn 0.978118 0.197516 0.064852 +vn 0.896573 0.317515 0.308664 +vn 0.916990 0.280587 0.283517 +vn 0.780877 0.280831 0.557970 +vn 0.748772 0.286660 0.597613 +vn 0.750633 0.289376 0.593921 +vn 0.792749 0.240089 0.560228 +vn 0.790948 0.421277 0.443709 +vn 0.888607 0.260598 0.377422 +vn 0.710654 0.504349 0.490463 +vn 0.769585 0.241920 0.590930 +vn 0.958770 0.128025 -0.253700 +vn 0.970672 0.238319 0.031129 +vn 0.893948 0.362072 0.264046 +vn 0.852077 0.416822 0.316507 +vn 0.722800 0.454817 0.520218 +vn 0.600513 0.520310 0.607135 +vn 0.626850 0.599139 0.498032 +vn 0.646840 0.622242 0.440870 +vn 0.986511 0.132847 -0.095492 +vn 0.929197 0.322398 0.180639 +vn 0.828944 0.431959 0.355266 +vn 0.771538 0.522843 0.362377 +vn 0.615528 0.571917 0.542222 +vn 0.565935 0.559862 0.605182 +vn 0.632435 0.559130 0.536088 +vn 0.647603 0.569628 0.506058 +vn 0.971954 0.195715 0.130222 +vn 0.898709 0.332530 0.285867 +vn 0.788965 0.405225 0.461806 +vn 0.735435 0.504593 0.452162 +vn 0.603931 0.531693 0.593738 +vn 0.655141 0.475539 0.587024 +vn 0.701254 0.435041 0.564745 +vn 0.601093 0.502396 0.621479 +vn 0.886624 0.396100 0.238655 +vn 0.825251 0.422681 0.374493 +vn 0.675314 0.487259 0.553606 +vn 0.647023 0.564837 0.512101 +vn 0.611469 0.547105 0.571612 +vn 0.733390 0.466994 0.493942 +vn 0.681112 0.438368 0.586413 +vn 0.434217 0.538682 0.721946 +vn 0.819788 0.497696 0.283212 +vn 0.701041 0.533158 0.473525 +vn 0.689138 0.491592 0.532334 +vn 0.764092 0.426374 0.484085 +vn 0.774499 0.344462 0.530534 +vn 0.803949 0.357463 0.475234 +vn 0.625416 0.435530 0.647389 +vn 0.389447 0.415784 0.821833 +vn 0.780023 0.488937 0.390484 +vn 0.710898 0.496353 0.498184 +vn 0.807520 0.421003 0.413038 +vn 0.883480 0.276467 0.378155 +vn 0.810877 0.230903 0.537706 +vn 0.732810 0.305246 0.608112 +vn 0.602344 0.368328 0.708121 +vn 0.541551 0.229408 0.808740 +vn 0.940672 0.253578 -0.225379 +vn 0.944762 0.153661 -0.289438 +vn 0.949980 -0.040010 -0.309641 +vn 0.908414 -0.365673 -0.202612 +vn 0.845241 -0.527604 -0.084536 +vn 0.872646 -0.480575 -0.086489 +vn 0.852138 -0.500381 -0.153050 +vn 0.939299 0.297739 -0.170324 +vn 0.948332 0.226722 -0.221839 +vn 0.962462 -0.128086 -0.239265 +vn 0.867031 -0.459181 -0.193365 +vn 0.823847 -0.540422 -0.170751 +vn 0.866817 -0.477493 -0.143437 +vn 0.865993 -0.491897 -0.089602 +vn 0.949583 0.311655 0.033815 +vn 0.958708 0.279855 0.049989 +vn 0.983306 -0.174230 0.051851 +vn 0.849513 -0.525407 0.047273 +vn 0.823359 -0.563250 0.069277 +vn 0.854640 -0.515397 0.062624 +vn 0.806635 -0.570086 0.155950 +vn 0.917417 0.293832 0.268258 +vn 0.900876 0.234199 0.365429 +vn 0.891568 -0.140996 0.430311 +vn 0.769066 -0.520310 0.371136 +vn 0.685141 -0.606433 0.403455 +vn 0.725730 -0.482681 0.490188 +vn 0.616199 -0.586352 0.525773 +vn 0.759117 0.303507 0.575793 +vn 0.782830 0.137028 0.606952 +vn 0.738975 -0.110477 0.664602 +vn 0.648213 -0.439436 0.621845 +vn 0.468123 -0.656575 0.591357 +vn 0.422620 -0.499954 0.755882 +vn 0.321146 -0.443861 0.836543 +vn 0.762963 0.328410 0.556749 +vn 0.789361 0.109989 0.603961 +vn 0.674642 -0.248421 0.695059 +vn 0.429121 -0.453383 0.781182 +vn 0.241493 -0.619678 0.746757 +vn 0.223365 -0.560228 0.797632 +vn 0.271645 -0.441969 0.854885 +vn 0.864193 0.261483 0.429853 +vn 0.815607 0.015625 0.578387 +vn 0.602313 -0.469283 0.645711 +vn 0.320688 -0.638356 0.699728 +vn 0.219001 -0.625080 0.749199 +vn 0.317087 -0.575884 0.753502 +vn 0.405347 -0.503372 0.763054 +vn 0.684622 0.070711 0.725425 +vn 0.541490 -0.119755 0.832087 +vn 0.381085 -0.542405 0.748680 +vn 0.332041 -0.707358 0.623981 +vn 0.511826 -0.609394 0.605487 +vn 0.648366 -0.537278 0.539354 +vn 0.693869 -0.518845 0.499252 +vn -0.351970 0.011353 0.935911 +vn -0.208472 0.062624 0.976012 +vn -0.240028 -0.053713 0.969268 +vn -0.402875 -0.220588 0.888241 +vn -0.285440 -0.198645 0.937559 +vn -0.325571 -0.357982 0.875118 +vn -0.216376 -0.305734 0.927183 +vn -0.167180 -0.302438 0.938383 +vn 0.059847 -0.363201 0.929777 +vn 0.137364 -0.182257 0.973601 +vn 0.418195 -0.364452 0.831996 +vn 0.474136 -0.126743 0.871273 +vn 0.567644 -0.329569 0.754387 +vn 0.663686 -0.054140 0.746025 +vn 0.526475 -0.194037 0.827723 +vn 0.701468 0.108066 0.704428 +vn -0.194769 -0.149693 0.969329 +vn -0.147893 -0.144658 0.978332 +vn -0.192541 -0.178045 0.964995 +vn -0.130345 -0.302957 0.944029 +vn 0.083254 -0.410718 0.907926 +vn 0.373791 -0.415143 0.829402 +vn 0.517930 -0.357128 0.777276 +vn 0.357768 -0.249611 0.899808 +vn -0.215155 -0.440107 0.871761 +vn -0.187964 -0.394513 0.899441 +vn -0.117588 -0.408795 0.904996 +vn -0.021851 -0.519181 0.854366 +vn 0.144993 -0.621998 0.769463 +vn 0.261147 -0.649068 0.714469 +vn 0.373516 -0.553728 0.744194 +vn 0.281472 -0.502457 0.817469 +vn -0.168493 -0.566668 0.806513 +vn -0.211158 -0.610553 0.763268 +vn -0.036866 -0.656697 0.753227 +vn 0.057985 -0.705954 0.705863 +vn 0.152623 -0.705679 0.691855 +vn 0.173376 -0.630543 0.756523 +vn 0.240883 -0.557146 0.794671 +vn 0.361522 -0.600452 0.713248 +vn -0.132481 -0.494186 0.859188 +vn -0.230049 -0.468917 0.852748 +vn 0.046999 -0.515397 0.855647 +vn 0.087619 -0.547410 0.832240 +vn 0.041353 -0.481735 0.875301 +vn 0.106540 -0.365551 0.924650 +vn 0.259438 -0.364635 0.894253 +vn 0.540513 -0.475936 0.693747 +vn -0.179083 -0.529313 0.829279 +vn -0.255989 -0.449232 0.855922 +vn 0.068422 -0.408185 0.910306 +vn 0.095187 -0.376263 0.921567 +vn -0.052278 -0.378887 0.923948 +vn 0.063692 -0.364391 0.929044 +vn 0.326579 -0.378002 0.866268 +vn 0.660451 -0.447493 0.602893 +vn -0.143529 -0.649586 0.746605 +vn -0.277108 -0.716453 0.640187 +vn -0.039033 -0.709677 0.703391 +vn 0.052187 -0.614734 0.786981 +vn -0.051607 -0.584674 0.809595 +vn 0.044435 -0.616657 0.785943 +vn 0.358898 -0.611103 0.705496 +vn 0.701498 -0.538408 0.466872 +vn -0.479873 -0.194800 0.855403 +vn -0.501267 -0.185247 0.845210 +vn -0.454756 0.197485 0.868435 +vn -0.443556 0.022462 0.895932 +vn -0.345408 0.505387 0.790735 +vn -0.243233 0.418622 0.874966 +vn -0.335246 0.571337 0.749077 +vn -0.152989 0.648762 0.745415 +vn -0.404797 0.631306 0.661489 +vn -0.076266 0.671010 0.737480 +vn -0.361064 0.612262 0.703360 +vn 0.056124 0.568011 0.821070 +vn -0.266366 0.387066 0.882717 +vn 0.034028 0.434156 0.900174 +vn -0.311258 -0.166570 0.935575 +vn -0.298105 0.242225 0.923276 +vn -0.277169 0.581500 0.764855 +vn -0.253609 0.569109 0.782128 +vn -0.246803 0.622517 0.742637 +vn -0.302561 0.652242 0.694968 +vn -0.325022 0.434248 0.840083 +vn 0.024842 -0.037477 0.998962 +vn 0.167577 0.302652 0.938231 +vn 0.164098 0.630879 0.758293 +vn 0.119785 0.617817 0.777093 +vn 0.141575 0.655904 0.741417 +vn 0.183966 0.677633 0.711997 +vn 0.179022 0.441145 0.879360 +vn 0.300790 0.211982 0.929807 +vn 0.495102 0.426984 0.756645 +vn 0.515793 0.573992 0.635945 +vn 0.464980 0.578021 0.670553 +vn 0.457808 0.678213 0.574816 +vn 0.530198 0.644154 0.551286 +vn 0.604022 0.354991 0.713492 +vn 0.473708 0.357646 0.804773 +vn 0.499466 0.569414 0.652882 +vn 0.579821 0.548967 0.601978 +vn 0.626423 0.554277 0.548021 +vn 0.622395 0.689047 0.371227 +vn 0.664083 0.575488 0.477248 +vn 0.641011 0.370373 0.672231 +vn 0.671529 0.380902 0.635548 +vn 0.602985 0.600513 0.525101 +vn 0.633808 0.597888 0.490677 +vn 0.697714 0.594592 0.399487 +vn 0.674367 0.681173 0.284921 +vn 0.696127 0.465712 0.546342 +vn 0.552721 0.294198 0.779656 +vn 0.728782 0.449568 0.516465 +vn 0.707785 0.587603 0.392041 +vn 0.710715 0.596149 0.373394 +vn 0.668111 0.610157 0.425764 +vn 0.541551 0.669332 0.508560 +vn 0.576006 0.410321 0.706961 +vn 0.565630 0.150792 0.810724 +vn -0.270547 -0.133091 0.953429 +vn -0.254830 0.165532 0.952696 +vn -0.018616 -0.140385 0.989898 +vn -0.061281 0.161382 0.984954 +vn 0.056032 -0.089328 0.994415 +vn 0.096744 0.106815 0.989532 +vn -0.047884 0.078219 0.995758 +vn 0.111850 0.162633 0.980316 +vn -0.121586 0.218055 0.968322 +vn -0.071688 0.250069 0.965545 +vn -0.310434 0.267708 0.912107 +vn -0.396100 0.222877 0.890713 +vn -0.522477 0.222266 0.823145 +vn -0.470748 0.251167 0.845729 +vn -0.366405 0.157720 0.916959 +vn -0.380047 0.298746 0.875362 +vn -0.246254 -0.191382 0.950102 +vn -0.052339 -0.185217 0.981292 +vn -0.033998 -0.127323 0.991272 +vn -0.138585 -0.104068 0.984863 +vn -0.206610 -0.066927 0.976104 +vn -0.364544 0.053133 0.929655 +vn -0.499252 0.110263 0.859371 +vn -0.316721 0.073092 0.945677 +vn -0.174718 0.277718 0.944609 +vn -0.052614 0.170537 0.983917 +vn -0.017518 0.089114 0.995849 +vn -0.135960 0.049318 0.989471 +vn -0.279489 0.082949 0.956542 +vn -0.443556 0.117557 0.888485 +vn -0.459853 0.108066 0.881375 +vn -0.372417 0.196020 0.907102 +vn -0.029786 0.616047 0.787133 +vn 0.022309 0.528947 0.848354 +vn 0.009217 0.512772 0.858455 +vn -0.165258 0.579241 0.798181 +vn -0.254921 0.618549 0.743187 +vn -0.340281 0.574023 0.744743 +vn -0.347575 0.483230 0.803522 +vn -0.382977 0.447127 0.808313 +vn 0.079653 0.590167 0.803308 +vn -0.027406 0.625629 0.779626 +vn -0.073305 0.744835 0.663167 +vn -0.158177 0.766350 0.622608 +vn -0.152562 0.674490 0.722312 +vn -0.216376 0.595691 0.773492 +vn -0.277993 0.552019 0.786096 +vn -0.314615 0.543870 0.777947 +vn 0.103885 0.534074 0.839015 +vn -0.186865 0.614032 0.766808 +vn -0.241035 0.716941 0.654103 +vn -0.032655 0.706320 0.707114 +vn 0.031190 0.479873 0.876766 +vn -0.166112 0.312357 0.935301 +vn -0.361644 0.306192 0.880581 +vn -0.391736 0.412336 0.822474 +vn -0.032380 0.608692 0.792718 +vn -0.282357 0.686911 0.669607 +vn -0.295724 0.683035 0.667776 +vn 0.071261 0.638295 0.766472 +vn 0.203192 0.536485 0.819056 +vn -0.130406 0.535325 0.834498 +vn -0.396527 0.519608 0.756767 +vn -0.430403 0.478652 0.765252 +vn -0.216803 0.092471 0.971801 +vn -0.231697 -0.179998 0.955962 +vn -0.229255 -0.437696 0.869381 +vn -0.165593 -0.504562 0.847316 +vn -0.087008 -0.469131 0.878811 +vn 0.012604 -0.531510 0.846919 +vn 0.089877 -0.554399 0.827357 +vn -0.124668 0.089358 0.988159 +vn -0.187658 -0.239357 0.952605 +vn -0.232429 -0.435560 0.869594 +vn -0.214270 -0.448317 0.867794 +vn -0.128391 -0.370525 0.919889 +vn -0.017029 -0.442457 0.896603 +vn -0.077700 -0.623768 0.777703 +vn 0.046846 0.020142 0.998688 +vn 0.004975 -0.273751 0.961760 +vn -0.024323 -0.463576 0.885708 +vn -0.077395 -0.436018 0.896573 +vn -0.121738 -0.333415 0.934874 +vn -0.233680 -0.477096 0.847194 +vn -0.392773 -0.713431 0.580279 +vn 0.147984 -0.051973 0.987610 +vn 0.087802 -0.296854 0.950865 +vn 0.085818 -0.447737 0.890011 +vn 0.049593 -0.498215 0.865627 +vn -0.140629 -0.477584 0.867244 +vn -0.325236 -0.582812 0.744652 +vn -0.341044 -0.782922 0.520280 +vn -0.136387 -0.147984 0.979522 +vn -0.144230 -0.375683 0.915433 +vn -0.098483 -0.412000 0.905820 +vn 0.020234 -0.507004 0.861660 +vn 0.056368 -0.602252 0.796289 +vn -0.094607 -0.717582 0.689993 +vn -0.222938 -0.806879 0.546953 +vn -0.382000 -0.121433 0.916135 +vn -0.280435 -0.374401 0.883816 +vn -0.259468 -0.387799 0.884457 +vn -0.230659 -0.456648 0.859218 +vn -0.130345 -0.618305 0.775018 +vn -0.055269 -0.837367 0.543809 +vn -0.242073 -0.862392 0.444563 +vn -0.290902 0.080874 0.953307 +vn -0.110508 -0.256233 0.960265 +vn -0.082400 -0.393536 0.915586 +vn -0.188604 -0.510453 0.838923 +vn -0.317148 -0.689535 0.651082 +vn -0.301157 -0.867946 0.394879 +vn -0.208686 -0.925840 0.315012 +vn -0.411023 0.208258 0.887478 +vn -0.336619 -0.108951 0.935301 +vn -0.178594 -0.418256 0.890561 +vn -0.097659 -0.661031 0.743950 +vn -0.169378 -0.810694 0.560381 +vn -0.242836 -0.882717 0.402264 +vn -0.201483 -0.933317 0.297128 +vn -0.741783 -0.343791 -0.575762 +vn -0.703757 -0.387616 -0.595355 +vn -0.822443 -0.489364 -0.289987 +vn -0.883633 -0.342998 -0.318583 +vn -0.840114 -0.542192 0.013947 +vn -0.922300 -0.384564 -0.038026 +vn -0.811945 -0.544542 0.210150 +vn -0.864742 -0.419721 0.275735 +vn -0.812159 -0.392132 0.431959 +vn -0.743889 -0.446822 0.496902 +vn -0.876583 -0.212745 0.431623 +vn -0.754692 -0.415632 0.507553 +vn -0.888577 -0.054933 0.455397 +vn -0.724448 -0.226539 0.651021 +vn -0.731010 0.145390 0.666646 +vn -0.535295 0.110874 0.837336 +vn -0.725516 -0.336619 -0.600208 +vn -0.864498 -0.425153 -0.268014 +vn -0.875118 -0.478683 0.070833 +vn -0.865780 -0.484634 0.124454 +vn -0.928556 -0.319620 0.188574 +vn -0.961394 -0.044069 0.271554 +vn -0.925932 0.071291 0.370861 +vn -0.764183 0.012726 0.644826 +vn -0.748131 -0.322611 -0.579791 +vn -0.838252 -0.504318 -0.207221 +vn -0.816187 -0.571154 0.086886 +vn -0.860012 -0.509049 0.034577 +vn -0.924863 -0.378765 -0.033631 +vn -0.956847 -0.264168 0.120884 +vn -0.867611 -0.282723 0.409009 +vn -0.629505 -0.383740 0.675588 +vn -0.830592 -0.303873 -0.466628 +vn -0.842402 -0.532609 -0.081545 +vn -0.813959 -0.577013 0.066805 +vn -0.786126 -0.617603 0.022614 +vn -0.768059 -0.632649 -0.098910 +vn -0.778405 -0.627400 0.019745 +vn -0.602557 -0.683187 0.412427 +vn -0.331462 -0.734519 0.592090 +vn -0.771905 -0.567736 -0.286019 +vn -0.708945 -0.702506 0.061678 +vn -0.606922 -0.785211 0.122501 +vn -0.531358 -0.842524 0.088015 +vn -0.513749 -0.854762 -0.073458 +vn -0.533311 -0.843745 -0.060335 +vn -0.331767 -0.863887 0.378918 +vn -0.136143 -0.839595 0.525834 +vn -0.641194 -0.751061 -0.157170 +vn -0.498459 -0.832789 0.240699 +vn -0.330332 -0.902219 0.277139 +vn -0.340587 -0.938444 0.057527 +vn -0.420881 -0.901120 -0.104038 +vn -0.391980 -0.916135 -0.083773 +vn -0.176397 -0.925962 0.333781 +vn -0.070101 -0.863918 0.498672 +vn -0.709281 -0.704917 -0.001343 +vn -0.482101 -0.746818 0.458022 +vn -0.499405 -0.800165 0.332102 +vn -0.594928 -0.803674 -0.010681 +vn -0.557085 -0.827601 -0.068361 +vn -0.351024 -0.935575 0.037965 +vn -0.089480 -0.936735 0.338359 +vn -0.047548 -0.917692 0.394421 +vn -0.943144 -0.075381 -0.323618 +vn -0.845424 -0.220161 -0.486526 +vn -0.966094 0.103519 -0.236427 +vn -0.936460 -0.030885 -0.349376 +vn -0.966918 0.204932 -0.151708 +vn -0.960143 0.133274 -0.245552 +vn -0.960753 0.254860 -0.109317 +vn -0.959624 0.215064 -0.181127 +vn -0.929014 0.361858 -0.077181 +vn -0.914457 0.362529 -0.179724 +vn -0.861751 0.500961 -0.079775 +vn -0.794244 0.547929 -0.262520 +vn -0.716849 0.683187 -0.139134 +vn -0.605976 0.704672 -0.369060 +vn -0.997986 -0.028077 -0.056490 +vn -0.978454 0.205512 -0.018281 +vn -0.975463 0.219825 -0.012024 +vn -0.967467 0.246284 -0.057466 +vn -0.906308 0.420179 -0.044832 +vn -0.836573 0.543443 0.069033 +vn -0.694479 0.693319 0.192236 +vn -0.967437 -0.089694 0.236579 +vn -0.975127 0.184790 0.122166 +vn -0.978973 0.193884 0.063051 +vn -0.967071 0.243324 0.074313 +vn -0.849483 0.509262 0.137730 +vn -0.690695 0.661794 0.291421 +vn -0.511521 0.719138 0.470229 +vn -0.873012 -0.269448 0.406476 +vn -0.970367 0.049684 0.236335 +vn -0.941191 0.256111 0.220313 +vn -0.855068 0.357250 0.375774 +vn -0.695700 0.539720 0.473983 +vn -0.513352 0.703909 0.490829 +vn -0.366863 0.769341 0.522935 +vn -0.724357 -0.352214 0.592608 +vn -0.752861 0.003662 0.658132 +vn -0.636494 0.332591 0.695853 +vn -0.498276 0.422346 0.757164 +vn -0.407208 0.466720 0.785058 +vn -0.396893 0.569231 0.719993 +vn -0.291360 0.740013 0.606159 +vn -0.541642 -0.179693 0.821131 +vn -0.391156 0.061800 0.918210 +vn -0.269112 0.321970 0.907682 +vn -0.228309 0.379406 0.896603 +vn -0.212104 0.387616 0.897061 +vn -0.223884 0.364299 0.903958 +vn -0.160039 0.545640 0.822565 +vn -0.345103 0.022492 0.938261 +vn -0.290323 0.110111 0.950560 +vn -0.311167 0.308939 0.898709 +vn -0.325510 0.415265 0.849452 +vn -0.268868 0.455794 0.848476 +vn -0.237831 0.386608 0.891018 +vn -0.186956 0.406751 0.894162 +vn -0.838008 -0.383190 -0.388379 +vn -0.754418 -0.467422 -0.460768 +vn -0.812220 -0.418836 -0.405957 +vn -0.746178 -0.542497 -0.385815 +vn -0.791620 -0.366100 -0.489181 +vn -0.742119 -0.548357 -0.385357 +vn -0.887478 -0.323893 -0.327738 +vn -0.804559 -0.531449 -0.264931 +vn -0.900967 -0.320902 -0.291940 +vn -0.848781 -0.474837 -0.232490 +vn -0.811609 -0.304300 -0.498672 +vn -0.798822 -0.427686 -0.422987 +vn -0.617145 -0.265236 -0.740776 +vn -0.541032 -0.438978 -0.717307 +vn -0.523087 -0.317545 -0.790887 +vn -0.398022 -0.500656 -0.768670 +vn -0.931822 -0.165441 -0.322916 +vn -0.863216 -0.206854 -0.460433 +vn -0.759667 -0.110752 -0.640767 +vn -0.915586 0.018159 -0.401624 +vn -0.933988 0.111759 -0.339335 +vn -0.811365 0.158147 -0.562700 +vn -0.669912 0.104923 -0.734947 +vn -0.652364 -0.049409 -0.756249 +vn -0.948607 0.101871 -0.299600 +vn -0.871548 0.098331 -0.480331 +vn -0.705527 0.043092 -0.707327 +vn -0.873379 0.103153 -0.475936 +vn -0.846644 0.269753 -0.458663 +vn -0.722648 0.400494 -0.563311 +vn -0.746239 0.329783 -0.578234 +vn -0.708213 0.199896 -0.677084 +vn -0.910459 0.215369 -0.353038 +vn -0.823634 0.251930 -0.508042 +vn -0.684072 0.227332 -0.693045 +vn -0.775231 0.263131 -0.574236 +vn -0.753471 0.335276 -0.565539 +vn -0.657125 0.408856 -0.633229 +vn -0.764489 0.475295 -0.435408 +vn -0.601245 0.516404 -0.609729 +vn -0.844813 0.360912 -0.394971 +vn -0.756767 0.359020 -0.546220 +vn -0.625111 0.356487 -0.694327 +vn -0.669362 0.428297 -0.607013 +vn -0.606128 0.511734 -0.608814 +vn -0.496414 0.557970 -0.664968 +vn -0.621937 0.660360 -0.420820 +vn -0.426069 0.727805 -0.537309 +vn -0.670675 0.596881 -0.440291 +vn -0.564043 0.604694 -0.562243 +vn -0.557756 0.537584 -0.632344 +vn -0.614856 0.444166 -0.651631 +vn -0.502121 0.470351 -0.725669 +vn -0.494064 0.550218 -0.673147 +vn -0.582293 0.617389 -0.528886 +vn -0.407086 0.680502 -0.609210 +vn -0.456923 0.724662 -0.515793 +vn -0.357494 0.741020 -0.568377 +vn -0.410047 0.779046 -0.474258 +vn -0.406232 0.699576 -0.587817 +vn -0.358409 0.600940 -0.714408 +vn -0.510208 0.560015 -0.652699 +vn -0.575152 0.538163 -0.616047 +vn -0.462447 0.549699 -0.695639 +vn -0.732170 -0.419355 -0.536699 +vn -0.735160 -0.336863 -0.588214 +vn -0.804071 -0.249489 -0.539628 +vn -0.845973 -0.156621 -0.509659 +vn -0.738639 -0.449293 -0.502457 +vn -0.608936 -0.638569 -0.470473 +vn -0.753105 -0.511490 -0.413678 +vn -0.749657 -0.491775 -0.442824 +vn -0.845668 -0.299112 -0.441969 +vn -0.916166 -0.177587 -0.359264 +vn -0.893124 -0.228462 -0.387402 +vn -0.753502 -0.462416 -0.467299 +vn -0.677877 -0.606586 -0.415296 +vn -0.784265 -0.476424 -0.397382 +vn -0.760735 -0.526963 -0.378887 +vn -0.897610 -0.220191 -0.381787 +vn -0.960906 -0.057588 -0.270760 +vn -0.930479 -0.306192 -0.200995 +vn -0.863430 -0.476211 -0.166356 +vn -0.772546 -0.620808 -0.133183 +vn -0.839015 -0.526658 -0.136540 +vn -0.798303 -0.546190 -0.253700 +vn -0.946471 -0.164068 -0.277963 +vn -0.976287 0.048372 -0.210883 +vn -0.960540 -0.246834 -0.128056 +vn -0.905667 -0.421796 -0.042299 +vn -0.755608 -0.653371 -0.045961 +vn -0.830744 -0.545183 -0.112156 +vn -0.871639 -0.478256 -0.107181 +vn -0.982086 -0.167150 -0.086673 +vn -0.969024 -0.045656 -0.242622 +vn -0.908994 -0.220527 -0.353618 +vn -0.895230 -0.326640 -0.303079 +vn -0.723685 -0.668050 -0.173040 +vn -0.752342 -0.621784 -0.217444 +vn -0.826106 -0.405164 -0.391583 +vn -0.866878 -0.285043 -0.408918 +vn -0.844264 -0.185095 -0.502884 +vn -0.791955 -0.257973 -0.553362 +vn -0.812799 -0.201849 -0.546434 +vn -0.778954 -0.510666 -0.363872 +vn -0.691122 -0.704062 -0.163152 +vn -0.486038 -0.379223 -0.787347 +vn -0.524827 -0.266243 -0.808466 +vn -0.642537 -0.155278 -0.750328 +vn -0.728111 -0.217322 -0.650075 +vn -0.760643 -0.196173 -0.618763 +vn -0.767022 -0.279397 -0.577563 +vn -0.640400 -0.665334 -0.383618 +vn -0.415387 -0.354106 -0.837855 +vn -0.511032 -0.140751 -0.847926 +vn -0.555345 -0.099887 -0.825556 +vn -0.544084 -0.140233 -0.827204 +vn -0.579241 -0.172491 -0.796655 +vn -0.597278 -0.173345 -0.783074 +vn -0.505753 -0.531327 -0.679586 +vn 0.095340 0.289865 -0.952269 +vn 0.058992 0.531419 -0.845027 +vn -0.145390 0.417890 -0.896756 +vn -0.074709 0.319742 -0.944517 +vn -0.220862 0.296518 -0.929106 +vn -0.174505 0.303415 -0.936735 +vn -0.245582 0.196692 -0.949187 +vn -0.168340 0.279794 -0.945158 +vn 0.173162 0.166265 -0.970733 +vn 0.213019 0.246315 -0.945463 +vn 0.574664 0.075045 -0.814905 +vn 0.666921 0.155156 -0.728782 +vn 0.710074 -0.028108 -0.703543 +vn 0.743980 0.060274 -0.665426 +vn 0.879757 0.055391 -0.472121 +vn 0.786706 0.092349 -0.610370 +vn -0.013794 0.540605 -0.841121 +vn -0.278390 0.446913 -0.850124 +vn -0.332469 0.306467 -0.891903 +vn -0.319712 0.182653 -0.929716 +vn 0.155644 0.166540 -0.973662 +vn 0.520554 0.169225 -0.836879 +vn 0.691580 0.194617 -0.695547 +vn 0.919004 0.241554 -0.311502 +vn -0.024781 0.303598 -0.952452 +vn -0.350902 0.291635 -0.889798 +vn -0.419446 0.262764 -0.868892 +vn -0.347118 0.264168 -0.899808 +vn 0.137150 0.318583 -0.937895 +vn 0.537309 0.328715 -0.776666 +vn 0.723228 0.375164 -0.579791 +vn 0.910642 0.326243 -0.253456 +vn -0.000885 0.211921 -0.977264 +vn -0.299387 0.289621 -0.909085 +vn -0.386731 0.383343 -0.838710 +vn -0.301035 0.510300 -0.805567 +vn 0.098849 0.614978 -0.782311 +vn 0.461776 0.564745 -0.683950 +vn 0.704306 0.435896 -0.560259 +vn 0.900876 0.255837 -0.350627 +vn -0.028138 0.159978 -0.986694 +vn -0.206977 0.135929 -0.968841 +vn -0.246925 0.240089 -0.938810 +vn -0.139073 0.485427 -0.863124 +vn 0.114597 0.666585 -0.736534 +vn 0.303751 0.670095 -0.677236 +vn 0.580645 0.515397 -0.630207 +vn 0.805628 0.250343 -0.536882 +vn -0.176397 0.033479 -0.983734 +vn -0.182806 -0.054720 -0.981597 +vn 0.024476 0.062593 -0.997711 +vn 0.156285 0.356304 -0.921201 +vn 0.177129 0.505966 -0.844142 +vn 0.218451 0.471786 -0.854213 +vn 0.456679 0.368328 -0.809778 +vn 0.696402 0.257149 -0.669942 +vn -0.295816 0.093661 -0.950621 +vn -0.204962 0.052980 -0.977325 +vn 0.236671 0.053804 -0.970092 +vn 0.319407 0.165197 -0.933073 +vn 0.160375 0.239937 -0.957427 +vn 0.213599 0.184881 -0.959258 +vn 0.432051 0.211097 -0.876766 +vn 0.643727 0.180975 -0.743522 +vn -0.162084 0.338237 -0.926969 +vn -0.093722 0.116611 -0.988739 +vn -0.365764 0.225837 -0.902860 +vn -0.294137 0.082583 -0.952178 +vn -0.455885 0.075106 -0.886837 +vn -0.396741 0.031617 -0.917356 +vn -0.419141 -0.270028 -0.866817 +vn -0.439314 -0.149754 -0.885739 +vn -0.272591 -0.685842 -0.674734 +vn -0.371349 -0.576830 -0.727561 +vn -0.105594 -0.784539 -0.610981 +vn -0.266549 -0.647938 -0.713492 +vn 0.103122 -0.734397 -0.670827 +vn -0.191260 -0.610675 -0.768426 +vn -0.162389 0.426649 -0.889676 +vn -0.112644 0.306314 -0.945219 +vn -0.075777 0.047731 -0.995972 +vn -0.057253 -0.396588 -0.916196 +vn -0.013184 -0.793451 -0.608448 +vn 0.141606 -0.883267 -0.446913 +vn 0.276070 -0.776147 -0.566851 +vn -0.031281 0.345073 -0.938017 +vn 0.147740 0.250435 -0.956786 +vn 0.301401 0.014100 -0.953368 +vn 0.320017 -0.396588 -0.860378 +vn 0.226783 -0.792657 -0.565874 +vn 0.165288 -0.916807 -0.363475 +vn 0.226020 -0.815332 -0.533036 +vn 0.282388 0.234382 -0.930204 +vn 0.348125 0.139866 -0.926939 +vn 0.432295 -0.068972 -0.899075 +vn 0.488327 -0.375195 -0.787866 +vn 0.410321 -0.732292 -0.543474 +vn 0.259377 -0.897031 -0.357830 +vn 0.252297 -0.844966 -0.471541 +vn 0.723899 0.144505 -0.674551 +vn 0.786889 0.047578 -0.615223 +vn 0.795129 -0.081668 -0.600909 +vn 0.755974 -0.261513 -0.600055 +vn 0.577288 -0.614277 -0.537919 +vn 0.324656 -0.843043 -0.428755 +vn 0.258766 -0.861873 -0.436048 +vn 0.792016 0.051881 -0.608234 +vn 0.868191 -0.132756 -0.478103 +vn 0.904874 -0.064150 -0.420789 +vn 0.889370 -0.034455 -0.455855 +vn 0.772057 -0.420637 -0.476394 +vn 0.579363 -0.704550 -0.409772 +vn 0.407544 -0.812647 -0.416456 +vn 0.761162 -0.008576 -0.648457 +vn 0.762993 -0.288064 -0.578631 +vn 0.809900 -0.136540 -0.570421 +vn 0.875729 0.017945 -0.482437 +vn 0.901883 -0.298959 -0.311686 +vn 0.842311 -0.480392 -0.244301 +vn 0.725608 -0.540452 -0.425886 +vn -0.230262 -0.049745 -0.971831 +vn -0.091281 0.110874 -0.989624 +vn -0.179846 -0.111270 -0.977355 +vn -0.060030 -0.083895 -0.994659 +vn 0.007935 -0.258034 -0.966094 +vn 0.142003 -0.179754 -0.973388 +vn -0.281655 -0.420118 -0.862636 +vn -0.179693 -0.305307 -0.935118 +vn -0.632282 -0.417554 -0.652547 +vn -0.508164 -0.492172 -0.706717 +vn -0.536088 -0.368023 -0.759697 +vn -0.491562 -0.585894 -0.644246 +vn -0.424329 -0.351329 -0.834529 +vn -0.421705 -0.569018 -0.705924 +vn -0.247902 0.019318 -0.968566 +vn -0.255318 -0.011841 -0.966765 +vn -0.252998 -0.184240 -0.949736 +vn -0.310648 -0.329081 -0.891720 +vn -0.545793 -0.155522 -0.823328 +vn -0.529832 0.038392 -0.847194 +vn -0.516190 0.002289 -0.856441 +vn -0.334941 -0.096622 -0.937254 +vn -0.267678 -0.168004 -0.948729 +vn -0.353954 -0.110446 -0.928709 +vn -0.331492 -0.121830 -0.935545 +vn -0.347484 -0.084292 -0.933866 +vn -0.545824 -0.087374 -0.833308 +vn -0.585345 -0.111698 -0.803034 +vn -0.396558 -0.097507 -0.912778 +vn -0.216742 -0.072787 -0.973479 +vn -0.238319 0.026185 -0.970824 +vn -0.438032 0.018647 -0.898740 +vn -0.444380 -0.197089 -0.873867 +vn -0.541856 -0.318125 -0.777917 +vn -0.520493 -0.216987 -0.825800 +vn -0.261818 -0.437452 -0.860256 +vn -0.146702 -0.254799 -0.955779 +vn -0.233894 -0.236915 -0.942930 +vn -0.519150 -0.234474 -0.821863 +vn -0.563891 -0.222663 -0.795221 +vn -0.482284 -0.178289 -0.857662 +vn -0.446150 -0.122227 -0.886532 +vn -0.153844 -0.687704 -0.709464 +vn -0.096103 -0.719657 -0.687613 +vn -0.216926 -0.679495 -0.700827 +vn -0.423444 -0.539598 -0.727653 +vn -0.454299 -0.303446 -0.837550 +vn -0.411878 -0.149876 -0.898801 +vn -0.476119 -0.148595 -0.866726 +vn -0.292581 -0.609638 -0.736686 +vn -0.165838 -0.731590 -0.661214 +vn -0.100467 -0.759423 -0.642781 +vn -0.215766 -0.660207 -0.719382 +vn -0.270852 -0.541642 -0.795740 +vn -0.415113 -0.490432 -0.766228 +vn -0.504044 -0.489944 -0.711234 +vn 0.140355 0.488815 -0.860988 +vn 0.286294 0.498825 -0.818018 +vn 0.326823 0.290414 -0.899350 +vn 0.307321 0.206030 -0.929014 +vn 0.222755 0.250618 -0.942076 +vn 0.077731 0.203192 -0.976043 +vn -0.053102 0.174230 -0.983245 +vn 0.144749 0.282083 -0.948393 +vn 0.352214 0.353435 -0.866604 +vn 0.468429 0.228675 -0.853359 +vn 0.500565 0.197974 -0.842708 +vn 0.455885 0.354228 -0.816492 +vn 0.339427 0.328745 -0.881283 +vn 0.205725 0.301737 -0.930906 +vn 0.211341 0.112827 -0.970855 +vn 0.322428 0.154118 -0.933927 +vn 0.440657 0.114139 -0.890378 +vn 0.422285 0.255470 -0.869686 +vn 0.392865 0.511338 -0.764306 +vn 0.300760 0.504654 -0.809198 +vn 0.023255 0.557482 -0.829859 +vn 0.025452 -0.056948 -0.998047 +vn 0.192480 0.016724 -0.981140 +vn 0.179388 0.129521 -0.975188 +vn 0.085269 0.390973 -0.916410 +vn 0.026399 0.649525 -0.759850 +vn -0.065279 0.737053 -0.672658 +vn -0.248512 0.700797 -0.668630 +vn -0.322977 -0.323222 -0.889492 +vn -0.220618 -0.051637 -0.973968 +vn -0.213569 0.256203 -0.942717 +vn -0.269204 0.517014 -0.812494 +vn -0.301187 0.701834 -0.645497 +vn -0.301492 0.787072 -0.538133 +vn -0.254646 0.730552 -0.633564 +vn -0.526475 -0.442854 -0.725700 +vn -0.542741 -0.131169 -0.829554 +vn -0.495865 0.298196 -0.815546 +vn -0.478042 0.606372 -0.635395 +vn -0.505234 0.708945 -0.492019 +vn -0.468978 0.727500 -0.500748 +vn -0.370464 0.634907 -0.677938 +vn -0.543107 -0.414716 -0.730064 +vn -0.659719 -0.150975 -0.736167 +vn -0.642933 0.241371 -0.726859 +vn -0.455061 0.612568 -0.646260 +vn -0.361888 0.723258 -0.588122 +vn -0.384014 0.673849 -0.631184 +vn -0.377300 0.544786 -0.748863 +g Cube_Cube_Material +usemtl Material +s 1 +f 1/1/1 23/2/2 30/3/3 +f 1/1/1 30/3/3 2/4/4 +f 2/4/4 30/3/3 31/5/5 +f 2/4/4 31/5/5 3/6/6 +f 3/6/6 31/5/5 32/7/7 +f 3/6/6 32/7/7 4/8/8 +f 4/8/8 32/7/7 33/9/9 +f 4/8/8 33/9/9 5/10/10 +f 5/10/10 33/9/9 34/11/11 +f 5/10/10 34/11/11 6/12/12 +f 6/12/12 34/11/11 35/13/13 +f 6/12/12 35/13/13 7/14/14 +f 7/14/14 35/13/13 36/15/15 +f 7/14/14 36/15/15 8/16/16 +f 8/16/16 36/15/15 1357/17/17 +f 8/16/16 1357/17/17 1358/18/18 +f 23/2/2 24/19/19 37/20/20 +f 23/2/2 37/20/20 30/3/3 +f 30/3/3 37/20/20 38/21/21 +f 30/3/3 38/21/21 31/5/5 +f 31/5/5 38/21/21 39/22/22 +f 31/5/5 39/22/22 32/7/7 +f 32/7/7 39/22/22 40/23/23 +f 32/7/7 40/23/23 33/9/9 +f 33/9/9 40/23/23 41/24/24 +f 33/9/9 41/24/24 34/11/11 +f 34/11/11 41/24/24 42/25/25 +f 34/11/11 42/25/25 35/13/13 +f 35/13/13 42/25/25 43/26/26 +f 35/13/13 43/26/26 36/15/15 +f 36/15/15 43/26/26 1356/27/27 +f 36/15/15 1356/27/27 1357/17/17 +f 24/19/19 25/28/28 44/29/29 +f 24/19/19 44/29/29 37/20/20 +f 37/20/20 44/29/29 45/30/30 +f 37/20/20 45/30/30 38/21/21 +f 38/21/21 45/30/30 46/31/31 +f 38/21/21 46/31/31 39/22/22 +f 39/22/22 46/31/31 47/32/32 +f 39/22/22 47/32/32 40/23/23 +f 40/23/23 47/32/32 48/33/33 +f 40/23/23 48/33/33 41/24/24 +f 41/24/24 48/33/33 49/34/34 +f 41/24/24 49/34/34 42/25/25 +f 42/25/25 49/34/34 50/35/35 +f 42/25/25 50/35/35 43/26/26 +f 43/26/26 50/35/35 1355/36/36 +f 43/26/26 1355/36/36 1356/27/27 +f 25/28/28 26/37/37 51/38/38 +f 25/28/28 51/38/38 44/29/29 +f 44/29/29 51/38/38 52/39/39 +f 44/29/29 52/39/39 45/30/30 +f 45/30/30 52/39/39 53/40/40 +f 45/30/30 53/40/40 46/31/31 +f 46/31/31 53/40/40 54/41/41 +f 46/31/31 54/41/41 47/32/32 +f 47/32/32 54/41/41 55/42/42 +f 47/32/32 55/42/42 48/33/33 +f 48/33/33 55/42/42 56/43/43 +f 48/33/33 56/43/43 49/34/34 +f 49/34/34 56/43/43 57/44/44 +f 49/34/34 57/44/44 50/35/35 +f 50/35/35 57/44/44 1354/45/45 +f 50/35/35 1354/45/45 1355/36/36 +f 26/37/37 27/46/46 58/47/47 +f 26/37/37 58/47/47 51/38/38 +f 51/38/38 58/47/47 59/48/48 +f 51/38/38 59/48/48 52/39/39 +f 52/39/39 59/48/48 60/49/49 +f 52/39/39 60/49/49 53/40/40 +f 53/40/40 60/49/49 61/50/50 +f 53/40/40 61/50/50 54/41/41 +f 54/41/41 61/50/50 62/51/51 +f 54/41/41 62/51/51 55/42/42 +f 55/42/42 62/51/51 63/52/52 +f 55/42/42 63/52/52 56/43/43 +f 56/43/43 63/52/52 64/53/53 +f 56/43/43 64/53/53 57/44/44 +f 57/44/44 64/53/53 1353/54/54 +f 57/44/44 1353/54/54 1354/45/45 +f 27/46/46 28/55/55 65/56/56 +f 27/46/46 65/56/56 58/47/47 +f 58/47/47 65/56/56 66/57/57 +f 58/47/47 66/57/57 59/48/48 +f 59/48/48 66/57/57 67/58/58 +f 59/48/48 67/58/58 60/49/49 +f 60/49/49 67/58/58 68/59/59 +f 60/49/49 68/59/59 61/50/50 +f 61/50/50 68/59/59 69/60/60 +f 61/50/50 69/60/60 62/51/51 +f 62/51/51 69/60/60 70/61/61 +f 62/51/51 70/61/61 63/52/52 +f 63/52/52 70/61/61 71/62/62 +f 63/52/52 71/62/62 64/53/53 +f 64/53/53 71/62/62 1352/63/63 +f 64/53/53 1352/63/63 1353/54/54 +f 28/55/55 29/64/64 72/65/65 +f 28/55/55 72/65/65 65/56/56 +f 65/56/56 72/65/65 73/66/66 +f 65/56/56 73/66/66 66/57/57 +f 66/57/57 73/66/66 74/67/67 +f 66/57/57 74/67/67 67/58/58 +f 67/58/58 74/67/67 75/68/68 +f 67/58/58 75/68/68 68/59/59 +f 68/59/59 75/68/68 76/69/69 +f 68/59/59 76/69/69 69/60/60 +f 69/60/60 76/69/69 77/70/70 +f 69/60/60 77/70/70 70/61/61 +f 70/61/61 77/70/70 78/71/71 +f 70/61/61 78/71/71 71/62/62 +f 71/62/62 78/71/71 1351/72/72 +f 71/62/62 1351/72/72 1352/63/63 +f 29/64/64 1373/73/73 1372/74/74 +f 29/64/64 1372/74/74 72/65/65 +f 72/65/65 1372/74/74 1371/75/75 +f 72/65/65 1371/75/75 73/66/66 +f 73/66/66 1371/75/75 1370/76/76 +f 73/66/66 1370/76/76 74/67/67 +f 74/67/67 1370/76/76 1369/77/77 +f 74/67/67 1369/77/77 75/68/68 +f 75/68/68 1369/77/77 1368/78/78 +f 75/68/68 1368/78/78 76/69/69 +f 76/69/69 1368/78/78 1367/79/79 +f 76/69/69 1367/79/79 77/70/70 +f 77/70/70 1367/79/79 1366/80/80 +f 77/70/70 1366/80/80 78/71/71 +f 78/71/71 1366/80/80 1531/81/81 +f 78/71/71 1531/81/81 1351/72/72 +f 1/1/1 2/4/4 79/82/82 +f 1/1/1 79/82/82 9/83/83 +f 9/83/83 79/82/82 80/84/84 +f 9/83/83 80/84/84 10/85/85 +f 10/85/85 80/84/84 81/86/86 +f 10/85/85 81/86/86 11/87/87 +f 11/87/87 81/86/86 82/88/88 +f 11/87/87 82/88/88 12/89/89 +f 12/89/89 82/88/88 83/90/90 +f 12/89/89 83/90/90 13/91/91 +f 13/91/91 83/90/90 84/92/92 +f 13/91/91 84/92/92 14/93/93 +f 14/93/93 84/92/92 85/94/94 +f 14/93/93 85/94/94 15/95/95 +f 15/95/95 85/94/94 1402/96/96 +f 15/95/95 1402/96/96 1403/97/97 +f 2/4/4 3/6/6 86/98/98 +f 2/4/4 86/98/98 79/82/82 +f 79/82/82 86/98/98 87/99/99 +f 79/82/82 87/99/99 80/84/84 +f 80/84/84 87/99/99 88/100/100 +f 80/84/84 88/100/100 81/86/86 +f 81/86/86 88/100/100 89/101/101 +f 81/86/86 89/101/101 82/88/88 +f 82/88/88 89/101/101 90/102/102 +f 82/88/88 90/102/102 83/90/90 +f 83/90/90 90/102/102 91/103/103 +f 83/90/90 91/103/103 84/92/92 +f 84/92/92 91/103/103 92/104/104 +f 84/92/92 92/104/104 85/94/94 +f 85/94/94 92/104/104 1401/105/105 +f 85/94/94 1401/105/105 1402/96/96 +f 3/6/6 4/8/8 93/106/106 +f 3/6/6 93/106/106 86/98/98 +f 86/98/98 93/106/106 94/107/107 +f 86/98/98 94/107/107 87/99/99 +f 87/99/99 94/107/107 95/108/108 +f 87/99/99 95/108/108 88/100/100 +f 88/100/100 95/108/108 96/109/109 +f 88/100/100 96/109/109 89/101/101 +f 89/101/101 96/109/109 97/110/110 +f 89/101/101 97/110/110 90/102/102 +f 90/102/102 97/110/110 98/111/111 +f 90/102/102 98/111/111 91/103/103 +f 91/103/103 98/111/111 99/112/112 +f 91/103/103 99/112/112 92/104/104 +f 92/104/104 99/112/112 1400/113/113 +f 92/104/104 1400/113/113 1401/105/105 +f 4/8/8 5/10/10 100/114/114 +f 4/8/8 100/114/114 93/106/106 +f 93/106/106 100/114/114 101/115/115 +f 93/106/106 101/115/115 94/107/107 +f 94/107/107 101/115/115 102/116/116 +f 94/107/107 102/116/116 95/108/108 +f 95/108/108 102/116/116 103/117/117 +f 95/108/108 103/117/117 96/109/109 +f 96/109/109 103/117/117 104/118/118 +f 96/109/109 104/118/118 97/110/110 +f 97/110/110 104/118/118 105/119/119 +f 97/110/110 105/119/119 98/111/111 +f 98/111/111 105/119/119 106/120/120 +f 98/111/111 106/120/120 99/112/112 +f 99/112/112 106/120/120 1399/121/121 +f 99/112/112 1399/121/121 1400/113/113 +f 5/10/10 6/12/12 107/122/122 +f 5/10/10 107/122/122 100/114/114 +f 100/114/114 107/122/122 108/123/123 +f 100/114/114 108/123/123 101/115/115 +f 101/115/115 108/123/123 109/124/124 +f 101/115/115 109/124/124 102/116/116 +f 102/116/116 109/124/124 110/125/125 +f 102/116/116 110/125/125 103/117/117 +f 103/117/117 110/125/125 111/126/126 +f 103/117/117 111/126/126 104/118/118 +f 104/118/118 111/126/126 112/127/127 +f 104/118/118 112/127/127 105/119/119 +f 105/119/119 112/127/127 113/128/128 +f 105/119/119 113/128/128 106/120/120 +f 106/120/120 113/128/128 1398/129/129 +f 106/120/120 1398/129/129 1399/121/121 +f 6/12/12 7/14/14 114/130/130 +f 6/12/12 114/130/130 107/122/122 +f 107/122/122 114/130/130 115/131/131 +f 107/122/122 115/131/131 108/123/123 +f 108/123/123 115/131/131 116/132/132 +f 108/123/123 116/132/132 109/124/124 +f 109/124/124 116/132/132 117/133/133 +f 109/124/124 117/133/133 110/125/125 +f 110/125/125 117/133/133 118/134/134 +f 110/125/125 118/134/134 111/126/126 +f 111/126/126 118/134/134 119/135/135 +f 111/126/126 119/135/135 112/127/127 +f 112/127/127 119/135/135 120/136/136 +f 112/127/127 120/136/136 113/128/128 +f 113/128/128 120/136/136 1397/137/137 +f 113/128/128 1397/137/137 1398/129/129 +f 7/14/14 8/16/16 121/138/138 +f 7/14/14 121/138/138 114/130/130 +f 114/130/130 121/138/138 122/139/139 +f 114/130/130 122/139/139 115/131/131 +f 115/131/131 122/139/139 123/140/140 +f 115/131/131 123/140/140 116/132/132 +f 116/132/132 123/140/140 124/141/141 +f 116/132/132 124/141/141 117/133/133 +f 117/133/133 124/141/141 125/142/142 +f 117/133/133 125/142/142 118/134/134 +f 118/134/134 125/142/142 126/143/143 +f 118/134/134 126/143/143 119/135/135 +f 119/135/135 126/143/143 127/144/144 +f 119/135/135 127/144/144 120/136/136 +f 120/136/136 127/144/144 1396/145/145 +f 120/136/136 1396/145/145 1397/137/137 +f 8/16/16 1358/18/18 1359/146/146 +f 8/16/16 1359/146/146 121/138/138 +f 121/138/138 1359/146/146 1360/147/147 +f 121/138/138 1360/147/147 122/139/139 +f 122/139/139 1360/147/147 1361/148/148 +f 122/139/139 1361/148/148 123/140/140 +f 123/140/140 1361/148/148 1362/149/149 +f 123/140/140 1362/149/149 124/141/141 +f 124/141/141 1362/149/149 1363/150/150 +f 124/141/141 1363/150/150 125/142/142 +f 125/142/142 1363/150/150 1364/151/151 +f 125/142/142 1364/151/151 126/143/143 +f 126/143/143 1364/151/151 1365/152/152 +f 126/143/143 1365/152/152 127/144/144 +f 127/144/144 1365/152/152 1532/153/153 +f 127/144/144 1532/153/153 1396/145/145 +f 1/1/1 9/83/83 128/154/154 +f 1/1/1 128/154/154 16/155/155 +f 16/155/155 128/154/154 129/156/156 +f 16/155/155 129/156/156 17/157/157 +f 17/157/157 129/156/156 130/158/158 +f 17/157/157 130/158/158 18/159/159 +f 18/159/159 130/158/158 131/160/160 +f 18/159/159 131/160/160 19/161/161 +f 19/161/161 131/160/160 132/162/162 +f 19/161/161 132/162/162 20/163/163 +f 20/163/163 132/162/162 133/164/164 +f 20/163/163 133/164/164 21/165/165 +f 21/165/165 133/164/164 134/166/166 +f 21/165/165 134/166/166 22/167/167 +f 22/167/167 134/166/166 1432/168/168 +f 22/167/167 1432/168/168 1433/169/169 +f 9/83/83 10/85/85 135/170/170 +f 9/83/83 135/170/170 128/154/154 +f 128/154/154 135/170/170 136/171/171 +f 128/154/154 136/171/171 129/156/156 +f 129/156/156 136/171/171 137/172/172 +f 129/156/156 137/172/172 130/158/158 +f 130/158/158 137/172/172 138/173/173 +f 130/158/158 138/173/173 131/160/160 +f 131/160/160 138/173/173 139/174/174 +f 131/160/160 139/174/174 132/162/162 +f 132/162/162 139/174/174 140/175/175 +f 132/162/162 140/175/175 133/164/164 +f 133/164/164 140/175/175 141/176/176 +f 133/164/164 141/176/176 134/166/166 +f 134/166/166 141/176/176 1431/177/177 +f 134/166/166 1431/177/177 1432/168/168 +f 10/85/85 11/87/87 142/178/178 +f 10/85/85 142/178/178 135/170/170 +f 135/170/170 142/178/178 143/179/179 +f 135/170/170 143/179/179 136/171/171 +f 136/171/171 143/179/179 144/180/180 +f 136/171/171 144/180/180 137/172/172 +f 137/172/172 144/180/180 145/181/181 +f 137/172/172 145/181/181 138/173/173 +f 138/173/173 145/181/181 146/182/182 +f 138/173/173 146/182/182 139/174/174 +f 139/174/174 146/182/182 147/183/183 +f 139/174/174 147/183/183 140/175/175 +f 140/175/175 147/183/183 148/184/184 +f 140/175/175 148/184/184 141/176/176 +f 141/176/176 148/184/184 1430/185/185 +f 141/176/176 1430/185/185 1431/177/177 +f 11/87/87 12/89/89 149/186/186 +f 11/87/87 149/186/186 142/178/178 +f 142/178/178 149/186/186 150/187/187 +f 142/178/178 150/187/187 143/179/179 +f 143/179/179 150/187/187 151/188/188 +f 143/179/179 151/188/188 144/180/180 +f 144/180/180 151/188/188 152/189/189 +f 144/180/180 152/189/189 145/181/181 +f 145/181/181 152/189/189 153/190/190 +f 145/181/181 153/190/190 146/182/182 +f 146/182/182 153/190/190 154/191/191 +f 146/182/182 154/191/191 147/183/183 +f 147/183/183 154/191/191 155/192/192 +f 147/183/183 155/192/192 148/184/184 +f 148/184/184 155/192/192 1429/193/193 +f 148/184/184 1429/193/193 1430/185/185 +f 12/89/89 13/91/91 156/194/194 +f 12/89/89 156/194/194 149/186/186 +f 149/186/186 156/194/194 157/195/195 +f 149/186/186 157/195/195 150/187/187 +f 150/187/187 157/195/195 158/196/196 +f 150/187/187 158/196/196 151/188/188 +f 151/188/188 158/196/196 159/197/197 +f 151/188/188 159/197/197 152/189/189 +f 152/189/189 159/197/197 160/198/198 +f 152/189/189 160/198/198 153/190/190 +f 153/190/190 160/198/198 161/199/199 +f 153/190/190 161/199/199 154/191/191 +f 154/191/191 161/199/199 162/200/200 +f 154/191/191 162/200/200 155/192/192 +f 155/192/192 162/200/200 1428/201/201 +f 155/192/192 1428/201/201 1429/193/193 +f 13/91/91 14/93/93 163/202/202 +f 13/91/91 163/202/202 156/194/194 +f 156/194/194 163/202/202 164/203/203 +f 156/194/194 164/203/203 157/195/195 +f 157/195/195 164/203/203 165/204/204 +f 157/195/195 165/204/204 158/196/196 +f 158/196/196 165/204/204 166/205/205 +f 158/196/196 166/205/205 159/197/197 +f 159/197/197 166/205/205 167/206/206 +f 159/197/197 167/206/206 160/198/198 +f 160/198/198 167/206/206 168/207/207 +f 160/198/198 168/207/207 161/199/199 +f 161/199/199 168/207/207 169/208/208 +f 161/199/199 169/208/208 162/200/200 +f 162/200/200 169/208/208 1427/209/209 +f 162/200/200 1427/209/209 1428/201/201 +f 14/93/93 15/95/95 170/210/210 +f 14/93/93 170/210/210 163/202/202 +f 163/202/202 170/210/210 171/211/211 +f 163/202/202 171/211/211 164/203/203 +f 164/203/203 171/211/211 172/212/212 +f 164/203/203 172/212/212 165/204/204 +f 165/204/204 172/212/212 173/213/213 +f 165/204/204 173/213/213 166/205/205 +f 166/205/205 173/213/213 174/214/214 +f 166/205/205 174/214/214 167/206/206 +f 167/206/206 174/214/214 175/215/215 +f 167/206/206 175/215/215 168/207/207 +f 168/207/207 175/215/215 176/216/216 +f 168/207/207 176/216/216 169/208/208 +f 169/208/208 176/216/216 1426/217/217 +f 169/208/208 1426/217/217 1427/209/209 +f 15/95/95 1403/97/97 1404/218/218 +f 15/95/95 1404/218/218 170/210/210 +f 170/210/210 1404/218/218 1405/219/219 +f 170/210/210 1405/219/219 171/211/211 +f 171/211/211 1405/219/219 1406/220/220 +f 171/211/211 1406/220/220 172/212/212 +f 172/212/212 1406/220/220 1407/221/221 +f 172/212/212 1407/221/221 173/213/213 +f 173/213/213 1407/221/221 1408/222/222 +f 173/213/213 1408/222/222 174/214/214 +f 174/214/214 1408/222/222 1409/223/223 +f 174/214/214 1409/223/223 175/215/215 +f 175/215/215 1409/223/223 1410/224/224 +f 175/215/215 1410/224/224 176/216/216 +f 176/216/216 1410/224/224 1533/225/225 +f 176/216/216 1533/225/225 1426/217/217 +f 1/1/1 16/155/155 177/226/226 +f 1/1/1 177/226/226 23/2/2 +f 23/2/2 177/226/226 178/227/227 +f 23/2/2 178/227/227 24/19/19 +f 24/19/19 178/227/227 179/228/228 +f 24/19/19 179/228/228 25/28/28 +f 25/28/28 179/228/228 180/229/229 +f 25/28/28 180/229/229 26/37/37 +f 26/37/37 180/229/229 181/230/230 +f 26/37/37 181/230/230 27/46/46 +f 27/46/46 181/230/230 182/231/231 +f 27/46/46 182/231/231 28/55/55 +f 28/55/55 182/231/231 183/232/232 +f 28/55/55 183/232/232 29/64/64 +f 29/64/64 183/232/232 1374/233/233 +f 29/64/64 1374/233/233 1373/73/73 +f 16/155/155 17/157/157 184/234/234 +f 16/155/155 184/234/234 177/226/226 +f 177/226/226 184/234/234 185/235/235 +f 177/226/226 185/235/235 178/227/227 +f 178/227/227 185/235/235 186/236/236 +f 178/227/227 186/236/236 179/228/228 +f 179/228/228 186/236/236 187/237/237 +f 179/228/228 187/237/237 180/229/229 +f 180/229/229 187/237/237 188/238/238 +f 180/229/229 188/238/238 181/230/230 +f 181/230/230 188/238/238 189/239/239 +f 181/230/230 189/239/239 182/231/231 +f 182/231/231 189/239/239 190/240/240 +f 182/231/231 190/240/240 183/232/232 +f 183/232/232 190/240/240 1375/241/241 +f 183/232/232 1375/241/241 1374/233/233 +f 17/157/157 18/159/159 191/242/242 +f 17/157/157 191/242/242 184/234/234 +f 184/234/234 191/242/242 192/243/243 +f 184/234/234 192/243/243 185/235/235 +f 185/235/235 192/243/243 193/244/244 +f 185/235/235 193/244/244 186/236/236 +f 186/236/236 193/244/244 194/245/245 +f 186/236/236 194/245/245 187/237/237 +f 187/237/237 194/245/245 195/246/246 +f 187/237/237 195/246/246 188/238/238 +f 188/238/238 195/246/246 196/247/247 +f 188/238/238 196/247/247 189/239/239 +f 189/239/239 196/247/247 197/248/248 +f 189/239/239 197/248/248 190/240/240 +f 190/240/240 197/248/248 1376/249/249 +f 190/240/240 1376/249/249 1375/241/241 +f 18/159/159 19/161/161 198/250/250 +f 18/159/159 198/250/250 191/242/242 +f 191/242/242 198/250/250 199/251/251 +f 191/242/242 199/251/251 192/243/243 +f 192/243/243 199/251/251 200/252/252 +f 192/243/243 200/252/252 193/244/244 +f 193/244/244 200/252/252 201/253/253 +f 193/244/244 201/253/253 194/245/245 +f 194/245/245 201/253/253 202/254/254 +f 194/245/245 202/254/254 195/246/246 +f 195/246/246 202/254/254 203/255/255 +f 195/246/246 203/255/255 196/247/247 +f 196/247/247 203/255/255 204/256/256 +f 196/247/247 204/256/256 197/248/248 +f 197/248/248 204/256/256 1377/257/257 +f 197/248/248 1377/257/257 1376/249/249 +f 19/161/161 20/163/163 205/258/258 +f 19/161/161 205/258/258 198/250/250 +f 198/250/250 205/258/258 206/259/259 +f 198/250/250 206/259/259 199/251/251 +f 199/251/251 206/259/259 207/260/260 +f 199/251/251 207/260/260 200/252/252 +f 200/252/252 207/260/260 208/261/261 +f 200/252/252 208/261/261 201/253/253 +f 201/253/253 208/261/261 209/262/262 +f 201/253/253 209/262/262 202/254/254 +f 202/254/254 209/262/262 210/263/263 +f 202/254/254 210/263/263 203/255/255 +f 203/255/255 210/263/263 211/264/264 +f 203/255/255 211/264/264 204/256/256 +f 204/256/256 211/264/264 1378/265/265 +f 204/256/256 1378/265/265 1377/257/257 +f 20/163/163 21/165/165 212/266/266 +f 20/163/163 212/266/266 205/258/258 +f 205/258/258 212/266/266 213/267/267 +f 205/258/258 213/267/267 206/259/259 +f 206/259/259 213/267/267 214/268/268 +f 206/259/259 214/268/268 207/260/260 +f 207/260/260 214/268/268 215/269/269 +f 207/260/260 215/269/269 208/261/261 +f 208/261/261 215/269/269 216/270/270 +f 208/261/261 216/270/270 209/262/262 +f 209/262/262 216/270/270 217/271/271 +f 209/262/262 217/271/271 210/263/263 +f 210/263/263 217/271/271 218/272/272 +f 210/263/263 218/272/272 211/264/264 +f 211/264/264 218/272/272 1379/273/273 +f 211/264/264 1379/273/273 1378/265/265 +f 21/165/165 22/167/167 219/274/274 +f 21/165/165 219/274/274 212/266/266 +f 212/266/266 219/274/274 220/275/275 +f 212/266/266 220/275/275 213/267/267 +f 213/267/267 220/275/275 221/276/276 +f 213/267/267 221/276/276 214/268/268 +f 214/268/268 221/276/276 222/277/277 +f 214/268/268 222/277/277 215/269/269 +f 215/269/269 222/277/277 223/278/278 +f 215/269/269 223/278/278 216/270/270 +f 216/270/270 223/278/278 224/279/279 +f 216/270/270 224/279/279 217/271/271 +f 217/271/271 224/279/279 225/280/280 +f 217/271/271 225/280/280 218/272/272 +f 218/272/272 225/280/280 1380/281/281 +f 218/272/272 1380/281/281 1379/273/273 +f 22/167/167 1433/169/169 1434/282/282 +f 22/167/167 1434/282/282 219/274/274 +f 219/274/274 1434/282/282 1435/283/283 +f 219/274/274 1435/283/283 220/275/275 +f 220/275/275 1435/283/283 1436/284/284 +f 220/275/275 1436/284/284 221/276/276 +f 221/276/276 1436/284/284 1437/285/285 +f 221/276/276 1437/285/285 222/277/277 +f 222/277/277 1437/285/285 1438/286/286 +f 222/277/277 1438/286/286 223/278/278 +f 223/278/278 1438/286/286 1439/287/287 +f 223/278/278 1439/287/287 224/279/279 +f 224/279/279 1439/287/287 1440/288/288 +f 224/279/279 1440/288/288 225/280/280 +f 225/280/280 1440/288/288 1534/289/289 +f 225/280/280 1534/289/289 1380/281/281 +f 226/290/290 248/291/291 255/292/292 +f 226/290/290 255/292/292 227/293/293 +f 227/293/293 255/292/292 256/294/294 +f 227/293/293 256/294/294 228/295/295 +f 228/295/295 256/294/294 257/296/296 +f 228/295/295 257/296/296 229/297/297 +f 229/297/297 257/296/296 258/298/298 +f 229/297/297 258/298/298 230/299/299 +f 230/299/299 258/298/298 259/300/300 +f 230/299/299 259/300/300 231/301/301 +f 231/301/301 259/300/300 260/302/302 +f 231/301/301 260/302/302 232/303/303 +f 232/303/303 260/302/302 261/304/304 +f 232/303/303 261/304/304 233/305/305 +f 233/305/305 261/304/304 1492/306/306 +f 233/305/305 1492/306/306 1493/307/307 +f 248/291/291 249/308/308 262/309/309 +f 248/291/291 262/309/309 255/292/292 +f 255/292/292 262/309/309 263/310/310 +f 255/292/292 263/310/310 256/294/294 +f 256/294/294 263/310/310 264/311/311 +f 256/294/294 264/311/311 257/296/296 +f 257/296/296 264/311/311 265/312/312 +f 257/296/296 265/312/312 258/298/298 +f 258/298/298 265/312/312 266/313/313 +f 258/298/298 266/313/313 259/300/300 +f 259/300/300 266/313/313 267/314/314 +f 259/300/300 267/314/314 260/302/302 +f 260/302/302 267/314/314 268/315/315 +f 260/302/302 268/315/315 261/304/304 +f 261/304/304 268/315/315 1491/316/316 +f 261/304/304 1491/316/316 1492/306/306 +f 249/308/308 250/317/317 269/318/318 +f 249/308/308 269/318/318 262/309/309 +f 262/309/309 269/318/318 270/319/319 +f 262/309/309 270/319/319 263/310/310 +f 263/310/310 270/319/319 271/320/320 +f 263/310/310 271/320/320 264/311/311 +f 264/311/311 271/320/320 272/321/321 +f 264/311/311 272/321/321 265/312/312 +f 265/312/312 272/321/321 273/322/322 +f 265/312/312 273/322/322 266/313/313 +f 266/313/313 273/322/322 274/323/323 +f 266/313/313 274/323/323 267/314/314 +f 267/314/314 274/323/323 275/324/324 +f 267/314/314 275/324/324 268/315/315 +f 268/315/315 275/324/324 1490/325/325 +f 268/315/315 1490/325/325 1491/316/316 +f 250/317/317 251/326/326 276/327/327 +f 250/317/317 276/327/327 269/318/318 +f 269/318/318 276/327/327 277/328/328 +f 269/318/318 277/328/328 270/319/319 +f 270/319/319 277/328/328 278/329/329 +f 270/319/319 278/329/329 271/320/320 +f 271/320/320 278/329/329 279/330/330 +f 271/320/320 279/330/330 272/321/321 +f 272/321/321 279/330/330 280/331/331 +f 272/321/321 280/331/331 273/322/322 +f 273/322/322 280/331/331 281/332/332 +f 273/322/322 281/332/332 274/323/323 +f 274/323/323 281/332/332 282/333/333 +f 274/323/323 282/333/333 275/324/324 +f 275/324/324 282/333/333 1489/334/334 +f 275/324/324 1489/334/334 1490/325/325 +f 251/326/326 252/335/335 283/336/336 +f 251/326/326 283/336/336 276/327/327 +f 276/327/327 283/336/336 284/337/337 +f 276/327/327 284/337/337 277/328/328 +f 277/328/328 284/337/337 285/338/338 +f 277/328/328 285/338/338 278/329/329 +f 278/329/329 285/338/338 286/339/339 +f 278/329/329 286/339/339 279/330/330 +f 279/330/330 286/339/339 287/340/340 +f 279/330/330 287/340/340 280/331/331 +f 280/331/331 287/340/340 288/341/341 +f 280/331/331 288/341/341 281/332/332 +f 281/332/332 288/341/341 289/342/342 +f 281/332/332 289/342/342 282/333/333 +f 282/333/333 289/342/342 1488/343/343 +f 282/333/333 1488/343/343 1489/334/334 +f 252/335/335 253/344/344 290/345/345 +f 252/335/335 290/345/345 283/336/336 +f 283/336/336 290/345/345 291/346/346 +f 283/336/336 291/346/346 284/337/337 +f 284/337/337 291/346/346 292/347/347 +f 284/337/337 292/347/347 285/338/338 +f 285/338/338 292/347/347 293/348/348 +f 285/338/338 293/348/348 286/339/339 +f 286/339/339 293/348/348 294/349/349 +f 286/339/339 294/349/349 287/340/340 +f 287/340/340 294/349/349 295/350/350 +f 287/340/340 295/350/350 288/341/341 +f 288/341/341 295/350/350 296/351/351 +f 288/341/341 296/351/351 289/342/342 +f 289/342/342 296/351/351 1487/352/352 +f 289/342/342 1487/352/352 1488/343/343 +f 253/344/344 254/353/353 297/354/354 +f 253/344/344 297/354/354 290/345/345 +f 290/345/345 297/354/354 298/355/355 +f 290/345/345 298/355/355 291/346/346 +f 291/346/346 298/355/355 299/356/356 +f 291/346/346 299/356/356 292/347/347 +f 292/347/347 299/356/356 300/357/357 +f 292/347/347 300/357/357 293/348/348 +f 293/348/348 300/357/357 301/358/358 +f 293/348/348 301/358/358 294/349/349 +f 294/349/349 301/358/358 302/359/359 +f 294/349/349 302/359/359 295/350/350 +f 295/350/350 302/359/359 303/360/360 +f 295/350/350 303/360/360 296/351/351 +f 296/351/351 303/360/360 1486/361/361 +f 296/351/351 1486/361/361 1487/352/352 +f 254/353/353 1478/362/362 1477/363/363 +f 254/353/353 1477/363/363 297/354/354 +f 297/354/354 1477/363/363 1476/364/364 +f 297/354/354 1476/364/364 298/355/355 +f 298/355/355 1476/364/364 1475/365/365 +f 298/355/355 1475/365/365 299/356/356 +f 299/356/356 1475/365/365 1474/366/366 +f 299/356/356 1474/366/366 300/357/357 +f 300/357/357 1474/366/366 1473/367/367 +f 300/357/357 1473/367/367 301/358/358 +f 301/358/358 1473/367/367 1472/368/368 +f 301/358/358 1472/368/368 302/359/359 +f 302/359/359 1472/368/368 1471/369/369 +f 302/359/359 1471/369/369 303/360/360 +f 303/360/360 1471/369/369 1535/370/370 +f 303/360/360 1535/370/370 1486/361/361 +f 226/290/290 227/293/293 304/371/371 +f 226/290/290 304/371/371 234/372/372 +f 234/372/372 304/371/371 305/373/373 +f 234/372/372 305/373/373 235/374/374 +f 235/374/374 305/373/373 306/375/375 +f 235/374/374 306/375/375 236/376/376 +f 236/376/376 306/375/375 307/377/377 +f 236/376/376 307/377/377 237/378/378 +f 237/378/378 307/377/377 308/379/379 +f 237/378/378 308/379/379 238/380/380 +f 238/380/380 308/379/379 309/381/381 +f 238/380/380 309/381/381 239/382/382 +f 239/382/382 309/381/381 310/383/383 +f 239/382/382 310/383/383 240/384/384 +f 240/384/384 310/383/383 1524/385/385 +f 240/384/384 1524/385/385 1523/386/386 +f 227/293/293 228/295/295 311/387/387 +f 227/293/293 311/387/387 304/371/371 +f 304/371/371 311/387/387 312/388/388 +f 304/371/371 312/388/388 305/373/373 +f 305/373/373 312/388/388 313/389/389 +f 305/373/373 313/389/389 306/375/375 +f 306/375/375 313/389/389 314/390/390 +f 306/375/375 314/390/390 307/377/377 +f 307/377/377 314/390/390 315/391/391 +f 307/377/377 315/391/391 308/379/379 +f 308/379/379 315/391/391 316/392/392 +f 308/379/379 316/392/392 309/381/381 +f 309/381/381 316/392/392 317/393/393 +f 309/381/381 317/393/393 310/383/383 +f 310/383/383 317/393/393 1525/394/394 +f 310/383/383 1525/394/394 1524/385/385 +f 228/295/295 229/297/297 318/395/395 +f 228/295/295 318/395/395 311/387/387 +f 311/387/387 318/395/395 319/396/396 +f 311/387/387 319/396/396 312/388/388 +f 312/388/388 319/396/396 320/397/397 +f 312/388/388 320/397/397 313/389/389 +f 313/389/389 320/397/397 321/398/398 +f 313/389/389 321/398/398 314/390/390 +f 314/390/390 321/398/398 322/399/399 +f 314/390/390 322/399/399 315/391/391 +f 315/391/391 322/399/399 323/400/400 +f 315/391/391 323/400/400 316/392/392 +f 316/392/392 323/400/400 324/401/401 +f 316/392/392 324/401/401 317/393/393 +f 317/393/393 324/401/401 1526/402/402 +f 317/393/393 1526/402/402 1525/394/394 +f 229/297/297 230/299/299 325/403/403 +f 229/297/297 325/403/403 318/395/395 +f 318/395/395 325/403/403 326/404/404 +f 318/395/395 326/404/404 319/396/396 +f 319/396/396 326/404/404 327/405/405 +f 319/396/396 327/405/405 320/397/397 +f 320/397/397 327/405/405 328/406/406 +f 320/397/397 328/406/406 321/398/398 +f 321/398/398 328/406/406 329/407/407 +f 321/398/398 329/407/407 322/399/399 +f 322/399/399 329/407/407 330/408/408 +f 322/399/399 330/408/408 323/400/400 +f 323/400/400 330/408/408 331/409/409 +f 323/400/400 331/409/409 324/401/401 +f 324/401/401 331/409/409 1527/410/410 +f 324/401/401 1527/410/410 1526/402/402 +f 230/299/299 231/301/301 332/411/411 +f 230/299/299 332/411/411 325/403/403 +f 325/403/403 332/411/411 333/412/412 +f 325/403/403 333/412/412 326/404/404 +f 326/404/404 333/412/412 334/413/413 +f 326/404/404 334/413/413 327/405/405 +f 327/405/405 334/413/413 335/414/414 +f 327/405/405 335/414/414 328/406/406 +f 328/406/406 335/414/414 336/415/415 +f 328/406/406 336/415/415 329/407/407 +f 329/407/407 336/415/415 337/416/416 +f 329/407/407 337/416/416 330/408/408 +f 330/408/408 337/416/416 338/417/417 +f 330/408/408 338/417/417 331/409/409 +f 331/409/409 338/417/417 1528/418/418 +f 331/409/409 1528/418/418 1527/410/410 +f 231/301/301 232/303/303 339/419/419 +f 231/301/301 339/419/419 332/411/411 +f 332/411/411 339/419/419 340/420/420 +f 332/411/411 340/420/420 333/412/412 +f 333/412/412 340/420/420 341/421/421 +f 333/412/412 341/421/421 334/413/413 +f 334/413/413 341/421/421 342/422/422 +f 334/413/413 342/422/422 335/414/414 +f 335/414/414 342/422/422 343/423/423 +f 335/414/414 343/423/423 336/415/415 +f 336/415/415 343/423/423 344/424/424 +f 336/415/415 344/424/424 337/416/416 +f 337/416/416 344/424/424 345/425/425 +f 337/416/416 345/425/425 338/417/417 +f 338/417/417 345/425/425 1529/426/426 +f 338/417/417 1529/426/426 1528/418/418 +f 232/303/303 233/305/305 346/427/427 +f 232/303/303 346/427/427 339/419/419 +f 339/419/419 346/427/427 347/428/428 +f 339/419/419 347/428/428 340/420/420 +f 340/420/420 347/428/428 348/429/429 +f 340/420/420 348/429/429 341/421/421 +f 341/421/421 348/429/429 349/430/430 +f 341/421/421 349/430/430 342/422/422 +f 342/422/422 349/430/430 350/431/431 +f 342/422/422 350/431/431 343/423/423 +f 343/423/423 350/431/431 351/432/432 +f 343/423/423 351/432/432 344/424/424 +f 344/424/424 351/432/432 352/433/433 +f 344/424/424 352/433/433 345/425/425 +f 345/425/425 352/433/433 1530/434/434 +f 345/425/425 1530/434/434 1529/426/426 +f 233/305/305 1493/307/307 1494/435/435 +f 233/305/305 1494/435/435 346/427/427 +f 346/427/427 1494/435/435 1495/436/436 +f 346/427/427 1495/436/436 347/428/428 +f 347/428/428 1495/436/436 1496/437/437 +f 347/428/428 1496/437/437 348/429/429 +f 348/429/429 1496/437/437 1497/438/438 +f 348/429/429 1497/438/438 349/430/430 +f 349/430/430 1497/438/438 1498/439/439 +f 349/430/430 1498/439/439 350/431/431 +f 350/431/431 1498/439/439 1499/440/440 +f 350/431/431 1499/440/440 351/432/432 +f 351/432/432 1499/440/440 1500/441/441 +f 351/432/432 1500/441/441 352/433/433 +f 352/433/433 1500/441/441 1538/442/442 +f 352/433/433 1538/442/442 1530/434/434 +f 226/290/290 234/372/372 353/443/443 +f 226/290/290 353/443/443 241/444/444 +f 241/444/444 353/443/443 354/445/445 +f 241/444/444 354/445/445 242/446/446 +f 242/446/446 354/445/445 355/447/447 +f 242/446/446 355/447/447 243/448/448 +f 243/448/448 355/447/447 356/449/449 +f 243/448/448 356/449/449 244/450/450 +f 244/450/450 356/449/449 357/451/451 +f 244/450/450 357/451/451 245/452/452 +f 245/452/452 357/451/451 358/453/453 +f 245/452/452 358/453/453 246/454/454 +f 246/454/454 358/453/453 359/455/455 +f 246/454/454 359/455/455 247/456/456 +f 247/456/456 359/455/455 1509/457/457 +f 247/456/456 1509/457/457 1508/458/458 +f 234/372/372 235/374/374 360/459/459 +f 234/372/372 360/459/459 353/443/443 +f 353/443/443 360/459/459 361/460/460 +f 353/443/443 361/460/460 354/445/445 +f 354/445/445 361/460/460 362/461/461 +f 354/445/445 362/461/461 355/447/447 +f 355/447/447 362/461/461 363/462/462 +f 355/447/447 363/462/462 356/449/449 +f 356/449/449 363/462/462 364/463/463 +f 356/449/449 364/463/463 357/451/451 +f 357/451/451 364/463/463 365/464/464 +f 357/451/451 365/464/464 358/453/453 +f 358/453/453 365/464/464 366/465/465 +f 358/453/453 366/465/465 359/455/455 +f 359/455/455 366/465/465 1510/466/466 +f 359/455/455 1510/466/466 1509/457/457 +f 235/374/374 236/376/376 367/467/467 +f 235/374/374 367/467/467 360/459/459 +f 360/459/459 367/467/467 368/468/468 +f 360/459/459 368/468/468 361/460/460 +f 361/460/460 368/468/468 369/469/469 +f 361/460/460 369/469/469 362/461/461 +f 362/461/461 369/469/469 370/470/470 +f 362/461/461 370/470/470 363/462/462 +f 363/462/462 370/470/470 371/471/471 +f 363/462/462 371/471/471 364/463/463 +f 364/463/463 371/471/471 372/472/472 +f 364/463/463 372/472/472 365/464/464 +f 365/464/464 372/472/472 373/473/473 +f 365/464/464 373/473/473 366/465/465 +f 366/465/465 373/473/473 1511/474/474 +f 366/465/465 1511/474/474 1510/466/466 +f 236/376/376 237/378/378 374/475/475 +f 236/376/376 374/475/475 367/467/467 +f 367/467/467 374/475/475 375/476/476 +f 367/467/467 375/476/476 368/468/468 +f 368/468/468 375/476/476 376/477/477 +f 368/468/468 376/477/477 369/469/469 +f 369/469/469 376/477/477 377/478/478 +f 369/469/469 377/478/478 370/470/470 +f 370/470/470 377/478/478 378/479/479 +f 370/470/470 378/479/479 371/471/471 +f 371/471/471 378/479/479 379/480/480 +f 371/471/471 379/480/480 372/472/472 +f 372/472/472 379/480/480 380/481/481 +f 372/472/472 380/481/481 373/473/473 +f 373/473/473 380/481/481 1512/482/482 +f 373/473/473 1512/482/482 1511/474/474 +f 237/378/378 238/380/380 381/483/483 +f 237/378/378 381/483/483 374/475/475 +f 374/475/475 381/483/483 382/484/484 +f 374/475/475 382/484/484 375/476/476 +f 375/476/476 382/484/484 383/485/485 +f 375/476/476 383/485/485 376/477/477 +f 376/477/477 383/485/485 384/486/486 +f 376/477/477 384/486/486 377/478/478 +f 377/478/478 384/486/486 385/487/487 +f 377/478/478 385/487/487 378/479/479 +f 378/479/479 385/487/487 386/488/488 +f 378/479/479 386/488/488 379/480/480 +f 379/480/480 386/488/488 387/489/489 +f 379/480/480 387/489/489 380/481/481 +f 380/481/481 387/489/489 1513/490/490 +f 380/481/481 1513/490/490 1512/482/482 +f 238/380/380 239/382/382 388/491/491 +f 238/380/380 388/491/491 381/483/483 +f 381/483/483 388/491/491 389/492/492 +f 381/483/483 389/492/492 382/484/484 +f 382/484/484 389/492/492 390/493/493 +f 382/484/484 390/493/493 383/485/485 +f 383/485/485 390/493/493 391/494/494 +f 383/485/485 391/494/494 384/486/486 +f 384/486/486 391/494/494 392/495/495 +f 384/486/486 392/495/495 385/487/487 +f 385/487/487 392/495/495 393/496/496 +f 385/487/487 393/496/496 386/488/488 +f 386/488/488 393/496/496 394/497/497 +f 386/488/488 394/497/497 387/489/489 +f 387/489/489 394/497/497 1514/498/498 +f 387/489/489 1514/498/498 1513/490/490 +f 239/382/382 240/384/384 395/499/499 +f 239/382/382 395/499/499 388/491/491 +f 388/491/491 395/499/499 396/500/500 +f 388/491/491 396/500/500 389/492/492 +f 389/492/492 396/500/500 397/501/501 +f 389/492/492 397/501/501 390/493/493 +f 390/493/493 397/501/501 398/502/502 +f 390/493/493 398/502/502 391/494/494 +f 391/494/494 398/502/502 399/503/503 +f 391/494/494 399/503/503 392/495/495 +f 392/495/495 399/503/503 400/504/504 +f 392/495/495 400/504/504 393/496/496 +f 393/496/496 400/504/504 401/505/505 +f 393/496/496 401/505/505 394/497/497 +f 394/497/497 401/505/505 1515/506/506 +f 394/497/497 1515/506/506 1514/498/498 +f 240/384/384 1523/386/386 1522/507/507 +f 240/384/384 1522/507/507 395/499/499 +f 395/499/499 1522/507/507 1521/508/508 +f 395/499/499 1521/508/508 396/500/500 +f 396/500/500 1521/508/508 1520/509/509 +f 396/500/500 1520/509/509 397/501/501 +f 397/501/501 1520/509/509 1519/510/510 +f 397/501/501 1519/510/510 398/502/502 +f 398/502/502 1519/510/510 1518/511/511 +f 398/502/502 1518/511/511 399/503/503 +f 399/503/503 1518/511/511 1517/512/512 +f 399/503/503 1517/512/512 400/504/504 +f 400/504/504 1517/512/512 1516/513/513 +f 400/504/504 1516/513/513 401/505/505 +f 401/505/505 1516/513/513 1537/153/514 +f 401/505/505 1537/153/514 1515/506/506 +f 226/290/290 241/444/444 402/514/515 +f 226/290/290 402/514/515 248/291/291 +f 248/291/291 402/514/515 403/515/516 +f 248/291/291 403/515/516 249/308/308 +f 249/308/308 403/515/516 404/516/517 +f 249/308/308 404/516/517 250/317/317 +f 250/317/317 404/516/517 405/517/518 +f 250/317/317 405/517/518 251/326/326 +f 251/326/326 405/517/518 406/518/519 +f 251/326/326 406/518/519 252/335/335 +f 252/335/335 406/518/519 407/519/520 +f 252/335/335 407/519/520 253/344/344 +f 253/344/344 407/519/520 408/520/521 +f 253/344/344 408/520/521 254/353/353 +f 254/353/353 408/520/521 1479/521/522 +f 254/353/353 1479/521/522 1478/362/362 +f 241/444/444 242/446/446 409/522/523 +f 241/444/444 409/522/523 402/514/515 +f 402/514/515 409/522/523 410/523/524 +f 402/514/515 410/523/524 403/515/516 +f 403/515/516 410/523/524 411/524/525 +f 403/515/516 411/524/525 404/516/517 +f 404/516/517 411/524/525 412/525/526 +f 404/516/517 412/525/526 405/517/518 +f 405/517/518 412/525/526 413/526/527 +f 405/517/518 413/526/527 406/518/519 +f 406/518/519 413/526/527 414/527/528 +f 406/518/519 414/527/528 407/519/520 +f 407/519/520 414/527/528 415/528/529 +f 407/519/520 415/528/529 408/520/521 +f 408/520/521 415/528/529 1480/529/530 +f 408/520/521 1480/529/530 1479/521/522 +f 242/446/446 243/448/448 416/530/531 +f 242/446/446 416/530/531 409/522/523 +f 409/522/523 416/530/531 417/531/532 +f 409/522/523 417/531/532 410/523/524 +f 410/523/524 417/531/532 418/532/533 +f 410/523/524 418/532/533 411/524/525 +f 411/524/525 418/532/533 419/533/534 +f 411/524/525 419/533/534 412/525/526 +f 412/525/526 419/533/534 420/534/535 +f 412/525/526 420/534/535 413/526/527 +f 413/526/527 420/534/535 421/535/536 +f 413/526/527 421/535/536 414/527/528 +f 414/527/528 421/535/536 422/536/537 +f 414/527/528 422/536/537 415/528/529 +f 415/528/529 422/536/537 1481/537/538 +f 415/528/529 1481/537/538 1480/529/530 +f 243/448/448 244/450/450 423/538/539 +f 243/448/448 423/538/539 416/530/531 +f 416/530/531 423/538/539 424/539/540 +f 416/530/531 424/539/540 417/531/532 +f 417/531/532 424/539/540 425/540/541 +f 417/531/532 425/540/541 418/532/533 +f 418/532/533 425/540/541 426/541/542 +f 418/532/533 426/541/542 419/533/534 +f 419/533/534 426/541/542 427/542/543 +f 419/533/534 427/542/543 420/534/535 +f 420/534/535 427/542/543 428/543/544 +f 420/534/535 428/543/544 421/535/536 +f 421/535/536 428/543/544 429/544/545 +f 421/535/536 429/544/545 422/536/537 +f 422/536/537 429/544/545 1482/545/546 +f 422/536/537 1482/545/546 1481/537/538 +f 244/450/450 245/452/452 430/546/547 +f 244/450/450 430/546/547 423/538/539 +f 423/538/539 430/546/547 431/547/548 +f 423/538/539 431/547/548 424/539/540 +f 424/539/540 431/547/548 432/548/549 +f 424/539/540 432/548/549 425/540/541 +f 425/540/541 432/548/549 433/549/550 +f 425/540/541 433/549/550 426/541/542 +f 426/541/542 433/549/550 434/550/551 +f 426/541/542 434/550/551 427/542/543 +f 427/542/543 434/550/551 435/551/552 +f 427/542/543 435/551/552 428/543/544 +f 428/543/544 435/551/552 436/552/553 +f 428/543/544 436/552/553 429/544/545 +f 429/544/545 436/552/553 1483/553/554 +f 429/544/545 1483/553/554 1482/545/546 +f 245/452/452 246/454/454 437/554/555 +f 245/452/452 437/554/555 430/546/547 +f 430/546/547 437/554/555 438/555/556 +f 430/546/547 438/555/556 431/547/548 +f 431/547/548 438/555/556 439/556/557 +f 431/547/548 439/556/557 432/548/549 +f 432/548/549 439/556/557 440/557/558 +f 432/548/549 440/557/558 433/549/550 +f 433/549/550 440/557/558 441/558/559 +f 433/549/550 441/558/559 434/550/551 +f 434/550/551 441/558/559 442/559/560 +f 434/550/551 442/559/560 435/551/552 +f 435/551/552 442/559/560 443/560/561 +f 435/551/552 443/560/561 436/552/553 +f 436/552/553 443/560/561 1484/561/562 +f 436/552/553 1484/561/562 1483/553/554 +f 246/454/454 247/456/456 444/562/563 +f 246/454/454 444/562/563 437/554/555 +f 437/554/555 444/562/563 445/563/564 +f 437/554/555 445/563/564 438/555/556 +f 438/555/556 445/563/564 446/564/565 +f 438/555/556 446/564/565 439/556/557 +f 439/556/557 446/564/565 447/565/566 +f 439/556/557 447/565/566 440/557/558 +f 440/557/558 447/565/566 448/566/567 +f 440/557/558 448/566/567 441/558/559 +f 441/558/559 448/566/567 449/567/568 +f 441/558/559 449/567/568 442/559/560 +f 442/559/560 449/567/568 450/568/569 +f 442/559/560 450/568/569 443/560/561 +f 443/560/561 450/568/569 1485/569/570 +f 443/560/561 1485/569/570 1484/561/562 +f 247/456/456 1508/458/458 1507/570/571 +f 247/456/456 1507/570/571 444/562/563 +f 444/562/563 1507/570/571 1506/571/572 +f 444/562/563 1506/571/572 445/563/564 +f 445/563/564 1506/571/572 1505/572/573 +f 445/563/564 1505/572/573 446/564/565 +f 446/564/565 1505/572/573 1504/573/574 +f 446/564/565 1504/573/574 447/565/566 +f 447/565/566 1504/573/574 1503/574/575 +f 447/565/566 1503/574/575 448/566/567 +f 448/566/567 1503/574/575 1502/575/576 +f 448/566/567 1502/575/576 449/567/568 +f 449/567/568 1502/575/576 1501/576/577 +f 449/567/568 1501/576/577 450/568/569 +f 450/568/569 1501/576/577 1536/577/578 +f 450/568/569 1536/577/578 1485/569/570 +f 451/578/579 473/579/580 480/580/581 +f 451/578/579 480/580/581 452/581/582 +f 452/581/582 480/580/581 481/582/583 +f 452/581/582 481/582/583 453/583/584 +f 453/583/584 481/582/583 482/584/585 +f 453/583/584 482/584/585 454/585/586 +f 454/585/586 482/584/585 483/586/587 +f 454/585/586 483/586/587 455/587/588 +f 455/587/588 483/586/587 484/588/589 +f 455/587/588 484/588/589 456/589/590 +f 456/589/590 484/588/589 485/590/591 +f 456/589/590 485/590/591 457/591/592 +f 457/591/592 485/590/591 486/592/593 +f 457/591/592 486/592/593 458/593/594 +f 458/593/594 486/592/593 1387/594/595 +f 458/593/594 1387/594/595 1388/595/596 +f 473/579/580 474/596/597 487/597/598 +f 473/579/580 487/597/598 480/580/581 +f 480/580/581 487/597/598 488/598/599 +f 480/580/581 488/598/599 481/582/583 +f 481/582/583 488/598/599 489/599/600 +f 481/582/583 489/599/600 482/584/585 +f 482/584/585 489/599/600 490/600/601 +f 482/584/585 490/600/601 483/586/587 +f 483/586/587 490/600/601 491/601/602 +f 483/586/587 491/601/602 484/588/589 +f 484/588/589 491/601/602 492/602/603 +f 484/588/589 492/602/603 485/590/591 +f 485/590/591 492/602/603 493/603/604 +f 485/590/591 493/603/604 486/592/593 +f 486/592/593 493/603/604 1386/604/605 +f 486/592/593 1386/604/605 1387/594/595 +f 474/596/597 475/605/606 494/606/607 +f 474/596/597 494/606/607 487/597/598 +f 487/597/598 494/606/607 495/607/608 +f 487/597/598 495/607/608 488/598/599 +f 488/598/599 495/607/608 496/608/609 +f 488/598/599 496/608/609 489/599/600 +f 489/599/600 496/608/609 497/609/610 +f 489/599/600 497/609/610 490/600/601 +f 490/600/601 497/609/610 498/610/611 +f 490/600/601 498/610/611 491/601/602 +f 491/601/602 498/610/611 499/611/612 +f 491/601/602 499/611/612 492/602/603 +f 492/602/603 499/611/612 500/612/613 +f 492/602/603 500/612/613 493/603/604 +f 493/603/604 500/612/613 1385/613/614 +f 493/603/604 1385/613/614 1386/604/605 +f 475/605/606 476/614/615 501/615/616 +f 475/605/606 501/615/616 494/606/607 +f 494/606/607 501/615/616 502/616/617 +f 494/606/607 502/616/617 495/607/608 +f 495/607/608 502/616/617 503/617/618 +f 495/607/608 503/617/618 496/608/609 +f 496/608/609 503/617/618 504/618/619 +f 496/608/609 504/618/619 497/609/610 +f 497/609/610 504/618/619 505/619/620 +f 497/609/610 505/619/620 498/610/611 +f 498/610/611 505/619/620 506/620/621 +f 498/610/611 506/620/621 499/611/612 +f 499/611/612 506/620/621 507/621/622 +f 499/611/612 507/621/622 500/612/613 +f 500/612/613 507/621/622 1384/622/623 +f 500/612/613 1384/622/623 1385/613/614 +f 476/614/615 477/623/624 508/624/625 +f 476/614/615 508/624/625 501/615/616 +f 501/615/616 508/624/625 509/625/626 +f 501/615/616 509/625/626 502/616/617 +f 502/616/617 509/625/626 510/626/627 +f 502/616/617 510/626/627 503/617/618 +f 503/617/618 510/626/627 511/627/628 +f 503/617/618 511/627/628 504/618/619 +f 504/618/619 511/627/628 512/628/629 +f 504/618/619 512/628/629 505/619/620 +f 505/619/620 512/628/629 513/629/630 +f 505/619/620 513/629/630 506/620/621 +f 506/620/621 513/629/630 514/630/631 +f 506/620/621 514/630/631 507/621/622 +f 507/621/622 514/630/631 1383/631/632 +f 507/621/622 1383/631/632 1384/622/623 +f 477/623/624 478/632/633 515/633/634 +f 477/623/624 515/633/634 508/624/625 +f 508/624/625 515/633/634 516/634/635 +f 508/624/625 516/634/635 509/625/626 +f 509/625/626 516/634/635 517/635/636 +f 509/625/626 517/635/636 510/626/627 +f 510/626/627 517/635/636 518/636/637 +f 510/626/627 518/636/637 511/627/628 +f 511/627/628 518/636/637 519/637/638 +f 511/627/628 519/637/638 512/628/629 +f 512/628/629 519/637/638 520/638/639 +f 512/628/629 520/638/639 513/629/630 +f 513/629/630 520/638/639 521/639/640 +f 513/629/630 521/639/640 514/630/631 +f 514/630/631 521/639/640 1382/640/641 +f 514/630/631 1382/640/641 1383/631/632 +f 478/632/633 479/641/642 522/642/643 +f 478/632/633 522/642/643 515/633/634 +f 515/633/634 522/642/643 523/643/644 +f 515/633/634 523/643/644 516/634/635 +f 516/634/635 523/643/644 524/644/645 +f 516/634/635 524/644/645 517/635/636 +f 517/635/636 524/644/645 525/645/646 +f 517/635/636 525/645/646 518/636/637 +f 518/636/637 525/645/646 526/646/647 +f 518/636/637 526/646/647 519/637/638 +f 519/637/638 526/646/647 527/647/648 +f 519/637/638 527/647/648 520/638/639 +f 520/638/639 527/647/648 528/648/649 +f 520/638/639 528/648/649 521/639/640 +f 521/639/640 528/648/649 1381/649/650 +f 521/639/640 1381/649/650 1382/640/641 +f 479/641/642 1358/650/18 1357/651/17 +f 479/641/642 1357/651/17 522/642/643 +f 522/642/643 1357/651/17 1356/652/27 +f 522/642/643 1356/652/27 523/643/644 +f 523/643/644 1356/652/27 1355/653/36 +f 523/643/644 1355/653/36 524/644/645 +f 524/644/645 1355/653/36 1354/654/45 +f 524/644/645 1354/654/45 525/645/646 +f 525/645/646 1354/654/45 1353/655/54 +f 525/645/646 1353/655/54 526/646/647 +f 526/646/647 1353/655/54 1352/656/63 +f 526/646/647 1352/656/63 527/647/648 +f 527/647/648 1352/656/63 1351/657/72 +f 527/647/648 1351/657/72 528/648/649 +f 528/648/649 1351/657/72 1531/658/81 +f 528/648/649 1531/658/81 1381/649/650 +f 451/578/579 452/581/582 529/659/651 +f 451/578/579 529/659/651 459/660/652 +f 459/660/652 529/659/651 530/661/653 +f 459/660/652 530/661/653 460/662/654 +f 460/662/654 530/661/653 531/663/655 +f 460/662/654 531/663/655 461/664/656 +f 461/664/656 531/663/655 532/665/657 +f 461/664/656 532/665/657 462/666/658 +f 462/666/658 532/665/657 533/667/659 +f 462/666/658 533/667/659 463/668/660 +f 463/668/660 533/667/659 534/669/661 +f 463/668/660 534/669/661 464/670/662 +f 464/670/662 534/669/661 535/671/663 +f 464/670/662 535/671/663 465/672/664 +f 465/672/664 535/671/663 1477/673/363 +f 465/672/664 1477/673/363 1478/674/362 +f 452/581/582 453/583/584 536/675/665 +f 452/581/582 536/675/665 529/659/651 +f 529/659/651 536/675/665 537/676/666 +f 529/659/651 537/676/666 530/661/653 +f 530/661/653 537/676/666 538/677/667 +f 530/661/653 538/677/667 531/663/655 +f 531/663/655 538/677/667 539/678/668 +f 531/663/655 539/678/668 532/665/657 +f 532/665/657 539/678/668 540/679/669 +f 532/665/657 540/679/669 533/667/659 +f 533/667/659 540/679/669 541/680/670 +f 533/667/659 541/680/670 534/669/661 +f 534/669/661 541/680/670 542/681/671 +f 534/669/661 542/681/671 535/671/663 +f 535/671/663 542/681/671 1476/682/364 +f 535/671/663 1476/682/364 1477/673/363 +f 453/583/584 454/585/586 543/683/672 +f 453/583/584 543/683/672 536/675/665 +f 536/675/665 543/683/672 544/684/673 +f 536/675/665 544/684/673 537/676/666 +f 537/676/666 544/684/673 545/685/674 +f 537/676/666 545/685/674 538/677/667 +f 538/677/667 545/685/674 546/686/675 +f 538/677/667 546/686/675 539/678/668 +f 539/678/668 546/686/675 547/687/676 +f 539/678/668 547/687/676 540/679/669 +f 540/679/669 547/687/676 548/688/677 +f 540/679/669 548/688/677 541/680/670 +f 541/680/670 548/688/677 549/689/678 +f 541/680/670 549/689/678 542/681/671 +f 542/681/671 549/689/678 1475/690/365 +f 542/681/671 1475/690/365 1476/682/364 +f 454/585/586 455/587/588 550/691/679 +f 454/585/586 550/691/679 543/683/672 +f 543/683/672 550/691/679 551/692/680 +f 543/683/672 551/692/680 544/684/673 +f 544/684/673 551/692/680 552/693/681 +f 544/684/673 552/693/681 545/685/674 +f 545/685/674 552/693/681 553/694/682 +f 545/685/674 553/694/682 546/686/675 +f 546/686/675 553/694/682 554/695/683 +f 546/686/675 554/695/683 547/687/676 +f 547/687/676 554/695/683 555/696/684 +f 547/687/676 555/696/684 548/688/677 +f 548/688/677 555/696/684 556/697/685 +f 548/688/677 556/697/685 549/689/678 +f 549/689/678 556/697/685 1474/698/366 +f 549/689/678 1474/698/366 1475/690/365 +f 455/587/588 456/589/590 557/699/686 +f 455/587/588 557/699/686 550/691/679 +f 550/691/679 557/699/686 558/700/687 +f 550/691/679 558/700/687 551/692/680 +f 551/692/680 558/700/687 559/701/688 +f 551/692/680 559/701/688 552/693/681 +f 552/693/681 559/701/688 560/702/689 +f 552/693/681 560/702/689 553/694/682 +f 553/694/682 560/702/689 561/703/690 +f 553/694/682 561/703/690 554/695/683 +f 554/695/683 561/703/690 562/704/691 +f 554/695/683 562/704/691 555/696/684 +f 555/696/684 562/704/691 563/705/692 +f 555/696/684 563/705/692 556/697/685 +f 556/697/685 563/705/692 1473/706/367 +f 556/697/685 1473/706/367 1474/698/366 +f 456/589/590 457/591/592 564/707/693 +f 456/589/590 564/707/693 557/699/686 +f 557/699/686 564/707/693 565/708/694 +f 557/699/686 565/708/694 558/700/687 +f 558/700/687 565/708/694 566/709/695 +f 558/700/687 566/709/695 559/701/688 +f 559/701/688 566/709/695 567/710/696 +f 559/701/688 567/710/696 560/702/689 +f 560/702/689 567/710/696 568/711/697 +f 560/702/689 568/711/697 561/703/690 +f 561/703/690 568/711/697 569/712/698 +f 561/703/690 569/712/698 562/704/691 +f 562/704/691 569/712/698 570/713/699 +f 562/704/691 570/713/699 563/705/692 +f 563/705/692 570/713/699 1472/714/368 +f 563/705/692 1472/714/368 1473/706/367 +f 457/591/592 458/593/594 571/715/700 +f 457/591/592 571/715/700 564/707/693 +f 564/707/693 571/715/700 572/716/701 +f 564/707/693 572/716/701 565/708/694 +f 565/708/694 572/716/701 573/717/702 +f 565/708/694 573/717/702 566/709/695 +f 566/709/695 573/717/702 574/718/703 +f 566/709/695 574/718/703 567/710/696 +f 567/710/696 574/718/703 575/719/704 +f 567/710/696 575/719/704 568/711/697 +f 568/711/697 575/719/704 576/720/705 +f 568/711/697 576/720/705 569/712/698 +f 569/712/698 576/720/705 577/721/706 +f 569/712/698 577/721/706 570/713/699 +f 570/713/699 577/721/706 1471/722/369 +f 570/713/699 1471/722/369 1472/714/368 +f 458/593/594 1388/595/596 1389/723/707 +f 458/593/594 1389/723/707 571/715/700 +f 571/715/700 1389/723/707 1390/724/708 +f 571/715/700 1390/724/708 572/716/701 +f 572/716/701 1390/724/708 1391/725/709 +f 572/716/701 1391/725/709 573/717/702 +f 573/717/702 1391/725/709 1392/726/710 +f 573/717/702 1392/726/710 574/718/703 +f 574/718/703 1392/726/710 1393/727/711 +f 574/718/703 1393/727/711 575/719/704 +f 575/719/704 1393/727/711 1394/728/712 +f 575/719/704 1394/728/712 576/720/705 +f 576/720/705 1394/728/712 1395/729/713 +f 576/720/705 1395/729/713 577/721/706 +f 577/721/706 1395/729/713 1535/730/370 +f 577/721/706 1535/730/370 1471/722/369 +f 451/578/579 459/660/652 578/731/714 +f 451/578/579 578/731/714 466/732/715 +f 466/732/715 578/731/714 579/733/716 +f 466/732/715 579/733/716 467/734/717 +f 467/734/717 579/733/716 580/735/718 +f 467/734/717 580/735/718 468/736/719 +f 468/736/719 580/735/718 581/737/720 +f 468/736/719 581/737/720 469/738/721 +f 469/738/721 581/737/720 582/739/722 +f 469/738/721 582/739/722 470/740/723 +f 470/740/723 582/739/722 583/741/724 +f 470/740/723 583/741/724 471/742/725 +f 471/742/725 583/741/724 584/743/726 +f 471/742/725 584/743/726 472/744/727 +f 472/744/727 584/743/726 1419/745/728 +f 472/744/727 1419/745/728 1418/746/729 +f 459/660/652 460/662/654 585/747/730 +f 459/660/652 585/747/730 578/731/714 +f 578/731/714 585/747/730 586/748/731 +f 578/731/714 586/748/731 579/733/716 +f 579/733/716 586/748/731 587/749/732 +f 579/733/716 587/749/732 580/735/718 +f 580/735/718 587/749/732 588/750/733 +f 580/735/718 588/750/733 581/737/720 +f 581/737/720 588/750/733 589/751/734 +f 581/737/720 589/751/734 582/739/722 +f 582/739/722 589/751/734 590/752/735 +f 582/739/722 590/752/735 583/741/724 +f 583/741/724 590/752/735 591/753/736 +f 583/741/724 591/753/736 584/743/726 +f 584/743/726 591/753/736 1420/754/737 +f 584/743/726 1420/754/737 1419/745/728 +f 460/662/654 461/664/656 592/755/738 +f 460/662/654 592/755/738 585/747/730 +f 585/747/730 592/755/738 593/756/739 +f 585/747/730 593/756/739 586/748/731 +f 586/748/731 593/756/739 594/757/740 +f 586/748/731 594/757/740 587/749/732 +f 587/749/732 594/757/740 595/758/741 +f 587/749/732 595/758/741 588/750/733 +f 588/750/733 595/758/741 596/759/742 +f 588/750/733 596/759/742 589/751/734 +f 589/751/734 596/759/742 597/760/743 +f 589/751/734 597/760/743 590/752/735 +f 590/752/735 597/760/743 598/761/744 +f 590/752/735 598/761/744 591/753/736 +f 591/753/736 598/761/744 1421/762/745 +f 591/753/736 1421/762/745 1420/754/737 +f 461/664/656 462/666/658 599/763/746 +f 461/664/656 599/763/746 592/755/738 +f 592/755/738 599/763/746 600/764/747 +f 592/755/738 600/764/747 593/756/739 +f 593/756/739 600/764/747 601/765/748 +f 593/756/739 601/765/748 594/757/740 +f 594/757/740 601/765/748 602/766/749 +f 594/757/740 602/766/749 595/758/741 +f 595/758/741 602/766/749 603/767/750 +f 595/758/741 603/767/750 596/759/742 +f 596/759/742 603/767/750 604/768/751 +f 596/759/742 604/768/751 597/760/743 +f 597/760/743 604/768/751 605/769/752 +f 597/760/743 605/769/752 598/761/744 +f 598/761/744 605/769/752 1422/770/753 +f 598/761/744 1422/770/753 1421/762/745 +f 462/666/658 463/668/660 606/771/754 +f 462/666/658 606/771/754 599/763/746 +f 599/763/746 606/771/754 607/772/755 +f 599/763/746 607/772/755 600/764/747 +f 600/764/747 607/772/755 608/773/756 +f 600/764/747 608/773/756 601/765/748 +f 601/765/748 608/773/756 609/774/757 +f 601/765/748 609/774/757 602/766/749 +f 602/766/749 609/774/757 610/775/758 +f 602/766/749 610/775/758 603/767/750 +f 603/767/750 610/775/758 611/776/759 +f 603/767/750 611/776/759 604/768/751 +f 604/768/751 611/776/759 612/777/760 +f 604/768/751 612/777/760 605/769/752 +f 605/769/752 612/777/760 1423/778/761 +f 605/769/752 1423/778/761 1422/770/753 +f 463/668/660 464/670/662 613/779/762 +f 463/668/660 613/779/762 606/771/754 +f 606/771/754 613/779/762 614/780/763 +f 606/771/754 614/780/763 607/772/755 +f 607/772/755 614/780/763 615/781/764 +f 607/772/755 615/781/764 608/773/756 +f 608/773/756 615/781/764 616/782/765 +f 608/773/756 616/782/765 609/774/757 +f 609/774/757 616/782/765 617/783/766 +f 609/774/757 617/783/766 610/775/758 +f 610/775/758 617/783/766 618/784/767 +f 610/775/758 618/784/767 611/776/759 +f 611/776/759 618/784/767 619/785/768 +f 611/776/759 619/785/768 612/777/760 +f 612/777/760 619/785/768 1424/786/769 +f 612/777/760 1424/786/769 1423/778/761 +f 464/670/662 465/672/664 620/787/770 +f 464/670/662 620/787/770 613/779/762 +f 613/779/762 620/787/770 621/788/771 +f 613/779/762 621/788/771 614/780/763 +f 614/780/763 621/788/771 622/789/772 +f 614/780/763 622/789/772 615/781/764 +f 615/781/764 622/789/772 623/790/773 +f 615/781/764 623/790/773 616/782/765 +f 616/782/765 623/790/773 624/791/774 +f 616/782/765 624/791/774 617/783/766 +f 617/783/766 624/791/774 625/792/775 +f 617/783/766 625/792/775 618/784/767 +f 618/784/767 625/792/775 626/793/776 +f 618/784/767 626/793/776 619/785/768 +f 619/785/768 626/793/776 1425/794/777 +f 619/785/768 1425/794/777 1424/786/769 +f 465/672/664 1478/674/362 1479/795/522 +f 465/672/664 1479/795/522 620/787/770 +f 620/787/770 1479/795/522 1480/796/530 +f 620/787/770 1480/796/530 621/788/771 +f 621/788/771 1480/796/530 1481/797/538 +f 621/788/771 1481/797/538 622/789/772 +f 622/789/772 1481/797/538 1482/798/546 +f 622/789/772 1482/798/546 623/790/773 +f 623/790/773 1482/798/546 1483/799/554 +f 623/790/773 1483/799/554 624/791/774 +f 624/791/774 1483/799/554 1484/800/562 +f 624/791/774 1484/800/562 625/792/775 +f 625/792/775 1484/800/562 1485/801/570 +f 625/792/775 1485/801/570 626/793/776 +f 626/793/776 1485/801/570 1536/577/578 +f 626/793/776 1536/577/578 1425/794/777 +f 451/578/579 466/732/715 627/802/778 +f 451/578/579 627/802/778 473/579/580 +f 473/579/580 627/802/778 628/803/779 +f 473/579/580 628/803/779 474/596/597 +f 474/596/597 628/803/779 629/804/780 +f 474/596/597 629/804/780 475/605/606 +f 475/605/606 629/804/780 630/805/781 +f 475/605/606 630/805/781 476/614/615 +f 476/614/615 630/805/781 631/806/782 +f 476/614/615 631/806/782 477/623/624 +f 477/623/624 631/806/782 632/807/783 +f 477/623/624 632/807/783 478/632/633 +f 478/632/633 632/807/783 633/808/784 +f 478/632/633 633/808/784 479/641/642 +f 479/641/642 633/808/784 1359/809/146 +f 479/641/642 1359/809/146 1358/650/18 +f 466/732/715 467/734/717 634/810/785 +f 466/732/715 634/810/785 627/802/778 +f 627/802/778 634/810/785 635/811/786 +f 627/802/778 635/811/786 628/803/779 +f 628/803/779 635/811/786 636/812/787 +f 628/803/779 636/812/787 629/804/780 +f 629/804/780 636/812/787 637/813/788 +f 629/804/780 637/813/788 630/805/781 +f 630/805/781 637/813/788 638/814/789 +f 630/805/781 638/814/789 631/806/782 +f 631/806/782 638/814/789 639/815/790 +f 631/806/782 639/815/790 632/807/783 +f 632/807/783 639/815/790 640/816/791 +f 632/807/783 640/816/791 633/808/784 +f 633/808/784 640/816/791 1360/817/147 +f 633/808/784 1360/817/147 1359/809/146 +f 467/734/717 468/736/719 641/818/792 +f 467/734/717 641/818/792 634/810/785 +f 634/810/785 641/818/792 642/819/793 +f 634/810/785 642/819/793 635/811/786 +f 635/811/786 642/819/793 643/820/794 +f 635/811/786 643/820/794 636/812/787 +f 636/812/787 643/820/794 644/821/795 +f 636/812/787 644/821/795 637/813/788 +f 637/813/788 644/821/795 645/822/796 +f 637/813/788 645/822/796 638/814/789 +f 638/814/789 645/822/796 646/823/797 +f 638/814/789 646/823/797 639/815/790 +f 639/815/790 646/823/797 647/824/798 +f 639/815/790 647/824/798 640/816/791 +f 640/816/791 647/824/798 1361/825/148 +f 640/816/791 1361/825/148 1360/817/147 +f 468/736/719 469/738/721 648/826/799 +f 468/736/719 648/826/799 641/818/792 +f 641/818/792 648/826/799 649/827/800 +f 641/818/792 649/827/800 642/819/793 +f 642/819/793 649/827/800 650/828/801 +f 642/819/793 650/828/801 643/820/794 +f 643/820/794 650/828/801 651/829/802 +f 643/820/794 651/829/802 644/821/795 +f 644/821/795 651/829/802 652/830/803 +f 644/821/795 652/830/803 645/822/796 +f 645/822/796 652/830/803 653/831/804 +f 645/822/796 653/831/804 646/823/797 +f 646/823/797 653/831/804 654/832/805 +f 646/823/797 654/832/805 647/824/798 +f 647/824/798 654/832/805 1362/833/149 +f 647/824/798 1362/833/149 1361/825/148 +f 469/738/721 470/740/723 655/834/806 +f 469/738/721 655/834/806 648/826/799 +f 648/826/799 655/834/806 656/835/807 +f 648/826/799 656/835/807 649/827/800 +f 649/827/800 656/835/807 657/836/808 +f 649/827/800 657/836/808 650/828/801 +f 650/828/801 657/836/808 658/837/809 +f 650/828/801 658/837/809 651/829/802 +f 651/829/802 658/837/809 659/838/810 +f 651/829/802 659/838/810 652/830/803 +f 652/830/803 659/838/810 660/839/811 +f 652/830/803 660/839/811 653/831/804 +f 653/831/804 660/839/811 661/840/812 +f 653/831/804 661/840/812 654/832/805 +f 654/832/805 661/840/812 1363/841/150 +f 654/832/805 1363/841/150 1362/833/149 +f 470/740/723 471/742/725 662/842/813 +f 470/740/723 662/842/813 655/834/806 +f 655/834/806 662/842/813 663/843/814 +f 655/834/806 663/843/814 656/835/807 +f 656/835/807 663/843/814 664/844/815 +f 656/835/807 664/844/815 657/836/808 +f 657/836/808 664/844/815 665/845/816 +f 657/836/808 665/845/816 658/837/809 +f 658/837/809 665/845/816 666/846/817 +f 658/837/809 666/846/817 659/838/810 +f 659/838/810 666/846/817 667/847/818 +f 659/838/810 667/847/818 660/839/811 +f 660/839/811 667/847/818 668/848/819 +f 660/839/811 668/848/819 661/840/812 +f 661/840/812 668/848/819 1364/849/151 +f 661/840/812 1364/849/151 1363/841/150 +f 471/742/725 472/744/727 669/850/820 +f 471/742/725 669/850/820 662/842/813 +f 662/842/813 669/850/820 670/851/821 +f 662/842/813 670/851/821 663/843/814 +f 663/843/814 670/851/821 671/852/822 +f 663/843/814 671/852/822 664/844/815 +f 664/844/815 671/852/822 672/853/823 +f 664/844/815 672/853/823 665/845/816 +f 665/845/816 672/853/823 673/854/824 +f 665/845/816 673/854/824 666/846/817 +f 666/846/817 673/854/824 674/855/825 +f 666/846/817 674/855/825 667/847/818 +f 667/847/818 674/855/825 675/856/826 +f 667/847/818 675/856/826 668/848/819 +f 668/848/819 675/856/826 1365/857/152 +f 668/848/819 1365/857/152 1364/849/151 +f 472/744/727 1418/746/729 1417/858/827 +f 472/744/727 1417/858/827 669/850/820 +f 669/850/820 1417/858/827 1416/859/828 +f 669/850/820 1416/859/828 670/851/821 +f 670/851/821 1416/859/828 1415/860/829 +f 670/851/821 1415/860/829 671/852/822 +f 671/852/822 1415/860/829 1414/861/830 +f 671/852/822 1414/861/830 672/853/823 +f 672/853/823 1414/861/830 1413/862/831 +f 672/853/823 1413/862/831 673/854/824 +f 673/854/824 1413/862/831 1412/863/832 +f 673/854/824 1412/863/832 674/855/825 +f 674/855/825 1412/863/832 1411/864/833 +f 674/855/825 1411/864/833 675/856/826 +f 675/856/826 1411/864/833 1532/865/153 +f 675/856/826 1532/865/153 1365/857/152 +f 676/866/834 698/867/835 705/868/836 +f 676/866/834 705/868/836 677/869/837 +f 677/869/837 705/868/836 706/870/838 +f 677/869/837 706/870/838 678/871/839 +f 678/871/839 706/870/838 707/872/840 +f 678/871/839 707/872/840 679/873/841 +f 679/873/841 707/872/840 708/874/842 +f 679/873/841 708/874/842 680/875/843 +f 680/875/843 708/874/842 709/876/844 +f 680/875/843 709/876/844 681/877/845 +f 681/877/845 709/876/844 710/878/846 +f 681/877/845 710/878/846 682/879/847 +f 682/879/847 710/878/846 711/880/848 +f 682/879/847 711/880/848 683/881/849 +f 683/881/849 711/880/848 1417/882/827 +f 683/881/849 1417/882/827 1418/883/729 +f 698/867/835 699/884/850 712/885/851 +f 698/867/835 712/885/851 705/868/836 +f 705/868/836 712/885/851 713/886/852 +f 705/868/836 713/886/852 706/870/838 +f 706/870/838 713/886/852 714/887/853 +f 706/870/838 714/887/853 707/872/840 +f 707/872/840 714/887/853 715/888/854 +f 707/872/840 715/888/854 708/874/842 +f 708/874/842 715/888/854 716/889/855 +f 708/874/842 716/889/855 709/876/844 +f 709/876/844 716/889/855 717/890/856 +f 709/876/844 717/890/856 710/878/846 +f 710/878/846 717/890/856 718/891/857 +f 710/878/846 718/891/857 711/880/848 +f 711/880/848 718/891/857 1416/892/828 +f 711/880/848 1416/892/828 1417/882/827 +f 699/884/850 700/893/858 719/894/859 +f 699/884/850 719/894/859 712/885/851 +f 712/885/851 719/894/859 720/895/860 +f 712/885/851 720/895/860 713/886/852 +f 713/886/852 720/895/860 721/896/861 +f 713/886/852 721/896/861 714/887/853 +f 714/887/853 721/896/861 722/897/862 +f 714/887/853 722/897/862 715/888/854 +f 715/888/854 722/897/862 723/898/863 +f 715/888/854 723/898/863 716/889/855 +f 716/889/855 723/898/863 724/899/864 +f 716/889/855 724/899/864 717/890/856 +f 717/890/856 724/899/864 725/900/865 +f 717/890/856 725/900/865 718/891/857 +f 718/891/857 725/900/865 1415/901/829 +f 718/891/857 1415/901/829 1416/892/828 +f 700/893/858 701/902/866 726/903/867 +f 700/893/858 726/903/867 719/894/859 +f 719/894/859 726/903/867 727/904/868 +f 719/894/859 727/904/868 720/895/860 +f 720/895/860 727/904/868 728/905/869 +f 720/895/860 728/905/869 721/896/861 +f 721/896/861 728/905/869 729/906/870 +f 721/896/861 729/906/870 722/897/862 +f 722/897/862 729/906/870 730/907/871 +f 722/897/862 730/907/871 723/898/863 +f 723/898/863 730/907/871 731/908/872 +f 723/898/863 731/908/872 724/899/864 +f 724/899/864 731/908/872 732/909/873 +f 724/899/864 732/909/873 725/900/865 +f 725/900/865 732/909/873 1414/910/830 +f 725/900/865 1414/910/830 1415/901/829 +f 701/902/866 702/911/874 733/912/875 +f 701/902/866 733/912/875 726/903/867 +f 726/903/867 733/912/875 734/913/876 +f 726/903/867 734/913/876 727/904/868 +f 727/904/868 734/913/876 735/914/877 +f 727/904/868 735/914/877 728/905/869 +f 728/905/869 735/914/877 736/915/878 +f 728/905/869 736/915/878 729/906/870 +f 729/906/870 736/915/878 737/916/879 +f 729/906/870 737/916/879 730/907/871 +f 730/907/871 737/916/879 738/917/880 +f 730/907/871 738/917/880 731/908/872 +f 731/908/872 738/917/880 739/918/881 +f 731/908/872 739/918/881 732/909/873 +f 732/909/873 739/918/881 1413/919/831 +f 732/909/873 1413/919/831 1414/910/830 +f 702/911/874 703/920/882 740/921/883 +f 702/911/874 740/921/883 733/912/875 +f 733/912/875 740/921/883 741/922/884 +f 733/912/875 741/922/884 734/913/876 +f 734/913/876 741/922/884 742/923/885 +f 734/913/876 742/923/885 735/914/877 +f 735/914/877 742/923/885 743/924/886 +f 735/914/877 743/924/886 736/915/878 +f 736/915/878 743/924/886 744/925/887 +f 736/915/878 744/925/887 737/916/879 +f 737/916/879 744/925/887 745/926/888 +f 737/916/879 745/926/888 738/917/880 +f 738/917/880 745/926/888 746/927/889 +f 738/917/880 746/927/889 739/918/881 +f 739/918/881 746/927/889 1412/928/832 +f 739/918/881 1412/928/832 1413/919/831 +f 703/920/882 704/929/890 747/930/891 +f 703/920/882 747/930/891 740/921/883 +f 740/921/883 747/930/891 748/931/892 +f 740/921/883 748/931/892 741/922/884 +f 741/922/884 748/931/892 749/932/893 +f 741/922/884 749/932/893 742/923/885 +f 742/923/885 749/932/893 750/933/894 +f 742/923/885 750/933/894 743/924/886 +f 743/924/886 750/933/894 751/934/895 +f 743/924/886 751/934/895 744/925/887 +f 744/925/887 751/934/895 752/935/896 +f 744/925/887 752/935/896 745/926/888 +f 745/926/888 752/935/896 753/936/897 +f 745/926/888 753/936/897 746/927/889 +f 746/927/889 753/936/897 1411/937/833 +f 746/927/889 1411/937/833 1412/928/832 +f 704/929/890 1403/938/97 1402/939/96 +f 704/929/890 1402/939/96 747/930/891 +f 747/930/891 1402/939/96 1401/940/105 +f 747/930/891 1401/940/105 748/931/892 +f 748/931/892 1401/940/105 1400/941/113 +f 748/931/892 1400/941/113 749/932/893 +f 749/932/893 1400/941/113 1399/942/121 +f 749/932/893 1399/942/121 750/933/894 +f 750/933/894 1399/942/121 1398/943/129 +f 750/933/894 1398/943/129 751/934/895 +f 751/934/895 1398/943/129 1397/944/137 +f 751/934/895 1397/944/137 752/935/896 +f 752/935/896 1397/944/137 1396/945/145 +f 752/935/896 1396/945/145 753/936/897 +f 753/936/897 1396/945/145 1532/946/153 +f 753/936/897 1532/946/153 1411/937/833 +f 676/866/834 677/869/837 754/947/898 +f 676/866/834 754/947/898 684/948/899 +f 684/948/899 754/947/898 755/949/900 +f 684/948/899 755/949/900 685/950/901 +f 685/950/901 755/949/900 756/951/902 +f 685/950/901 756/951/902 686/952/903 +f 686/952/903 756/951/902 757/953/904 +f 686/952/903 757/953/904 687/954/905 +f 687/954/905 757/953/904 758/955/906 +f 687/954/905 758/955/906 688/956/907 +f 688/956/907 758/955/906 759/957/908 +f 688/956/907 759/957/908 689/958/909 +f 689/958/909 759/957/908 760/959/910 +f 689/958/909 760/959/910 690/960/911 +f 690/960/911 760/959/910 1507/961/571 +f 690/960/911 1507/961/571 1508/962/458 +f 677/869/837 678/871/839 761/963/912 +f 677/869/837 761/963/912 754/947/898 +f 754/947/898 761/963/912 762/964/913 +f 754/947/898 762/964/913 755/949/900 +f 755/949/900 762/964/913 763/965/914 +f 755/949/900 763/965/914 756/951/902 +f 756/951/902 763/965/914 764/966/915 +f 756/951/902 764/966/915 757/953/904 +f 757/953/904 764/966/915 765/967/916 +f 757/953/904 765/967/916 758/955/906 +f 758/955/906 765/967/916 766/968/917 +f 758/955/906 766/968/917 759/957/908 +f 759/957/908 766/968/917 767/969/918 +f 759/957/908 767/969/918 760/959/910 +f 760/959/910 767/969/918 1506/970/572 +f 760/959/910 1506/970/572 1507/961/571 +f 678/871/839 679/873/841 768/971/919 +f 678/871/839 768/971/919 761/963/912 +f 761/963/912 768/971/919 769/972/920 +f 761/963/912 769/972/920 762/964/913 +f 762/964/913 769/972/920 770/973/921 +f 762/964/913 770/973/921 763/965/914 +f 763/965/914 770/973/921 771/974/922 +f 763/965/914 771/974/922 764/966/915 +f 764/966/915 771/974/922 772/975/923 +f 764/966/915 772/975/923 765/967/916 +f 765/967/916 772/975/923 773/976/924 +f 765/967/916 773/976/924 766/968/917 +f 766/968/917 773/976/924 774/977/925 +f 766/968/917 774/977/925 767/969/918 +f 767/969/918 774/977/925 1505/978/573 +f 767/969/918 1505/978/573 1506/970/572 +f 679/873/841 680/875/843 775/979/926 +f 679/873/841 775/979/926 768/971/919 +f 768/971/919 775/979/926 776/980/927 +f 768/971/919 776/980/927 769/972/920 +f 769/972/920 776/980/927 777/981/928 +f 769/972/920 777/981/928 770/973/921 +f 770/973/921 777/981/928 778/982/929 +f 770/973/921 778/982/929 771/974/922 +f 771/974/922 778/982/929 779/983/930 +f 771/974/922 779/983/930 772/975/923 +f 772/975/923 779/983/930 780/984/931 +f 772/975/923 780/984/931 773/976/924 +f 773/976/924 780/984/931 781/985/932 +f 773/976/924 781/985/932 774/977/925 +f 774/977/925 781/985/932 1504/986/574 +f 774/977/925 1504/986/574 1505/978/573 +f 680/875/843 681/877/845 782/987/933 +f 680/875/843 782/987/933 775/979/926 +f 775/979/926 782/987/933 783/988/934 +f 775/979/926 783/988/934 776/980/927 +f 776/980/927 783/988/934 784/989/935 +f 776/980/927 784/989/935 777/981/928 +f 777/981/928 784/989/935 785/990/936 +f 777/981/928 785/990/936 778/982/929 +f 778/982/929 785/990/936 786/991/937 +f 778/982/929 786/991/937 779/983/930 +f 779/983/930 786/991/937 787/992/938 +f 779/983/930 787/992/938 780/984/931 +f 780/984/931 787/992/938 788/993/939 +f 780/984/931 788/993/939 781/985/932 +f 781/985/932 788/993/939 1503/994/575 +f 781/985/932 1503/994/575 1504/986/574 +f 681/877/845 682/879/847 789/995/940 +f 681/877/845 789/995/940 782/987/933 +f 782/987/933 789/995/940 790/996/941 +f 782/987/933 790/996/941 783/988/934 +f 783/988/934 790/996/941 791/997/942 +f 783/988/934 791/997/942 784/989/935 +f 784/989/935 791/997/942 792/998/943 +f 784/989/935 792/998/943 785/990/936 +f 785/990/936 792/998/943 793/999/944 +f 785/990/936 793/999/944 786/991/937 +f 786/991/937 793/999/944 794/1000/945 +f 786/991/937 794/1000/945 787/992/938 +f 787/992/938 794/1000/945 795/1001/946 +f 787/992/938 795/1001/946 788/993/939 +f 788/993/939 795/1001/946 1502/1002/576 +f 788/993/939 1502/1002/576 1503/994/575 +f 682/879/847 683/881/849 796/1003/947 +f 682/879/847 796/1003/947 789/995/940 +f 789/995/940 796/1003/947 797/1004/948 +f 789/995/940 797/1004/948 790/996/941 +f 790/996/941 797/1004/948 798/1005/949 +f 790/996/941 798/1005/949 791/997/942 +f 791/997/942 798/1005/949 799/1006/950 +f 791/997/942 799/1006/950 792/998/943 +f 792/998/943 799/1006/950 800/1007/951 +f 792/998/943 800/1007/951 793/999/944 +f 793/999/944 800/1007/951 801/1008/952 +f 793/999/944 801/1008/952 794/1000/945 +f 794/1000/945 801/1008/952 802/1009/953 +f 794/1000/945 802/1009/953 795/1001/946 +f 795/1001/946 802/1009/953 1501/1010/577 +f 795/1001/946 1501/1010/577 1502/1002/576 +f 683/881/849 1418/883/729 1419/1011/728 +f 683/881/849 1419/1011/728 796/1003/947 +f 796/1003/947 1419/1011/728 1420/1012/737 +f 796/1003/947 1420/1012/737 797/1004/948 +f 797/1004/948 1420/1012/737 1421/1013/745 +f 797/1004/948 1421/1013/745 798/1005/949 +f 798/1005/949 1421/1013/745 1422/1014/753 +f 798/1005/949 1422/1014/753 799/1006/950 +f 799/1006/950 1422/1014/753 1423/1015/761 +f 799/1006/950 1423/1015/761 800/1007/951 +f 800/1007/951 1423/1015/761 1424/1016/769 +f 800/1007/951 1424/1016/769 801/1008/952 +f 801/1008/952 1424/1016/769 1425/1017/777 +f 801/1008/952 1425/1017/777 802/1009/953 +f 802/1009/953 1425/1017/777 1536/1018/578 +f 802/1009/953 1536/1018/578 1501/1010/577 +f 676/866/834 684/948/899 803/1019/954 +f 676/866/834 803/1019/954 691/1020/955 +f 691/1020/955 803/1019/954 804/1021/956 +f 691/1020/955 804/1021/956 692/1022/957 +f 692/1022/957 804/1021/956 805/1023/958 +f 692/1022/957 805/1023/958 693/1024/959 +f 693/1024/959 805/1023/958 806/1025/960 +f 693/1024/959 806/1025/960 694/1026/961 +f 694/1026/961 806/1025/960 807/1027/962 +f 694/1026/961 807/1027/962 695/1028/963 +f 695/1028/963 807/1027/962 808/1029/964 +f 695/1028/963 808/1029/964 696/1030/965 +f 696/1030/965 808/1029/964 809/1031/966 +f 696/1030/965 809/1031/966 697/1032/967 +f 697/1032/967 809/1031/966 1449/1033/968 +f 697/1032/967 1449/1033/968 1448/1034/969 +f 684/948/899 685/950/901 810/1035/970 +f 684/948/899 810/1035/970 803/1019/954 +f 803/1019/954 810/1035/970 811/1036/971 +f 803/1019/954 811/1036/971 804/1021/956 +f 804/1021/956 811/1036/971 812/1037/972 +f 804/1021/956 812/1037/972 805/1023/958 +f 805/1023/958 812/1037/972 813/1038/973 +f 805/1023/958 813/1038/973 806/1025/960 +f 806/1025/960 813/1038/973 814/1039/974 +f 806/1025/960 814/1039/974 807/1027/962 +f 807/1027/962 814/1039/974 815/1040/975 +f 807/1027/962 815/1040/975 808/1029/964 +f 808/1029/964 815/1040/975 816/1041/976 +f 808/1029/964 816/1041/976 809/1031/966 +f 809/1031/966 816/1041/976 1450/1042/977 +f 809/1031/966 1450/1042/977 1449/1033/968 +f 685/950/901 686/952/903 817/1043/978 +f 685/950/901 817/1043/978 810/1035/970 +f 810/1035/970 817/1043/978 818/1044/979 +f 810/1035/970 818/1044/979 811/1036/971 +f 811/1036/971 818/1044/979 819/1045/980 +f 811/1036/971 819/1045/980 812/1037/972 +f 812/1037/972 819/1045/980 820/1046/981 +f 812/1037/972 820/1046/981 813/1038/973 +f 813/1038/973 820/1046/981 821/1047/982 +f 813/1038/973 821/1047/982 814/1039/974 +f 814/1039/974 821/1047/982 822/1048/983 +f 814/1039/974 822/1048/983 815/1040/975 +f 815/1040/975 822/1048/983 823/1049/984 +f 815/1040/975 823/1049/984 816/1041/976 +f 816/1041/976 823/1049/984 1451/1050/985 +f 816/1041/976 1451/1050/985 1450/1042/977 +f 686/952/903 687/954/905 824/1051/986 +f 686/952/903 824/1051/986 817/1043/978 +f 817/1043/978 824/1051/986 825/1052/987 +f 817/1043/978 825/1052/987 818/1044/979 +f 818/1044/979 825/1052/987 826/1053/988 +f 818/1044/979 826/1053/988 819/1045/980 +f 819/1045/980 826/1053/988 827/1054/989 +f 819/1045/980 827/1054/989 820/1046/981 +f 820/1046/981 827/1054/989 828/1055/990 +f 820/1046/981 828/1055/990 821/1047/982 +f 821/1047/982 828/1055/990 829/1056/991 +f 821/1047/982 829/1056/991 822/1048/983 +f 822/1048/983 829/1056/991 830/1057/992 +f 822/1048/983 830/1057/992 823/1049/984 +f 823/1049/984 830/1057/992 1452/1058/993 +f 823/1049/984 1452/1058/993 1451/1050/985 +f 687/954/905 688/956/907 831/1059/994 +f 687/954/905 831/1059/994 824/1051/986 +f 824/1051/986 831/1059/994 832/1060/995 +f 824/1051/986 832/1060/995 825/1052/987 +f 825/1052/987 832/1060/995 833/1061/996 +f 825/1052/987 833/1061/996 826/1053/988 +f 826/1053/988 833/1061/996 834/1062/997 +f 826/1053/988 834/1062/997 827/1054/989 +f 827/1054/989 834/1062/997 835/1063/998 +f 827/1054/989 835/1063/998 828/1055/990 +f 828/1055/990 835/1063/998 836/1064/999 +f 828/1055/990 836/1064/999 829/1056/991 +f 829/1056/991 836/1064/999 837/1065/1000 +f 829/1056/991 837/1065/1000 830/1057/992 +f 830/1057/992 837/1065/1000 1453/1066/1001 +f 830/1057/992 1453/1066/1001 1452/1058/993 +f 688/956/907 689/958/909 838/1067/1002 +f 688/956/907 838/1067/1002 831/1059/994 +f 831/1059/994 838/1067/1002 839/1068/1003 +f 831/1059/994 839/1068/1003 832/1060/995 +f 832/1060/995 839/1068/1003 840/1069/1004 +f 832/1060/995 840/1069/1004 833/1061/996 +f 833/1061/996 840/1069/1004 841/1070/1005 +f 833/1061/996 841/1070/1005 834/1062/997 +f 834/1062/997 841/1070/1005 842/1071/1006 +f 834/1062/997 842/1071/1006 835/1063/998 +f 835/1063/998 842/1071/1006 843/1072/1007 +f 835/1063/998 843/1072/1007 836/1064/999 +f 836/1064/999 843/1072/1007 844/1073/1008 +f 836/1064/999 844/1073/1008 837/1065/1000 +f 837/1065/1000 844/1073/1008 1454/1074/1009 +f 837/1065/1000 1454/1074/1009 1453/1066/1001 +f 689/958/909 690/960/911 845/1075/1010 +f 689/958/909 845/1075/1010 838/1067/1002 +f 838/1067/1002 845/1075/1010 846/1076/1011 +f 838/1067/1002 846/1076/1011 839/1068/1003 +f 839/1068/1003 846/1076/1011 847/1077/1012 +f 839/1068/1003 847/1077/1012 840/1069/1004 +f 840/1069/1004 847/1077/1012 848/1078/1013 +f 840/1069/1004 848/1078/1013 841/1070/1005 +f 841/1070/1005 848/1078/1013 849/1079/1014 +f 841/1070/1005 849/1079/1014 842/1071/1006 +f 842/1071/1006 849/1079/1014 850/1080/1015 +f 842/1071/1006 850/1080/1015 843/1072/1007 +f 843/1072/1007 850/1080/1015 851/1081/1016 +f 843/1072/1007 851/1081/1016 844/1073/1008 +f 844/1073/1008 851/1081/1016 1455/1082/1017 +f 844/1073/1008 1455/1082/1017 1454/1074/1009 +f 690/960/911 1508/962/458 1509/1083/457 +f 690/960/911 1509/1083/457 845/1075/1010 +f 845/1075/1010 1509/1083/457 1510/1084/466 +f 845/1075/1010 1510/1084/466 846/1076/1011 +f 846/1076/1011 1510/1084/466 1511/1085/474 +f 846/1076/1011 1511/1085/474 847/1077/1012 +f 847/1077/1012 1511/1085/474 1512/1086/482 +f 847/1077/1012 1512/1086/482 848/1078/1013 +f 848/1078/1013 1512/1086/482 1513/1087/490 +f 848/1078/1013 1513/1087/490 849/1079/1014 +f 849/1079/1014 1513/1087/490 1514/1088/498 +f 849/1079/1014 1514/1088/498 850/1080/1015 +f 850/1080/1015 1514/1088/498 1515/1089/506 +f 850/1080/1015 1515/1089/506 851/1081/1016 +f 851/1081/1016 1515/1089/506 1537/1090/514 +f 851/1081/1016 1537/1090/514 1455/1082/1017 +f 676/866/834 691/1020/955 852/1091/1018 +f 676/866/834 852/1091/1018 698/867/835 +f 698/867/835 852/1091/1018 853/1092/1019 +f 698/867/835 853/1092/1019 699/884/850 +f 699/884/850 853/1092/1019 854/1093/1020 +f 699/884/850 854/1093/1020 700/893/858 +f 700/893/858 854/1093/1020 855/1094/1021 +f 700/893/858 855/1094/1021 701/902/866 +f 701/902/866 855/1094/1021 856/1095/1022 +f 701/902/866 856/1095/1022 702/911/874 +f 702/911/874 856/1095/1022 857/1096/1023 +f 702/911/874 857/1096/1023 703/920/882 +f 703/920/882 857/1096/1023 858/1097/1024 +f 703/920/882 858/1097/1024 704/929/890 +f 704/929/890 858/1097/1024 1404/1098/218 +f 704/929/890 1404/1098/218 1403/938/97 +f 691/1020/955 692/1022/957 859/1099/1025 +f 691/1020/955 859/1099/1025 852/1091/1018 +f 852/1091/1018 859/1099/1025 860/1100/1026 +f 852/1091/1018 860/1100/1026 853/1092/1019 +f 853/1092/1019 860/1100/1026 861/1101/1027 +f 853/1092/1019 861/1101/1027 854/1093/1020 +f 854/1093/1020 861/1101/1027 862/1102/1028 +f 854/1093/1020 862/1102/1028 855/1094/1021 +f 855/1094/1021 862/1102/1028 863/1103/1029 +f 855/1094/1021 863/1103/1029 856/1095/1022 +f 856/1095/1022 863/1103/1029 864/1104/1030 +f 856/1095/1022 864/1104/1030 857/1096/1023 +f 857/1096/1023 864/1104/1030 865/1105/1031 +f 857/1096/1023 865/1105/1031 858/1097/1024 +f 858/1097/1024 865/1105/1031 1405/1106/219 +f 858/1097/1024 1405/1106/219 1404/1098/218 +f 692/1022/957 693/1024/959 866/1107/1032 +f 692/1022/957 866/1107/1032 859/1099/1025 +f 859/1099/1025 866/1107/1032 867/1108/1033 +f 859/1099/1025 867/1108/1033 860/1100/1026 +f 860/1100/1026 867/1108/1033 868/1109/1034 +f 860/1100/1026 868/1109/1034 861/1101/1027 +f 861/1101/1027 868/1109/1034 869/1110/1035 +f 861/1101/1027 869/1110/1035 862/1102/1028 +f 862/1102/1028 869/1110/1035 870/1111/1036 +f 862/1102/1028 870/1111/1036 863/1103/1029 +f 863/1103/1029 870/1111/1036 871/1112/1037 +f 863/1103/1029 871/1112/1037 864/1104/1030 +f 864/1104/1030 871/1112/1037 872/1113/1038 +f 864/1104/1030 872/1113/1038 865/1105/1031 +f 865/1105/1031 872/1113/1038 1406/1114/220 +f 865/1105/1031 1406/1114/220 1405/1106/219 +f 693/1024/959 694/1026/961 873/1115/1039 +f 693/1024/959 873/1115/1039 866/1107/1032 +f 866/1107/1032 873/1115/1039 874/1116/1040 +f 866/1107/1032 874/1116/1040 867/1108/1033 +f 867/1108/1033 874/1116/1040 875/1117/1041 +f 867/1108/1033 875/1117/1041 868/1109/1034 +f 868/1109/1034 875/1117/1041 876/1118/1042 +f 868/1109/1034 876/1118/1042 869/1110/1035 +f 869/1110/1035 876/1118/1042 877/1119/1043 +f 869/1110/1035 877/1119/1043 870/1111/1036 +f 870/1111/1036 877/1119/1043 878/1120/1044 +f 870/1111/1036 878/1120/1044 871/1112/1037 +f 871/1112/1037 878/1120/1044 879/1121/1045 +f 871/1112/1037 879/1121/1045 872/1113/1038 +f 872/1113/1038 879/1121/1045 1407/1122/221 +f 872/1113/1038 1407/1122/221 1406/1114/220 +f 694/1026/961 695/1028/963 880/1123/1046 +f 694/1026/961 880/1123/1046 873/1115/1039 +f 873/1115/1039 880/1123/1046 881/1124/1047 +f 873/1115/1039 881/1124/1047 874/1116/1040 +f 874/1116/1040 881/1124/1047 882/1125/1048 +f 874/1116/1040 882/1125/1048 875/1117/1041 +f 875/1117/1041 882/1125/1048 883/1126/1049 +f 875/1117/1041 883/1126/1049 876/1118/1042 +f 876/1118/1042 883/1126/1049 884/1127/1050 +f 876/1118/1042 884/1127/1050 877/1119/1043 +f 877/1119/1043 884/1127/1050 885/1128/1051 +f 877/1119/1043 885/1128/1051 878/1120/1044 +f 878/1120/1044 885/1128/1051 886/1129/1052 +f 878/1120/1044 886/1129/1052 879/1121/1045 +f 879/1121/1045 886/1129/1052 1408/1130/222 +f 879/1121/1045 1408/1130/222 1407/1122/221 +f 695/1028/963 696/1030/965 887/1131/1053 +f 695/1028/963 887/1131/1053 880/1123/1046 +f 880/1123/1046 887/1131/1053 888/1132/1054 +f 880/1123/1046 888/1132/1054 881/1124/1047 +f 881/1124/1047 888/1132/1054 889/1133/1055 +f 881/1124/1047 889/1133/1055 882/1125/1048 +f 882/1125/1048 889/1133/1055 890/1134/1056 +f 882/1125/1048 890/1134/1056 883/1126/1049 +f 883/1126/1049 890/1134/1056 891/1135/1057 +f 883/1126/1049 891/1135/1057 884/1127/1050 +f 884/1127/1050 891/1135/1057 892/1136/1058 +f 884/1127/1050 892/1136/1058 885/1128/1051 +f 885/1128/1051 892/1136/1058 893/1137/1059 +f 885/1128/1051 893/1137/1059 886/1129/1052 +f 886/1129/1052 893/1137/1059 1409/1138/223 +f 886/1129/1052 1409/1138/223 1408/1130/222 +f 696/1030/965 697/1032/967 894/1139/1060 +f 696/1030/965 894/1139/1060 887/1131/1053 +f 887/1131/1053 894/1139/1060 895/1140/1061 +f 887/1131/1053 895/1140/1061 888/1132/1054 +f 888/1132/1054 895/1140/1061 896/1141/1062 +f 888/1132/1054 896/1141/1062 889/1133/1055 +f 889/1133/1055 896/1141/1062 897/1142/1063 +f 889/1133/1055 897/1142/1063 890/1134/1056 +f 890/1134/1056 897/1142/1063 898/1143/1064 +f 890/1134/1056 898/1143/1064 891/1135/1057 +f 891/1135/1057 898/1143/1064 899/1144/1065 +f 891/1135/1057 899/1144/1065 892/1136/1058 +f 892/1136/1058 899/1144/1065 900/1145/1066 +f 892/1136/1058 900/1145/1066 893/1137/1059 +f 893/1137/1059 900/1145/1066 1410/1146/224 +f 893/1137/1059 1410/1146/224 1409/1138/223 +f 697/1032/967 1448/1034/969 1447/1147/1067 +f 697/1032/967 1447/1147/1067 894/1139/1060 +f 894/1139/1060 1447/1147/1067 1446/1148/1068 +f 894/1139/1060 1446/1148/1068 895/1140/1061 +f 895/1140/1061 1446/1148/1068 1445/1149/1069 +f 895/1140/1061 1445/1149/1069 896/1141/1062 +f 896/1141/1062 1445/1149/1069 1444/1150/1070 +f 896/1141/1062 1444/1150/1070 897/1142/1063 +f 897/1142/1063 1444/1150/1070 1443/1151/1071 +f 897/1142/1063 1443/1151/1071 898/1143/1064 +f 898/1143/1064 1443/1151/1071 1442/1152/1072 +f 898/1143/1064 1442/1152/1072 899/1144/1065 +f 899/1144/1065 1442/1152/1072 1441/1153/1073 +f 899/1144/1065 1441/1153/1073 900/1145/1066 +f 900/1145/1066 1441/1153/1073 1533/1154/225 +f 900/1145/1066 1533/1154/225 1410/1146/224 +f 901/1155/1074 923/1156/1075 930/1157/1076 +f 901/1155/1074 930/1157/1076 902/1158/1077 +f 902/1158/1077 930/1157/1076 931/1159/1078 +f 902/1158/1077 931/1159/1078 903/1160/1079 +f 903/1160/1079 931/1159/1078 932/1161/1080 +f 903/1160/1079 932/1161/1080 904/1162/1081 +f 904/1162/1081 932/1161/1080 933/1163/1082 +f 904/1162/1081 933/1163/1082 905/1164/1083 +f 905/1164/1083 933/1163/1082 934/1165/1084 +f 905/1164/1083 934/1165/1084 906/1166/1085 +f 906/1166/1085 934/1165/1084 935/1167/1086 +f 906/1166/1085 935/1167/1086 907/1168/1087 +f 907/1168/1087 935/1167/1086 936/1169/1088 +f 907/1168/1087 936/1169/1088 908/1170/1089 +f 908/1170/1089 936/1169/1088 1447/1171/1067 +f 908/1170/1089 1447/1171/1067 1448/1172/969 +f 923/1156/1075 924/1173/1090 937/1174/1091 +f 923/1156/1075 937/1174/1091 930/1157/1076 +f 930/1157/1076 937/1174/1091 938/1175/1092 +f 930/1157/1076 938/1175/1092 931/1159/1078 +f 931/1159/1078 938/1175/1092 939/1176/1093 +f 931/1159/1078 939/1176/1093 932/1161/1080 +f 932/1161/1080 939/1176/1093 940/1177/1094 +f 932/1161/1080 940/1177/1094 933/1163/1082 +f 933/1163/1082 940/1177/1094 941/1178/1095 +f 933/1163/1082 941/1178/1095 934/1165/1084 +f 934/1165/1084 941/1178/1095 942/1179/1096 +f 934/1165/1084 942/1179/1096 935/1167/1086 +f 935/1167/1086 942/1179/1096 943/1180/1097 +f 935/1167/1086 943/1180/1097 936/1169/1088 +f 936/1169/1088 943/1180/1097 1446/1181/1068 +f 936/1169/1088 1446/1181/1068 1447/1171/1067 +f 924/1173/1090 925/1182/1098 944/1183/1099 +f 924/1173/1090 944/1183/1099 937/1174/1091 +f 937/1174/1091 944/1183/1099 945/1184/1100 +f 937/1174/1091 945/1184/1100 938/1175/1092 +f 938/1175/1092 945/1184/1100 946/1185/1101 +f 938/1175/1092 946/1185/1101 939/1176/1093 +f 939/1176/1093 946/1185/1101 947/1186/1102 +f 939/1176/1093 947/1186/1102 940/1177/1094 +f 940/1177/1094 947/1186/1102 948/1187/1103 +f 940/1177/1094 948/1187/1103 941/1178/1095 +f 941/1178/1095 948/1187/1103 949/1188/1104 +f 941/1178/1095 949/1188/1104 942/1179/1096 +f 942/1179/1096 949/1188/1104 950/1189/1105 +f 942/1179/1096 950/1189/1105 943/1180/1097 +f 943/1180/1097 950/1189/1105 1445/1190/1069 +f 943/1180/1097 1445/1190/1069 1446/1181/1068 +f 925/1182/1098 926/1191/1106 951/1192/1107 +f 925/1182/1098 951/1192/1107 944/1183/1099 +f 944/1183/1099 951/1192/1107 952/1193/1108 +f 944/1183/1099 952/1193/1108 945/1184/1100 +f 945/1184/1100 952/1193/1108 953/1194/1109 +f 945/1184/1100 953/1194/1109 946/1185/1101 +f 946/1185/1101 953/1194/1109 954/1195/1110 +f 946/1185/1101 954/1195/1110 947/1186/1102 +f 947/1186/1102 954/1195/1110 955/1196/1111 +f 947/1186/1102 955/1196/1111 948/1187/1103 +f 948/1187/1103 955/1196/1111 956/1197/1112 +f 948/1187/1103 956/1197/1112 949/1188/1104 +f 949/1188/1104 956/1197/1112 957/1198/1113 +f 949/1188/1104 957/1198/1113 950/1189/1105 +f 950/1189/1105 957/1198/1113 1444/1199/1070 +f 950/1189/1105 1444/1199/1070 1445/1190/1069 +f 926/1191/1106 927/1200/1114 958/1201/1115 +f 926/1191/1106 958/1201/1115 951/1192/1107 +f 951/1192/1107 958/1201/1115 959/1202/1116 +f 951/1192/1107 959/1202/1116 952/1193/1108 +f 952/1193/1108 959/1202/1116 960/1203/1117 +f 952/1193/1108 960/1203/1117 953/1194/1109 +f 953/1194/1109 960/1203/1117 961/1204/1118 +f 953/1194/1109 961/1204/1118 954/1195/1110 +f 954/1195/1110 961/1204/1118 962/1205/1119 +f 954/1195/1110 962/1205/1119 955/1196/1111 +f 955/1196/1111 962/1205/1119 963/1206/1120 +f 955/1196/1111 963/1206/1120 956/1197/1112 +f 956/1197/1112 963/1206/1120 964/1207/1121 +f 956/1197/1112 964/1207/1121 957/1198/1113 +f 957/1198/1113 964/1207/1121 1443/1208/1071 +f 957/1198/1113 1443/1208/1071 1444/1199/1070 +f 927/1200/1114 928/1209/1122 965/1210/1123 +f 927/1200/1114 965/1210/1123 958/1201/1115 +f 958/1201/1115 965/1210/1123 966/1211/1124 +f 958/1201/1115 966/1211/1124 959/1202/1116 +f 959/1202/1116 966/1211/1124 967/1212/1125 +f 959/1202/1116 967/1212/1125 960/1203/1117 +f 960/1203/1117 967/1212/1125 968/1213/1126 +f 960/1203/1117 968/1213/1126 961/1204/1118 +f 961/1204/1118 968/1213/1126 969/1214/1127 +f 961/1204/1118 969/1214/1127 962/1205/1119 +f 962/1205/1119 969/1214/1127 970/1215/1128 +f 962/1205/1119 970/1215/1128 963/1206/1120 +f 963/1206/1120 970/1215/1128 971/1216/1129 +f 963/1206/1120 971/1216/1129 964/1207/1121 +f 964/1207/1121 971/1216/1129 1442/1217/1072 +f 964/1207/1121 1442/1217/1072 1443/1208/1071 +f 928/1209/1122 929/1218/1130 972/1219/1131 +f 928/1209/1122 972/1219/1131 965/1210/1123 +f 965/1210/1123 972/1219/1131 973/1220/1132 +f 965/1210/1123 973/1220/1132 966/1211/1124 +f 966/1211/1124 973/1220/1132 974/1221/1133 +f 966/1211/1124 974/1221/1133 967/1212/1125 +f 967/1212/1125 974/1221/1133 975/1222/1134 +f 967/1212/1125 975/1222/1134 968/1213/1126 +f 968/1213/1126 975/1222/1134 976/1223/1135 +f 968/1213/1126 976/1223/1135 969/1214/1127 +f 969/1214/1127 976/1223/1135 977/1224/1136 +f 969/1214/1127 977/1224/1136 970/1215/1128 +f 970/1215/1128 977/1224/1136 978/1225/1137 +f 970/1215/1128 978/1225/1137 971/1216/1129 +f 971/1216/1129 978/1225/1137 1441/1226/1073 +f 971/1216/1129 1441/1226/1073 1442/1217/1072 +f 929/1218/1130 1433/1227/169 1432/1228/168 +f 929/1218/1130 1432/1228/168 972/1219/1131 +f 972/1219/1131 1432/1228/168 1431/1229/177 +f 972/1219/1131 1431/1229/177 973/1220/1132 +f 973/1220/1132 1431/1229/177 1430/1230/185 +f 973/1220/1132 1430/1230/185 974/1221/1133 +f 974/1221/1133 1430/1230/185 1429/1231/193 +f 974/1221/1133 1429/1231/193 975/1222/1134 +f 975/1222/1134 1429/1231/193 1428/1232/201 +f 975/1222/1134 1428/1232/201 976/1223/1135 +f 976/1223/1135 1428/1232/201 1427/1233/209 +f 976/1223/1135 1427/1233/209 977/1224/1136 +f 977/1224/1136 1427/1233/209 1426/1234/217 +f 977/1224/1136 1426/1234/217 978/1225/1137 +f 978/1225/1137 1426/1234/217 1533/1235/225 +f 978/1225/1137 1533/1235/225 1441/1226/1073 +f 901/1155/1074 902/1158/1077 979/1236/1138 +f 901/1155/1074 979/1236/1138 909/1237/1139 +f 909/1237/1139 979/1236/1138 980/1238/1140 +f 909/1237/1139 980/1238/1140 910/1239/1141 +f 910/1239/1141 980/1238/1140 981/1240/1142 +f 910/1239/1141 981/1240/1142 911/1241/1143 +f 911/1241/1143 981/1240/1142 982/1242/1144 +f 911/1241/1143 982/1242/1144 912/1243/1145 +f 912/1243/1145 982/1242/1144 983/1244/1146 +f 912/1243/1145 983/1244/1146 913/1245/1147 +f 913/1245/1147 983/1244/1146 984/1246/1148 +f 913/1245/1147 984/1246/1148 914/1247/1149 +f 914/1247/1149 984/1246/1148 985/1248/1150 +f 914/1247/1149 985/1248/1150 915/1249/1151 +f 915/1249/1151 985/1248/1150 1522/1250/507 +f 915/1249/1151 1522/1250/507 1523/1251/386 +f 902/1158/1077 903/1160/1079 986/1252/1152 +f 902/1158/1077 986/1252/1152 979/1236/1138 +f 979/1236/1138 986/1252/1152 987/1253/1153 +f 979/1236/1138 987/1253/1153 980/1238/1140 +f 980/1238/1140 987/1253/1153 988/1254/1154 +f 980/1238/1140 988/1254/1154 981/1240/1142 +f 981/1240/1142 988/1254/1154 989/1255/1155 +f 981/1240/1142 989/1255/1155 982/1242/1144 +f 982/1242/1144 989/1255/1155 990/1256/1156 +f 982/1242/1144 990/1256/1156 983/1244/1146 +f 983/1244/1146 990/1256/1156 991/1257/1157 +f 983/1244/1146 991/1257/1157 984/1246/1148 +f 984/1246/1148 991/1257/1157 992/1258/1158 +f 984/1246/1148 992/1258/1158 985/1248/1150 +f 985/1248/1150 992/1258/1158 1521/1259/508 +f 985/1248/1150 1521/1259/508 1522/1250/507 +f 903/1160/1079 904/1162/1081 993/1260/1159 +f 903/1160/1079 993/1260/1159 986/1252/1152 +f 986/1252/1152 993/1260/1159 994/1261/1160 +f 986/1252/1152 994/1261/1160 987/1253/1153 +f 987/1253/1153 994/1261/1160 995/1262/1161 +f 987/1253/1153 995/1262/1161 988/1254/1154 +f 988/1254/1154 995/1262/1161 996/1263/1162 +f 988/1254/1154 996/1263/1162 989/1255/1155 +f 989/1255/1155 996/1263/1162 997/1264/1163 +f 989/1255/1155 997/1264/1163 990/1256/1156 +f 990/1256/1156 997/1264/1163 998/1265/1164 +f 990/1256/1156 998/1265/1164 991/1257/1157 +f 991/1257/1157 998/1265/1164 999/1266/1165 +f 991/1257/1157 999/1266/1165 992/1258/1158 +f 992/1258/1158 999/1266/1165 1520/1267/509 +f 992/1258/1158 1520/1267/509 1521/1259/508 +f 904/1162/1081 905/1164/1083 1000/1268/1166 +f 904/1162/1081 1000/1268/1166 993/1260/1159 +f 993/1260/1159 1000/1268/1166 1001/1269/1167 +f 993/1260/1159 1001/1269/1167 994/1261/1160 +f 994/1261/1160 1001/1269/1167 1002/1270/1168 +f 994/1261/1160 1002/1270/1168 995/1262/1161 +f 995/1262/1161 1002/1270/1168 1003/1271/1169 +f 995/1262/1161 1003/1271/1169 996/1263/1162 +f 996/1263/1162 1003/1271/1169 1004/1272/1170 +f 996/1263/1162 1004/1272/1170 997/1264/1163 +f 997/1264/1163 1004/1272/1170 1005/1273/1171 +f 997/1264/1163 1005/1273/1171 998/1265/1164 +f 998/1265/1164 1005/1273/1171 1006/1274/1172 +f 998/1265/1164 1006/1274/1172 999/1266/1165 +f 999/1266/1165 1006/1274/1172 1519/1275/510 +f 999/1266/1165 1519/1275/510 1520/1267/509 +f 905/1164/1083 906/1166/1085 1007/1276/1173 +f 905/1164/1083 1007/1276/1173 1000/1268/1166 +f 1000/1268/1166 1007/1276/1173 1008/1277/1174 +f 1000/1268/1166 1008/1277/1174 1001/1269/1167 +f 1001/1269/1167 1008/1277/1174 1009/1278/1175 +f 1001/1269/1167 1009/1278/1175 1002/1270/1168 +f 1002/1270/1168 1009/1278/1175 1010/1279/1176 +f 1002/1270/1168 1010/1279/1176 1003/1271/1169 +f 1003/1271/1169 1010/1279/1176 1011/1280/1177 +f 1003/1271/1169 1011/1280/1177 1004/1272/1170 +f 1004/1272/1170 1011/1280/1177 1012/1281/1178 +f 1004/1272/1170 1012/1281/1178 1005/1273/1171 +f 1005/1273/1171 1012/1281/1178 1013/1282/1179 +f 1005/1273/1171 1013/1282/1179 1006/1274/1172 +f 1006/1274/1172 1013/1282/1179 1518/1283/511 +f 1006/1274/1172 1518/1283/511 1519/1275/510 +f 906/1166/1085 907/1168/1087 1014/1284/1180 +f 906/1166/1085 1014/1284/1180 1007/1276/1173 +f 1007/1276/1173 1014/1284/1180 1015/1285/1181 +f 1007/1276/1173 1015/1285/1181 1008/1277/1174 +f 1008/1277/1174 1015/1285/1181 1016/1286/1182 +f 1008/1277/1174 1016/1286/1182 1009/1278/1175 +f 1009/1278/1175 1016/1286/1182 1017/1287/1183 +f 1009/1278/1175 1017/1287/1183 1010/1279/1176 +f 1010/1279/1176 1017/1287/1183 1018/1288/1184 +f 1010/1279/1176 1018/1288/1184 1011/1280/1177 +f 1011/1280/1177 1018/1288/1184 1019/1289/1185 +f 1011/1280/1177 1019/1289/1185 1012/1281/1178 +f 1012/1281/1178 1019/1289/1185 1020/1290/1186 +f 1012/1281/1178 1020/1290/1186 1013/1282/1179 +f 1013/1282/1179 1020/1290/1186 1517/1291/512 +f 1013/1282/1179 1517/1291/512 1518/1283/511 +f 907/1168/1087 908/1170/1089 1021/1292/1187 +f 907/1168/1087 1021/1292/1187 1014/1284/1180 +f 1014/1284/1180 1021/1292/1187 1022/1293/1188 +f 1014/1284/1180 1022/1293/1188 1015/1285/1181 +f 1015/1285/1181 1022/1293/1188 1023/1294/1189 +f 1015/1285/1181 1023/1294/1189 1016/1286/1182 +f 1016/1286/1182 1023/1294/1189 1024/1295/1190 +f 1016/1286/1182 1024/1295/1190 1017/1287/1183 +f 1017/1287/1183 1024/1295/1190 1025/1296/1191 +f 1017/1287/1183 1025/1296/1191 1018/1288/1184 +f 1018/1288/1184 1025/1296/1191 1026/1297/1192 +f 1018/1288/1184 1026/1297/1192 1019/1289/1185 +f 1019/1289/1185 1026/1297/1192 1027/1298/1193 +f 1019/1289/1185 1027/1298/1193 1020/1290/1186 +f 1020/1290/1186 1027/1298/1193 1516/1299/513 +f 1020/1290/1186 1516/1299/513 1517/1291/512 +f 908/1170/1089 1448/1172/969 1449/1300/968 +f 908/1170/1089 1449/1300/968 1021/1292/1187 +f 1021/1292/1187 1449/1300/968 1450/1301/977 +f 1021/1292/1187 1450/1301/977 1022/1293/1188 +f 1022/1293/1188 1450/1301/977 1451/1302/985 +f 1022/1293/1188 1451/1302/985 1023/1294/1189 +f 1023/1294/1189 1451/1302/985 1452/1303/993 +f 1023/1294/1189 1452/1303/993 1024/1295/1190 +f 1024/1295/1190 1452/1303/993 1453/1304/1001 +f 1024/1295/1190 1453/1304/1001 1025/1296/1191 +f 1025/1296/1191 1453/1304/1001 1454/1305/1009 +f 1025/1296/1191 1454/1305/1009 1026/1297/1192 +f 1026/1297/1192 1454/1305/1009 1455/1306/1017 +f 1026/1297/1192 1455/1306/1017 1027/1298/1193 +f 1027/1298/1193 1455/1306/1017 1537/1307/514 +f 1027/1298/1193 1537/1307/514 1516/1299/513 +f 901/1155/1074 909/1237/1139 1028/1308/1194 +f 901/1155/1074 1028/1308/1194 916/1309/1195 +f 916/1309/1195 1028/1308/1194 1029/1310/1196 +f 916/1309/1195 1029/1310/1196 917/1311/1197 +f 917/1311/1197 1029/1310/1196 1030/1312/1198 +f 917/1311/1197 1030/1312/1198 918/1313/1199 +f 918/1313/1199 1030/1312/1198 1031/1314/1200 +f 918/1313/1199 1031/1314/1200 919/1315/1201 +f 919/1315/1201 1031/1314/1200 1032/1316/1202 +f 919/1315/1201 1032/1316/1202 920/1317/1203 +f 920/1317/1203 1032/1316/1202 1033/1318/1204 +f 920/1317/1203 1033/1318/1204 921/1319/1205 +f 921/1319/1205 1033/1318/1204 1034/1320/1206 +f 921/1319/1205 1034/1320/1206 922/1321/1207 +f 922/1321/1207 1034/1320/1206 1464/1322/1208 +f 922/1321/1207 1464/1322/1208 1463/1323/1209 +f 909/1237/1139 910/1239/1141 1035/1324/1210 +f 909/1237/1139 1035/1324/1210 1028/1308/1194 +f 1028/1308/1194 1035/1324/1210 1036/1325/1211 +f 1028/1308/1194 1036/1325/1211 1029/1310/1196 +f 1029/1310/1196 1036/1325/1211 1037/1326/1212 +f 1029/1310/1196 1037/1326/1212 1030/1312/1198 +f 1030/1312/1198 1037/1326/1212 1038/1327/1213 +f 1030/1312/1198 1038/1327/1213 1031/1314/1200 +f 1031/1314/1200 1038/1327/1213 1039/1328/1214 +f 1031/1314/1200 1039/1328/1214 1032/1316/1202 +f 1032/1316/1202 1039/1328/1214 1040/1329/1215 +f 1032/1316/1202 1040/1329/1215 1033/1318/1204 +f 1033/1318/1204 1040/1329/1215 1041/1330/1216 +f 1033/1318/1204 1041/1330/1216 1034/1320/1206 +f 1034/1320/1206 1041/1330/1216 1465/1331/1217 +f 1034/1320/1206 1465/1331/1217 1464/1322/1208 +f 910/1239/1141 911/1241/1143 1042/1332/1218 +f 910/1239/1141 1042/1332/1218 1035/1324/1210 +f 1035/1324/1210 1042/1332/1218 1043/1333/1219 +f 1035/1324/1210 1043/1333/1219 1036/1325/1211 +f 1036/1325/1211 1043/1333/1219 1044/1334/1220 +f 1036/1325/1211 1044/1334/1220 1037/1326/1212 +f 1037/1326/1212 1044/1334/1220 1045/1335/1221 +f 1037/1326/1212 1045/1335/1221 1038/1327/1213 +f 1038/1327/1213 1045/1335/1221 1046/1336/1222 +f 1038/1327/1213 1046/1336/1222 1039/1328/1214 +f 1039/1328/1214 1046/1336/1222 1047/1337/1223 +f 1039/1328/1214 1047/1337/1223 1040/1329/1215 +f 1040/1329/1215 1047/1337/1223 1048/1338/1224 +f 1040/1329/1215 1048/1338/1224 1041/1330/1216 +f 1041/1330/1216 1048/1338/1224 1466/1339/1225 +f 1041/1330/1216 1466/1339/1225 1465/1331/1217 +f 911/1241/1143 912/1243/1145 1049/1340/1226 +f 911/1241/1143 1049/1340/1226 1042/1332/1218 +f 1042/1332/1218 1049/1340/1226 1050/1341/1227 +f 1042/1332/1218 1050/1341/1227 1043/1333/1219 +f 1043/1333/1219 1050/1341/1227 1051/1342/1228 +f 1043/1333/1219 1051/1342/1228 1044/1334/1220 +f 1044/1334/1220 1051/1342/1228 1052/1343/1229 +f 1044/1334/1220 1052/1343/1229 1045/1335/1221 +f 1045/1335/1221 1052/1343/1229 1053/1344/1230 +f 1045/1335/1221 1053/1344/1230 1046/1336/1222 +f 1046/1336/1222 1053/1344/1230 1054/1345/1231 +f 1046/1336/1222 1054/1345/1231 1047/1337/1223 +f 1047/1337/1223 1054/1345/1231 1055/1346/1232 +f 1047/1337/1223 1055/1346/1232 1048/1338/1224 +f 1048/1338/1224 1055/1346/1232 1467/1347/1233 +f 1048/1338/1224 1467/1347/1233 1466/1339/1225 +f 912/1243/1145 913/1245/1147 1056/1348/1234 +f 912/1243/1145 1056/1348/1234 1049/1340/1226 +f 1049/1340/1226 1056/1348/1234 1057/1349/1235 +f 1049/1340/1226 1057/1349/1235 1050/1341/1227 +f 1050/1341/1227 1057/1349/1235 1058/1350/1236 +f 1050/1341/1227 1058/1350/1236 1051/1342/1228 +f 1051/1342/1228 1058/1350/1236 1059/1351/1237 +f 1051/1342/1228 1059/1351/1237 1052/1343/1229 +f 1052/1343/1229 1059/1351/1237 1060/1352/1238 +f 1052/1343/1229 1060/1352/1238 1053/1344/1230 +f 1053/1344/1230 1060/1352/1238 1061/1353/1239 +f 1053/1344/1230 1061/1353/1239 1054/1345/1231 +f 1054/1345/1231 1061/1353/1239 1062/1354/1240 +f 1054/1345/1231 1062/1354/1240 1055/1346/1232 +f 1055/1346/1232 1062/1354/1240 1468/1355/1241 +f 1055/1346/1232 1468/1355/1241 1467/1347/1233 +f 913/1245/1147 914/1247/1149 1063/1356/1242 +f 913/1245/1147 1063/1356/1242 1056/1348/1234 +f 1056/1348/1234 1063/1356/1242 1064/1357/1243 +f 1056/1348/1234 1064/1357/1243 1057/1349/1235 +f 1057/1349/1235 1064/1357/1243 1065/1358/1244 +f 1057/1349/1235 1065/1358/1244 1058/1350/1236 +f 1058/1350/1236 1065/1358/1244 1066/1359/1245 +f 1058/1350/1236 1066/1359/1245 1059/1351/1237 +f 1059/1351/1237 1066/1359/1245 1067/1360/1246 +f 1059/1351/1237 1067/1360/1246 1060/1352/1238 +f 1060/1352/1238 1067/1360/1246 1068/1361/1247 +f 1060/1352/1238 1068/1361/1247 1061/1353/1239 +f 1061/1353/1239 1068/1361/1247 1069/1362/1248 +f 1061/1353/1239 1069/1362/1248 1062/1354/1240 +f 1062/1354/1240 1069/1362/1248 1469/1363/1249 +f 1062/1354/1240 1469/1363/1249 1468/1355/1241 +f 914/1247/1149 915/1249/1151 1070/1364/1250 +f 914/1247/1149 1070/1364/1250 1063/1356/1242 +f 1063/1356/1242 1070/1364/1250 1071/1365/1251 +f 1063/1356/1242 1071/1365/1251 1064/1357/1243 +f 1064/1357/1243 1071/1365/1251 1072/1366/1252 +f 1064/1357/1243 1072/1366/1252 1065/1358/1244 +f 1065/1358/1244 1072/1366/1252 1073/1367/1253 +f 1065/1358/1244 1073/1367/1253 1066/1359/1245 +f 1066/1359/1245 1073/1367/1253 1074/1368/1254 +f 1066/1359/1245 1074/1368/1254 1067/1360/1246 +f 1067/1360/1246 1074/1368/1254 1075/1369/1255 +f 1067/1360/1246 1075/1369/1255 1068/1361/1247 +f 1068/1361/1247 1075/1369/1255 1076/1370/1256 +f 1068/1361/1247 1076/1370/1256 1069/1362/1248 +f 1069/1362/1248 1076/1370/1256 1470/1371/1257 +f 1069/1362/1248 1470/1371/1257 1469/1363/1249 +f 915/1249/1151 1523/1251/386 1524/1372/385 +f 915/1249/1151 1524/1372/385 1070/1364/1250 +f 1070/1364/1250 1524/1372/385 1525/1373/394 +f 1070/1364/1250 1525/1373/394 1071/1365/1251 +f 1071/1365/1251 1525/1373/394 1526/1374/402 +f 1071/1365/1251 1526/1374/402 1072/1366/1252 +f 1072/1366/1252 1526/1374/402 1527/1375/410 +f 1072/1366/1252 1527/1375/410 1073/1367/1253 +f 1073/1367/1253 1527/1375/410 1528/1376/418 +f 1073/1367/1253 1528/1376/418 1074/1368/1254 +f 1074/1368/1254 1528/1376/418 1529/1377/426 +f 1074/1368/1254 1529/1377/426 1075/1369/1255 +f 1075/1369/1255 1529/1377/426 1530/1378/434 +f 1075/1369/1255 1530/1378/434 1076/1370/1256 +f 1076/1370/1256 1530/1378/434 1538/1379/442 +f 1076/1370/1256 1538/1379/442 1470/1371/1257 +f 901/1155/1074 916/1309/1195 1077/1380/1258 +f 901/1155/1074 1077/1380/1258 923/1156/1075 +f 923/1156/1075 1077/1380/1258 1078/1381/1259 +f 923/1156/1075 1078/1381/1259 924/1173/1090 +f 924/1173/1090 1078/1381/1259 1079/1382/1260 +f 924/1173/1090 1079/1382/1260 925/1182/1098 +f 925/1182/1098 1079/1382/1260 1080/1383/1261 +f 925/1182/1098 1080/1383/1261 926/1191/1106 +f 926/1191/1106 1080/1383/1261 1081/1384/1262 +f 926/1191/1106 1081/1384/1262 927/1200/1114 +f 927/1200/1114 1081/1384/1262 1082/1385/1263 +f 927/1200/1114 1082/1385/1263 928/1209/1122 +f 928/1209/1122 1082/1385/1263 1083/1386/1264 +f 928/1209/1122 1083/1386/1264 929/1218/1130 +f 929/1218/1130 1083/1386/1264 1434/1387/282 +f 929/1218/1130 1434/1387/282 1433/1227/169 +f 916/1309/1195 917/1311/1197 1084/1388/1265 +f 916/1309/1195 1084/1388/1265 1077/1380/1258 +f 1077/1380/1258 1084/1388/1265 1085/1389/1266 +f 1077/1380/1258 1085/1389/1266 1078/1381/1259 +f 1078/1381/1259 1085/1389/1266 1086/1390/1267 +f 1078/1381/1259 1086/1390/1267 1079/1382/1260 +f 1079/1382/1260 1086/1390/1267 1087/1391/1268 +f 1079/1382/1260 1087/1391/1268 1080/1383/1261 +f 1080/1383/1261 1087/1391/1268 1088/1392/1269 +f 1080/1383/1261 1088/1392/1269 1081/1384/1262 +f 1081/1384/1262 1088/1392/1269 1089/1393/1270 +f 1081/1384/1262 1089/1393/1270 1082/1385/1263 +f 1082/1385/1263 1089/1393/1270 1090/1394/1271 +f 1082/1385/1263 1090/1394/1271 1083/1386/1264 +f 1083/1386/1264 1090/1394/1271 1435/1395/283 +f 1083/1386/1264 1435/1395/283 1434/1387/282 +f 917/1311/1197 918/1313/1199 1091/1396/1272 +f 917/1311/1197 1091/1396/1272 1084/1388/1265 +f 1084/1388/1265 1091/1396/1272 1092/1397/1273 +f 1084/1388/1265 1092/1397/1273 1085/1389/1266 +f 1085/1389/1266 1092/1397/1273 1093/1398/1274 +f 1085/1389/1266 1093/1398/1274 1086/1390/1267 +f 1086/1390/1267 1093/1398/1274 1094/1399/1275 +f 1086/1390/1267 1094/1399/1275 1087/1391/1268 +f 1087/1391/1268 1094/1399/1275 1095/1400/1276 +f 1087/1391/1268 1095/1400/1276 1088/1392/1269 +f 1088/1392/1269 1095/1400/1276 1096/1401/1277 +f 1088/1392/1269 1096/1401/1277 1089/1393/1270 +f 1089/1393/1270 1096/1401/1277 1097/1402/1278 +f 1089/1393/1270 1097/1402/1278 1090/1394/1271 +f 1090/1394/1271 1097/1402/1278 1436/1403/284 +f 1090/1394/1271 1436/1403/284 1435/1395/283 +f 918/1313/1199 919/1315/1201 1098/1404/1279 +f 918/1313/1199 1098/1404/1279 1091/1396/1272 +f 1091/1396/1272 1098/1404/1279 1099/1405/1280 +f 1091/1396/1272 1099/1405/1280 1092/1397/1273 +f 1092/1397/1273 1099/1405/1280 1100/1406/1281 +f 1092/1397/1273 1100/1406/1281 1093/1398/1274 +f 1093/1398/1274 1100/1406/1281 1101/1407/1282 +f 1093/1398/1274 1101/1407/1282 1094/1399/1275 +f 1094/1399/1275 1101/1407/1282 1102/1408/1283 +f 1094/1399/1275 1102/1408/1283 1095/1400/1276 +f 1095/1400/1276 1102/1408/1283 1103/1409/1284 +f 1095/1400/1276 1103/1409/1284 1096/1401/1277 +f 1096/1401/1277 1103/1409/1284 1104/1410/1285 +f 1096/1401/1277 1104/1410/1285 1097/1402/1278 +f 1097/1402/1278 1104/1410/1285 1437/1411/285 +f 1097/1402/1278 1437/1411/285 1436/1403/284 +f 919/1315/1201 920/1317/1203 1105/1412/1286 +f 919/1315/1201 1105/1412/1286 1098/1404/1279 +f 1098/1404/1279 1105/1412/1286 1106/1413/1287 +f 1098/1404/1279 1106/1413/1287 1099/1405/1280 +f 1099/1405/1280 1106/1413/1287 1107/1414/1288 +f 1099/1405/1280 1107/1414/1288 1100/1406/1281 +f 1100/1406/1281 1107/1414/1288 1108/1415/1289 +f 1100/1406/1281 1108/1415/1289 1101/1407/1282 +f 1101/1407/1282 1108/1415/1289 1109/1416/1290 +f 1101/1407/1282 1109/1416/1290 1102/1408/1283 +f 1102/1408/1283 1109/1416/1290 1110/1417/1291 +f 1102/1408/1283 1110/1417/1291 1103/1409/1284 +f 1103/1409/1284 1110/1417/1291 1111/1418/1292 +f 1103/1409/1284 1111/1418/1292 1104/1410/1285 +f 1104/1410/1285 1111/1418/1292 1438/1419/286 +f 1104/1410/1285 1438/1419/286 1437/1411/285 +f 920/1317/1203 921/1319/1205 1112/1420/1293 +f 920/1317/1203 1112/1420/1293 1105/1412/1286 +f 1105/1412/1286 1112/1420/1293 1113/1421/1294 +f 1105/1412/1286 1113/1421/1294 1106/1413/1287 +f 1106/1413/1287 1113/1421/1294 1114/1422/1295 +f 1106/1413/1287 1114/1422/1295 1107/1414/1288 +f 1107/1414/1288 1114/1422/1295 1115/1423/1296 +f 1107/1414/1288 1115/1423/1296 1108/1415/1289 +f 1108/1415/1289 1115/1423/1296 1116/1424/1297 +f 1108/1415/1289 1116/1424/1297 1109/1416/1290 +f 1109/1416/1290 1116/1424/1297 1117/1425/1298 +f 1109/1416/1290 1117/1425/1298 1110/1417/1291 +f 1110/1417/1291 1117/1425/1298 1118/1426/1299 +f 1110/1417/1291 1118/1426/1299 1111/1418/1292 +f 1111/1418/1292 1118/1426/1299 1439/1427/287 +f 1111/1418/1292 1439/1427/287 1438/1419/286 +f 921/1319/1205 922/1321/1207 1119/1428/1300 +f 921/1319/1205 1119/1428/1300 1112/1420/1293 +f 1112/1420/1293 1119/1428/1300 1120/1429/1301 +f 1112/1420/1293 1120/1429/1301 1113/1421/1294 +f 1113/1421/1294 1120/1429/1301 1121/1430/1302 +f 1113/1421/1294 1121/1430/1302 1114/1422/1295 +f 1114/1422/1295 1121/1430/1302 1122/1431/1303 +f 1114/1422/1295 1122/1431/1303 1115/1423/1296 +f 1115/1423/1296 1122/1431/1303 1123/1432/1304 +f 1115/1423/1296 1123/1432/1304 1116/1424/1297 +f 1116/1424/1297 1123/1432/1304 1124/1433/1305 +f 1116/1424/1297 1124/1433/1305 1117/1425/1298 +f 1117/1425/1298 1124/1433/1305 1125/1434/1306 +f 1117/1425/1298 1125/1434/1306 1118/1426/1299 +f 1118/1426/1299 1125/1434/1306 1440/1435/288 +f 1118/1426/1299 1440/1435/288 1439/1427/287 +f 922/1321/1207 1463/1323/1209 1462/1436/1307 +f 922/1321/1207 1462/1436/1307 1119/1428/1300 +f 1119/1428/1300 1462/1436/1307 1461/1437/1308 +f 1119/1428/1300 1461/1437/1308 1120/1429/1301 +f 1120/1429/1301 1461/1437/1308 1460/1438/1309 +f 1120/1429/1301 1460/1438/1309 1121/1430/1302 +f 1121/1430/1302 1460/1438/1309 1459/1439/1310 +f 1121/1430/1302 1459/1439/1310 1122/1431/1303 +f 1122/1431/1303 1459/1439/1310 1458/1440/1311 +f 1122/1431/1303 1458/1440/1311 1123/1432/1304 +f 1123/1432/1304 1458/1440/1311 1457/1441/1312 +f 1123/1432/1304 1457/1441/1312 1124/1433/1305 +f 1124/1433/1305 1457/1441/1312 1456/1442/1313 +f 1124/1433/1305 1456/1442/1313 1125/1434/1306 +f 1125/1434/1306 1456/1442/1313 1534/1443/289 +f 1125/1434/1306 1534/1443/289 1440/1435/288 +f 1126/1444/1314 1148/1445/1315 1155/1446/1316 +f 1126/1444/1314 1155/1446/1316 1127/1447/1317 +f 1127/1447/1317 1155/1446/1316 1156/1448/1318 +f 1127/1447/1317 1156/1448/1318 1128/1449/1319 +f 1128/1449/1319 1156/1448/1318 1157/1450/1320 +f 1128/1449/1319 1157/1450/1320 1129/1451/1321 +f 1129/1451/1321 1157/1450/1320 1158/1452/1322 +f 1129/1451/1321 1158/1452/1322 1130/1453/1323 +f 1130/1453/1323 1158/1452/1322 1159/1454/1324 +f 1130/1453/1323 1159/1454/1324 1131/1455/1325 +f 1131/1455/1325 1159/1454/1324 1160/1456/1326 +f 1131/1455/1325 1160/1456/1326 1132/1457/1327 +f 1132/1457/1327 1160/1456/1326 1161/1458/1328 +f 1132/1457/1327 1161/1458/1328 1133/1459/1329 +f 1133/1459/1329 1161/1458/1328 1389/1460/707 +f 1133/1459/1329 1389/1460/707 1388/1461/596 +f 1148/1445/1315 1149/1462/1330 1162/1463/1331 +f 1148/1445/1315 1162/1463/1331 1155/1446/1316 +f 1155/1446/1316 1162/1463/1331 1163/1464/1332 +f 1155/1446/1316 1163/1464/1332 1156/1448/1318 +f 1156/1448/1318 1163/1464/1332 1164/1465/1333 +f 1156/1448/1318 1164/1465/1333 1157/1450/1320 +f 1157/1450/1320 1164/1465/1333 1165/1466/1334 +f 1157/1450/1320 1165/1466/1334 1158/1452/1322 +f 1158/1452/1322 1165/1466/1334 1166/1467/1335 +f 1158/1452/1322 1166/1467/1335 1159/1454/1324 +f 1159/1454/1324 1166/1467/1335 1167/1468/1336 +f 1159/1454/1324 1167/1468/1336 1160/1456/1326 +f 1160/1456/1326 1167/1468/1336 1168/1469/1337 +f 1160/1456/1326 1168/1469/1337 1161/1458/1328 +f 1161/1458/1328 1168/1469/1337 1390/1470/708 +f 1161/1458/1328 1390/1470/708 1389/1460/707 +f 1149/1462/1330 1150/1471/1338 1169/1472/1339 +f 1149/1462/1330 1169/1472/1339 1162/1463/1331 +f 1162/1463/1331 1169/1472/1339 1170/1473/1340 +f 1162/1463/1331 1170/1473/1340 1163/1464/1332 +f 1163/1464/1332 1170/1473/1340 1171/1474/1341 +f 1163/1464/1332 1171/1474/1341 1164/1465/1333 +f 1164/1465/1333 1171/1474/1341 1172/1475/1342 +f 1164/1465/1333 1172/1475/1342 1165/1466/1334 +f 1165/1466/1334 1172/1475/1342 1173/1476/1343 +f 1165/1466/1334 1173/1476/1343 1166/1467/1335 +f 1166/1467/1335 1173/1476/1343 1174/1477/1344 +f 1166/1467/1335 1174/1477/1344 1167/1468/1336 +f 1167/1468/1336 1174/1477/1344 1175/1478/1345 +f 1167/1468/1336 1175/1478/1345 1168/1469/1337 +f 1168/1469/1337 1175/1478/1345 1391/1479/709 +f 1168/1469/1337 1391/1479/709 1390/1470/708 +f 1150/1471/1338 1151/1480/1346 1176/1481/1347 +f 1150/1471/1338 1176/1481/1347 1169/1472/1339 +f 1169/1472/1339 1176/1481/1347 1177/1482/1348 +f 1169/1472/1339 1177/1482/1348 1170/1473/1340 +f 1170/1473/1340 1177/1482/1348 1178/1483/1349 +f 1170/1473/1340 1178/1483/1349 1171/1474/1341 +f 1171/1474/1341 1178/1483/1349 1179/1484/1350 +f 1171/1474/1341 1179/1484/1350 1172/1475/1342 +f 1172/1475/1342 1179/1484/1350 1180/1485/1351 +f 1172/1475/1342 1180/1485/1351 1173/1476/1343 +f 1173/1476/1343 1180/1485/1351 1181/1486/1352 +f 1173/1476/1343 1181/1486/1352 1174/1477/1344 +f 1174/1477/1344 1181/1486/1352 1182/1487/1353 +f 1174/1477/1344 1182/1487/1353 1175/1478/1345 +f 1175/1478/1345 1182/1487/1353 1392/1488/710 +f 1175/1478/1345 1392/1488/710 1391/1479/709 +f 1151/1480/1346 1152/1489/1354 1183/1490/1355 +f 1151/1480/1346 1183/1490/1355 1176/1481/1347 +f 1176/1481/1347 1183/1490/1355 1184/1491/1356 +f 1176/1481/1347 1184/1491/1356 1177/1482/1348 +f 1177/1482/1348 1184/1491/1356 1185/1492/1357 +f 1177/1482/1348 1185/1492/1357 1178/1483/1349 +f 1178/1483/1349 1185/1492/1357 1186/1493/1358 +f 1178/1483/1349 1186/1493/1358 1179/1484/1350 +f 1179/1484/1350 1186/1493/1358 1187/1494/1359 +f 1179/1484/1350 1187/1494/1359 1180/1485/1351 +f 1180/1485/1351 1187/1494/1359 1188/1495/1360 +f 1180/1485/1351 1188/1495/1360 1181/1486/1352 +f 1181/1486/1352 1188/1495/1360 1189/1496/1361 +f 1181/1486/1352 1189/1496/1361 1182/1487/1353 +f 1182/1487/1353 1189/1496/1361 1393/1497/711 +f 1182/1487/1353 1393/1497/711 1392/1488/710 +f 1152/1489/1354 1153/1498/1362 1190/1499/1363 +f 1152/1489/1354 1190/1499/1363 1183/1490/1355 +f 1183/1490/1355 1190/1499/1363 1191/1500/1364 +f 1183/1490/1355 1191/1500/1364 1184/1491/1356 +f 1184/1491/1356 1191/1500/1364 1192/1501/1365 +f 1184/1491/1356 1192/1501/1365 1185/1492/1357 +f 1185/1492/1357 1192/1501/1365 1193/1502/1366 +f 1185/1492/1357 1193/1502/1366 1186/1493/1358 +f 1186/1493/1358 1193/1502/1366 1194/1503/1367 +f 1186/1493/1358 1194/1503/1367 1187/1494/1359 +f 1187/1494/1359 1194/1503/1367 1195/1504/1368 +f 1187/1494/1359 1195/1504/1368 1188/1495/1360 +f 1188/1495/1360 1195/1504/1368 1196/1505/1369 +f 1188/1495/1360 1196/1505/1369 1189/1496/1361 +f 1189/1496/1361 1196/1505/1369 1394/1506/712 +f 1189/1496/1361 1394/1506/712 1393/1497/711 +f 1153/1498/1362 1154/1507/1370 1197/1508/1371 +f 1153/1498/1362 1197/1508/1371 1190/1499/1363 +f 1190/1499/1363 1197/1508/1371 1198/1509/1372 +f 1190/1499/1363 1198/1509/1372 1191/1500/1364 +f 1191/1500/1364 1198/1509/1372 1199/1510/1373 +f 1191/1500/1364 1199/1510/1373 1192/1501/1365 +f 1192/1501/1365 1199/1510/1373 1200/1511/1374 +f 1192/1501/1365 1200/1511/1374 1193/1502/1366 +f 1193/1502/1366 1200/1511/1374 1201/1512/1375 +f 1193/1502/1366 1201/1512/1375 1194/1503/1367 +f 1194/1503/1367 1201/1512/1375 1202/1513/1376 +f 1194/1503/1367 1202/1513/1376 1195/1504/1368 +f 1195/1504/1368 1202/1513/1376 1203/1514/1377 +f 1195/1504/1368 1203/1514/1377 1196/1505/1369 +f 1196/1505/1369 1203/1514/1377 1395/1515/713 +f 1196/1505/1369 1395/1515/713 1394/1506/712 +f 1154/1507/1370 1493/1516/307 1492/1517/306 +f 1154/1507/1370 1492/1517/306 1197/1508/1371 +f 1197/1508/1371 1492/1517/306 1491/1518/316 +f 1197/1508/1371 1491/1518/316 1198/1509/1372 +f 1198/1509/1372 1491/1518/316 1490/1519/325 +f 1198/1509/1372 1490/1519/325 1199/1510/1373 +f 1199/1510/1373 1490/1519/325 1489/1520/334 +f 1199/1510/1373 1489/1520/334 1200/1511/1374 +f 1200/1511/1374 1489/1520/334 1488/1521/343 +f 1200/1511/1374 1488/1521/343 1201/1512/1375 +f 1201/1512/1375 1488/1521/343 1487/1522/352 +f 1201/1512/1375 1487/1522/352 1202/1513/1376 +f 1202/1513/1376 1487/1522/352 1486/1523/361 +f 1202/1513/1376 1486/1523/361 1203/1514/1377 +f 1203/1514/1377 1486/1523/361 1535/1524/370 +f 1203/1514/1377 1535/1524/370 1395/1515/713 +f 1126/1444/1314 1127/1447/1317 1204/1525/1378 +f 1126/1444/1314 1204/1525/1378 1134/1526/1379 +f 1134/1526/1379 1204/1525/1378 1205/1527/1380 +f 1134/1526/1379 1205/1527/1380 1135/1528/1381 +f 1135/1528/1381 1205/1527/1380 1206/1529/1382 +f 1135/1528/1381 1206/1529/1382 1136/1530/1383 +f 1136/1530/1383 1206/1529/1382 1207/1531/1384 +f 1136/1530/1383 1207/1531/1384 1137/1532/1385 +f 1137/1532/1385 1207/1531/1384 1208/1533/1386 +f 1137/1532/1385 1208/1533/1386 1138/1534/1387 +f 1138/1534/1387 1208/1533/1386 1209/1535/1388 +f 1138/1534/1387 1209/1535/1388 1139/1536/1389 +f 1139/1536/1389 1209/1535/1388 1210/1537/1390 +f 1139/1536/1389 1210/1537/1390 1140/1538/1391 +f 1140/1538/1391 1210/1537/1390 1372/1539/74 +f 1140/1538/1391 1372/1539/74 1373/1540/73 +f 1127/1447/1317 1128/1449/1319 1211/1541/1392 +f 1127/1447/1317 1211/1541/1392 1204/1525/1378 +f 1204/1525/1378 1211/1541/1392 1212/1542/1393 +f 1204/1525/1378 1212/1542/1393 1205/1527/1380 +f 1205/1527/1380 1212/1542/1393 1213/1543/1394 +f 1205/1527/1380 1213/1543/1394 1206/1529/1382 +f 1206/1529/1382 1213/1543/1394 1214/1544/1395 +f 1206/1529/1382 1214/1544/1395 1207/1531/1384 +f 1207/1531/1384 1214/1544/1395 1215/1545/1396 +f 1207/1531/1384 1215/1545/1396 1208/1533/1386 +f 1208/1533/1386 1215/1545/1396 1216/1546/1397 +f 1208/1533/1386 1216/1546/1397 1209/1535/1388 +f 1209/1535/1388 1216/1546/1397 1217/1547/1398 +f 1209/1535/1388 1217/1547/1398 1210/1537/1390 +f 1210/1537/1390 1217/1547/1398 1371/1548/75 +f 1210/1537/1390 1371/1548/75 1372/1539/74 +f 1128/1449/1319 1129/1451/1321 1218/1549/1399 +f 1128/1449/1319 1218/1549/1399 1211/1541/1392 +f 1211/1541/1392 1218/1549/1399 1219/1550/1400 +f 1211/1541/1392 1219/1550/1400 1212/1542/1393 +f 1212/1542/1393 1219/1550/1400 1220/1551/1401 +f 1212/1542/1393 1220/1551/1401 1213/1543/1394 +f 1213/1543/1394 1220/1551/1401 1221/1552/1402 +f 1213/1543/1394 1221/1552/1402 1214/1544/1395 +f 1214/1544/1395 1221/1552/1402 1222/1553/1403 +f 1214/1544/1395 1222/1553/1403 1215/1545/1396 +f 1215/1545/1396 1222/1553/1403 1223/1554/1404 +f 1215/1545/1396 1223/1554/1404 1216/1546/1397 +f 1216/1546/1397 1223/1554/1404 1224/1555/1405 +f 1216/1546/1397 1224/1555/1405 1217/1547/1398 +f 1217/1547/1398 1224/1555/1405 1370/1556/76 +f 1217/1547/1398 1370/1556/76 1371/1548/75 +f 1129/1451/1321 1130/1453/1323 1225/1557/1406 +f 1129/1451/1321 1225/1557/1406 1218/1549/1399 +f 1218/1549/1399 1225/1557/1406 1226/1558/1407 +f 1218/1549/1399 1226/1558/1407 1219/1550/1400 +f 1219/1550/1400 1226/1558/1407 1227/1559/1408 +f 1219/1550/1400 1227/1559/1408 1220/1551/1401 +f 1220/1551/1401 1227/1559/1408 1228/1560/1409 +f 1220/1551/1401 1228/1560/1409 1221/1552/1402 +f 1221/1552/1402 1228/1560/1409 1229/1561/1410 +f 1221/1552/1402 1229/1561/1410 1222/1553/1403 +f 1222/1553/1403 1229/1561/1410 1230/1562/1411 +f 1222/1553/1403 1230/1562/1411 1223/1554/1404 +f 1223/1554/1404 1230/1562/1411 1231/1563/1412 +f 1223/1554/1404 1231/1563/1412 1224/1555/1405 +f 1224/1555/1405 1231/1563/1412 1369/1564/77 +f 1224/1555/1405 1369/1564/77 1370/1556/76 +f 1130/1453/1323 1131/1455/1325 1232/1565/1413 +f 1130/1453/1323 1232/1565/1413 1225/1557/1406 +f 1225/1557/1406 1232/1565/1413 1233/1566/1414 +f 1225/1557/1406 1233/1566/1414 1226/1558/1407 +f 1226/1558/1407 1233/1566/1414 1234/1567/1415 +f 1226/1558/1407 1234/1567/1415 1227/1559/1408 +f 1227/1559/1408 1234/1567/1415 1235/1568/1416 +f 1227/1559/1408 1235/1568/1416 1228/1560/1409 +f 1228/1560/1409 1235/1568/1416 1236/1569/1417 +f 1228/1560/1409 1236/1569/1417 1229/1561/1410 +f 1229/1561/1410 1236/1569/1417 1237/1570/1418 +f 1229/1561/1410 1237/1570/1418 1230/1562/1411 +f 1230/1562/1411 1237/1570/1418 1238/1571/1419 +f 1230/1562/1411 1238/1571/1419 1231/1563/1412 +f 1231/1563/1412 1238/1571/1419 1368/1572/78 +f 1231/1563/1412 1368/1572/78 1369/1564/77 +f 1131/1455/1325 1132/1457/1327 1239/1573/1420 +f 1131/1455/1325 1239/1573/1420 1232/1565/1413 +f 1232/1565/1413 1239/1573/1420 1240/1574/1421 +f 1232/1565/1413 1240/1574/1421 1233/1566/1414 +f 1233/1566/1414 1240/1574/1421 1241/1575/1422 +f 1233/1566/1414 1241/1575/1422 1234/1567/1415 +f 1234/1567/1415 1241/1575/1422 1242/1576/1423 +f 1234/1567/1415 1242/1576/1423 1235/1568/1416 +f 1235/1568/1416 1242/1576/1423 1243/1577/1424 +f 1235/1568/1416 1243/1577/1424 1236/1569/1417 +f 1236/1569/1417 1243/1577/1424 1244/1578/1425 +f 1236/1569/1417 1244/1578/1425 1237/1570/1418 +f 1237/1570/1418 1244/1578/1425 1245/1579/1426 +f 1237/1570/1418 1245/1579/1426 1238/1571/1419 +f 1238/1571/1419 1245/1579/1426 1367/1580/79 +f 1238/1571/1419 1367/1580/79 1368/1572/78 +f 1132/1457/1327 1133/1459/1329 1246/1581/1427 +f 1132/1457/1327 1246/1581/1427 1239/1573/1420 +f 1239/1573/1420 1246/1581/1427 1247/1582/1428 +f 1239/1573/1420 1247/1582/1428 1240/1574/1421 +f 1240/1574/1421 1247/1582/1428 1248/1583/1429 +f 1240/1574/1421 1248/1583/1429 1241/1575/1422 +f 1241/1575/1422 1248/1583/1429 1249/1584/1430 +f 1241/1575/1422 1249/1584/1430 1242/1576/1423 +f 1242/1576/1423 1249/1584/1430 1250/1585/1431 +f 1242/1576/1423 1250/1585/1431 1243/1577/1424 +f 1243/1577/1424 1250/1585/1431 1251/1586/1432 +f 1243/1577/1424 1251/1586/1432 1244/1578/1425 +f 1244/1578/1425 1251/1586/1432 1252/1587/1433 +f 1244/1578/1425 1252/1587/1433 1245/1579/1426 +f 1245/1579/1426 1252/1587/1433 1366/1588/80 +f 1245/1579/1426 1366/1588/80 1367/1580/79 +f 1133/1459/1329 1388/1461/596 1387/1589/595 +f 1133/1459/1329 1387/1589/595 1246/1581/1427 +f 1246/1581/1427 1387/1589/595 1386/1590/605 +f 1246/1581/1427 1386/1590/605 1247/1582/1428 +f 1247/1582/1428 1386/1590/605 1385/1591/614 +f 1247/1582/1428 1385/1591/614 1248/1583/1429 +f 1248/1583/1429 1385/1591/614 1384/1592/623 +f 1248/1583/1429 1384/1592/623 1249/1584/1430 +f 1249/1584/1430 1384/1592/623 1383/1593/632 +f 1249/1584/1430 1383/1593/632 1250/1585/1431 +f 1250/1585/1431 1383/1593/632 1382/1594/641 +f 1250/1585/1431 1382/1594/641 1251/1586/1432 +f 1251/1586/1432 1382/1594/641 1381/1595/650 +f 1251/1586/1432 1381/1595/650 1252/1587/1433 +f 1252/1587/1433 1381/1595/650 1531/1596/81 +f 1252/1587/1433 1531/1596/81 1366/1588/80 +f 1126/1444/1314 1134/1526/1379 1253/1597/1434 +f 1126/1444/1314 1253/1597/1434 1141/1598/1435 +f 1141/1598/1435 1253/1597/1434 1254/1599/1436 +f 1141/1598/1435 1254/1599/1436 1142/1600/1437 +f 1142/1600/1437 1254/1599/1436 1255/1601/1438 +f 1142/1600/1437 1255/1601/1438 1143/1602/1439 +f 1143/1602/1439 1255/1601/1438 1256/1603/1440 +f 1143/1602/1439 1256/1603/1440 1144/1604/1441 +f 1144/1604/1441 1256/1603/1440 1257/1605/1442 +f 1144/1604/1441 1257/1605/1442 1145/1606/1443 +f 1145/1606/1443 1257/1605/1442 1258/1607/1444 +f 1145/1606/1443 1258/1607/1444 1146/1608/1445 +f 1146/1608/1445 1258/1607/1444 1259/1609/1446 +f 1146/1608/1445 1259/1609/1446 1147/1610/1447 +f 1147/1610/1447 1259/1609/1446 1462/1611/1307 +f 1147/1610/1447 1462/1611/1307 1463/1612/1209 +f 1134/1526/1379 1135/1528/1381 1260/1613/1448 +f 1134/1526/1379 1260/1613/1448 1253/1597/1434 +f 1253/1597/1434 1260/1613/1448 1261/1614/1449 +f 1253/1597/1434 1261/1614/1449 1254/1599/1436 +f 1254/1599/1436 1261/1614/1449 1262/1615/1450 +f 1254/1599/1436 1262/1615/1450 1255/1601/1438 +f 1255/1601/1438 1262/1615/1450 1263/1616/1451 +f 1255/1601/1438 1263/1616/1451 1256/1603/1440 +f 1256/1603/1440 1263/1616/1451 1264/1617/1452 +f 1256/1603/1440 1264/1617/1452 1257/1605/1442 +f 1257/1605/1442 1264/1617/1452 1265/1618/1453 +f 1257/1605/1442 1265/1618/1453 1258/1607/1444 +f 1258/1607/1444 1265/1618/1453 1266/1619/1454 +f 1258/1607/1444 1266/1619/1454 1259/1609/1446 +f 1259/1609/1446 1266/1619/1454 1461/1620/1308 +f 1259/1609/1446 1461/1620/1308 1462/1611/1307 +f 1135/1528/1381 1136/1530/1383 1267/1621/1455 +f 1135/1528/1381 1267/1621/1455 1260/1613/1448 +f 1260/1613/1448 1267/1621/1455 1268/1622/1456 +f 1260/1613/1448 1268/1622/1456 1261/1614/1449 +f 1261/1614/1449 1268/1622/1456 1269/1623/1457 +f 1261/1614/1449 1269/1623/1457 1262/1615/1450 +f 1262/1615/1450 1269/1623/1457 1270/1624/1458 +f 1262/1615/1450 1270/1624/1458 1263/1616/1451 +f 1263/1616/1451 1270/1624/1458 1271/1625/1459 +f 1263/1616/1451 1271/1625/1459 1264/1617/1452 +f 1264/1617/1452 1271/1625/1459 1272/1626/1460 +f 1264/1617/1452 1272/1626/1460 1265/1618/1453 +f 1265/1618/1453 1272/1626/1460 1273/1627/1461 +f 1265/1618/1453 1273/1627/1461 1266/1619/1454 +f 1266/1619/1454 1273/1627/1461 1460/1628/1309 +f 1266/1619/1454 1460/1628/1309 1461/1620/1308 +f 1136/1530/1383 1137/1532/1385 1274/1629/1462 +f 1136/1530/1383 1274/1629/1462 1267/1621/1455 +f 1267/1621/1455 1274/1629/1462 1275/1630/1463 +f 1267/1621/1455 1275/1630/1463 1268/1622/1456 +f 1268/1622/1456 1275/1630/1463 1276/1631/1464 +f 1268/1622/1456 1276/1631/1464 1269/1623/1457 +f 1269/1623/1457 1276/1631/1464 1277/1632/1465 +f 1269/1623/1457 1277/1632/1465 1270/1624/1458 +f 1270/1624/1458 1277/1632/1465 1278/1633/1466 +f 1270/1624/1458 1278/1633/1466 1271/1625/1459 +f 1271/1625/1459 1278/1633/1466 1279/1634/1467 +f 1271/1625/1459 1279/1634/1467 1272/1626/1460 +f 1272/1626/1460 1279/1634/1467 1280/1635/1468 +f 1272/1626/1460 1280/1635/1468 1273/1627/1461 +f 1273/1627/1461 1280/1635/1468 1459/1636/1310 +f 1273/1627/1461 1459/1636/1310 1460/1628/1309 +f 1137/1532/1385 1138/1534/1387 1281/1637/1469 +f 1137/1532/1385 1281/1637/1469 1274/1629/1462 +f 1274/1629/1462 1281/1637/1469 1282/1638/1470 +f 1274/1629/1462 1282/1638/1470 1275/1630/1463 +f 1275/1630/1463 1282/1638/1470 1283/1639/1471 +f 1275/1630/1463 1283/1639/1471 1276/1631/1464 +f 1276/1631/1464 1283/1639/1471 1284/1640/1472 +f 1276/1631/1464 1284/1640/1472 1277/1632/1465 +f 1277/1632/1465 1284/1640/1472 1285/1641/1473 +f 1277/1632/1465 1285/1641/1473 1278/1633/1466 +f 1278/1633/1466 1285/1641/1473 1286/1642/1474 +f 1278/1633/1466 1286/1642/1474 1279/1634/1467 +f 1279/1634/1467 1286/1642/1474 1287/1643/1475 +f 1279/1634/1467 1287/1643/1475 1280/1635/1468 +f 1280/1635/1468 1287/1643/1475 1458/1644/1311 +f 1280/1635/1468 1458/1644/1311 1459/1636/1310 +f 1138/1534/1387 1139/1536/1389 1288/1645/1476 +f 1138/1534/1387 1288/1645/1476 1281/1637/1469 +f 1281/1637/1469 1288/1645/1476 1289/1646/1477 +f 1281/1637/1469 1289/1646/1477 1282/1638/1470 +f 1282/1638/1470 1289/1646/1477 1290/1647/1478 +f 1282/1638/1470 1290/1647/1478 1283/1639/1471 +f 1283/1639/1471 1290/1647/1478 1291/1648/1479 +f 1283/1639/1471 1291/1648/1479 1284/1640/1472 +f 1284/1640/1472 1291/1648/1479 1292/1649/1480 +f 1284/1640/1472 1292/1649/1480 1285/1641/1473 +f 1285/1641/1473 1292/1649/1480 1293/1650/1481 +f 1285/1641/1473 1293/1650/1481 1286/1642/1474 +f 1286/1642/1474 1293/1650/1481 1294/1651/1482 +f 1286/1642/1474 1294/1651/1482 1287/1643/1475 +f 1287/1643/1475 1294/1651/1482 1457/1652/1312 +f 1287/1643/1475 1457/1652/1312 1458/1644/1311 +f 1139/1536/1389 1140/1538/1391 1295/1653/1483 +f 1139/1536/1389 1295/1653/1483 1288/1645/1476 +f 1288/1645/1476 1295/1653/1483 1296/1654/1484 +f 1288/1645/1476 1296/1654/1484 1289/1646/1477 +f 1289/1646/1477 1296/1654/1484 1297/1655/1485 +f 1289/1646/1477 1297/1655/1485 1290/1647/1478 +f 1290/1647/1478 1297/1655/1485 1298/1656/1486 +f 1290/1647/1478 1298/1656/1486 1291/1648/1479 +f 1291/1648/1479 1298/1656/1486 1299/1657/1487 +f 1291/1648/1479 1299/1657/1487 1292/1649/1480 +f 1292/1649/1480 1299/1657/1487 1300/1658/1488 +f 1292/1649/1480 1300/1658/1488 1293/1650/1481 +f 1293/1650/1481 1300/1658/1488 1301/1659/1489 +f 1293/1650/1481 1301/1659/1489 1294/1651/1482 +f 1294/1651/1482 1301/1659/1489 1456/1660/1313 +f 1294/1651/1482 1456/1660/1313 1457/1652/1312 +f 1140/1538/1391 1373/1540/73 1374/1661/233 +f 1140/1538/1391 1374/1661/233 1295/1653/1483 +f 1295/1653/1483 1374/1661/233 1375/1662/241 +f 1295/1653/1483 1375/1662/241 1296/1654/1484 +f 1296/1654/1484 1375/1662/241 1376/1663/249 +f 1296/1654/1484 1376/1663/249 1297/1655/1485 +f 1297/1655/1485 1376/1663/249 1377/1664/257 +f 1297/1655/1485 1377/1664/257 1298/1656/1486 +f 1298/1656/1486 1377/1664/257 1378/1665/265 +f 1298/1656/1486 1378/1665/265 1299/1657/1487 +f 1299/1657/1487 1378/1665/265 1379/1666/273 +f 1299/1657/1487 1379/1666/273 1300/1658/1488 +f 1300/1658/1488 1379/1666/273 1380/1667/281 +f 1300/1658/1488 1380/1667/281 1301/1659/1489 +f 1301/1659/1489 1380/1667/281 1534/1668/289 +f 1301/1659/1489 1534/1668/289 1456/1660/1313 +f 1126/1444/1314 1141/1598/1435 1302/1669/1490 +f 1126/1444/1314 1302/1669/1490 1148/1445/1315 +f 1148/1445/1315 1302/1669/1490 1303/1670/1491 +f 1148/1445/1315 1303/1670/1491 1149/1462/1330 +f 1149/1462/1330 1303/1670/1491 1304/1671/1492 +f 1149/1462/1330 1304/1671/1492 1150/1471/1338 +f 1150/1471/1338 1304/1671/1492 1305/1672/1493 +f 1150/1471/1338 1305/1672/1493 1151/1480/1346 +f 1151/1480/1346 1305/1672/1493 1306/1673/1494 +f 1151/1480/1346 1306/1673/1494 1152/1489/1354 +f 1152/1489/1354 1306/1673/1494 1307/1674/1495 +f 1152/1489/1354 1307/1674/1495 1153/1498/1362 +f 1153/1498/1362 1307/1674/1495 1308/1675/1496 +f 1153/1498/1362 1308/1675/1496 1154/1507/1370 +f 1154/1507/1370 1308/1675/1496 1494/1676/435 +f 1154/1507/1370 1494/1676/435 1493/1516/307 +f 1141/1598/1435 1142/1600/1437 1309/1677/1497 +f 1141/1598/1435 1309/1677/1497 1302/1669/1490 +f 1302/1669/1490 1309/1677/1497 1310/1678/1498 +f 1302/1669/1490 1310/1678/1498 1303/1670/1491 +f 1303/1670/1491 1310/1678/1498 1311/1679/1499 +f 1303/1670/1491 1311/1679/1499 1304/1671/1492 +f 1304/1671/1492 1311/1679/1499 1312/1680/1500 +f 1304/1671/1492 1312/1680/1500 1305/1672/1493 +f 1305/1672/1493 1312/1680/1500 1313/1681/1501 +f 1305/1672/1493 1313/1681/1501 1306/1673/1494 +f 1306/1673/1494 1313/1681/1501 1314/1682/1502 +f 1306/1673/1494 1314/1682/1502 1307/1674/1495 +f 1307/1674/1495 1314/1682/1502 1315/1683/1503 +f 1307/1674/1495 1315/1683/1503 1308/1675/1496 +f 1308/1675/1496 1315/1683/1503 1495/1684/436 +f 1308/1675/1496 1495/1684/436 1494/1676/435 +f 1142/1600/1437 1143/1602/1439 1316/1685/1504 +f 1142/1600/1437 1316/1685/1504 1309/1677/1497 +f 1309/1677/1497 1316/1685/1504 1317/1686/1505 +f 1309/1677/1497 1317/1686/1505 1310/1678/1498 +f 1310/1678/1498 1317/1686/1505 1318/1687/1506 +f 1310/1678/1498 1318/1687/1506 1311/1679/1499 +f 1311/1679/1499 1318/1687/1506 1319/1688/1507 +f 1311/1679/1499 1319/1688/1507 1312/1680/1500 +f 1312/1680/1500 1319/1688/1507 1320/1689/1508 +f 1312/1680/1500 1320/1689/1508 1313/1681/1501 +f 1313/1681/1501 1320/1689/1508 1321/1690/1509 +f 1313/1681/1501 1321/1690/1509 1314/1682/1502 +f 1314/1682/1502 1321/1690/1509 1322/1691/1510 +f 1314/1682/1502 1322/1691/1510 1315/1683/1503 +f 1315/1683/1503 1322/1691/1510 1496/1692/437 +f 1315/1683/1503 1496/1692/437 1495/1684/436 +f 1143/1602/1439 1144/1604/1441 1323/1693/1511 +f 1143/1602/1439 1323/1693/1511 1316/1685/1504 +f 1316/1685/1504 1323/1693/1511 1324/1694/1512 +f 1316/1685/1504 1324/1694/1512 1317/1686/1505 +f 1317/1686/1505 1324/1694/1512 1325/1695/1513 +f 1317/1686/1505 1325/1695/1513 1318/1687/1506 +f 1318/1687/1506 1325/1695/1513 1326/1696/1514 +f 1318/1687/1506 1326/1696/1514 1319/1688/1507 +f 1319/1688/1507 1326/1696/1514 1327/1697/1515 +f 1319/1688/1507 1327/1697/1515 1320/1689/1508 +f 1320/1689/1508 1327/1697/1515 1328/1698/1516 +f 1320/1689/1508 1328/1698/1516 1321/1690/1509 +f 1321/1690/1509 1328/1698/1516 1329/1699/1517 +f 1321/1690/1509 1329/1699/1517 1322/1691/1510 +f 1322/1691/1510 1329/1699/1517 1497/1700/438 +f 1322/1691/1510 1497/1700/438 1496/1692/437 +f 1144/1604/1441 1145/1606/1443 1330/1701/1518 +f 1144/1604/1441 1330/1701/1518 1323/1693/1511 +f 1323/1693/1511 1330/1701/1518 1331/1702/1519 +f 1323/1693/1511 1331/1702/1519 1324/1694/1512 +f 1324/1694/1512 1331/1702/1519 1332/1703/1520 +f 1324/1694/1512 1332/1703/1520 1325/1695/1513 +f 1325/1695/1513 1332/1703/1520 1333/1704/1521 +f 1325/1695/1513 1333/1704/1521 1326/1696/1514 +f 1326/1696/1514 1333/1704/1521 1334/1705/1522 +f 1326/1696/1514 1334/1705/1522 1327/1697/1515 +f 1327/1697/1515 1334/1705/1522 1335/1706/1523 +f 1327/1697/1515 1335/1706/1523 1328/1698/1516 +f 1328/1698/1516 1335/1706/1523 1336/1707/1524 +f 1328/1698/1516 1336/1707/1524 1329/1699/1517 +f 1329/1699/1517 1336/1707/1524 1498/1708/439 +f 1329/1699/1517 1498/1708/439 1497/1700/438 +f 1145/1606/1443 1146/1608/1445 1337/1709/1525 +f 1145/1606/1443 1337/1709/1525 1330/1701/1518 +f 1330/1701/1518 1337/1709/1525 1338/1710/1526 +f 1330/1701/1518 1338/1710/1526 1331/1702/1519 +f 1331/1702/1519 1338/1710/1526 1339/1711/1527 +f 1331/1702/1519 1339/1711/1527 1332/1703/1520 +f 1332/1703/1520 1339/1711/1527 1340/1712/1528 +f 1332/1703/1520 1340/1712/1528 1333/1704/1521 +f 1333/1704/1521 1340/1712/1528 1341/1713/1529 +f 1333/1704/1521 1341/1713/1529 1334/1705/1522 +f 1334/1705/1522 1341/1713/1529 1342/1714/1530 +f 1334/1705/1522 1342/1714/1530 1335/1706/1523 +f 1335/1706/1523 1342/1714/1530 1343/1715/1531 +f 1335/1706/1523 1343/1715/1531 1336/1707/1524 +f 1336/1707/1524 1343/1715/1531 1499/1716/440 +f 1336/1707/1524 1499/1716/440 1498/1708/439 +f 1146/1608/1445 1147/1610/1447 1344/1717/1532 +f 1146/1608/1445 1344/1717/1532 1337/1709/1525 +f 1337/1709/1525 1344/1717/1532 1345/1718/1533 +f 1337/1709/1525 1345/1718/1533 1338/1710/1526 +f 1338/1710/1526 1345/1718/1533 1346/1719/1534 +f 1338/1710/1526 1346/1719/1534 1339/1711/1527 +f 1339/1711/1527 1346/1719/1534 1347/1720/1535 +f 1339/1711/1527 1347/1720/1535 1340/1712/1528 +f 1340/1712/1528 1347/1720/1535 1348/1721/1536 +f 1340/1712/1528 1348/1721/1536 1341/1713/1529 +f 1341/1713/1529 1348/1721/1536 1349/1722/1537 +f 1341/1713/1529 1349/1722/1537 1342/1714/1530 +f 1342/1714/1530 1349/1722/1537 1350/1723/1538 +f 1342/1714/1530 1350/1723/1538 1343/1715/1531 +f 1343/1715/1531 1350/1723/1538 1500/1724/441 +f 1343/1715/1531 1500/1724/441 1499/1716/440 +f 1147/1610/1447 1463/1612/1209 1464/1725/1208 +f 1147/1610/1447 1464/1725/1208 1344/1717/1532 +f 1344/1717/1532 1464/1725/1208 1465/1726/1217 +f 1344/1717/1532 1465/1726/1217 1345/1718/1533 +f 1345/1718/1533 1465/1726/1217 1466/1727/1225 +f 1345/1718/1533 1466/1727/1225 1346/1719/1534 +f 1346/1719/1534 1466/1727/1225 1467/1728/1233 +f 1346/1719/1534 1467/1728/1233 1347/1720/1535 +f 1347/1720/1535 1467/1728/1233 1468/1729/1241 +f 1347/1720/1535 1468/1729/1241 1348/1721/1536 +f 1348/1721/1536 1468/1729/1241 1469/1730/1249 +f 1348/1721/1536 1469/1730/1249 1349/1722/1537 +f 1349/1722/1537 1469/1730/1249 1470/1731/1257 +f 1349/1722/1537 1470/1731/1257 1350/1723/1538 +f 1350/1723/1538 1470/1731/1257 1538/1732/442 +f 1350/1723/1538 1538/1732/442 1500/1724/441 diff --git a/res/models/asteroids/asteroid04.mtl b/res/models/asteroids/asteroid04.mtl new file mode 100644 index 0000000..c34fbb5 --- /dev/null +++ b/res/models/asteroids/asteroid04.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'asteroid.blend' +# Material Count: 1 +newmtl Material +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 1 +map_Kd limestone.jpg + + diff --git a/res/models/asteroids/asteroid04.obj b/res/models/asteroids/asteroid04.obj new file mode 100644 index 0000000..1667a0a --- /dev/null +++ b/res/models/asteroids/asteroid04.obj @@ -0,0 +1,7887 @@ +# Blender v2.63 (sub 0) OBJ File: 'asteroid.blend' +# www.blender.org +mtllib asteroid04.mtl +o Cube +v 0.000000 -0.741863 -0.000000 +v 0.079219 -0.761222 -0.000000 +v 0.157194 -0.749391 -0.000000 +v 0.230782 -0.722774 -0.000000 +v 0.313014 -0.726416 -0.000000 +v 0.404900 -0.738854 -0.000000 +v 0.507621 -0.751003 0.000000 +v 0.573124 -0.693981 0.000000 +v 0.000000 -0.743093 0.077677 +v 0.000000 -0.693411 0.147535 +v -0.000000 -0.683858 0.220453 +v -0.000000 -0.630882 0.277922 +v -0.000000 -0.619467 0.347246 +v -0.000000 -0.627200 0.430987 +v -0.000000 -0.586035 0.488309 +v -0.075769 -0.720663 -0.000000 +v -0.148757 -0.700490 -0.000000 +v -0.222039 -0.689835 -0.000000 +v -0.292779 -0.671329 -0.000000 +v -0.368802 -0.664104 -0.000000 +v -0.424910 -0.617383 -0.000000 +v -0.486842 -0.584168 -0.000000 +v 0.000000 -0.737964 -0.077241 +v 0.000000 -0.722857 -0.152616 +v 0.000000 -0.701260 -0.225072 +v 0.000000 -0.692436 -0.300533 +v 0.000000 -0.693807 -0.383146 +v 0.000000 -0.670239 -0.457628 +v 0.000000 -0.593198 -0.493938 +v 0.079059 -0.760743 -0.079060 +v 0.157168 -0.750525 -0.078023 +v 0.235620 -0.742070 -0.077332 +v 0.312090 -0.724758 -0.076285 +v 0.413977 -0.758110 -0.081047 +v 0.500289 -0.739428 -0.082028 +v 0.557422 -0.674153 -0.079168 +v 0.074983 -0.715800 -0.151139 +v 0.152523 -0.725652 -0.152523 +v 0.229908 -0.722029 -0.151971 +v 0.321745 -0.751408 -0.158598 +v 0.417567 -0.765531 -0.164391 +v 0.478845 -0.705054 -0.157389 +v 0.550413 -0.665349 -0.156888 +v 0.070799 -0.669978 -0.216384 +v 0.146819 -0.693704 -0.222236 +v 0.231108 -0.725378 -0.231108 +v 0.316910 -0.736899 -0.236072 +v 0.401230 -0.730720 -0.238269 +v 0.468157 -0.687181 -0.232117 +v 0.542965 -0.655551 -0.233295 +v 0.071010 -0.669155 -0.291580 +v 0.143700 -0.672553 -0.292314 +v 0.218273 -0.674585 -0.293238 +v 0.290609 -0.663587 -0.290609 +v 0.370816 -0.665837 -0.295397 +v 0.449926 -0.655817 -0.299155 +v 0.511480 -0.614799 -0.294754 +v 0.072336 -0.671478 -0.372006 +v 0.145590 -0.670736 -0.371228 +v 0.216184 -0.656466 -0.364447 +v 0.277351 -0.620974 -0.348181 +v 0.344699 -0.607500 -0.344699 +v 0.423324 -0.609462 -0.353379 +v 0.485841 -0.580526 -0.351724 +v 0.072537 -0.651556 -0.445775 +v 0.141948 -0.631949 -0.433209 +v 0.207582 -0.609093 -0.418956 +v 0.260106 -0.563302 -0.390867 +v 0.315651 -0.539368 -0.377773 +v 0.385562 -0.541940 -0.385562 +v 0.458823 -0.542005 -0.398255 +v 0.070049 -0.596880 -0.496630 +v 0.140109 -0.592147 -0.492630 +v 0.202998 -0.566119 -0.472010 +v 0.255002 -0.526954 -0.441261 +v 0.301056 -0.491884 -0.414287 +v 0.358135 -0.484583 -0.411789 +v 0.428764 -0.496159 -0.428764 +v 0.077711 -0.745005 0.077711 +v 0.073525 -0.699147 0.148247 +v 0.072662 -0.690535 0.221869 +v 0.070850 -0.667479 0.290962 +v 0.070013 -0.648378 0.360815 +v 0.071436 -0.641368 0.439455 +v 0.069197 -0.589658 0.490948 +v 0.156483 -0.746580 0.077677 +v 0.149507 -0.708593 0.149507 +v 0.145813 -0.688178 0.220739 +v 0.140904 -0.657750 0.286789 +v 0.138730 -0.636152 0.354321 +v 0.144647 -0.644730 0.441187 +v 0.136938 -0.578309 0.481708 +v 0.230606 -0.723278 0.075629 +v 0.228009 -0.715018 0.150695 +v 0.221779 -0.691710 0.221779 +v 0.212109 -0.653006 0.285040 +v 0.206816 -0.624968 0.348844 +v 0.208133 -0.610845 0.420060 +v 0.203659 -0.568071 0.473559 +v 0.306200 -0.708789 0.074770 +v 0.311506 -0.723974 0.153415 +v 0.312346 -0.724886 0.232641 +v 0.292391 -0.668168 0.292391 +v 0.275695 -0.616858 0.346105 +v 0.275965 -0.600875 0.414852 +v 0.277715 -0.577146 0.481382 +v 0.387059 -0.702549 0.075460 +v 0.388973 -0.707038 0.152790 +v 0.394580 -0.717295 0.234276 +v 0.376803 -0.677703 0.300171 +v 0.358381 -0.633927 0.358381 +v 0.350158 -0.603479 0.419436 +v 0.343741 -0.566561 0.474569 +v 0.478847 -0.704866 0.078295 +v 0.479207 -0.705634 0.157512 +v 0.472732 -0.694442 0.234399 +v 0.463054 -0.676383 0.307836 +v 0.434152 -0.626124 0.362348 +v 0.419329 -0.592529 0.419330 +v 0.407100 -0.554665 0.469193 +v 0.584623 -0.708729 0.083248 +v 0.579525 -0.702230 0.165341 +v 0.572053 -0.692215 0.245716 +v 0.559018 -0.674271 0.321667 +v 0.520038 -0.622890 0.375939 +v 0.493276 -0.584067 0.427643 +v 0.469159 -0.544187 0.469159 +v -0.076523 -0.731135 0.076523 +v -0.150147 -0.710090 0.074483 +v -0.220802 -0.686534 0.072299 +v -0.296002 -0.681142 0.072147 +v -0.362588 -0.652038 0.070381 +v -0.417834 -0.606516 0.067671 +v -0.455612 -0.544741 0.063896 +v -0.072668 -0.689363 0.146548 +v -0.143425 -0.674201 0.143425 +v -0.213149 -0.660153 0.140716 +v -0.276538 -0.630284 0.135714 +v -0.333875 -0.594326 0.130435 +v -0.403861 -0.584937 0.132017 +v -0.450167 -0.538352 0.127779 +v -0.069957 -0.660689 0.213906 +v -0.133338 -0.619595 0.202163 +v -0.196278 -0.599671 0.196278 +v -0.253896 -0.571024 0.188691 +v -0.316280 -0.559231 0.187265 +v -0.382995 -0.552019 0.189649 +v -0.434328 -0.518624 0.186907 +v -0.064929 -0.605058 0.267937 +v -0.127047 -0.584408 0.259415 +v -0.191490 -0.580820 0.257618 +v -0.245631 -0.547993 0.245631 +v -0.301029 -0.527518 0.239757 +v -0.371219 -0.532524 0.247115 +v -0.417910 -0.497741 0.241782 +v -0.063162 -0.580237 0.327802 +v -0.124369 -0.563745 0.318926 +v -0.186128 -0.555407 0.314386 +v -0.235875 -0.517867 0.296159 +v -0.296453 -0.514311 0.296453 +v -0.351083 -0.498299 0.293545 +v -0.405737 -0.481291 0.295001 +v -0.064775 -0.579701 0.401199 +v -0.121580 -0.535525 0.373015 +v -0.182370 -0.528849 0.368396 +v -0.237711 -0.510242 0.356995 +v -0.296793 -0.504334 0.355005 +v -0.350100 -0.488811 0.350099 +v -0.393348 -0.462069 0.342405 +v -0.065554 -0.558793 0.466666 +v -0.121940 -0.512879 0.430060 +v -0.181472 -0.502579 0.421598 +v -0.240434 -0.494761 0.415528 +v -0.303453 -0.496078 0.417673 +v -0.349621 -0.472396 0.401807 +v -0.393928 -0.454740 0.393927 +v -0.075471 -0.718866 -0.075472 +v -0.076181 -0.729489 -0.153516 +v -0.076976 -0.738144 -0.234573 +v -0.076815 -0.730352 -0.314154 +v -0.077644 -0.724272 -0.397583 +v -0.073869 -0.663891 -0.453428 +v -0.068906 -0.587199 -0.489014 +v -0.148458 -0.700365 -0.073631 +v -0.147629 -0.697972 -0.147629 +v -0.149966 -0.711011 -0.226924 +v -0.149835 -0.705025 -0.304434 +v -0.151832 -0.702207 -0.386612 +v -0.144936 -0.646098 -0.442042 +v -0.135246 -0.570928 -0.475882 +v -0.219458 -0.681499 -0.071843 +v -0.225590 -0.706088 -0.149071 +v -0.222109 -0.692899 -0.222109 +v -0.216789 -0.669389 -0.291264 +v -0.217430 -0.660654 -0.366522 +v -0.209718 -0.615892 -0.423240 +v -0.202810 -0.565567 -0.471572 +v -0.294177 -0.676194 -0.071677 +v -0.308439 -0.715757 -0.151863 +v -0.299944 -0.692238 -0.223316 +v -0.295978 -0.677386 -0.295978 +v -0.294713 -0.664134 -0.369958 +v -0.280211 -0.610935 -0.421274 +v -0.269743 -0.559529 -0.467301 +v -0.366498 -0.660110 -0.071193 +v -0.367445 -0.662998 -0.144055 +v -0.372243 -0.672203 -0.220865 +v -0.375035 -0.674198 -0.298761 +v -0.363927 -0.644641 -0.363928 +v -0.339214 -0.583145 -0.406222 +v -0.324587 -0.533051 -0.447519 +v -0.436139 -0.636022 -0.070859 +v -0.423699 -0.616716 -0.138730 +v -0.425509 -0.619493 -0.210850 +v -0.430927 -0.626056 -0.286594 +v -0.416287 -0.598633 -0.347550 +v -0.385283 -0.541522 -0.385283 +v -0.377692 -0.512574 -0.434716 +v -0.501813 -0.603468 -0.070827 +v -0.482627 -0.579475 -0.137205 +v -0.476246 -0.571458 -0.204807 +v -0.471194 -0.564401 -0.271948 +v -0.444803 -0.529687 -0.322664 +v -0.422034 -0.497091 -0.366875 +v -0.420426 -0.486246 -0.420426 +v -0.000000 0.834218 0.000000 +v -0.000000 0.826883 -0.084804 +v -0.000000 0.795914 -0.165221 +v -0.000000 0.793758 -0.249623 +v 0.000000 0.777789 -0.331885 +v 0.000000 0.729646 -0.400453 +v 0.000000 0.669807 -0.457361 +v 0.000000 0.603927 -0.502367 +v -0.081117 0.783531 0.000000 +v -0.161800 0.776088 0.000000 +v -0.238124 0.750435 0.000000 +v -0.301285 0.694485 0.000000 +v -0.374021 0.674912 0.000000 +v -0.455519 0.666831 -0.000000 +v -0.560069 0.677365 -0.000000 +v -0.000000 0.848119 0.086610 +v -0.000000 0.796779 0.165370 +v -0.000000 0.761279 0.241002 +v -0.000000 0.715064 0.308845 +v -0.000000 0.645990 0.360055 +v -0.000000 0.602384 0.415626 +v -0.000000 0.559384 0.467369 +v 0.087761 0.861653 0.000000 +v 0.182638 0.896863 0.000000 +v 0.273440 0.883492 0.000000 +v 0.364349 0.866165 0.000000 +v 0.438058 0.807516 0.000000 +v 0.509244 0.753625 0.000000 +v 0.564493 0.682995 0.000000 +v 0.086583 0.848551 -0.086582 +v 0.083800 0.816511 -0.168626 +v 0.080544 0.777518 -0.245078 +v 0.081143 0.775975 -0.330982 +v 0.079236 0.740094 -0.405249 +v 0.079443 0.715495 -0.485441 +v 0.076174 0.648784 -0.537464 +v 0.178813 0.875175 -0.088936 +v 0.173834 0.846167 -0.173834 +v 0.166586 0.802378 -0.251670 +v 0.160167 0.759712 -0.324844 +v 0.164046 0.763790 -0.416715 +v 0.161933 0.726565 -0.492273 +v 0.154929 0.656803 -0.543667 +v 0.277161 0.897759 -0.091440 +v 0.267838 0.862069 -0.177443 +v 0.255070 0.811859 -0.255069 +v 0.241412 0.755593 -0.324012 +v 0.246595 0.758714 -0.415097 +v 0.238740 0.708259 -0.481438 +v 0.223049 0.625308 -0.518970 +v 0.370738 0.883755 -0.091368 +v 0.359097 0.851485 -0.177506 +v 0.341274 0.801033 -0.254391 +v 0.325670 0.753694 -0.325670 +v 0.317486 0.720748 -0.398521 +v 0.308836 0.678754 -0.464568 +v 0.296608 0.618896 -0.514755 +v 0.443015 0.818048 -0.087074 +v 0.438962 0.809299 -0.173072 +v 0.418865 0.766320 -0.248856 +v 0.405696 0.734969 -0.323206 +v 0.379425 0.674575 -0.379425 +v 0.365328 0.631662 -0.437751 +v 0.354803 0.585913 -0.490190 +v 0.517865 0.767761 -0.085089 +v 0.515730 0.764141 -0.169870 +v 0.498635 0.735553 -0.247315 +v 0.475217 0.695436 -0.315877 +v 0.448487 0.648181 -0.374220 +v 0.417720 0.590118 -0.417720 +v 0.398003 0.541644 -0.458527 +v 0.587244 0.712059 -0.083641 +v 0.583842 0.707699 -0.166595 +v 0.572047 0.692206 -0.245712 +v 0.537833 0.647768 -0.309673 +v 0.505877 0.605347 -0.365911 +v 0.466938 0.551913 -0.405177 +v 0.434642 0.503148 -0.434642 +v -0.083657 0.814402 -0.083657 +v -0.167456 0.809771 -0.083210 +v -0.236397 0.744983 -0.077596 +v -0.292521 0.671705 -0.071251 +v -0.354853 0.636073 -0.068776 +v -0.441947 0.645385 -0.071870 +v -0.538836 0.650528 -0.076380 +v -0.083471 0.812751 -0.167973 +v -0.160521 0.770878 -0.160520 +v -0.228617 0.717263 -0.151104 +v -0.286821 0.657836 -0.140920 +v -0.348828 0.624914 -0.136502 +v -0.433294 0.632086 -0.141976 +v -0.511650 0.616242 -0.145632 +v -0.082528 0.799413 -0.250920 +v -0.159575 0.763835 -0.241231 +v -0.226024 0.707028 -0.226024 +v -0.284051 0.650401 -0.211365 +v -0.344968 0.617144 -0.204489 +v -0.408164 0.591966 -0.202201 +v -0.490599 0.589549 -0.210935 +v -0.081015 0.774626 -0.330485 +v -0.156395 0.739746 -0.317392 +v -0.218119 0.674047 -0.293034 +v -0.283270 0.644727 -0.283270 +v -0.331380 0.587674 -0.263956 +v -0.390722 0.563075 -0.260010 +v -0.457980 0.547869 -0.264466 +v -0.079499 0.742713 -0.406517 +v -0.155880 0.722617 -0.396588 +v -0.218872 0.665504 -0.368924 +v -0.278630 0.624154 -0.349785 +v -0.334622 0.588036 -0.334622 +v -0.382931 0.547307 -0.319924 +v -0.440343 0.524162 -0.319506 +v -0.073383 0.659391 -0.450636 +v -0.144860 0.645736 -0.441815 +v -0.208253 0.611227 -0.420301 +v -0.264877 0.574604 -0.398082 +v -0.326242 0.559045 -0.390560 +v -0.391344 0.550602 -0.391344 +v -0.440240 0.519318 -0.382404 +v -0.069024 0.588192 -0.489795 +v -0.134527 0.567791 -0.473405 +v -0.198428 0.552631 -0.461309 +v -0.263097 0.544842 -0.455560 +v -0.323084 0.530422 -0.445396 +v -0.377694 0.512577 -0.434719 +v -0.433904 0.502270 -0.433904 +v -0.081338 0.787335 0.081338 +v -0.080739 0.781545 0.162555 +v -0.077130 0.739839 0.235025 +v -0.074500 0.705948 0.305152 +v -0.069136 0.639652 0.356587 +v -0.065358 0.585092 0.404543 +v -0.064466 0.549572 0.459412 +v -0.160214 0.768064 0.079558 +v -0.158285 0.758235 0.158285 +v -0.155773 0.742930 0.235569 +v -0.155055 0.732652 0.314745 +v -0.147920 0.682483 0.376970 +v -0.135641 0.602091 0.414569 +v -0.131113 0.552895 0.461647 +v -0.242173 0.766627 0.079557 +v -0.243475 0.772118 0.161082 +v -0.239477 0.755582 0.239477 +v -0.233288 0.727151 0.313207 +v -0.226001 0.689471 0.380797 +v -0.205940 0.603866 0.415663 +v -0.197703 0.550489 0.459610 +v -0.320833 0.748460 0.078533 +v -0.329909 0.773282 0.162731 +v -0.327104 0.763732 0.243737 +v -0.315319 0.727092 0.315319 +v -0.302752 0.684120 0.380041 +v -0.288246 0.629970 0.433426 +v -0.271109 0.562548 0.469713 +v -0.387998 0.704488 0.075655 +v -0.411558 0.753239 0.161953 +v -0.412281 0.753029 0.244904 +v -0.390132 0.704119 0.310797 +v -0.374603 0.665260 0.374602 +v -0.360897 0.623428 0.432400 +v -0.353960 0.584438 0.488999 +v -0.483445 0.712276 0.079096 +v -0.499198 0.737658 0.164276 +v -0.492148 0.725257 0.244081 +v -0.480323 0.703434 0.319253 +v -0.439829 0.634859 0.367049 +v -0.427990 0.605504 0.427990 +v -0.413159 0.563336 0.476295 +v -0.580555 0.703558 0.082638 +v -0.592042 0.718087 0.168976 +v -0.573680 0.694264 0.246410 +v -0.556698 0.671368 0.320353 +v -0.513692 0.615027 0.371445 +v -0.490090 0.580176 0.424925 +v -0.469781 0.544926 0.469781 +v 0.088139 0.866714 0.088139 +v 0.177544 0.867869 0.088297 +v 0.260711 0.836107 0.085854 +v 0.342384 0.806885 0.084076 +v 0.420661 0.771906 0.082435 +v 0.488648 0.720664 0.080002 +v 0.559067 0.676244 0.079415 +v 0.084650 0.826220 0.170312 +v 0.165014 0.796292 0.165015 +v 0.247868 0.788339 0.164032 +v 0.334816 0.786430 0.165215 +v 0.394899 0.719161 0.155195 +v 0.479624 0.706303 0.157654 +v 0.543997 0.657220 0.155025 +v 0.079280 0.763569 0.241357 +v 0.159004 0.760700 0.240382 +v 0.241446 0.762690 0.241446 +v 0.313784 0.728670 0.233722 +v 0.377340 0.682494 0.223926 +v 0.445001 0.650429 0.220570 +v 0.519103 0.625475 0.223106 +v 0.075536 0.716870 0.309181 +v 0.151214 0.712325 0.307158 +v 0.228660 0.710951 0.307053 +v 0.306739 0.705043 0.306740 +v 0.363913 0.652156 0.289894 +v 0.425253 0.617168 0.282842 +v 0.501889 0.602801 0.289325 +v 0.071803 0.666180 0.369440 +v 0.149712 0.691519 0.381387 +v 0.224739 0.685229 0.378695 +v 0.291805 0.656906 0.366310 +v 0.355286 0.627951 0.355287 +v 0.407454 0.585041 0.340235 +v 0.477575 0.570286 0.345871 +v 0.070934 0.636719 0.436571 +v 0.145785 0.650116 0.444550 +v 0.221927 0.654750 0.447724 +v 0.281427 0.613816 0.423114 +v 0.343155 0.590467 0.410980 +v 0.404090 0.569697 0.404090 +v 0.458793 0.541968 0.398230 +v 0.070320 0.599181 0.498440 +v 0.145621 0.616193 0.511611 +v 0.226177 0.634542 0.526297 +v 0.281318 0.585107 0.487746 +v 0.331428 0.545020 0.457180 +v 0.396463 0.539440 0.456721 +v 0.449956 0.521356 0.449957 +v 0.782138 0.000000 0.000000 +v 0.779701 0.000000 -0.080791 +v 0.755448 0.000000 -0.158239 +v 0.732713 0.000000 -0.233420 +v 0.672626 0.000000 -0.293256 +v 0.612795 0.000000 -0.344024 +v 0.564377 0.000000 -0.392099 +v 0.531117 0.000000 -0.445159 +v 0.780809 0.080885 0.000000 +v 0.752556 0.157740 0.000000 +v 0.749115 0.237774 0.000000 +v 0.791653 0.336978 0.000000 +v 0.768757 0.419341 0.000000 +v 0.708761 0.481473 0.000000 +v 0.687688 0.568181 0.000000 +v 0.795278 0.000000 0.082116 +v 0.815828 0.000000 0.168657 +v 0.831745 0.000000 0.259706 +v 0.821341 0.000000 0.347884 +v 0.778679 0.000000 0.424133 +v 0.702201 0.000000 0.477413 +v 0.682219 0.000000 0.563883 +v 0.810535 -0.083413 0.000000 +v 0.817908 -0.169015 0.000000 +v 0.827968 -0.258703 0.000000 +v 0.817109 -0.346329 0.000000 +v 0.799659 -0.434264 0.000000 +v 0.741131 -0.501511 0.000000 +v 0.701573 -0.579090 0.000000 +v 0.798806 -0.082321 -0.082320 +v 0.791145 -0.081579 -0.164221 +v 0.762459 -0.079179 -0.241060 +v 0.699787 -0.073916 -0.302879 +v 0.619543 -0.067114 -0.346845 +v 0.553096 -0.061901 -0.384694 +v 0.534579 -0.062697 -0.447617 +v 0.768145 -0.160228 -0.079565 +v 0.762901 -0.159110 -0.159110 +v 0.747870 -0.156671 -0.236907 +v 0.690605 -0.147111 -0.299051 +v 0.618132 -0.135156 -0.345512 +v 0.560900 -0.126940 -0.388856 +v 0.521226 -0.123853 -0.436648 +v 0.764483 -0.241600 -0.079363 +v 0.748485 -0.237073 -0.156783 +v 0.730651 -0.232569 -0.232569 +v 0.663223 -0.215027 -0.288921 +v 0.596878 -0.198462 -0.334929 +v 0.547293 -0.188165 -0.380017 +v 0.509448 -0.183799 -0.427048 +v 0.767562 -0.327879 -0.080345 +v 0.719800 -0.309948 -0.152626 +v 0.678746 -0.294819 -0.219461 +v 0.631619 -0.278170 -0.278170 +v 0.553515 -0.250215 -0.314145 +v 0.530519 -0.246269 -0.369939 +v 0.502707 -0.244029 -0.421879 +v 0.730903 -0.400796 -0.078311 +v 0.685176 -0.378286 -0.148454 +v 0.658646 -0.365527 -0.216832 +v 0.601489 -0.338350 -0.269513 +v 0.546964 -0.313358 -0.313358 +v 0.499827 -0.294368 -0.352076 +v 0.470678 -0.288934 -0.397170 +v 0.709299 -0.481597 -0.078774 +v 0.685965 -0.466929 -0.153357 +v 0.652435 -0.446264 -0.221200 +v 0.590774 -0.408404 -0.271702 +v 0.544589 -0.381166 -0.318461 +v 0.508702 -0.363376 -0.363376 +v 0.473100 -0.350112 -0.402383 +v 0.679845 -0.561900 -0.079840 +v 0.663661 -0.549080 -0.156501 +v 0.638439 -0.529388 -0.227497 +v 0.593975 -0.494834 -0.285331 +v 0.549401 -0.460716 -0.333932 +v 0.521489 -0.442019 -0.383921 +v 0.465572 -0.403038 -0.403038 +v 0.769234 0.079787 -0.079787 +v 0.743761 0.155994 -0.077430 +v 0.755684 0.239252 -0.078565 +v 0.756714 0.323878 -0.079316 +v 0.772484 0.420941 -0.082492 +v 0.726455 0.492240 -0.080627 +v 0.699902 0.577679 -0.082206 +v 0.751585 0.078116 -0.157352 +v 0.757883 0.158223 -0.158223 +v 0.758743 0.239852 -0.158648 +v 0.747717 0.320367 -0.157901 +v 0.760852 0.415279 -0.163463 +v 0.723476 0.490345 -0.161280 +v 0.693925 0.572970 -0.163438 +v 0.731913 0.076411 -0.232910 +v 0.735228 0.154372 -0.233483 +v 0.722048 0.230185 -0.230185 +v 0.729028 0.313920 -0.233824 +v 0.740657 0.406152 -0.241224 +v 0.713038 0.484449 -0.240241 +v 0.673440 0.557158 -0.239355 +v 0.689253 0.072916 -0.298993 +v 0.702161 0.149294 -0.303364 +v 0.673863 0.218067 -0.292963 +v 0.669887 0.293060 -0.293060 +v 0.692260 0.384148 -0.306026 +v 0.691379 0.472627 -0.314165 +v 0.661809 0.549057 -0.316027 +v 0.608426 0.065996 -0.341459 +v 0.611392 0.133820 -0.342217 +v 0.584539 0.194792 -0.328817 +v 0.597893 0.268066 -0.336536 +v 0.611003 0.346512 -0.346512 +v 0.619085 0.429578 -0.358559 +v 0.583448 0.488200 -0.353393 +v 0.548505 0.061405 -0.381846 +v 0.535935 0.121667 -0.373271 +v 0.523490 0.180686 -0.365019 +v 0.506304 0.236048 -0.354481 +v 0.525353 0.308107 -0.368664 +v 0.531444 0.378556 -0.378556 +v 0.519729 0.440577 -0.382691 +v 0.522028 0.061216 -0.437742 +v 0.484845 0.115515 -0.407931 +v 0.465909 0.169049 -0.392505 +v 0.464079 0.226549 -0.391002 +v 0.475297 0.291575 -0.400898 +v 0.480208 0.355079 -0.408205 +v 0.472801 0.409118 -0.409117 +v 0.794966 0.081992 0.081992 +v 0.831613 0.085122 0.171249 +v 0.818002 0.084213 0.255881 +v 0.786394 0.082132 0.334826 +v 0.759669 0.081204 0.414732 +v 0.699604 0.077727 0.475583 +v 0.662211 0.077759 0.548028 +v 0.790566 0.164121 0.081529 +v 0.797101 0.165158 0.165158 +v 0.784456 0.163326 0.246817 +v 0.764555 0.161082 0.326652 +v 0.737445 0.158821 0.403838 +v 0.674349 0.150904 0.459677 +v 0.623933 0.147395 0.517721 +v 0.790083 0.248431 0.081683 +v 0.784276 0.246768 0.163293 +v 0.759771 0.240637 0.240638 +v 0.718343 0.230772 0.309861 +v 0.695466 0.227784 0.383767 +v 0.623222 0.212021 0.427858 +v 0.586911 0.210041 0.488507 +v 0.755302 0.323357 0.079183 +v 0.748588 0.320693 0.158066 +v 0.710349 0.306824 0.228489 +v 0.686007 0.299333 0.299333 +v 0.649031 0.288637 0.362337 +v 0.594468 0.273261 0.410763 +v 0.562371 0.271029 0.469572 +v 0.738964 0.404701 0.079122 +v 0.737161 0.403698 0.158765 +v 0.689269 0.380697 0.225941 +v 0.648621 0.362130 0.288473 +v 0.608243 0.345084 0.345084 +v 0.570027 0.332153 0.397697 +v 0.542830 0.330177 0.455413 +v 0.701529 0.476777 0.077935 +v 0.677652 0.461739 0.151602 +v 0.626253 0.429768 0.212974 +v 0.601379 0.415174 0.276178 +v 0.569364 0.397266 0.331796 +v 0.542458 0.385908 0.385909 +v 0.526220 0.387227 0.445894 +v 0.665153 0.550342 0.078106 +v 0.631039 0.523330 0.149024 +v 0.607234 0.504631 0.216927 +v 0.582583 0.485728 0.280176 +v 0.564203 0.472665 0.342394 +v 0.530127 0.449095 0.389957 +v 0.495844 0.428499 0.428499 +v 0.827310 -0.084763 0.084763 +v 0.842015 -0.173055 0.086033 +v 0.856219 -0.266077 0.087676 +v 0.842802 -0.355632 0.087483 +v 0.784841 -0.426927 0.083735 +v 0.740092 -0.500700 0.082100 +v 0.705955 -0.582441 0.082921 +v 0.848853 -0.086632 0.174242 +v 0.879398 -0.179710 0.179710 +v 0.896200 -0.277082 0.183652 +v 0.851144 -0.358969 0.177442 +v 0.803298 -0.436029 0.171882 +v 0.755684 -0.510451 0.168084 +v 0.721716 -0.594906 0.169808 +v 0.850205 -0.087131 0.264473 +v 0.894895 -0.183414 0.276729 +v 0.913481 -0.283227 0.283227 +v 0.864442 -0.365362 0.272504 +v 0.819441 -0.445179 0.264656 +v 0.760043 -0.514066 0.255010 +v 0.716936 -0.591667 0.254091 +v 0.837568 -0.086987 0.353702 +v 0.870572 -0.181112 0.366221 +v 0.889916 -0.279780 0.375039 +v 0.843533 -0.360627 0.360627 +v 0.787367 -0.432133 0.344284 +v 0.747679 -0.508567 0.337928 +v 0.710824 -0.588237 0.338209 +v 0.809770 -0.086242 0.439005 +v 0.826102 -0.176405 0.447176 +v 0.815918 -0.263608 0.443434 +v 0.813482 -0.354789 0.445310 +v 0.748708 -0.417805 0.417805 +v 0.682643 -0.470882 0.392769 +v 0.652034 -0.543564 0.392598 +v 0.728548 -0.080853 0.493539 +v 0.761866 -0.169390 0.514310 +v 0.757863 -0.254325 0.512692 +v 0.731055 -0.330912 0.497956 +v 0.693733 -0.398738 0.478089 +v 0.626342 -0.441899 0.441899 +v 0.580439 -0.490304 0.425108 +v 0.698698 -0.082065 0.576732 +v 0.720980 -0.169639 0.594326 +v 0.701661 -0.248916 0.579548 +v 0.647290 -0.309457 0.537452 +v 0.604900 -0.365656 0.505517 +v 0.560190 -0.410961 0.473719 +v 0.534336 -0.460874 0.460874 +v -0.000000 0.000000 0.728694 +v 0.078744 0.000000 0.755641 +v 0.169901 0.000000 0.823040 +v 0.261695 0.000000 0.839241 +v 0.363608 0.000000 0.864151 +v 0.450023 0.000000 0.832293 +v 0.521012 0.000000 0.772636 +v 0.587858 0.000000 0.712733 +v -0.000000 0.077620 0.742424 +v -0.000000 0.160365 0.767773 +v -0.000000 0.237206 0.746976 +v -0.000000 0.301208 0.694274 +v -0.000000 0.351116 0.627482 +v -0.000000 0.405879 0.586638 +v -0.000000 0.470808 0.563760 +v -0.074370 0.000000 0.704205 +v -0.146922 0.000000 0.689856 +v -0.223005 0.000000 0.693474 +v -0.307099 0.000000 0.710311 +v -0.400876 0.000000 0.730521 +v -0.480768 0.000000 0.707622 +v -0.540272 0.000000 0.652168 +v -0.000000 -0.077817 0.744737 +v -0.000000 -0.154891 0.736046 +v -0.000000 -0.230605 0.722109 +v -0.000000 -0.289296 0.661845 +v -0.000000 -0.351648 0.628582 +v -0.000000 -0.406191 0.587142 +v -0.000000 -0.467453 0.559490 +v 0.078876 -0.078876 0.758603 +v 0.160301 -0.079603 0.768570 +v 0.253010 -0.083238 0.807247 +v 0.348602 -0.085675 0.823744 +v 0.430169 -0.084408 0.791533 +v 0.506504 -0.083111 0.749447 +v 0.574185 -0.081682 0.695461 +v 0.079049 -0.159204 0.762247 +v 0.158622 -0.158622 0.760141 +v 0.250510 -0.165807 0.798095 +v 0.332993 -0.164292 0.781546 +v 0.428250 -0.168726 0.787386 +v 0.484165 -0.159190 0.713578 +v 0.563741 -0.160758 0.682235 +v 0.076740 -0.233877 0.735539 +v 0.156232 -0.236253 0.745457 +v 0.239403 -0.239403 0.755316 +v 0.321757 -0.239717 0.749659 +v 0.398454 -0.236602 0.725116 +v 0.475224 -0.235641 0.698398 +v 0.547699 -0.235316 0.661518 +v 0.073690 -0.302004 0.697415 +v 0.150446 -0.305641 0.708260 +v 0.226073 -0.303612 0.701894 +v 0.299964 -0.299964 0.687630 +v 0.369392 -0.294262 0.663015 +v 0.445775 -0.296411 0.649316 +v 0.514927 -0.296706 0.619112 +v 0.068895 -0.355426 0.637255 +v 0.140190 -0.357919 0.643511 +v 0.209169 -0.352764 0.632880 +v 0.283469 -0.355855 0.636184 +v 0.355750 -0.355750 0.628847 +v 0.435325 -0.363319 0.627929 +v 0.499429 -0.361346 0.597359 +v 0.070202 -0.432366 0.629941 +v 0.141876 -0.432996 0.631609 +v 0.208203 -0.420200 0.611068 +v 0.283081 -0.425615 0.617734 +v 0.360901 -0.432406 0.623436 +v 0.425262 -0.425262 0.601417 +v 0.483138 -0.418996 0.571690 +v 0.066981 -0.476180 0.570886 +v 0.139391 -0.490156 0.589012 +v 0.208198 -0.484190 0.581471 +v 0.278651 -0.483035 0.579214 +v 0.352866 -0.487454 0.582524 +v 0.424998 -0.490175 0.580281 +v 0.470668 -0.470668 0.545982 +v 0.083784 0.083785 0.815894 +v 0.082675 0.166397 0.803671 +v 0.078880 0.240181 0.759162 +v 0.074842 0.306484 0.709561 +v 0.072147 0.371098 0.669604 +v 0.066487 0.411035 0.595557 +v 0.065168 0.464093 0.555522 +v 0.174332 0.086677 0.849371 +v 0.175647 0.175647 0.856421 +v 0.167867 0.253579 0.809423 +v 0.156624 0.317845 0.740959 +v 0.151522 0.385851 0.700648 +v 0.144308 0.440186 0.643126 +v 0.141349 0.496901 0.597558 +v 0.270310 0.089114 0.872082 +v 0.268908 0.178162 0.866022 +v 0.257900 0.257900 0.822075 +v 0.237134 0.318322 0.740616 +v 0.233228 0.392834 0.713772 +v 0.216191 0.436220 0.636494 +v 0.218008 0.507164 0.610427 +v 0.356861 0.087799 0.846134 +v 0.346059 0.170906 0.816554 +v 0.333088 0.248237 0.779485 +v 0.313356 0.313356 0.722048 +v 0.302972 0.380317 0.684668 +v 0.281106 0.422629 0.613057 +v 0.278210 0.482256 0.578239 +v 0.442825 0.087034 0.817655 +v 0.417205 0.164245 0.764794 +v 0.391847 0.232635 0.711778 +v 0.379739 0.302511 0.683521 +v 0.359727 0.359727 0.636528 +v 0.333401 0.399203 0.572346 +v 0.329626 0.454636 0.541868 +v 0.514454 0.084495 0.762262 +v 0.488691 0.160721 0.720827 +v 0.454299 0.225207 0.665187 +v 0.433860 0.288533 0.630650 +v 0.399883 0.333964 0.573392 +v 0.378405 0.378405 0.531218 +v 0.378187 0.435297 0.513283 +v 0.559951 0.079547 0.677368 +v 0.538980 0.153568 0.650866 +v 0.497519 0.213890 0.598271 +v 0.471787 0.272283 0.565143 +v 0.437404 0.317425 0.520522 +v 0.418946 0.364241 0.493322 +v 0.421765 0.421765 0.487838 +v -0.073560 0.073560 0.696554 +v -0.146776 0.072783 0.690674 +v -0.224480 0.073548 0.700319 +v -0.305896 0.074691 0.707965 +v -0.377026 0.073378 0.681839 +v -0.466637 0.076169 0.685183 +v -0.538141 0.076276 0.649645 +v -0.074821 0.150818 0.713952 +v -0.152302 0.152302 0.724399 +v -0.225587 0.149069 0.706074 +v -0.304546 0.149892 0.705327 +v -0.376170 0.147595 0.680847 +v -0.460228 0.151090 0.675231 +v -0.518542 0.147633 0.624973 +v -0.077184 0.235185 0.740440 +v -0.151502 0.229210 0.719453 +v -0.229789 0.229788 0.720615 +v -0.310093 0.230947 0.718954 +v -0.387861 0.230242 0.703732 +v -0.459252 0.227676 0.673046 +v -0.520669 0.223774 0.627449 +v -0.072470 0.297258 0.684547 +v -0.147234 0.299295 0.691258 +v -0.225372 0.302679 0.699436 +v -0.304502 0.304502 0.699291 +v -0.376483 0.299916 0.677068 +v -0.446831 0.297109 0.650969 +v -0.514121 0.296249 0.618103 +v -0.069891 0.360224 0.647159 +v -0.139870 0.357129 0.641896 +v -0.214201 0.361143 0.649795 +v -0.281411 0.353273 0.631067 +v -0.343457 0.343457 0.605101 +v -0.416082 0.347381 0.598318 +v -0.477612 0.345896 0.570330 +v -0.067992 0.419671 0.609478 +v -0.136273 0.416436 0.605081 +v -0.199112 0.401970 0.582134 +v -0.264379 0.397329 0.573425 +v -0.341009 0.408389 0.586479 +v -0.407317 0.407317 0.574532 +v -0.472146 0.409619 0.558270 +v -0.066866 0.475409 0.569906 +v -0.133902 0.471252 0.565064 +v -0.194025 0.450997 0.539634 +v -0.254846 0.440986 0.526609 +v -0.334270 0.461192 0.549990 +v -0.411695 0.474578 0.561240 +v -0.468082 0.468081 0.542906 +v -0.076986 -0.076986 0.736538 +v -0.075803 -0.152766 0.725174 +v -0.074475 -0.227207 0.710539 +v -0.069802 -0.286886 0.656429 +v -0.069188 -0.356836 0.640166 +v -0.066114 -0.408889 0.592098 +v -0.064829 -0.461832 0.552648 +v -0.150735 -0.074779 0.713476 +v -0.148720 -0.148720 0.704142 +v -0.144178 -0.218304 0.679187 +v -0.138867 -0.282766 0.646972 +v -0.133970 -0.342588 0.612149 +v -0.133665 -0.408729 0.592735 +v -0.134944 -0.474843 0.569612 +v -0.228888 -0.075045 0.716840 +v -0.223801 -0.147869 0.699480 +v -0.216177 -0.216177 0.671491 +v -0.205174 -0.275816 0.628725 +v -0.205281 -0.346287 0.619806 +v -0.204152 -0.412076 0.598174 +v -0.198833 -0.462258 0.553827 +v -0.310153 -0.075786 0.719506 +v -0.302954 -0.149086 0.701060 +v -0.295738 -0.220153 0.681165 +v -0.278022 -0.278022 0.631239 +v -0.270442 -0.339516 0.603798 +v -0.262230 -0.394079 0.568334 +v -0.254746 -0.440810 0.526389 +v -0.407316 -0.079665 0.744361 +v -0.391105 -0.153655 0.711400 +v -0.375725 -0.222955 0.679232 +v -0.361137 -0.287680 0.646651 +v -0.340154 -0.340154 0.598722 +v -0.322975 -0.386616 0.552976 +v -0.315915 -0.435272 0.517880 +v -0.478132 -0.078171 0.703713 +v -0.459425 -0.150818 0.673944 +v -0.448732 -0.222431 0.656351 +v -0.437861 -0.291178 0.636918 +v -0.422556 -0.352743 0.608279 +v -0.397792 -0.397792 0.560262 +v -0.361596 -0.415847 0.489536 +v -0.560375 -0.079611 0.677907 +v -0.553733 -0.157852 0.669555 +v -0.525206 -0.225712 0.633167 +v -0.502715 -0.289792 0.603833 +v -0.483159 -0.349824 0.577203 +v -0.458604 -0.398068 0.541736 +v -0.414558 -0.414558 0.479269 +v -0.869291 0.000000 -0.000000 +v -0.946662 0.000000 0.094992 +v -0.959473 0.000000 0.193440 +v -0.952539 0.000000 0.291767 +v -0.877159 0.000000 0.368387 +v -0.827443 0.000000 0.447681 +v -0.783960 0.000000 0.528022 +v -0.706616 0.000000 0.583052 +v -0.898532 0.090898 -0.000000 +v -0.920717 0.186754 -0.000000 +v -0.909461 0.280333 -0.000000 +v -0.896829 0.375612 -0.000000 +v -0.871115 0.468771 -0.000000 +v -0.829524 0.556226 -0.000000 +v -0.761258 0.625985 -0.000000 +v -0.799248 0.000000 -0.082454 +v -0.768275 0.000000 -0.160452 +v -0.720696 0.000000 -0.230231 +v -0.692581 0.000000 -0.300586 +v -0.671874 0.000000 -0.372554 +v -0.645144 0.000000 -0.442095 +v -0.603541 0.000000 -0.502065 +v -0.820435 -0.084255 -0.000000 +v -0.775654 -0.161725 -0.000000 +v -0.746695 -0.237131 -0.000000 +v -0.723176 -0.311824 -0.000000 +v -0.696908 -0.384643 -0.000000 +v -0.633465 -0.434865 -0.000000 +v -0.585691 -0.488040 -0.000000 +v -0.882652 -0.089504 0.089504 +v -0.875263 -0.088944 0.178828 +v -0.881856 -0.089999 0.272918 +v -0.844491 -0.087644 0.356255 +v -0.790654 -0.084319 0.429743 +v -0.754413 -0.083647 0.509585 +v -0.720474 -0.084634 0.593863 +v -0.844884 -0.173553 0.086284 +v -0.839811 -0.172710 0.172710 +v -0.830848 -0.171764 0.259381 +v -0.810542 -0.169771 0.343815 +v -0.798454 -0.170921 0.433658 +v -0.767112 -0.170498 0.517584 +v -0.734765 -0.172799 0.605207 +v -0.803749 -0.252077 0.082921 +v -0.792312 -0.248944 0.164755 +v -0.781848 -0.246754 0.246754 +v -0.784239 -0.249595 0.334894 +v -0.797789 -0.258216 0.434453 +v -0.768726 -0.257739 0.519537 +v -0.726257 -0.257248 0.599061 +v -0.751624 -0.322000 0.078833 +v -0.728468 -0.313183 0.154264 +v -0.747182 -0.320817 0.239010 +v -0.743118 -0.321555 0.321555 +v -0.762655 -0.334343 0.419665 +v -0.735291 -0.332700 0.500659 +v -0.673719 -0.321417 0.558577 +v -0.702957 -0.387257 0.075501 +v -0.695557 -0.383361 0.150512 +v -0.692833 -0.382462 0.227000 +v -0.657833 -0.366778 0.292178 +v -0.696895 -0.390981 0.390980 +v -0.670367 -0.386162 0.462904 +v -0.606082 -0.366331 0.506470 +v -0.635364 -0.435730 0.070787 +v -0.595915 -0.410714 0.134336 +v -0.589903 -0.406864 0.201552 +v -0.589014 -0.407281 0.270959 +v -0.615291 -0.427112 0.356516 +v -0.595012 -0.420987 0.420987 +v -0.548066 -0.402490 0.463788 +v -0.570702 -0.476035 0.066960 +v -0.524176 -0.438977 0.124529 +v -0.521233 -0.436398 0.187791 +v -0.526223 -0.440677 0.254671 +v -0.534350 -0.448567 0.325329 +v -0.521313 -0.441875 0.383798 +v -0.488114 -0.421997 0.421997 +v -0.950880 0.095350 0.095350 +v -0.947934 0.191447 0.095306 +v -0.926242 0.284761 0.094022 +v -0.903148 0.377892 0.093208 +v -0.871334 0.468831 0.092432 +v -0.835945 0.560164 0.092454 +v -0.781049 0.641519 0.091783 +v -0.968750 0.097129 0.195061 +v -0.970427 0.195807 0.195806 +v -0.928474 0.285824 0.189522 +v -0.923090 0.385822 0.191034 +v -0.878262 0.472674 0.186750 +v -0.841855 0.564244 0.186286 +v -0.778484 0.639717 0.182820 +v -0.969171 0.097912 0.296215 +v -0.951613 0.193731 0.292091 +v -0.917692 0.284393 0.284393 +v -0.922087 0.387261 0.288970 +v -0.882460 0.476397 0.283398 +v -0.823806 0.554241 0.275044 +v -0.753027 0.620301 0.266317 +v -0.930343 0.095788 0.387923 +v -0.938843 0.194011 0.391701 +v -0.931907 0.291775 0.390991 +v -0.897921 0.381789 0.381789 +v -0.868211 0.472922 0.376804 +v -0.788584 0.534680 0.355193 +v -0.709042 0.586812 0.337402 +v -0.880038 0.093307 0.473048 +v -0.916509 0.194336 0.491364 +v -0.890134 0.285681 0.480198 +v -0.843725 0.366955 0.460568 +v -0.790101 0.439235 0.439235 +v -0.744068 0.510800 0.425831 +v -0.679182 0.565478 0.408115 +v -0.791173 0.087618 0.532390 +v -0.808684 0.179279 0.543536 +v -0.774407 0.259524 0.523116 +v -0.746210 0.337308 0.507629 +v -0.703453 0.403970 0.484406 +v -0.668237 0.469863 0.469863 +v -0.630750 0.531514 0.460260 +v -0.704513 0.082751 0.581306 +v -0.700947 0.165047 0.578513 +v -0.674785 0.239811 0.558225 +v -0.643712 0.307838 0.534591 +v -0.614294 0.371026 0.513100 +v -0.583909 0.427533 0.493146 +v -0.555809 0.478934 0.478934 +v -0.839767 0.085830 -0.085830 +v -0.819009 0.084019 -0.169060 +v -0.766693 0.079563 -0.242190 +v -0.733624 0.077126 -0.315361 +v -0.711201 0.076330 -0.391251 +v -0.682082 0.075834 -0.464713 +v -0.632100 0.074205 -0.524338 +v -0.887868 0.181017 -0.090048 +v -0.856558 0.175671 -0.175671 +v -0.789746 0.164288 -0.248249 +v -0.735032 0.155504 -0.315633 +v -0.726248 0.156600 -0.398364 +v -0.691430 0.154512 -0.470340 +v -0.633293 0.149540 -0.525109 +v -0.878619 0.272054 -0.089706 +v -0.868955 0.269703 -0.178696 +v -0.790377 0.249118 -0.249118 +v -0.718120 0.230708 -0.309777 +v -0.707406 0.231335 -0.389681 +v -0.648515 0.219968 -0.443795 +v -0.621994 0.221927 -0.516341 +v -0.875846 0.367821 -0.090618 +v -0.826935 0.349934 -0.172868 +v -0.788337 0.336451 -0.250765 +v -0.720608 0.312796 -0.312796 +v -0.694429 0.306899 -0.385242 +v -0.623257 0.285412 -0.429141 +v -0.594001 0.285343 -0.494855 +v -0.844695 0.455925 -0.089753 +v -0.804588 0.436659 -0.172138 +v -0.754992 0.413254 -0.245488 +v -0.674231 0.375051 -0.298774 +v -0.658692 0.371202 -0.371202 +v -0.600552 0.348583 -0.417534 +v -0.558252 0.338992 -0.467862 +v -0.796179 0.535495 -0.088159 +v -0.765826 0.516782 -0.170226 +v -0.700454 0.476520 -0.236288 +v -0.664508 0.455474 -0.302824 +v -0.607300 0.421919 -0.352215 +v -0.557510 0.395955 -0.395955 +v -0.521086 0.383639 -0.441688 +v -0.719117 0.592796 -0.084474 +v -0.676127 0.558920 -0.159358 +v -0.637271 0.528461 -0.227102 +v -0.623045 0.518071 -0.298486 +v -0.566647 0.474638 -0.343790 +v -0.530145 0.449109 -0.389969 +v -0.498782 0.430970 -0.430970 +v -0.742162 -0.077467 -0.077468 +v -0.729732 -0.153558 -0.076203 +v -0.681632 -0.219494 -0.071855 +v -0.674634 -0.293601 -0.071529 +v -0.669915 -0.371249 -0.072179 +v -0.613869 -0.422396 -0.068466 +v -0.564393 -0.471072 -0.066215 +v -0.706510 -0.074169 -0.149526 +v -0.666455 -0.142056 -0.142056 +v -0.655847 -0.211982 -0.139933 +v -0.649485 -0.283704 -0.139342 +v -0.622260 -0.347530 -0.135975 +v -0.572118 -0.395859 -0.129310 +v -0.537474 -0.449474 -0.127578 +v -0.669647 -0.070769 -0.216296 +v -0.644625 -0.137891 -0.208943 +v -0.644342 -0.208655 -0.208655 +v -0.628229 -0.275628 -0.205032 +v -0.592528 -0.332774 -0.197168 +v -0.571121 -0.395031 -0.195652 +v -0.519014 -0.434638 -0.187040 +v -0.647925 -0.068995 -0.283750 +v -0.604455 -0.130834 -0.266898 +v -0.625066 -0.204128 -0.274427 +v -0.623849 -0.275147 -0.275147 +v -0.598885 -0.337036 -0.268466 +v -0.564376 -0.391553 -0.260560 +v -0.516981 -0.433290 -0.250489 +v -0.633609 -0.068528 -0.353660 +v -0.598732 -0.131309 -0.336029 +v -0.622383 -0.206047 -0.347564 +v -0.603047 -0.270140 -0.339137 +v -0.595504 -0.338488 -0.338488 +v -0.562631 -0.392890 -0.328172 +v -0.507093 -0.426565 -0.309750 +v -0.632022 -0.070427 -0.433657 +v -0.604954 -0.136245 -0.416357 +v -0.590583 -0.201766 -0.407293 +v -0.569775 -0.262838 -0.394999 +v -0.559324 -0.326392 -0.390742 +v -0.547984 -0.389597 -0.389597 +v -0.498311 -0.423034 -0.367727 +v -0.577102 -0.067715 -0.481070 +v -0.555759 -0.131769 -0.463907 +v -0.544465 -0.195662 -0.454830 +v -0.539586 -0.260718 -0.451359 +v -0.517178 -0.315514 -0.434705 +v -0.519877 -0.382795 -0.440699 +v -0.499290 -0.431397 -0.431397 +v 0.000000 0.000000 -0.683910 +v 0.071631 0.000000 -0.672007 +v 0.145466 0.000000 -0.681415 +v 0.224215 0.000000 -0.698032 +v 0.308729 0.000000 -0.714748 +v 0.373510 0.000000 -0.673853 +v 0.420100 0.000000 -0.609612 +v 0.469279 0.000000 -0.561814 +v 0.000000 -0.073733 -0.696719 +v 0.000000 -0.149354 -0.703951 +v 0.000000 -0.225181 -0.701673 +v 0.000000 -0.308397 -0.713846 +v 0.000000 -0.376430 -0.679901 +v 0.000000 -0.420664 -0.610524 +v 0.000000 -0.488083 -0.585746 +v -0.074575 0.000000 -0.706627 +v -0.143568 0.000000 -0.670417 +v -0.223115 0.000000 -0.693888 +v -0.303089 0.000000 -0.699396 +v -0.364320 0.000000 -0.654825 +v -0.415891 0.000000 -0.602813 +v -0.476698 0.000000 -0.571256 +v 0.000000 0.068794 -0.638653 +v 0.000000 0.130615 -0.595343 +v 0.000000 0.187231 -0.558694 +v 0.000000 0.250509 -0.556254 +v 0.000000 0.308083 -0.538372 +v 0.000000 0.378325 -0.542124 +v 0.000000 0.446927 -0.533367 +v 0.070093 0.070093 -0.656092 +v 0.142661 0.070708 -0.666975 +v 0.220327 0.072138 -0.684753 +v 0.303687 0.074123 -0.701976 +v 0.366521 0.071198 -0.660156 +v 0.423951 0.068737 -0.616376 +v 0.469435 0.065970 -0.562312 +v 0.066035 0.133392 -0.613599 +v 0.135860 0.135860 -0.631415 +v 0.215588 0.142354 -0.669157 +v 0.300081 0.147632 -0.693362 +v 0.363054 0.142273 -0.654015 +v 0.431737 0.141450 -0.629592 +v 0.464768 0.132019 -0.556849 +v 0.062920 0.193185 -0.583029 +v 0.133694 0.202693 -0.621550 +v 0.212827 0.212827 -0.659400 +v 0.294764 0.219420 -0.678602 +v 0.357130 0.211791 -0.641693 +v 0.408124 0.202180 -0.591901 +v 0.448745 0.193063 -0.536795 +v 0.061598 0.254986 -0.569948 +v 0.128395 0.262077 -0.591540 +v 0.204508 0.274931 -0.626395 +v 0.284276 0.284276 -0.647312 +v 0.345761 0.275421 -0.616177 +v 0.402010 0.267474 -0.580757 +v 0.429079 0.248105 -0.511713 +v 0.059696 0.311101 -0.545765 +v 0.123872 0.317700 -0.561236 +v 0.195060 0.329263 -0.585440 +v 0.260725 0.327327 -0.579641 +v 0.325201 0.325201 -0.569840 +v 0.379823 0.317349 -0.542523 +v 0.421765 0.306351 -0.501147 +v 0.062756 0.389601 -0.561007 +v 0.127455 0.390378 -0.563339 +v 0.191337 0.386379 -0.557389 +v 0.253267 0.380523 -0.547098 +v 0.311221 0.372425 -0.531139 +v 0.370756 0.370756 -0.519758 +v 0.413928 0.359959 -0.487193 +v 0.066576 0.473476 -0.567449 +v 0.133169 0.468729 -0.561867 +v 0.190540 0.442836 -0.529347 +v 0.247665 0.428301 -0.510740 +v 0.315122 0.434151 -0.516491 +v 0.368049 0.423411 -0.498772 +v 0.412336 0.412336 -0.476627 +v 0.073851 -0.073851 -0.699948 +v 0.076438 -0.154024 -0.732419 +v 0.077421 -0.235883 -0.743055 +v 0.078869 -0.322139 -0.752001 +v 0.075879 -0.389074 -0.706708 +v 0.071828 -0.441705 -0.644995 +v 0.068828 -0.488492 -0.586535 +v 0.152181 -0.075508 -0.721802 +v 0.162188 -0.162188 -0.780309 +v 0.166137 -0.251002 -0.799909 +v 0.165414 -0.335208 -0.787480 +v 0.155203 -0.394920 -0.719202 +v 0.142347 -0.434390 -0.633841 +v 0.133294 -0.469158 -0.562411 +v 0.233565 -0.076634 -0.734368 +v 0.237957 -0.157376 -0.751746 +v 0.244437 -0.244436 -0.773482 +v 0.243060 -0.326203 -0.761361 +v 0.233843 -0.393858 -0.715839 +v 0.211804 -0.427422 -0.622530 +v 0.197469 -0.459064 -0.549801 +v 0.315508 -0.077164 -0.734024 +v 0.320313 -0.157874 -0.747572 +v 0.321094 -0.239218 -0.747913 +v 0.316824 -0.316823 -0.730959 +v 0.304980 -0.382835 -0.689658 +v 0.278399 -0.418533 -0.606640 +v 0.261949 -0.453533 -0.542306 +v 0.379790 -0.073951 -0.687544 +v 0.384594 -0.151013 -0.698079 +v 0.389403 -0.231167 -0.706844 +v 0.378024 -0.301144 -0.680123 +v 0.366081 -0.366081 -0.648801 +v 0.341009 -0.408389 -0.586480 +v 0.320194 -0.441314 -0.525365 +v 0.423993 -0.068744 -0.616443 +v 0.422594 -0.138356 -0.614945 +v 0.409087 -0.202661 -0.593430 +v 0.420941 -0.279991 -0.610412 +v 0.419970 -0.350601 -0.604300 +v 0.399472 -0.399472 -0.562779 +v 0.381986 -0.439750 -0.518719 +v 0.473949 -0.066647 -0.568050 +v 0.466773 -0.132601 -0.559389 +v 0.444992 -0.191461 -0.532064 +v 0.456016 -0.263355 -0.545413 +v 0.451494 -0.327402 -0.537976 +v 0.434650 -0.377635 -0.512492 +v 0.417636 -0.417636 -0.482928 +v -0.072240 -0.072240 -0.681154 +v -0.139649 -0.069190 -0.649635 +v -0.212524 -0.069488 -0.655509 +v -0.287141 -0.069868 -0.657120 +v -0.344690 -0.066667 -0.615095 +v -0.386451 -0.062207 -0.555929 +v -0.446301 -0.062500 -0.532907 +v -0.071745 -0.144718 -0.678825 +v -0.143878 -0.143878 -0.676761 +v -0.208421 -0.137541 -0.642700 +v -0.279757 -0.137344 -0.638909 +v -0.334558 -0.130712 -0.595724 +v -0.383682 -0.125189 -0.552612 +v -0.446908 -0.126833 -0.534224 +v -0.071824 -0.219404 -0.681295 +v -0.140173 -0.212341 -0.657171 +v -0.206786 -0.206786 -0.637597 +v -0.261000 -0.194033 -0.589724 +v -0.335961 -0.199081 -0.598960 +v -0.398449 -0.197356 -0.576547 +v -0.444624 -0.191304 -0.531601 +v -0.070762 -0.290620 -0.666551 +v -0.136734 -0.278553 -0.635683 +v -0.208817 -0.280663 -0.641482 +v -0.273301 -0.273301 -0.619105 +v -0.330985 -0.263641 -0.586892 +v -0.384626 -0.255980 -0.553527 +v -0.429157 -0.248149 -0.511812 +v -0.071494 -0.367948 -0.663102 +v -0.140963 -0.359825 -0.647411 +v -0.210761 -0.355414 -0.638232 +v -0.274429 -0.344516 -0.613710 +v -0.320682 -0.320682 -0.561112 +v -0.375454 -0.313730 -0.535801 +v -0.428686 -0.311252 -0.509722 +v -0.067532 -0.417032 -0.605224 +v -0.138442 -0.422848 -0.615353 +v -0.206431 -0.416647 -0.605428 +v -0.268935 -0.404220 -0.584219 +v -0.323794 -0.387604 -0.554497 +v -0.377535 -0.377535 -0.529913 +v -0.429590 -0.373320 -0.506316 +v -0.066414 -0.472397 -0.566077 +v -0.128013 -0.450973 -0.539373 +v -0.195967 -0.455546 -0.545368 +v -0.258222 -0.446951 -0.534072 +v -0.321696 -0.443435 -0.527993 +v -0.381599 -0.439296 -0.518166 +v -0.425834 -0.425834 -0.492676 +v -0.070747 0.070747 -0.663725 +v -0.065696 0.132720 -0.609729 +v -0.062457 0.191824 -0.577929 +v -0.061566 0.254865 -0.569620 +v -0.060192 0.313492 -0.550700 +v -0.059943 0.373445 -0.534964 +v -0.061290 0.438240 -0.522661 +v -0.142730 0.070743 -0.667378 +v -0.137674 0.137674 -0.641674 +v -0.131538 0.199483 -0.609698 +v -0.128740 0.262760 -0.593369 +v -0.126254 0.323571 -0.573248 +v -0.123716 0.379328 -0.545637 +v -0.125583 0.442604 -0.528770 +v -0.219980 0.072020 -0.683455 +v -0.217071 0.143350 -0.674635 +v -0.212601 0.212602 -0.658586 +v -0.215891 0.290070 -0.666246 +v -0.207791 0.350467 -0.628245 +v -0.196637 0.397008 -0.574259 +v -0.200143 0.465325 -0.557693 +v -0.301153 0.073471 -0.695107 +v -0.300490 0.147839 -0.694460 +v -0.302211 0.225020 -0.698206 +v -0.297787 0.297787 -0.682035 +v -0.283678 0.356117 -0.636702 +v -0.272470 0.409566 -0.592594 +v -0.256971 0.444740 -0.531306 +v -0.382364 0.074486 -0.692859 +v -0.393400 0.154586 -0.716093 +v -0.385656 0.228918 -0.699280 +v -0.373836 0.297805 -0.671822 +v -0.356249 0.356249 -0.629810 +v -0.333884 0.399787 -0.573243 +v -0.317586 0.437632 -0.520803 +v -0.444296 0.072279 -0.649171 +v -0.458861 0.150628 -0.673043 +v -0.456091 0.226101 -0.668032 +v -0.437704 0.291075 -0.636673 +v -0.411007 0.343177 -0.590508 +v -0.389105 0.389105 -0.547248 +v -0.371831 0.427846 -0.504186 +v -0.501533 0.070784 -0.603113 +v -0.519781 0.147993 -0.626543 +v -0.523549 0.225004 -0.631079 +v -0.493822 0.284757 -0.592708 +v -0.457179 0.331428 -0.545019 +v -0.434030 0.377107 -0.511736 +v -0.418782 0.418782 -0.484291 +v 0.469677 -0.469677 -0.425752 +v 0.497726 -0.497726 -0.389702 +v 0.525287 -0.525287 -0.342053 +v 0.558711 -0.558711 -0.288938 +v 0.593980 -0.593979 -0.228679 +v 0.619057 -0.619057 -0.158030 +v 0.624804 -0.624804 -0.079506 +v 0.645906 -0.645906 0.000000 +v 0.650285 -0.650285 0.082862 +v 0.674514 -0.674514 0.172161 +v 0.660038 -0.660038 0.253454 +v 0.626006 -0.626006 0.322495 +v 0.582173 -0.582173 0.377624 +v 0.531480 -0.531480 0.415203 +v 0.502549 -0.502549 0.455041 +v 0.413772 -0.456230 -0.456230 +v 0.359513 -0.457766 -0.457766 +v 0.311164 -0.475887 -0.475887 +v 0.253771 -0.488187 -0.488187 +v 0.195512 -0.505543 -0.505544 +v 0.132635 -0.519391 -0.519391 +v 0.067188 -0.531269 -0.531269 +v 0.000000 -0.537533 -0.537533 +v -0.066349 -0.524894 -0.524894 +v -0.129018 -0.505196 -0.505196 +v -0.193567 -0.500357 -0.500357 +v -0.259699 -0.500076 -0.500076 +v -0.321208 -0.491950 -0.491951 +v -0.372731 -0.475262 -0.475263 +v -0.413886 -0.456359 -0.456359 +v 0.444241 -0.403089 -0.444241 +v 0.450802 -0.354252 -0.450802 +v 0.474570 -0.310340 -0.474570 +v 0.485279 -0.252321 -0.485278 +v 0.492400 -0.190583 -0.492400 +v 0.500850 -0.127911 -0.500850 +v 0.520471 -0.065766 -0.520471 +v 0.502755 0.000000 -0.502755 +v 0.495896 0.062530 -0.495895 +v 0.472689 0.120736 -0.472689 +v 0.455640 0.176796 -0.455640 +v 0.452166 0.235809 -0.452165 +v 0.452891 0.296785 -0.452891 +v 0.451959 0.355126 -0.451959 +v 0.438116 0.397632 -0.438115 +v 0.460111 -0.508239 0.508239 +v 0.409428 -0.523836 0.523836 +v 0.350399 -0.538633 0.538633 +v 0.278590 -0.537960 0.537960 +v 0.205756 -0.532856 0.532856 +v 0.135223 -0.529547 0.529547 +v 0.065175 -0.515983 0.515983 +v -0.000000 -0.505662 0.505662 +v -0.066121 -0.523161 0.523161 +v -0.132455 -0.518681 0.518681 +v -0.189358 -0.489134 0.489134 +v -0.242954 -0.466494 0.466494 +v -0.303159 -0.463084 0.463084 +v -0.356250 -0.453447 0.453447 +v -0.396824 -0.437209 0.437209 +v 0.494774 -0.448114 0.494774 +v 0.519739 -0.406333 0.519740 +v 0.539468 -0.350921 0.539468 +v 0.585238 -0.302166 0.585238 +v 0.637306 -0.244928 0.637306 +v 0.660066 -0.168480 0.660067 +v 0.651534 -0.083026 0.651535 +v 0.646628 0.000000 0.646628 +v 0.616479 0.078410 0.616480 +v 0.574808 0.146756 0.574808 +v 0.536183 0.207003 0.536183 +v 0.515789 0.267535 0.515789 +v 0.495600 0.323491 0.495601 +v 0.466926 0.366433 0.466926 +v 0.458624 0.415905 0.458625 +v -0.431464 -0.431464 0.391705 +v -0.453663 -0.453663 0.356413 +v -0.475677 -0.475677 0.311033 +v -0.482944 -0.482944 0.251156 +v -0.487268 -0.487268 0.188658 +v -0.477411 -0.477411 0.121939 +v -0.508957 -0.508957 0.064250 +v -0.537841 -0.537841 -0.000000 +v -0.539220 -0.539220 -0.068236 +v -0.509906 -0.509906 -0.130219 +v -0.499394 -0.499394 -0.193206 +v -0.504913 -0.504913 -0.262112 +v -0.482839 -0.482839 -0.315511 +v -0.466546 -0.466546 -0.366147 +v -0.457752 -0.457752 -0.415127 +v -0.458873 -0.416126 0.458873 +v -0.491477 -0.384981 0.491476 +v -0.540886 -0.351808 0.540886 +v -0.603042 -0.311044 0.603042 +v -0.637925 -0.245161 0.637925 +v -0.657246 -0.167761 0.657245 +v -0.651296 -0.082995 0.651296 +v -0.621671 0.000000 0.621671 +v -0.595224 0.075611 0.595224 +v -0.600101 0.153200 0.600101 +v -0.599554 0.230770 0.599554 +v -0.583968 0.301532 0.583967 +v -0.553764 0.359860 0.553764 +v -0.524318 0.409792 0.524318 +v -0.510555 0.462174 0.510555 +v -0.468863 -0.425027 -0.468863 +v -0.474045 -0.371812 -0.474045 +v -0.486146 -0.317579 -0.486146 +v -0.493940 -0.256640 -0.493941 +v -0.489579 -0.189525 -0.489579 +v -0.494689 -0.126341 -0.494689 +v -0.501830 -0.063311 -0.501830 +v -0.533202 0.000000 -0.533202 +v -0.562916 0.071356 -0.562916 +v -0.567756 0.144959 -0.567756 +v -0.565085 0.217843 -0.565085 +v -0.559330 0.289247 -0.559330 +v -0.528622 0.344139 -0.528622 +v -0.486877 0.381506 -0.486877 +v -0.466916 0.423292 -0.466916 +v 0.462987 0.462987 -0.419792 +v 0.504643 0.504643 -0.394928 +v 0.557003 0.557003 -0.361885 +v 0.600573 0.600573 -0.309812 +v 0.644230 0.644230 -0.247525 +v 0.645585 0.645585 -0.164790 +v 0.651007 0.651007 -0.082957 +v 0.639504 0.639504 0.000000 +v 0.609349 0.609349 0.077471 +v 0.585980 0.585980 0.149603 +v 0.553641 0.553641 0.213551 +v 0.564847 0.564847 0.291998 +v 0.525353 0.525353 0.342095 +v 0.499022 0.499022 0.390681 +v 0.470011 0.470011 0.426050 +v 0.420333 0.463594 -0.463594 +v 0.375929 0.479495 -0.479495 +v 0.331883 0.509022 -0.509021 +v 0.269888 0.520508 -0.520508 +v 0.202800 0.524975 -0.524974 +v 0.141563 0.554428 -0.554427 +v 0.070944 0.559789 -0.559789 +v 0.000000 0.522928 -0.522928 +v -0.065218 0.516310 -0.516310 +v -0.128867 0.504601 -0.504601 +v -0.197155 0.509923 -0.509923 +v -0.254153 0.488953 -0.488953 +v -0.315657 0.483073 -0.483073 +v -0.372752 0.475290 -0.475290 +v -0.420435 0.463709 -0.463709 +v 0.431800 0.476464 0.476465 +v 0.382587 0.488308 0.488308 +v 0.328820 0.504123 0.504123 +v 0.284548 0.549908 0.549908 +v 0.221707 0.575389 0.575389 +v 0.143328 0.561357 0.561358 +v 0.069773 0.550899 0.550899 +v -0.000000 0.532720 0.532720 +v -0.066332 0.524763 0.524764 +v -0.128757 0.504171 0.504171 +v -0.191430 0.494657 0.494657 +v -0.254426 0.489501 0.489501 +v -0.339442 0.521111 0.521111 +v -0.398957 0.509976 0.509976 +v -0.455463 0.503022 0.503022 +v -0.518154 0.518153 0.468944 +v -0.561640 0.561640 0.437988 +v -0.588886 0.588886 0.381821 +v -0.629922 0.629922 0.324447 +v -0.667427 0.667427 0.256225 +v -0.711346 0.711345 0.181546 +v -0.707351 0.707351 0.090377 +v -0.676606 0.676606 -0.000000 +v -0.647236 0.647236 -0.082460 +v -0.590233 0.590233 -0.150686 +v -0.569494 0.569494 -0.219496 +v -0.537659 0.537659 -0.278441 +v -0.503901 0.503901 -0.328681 +v -0.490524 0.490524 -0.384261 +v -0.463653 0.463653 -0.420385 +v 0.444756 -0.444756 -0.444756 +v 0.481097 -0.481097 0.481097 +v -0.429571 -0.429571 0.429571 +v -0.444942 -0.444942 -0.444942 +v 0.441515 0.441515 -0.441515 +v 0.455183 0.455183 0.455184 +v -0.492104 0.492103 0.492103 +v -0.452886 0.452886 -0.452886 +vt 0.500000 0.500000 +vt 0.499936 0.479231 +vt 0.520706 0.479167 +vt 0.520770 0.499936 +vt 0.541476 0.479103 +vt 0.541539 0.499873 +vt 0.562245 0.479039 +vt 0.562309 0.499809 +vt 0.583015 0.478976 +vt 0.583079 0.499745 +vt 0.603784 0.478912 +vt 0.603848 0.499682 +vt 0.624554 0.478848 +vt 0.624618 0.499618 +vt 0.645324 0.478785 +vt 0.645387 0.499554 +vt 0.666093 0.478721 +vt 0.666157 0.499490 +vt 0.499873 0.458461 +vt 0.520642 0.458397 +vt 0.541412 0.458333 +vt 0.562181 0.458270 +vt 0.582951 0.458206 +vt 0.603721 0.458142 +vt 0.624490 0.458079 +vt 0.645260 0.458015 +vt 0.666030 0.457951 +vt 0.499809 0.437691 +vt 0.520579 0.437628 +vt 0.541348 0.437564 +vt 0.562118 0.437500 +vt 0.582887 0.437436 +vt 0.603657 0.437373 +vt 0.624427 0.437309 +vt 0.645196 0.437245 +vt 0.665966 0.437182 +vt 0.499745 0.416922 +vt 0.520515 0.416858 +vt 0.541284 0.416794 +vt 0.562054 0.416731 +vt 0.582824 0.416667 +vt 0.603593 0.416603 +vt 0.624363 0.416539 +vt 0.645132 0.416476 +vt 0.665902 0.416412 +vt 0.499681 0.396152 +vt 0.520451 0.396088 +vt 0.541221 0.396025 +vt 0.561990 0.395961 +vt 0.582760 0.395897 +vt 0.603530 0.395833 +vt 0.624299 0.395770 +vt 0.645069 0.395706 +vt 0.665838 0.395642 +vt 0.499618 0.375382 +vt 0.520387 0.375319 +vt 0.541157 0.375255 +vt 0.561927 0.375191 +vt 0.582696 0.375128 +vt 0.603466 0.375064 +vt 0.624235 0.375000 +vt 0.645005 0.374936 +vt 0.665775 0.374873 +vt 0.499554 0.354613 +vt 0.520324 0.354549 +vt 0.541093 0.354485 +vt 0.561863 0.354422 +vt 0.582632 0.354358 +vt 0.603402 0.354294 +vt 0.624172 0.354231 +vt 0.644941 0.354167 +vt 0.665711 0.354103 +vt 0.499490 0.333843 +vt 0.520260 0.333780 +vt 0.541030 0.333716 +vt 0.561799 0.333652 +vt 0.582569 0.333588 +vt 0.603338 0.333525 +vt 0.624108 0.333461 +vt 0.644878 0.333397 +vt 0.665647 0.333333 +vt 0.520833 0.520706 +vt 0.500064 0.520770 +vt 0.520897 0.541476 +vt 0.500127 0.541539 +vt 0.520961 0.562245 +vt 0.500191 0.562309 +vt 0.521025 0.583015 +vt 0.500255 0.583079 +vt 0.521088 0.603785 +vt 0.500319 0.603848 +vt 0.521152 0.624554 +vt 0.500382 0.624618 +vt 0.521216 0.645324 +vt 0.500446 0.645387 +vt 0.521279 0.666093 +vt 0.500510 0.666157 +vt 0.541603 0.520642 +vt 0.541667 0.541412 +vt 0.541730 0.562182 +vt 0.541794 0.582951 +vt 0.541858 0.603721 +vt 0.541922 0.624490 +vt 0.541985 0.645260 +vt 0.542049 0.666030 +vt 0.562373 0.520579 +vt 0.562436 0.541348 +vt 0.562500 0.562118 +vt 0.562564 0.582887 +vt 0.562627 0.603657 +vt 0.562691 0.624427 +vt 0.562755 0.645196 +vt 0.562819 0.665966 +vt 0.583142 0.520515 +vt 0.583206 0.541285 +vt 0.583270 0.562054 +vt 0.583333 0.582824 +vt 0.583397 0.603593 +vt 0.583461 0.624363 +vt 0.583525 0.645133 +vt 0.583588 0.665902 +vt 0.603912 0.520451 +vt 0.603976 0.541221 +vt 0.604039 0.561990 +vt 0.604103 0.582760 +vt 0.604167 0.603530 +vt 0.604230 0.624299 +vt 0.604294 0.645069 +vt 0.604358 0.665839 +vt 0.624681 0.520387 +vt 0.624745 0.541157 +vt 0.624809 0.561927 +vt 0.624873 0.582696 +vt 0.624936 0.603466 +vt 0.625000 0.624236 +vt 0.625064 0.645005 +vt 0.625127 0.665775 +vt 0.645451 0.520324 +vt 0.645515 0.541093 +vt 0.645579 0.561863 +vt 0.645642 0.582633 +vt 0.645706 0.603402 +vt 0.645770 0.624172 +vt 0.645833 0.644941 +vt 0.645897 0.665711 +vt 0.666221 0.520260 +vt 0.666284 0.541030 +vt 0.666348 0.561799 +vt 0.666412 0.582569 +vt 0.666476 0.603338 +vt 0.666539 0.624108 +vt 0.666603 0.644878 +vt 0.666667 0.665647 +vt 0.479294 0.520833 +vt 0.479230 0.500064 +vt 0.458525 0.520897 +vt 0.458461 0.500128 +vt 0.437755 0.520961 +vt 0.437691 0.500191 +vt 0.416985 0.521025 +vt 0.416922 0.500255 +vt 0.396216 0.521088 +vt 0.396152 0.500319 +vt 0.375446 0.521152 +vt 0.375382 0.500382 +vt 0.354676 0.521216 +vt 0.354613 0.500446 +vt 0.333907 0.521280 +vt 0.333843 0.500510 +vt 0.479358 0.541603 +vt 0.458588 0.541667 +vt 0.437819 0.541731 +vt 0.417049 0.541794 +vt 0.396279 0.541858 +vt 0.375510 0.541922 +vt 0.354740 0.541985 +vt 0.333971 0.542049 +vt 0.479422 0.562373 +vt 0.458652 0.562436 +vt 0.437882 0.562500 +vt 0.417113 0.562564 +vt 0.396343 0.562628 +vt 0.375574 0.562691 +vt 0.354804 0.562755 +vt 0.334034 0.562819 +vt 0.479485 0.583142 +vt 0.458716 0.583206 +vt 0.437946 0.583270 +vt 0.417176 0.583333 +vt 0.396407 0.583397 +vt 0.375637 0.583461 +vt 0.354868 0.583525 +vt 0.334098 0.583588 +vt 0.479549 0.603912 +vt 0.458779 0.603976 +vt 0.438010 0.604039 +vt 0.417240 0.604103 +vt 0.396471 0.604167 +vt 0.375701 0.604231 +vt 0.354931 0.604294 +vt 0.334162 0.604358 +vt 0.479613 0.624682 +vt 0.458843 0.624745 +vt 0.438074 0.624809 +vt 0.417304 0.624873 +vt 0.396534 0.624936 +vt 0.375765 0.625000 +vt 0.354995 0.625064 +vt 0.334225 0.625128 +vt 0.479676 0.645451 +vt 0.458907 0.645515 +vt 0.438137 0.645579 +vt 0.417368 0.645642 +vt 0.396598 0.645706 +vt 0.375828 0.645770 +vt 0.355059 0.645833 +vt 0.334289 0.645897 +vt 0.479740 0.666221 +vt 0.458971 0.666285 +vt 0.438201 0.666348 +vt 0.417431 0.666412 +vt 0.396662 0.666476 +vt 0.375892 0.666539 +vt 0.355123 0.666603 +vt 0.334353 0.666667 +vt 0.479167 0.479294 +vt 0.479103 0.458525 +vt 0.479039 0.437755 +vt 0.478976 0.416985 +vt 0.478912 0.396216 +vt 0.478848 0.375446 +vt 0.478784 0.354677 +vt 0.478721 0.333907 +vt 0.458397 0.479358 +vt 0.458333 0.458588 +vt 0.458270 0.437819 +vt 0.458206 0.417049 +vt 0.458142 0.396280 +vt 0.458079 0.375510 +vt 0.458015 0.354740 +vt 0.457951 0.333971 +vt 0.437627 0.479422 +vt 0.437564 0.458652 +vt 0.437500 0.437882 +vt 0.437436 0.417113 +vt 0.437373 0.396343 +vt 0.437309 0.375574 +vt 0.437245 0.354804 +vt 0.437181 0.334034 +vt 0.416858 0.479485 +vt 0.416794 0.458716 +vt 0.416730 0.437946 +vt 0.416667 0.417177 +vt 0.416603 0.396407 +vt 0.416539 0.375637 +vt 0.416476 0.354868 +vt 0.416412 0.334098 +vt 0.396088 0.479549 +vt 0.396025 0.458780 +vt 0.395961 0.438010 +vt 0.395897 0.417240 +vt 0.395833 0.396471 +vt 0.395770 0.375701 +vt 0.395706 0.354931 +vt 0.395642 0.334162 +vt 0.375319 0.479613 +vt 0.375255 0.458843 +vt 0.375191 0.438074 +vt 0.375127 0.417304 +vt 0.375064 0.396534 +vt 0.375000 0.375765 +vt 0.374936 0.354995 +vt 0.374873 0.334226 +vt 0.354549 0.479677 +vt 0.354485 0.458907 +vt 0.354422 0.438137 +vt 0.354358 0.417368 +vt 0.354294 0.396598 +vt 0.354230 0.375829 +vt 0.354167 0.355059 +vt 0.354103 0.334289 +vt 0.333779 0.479740 +vt 0.333716 0.458971 +vt 0.333652 0.438201 +vt 0.333588 0.417431 +vt 0.333525 0.396662 +vt 0.333461 0.375892 +vt 0.333397 0.355123 +vt 0.333333 0.334353 +vt 0.833333 0.500000 +vt 0.833397 0.479230 +vt 0.854167 0.479294 +vt 0.854103 0.500064 +vt 0.874936 0.479358 +vt 0.874873 0.500127 +vt 0.895706 0.479422 +vt 0.895642 0.500191 +vt 0.916475 0.479485 +vt 0.916412 0.500255 +vt 0.937245 0.479549 +vt 0.937181 0.500319 +vt 0.958015 0.479613 +vt 0.957951 0.500382 +vt 0.978784 0.479676 +vt 0.978721 0.500446 +vt 0.999554 0.479740 +vt 0.999490 0.500510 +vt 0.833461 0.458461 +vt 0.854230 0.458525 +vt 0.875000 0.458588 +vt 0.895770 0.458652 +vt 0.916539 0.458716 +vt 0.937309 0.458779 +vt 0.958078 0.458843 +vt 0.978848 0.458907 +vt 0.999618 0.458971 +vt 0.833524 0.437691 +vt 0.854294 0.437755 +vt 0.875064 0.437819 +vt 0.895833 0.437882 +vt 0.916603 0.437946 +vt 0.937373 0.438010 +vt 0.958142 0.438073 +vt 0.978912 0.438137 +vt 0.999681 0.438201 +vt 0.833588 0.416922 +vt 0.854358 0.416985 +vt 0.875127 0.417049 +vt 0.895897 0.417113 +vt 0.916667 0.417176 +vt 0.937436 0.417240 +vt 0.958206 0.417304 +vt 0.978975 0.417368 +vt 0.999745 0.417431 +vt 0.833652 0.396152 +vt 0.854421 0.396216 +vt 0.875191 0.396279 +vt 0.895961 0.396343 +vt 0.916730 0.396407 +vt 0.937500 0.396471 +vt 0.958270 0.396534 +vt 0.979039 0.396598 +vt 0.999809 0.396662 +vt 0.833716 0.375382 +vt 0.854485 0.375446 +vt 0.875255 0.375510 +vt 0.896024 0.375574 +vt 0.916794 0.375637 +vt 0.937564 0.375701 +vt 0.958333 0.375765 +vt 0.979103 0.375828 +vt 0.999873 0.375892 +vt 0.833779 0.354613 +vt 0.854549 0.354676 +vt 0.875319 0.354740 +vt 0.896088 0.354804 +vt 0.916858 0.354868 +vt 0.937627 0.354931 +vt 0.958397 0.354995 +vt 0.979167 0.355059 +vt 0.999936 0.355122 +vt 0.833843 0.333843 +vt 0.854613 0.333907 +vt 0.875382 0.333971 +vt 0.896152 0.334034 +vt 0.916921 0.334098 +vt 0.937691 0.334162 +vt 0.958461 0.334225 +vt 0.979230 0.334289 +vt 1.000000 0.334353 +vt 0.854039 0.520833 +vt 0.833270 0.520770 +vt 0.853975 0.541603 +vt 0.833206 0.541539 +vt 0.853912 0.562373 +vt 0.833142 0.562309 +vt 0.853848 0.583142 +vt 0.833078 0.583079 +vt 0.853784 0.603912 +vt 0.833015 0.603848 +vt 0.853721 0.624681 +vt 0.832951 0.624618 +vt 0.853657 0.645451 +vt 0.832887 0.645387 +vt 0.853593 0.666221 +vt 0.832824 0.666157 +vt 0.874809 0.520897 +vt 0.874745 0.541667 +vt 0.874681 0.562436 +vt 0.874618 0.583206 +vt 0.874554 0.603976 +vt 0.874490 0.624745 +vt 0.874427 0.645515 +vt 0.874363 0.666284 +vt 0.895578 0.520961 +vt 0.895515 0.541730 +vt 0.895451 0.562500 +vt 0.895387 0.583270 +vt 0.895324 0.604039 +vt 0.895260 0.624809 +vt 0.895196 0.645579 +vt 0.895132 0.666348 +vt 0.916348 0.521025 +vt 0.916284 0.541794 +vt 0.916221 0.562564 +vt 0.916157 0.583333 +vt 0.916093 0.604103 +vt 0.916029 0.624873 +vt 0.915966 0.645642 +vt 0.915902 0.666412 +vt 0.937118 0.521088 +vt 0.937054 0.541858 +vt 0.936990 0.562627 +vt 0.936926 0.583397 +vt 0.936863 0.604167 +vt 0.936799 0.624936 +vt 0.936735 0.645706 +vt 0.936672 0.666476 +vt 0.957887 0.521152 +vt 0.957824 0.541922 +vt 0.957760 0.562691 +vt 0.957696 0.583461 +vt 0.957632 0.604230 +vt 0.957569 0.625000 +vt 0.957505 0.645770 +vt 0.957441 0.666539 +vt 0.978657 0.521216 +vt 0.978593 0.541985 +vt 0.978529 0.562755 +vt 0.978466 0.583525 +vt 0.978402 0.604294 +vt 0.978338 0.625064 +vt 0.978275 0.645833 +vt 0.978211 0.666603 +vt 0.999426 0.521279 +vt 0.999363 0.542049 +vt 0.999299 0.562819 +vt 0.999235 0.583588 +vt 0.999172 0.604358 +vt 0.999108 0.625127 +vt 0.999044 0.645897 +vt 0.998980 0.666667 +vt 0.812500 0.520706 +vt 0.812564 0.499936 +vt 0.791730 0.520642 +vt 0.791794 0.499873 +vt 0.770961 0.520579 +vt 0.771024 0.499809 +vt 0.750191 0.520515 +vt 0.750255 0.499745 +vt 0.729422 0.520451 +vt 0.729485 0.499682 +vt 0.708652 0.520387 +vt 0.708716 0.499618 +vt 0.687882 0.520324 +vt 0.687946 0.499554 +vt 0.667113 0.520260 +vt 0.667176 0.499490 +vt 0.812436 0.541476 +vt 0.791667 0.541412 +vt 0.770897 0.541348 +vt 0.750127 0.541284 +vt 0.729358 0.541221 +vt 0.708588 0.541157 +vt 0.687819 0.541093 +vt 0.667049 0.541030 +vt 0.812373 0.562245 +vt 0.791603 0.562181 +vt 0.770833 0.562118 +vt 0.750064 0.562054 +vt 0.729294 0.561990 +vt 0.708525 0.561927 +vt 0.687755 0.561863 +vt 0.666985 0.561799 +vt 0.812309 0.583015 +vt 0.791539 0.582951 +vt 0.770770 0.582887 +vt 0.750000 0.582824 +vt 0.729230 0.582760 +vt 0.708461 0.582696 +vt 0.687691 0.582632 +vt 0.666922 0.582569 +vt 0.812245 0.603784 +vt 0.791476 0.603721 +vt 0.770706 0.603657 +vt 0.749936 0.603593 +vt 0.729167 0.603530 +vt 0.708397 0.603466 +vt 0.687627 0.603402 +vt 0.666858 0.603338 +vt 0.812181 0.624554 +vt 0.791412 0.624490 +vt 0.770642 0.624427 +vt 0.749873 0.624363 +vt 0.729103 0.624299 +vt 0.708333 0.624235 +vt 0.687564 0.624172 +vt 0.666794 0.624108 +vt 0.812118 0.645324 +vt 0.791348 0.645260 +vt 0.770579 0.645196 +vt 0.749809 0.645132 +vt 0.729039 0.645069 +vt 0.708270 0.645005 +vt 0.687500 0.644941 +vt 0.666730 0.644878 +vt 0.812054 0.666093 +vt 0.791284 0.666030 +vt 0.770515 0.665966 +vt 0.749745 0.665902 +vt 0.728976 0.665838 +vt 0.708206 0.665775 +vt 0.687436 0.665711 +vt 0.812627 0.479167 +vt 0.812691 0.458397 +vt 0.812755 0.437627 +vt 0.812819 0.416858 +vt 0.812882 0.396088 +vt 0.812946 0.375319 +vt 0.813010 0.354549 +vt 0.813073 0.333779 +vt 0.791858 0.479103 +vt 0.791921 0.458333 +vt 0.791985 0.437564 +vt 0.792049 0.416794 +vt 0.792113 0.396025 +vt 0.792176 0.375255 +vt 0.792240 0.354485 +vt 0.792304 0.333716 +vt 0.771088 0.479039 +vt 0.771152 0.458270 +vt 0.771216 0.437500 +vt 0.771279 0.416730 +vt 0.771343 0.395961 +vt 0.771407 0.375191 +vt 0.771470 0.354422 +vt 0.771534 0.333652 +vt 0.750319 0.478976 +vt 0.750382 0.458206 +vt 0.750446 0.437436 +vt 0.750510 0.416667 +vt 0.750573 0.395897 +vt 0.750637 0.375128 +vt 0.750701 0.354358 +vt 0.750765 0.333588 +vt 0.729549 0.478912 +vt 0.729613 0.458142 +vt 0.729676 0.437373 +vt 0.729740 0.416603 +vt 0.729804 0.395833 +vt 0.729868 0.375064 +vt 0.729931 0.354294 +vt 0.729995 0.333525 +vt 0.708779 0.478848 +vt 0.708843 0.458079 +vt 0.708907 0.437309 +vt 0.708970 0.416539 +vt 0.709034 0.395770 +vt 0.709098 0.375000 +vt 0.709162 0.354231 +vt 0.709225 0.333461 +vt 0.688010 0.478784 +vt 0.688073 0.458015 +vt 0.688137 0.437245 +vt 0.688201 0.416476 +vt 0.688265 0.395706 +vt 0.688328 0.374936 +vt 0.688392 0.354167 +vt 0.688456 0.333397 +vt 0.667240 0.478721 +vt 0.667304 0.457951 +vt 0.667368 0.437182 +vt 0.667431 0.416412 +vt 0.667495 0.395642 +vt 0.667559 0.374873 +vt 0.667622 0.354103 +vt 0.667686 0.333333 +vt 0.833333 0.166667 +vt 0.833270 0.145897 +vt 0.854039 0.145833 +vt 0.854103 0.166603 +vt 0.874809 0.145770 +vt 0.874873 0.166539 +vt 0.895578 0.145706 +vt 0.895642 0.166476 +vt 0.916348 0.145642 +vt 0.916412 0.166412 +vt 0.937118 0.145578 +vt 0.937181 0.166348 +vt 0.957887 0.145515 +vt 0.957951 0.166284 +vt 0.978657 0.145451 +vt 0.978721 0.166221 +vt 0.999427 0.145387 +vt 0.999490 0.166157 +vt 0.833206 0.125127 +vt 0.853976 0.125064 +vt 0.874745 0.125000 +vt 0.895515 0.124936 +vt 0.916284 0.124873 +vt 0.937054 0.124809 +vt 0.957824 0.124745 +vt 0.978593 0.124681 +vt 0.999363 0.124618 +vt 0.833142 0.104358 +vt 0.853912 0.104294 +vt 0.874681 0.104230 +vt 0.895451 0.104167 +vt 0.916221 0.104103 +vt 0.936990 0.104039 +vt 0.957760 0.103976 +vt 0.978530 0.103912 +vt 0.999299 0.103848 +vt 0.833079 0.083588 +vt 0.853848 0.083524 +vt 0.874618 0.083461 +vt 0.895387 0.083397 +vt 0.916157 0.083333 +vt 0.936927 0.083270 +vt 0.957696 0.083206 +vt 0.978466 0.083142 +vt 0.999235 0.083078 +vt 0.833015 0.062819 +vt 0.853784 0.062755 +vt 0.874554 0.062691 +vt 0.895324 0.062627 +vt 0.916093 0.062564 +vt 0.936863 0.062500 +vt 0.957632 0.062436 +vt 0.978402 0.062373 +vt 0.999172 0.062309 +vt 0.832951 0.042049 +vt 0.853721 0.041985 +vt 0.874490 0.041922 +vt 0.895260 0.041858 +vt 0.916030 0.041794 +vt 0.936799 0.041730 +vt 0.957569 0.041667 +vt 0.978338 0.041603 +vt 0.999108 0.041539 +vt 0.832887 0.021279 +vt 0.853657 0.021216 +vt 0.874427 0.021152 +vt 0.895196 0.021088 +vt 0.915966 0.021024 +vt 0.936735 0.020961 +vt 0.957505 0.020897 +vt 0.978275 0.020833 +vt 0.999044 0.020770 +vt 0.832824 0.000510 +vt 0.853593 0.000446 +vt 0.874363 0.000382 +vt 0.895133 0.000319 +vt 0.915902 0.000255 +vt 0.936672 0.000191 +vt 0.957441 0.000127 +vt 0.978211 0.000064 +vt 0.998981 0.000000 +vt 0.854167 0.187373 +vt 0.833397 0.187436 +vt 0.854230 0.208142 +vt 0.833461 0.208206 +vt 0.854294 0.228912 +vt 0.833524 0.228976 +vt 0.854358 0.249681 +vt 0.833588 0.249745 +vt 0.854421 0.270451 +vt 0.833652 0.270515 +vt 0.854485 0.291221 +vt 0.833716 0.291284 +vt 0.854549 0.311990 +vt 0.833779 0.312054 +vt 0.854613 0.332760 +vt 0.833843 0.332824 +vt 0.874936 0.187309 +vt 0.875000 0.208078 +vt 0.875064 0.228848 +vt 0.875127 0.249618 +vt 0.875191 0.270387 +vt 0.875255 0.291157 +vt 0.875319 0.311927 +vt 0.875382 0.332696 +vt 0.895706 0.187245 +vt 0.895770 0.208015 +vt 0.895833 0.228784 +vt 0.895897 0.249554 +vt 0.895961 0.270324 +vt 0.896024 0.291093 +vt 0.896088 0.311863 +vt 0.896152 0.332632 +vt 0.916475 0.187181 +vt 0.916539 0.207951 +vt 0.916603 0.228721 +vt 0.916667 0.249490 +vt 0.916730 0.270260 +vt 0.916794 0.291030 +vt 0.916858 0.311799 +vt 0.916921 0.332569 +vt 0.937245 0.187118 +vt 0.937309 0.207887 +vt 0.937373 0.228657 +vt 0.937436 0.249427 +vt 0.937500 0.270196 +vt 0.937564 0.290966 +vt 0.937627 0.311735 +vt 0.937691 0.332505 +vt 0.958015 0.187054 +vt 0.958078 0.207824 +vt 0.958142 0.228593 +vt 0.958206 0.249363 +vt 0.958270 0.270132 +vt 0.958333 0.290902 +vt 0.958397 0.311672 +vt 0.958461 0.332441 +vt 0.978784 0.186990 +vt 0.978848 0.207760 +vt 0.978912 0.228529 +vt 0.978975 0.249299 +vt 0.979039 0.270069 +vt 0.979103 0.290838 +vt 0.979167 0.311608 +vt 0.979230 0.332378 +vt 0.999554 0.186927 +vt 0.999618 0.207696 +vt 0.999681 0.228466 +vt 0.999745 0.249235 +vt 0.999809 0.270005 +vt 0.999873 0.290775 +vt 0.999936 0.311544 +vt 1.000000 0.332314 +vt 0.812627 0.187500 +vt 0.812564 0.166730 +vt 0.791858 0.187564 +vt 0.791794 0.166794 +vt 0.771088 0.187627 +vt 0.771025 0.166858 +vt 0.750319 0.187691 +vt 0.750255 0.166922 +vt 0.729549 0.187755 +vt 0.729485 0.166985 +vt 0.708779 0.187819 +vt 0.708716 0.167049 +vt 0.688010 0.187882 +vt 0.687946 0.167113 +vt 0.667240 0.187946 +vt 0.667176 0.167176 +vt 0.812691 0.208270 +vt 0.791922 0.208333 +vt 0.771152 0.208397 +vt 0.750382 0.208461 +vt 0.729613 0.208525 +vt 0.708843 0.208588 +vt 0.688073 0.208652 +vt 0.667304 0.208716 +vt 0.812755 0.229039 +vt 0.791985 0.229103 +vt 0.771216 0.229167 +vt 0.750446 0.229230 +vt 0.729676 0.229294 +vt 0.708907 0.229358 +vt 0.688137 0.229422 +vt 0.667368 0.229485 +vt 0.812819 0.249809 +vt 0.792049 0.249873 +vt 0.771279 0.249936 +vt 0.750510 0.250000 +vt 0.729740 0.250064 +vt 0.708970 0.250128 +vt 0.688201 0.250191 +vt 0.667431 0.250255 +vt 0.812882 0.270579 +vt 0.792113 0.270642 +vt 0.771343 0.270706 +vt 0.750573 0.270770 +vt 0.729804 0.270833 +vt 0.709034 0.270897 +vt 0.688265 0.270961 +vt 0.667495 0.271025 +vt 0.812946 0.291348 +vt 0.792176 0.291412 +vt 0.771407 0.291476 +vt 0.750637 0.291539 +vt 0.729868 0.291603 +vt 0.709098 0.291667 +vt 0.688328 0.291730 +vt 0.667559 0.291794 +vt 0.813010 0.312118 +vt 0.792240 0.312182 +vt 0.771470 0.312245 +vt 0.750701 0.312309 +vt 0.729931 0.312373 +vt 0.709162 0.312436 +vt 0.688392 0.312500 +vt 0.667622 0.312564 +vt 0.813073 0.332887 +vt 0.792304 0.332951 +vt 0.771534 0.333015 +vt 0.750765 0.333079 +vt 0.729995 0.333142 +vt 0.709225 0.333206 +vt 0.688456 0.333270 +vt 0.812500 0.145961 +vt 0.812436 0.125191 +vt 0.812373 0.104422 +vt 0.812309 0.083652 +vt 0.812245 0.062882 +vt 0.812181 0.042113 +vt 0.812118 0.021343 +vt 0.812054 0.000573 +vt 0.791730 0.146025 +vt 0.791667 0.125255 +vt 0.791603 0.104485 +vt 0.791539 0.083716 +vt 0.791476 0.062946 +vt 0.791412 0.042176 +vt 0.791348 0.021407 +vt 0.791284 0.000637 +vt 0.770961 0.146088 +vt 0.770897 0.125319 +vt 0.770833 0.104549 +vt 0.770770 0.083779 +vt 0.770706 0.063010 +vt 0.770642 0.042240 +vt 0.770579 0.021470 +vt 0.770515 0.000701 +vt 0.750191 0.146152 +vt 0.750127 0.125382 +vt 0.750064 0.104613 +vt 0.750000 0.083843 +vt 0.749936 0.063073 +vt 0.749873 0.042304 +vt 0.749809 0.021534 +vt 0.749745 0.000765 +vt 0.729422 0.146216 +vt 0.729358 0.125446 +vt 0.729294 0.104676 +vt 0.729230 0.083907 +vt 0.729167 0.063137 +vt 0.729103 0.042368 +vt 0.729039 0.021598 +vt 0.728976 0.000828 +vt 0.708652 0.146279 +vt 0.708588 0.125510 +vt 0.708525 0.104740 +vt 0.708461 0.083971 +vt 0.708397 0.063201 +vt 0.708333 0.042431 +vt 0.708270 0.021662 +vt 0.708206 0.000892 +vt 0.687882 0.146343 +vt 0.687819 0.125573 +vt 0.687755 0.104804 +vt 0.687691 0.084034 +vt 0.687627 0.063265 +vt 0.687564 0.042495 +vt 0.687500 0.021725 +vt 0.687436 0.000956 +vt 0.667113 0.146407 +vt 0.667049 0.125637 +vt 0.666985 0.104868 +vt 0.666922 0.084098 +vt 0.666858 0.063328 +vt 0.666794 0.042559 +vt 0.666730 0.021789 +vt 0.666667 0.001019 +vt 0.500000 0.166667 +vt 0.500064 0.187436 +vt 0.479294 0.187500 +vt 0.479230 0.166730 +vt 0.458525 0.187564 +vt 0.458461 0.166794 +vt 0.437755 0.187627 +vt 0.437691 0.166858 +vt 0.416985 0.187691 +vt 0.416922 0.166922 +vt 0.396216 0.187755 +vt 0.396152 0.166985 +vt 0.375446 0.187819 +vt 0.375382 0.167049 +vt 0.354676 0.187882 +vt 0.354613 0.167113 +vt 0.333907 0.187946 +vt 0.333843 0.167176 +vt 0.500127 0.208206 +vt 0.479358 0.208270 +vt 0.458588 0.208333 +vt 0.437819 0.208397 +vt 0.417049 0.208461 +vt 0.396279 0.208525 +vt 0.375510 0.208588 +vt 0.354740 0.208652 +vt 0.333971 0.208716 +vt 0.500191 0.228976 +vt 0.479422 0.229039 +vt 0.458652 0.229103 +vt 0.437882 0.229167 +vt 0.417113 0.229230 +vt 0.396343 0.229294 +vt 0.375574 0.229358 +vt 0.354804 0.229422 +vt 0.334034 0.229485 +vt 0.500255 0.249745 +vt 0.479485 0.249809 +vt 0.458716 0.249873 +vt 0.437946 0.249936 +vt 0.417176 0.250000 +vt 0.396407 0.250064 +vt 0.375637 0.250128 +vt 0.354868 0.250191 +vt 0.334098 0.250255 +vt 0.500319 0.270515 +vt 0.479549 0.270579 +vt 0.458779 0.270642 +vt 0.438010 0.270706 +vt 0.417240 0.270770 +vt 0.396471 0.270833 +vt 0.375701 0.270897 +vt 0.354931 0.270961 +vt 0.334162 0.271025 +vt 0.500382 0.291284 +vt 0.479613 0.291348 +vt 0.458843 0.291412 +vt 0.438074 0.291476 +vt 0.417304 0.291539 +vt 0.396534 0.291603 +vt 0.375765 0.291667 +vt 0.354995 0.291730 +vt 0.334225 0.291794 +vt 0.500446 0.312054 +vt 0.479676 0.312118 +vt 0.458907 0.312182 +vt 0.438137 0.312245 +vt 0.417368 0.312309 +vt 0.396598 0.312373 +vt 0.375828 0.312436 +vt 0.355059 0.312500 +vt 0.334289 0.312564 +vt 0.500510 0.332824 +vt 0.479740 0.332887 +vt 0.458971 0.332951 +vt 0.438201 0.333015 +vt 0.417431 0.333079 +vt 0.396662 0.333142 +vt 0.375892 0.333206 +vt 0.355122 0.333270 +vt 0.334353 0.333333 +vt 0.479167 0.145961 +vt 0.499936 0.145897 +vt 0.479103 0.125191 +vt 0.499873 0.125127 +vt 0.479039 0.104422 +vt 0.499809 0.104358 +vt 0.478976 0.083652 +vt 0.499745 0.083588 +vt 0.478912 0.062882 +vt 0.499681 0.062819 +vt 0.478848 0.042113 +vt 0.499618 0.042049 +vt 0.478784 0.021343 +vt 0.499554 0.021279 +vt 0.478721 0.000573 +vt 0.499490 0.000510 +vt 0.458397 0.146025 +vt 0.458333 0.125255 +vt 0.458270 0.104485 +vt 0.458206 0.083716 +vt 0.458142 0.062946 +vt 0.458079 0.042176 +vt 0.458015 0.021407 +vt 0.457951 0.000637 +vt 0.437627 0.146088 +vt 0.437564 0.125319 +vt 0.437500 0.104549 +vt 0.437436 0.083779 +vt 0.437373 0.063010 +vt 0.437309 0.042240 +vt 0.437245 0.021471 +vt 0.437181 0.000701 +vt 0.416858 0.146152 +vt 0.416794 0.125382 +vt 0.416730 0.104613 +vt 0.416667 0.083843 +vt 0.416603 0.063073 +vt 0.416539 0.042304 +vt 0.416476 0.021534 +vt 0.416412 0.000765 +vt 0.396088 0.146216 +vt 0.396025 0.125446 +vt 0.395961 0.104676 +vt 0.395897 0.083907 +vt 0.395833 0.063137 +vt 0.395770 0.042368 +vt 0.395706 0.021598 +vt 0.395642 0.000828 +vt 0.375319 0.146279 +vt 0.375255 0.125510 +vt 0.375191 0.104740 +vt 0.375127 0.083971 +vt 0.375064 0.063201 +vt 0.375000 0.042431 +vt 0.374936 0.021662 +vt 0.374873 0.000892 +vt 0.354549 0.146343 +vt 0.354485 0.125574 +vt 0.354422 0.104804 +vt 0.354358 0.084034 +vt 0.354294 0.063265 +vt 0.354230 0.042495 +vt 0.354167 0.021725 +vt 0.354103 0.000956 +vt 0.333779 0.146407 +vt 0.333716 0.125637 +vt 0.333652 0.104868 +vt 0.333588 0.084098 +vt 0.333525 0.063328 +vt 0.333461 0.042559 +vt 0.333397 0.021789 +vt 0.333333 0.001020 +vt 0.520706 0.145833 +vt 0.520770 0.166603 +vt 0.541476 0.145770 +vt 0.541539 0.166539 +vt 0.562245 0.145706 +vt 0.562309 0.166476 +vt 0.583015 0.145642 +vt 0.583079 0.166412 +vt 0.603784 0.145579 +vt 0.603848 0.166348 +vt 0.624554 0.145515 +vt 0.624618 0.166284 +vt 0.645324 0.145451 +vt 0.645387 0.166221 +vt 0.666093 0.145387 +vt 0.666157 0.166157 +vt 0.520642 0.125064 +vt 0.541412 0.125000 +vt 0.562181 0.124936 +vt 0.582951 0.124873 +vt 0.603721 0.124809 +vt 0.624490 0.124745 +vt 0.645260 0.124681 +vt 0.666030 0.124618 +vt 0.520579 0.104294 +vt 0.541348 0.104230 +vt 0.562118 0.104167 +vt 0.582887 0.104103 +vt 0.603657 0.104039 +vt 0.624427 0.103976 +vt 0.645196 0.103912 +vt 0.665966 0.103848 +vt 0.520515 0.083525 +vt 0.541284 0.083461 +vt 0.562054 0.083397 +vt 0.582824 0.083333 +vt 0.603593 0.083270 +vt 0.624363 0.083206 +vt 0.645132 0.083142 +vt 0.665902 0.083078 +vt 0.520451 0.062755 +vt 0.541221 0.062691 +vt 0.561990 0.062627 +vt 0.582760 0.062564 +vt 0.603530 0.062500 +vt 0.624299 0.062436 +vt 0.645069 0.062373 +vt 0.665838 0.062309 +vt 0.520387 0.041985 +vt 0.541157 0.041922 +vt 0.561927 0.041858 +vt 0.582696 0.041794 +vt 0.603466 0.041730 +vt 0.624235 0.041667 +vt 0.645005 0.041603 +vt 0.665775 0.041539 +vt 0.520324 0.021216 +vt 0.541093 0.021152 +vt 0.561863 0.021088 +vt 0.582632 0.021024 +vt 0.603402 0.020961 +vt 0.624172 0.020897 +vt 0.644941 0.020833 +vt 0.665711 0.020770 +vt 0.520260 0.000446 +vt 0.541030 0.000382 +vt 0.561799 0.000319 +vt 0.582569 0.000255 +vt 0.603338 0.000191 +vt 0.624108 0.000127 +vt 0.644878 0.000064 +vt 0.665647 0.000000 +vt 0.520833 0.187373 +vt 0.520897 0.208142 +vt 0.520961 0.228912 +vt 0.521025 0.249681 +vt 0.521088 0.270451 +vt 0.521152 0.291221 +vt 0.521216 0.311990 +vt 0.521279 0.332760 +vt 0.541603 0.187309 +vt 0.541667 0.208079 +vt 0.541730 0.228848 +vt 0.541794 0.249618 +vt 0.541858 0.270387 +vt 0.541922 0.291157 +vt 0.541985 0.311927 +vt 0.542049 0.332696 +vt 0.562373 0.187245 +vt 0.562436 0.208015 +vt 0.562500 0.228784 +vt 0.562564 0.249554 +vt 0.562627 0.270324 +vt 0.562691 0.291093 +vt 0.562755 0.311863 +vt 0.562819 0.332633 +vt 0.583142 0.187181 +vt 0.583206 0.207951 +vt 0.583270 0.228721 +vt 0.583333 0.249490 +vt 0.583397 0.270260 +vt 0.583461 0.291030 +vt 0.583525 0.311799 +vt 0.583588 0.332569 +vt 0.603912 0.187118 +vt 0.603976 0.207887 +vt 0.604039 0.228657 +vt 0.604103 0.249427 +vt 0.604167 0.270196 +vt 0.604230 0.290966 +vt 0.604294 0.311735 +vt 0.604358 0.332505 +vt 0.624681 0.187054 +vt 0.624745 0.207824 +vt 0.624809 0.228593 +vt 0.624873 0.249363 +vt 0.624936 0.270133 +vt 0.625000 0.290902 +vt 0.625064 0.311672 +vt 0.625127 0.332441 +vt 0.645451 0.186990 +vt 0.645515 0.207760 +vt 0.645579 0.228530 +vt 0.645642 0.249299 +vt 0.645706 0.270069 +vt 0.645770 0.290838 +vt 0.645833 0.311608 +vt 0.645897 0.332378 +vt 0.666221 0.186927 +vt 0.666284 0.207696 +vt 0.666348 0.228466 +vt 0.666412 0.249235 +vt 0.666476 0.270005 +vt 0.666539 0.290775 +vt 0.666603 0.311544 +vt 0.666667 0.332314 +vt 0.166667 0.500000 +vt 0.166603 0.479231 +vt 0.187373 0.479167 +vt 0.187436 0.499936 +vt 0.208142 0.479103 +vt 0.208206 0.499873 +vt 0.228912 0.479039 +vt 0.228976 0.499809 +vt 0.249681 0.478976 +vt 0.249745 0.499745 +vt 0.270451 0.478912 +vt 0.270515 0.499682 +vt 0.291221 0.478848 +vt 0.291284 0.499618 +vt 0.311990 0.478785 +vt 0.312054 0.499554 +vt 0.332760 0.478721 +vt 0.332824 0.499490 +vt 0.166539 0.458461 +vt 0.187309 0.458397 +vt 0.208078 0.458333 +vt 0.228848 0.458270 +vt 0.249618 0.458206 +vt 0.270387 0.458142 +vt 0.291157 0.458079 +vt 0.311927 0.458015 +vt 0.332696 0.457951 +vt 0.166476 0.437691 +vt 0.187245 0.437628 +vt 0.208015 0.437564 +vt 0.228784 0.437500 +vt 0.249554 0.437436 +vt 0.270324 0.437373 +vt 0.291093 0.437309 +vt 0.311863 0.437245 +vt 0.332632 0.437182 +vt 0.166412 0.416922 +vt 0.187181 0.416858 +vt 0.207951 0.416794 +vt 0.228721 0.416731 +vt 0.249490 0.416667 +vt 0.270260 0.416603 +vt 0.291030 0.416539 +vt 0.311799 0.416476 +vt 0.332569 0.416412 +vt 0.166348 0.396152 +vt 0.187118 0.396088 +vt 0.207887 0.396025 +vt 0.228657 0.395961 +vt 0.249427 0.395897 +vt 0.270196 0.395833 +vt 0.290966 0.395770 +vt 0.311735 0.395706 +vt 0.332505 0.395642 +vt 0.166284 0.375382 +vt 0.187054 0.375319 +vt 0.207824 0.375255 +vt 0.228593 0.375191 +vt 0.249363 0.375128 +vt 0.270132 0.375064 +vt 0.290902 0.375000 +vt 0.311672 0.374936 +vt 0.332441 0.374873 +vt 0.166221 0.354613 +vt 0.186990 0.354549 +vt 0.207760 0.354485 +vt 0.228530 0.354422 +vt 0.249299 0.354358 +vt 0.270069 0.354294 +vt 0.290838 0.354231 +vt 0.311608 0.354167 +vt 0.332378 0.354103 +vt 0.166157 0.333843 +vt 0.186927 0.333780 +vt 0.207696 0.333716 +vt 0.228466 0.333652 +vt 0.249235 0.333588 +vt 0.270005 0.333525 +vt 0.290775 0.333461 +vt 0.311544 0.333397 +vt 0.332314 0.333333 +vt 0.187500 0.520706 +vt 0.166730 0.520770 +vt 0.187564 0.541476 +vt 0.166794 0.541539 +vt 0.187627 0.562245 +vt 0.166858 0.562309 +vt 0.187691 0.583015 +vt 0.166922 0.583079 +vt 0.187755 0.603785 +vt 0.166985 0.603848 +vt 0.187819 0.624554 +vt 0.167049 0.624618 +vt 0.187882 0.645324 +vt 0.167113 0.645387 +vt 0.187946 0.666093 +vt 0.167176 0.666157 +vt 0.208270 0.520642 +vt 0.208333 0.541412 +vt 0.208397 0.562182 +vt 0.208461 0.582951 +vt 0.208525 0.603721 +vt 0.208588 0.624490 +vt 0.208652 0.645260 +vt 0.208716 0.666030 +vt 0.229039 0.520579 +vt 0.229103 0.541348 +vt 0.229167 0.562118 +vt 0.229230 0.582887 +vt 0.229294 0.603657 +vt 0.229358 0.624427 +vt 0.229422 0.645196 +vt 0.229485 0.665966 +vt 0.249809 0.520515 +vt 0.249873 0.541285 +vt 0.249936 0.562054 +vt 0.250000 0.582824 +vt 0.250064 0.603593 +vt 0.250127 0.624363 +vt 0.250191 0.645133 +vt 0.250255 0.665902 +vt 0.270579 0.520451 +vt 0.270642 0.541221 +vt 0.270706 0.561990 +vt 0.270770 0.582760 +vt 0.270833 0.603530 +vt 0.270897 0.624299 +vt 0.270961 0.645069 +vt 0.271025 0.665839 +vt 0.291348 0.520387 +vt 0.291412 0.541157 +vt 0.291476 0.561927 +vt 0.291539 0.582696 +vt 0.291603 0.603466 +vt 0.291667 0.624236 +vt 0.291730 0.645005 +vt 0.291794 0.665775 +vt 0.312118 0.520324 +vt 0.312181 0.541093 +vt 0.312245 0.561863 +vt 0.312309 0.582633 +vt 0.312373 0.603402 +vt 0.312436 0.624172 +vt 0.312500 0.644941 +vt 0.312564 0.665711 +vt 0.332887 0.520260 +vt 0.332951 0.541030 +vt 0.333015 0.561799 +vt 0.333079 0.582569 +vt 0.333142 0.603338 +vt 0.333206 0.624108 +vt 0.333270 0.644878 +vt 0.333333 0.665647 +vt 0.145961 0.520833 +vt 0.145897 0.500064 +vt 0.125191 0.520897 +vt 0.125127 0.500128 +vt 0.104422 0.520961 +vt 0.104358 0.500191 +vt 0.083652 0.521025 +vt 0.083588 0.500255 +vt 0.062882 0.521088 +vt 0.062819 0.500319 +vt 0.042113 0.521152 +vt 0.042049 0.500382 +vt 0.021343 0.521216 +vt 0.021279 0.500446 +vt 0.000573 0.521280 +vt 0.000510 0.500510 +vt 0.146025 0.541603 +vt 0.125255 0.541667 +vt 0.104485 0.541731 +vt 0.083716 0.541794 +vt 0.062946 0.541858 +vt 0.042176 0.541922 +vt 0.021407 0.541985 +vt 0.000637 0.542049 +vt 0.146088 0.562373 +vt 0.125319 0.562436 +vt 0.104549 0.562500 +vt 0.083779 0.562564 +vt 0.063010 0.562628 +vt 0.042240 0.562691 +vt 0.021471 0.562755 +vt 0.000701 0.562819 +vt 0.146152 0.583142 +vt 0.125382 0.583206 +vt 0.104613 0.583270 +vt 0.083843 0.583333 +vt 0.063074 0.583397 +vt 0.042304 0.583461 +vt 0.021534 0.583525 +vt 0.000765 0.583588 +vt 0.146216 0.603912 +vt 0.125446 0.603976 +vt 0.104676 0.604039 +vt 0.083907 0.604103 +vt 0.063137 0.604167 +vt 0.042368 0.604231 +vt 0.021598 0.604294 +vt 0.000828 0.604358 +vt 0.146279 0.624682 +vt 0.125510 0.624745 +vt 0.104740 0.624809 +vt 0.083971 0.624873 +vt 0.063201 0.624936 +vt 0.042431 0.625000 +vt 0.021662 0.625064 +vt 0.000892 0.625128 +vt 0.146343 0.645451 +vt 0.125574 0.645515 +vt 0.104804 0.645579 +vt 0.084034 0.645642 +vt 0.063265 0.645706 +vt 0.042495 0.645770 +vt 0.021725 0.645833 +vt 0.000956 0.645897 +vt 0.146407 0.666221 +vt 0.125637 0.666285 +vt 0.104868 0.666348 +vt 0.084098 0.666412 +vt 0.063328 0.666476 +vt 0.042559 0.666539 +vt 0.021789 0.666603 +vt 0.001020 0.666667 +vt 0.145833 0.479294 +vt 0.145770 0.458525 +vt 0.145706 0.437755 +vt 0.145642 0.416985 +vt 0.145578 0.396216 +vt 0.145515 0.375446 +vt 0.145451 0.354677 +vt 0.145387 0.333907 +vt 0.125064 0.479358 +vt 0.125000 0.458588 +vt 0.124936 0.437819 +vt 0.124873 0.417049 +vt 0.124809 0.396280 +vt 0.124745 0.375510 +vt 0.124681 0.354740 +vt 0.124618 0.333971 +vt 0.104294 0.479422 +vt 0.104230 0.458652 +vt 0.104167 0.437882 +vt 0.104103 0.417113 +vt 0.104039 0.396343 +vt 0.103976 0.375574 +vt 0.103912 0.354804 +vt 0.103848 0.334034 +vt 0.083525 0.479485 +vt 0.083461 0.458716 +vt 0.083397 0.437946 +vt 0.083333 0.417177 +vt 0.083270 0.396407 +vt 0.083206 0.375637 +vt 0.083142 0.354868 +vt 0.083078 0.334098 +vt 0.062755 0.479549 +vt 0.062691 0.458780 +vt 0.062627 0.438010 +vt 0.062564 0.417240 +vt 0.062500 0.396471 +vt 0.062436 0.375701 +vt 0.062373 0.354931 +vt 0.062309 0.334162 +vt 0.041985 0.479613 +vt 0.041922 0.458843 +vt 0.041858 0.438074 +vt 0.041794 0.417304 +vt 0.041730 0.396534 +vt 0.041667 0.375765 +vt 0.041603 0.354995 +vt 0.041539 0.334226 +vt 0.021216 0.479677 +vt 0.021152 0.458907 +vt 0.021088 0.438137 +vt 0.021025 0.417368 +vt 0.020961 0.396598 +vt 0.020897 0.375829 +vt 0.020833 0.355059 +vt 0.020770 0.334289 +vt 0.000446 0.479740 +vt 0.000382 0.458971 +vt 0.000319 0.438201 +vt 0.000255 0.417431 +vt 0.000191 0.396662 +vt 0.000127 0.375892 +vt 0.000064 0.355123 +vt 0.000000 0.334353 +vt 0.166667 0.166667 +vt 0.166603 0.145897 +vt 0.187373 0.145833 +vt 0.187436 0.166603 +vt 0.208142 0.145770 +vt 0.208206 0.166539 +vt 0.228912 0.145706 +vt 0.228976 0.166476 +vt 0.249682 0.145642 +vt 0.249745 0.166412 +vt 0.270451 0.145579 +vt 0.270515 0.166348 +vt 0.291221 0.145515 +vt 0.291284 0.166284 +vt 0.311990 0.145451 +vt 0.312054 0.166221 +vt 0.332760 0.145387 +vt 0.332824 0.166157 +vt 0.166539 0.125128 +vt 0.187309 0.125064 +vt 0.208079 0.125000 +vt 0.228848 0.124936 +vt 0.249618 0.124873 +vt 0.270387 0.124809 +vt 0.291157 0.124745 +vt 0.311927 0.124681 +vt 0.332696 0.124618 +vt 0.166476 0.104358 +vt 0.187245 0.104294 +vt 0.208015 0.104230 +vt 0.228784 0.104167 +vt 0.249554 0.104103 +vt 0.270324 0.104039 +vt 0.291093 0.103976 +vt 0.311863 0.103912 +vt 0.332633 0.103848 +vt 0.166412 0.083588 +vt 0.187181 0.083525 +vt 0.207951 0.083461 +vt 0.228721 0.083397 +vt 0.249490 0.083333 +vt 0.270260 0.083270 +vt 0.291030 0.083206 +vt 0.311799 0.083142 +vt 0.332569 0.083078 +vt 0.166348 0.062819 +vt 0.187118 0.062755 +vt 0.207887 0.062691 +vt 0.228657 0.062627 +vt 0.249427 0.062564 +vt 0.270196 0.062500 +vt 0.290966 0.062436 +vt 0.311735 0.062373 +vt 0.332505 0.062309 +vt 0.166284 0.042049 +vt 0.187054 0.041985 +vt 0.207824 0.041922 +vt 0.228593 0.041858 +vt 0.249363 0.041794 +vt 0.270133 0.041730 +vt 0.290902 0.041667 +vt 0.311672 0.041603 +vt 0.332441 0.041539 +vt 0.166221 0.021279 +vt 0.186990 0.021216 +vt 0.207760 0.021152 +vt 0.228530 0.021088 +vt 0.249299 0.021025 +vt 0.270069 0.020961 +vt 0.290838 0.020897 +vt 0.311608 0.020833 +vt 0.332378 0.020770 +vt 0.166157 0.000510 +vt 0.186927 0.000446 +vt 0.207696 0.000382 +vt 0.228466 0.000319 +vt 0.249235 0.000255 +vt 0.270005 0.000191 +vt 0.290775 0.000127 +vt 0.311544 0.000064 +vt 0.332314 0.000000 +vt 0.187500 0.187373 +vt 0.166730 0.187436 +vt 0.187564 0.208142 +vt 0.166794 0.208206 +vt 0.187628 0.228912 +vt 0.166858 0.228976 +vt 0.187691 0.249681 +vt 0.166922 0.249745 +vt 0.187755 0.270451 +vt 0.166985 0.270515 +vt 0.187819 0.291221 +vt 0.167049 0.291284 +vt 0.187882 0.311990 +vt 0.167113 0.312054 +vt 0.187946 0.332760 +vt 0.167176 0.332824 +vt 0.208270 0.187309 +vt 0.208333 0.208079 +vt 0.208397 0.228848 +vt 0.208461 0.249618 +vt 0.208525 0.270387 +vt 0.208588 0.291157 +vt 0.208652 0.311927 +vt 0.208716 0.332696 +vt 0.229039 0.187245 +vt 0.229103 0.208015 +vt 0.229167 0.228784 +vt 0.229230 0.249554 +vt 0.229294 0.270324 +vt 0.229358 0.291093 +vt 0.229422 0.311863 +vt 0.229485 0.332633 +vt 0.249809 0.187181 +vt 0.249873 0.207951 +vt 0.249936 0.228721 +vt 0.250000 0.249490 +vt 0.250064 0.270260 +vt 0.250127 0.291030 +vt 0.250191 0.311799 +vt 0.250255 0.332569 +vt 0.270579 0.187118 +vt 0.270642 0.207887 +vt 0.270706 0.228657 +vt 0.270770 0.249427 +vt 0.270833 0.270196 +vt 0.270897 0.290966 +vt 0.270961 0.311735 +vt 0.271025 0.332505 +vt 0.291348 0.187054 +vt 0.291412 0.207824 +vt 0.291476 0.228593 +vt 0.291539 0.249363 +vt 0.291603 0.270133 +vt 0.291667 0.290902 +vt 0.291730 0.311672 +vt 0.291794 0.332441 +vt 0.312118 0.186990 +vt 0.312182 0.207760 +vt 0.312245 0.228530 +vt 0.312309 0.249299 +vt 0.312373 0.270069 +vt 0.312436 0.290838 +vt 0.312500 0.311608 +vt 0.312564 0.332378 +vt 0.332887 0.186927 +vt 0.332951 0.207696 +vt 0.333015 0.228466 +vt 0.333079 0.249235 +vt 0.333142 0.270005 +vt 0.333206 0.290775 +vt 0.333270 0.311544 +vt 0.333333 0.332314 +vt 0.145961 0.187500 +vt 0.145897 0.166730 +vt 0.125191 0.187564 +vt 0.125127 0.166794 +vt 0.104422 0.187628 +vt 0.104358 0.166858 +vt 0.083652 0.187691 +vt 0.083588 0.166922 +vt 0.062882 0.187755 +vt 0.062819 0.166985 +vt 0.042113 0.187819 +vt 0.042049 0.167049 +vt 0.021343 0.187882 +vt 0.021279 0.167113 +vt 0.000574 0.187946 +vt 0.000510 0.167177 +vt 0.146025 0.208270 +vt 0.125255 0.208333 +vt 0.104485 0.208397 +vt 0.083716 0.208461 +vt 0.062946 0.208525 +vt 0.042176 0.208588 +vt 0.021407 0.208652 +vt 0.000637 0.208716 +vt 0.146088 0.229039 +vt 0.125319 0.229103 +vt 0.104549 0.229167 +vt 0.083779 0.229230 +vt 0.063010 0.229294 +vt 0.042240 0.229358 +vt 0.021471 0.229422 +vt 0.000701 0.229485 +vt 0.146152 0.249809 +vt 0.125382 0.249873 +vt 0.104613 0.249936 +vt 0.083843 0.250000 +vt 0.063074 0.250064 +vt 0.042304 0.250128 +vt 0.021534 0.250191 +vt 0.000765 0.250255 +vt 0.146216 0.270579 +vt 0.125446 0.270642 +vt 0.104676 0.270706 +vt 0.083907 0.270770 +vt 0.063137 0.270833 +vt 0.042368 0.270897 +vt 0.021598 0.270961 +vt 0.000828 0.271025 +vt 0.146279 0.291348 +vt 0.125510 0.291412 +vt 0.104740 0.291476 +vt 0.083971 0.291539 +vt 0.063201 0.291603 +vt 0.042431 0.291667 +vt 0.021662 0.291731 +vt 0.000892 0.291794 +vt 0.146343 0.312118 +vt 0.125574 0.312182 +vt 0.104804 0.312245 +vt 0.084034 0.312309 +vt 0.063265 0.312373 +vt 0.042495 0.312436 +vt 0.021725 0.312500 +vt 0.000956 0.312564 +vt 0.146407 0.332887 +vt 0.125637 0.332951 +vt 0.104868 0.333015 +vt 0.084098 0.333079 +vt 0.063328 0.333142 +vt 0.042559 0.333206 +vt 0.021789 0.333270 +vt 0.001020 0.333333 +vt 0.145833 0.145961 +vt 0.145770 0.125191 +vt 0.145706 0.104422 +vt 0.145642 0.083652 +vt 0.145579 0.062882 +vt 0.145515 0.042113 +vt 0.145451 0.021343 +vt 0.145387 0.000574 +vt 0.125064 0.146025 +vt 0.125000 0.125255 +vt 0.124936 0.104485 +vt 0.124873 0.083716 +vt 0.124809 0.062946 +vt 0.124745 0.042176 +vt 0.124681 0.021407 +vt 0.124618 0.000637 +vt 0.104294 0.146088 +vt 0.104230 0.125319 +vt 0.104167 0.104549 +vt 0.104103 0.083779 +vt 0.104039 0.063010 +vt 0.103976 0.042240 +vt 0.103912 0.021471 +vt 0.103848 0.000701 +vt 0.083525 0.146152 +vt 0.083461 0.125382 +vt 0.083397 0.104613 +vt 0.083333 0.083843 +vt 0.083270 0.063074 +vt 0.083206 0.042304 +vt 0.083142 0.021534 +vt 0.083078 0.000765 +vt 0.062755 0.146216 +vt 0.062691 0.125446 +vt 0.062627 0.104677 +vt 0.062564 0.083907 +vt 0.062500 0.063137 +vt 0.062436 0.042368 +vt 0.062373 0.021598 +vt 0.062309 0.000828 +vt 0.041985 0.146279 +vt 0.041922 0.125510 +vt 0.041858 0.104740 +vt 0.041794 0.083971 +vt 0.041730 0.063201 +vt 0.041667 0.042431 +vt 0.041603 0.021662 +vt 0.041539 0.000892 +vt 0.021216 0.146343 +vt 0.021152 0.125574 +vt 0.021088 0.104804 +vt 0.021025 0.084034 +vt 0.020961 0.063265 +vt 0.020897 0.042495 +vt 0.020833 0.021725 +vt 0.020770 0.000956 +vt 0.000446 0.146407 +vt 0.000382 0.125637 +vt 0.000319 0.104868 +vt 0.000255 0.084098 +vt 0.000191 0.063328 +vt 0.000127 0.042559 +vt 0.000064 0.021789 +vt 0.000000 0.001020 +vn -0.215857 -0.976348 -0.011200 +vn -0.175665 -0.977111 -0.119846 +vn -0.053224 -0.976470 -0.208930 +vn -0.046419 -0.997742 0.048402 +vn 0.113376 -0.982147 -0.150060 +vn 0.188025 -0.979675 0.069552 +vn 0.078524 -0.996887 0.001404 +vn 0.175787 -0.979736 0.095737 +vn -0.104404 -0.988861 0.105838 +vn -0.029878 -0.984741 0.171300 +vn 0.017060 -0.999237 0.034791 +vn -0.083926 -0.966247 0.243507 +vn 0.467910 -0.865200 -0.180181 +vn 0.277840 -0.954344 0.109653 +vn 0.604114 -0.756340 -0.250923 +vn 0.549730 -0.825190 -0.129765 +vn 0.661763 -0.707785 -0.247078 +vn 0.666768 -0.711539 -0.221595 +vn 0.092898 -0.967223 -0.236183 +vn -0.016114 -0.899991 -0.435560 +vn -0.077242 -0.934385 -0.347697 +vn -0.097720 -0.986511 -0.131169 +vn -0.151280 -0.987884 -0.034242 +vn 0.228309 -0.955412 -0.187109 +vn 0.531724 -0.801080 -0.274789 +vn 0.566607 -0.787347 -0.242836 +vn 0.701773 -0.662770 -0.261208 +vn 0.341227 -0.924558 -0.169530 +vn 0.062258 -0.954924 -0.290170 +vn -0.198950 -0.924619 -0.324747 +vn -0.158330 -0.911191 -0.380261 +vn -0.086398 -0.866421 -0.491745 +vn 0.218390 -0.812342 -0.540696 +vn 0.440199 -0.772362 -0.457839 +vn 0.541124 -0.719443 -0.435316 +vn 0.681997 -0.521439 -0.512803 +vn 0.380230 -0.924039 -0.039247 +vn 0.120365 -0.991577 -0.047121 +vn -0.083773 -0.979858 -0.181249 +vn 0.051088 -0.889401 -0.454207 +vn 0.089572 -0.733177 -0.674062 +vn 0.057711 -0.692648 -0.718925 +vn 0.275979 -0.706534 -0.651601 +vn 0.527146 -0.576189 -0.624592 +vn 0.654256 -0.384625 -0.651112 +vn 0.307657 -0.929228 -0.204627 +vn 0.193396 -0.968291 -0.158055 +vn 0.139592 -0.946287 -0.291543 +vn 0.346294 -0.809442 -0.474197 +vn 0.330515 -0.635884 -0.697378 +vn 0.030000 -0.593158 -0.804498 +vn 0.086825 -0.628590 -0.772851 +vn 0.463301 -0.533036 -0.707938 +vn 0.695273 -0.331584 -0.637654 +vn 0.129765 -0.727256 -0.673940 +vn 0.205054 -0.806299 -0.554796 +vn 0.275246 -0.789117 -0.549058 +vn 0.511093 -0.631733 -0.582781 +vn 0.538316 -0.503250 -0.675924 +vn 0.185492 -0.508835 -0.840602 +vn -0.092837 -0.529954 -0.842891 +vn 0.272408 -0.506516 -0.818049 +vn 0.647267 -0.251045 -0.719687 +vn -0.033815 -0.516923 -0.855342 +vn 0.128086 -0.562120 -0.817042 +vn 0.290292 -0.575610 -0.764428 +vn 0.515397 -0.541642 -0.664052 +vn 0.589007 -0.597858 -0.543687 +vn 0.359905 -0.727775 -0.583728 +vn -0.002075 -0.720389 -0.693533 +vn 0.102512 -0.543596 -0.833033 +vn 0.569353 -0.145085 -0.809168 +vn -0.101413 -0.625782 -0.773370 +vn 0.150700 -0.604511 -0.782189 +vn 0.286019 -0.530198 -0.798151 +vn 0.366466 -0.576159 -0.730552 +vn 0.411969 -0.728751 -0.546953 +vn 0.333506 -0.857570 -0.391522 +vn 0.189764 -0.871822 -0.451491 +vn 0.328196 -0.632435 -0.701590 +vn 0.665151 -0.155583 -0.730308 +vn -0.046968 -0.943327 0.328440 +vn -0.127293 -0.947600 0.292947 +vn -0.061525 -0.933561 0.353038 +vn -0.108158 -0.918455 0.380413 +vn -0.084353 -0.950102 0.300272 +vn -0.231483 -0.889981 0.392804 +vn -0.125919 -0.929533 0.346538 +vn -0.399121 -0.819086 0.412030 +vn -0.132572 -0.984680 0.113010 +vn -0.456587 -0.884854 0.092135 +vn -0.074801 -0.915250 0.395856 +vn -0.397565 -0.876339 0.271889 +vn -0.057680 -0.555498 0.829493 +vn -0.247810 -0.614277 0.749138 +vn -0.168981 -0.610920 0.773431 +vn -0.071322 -0.584155 0.808466 +vn 0.111393 -0.964538 0.239265 +vn -0.021332 -0.943327 0.331156 +vn -0.003571 -0.942320 0.334605 +vn 0.100009 -0.922880 0.371807 +vn 0.176214 -0.970489 0.164586 +vn 0.225776 -0.873623 0.430982 +vn 0.117038 -0.635792 0.762902 +vn -0.060366 -0.730430 0.680288 +vn 0.135533 -0.985931 0.097476 +vn -0.044496 -0.983947 0.172765 +vn -0.154302 -0.914518 0.373882 +vn -0.047182 -0.870998 0.488998 +vn 0.138859 -0.946471 0.291299 +vn 0.222571 -0.900204 0.374248 +vn 0.080630 -0.787713 0.610706 +vn -0.017670 -0.769463 0.638417 +vn 0.054170 -0.996155 0.068667 +vn 0.020478 -0.999359 -0.028321 +vn -0.092593 -0.944639 0.314676 +vn -0.161229 -0.801141 0.576281 +vn -0.060732 -0.901303 0.428846 +vn 0.009552 -0.929685 0.368206 +vn 0.001770 -0.871670 0.490036 +vn -0.029664 -0.759636 0.649648 +vn 0.010468 -0.987548 0.156957 +vn 0.107120 -0.992462 -0.059114 +vn 0.099185 -0.966155 0.238075 +vn -0.028626 -0.820215 0.571306 +vn -0.068636 -0.848628 0.524491 +vn 0.039003 -0.882962 0.467757 +vn 0.137455 -0.863521 0.485183 +vn 0.113681 -0.799554 0.589709 +vn 0.035707 -0.982299 0.183752 +vn 0.036805 -0.998627 0.036744 +vn 0.066439 -0.978973 0.192785 +vn 0.004608 -0.871029 0.491134 +vn 0.001953 -0.808924 0.587878 +vn 0.077761 -0.814692 0.574633 +vn 0.187567 -0.805567 0.561998 +vn 0.288705 -0.804590 0.518876 +vn 0.355205 -0.934599 -0.018097 +vn 0.201910 -0.977966 0.052583 +vn 0.181707 -0.951323 0.248848 +vn 0.195624 -0.820368 0.537278 +vn 0.183233 -0.663594 0.725272 +vn 0.301828 -0.623218 0.721427 +vn 0.447249 -0.578967 0.681692 +vn 0.618976 -0.617542 0.485214 +vn 0.669607 -0.723624 -0.167241 +vn 0.630024 -0.776330 -0.018555 +vn 0.532670 -0.799921 0.276284 +vn 0.378704 -0.726035 0.573962 +vn 0.280740 -0.526658 0.802332 +vn 0.411939 -0.428419 0.804193 +vn 0.575365 -0.398206 0.714408 +vn 0.731162 -0.419080 0.538255 +vn -0.211219 -0.952666 0.218604 +vn -0.248573 -0.966460 -0.064241 +vn -0.253853 -0.948149 0.191046 +vn -0.238716 -0.969115 -0.061647 +vn -0.225929 -0.947478 0.226264 +vn -0.188452 -0.981079 -0.043611 +vn -0.269814 -0.910184 0.314219 +vn -0.181158 -0.983367 -0.011811 +vn -0.418775 -0.823237 0.383221 +vn -0.390088 -0.916807 0.085238 +vn -0.605121 -0.702597 0.374371 +vn -0.555162 -0.788110 0.265786 +vn -0.666707 -0.618000 0.416547 +vn -0.597369 -0.706381 0.379681 +vn -0.539476 -0.658040 0.525285 +vn -0.702139 -0.663137 0.259224 +vn -0.226600 -0.855220 0.466079 +vn -0.269997 -0.791620 0.548082 +vn -0.264840 -0.747246 0.609485 +vn -0.315744 -0.673544 0.668294 +vn -0.267708 -0.730186 0.628590 +vn -0.473464 -0.737419 0.481674 +vn -0.716025 -0.626118 0.308603 +vn -0.683859 -0.672231 0.283547 +vn -0.335459 -0.780694 0.527177 +vn -0.306772 -0.755791 0.578448 +vn -0.326395 -0.748375 0.577349 +vn -0.359935 -0.736229 0.573046 +vn -0.160741 -0.826197 0.539933 +vn -0.309519 -0.820765 0.480087 +vn -0.566088 -0.761284 0.316111 +vn -0.667562 -0.741386 0.068331 +vn -0.398083 -0.786309 0.472457 +vn -0.264718 -0.856014 0.443983 +vn -0.354930 -0.843013 0.404096 +vn -0.395001 -0.819697 0.414747 +vn -0.135533 -0.890835 0.433607 +vn -0.259713 -0.850948 0.456496 +vn -0.357585 -0.863277 0.356120 +vn -0.465926 -0.876522 0.120670 +vn -0.465865 -0.862819 0.196112 +vn -0.268838 -0.897275 0.350108 +vn -0.343394 -0.855190 0.388195 +vn -0.361858 -0.875607 0.319895 +vn -0.162297 -0.944884 0.284219 +vn -0.286325 -0.888943 0.357433 +vn -0.235817 -0.898007 0.371410 +vn -0.239387 -0.942503 0.233161 +vn -0.590411 -0.787500 0.176763 +vn -0.383770 -0.861476 0.332469 +vn -0.269753 -0.889889 0.367840 +vn -0.233467 -0.943480 0.235115 +vn -0.196997 -0.965667 0.169225 +vn -0.389477 -0.897824 0.205329 +vn -0.288980 -0.901852 0.321116 +vn -0.083804 -0.915311 0.393872 +vn -0.463057 -0.774560 0.430769 +vn -0.425520 -0.880551 0.208594 +vn -0.271310 -0.926145 0.261910 +vn -0.162420 -0.926420 0.339579 +vn -0.213294 -0.913541 0.346263 +vn -0.419141 -0.867550 0.267617 +vn -0.392285 -0.880001 0.267647 +vn -0.193915 -0.927366 0.319926 +vn -0.073000 -0.726127 0.683645 +vn -0.285501 -0.869076 0.403912 +vn -0.393048 -0.886837 0.242866 +vn -0.234779 -0.893399 0.383007 +vn -0.225623 -0.856563 0.464064 +vn -0.382763 -0.817377 0.430525 +vn -0.344005 -0.871670 0.349010 +vn -0.245277 -0.939756 0.238014 +vn -0.233009 -0.972442 -0.006439 +vn -0.126041 -0.991821 0.019807 +vn 0.005737 -0.999237 -0.037965 +vn 0.054872 -0.996307 -0.065798 +vn -0.014435 -0.929777 -0.367809 +vn -0.119510 -0.601642 -0.789758 +vn -0.215094 -0.442000 -0.870815 +vn -0.318705 -0.528520 -0.786798 +vn -0.213813 -0.976348 0.031800 +vn -0.208319 -0.974548 0.082736 +vn -0.296335 -0.954405 -0.035371 +vn -0.391858 -0.915342 -0.092593 +vn -0.426221 -0.820978 -0.379864 +vn -0.340403 -0.543260 -0.767418 +vn -0.239570 -0.423078 -0.873806 +vn -0.223701 -0.499100 -0.837153 +vn -0.106784 -0.988311 0.108615 +vn -0.012055 -0.996979 0.076357 +vn -0.080233 -0.981048 -0.176214 +vn -0.196692 -0.965331 -0.171484 +vn -0.263955 -0.876797 -0.401868 +vn -0.229591 -0.643727 -0.729972 +vn -0.131108 -0.504471 -0.853389 +vn -0.063631 -0.524338 -0.849117 +vn -0.181677 -0.968963 0.167577 +vn -0.229011 -0.970885 0.070101 +vn -0.129917 -0.975799 -0.175817 +vn -0.040773 -0.979064 -0.199316 +vn -0.111423 -0.853816 -0.508469 +vn -0.219459 -0.629749 -0.745109 +vn -0.239448 -0.555193 -0.796472 +vn -0.160039 -0.543290 -0.824122 +vn -0.398511 -0.914670 0.067202 +vn -0.529252 -0.847255 0.044832 +vn -0.507157 -0.861812 -0.004822 +vn -0.435011 -0.877743 -0.200659 +vn -0.444899 -0.659230 -0.606159 +vn -0.477065 -0.469008 -0.743217 +vn -0.446089 -0.566149 -0.693106 +vn -0.298349 -0.608966 -0.734916 +vn -0.483261 -0.875179 -0.021821 +vn -0.564623 -0.816401 -0.121067 +vn -0.683859 -0.728965 0.030244 +vn -0.765282 -0.608570 -0.209540 +vn -0.709738 -0.368816 -0.600146 +vn -0.662069 -0.418958 -0.621357 +vn -0.561174 -0.615131 -0.553758 +vn -0.439772 -0.662465 -0.606403 +vn -0.678213 -0.729026 -0.092166 +vn -0.749809 -0.598254 -0.282479 +vn -0.832057 -0.551988 -0.054384 +vn -0.849361 -0.458266 -0.261727 +vn -0.735496 -0.362774 -0.572161 +vn -0.685720 -0.562029 -0.462447 +vn -0.603870 -0.676290 -0.421796 +vn -0.493240 -0.689932 -0.529771 +vn -0.844539 -0.477096 -0.243049 +vn -0.874599 -0.329203 -0.355876 +vn -0.943663 -0.313517 -0.105777 +vn -0.916990 -0.332499 -0.220283 +vn -0.795556 -0.421033 -0.435621 +vn -0.699881 -0.654012 -0.286996 +vn -0.555315 -0.773736 -0.304758 +vn -0.399579 -0.770135 -0.497177 +vn -0.367809 0.928800 -0.044557 +vn -0.258736 0.963500 -0.068453 +vn -0.279397 0.929991 -0.238777 +vn -0.215552 0.967040 -0.135411 +vn -0.217078 0.913419 -0.344218 +vn -0.023774 0.974578 -0.222663 +vn -0.062441 0.961791 -0.266488 +vn 0.061373 0.983337 -0.170965 +vn -0.011078 0.963164 -0.268593 +vn 0.035005 0.939787 -0.339885 +vn -0.182867 0.900845 -0.393689 +vn -0.096377 0.798059 -0.594775 +vn -0.324320 0.734031 -0.596606 +vn -0.303415 0.609607 -0.732292 +vn -0.311655 0.403760 -0.860134 +vn -0.385693 0.380779 -0.840358 +vn -0.246529 0.160497 -0.955718 +vn -0.345073 0.179968 -0.921140 +vn -0.074801 0.993255 0.088473 +vn -0.215796 0.951109 -0.220893 +vn -0.228431 0.888028 -0.398968 +vn -0.134953 0.881100 -0.453230 +vn -0.020936 0.967864 -0.250557 +vn -0.012543 0.963134 -0.268624 +vn 0.042268 0.745994 -0.664571 +vn 0.150731 0.348949 -0.924924 +vn 0.232368 0.070254 -0.970061 +vn 0.147496 0.947264 0.284402 +vn 0.018891 0.989074 -0.146184 +vn -0.027619 0.894375 -0.446394 +vn -0.006897 0.829829 -0.557939 +vn 0.084170 0.936338 -0.340800 +vn 0.248177 0.914518 -0.319376 +vn 0.314371 0.633961 -0.706565 +vn 0.271310 0.230079 -0.934568 +vn 0.284646 -0.003143 -0.958617 +vn 0.386578 0.851131 0.355083 +vn 0.394299 0.915983 -0.073946 +vn 0.307840 0.843684 -0.439772 +vn 0.215918 0.802149 -0.556658 +vn 0.258400 0.831935 -0.490982 +vn 0.456771 0.755699 -0.469283 +vn 0.500320 0.572893 -0.649159 +vn 0.330546 0.295114 -0.896420 +vn 0.140751 0.002991 -0.990020 +vn 0.559771 0.762474 0.324412 +vn 0.588244 0.808649 0.001404 +vn 0.485031 0.805628 -0.340098 +vn 0.373333 0.779870 -0.502365 +vn 0.363750 0.727165 -0.582110 +vn 0.468734 0.602374 -0.646046 +vn 0.603473 0.498062 -0.622669 +vn 0.565935 0.258370 -0.782891 +vn 0.363201 0.037599 -0.930937 +vn 0.615772 0.729942 0.296579 +vn 0.612995 0.785913 0.080660 +vn 0.539232 0.809229 -0.233131 +vn 0.456771 0.751396 -0.476150 +vn 0.429365 0.648793 -0.628224 +vn 0.430097 0.512284 -0.743339 +vn 0.538041 0.390088 -0.747185 +vn 0.606311 0.221198 -0.763787 +vn 0.510361 0.132237 -0.849727 +vn 0.633168 0.714011 0.298715 +vn 0.658711 0.743065 0.117832 +vn 0.633106 0.760002 -0.146672 +vn 0.533250 0.718680 -0.446181 +vn 0.458357 0.578478 -0.674703 +vn 0.452864 0.423902 -0.784326 +vn 0.472701 0.251808 -0.844447 +vn 0.569933 0.187536 -0.799982 +vn 0.612842 0.147771 -0.776238 +vn 0.690909 0.655324 0.305155 +vn 0.746696 0.660146 0.081393 +vn 0.774316 0.621387 -0.119449 +vn 0.705008 0.602863 -0.373486 +vn 0.517411 0.482315 -0.706839 +vn 0.438795 0.283273 -0.852748 +vn 0.473434 0.085269 -0.876675 +vn 0.601672 0.039521 -0.797723 +vn 0.731193 0.016236 -0.681936 +vn -0.177801 0.983917 0.016327 +vn -0.294320 0.948943 0.113437 +vn -0.391247 0.920042 -0.019929 +vn -0.238807 0.962310 0.130039 +vn -0.671255 0.723289 -0.161901 +vn -0.480667 0.866665 -0.133427 +vn -0.589129 0.760491 -0.272988 +vn -0.478469 0.788018 -0.387341 +vn -0.189123 0.933866 -0.303385 +vn -0.173101 0.876309 -0.449507 +vn 0.035096 0.952757 -0.301675 +vn 0.023499 0.924589 -0.380169 +vn -0.013825 0.915616 -0.401776 +vn 0.014924 0.939451 -0.342326 +vn -0.236274 0.819758 -0.521653 +vn -0.272378 0.881161 -0.386425 +vn -0.148412 0.975005 -0.165258 +vn -0.520341 0.827021 -0.212622 +vn -0.691458 0.692099 -0.206915 +vn -0.614978 0.769555 -0.171880 +vn -0.252449 0.941984 -0.221137 +vn -0.021973 0.939299 -0.342296 +vn -0.107913 0.889523 -0.443892 +vn -0.239357 0.814142 -0.528977 +vn -0.191504 0.962737 -0.190832 +vn -0.566454 0.798151 -0.204962 +vn -0.666555 0.719810 -0.193701 +vn -0.618305 0.763634 -0.185736 +vn -0.410291 0.854396 -0.318796 +vn -0.138859 0.867397 -0.477798 +vn -0.102664 0.857814 -0.503555 +vn -0.237892 0.861934 -0.447676 +vn -0.183630 0.924863 -0.332926 +vn -0.571429 0.781884 -0.249062 +vn -0.634236 0.741600 -0.218482 +vn -0.612629 0.764092 -0.202002 +vn -0.563768 0.786279 -0.252724 +vn -0.309061 0.865261 -0.394665 +vn -0.117466 0.854030 -0.506729 +vn -0.129582 0.823695 -0.551988 +vn -0.135044 0.753075 -0.643880 +vn -0.496506 0.682394 -0.536454 +vn -0.636036 0.637318 -0.435011 +vn -0.567888 0.715232 -0.407331 +vn -0.531663 0.806787 -0.257668 +vn -0.423627 0.890927 -0.163549 +vn -0.305338 0.912992 -0.270516 +vn -0.245766 0.842006 -0.480178 +vn -0.170019 0.487960 -0.856136 +vn -0.365368 0.422559 -0.829402 +vn -0.484146 0.494461 -0.721854 +vn -0.419141 0.684103 -0.596881 +vn -0.339183 0.816645 -0.466903 +vn -0.374401 0.867855 -0.326518 +vn -0.460036 0.834315 -0.303720 +vn -0.464858 0.745079 -0.478256 +vn -0.232643 0.386181 -0.892575 +vn -0.255409 0.437788 -0.861995 +vn -0.292367 0.566027 -0.770775 +vn -0.297983 0.670003 -0.679891 +vn -0.245308 0.716697 -0.652760 +vn -0.265358 0.714805 -0.646992 +vn -0.451735 0.647206 -0.614002 +vn -0.551805 0.586871 -0.592456 +vn -0.171148 0.242378 -0.954955 +vn -0.027314 0.438337 -0.898373 +vn -0.144963 0.619037 -0.771844 +vn -0.295755 0.614887 -0.731010 +vn -0.221961 0.599322 -0.769097 +vn -0.280282 0.570055 -0.772301 +vn -0.379559 0.510483 -0.771538 +vn -0.512162 0.533341 -0.673177 +vn -0.364177 0.927335 0.085940 +vn -0.376995 0.912961 0.156041 +vn -0.264504 0.913114 0.310190 +vn -0.270974 0.852046 0.447829 +vn -0.089511 0.911039 0.402448 +vn -0.157262 0.841853 0.516221 +vn 0.088870 0.803156 0.589068 +vn -0.122227 0.748863 0.651326 +vn 0.119938 0.644704 0.754936 +vn -0.219153 0.705344 0.674093 +vn 0.018555 0.727317 0.686026 +vn -0.352733 0.749870 0.559679 +vn -0.111179 0.834132 0.540208 +vn -0.358715 0.800012 0.480911 +vn -0.163671 0.786248 0.595782 +vn -0.212897 0.663259 0.717429 +vn -0.131169 0.991028 0.024934 +vn -0.040864 0.984344 0.171270 +vn 0.067232 0.960509 0.269997 +vn 0.162084 0.883908 0.438612 +vn 0.212500 0.628193 0.748436 +vn 0.159703 0.604144 0.780663 +vn -0.035493 0.718070 0.695029 +vn -0.231330 0.744499 0.626209 +vn -0.157445 0.973907 -0.163396 +vn 0.046541 0.997803 0.046968 +vn 0.081973 0.964232 0.251991 +vn 0.023865 0.900723 0.433668 +vn 0.056032 0.692679 0.719016 +vn 0.125675 0.549333 0.826075 +vn 0.045961 0.561357 0.826258 +vn -0.157384 0.624287 0.765130 +vn -0.307047 0.869411 -0.387036 +vn -0.151494 0.983154 -0.102023 +vn -0.067904 0.950499 0.303110 +vn -0.102847 0.852657 0.512223 +vn -0.075900 0.754479 0.651906 +vn 0.108158 0.640248 0.760460 +vn 0.244850 0.512772 0.822840 +vn 0.153233 0.510819 0.845912 +vn -0.192267 0.870296 -0.453413 +vn -0.208747 0.960784 -0.182379 +vn -0.189123 0.936674 0.294717 +vn -0.176519 0.791253 0.585437 +vn -0.225349 0.749626 0.622272 +vn -0.165502 0.738792 0.653249 +vn -0.032411 0.593646 0.804041 +vn 0.146886 0.507797 0.848842 +vn -0.050722 0.924284 -0.378277 +vn -0.187445 0.979125 -0.078188 +vn -0.249184 0.925321 0.285745 +vn -0.198889 0.773339 0.601978 +vn -0.223365 0.716575 0.660726 +vn -0.302591 0.746879 0.592090 +vn -0.281564 0.592639 0.754631 +vn -0.177740 0.602161 0.778314 +vn -0.045900 0.961486 -0.270882 +vn -0.130436 0.987091 0.092807 +vn -0.252266 0.891873 0.375347 +vn -0.267281 0.753258 0.600940 +vn -0.199591 0.707663 0.677755 +vn -0.222816 0.739097 0.635639 +vn -0.252327 0.582812 0.772423 +vn -0.298013 0.645344 0.703330 +vn -0.358409 0.911710 -0.200690 +vn -0.386059 0.896847 0.215766 +vn -0.302377 0.809442 0.503311 +vn -0.266396 0.774590 0.573565 +vn -0.176885 0.780145 0.600024 +vn -0.110691 0.698874 0.706595 +vn -0.184362 0.531999 0.826411 +vn -0.356822 0.587573 0.726218 +vn -0.138646 0.948149 0.285867 +vn 0.096408 0.892087 0.441420 +vn 0.206091 0.840541 0.500961 +vn 0.355937 0.794855 0.491409 +vn 0.479934 0.743614 0.465468 +vn 0.530473 0.768090 0.358592 +vn 0.661061 0.686331 0.303140 +vn 0.707419 0.589709 0.389569 +vn -0.024262 0.835719 0.548601 +vn 0.142216 0.833003 0.534623 +vn 0.154485 0.859218 0.487716 +vn 0.391156 0.777367 0.492569 +vn 0.440168 0.720115 0.536332 +vn 0.387005 0.780541 0.490860 +vn 0.646321 0.615680 0.450697 +vn 0.728568 0.504685 0.463057 +vn 0.006439 0.824488 0.565813 +vn 0.067293 0.842067 0.535112 +vn 0.122868 0.859432 0.496231 +vn 0.442366 0.747185 0.495956 +vn 0.487747 0.703604 0.516709 +vn 0.304300 0.779443 0.547563 +vn 0.566942 0.685293 0.457076 +vn 0.783227 0.535295 0.316202 +vn -0.068361 0.807886 0.585345 +vn -0.011505 0.870540 0.491897 +vn 0.131443 0.864162 0.485733 +vn 0.429273 0.771050 0.470260 +vn 0.554003 0.703299 0.445418 +vn 0.334849 0.808374 0.484146 +vn 0.411054 0.789453 0.455794 +vn 0.753777 0.544725 0.367534 +vn -0.246651 0.805750 0.538438 +vn -0.088168 0.899045 0.428816 +vn 0.213782 0.867244 0.449568 +vn 0.434370 0.736839 0.517991 +vn 0.513443 0.709677 0.482376 +vn 0.386029 0.807001 0.446883 +vn 0.377483 0.738609 0.558458 +vn 0.635487 0.470779 0.611927 +vn -0.365673 0.801782 0.472640 +vn -0.173620 0.881008 0.440016 +vn 0.278359 0.870876 0.405011 +vn 0.549242 0.702963 0.451796 +vn 0.419782 0.731132 0.537767 +vn 0.355571 0.808344 0.469131 +vn 0.542100 0.672079 0.504379 +vn 0.659810 0.426588 0.618580 +vn -0.374157 0.755120 0.538285 +vn -0.231758 0.790643 0.566668 +vn 0.242347 0.817103 0.523026 +vn 0.675314 0.625355 0.390912 +vn 0.463515 0.665700 0.584765 +vn 0.276742 0.667806 0.690939 +vn 0.587512 0.483261 0.649037 +vn 0.705283 0.281991 0.650410 +vn -0.326914 0.514267 0.792840 +vn -0.279061 0.526566 0.803003 +vn 0.181799 0.572802 0.799249 +vn 0.672994 0.450179 0.586810 +vn 0.589923 0.489731 0.641926 +vn 0.353832 0.442946 0.823756 +vn 0.543138 0.237098 0.805444 +vn 0.708701 0.155431 0.688131 +vn 0.976928 0.173009 -0.125034 +vn 0.965117 0.150945 -0.213813 +vn 0.982482 0.026215 -0.184393 +vn 0.968902 0.193091 -0.154607 +vn 0.975707 0.015900 -0.218360 +vn 0.943876 0.208777 -0.255898 +vn 0.859859 0.072176 -0.505356 +vn 0.854152 0.170568 -0.491226 +vn 0.629810 0.083102 -0.772271 +vn 0.646718 0.089267 -0.757469 +vn 0.554826 0.039613 -0.830988 +vn 0.585955 0.063478 -0.807825 +vn 0.763329 -0.038148 -0.644856 +vn 0.768914 0.076083 -0.634754 +vn 0.933836 -0.061190 -0.352367 +vn 0.904996 0.133885 -0.403699 +vn 0.890011 -0.039705 -0.454176 +vn 0.885128 0.167913 -0.433912 +vn 0.927580 0.038514 -0.371563 +vn 0.944121 -0.150548 -0.293161 +vn 0.954863 -0.239875 -0.175146 +vn 0.836482 -0.233436 -0.495712 +vn 0.590228 -0.200018 -0.782037 +vn 0.534349 -0.157567 -0.830409 +vn 0.703513 -0.137608 -0.697226 +vn 0.893887 -0.204688 -0.398785 +vn 0.863887 -0.290841 -0.411206 +vn 0.899167 -0.000580 -0.437574 +vn 0.897305 -0.068117 -0.436079 +vn 0.922788 -0.251442 -0.291940 +vn 0.768731 -0.378826 -0.515244 +vn 0.505875 -0.382855 -0.772942 +vn 0.515336 -0.393780 -0.761132 +vn 0.705222 -0.321787 -0.631703 +vn 0.879208 -0.206946 -0.429060 +vn 0.884121 -0.164373 -0.437330 +vn 0.883785 -0.221503 -0.412091 +vn 0.799554 -0.205329 -0.564348 +vn 0.810511 -0.350597 -0.469192 +vn 0.696738 -0.419477 -0.581835 +vn 0.495224 -0.368816 -0.786554 +vn 0.563799 -0.388806 -0.728629 +vn 0.714866 -0.443464 -0.540574 +vn 0.881741 -0.353160 -0.312693 +vn 0.933012 -0.161473 -0.321543 +vn 0.844020 -0.445692 -0.298196 +vn 0.775994 -0.277963 -0.566149 +vn 0.847468 -0.211982 -0.486648 +vn 0.770653 -0.175298 -0.612629 +vn 0.605579 -0.143956 -0.782617 +vn 0.646748 -0.105991 -0.755272 +vn 0.768548 -0.200079 -0.607654 +vn 0.892483 -0.308481 -0.329051 +vn 0.937559 -0.309915 -0.157750 +vn 0.856044 -0.460219 -0.235267 +vn 0.852504 -0.291421 -0.433882 +vn 0.906400 -0.142827 -0.397473 +vn 0.817194 -0.039735 -0.574938 +vn 0.702597 0.034425 -0.710715 +vn 0.757653 0.106784 -0.643818 +vn 0.740715 0.152959 -0.654134 +vn 0.869533 -0.017792 -0.493484 +vn 0.929655 -0.289163 -0.228217 +vn 0.828425 -0.521561 -0.204047 +vn 0.828639 -0.471145 -0.302225 +vn 0.854610 -0.395825 -0.336009 +vn 0.783166 -0.271828 -0.559191 +vn 0.717734 -0.121128 -0.685690 +vn 0.789788 -0.029542 -0.612629 +vn 0.741539 0.047365 -0.669210 +vn 0.744774 0.061464 -0.664449 +vn 0.865810 -0.154485 -0.475906 +vn 0.979766 0.155614 -0.125614 +vn 0.972839 0.151891 -0.174535 +vn 0.996246 0.084933 -0.016327 +vn 0.966582 0.125980 -0.223121 +vn 0.996734 -0.075930 -0.026307 +vn 0.981964 -0.075991 -0.172979 +vn 0.988708 -0.080111 -0.126438 +vn 0.999725 0.009552 0.020783 +vn 0.960570 0.269173 -0.069430 +vn 0.911740 0.378582 0.159154 +vn 0.901608 0.429456 0.051027 +vn 0.867061 0.450942 0.211737 +vn 0.900571 0.430647 0.058809 +vn 0.860805 0.435408 0.263436 +vn 0.977050 0.045381 -0.208045 +vn 0.989319 0.016266 -0.144688 +vn 0.985351 0.019532 -0.169286 +vn 0.981140 -0.056185 -0.184851 +vn 0.972686 0.155156 -0.172613 +vn 0.903897 0.399426 -0.152898 +vn 0.894955 0.423780 -0.139317 +vn 0.906919 -0.060762 -0.416883 +vn 0.906156 0.050630 -0.419874 +vn 0.865993 0.083712 -0.492935 +vn 0.878109 -0.100345 -0.467757 +vn 0.921598 0.050508 -0.384808 +vn 0.895688 0.334819 -0.292581 +vn 0.858547 0.428236 -0.281930 +vn 0.673818 -0.092807 -0.733024 +vn 0.669607 0.104862 -0.735252 +vn 0.601886 0.123875 -0.788903 +vn 0.640278 -0.137913 -0.755638 +vn 0.702231 -0.112369 -0.702994 +vn 0.723533 0.186529 -0.664571 +vn 0.659413 0.373547 -0.652364 +vn 0.521134 0.030793 -0.852870 +vn 0.399091 0.144292 -0.905454 +vn 0.367199 0.142644 -0.919126 +vn 0.401868 -0.131230 -0.906217 +vn 0.426130 -0.184332 -0.885647 +vn 0.385876 0.009430 -0.922483 +vn 0.376507 0.140019 -0.915738 +vn 0.664418 0.256142 -0.702078 +vn 0.491256 0.293924 -0.819880 +vn 0.414747 0.200079 -0.887631 +vn 0.469100 -0.066286 -0.880642 +vn 0.443190 -0.198889 -0.874050 +vn 0.397137 -0.051973 -0.916257 +vn 0.422956 0.027863 -0.905698 +vn 0.826319 0.366863 -0.427290 +vn 0.758843 0.437452 -0.482437 +vn 0.794061 0.244697 -0.556352 +vn 0.826807 -0.022462 -0.562029 +vn 0.785730 -0.160283 -0.597400 +vn 0.684408 0.005799 -0.729057 +vn 0.605609 0.044374 -0.794488 +vn 0.911466 0.255654 -0.322214 +vn 0.918119 0.368175 -0.146580 +vn 0.965300 0.229286 -0.124882 +vn 0.962432 0.064272 -0.263680 +vn 0.888241 0.014801 -0.459120 +vn 0.794061 0.150609 -0.588855 +vn 0.745933 0.133549 -0.652455 +vn 0.962584 0.083590 -0.257637 +vn 0.964568 0.150945 -0.216285 +vn 0.985534 0.138585 -0.097415 +vn 0.976959 0.133946 -0.166112 +vn 0.950621 0.259621 0.169958 +vn 0.978118 0.197516 0.064852 +vn 0.896573 0.317515 0.308664 +vn 0.916959 0.280618 0.283517 +vn 0.780877 0.280801 0.557970 +vn 0.748741 0.286660 0.597613 +vn 0.750633 0.289346 0.593921 +vn 0.792749 0.240120 0.560228 +vn 0.790948 0.421247 0.443739 +vn 0.888577 0.260598 0.377422 +vn 0.710654 0.504318 0.490493 +vn 0.769585 0.241920 0.590930 +vn 0.958770 0.128025 -0.253670 +vn 0.970672 0.238319 0.031129 +vn 0.893948 0.362041 0.264046 +vn 0.852077 0.416822 0.316507 +vn 0.722861 0.454787 0.520188 +vn 0.600574 0.520218 0.607135 +vn 0.626942 0.599048 0.498062 +vn 0.646901 0.622120 0.440931 +vn 0.986511 0.132847 -0.095492 +vn 0.929197 0.322398 0.180639 +vn 0.828944 0.431959 0.355266 +vn 0.771538 0.522813 0.362377 +vn 0.615589 0.571825 0.542192 +vn 0.566027 0.559771 0.605182 +vn 0.632466 0.559038 0.536088 +vn 0.647664 0.569506 0.506119 +vn 0.971954 0.195715 0.130222 +vn 0.898709 0.332530 0.285867 +vn 0.788965 0.405225 0.461806 +vn 0.735496 0.504562 0.452132 +vn 0.603992 0.531602 0.593738 +vn 0.655202 0.475539 0.586993 +vn 0.701224 0.435102 0.564714 +vn 0.601032 0.502396 0.621540 +vn 0.886624 0.396100 0.238655 +vn 0.825282 0.422651 0.374432 +vn 0.675375 0.487259 0.553545 +vn 0.647084 0.564837 0.512040 +vn 0.611499 0.547044 0.571612 +vn 0.733390 0.467086 0.493912 +vn 0.681021 0.438459 0.586413 +vn 0.434004 0.538652 0.722098 +vn 0.819788 0.497696 0.283181 +vn 0.701071 0.533158 0.473495 +vn 0.689169 0.491592 0.532273 +vn 0.764092 0.426313 0.484115 +vn 0.774499 0.344340 0.530595 +vn 0.803888 0.357433 0.475356 +vn 0.625141 0.435560 0.647633 +vn 0.389080 0.415662 0.822077 +vn 0.780023 0.488937 0.390454 +vn 0.710929 0.496384 0.498154 +vn 0.807550 0.421003 0.413038 +vn 0.883480 0.276345 0.378216 +vn 0.810877 0.230720 0.537797 +vn 0.732871 0.305094 0.608081 +vn 0.601520 0.367687 0.709159 +vn 0.541673 0.228065 0.809046 +vn 0.940672 0.253578 -0.225379 +vn 0.944762 0.153661 -0.289468 +vn 0.949980 -0.039979 -0.309671 +vn 0.908383 -0.365673 -0.202643 +vn 0.845241 -0.527573 -0.084567 +vn 0.872677 -0.480544 -0.086550 +vn 0.852138 -0.500351 -0.153142 +vn 0.939299 0.297769 -0.170324 +vn 0.948302 0.226783 -0.221900 +vn 0.962432 -0.128056 -0.239326 +vn 0.867031 -0.459120 -0.193396 +vn 0.823878 -0.540391 -0.170843 +vn 0.866817 -0.477462 -0.143559 +vn 0.865993 -0.491867 -0.089724 +vn 0.949553 0.311716 0.033784 +vn 0.958708 0.279946 0.049928 +vn 0.983337 -0.174169 0.051759 +vn 0.849544 -0.525376 0.047243 +vn 0.823420 -0.563189 0.069216 +vn 0.854671 -0.515366 0.062471 +vn 0.806665 -0.570055 0.155858 +vn 0.917417 0.293893 0.268227 +vn 0.900876 0.234260 0.365368 +vn 0.891629 -0.140904 0.430250 +vn 0.769097 -0.520280 0.371136 +vn 0.685171 -0.606372 0.403485 +vn 0.725761 -0.482711 0.490127 +vn 0.616321 -0.586383 0.525590 +vn 0.759117 0.303568 0.575793 +vn 0.782830 0.137089 0.606891 +vn 0.739006 -0.110446 0.664541 +vn 0.648274 -0.439406 0.621784 +vn 0.468276 -0.656545 0.591296 +vn 0.422773 -0.500046 0.755760 +vn 0.321451 -0.443983 0.836360 +vn 0.762963 0.328471 0.556719 +vn 0.789361 0.110080 0.603961 +vn 0.674703 -0.248421 0.694998 +vn 0.429273 -0.453444 0.781060 +vn 0.241829 -0.619678 0.746635 +vn 0.223792 -0.560259 0.797479 +vn 0.272042 -0.442091 0.854701 +vn 0.864162 0.261574 0.429823 +vn 0.815607 0.015717 0.578356 +vn 0.602374 -0.469222 0.645711 +vn 0.320872 -0.638295 0.699698 +vn 0.219306 -0.625050 0.749107 +vn 0.317362 -0.575793 0.753441 +vn 0.405499 -0.503372 0.762963 +vn 0.684622 0.070772 0.725425 +vn 0.541520 -0.119663 0.832087 +vn 0.381176 -0.542314 0.748711 +vn 0.332194 -0.707236 0.624012 +vn 0.511948 -0.609272 0.605518 +vn 0.648396 -0.537248 0.539354 +vn 0.693930 -0.518723 0.499344 +vn -0.352000 0.011353 0.935911 +vn -0.208472 0.062655 0.976012 +vn -0.240028 -0.053713 0.969268 +vn -0.402875 -0.220588 0.888241 +vn -0.285440 -0.198645 0.937559 +vn -0.325571 -0.357982 0.875118 +vn -0.216376 -0.305734 0.927183 +vn -0.167180 -0.302438 0.938383 +vn 0.059847 -0.363201 0.929777 +vn 0.137394 -0.182257 0.973571 +vn 0.418195 -0.364483 0.831996 +vn 0.474136 -0.126774 0.871242 +vn 0.567644 -0.329600 0.754387 +vn 0.663686 -0.054140 0.746025 +vn 0.526475 -0.194037 0.827723 +vn 0.701468 0.108066 0.704428 +vn -0.194769 -0.149663 0.969329 +vn -0.147893 -0.144658 0.978362 +vn -0.192541 -0.178045 0.964995 +vn -0.130345 -0.302957 0.944029 +vn 0.083285 -0.410718 0.907926 +vn 0.373791 -0.415113 0.829402 +vn 0.517930 -0.357128 0.777276 +vn 0.357768 -0.249580 0.899808 +vn -0.215125 -0.440107 0.871761 +vn -0.187964 -0.394543 0.899411 +vn -0.117588 -0.408826 0.904996 +vn -0.021851 -0.519181 0.854366 +vn 0.144993 -0.621967 0.769494 +vn 0.261177 -0.649007 0.714499 +vn 0.373547 -0.553667 0.744224 +vn 0.281564 -0.502396 0.817469 +vn -0.168493 -0.566668 0.806513 +vn -0.211158 -0.610584 0.763268 +vn -0.036897 -0.656728 0.753197 +vn 0.057985 -0.705954 0.705832 +vn 0.152623 -0.705679 0.691855 +vn 0.173345 -0.630512 0.756523 +vn 0.240913 -0.557146 0.794671 +vn 0.361614 -0.600391 0.713248 +vn -0.132450 -0.494186 0.859188 +vn -0.229957 -0.468917 0.852748 +vn 0.047060 -0.515397 0.855647 +vn 0.087649 -0.547441 0.832209 +vn 0.041383 -0.481735 0.875301 +vn 0.106479 -0.365520 0.924680 +vn 0.259407 -0.364666 0.894253 +vn 0.540483 -0.475936 0.693747 +vn -0.179022 -0.529313 0.829279 +vn -0.255898 -0.449263 0.855953 +vn 0.068484 -0.408216 0.910306 +vn 0.095218 -0.376293 0.921567 +vn -0.052278 -0.378918 0.923948 +vn 0.063601 -0.364360 0.929044 +vn 0.326548 -0.377972 0.866298 +vn 0.660482 -0.447493 0.602893 +vn -0.143498 -0.649556 0.746605 +vn -0.276986 -0.716514 0.640187 +vn -0.038972 -0.709738 0.703360 +vn 0.052248 -0.614795 0.786920 +vn -0.051637 -0.584735 0.809564 +vn 0.044374 -0.616718 0.785913 +vn 0.358806 -0.611103 0.705527 +vn 0.701498 -0.538438 0.466842 +vn -0.479873 -0.194800 0.855403 +vn -0.501267 -0.185278 0.845210 +vn -0.454756 0.197485 0.868435 +vn -0.443556 0.022462 0.895932 +vn -0.345408 0.505387 0.790704 +vn -0.243233 0.418622 0.874966 +vn -0.335246 0.571368 0.749077 +vn -0.152959 0.648762 0.745415 +vn -0.404767 0.631336 0.661458 +vn -0.076266 0.671041 0.737449 +vn -0.361034 0.612293 0.703360 +vn 0.056093 0.568041 0.821070 +vn -0.266335 0.387066 0.882717 +vn 0.034028 0.434126 0.900174 +vn -0.311258 -0.166570 0.935575 +vn -0.298105 0.242195 0.923276 +vn -0.277200 0.581500 0.764855 +vn -0.253609 0.569140 0.782128 +vn -0.246803 0.622578 0.742607 +vn -0.302561 0.652303 0.694906 +vn -0.324992 0.434217 0.840114 +vn 0.024842 -0.037477 0.998962 +vn 0.167577 0.302652 0.938231 +vn 0.164098 0.630848 0.758324 +vn 0.119816 0.617817 0.777123 +vn 0.141545 0.655873 0.741447 +vn 0.183996 0.677633 0.711966 +vn 0.179022 0.441145 0.879360 +vn 0.300790 0.211982 0.929807 +vn 0.495071 0.426954 0.756676 +vn 0.515793 0.573962 0.635975 +vn 0.464949 0.577960 0.670614 +vn 0.457717 0.678152 0.574938 +vn 0.530106 0.644124 0.551408 +vn 0.603961 0.354991 0.713553 +vn 0.473708 0.357646 0.804773 +vn 0.499466 0.569384 0.652913 +vn 0.579791 0.548936 0.602039 +vn 0.626362 0.554186 0.548173 +vn 0.622272 0.688955 0.371563 +vn 0.664022 0.575396 0.477432 +vn 0.641011 0.370251 0.672262 +vn 0.671529 0.380902 0.635548 +vn 0.602985 0.600452 0.525163 +vn 0.633808 0.597797 0.490799 +vn 0.697714 0.594440 0.399731 +vn 0.674398 0.680990 0.285287 +vn 0.696310 0.465499 0.546281 +vn 0.553240 0.293680 0.779504 +vn 0.728751 0.449568 0.516465 +vn 0.707785 0.587542 0.392163 +vn 0.710746 0.596057 0.373516 +vn 0.668142 0.610034 0.425886 +vn 0.541551 0.669149 0.508835 +vn 0.576098 0.410230 0.706931 +vn 0.566149 0.149846 0.810541 +vn -0.270547 -0.133091 0.953429 +vn -0.254830 0.165532 0.952696 +vn -0.018586 -0.140355 0.989898 +vn -0.061281 0.161382 0.984954 +vn 0.056001 -0.089297 0.994415 +vn 0.096713 0.106784 0.989532 +vn -0.047884 0.078249 0.995758 +vn 0.111850 0.162633 0.980316 +vn -0.121586 0.218055 0.968322 +vn -0.071688 0.250069 0.965545 +vn -0.310434 0.267708 0.912107 +vn -0.396100 0.222877 0.890744 +vn -0.522477 0.222266 0.823145 +vn -0.470717 0.251167 0.845729 +vn -0.366405 0.157720 0.916959 +vn -0.380047 0.298746 0.875362 +vn -0.246254 -0.191412 0.950102 +vn -0.052370 -0.185217 0.981292 +vn -0.033998 -0.127262 0.991272 +vn -0.138615 -0.104068 0.984832 +vn -0.206610 -0.066927 0.976104 +vn -0.364544 0.053163 0.929655 +vn -0.499252 0.110263 0.859401 +vn -0.316721 0.073092 0.945677 +vn -0.174718 0.277749 0.944609 +vn -0.052644 0.170568 0.983917 +vn -0.017548 0.089145 0.995849 +vn -0.135990 0.049318 0.989471 +vn -0.279489 0.082949 0.956542 +vn -0.443556 0.117557 0.888485 +vn -0.459853 0.108097 0.881375 +vn -0.372417 0.195990 0.907102 +vn -0.029756 0.616047 0.787103 +vn 0.022309 0.528977 0.848323 +vn 0.009217 0.512803 0.858425 +vn -0.165227 0.579211 0.798212 +vn -0.254952 0.618519 0.743248 +vn -0.340281 0.573992 0.744774 +vn -0.347606 0.483200 0.803522 +vn -0.383038 0.447066 0.808313 +vn 0.079653 0.590167 0.803308 +vn -0.027436 0.625660 0.779595 +vn -0.073336 0.744865 0.663137 +vn -0.158177 0.766411 0.622547 +vn -0.152501 0.674490 0.722343 +vn -0.216376 0.595660 0.773522 +vn -0.277993 0.551958 0.786126 +vn -0.314646 0.543870 0.777917 +vn 0.103824 0.534074 0.839015 +vn -0.186865 0.614063 0.766778 +vn -0.241066 0.716971 0.654042 +vn -0.032655 0.706412 0.707022 +vn 0.031281 0.480026 0.876675 +vn -0.166021 0.312357 0.935331 +vn -0.361583 0.306192 0.880612 +vn -0.391736 0.412336 0.822474 +vn -0.032411 0.608661 0.792749 +vn -0.282357 0.686911 0.669607 +vn -0.295785 0.683096 0.667714 +vn 0.071291 0.638417 0.766350 +vn 0.203375 0.536576 0.818934 +vn -0.130284 0.535386 0.834468 +vn -0.396435 0.519730 0.756737 +vn -0.430403 0.478744 0.765191 +vn -0.216803 0.092471 0.971801 +vn -0.231697 -0.179968 0.955962 +vn -0.229194 -0.437727 0.869381 +vn -0.165563 -0.504562 0.847316 +vn -0.087039 -0.469131 0.878811 +vn 0.012513 -0.531510 0.846950 +vn 0.089785 -0.554399 0.827357 +vn -0.124668 0.089328 0.988159 +vn -0.187658 -0.239326 0.952605 +vn -0.232398 -0.435560 0.869625 +vn -0.214240 -0.448347 0.867794 +vn -0.128422 -0.370556 0.919858 +vn -0.017121 -0.442457 0.896603 +vn -0.077761 -0.623737 0.777703 +vn 0.046846 0.020081 0.998688 +vn 0.004975 -0.273782 0.961760 +vn -0.024323 -0.463637 0.885678 +vn -0.077425 -0.436079 0.896542 +vn -0.121799 -0.333476 0.934843 +vn -0.233711 -0.477096 0.847163 +vn -0.392743 -0.713431 0.580279 +vn 0.147984 -0.052034 0.987610 +vn 0.087802 -0.296884 0.950835 +vn 0.085818 -0.447798 0.889981 +vn 0.049562 -0.498306 0.865566 +vn -0.140660 -0.477737 0.867153 +vn -0.325266 -0.582904 0.744560 +vn -0.341075 -0.783013 0.520096 +vn -0.136387 -0.147984 0.979522 +vn -0.144200 -0.375683 0.915433 +vn -0.098483 -0.412061 0.905789 +vn 0.020295 -0.507126 0.861599 +vn 0.056398 -0.602466 0.796106 +vn -0.094577 -0.717826 0.689749 +vn -0.222907 -0.807245 0.546434 +vn -0.382000 -0.121433 0.916135 +vn -0.280435 -0.374401 0.883816 +vn -0.259468 -0.387799 0.884426 +vn -0.230598 -0.456710 0.859188 +vn -0.130222 -0.618397 0.774987 +vn -0.055025 -0.837336 0.543870 +vn -0.241829 -0.862911 0.443678 +vn -0.290902 0.080905 0.953307 +vn -0.110538 -0.256233 0.960265 +vn -0.082430 -0.393536 0.915586 +vn -0.188696 -0.510453 0.838923 +vn -0.317179 -0.689413 0.651204 +vn -0.300943 -0.867733 0.395520 +vn -0.207709 -0.926145 0.314737 +vn -0.411023 0.208319 0.887478 +vn -0.336650 -0.108890 0.935301 +vn -0.178716 -0.418256 0.890561 +vn -0.097873 -0.660909 0.744011 +vn -0.169774 -0.810419 0.560656 +vn -0.243416 -0.882229 0.402966 +vn -0.200446 -0.933836 0.296152 +vn -0.741783 -0.343791 -0.575762 +vn -0.703757 -0.387616 -0.595355 +vn -0.822443 -0.489364 -0.289956 +vn -0.883633 -0.343028 -0.318552 +vn -0.840114 -0.542192 0.013947 +vn -0.922300 -0.384564 -0.038026 +vn -0.811945 -0.544572 0.210150 +vn -0.864711 -0.419752 0.275704 +vn -0.812128 -0.392163 0.431959 +vn -0.743858 -0.446883 0.496902 +vn -0.876583 -0.212714 0.431623 +vn -0.754692 -0.415693 0.507553 +vn -0.888577 -0.054903 0.455397 +vn -0.724418 -0.226569 0.651021 +vn -0.731010 0.145451 0.666646 +vn -0.535295 0.110904 0.837336 +vn -0.725547 -0.336589 -0.600208 +vn -0.864498 -0.425153 -0.268014 +vn -0.875118 -0.478683 0.070833 +vn -0.865780 -0.484634 0.124454 +vn -0.928587 -0.319620 0.188574 +vn -0.961394 -0.044008 0.271523 +vn -0.925932 0.071383 0.370830 +vn -0.764214 0.012848 0.644795 +vn -0.748161 -0.322611 -0.579791 +vn -0.838252 -0.504318 -0.207221 +vn -0.816187 -0.571154 0.086886 +vn -0.860012 -0.509049 0.034577 +vn -0.924863 -0.378735 -0.033662 +vn -0.956877 -0.264107 0.120853 +vn -0.867611 -0.282632 0.409009 +vn -0.629597 -0.383648 0.675558 +vn -0.830622 -0.303873 -0.466597 +vn -0.842402 -0.532640 -0.081545 +vn -0.813959 -0.577013 0.066775 +vn -0.786157 -0.617573 0.022614 +vn -0.768059 -0.632649 -0.098910 +vn -0.778466 -0.627369 0.019745 +vn -0.602649 -0.683096 0.412488 +vn -0.331706 -0.734397 0.592120 +vn -0.771905 -0.567736 -0.285989 +vn -0.708975 -0.702506 0.061647 +vn -0.606952 -0.785211 0.122501 +vn -0.531388 -0.842524 0.088015 +vn -0.513718 -0.854793 -0.073489 +vn -0.533403 -0.843684 -0.060335 +vn -0.332102 -0.863735 0.378979 +vn -0.136692 -0.839412 0.525986 +vn -0.641224 -0.751061 -0.157109 +vn -0.498520 -0.832789 0.240577 +vn -0.330363 -0.902249 0.277078 +vn -0.340495 -0.938444 0.057558 +vn -0.420698 -0.901181 -0.104099 +vn -0.391949 -0.916135 -0.083804 +vn -0.177038 -0.925871 0.333750 +vn -0.071108 -0.863735 0.498886 +vn -0.709281 -0.704886 -0.001343 +vn -0.482223 -0.746849 0.457839 +vn -0.499405 -0.800195 0.332041 +vn -0.594806 -0.803797 -0.010559 +vn -0.556780 -0.827815 -0.068270 +vn -0.350597 -0.935728 0.037965 +vn -0.089633 -0.936918 0.337809 +vn -0.047334 -0.918119 0.393384 +vn -0.943144 -0.075381 -0.323618 +vn -0.845424 -0.220161 -0.486557 +vn -0.966094 0.103519 -0.236457 +vn -0.936460 -0.030885 -0.349376 +vn -0.966918 0.204901 -0.151738 +vn -0.960143 0.133274 -0.245582 +vn -0.960753 0.254830 -0.109378 +vn -0.959624 0.215064 -0.181158 +vn -0.929014 0.361827 -0.077242 +vn -0.914457 0.362529 -0.179754 +vn -0.861751 0.500961 -0.079836 +vn -0.794214 0.547929 -0.262581 +vn -0.716819 0.683187 -0.139225 +vn -0.605945 0.704642 -0.369152 +vn -0.997986 -0.028108 -0.056490 +vn -0.978484 0.205481 -0.018281 +vn -0.975463 0.219764 -0.012085 +vn -0.967467 0.246223 -0.057558 +vn -0.906339 0.420118 -0.044923 +vn -0.836604 0.543413 0.068972 +vn -0.694510 0.693289 0.192175 +vn -0.967437 -0.089724 0.236549 +vn -0.975158 0.184729 0.122105 +vn -0.979003 0.193823 0.062960 +vn -0.967101 0.243202 0.074221 +vn -0.849544 0.509201 0.137669 +vn -0.690756 0.661733 0.291421 +vn -0.511612 0.719077 0.470229 +vn -0.873012 -0.269539 0.406415 +vn -0.970397 0.049623 0.236274 +vn -0.941221 0.256050 0.220222 +vn -0.855098 0.357189 0.375683 +vn -0.695761 0.539689 0.473922 +vn -0.513443 0.703848 0.490860 +vn -0.367016 0.769219 0.523026 +vn -0.724326 -0.352306 0.592578 +vn -0.752922 0.003601 0.658071 +vn -0.636586 0.332621 0.695761 +vn -0.498367 0.422468 0.757042 +vn -0.407300 0.466842 0.784936 +vn -0.397015 0.569231 0.719932 +vn -0.291635 0.739891 0.606189 +vn -0.541642 -0.179724 0.821131 +vn -0.391247 0.061830 0.918180 +vn -0.269234 0.322062 0.907590 +vn -0.228523 0.379589 0.896451 +vn -0.212378 0.387890 0.896878 +vn -0.224219 0.364635 0.903745 +vn -0.160558 0.545762 0.822382 +vn -0.345103 0.022492 0.938261 +vn -0.290353 0.110111 0.950530 +vn -0.311258 0.308969 0.898679 +vn -0.325663 0.415326 0.849361 +vn -0.269112 0.455885 0.848354 +vn -0.238075 0.386883 0.890835 +vn -0.187353 0.406995 0.893979 +vn -0.838038 -0.383190 -0.388348 +vn -0.754448 -0.467422 -0.460768 +vn -0.812220 -0.418836 -0.405957 +vn -0.746208 -0.542497 -0.385784 +vn -0.791589 -0.366070 -0.489181 +vn -0.742149 -0.548326 -0.385388 +vn -0.887478 -0.323893 -0.327769 +vn -0.804590 -0.531388 -0.264931 +vn -0.900967 -0.320902 -0.291940 +vn -0.848811 -0.474807 -0.232490 +vn -0.811609 -0.304270 -0.498672 +vn -0.798853 -0.427625 -0.422987 +vn -0.617115 -0.265206 -0.740776 +vn -0.541063 -0.438887 -0.717338 +vn -0.523087 -0.317484 -0.790918 +vn -0.398083 -0.500534 -0.768731 +vn -0.931822 -0.165441 -0.322916 +vn -0.863247 -0.206854 -0.460433 +vn -0.759667 -0.110752 -0.640767 +vn -0.915586 0.018189 -0.401624 +vn -0.933988 0.111759 -0.339335 +vn -0.811365 0.158116 -0.562731 +vn -0.669912 0.104923 -0.734977 +vn -0.652394 -0.049379 -0.756249 +vn -0.948607 0.101871 -0.299600 +vn -0.871548 0.098331 -0.480300 +vn -0.705557 0.043123 -0.707327 +vn -0.873379 0.103183 -0.475906 +vn -0.846675 0.269753 -0.458632 +vn -0.722648 0.400494 -0.563311 +vn -0.746208 0.329783 -0.578234 +vn -0.708213 0.199927 -0.677053 +vn -0.910459 0.215369 -0.353038 +vn -0.823634 0.251930 -0.508011 +vn -0.684133 0.227363 -0.692984 +vn -0.775231 0.263131 -0.574206 +vn -0.753502 0.335246 -0.565477 +vn -0.657155 0.408826 -0.633229 +vn -0.764489 0.475295 -0.435408 +vn -0.601276 0.516373 -0.609760 +vn -0.844813 0.360912 -0.394971 +vn -0.756767 0.359050 -0.546190 +vn -0.625172 0.356517 -0.694266 +vn -0.669424 0.428297 -0.606952 +vn -0.606281 0.511643 -0.608753 +vn -0.496597 0.557909 -0.664876 +vn -0.622028 0.660237 -0.420820 +vn -0.426191 0.727653 -0.537461 +vn -0.670675 0.596881 -0.440321 +vn -0.564104 0.604694 -0.562212 +vn -0.557817 0.537584 -0.632282 +vn -0.614948 0.444197 -0.651509 +vn -0.502243 0.470351 -0.725578 +vn -0.494186 0.550157 -0.673086 +vn -0.582385 0.617267 -0.528947 +vn -0.406842 0.680471 -0.609424 +vn -0.456923 0.724631 -0.515824 +vn -0.357585 0.740989 -0.568346 +vn -0.410108 0.779015 -0.474227 +vn -0.406384 0.699576 -0.587695 +vn -0.358531 0.601001 -0.714286 +vn -0.510330 0.560045 -0.652577 +vn -0.574908 0.538408 -0.616077 +vn -0.461623 0.550035 -0.695914 +vn -0.732170 -0.419324 -0.536668 +vn -0.735191 -0.336833 -0.588214 +vn -0.804071 -0.249489 -0.539598 +vn -0.846004 -0.156621 -0.509598 +vn -0.738731 -0.449324 -0.502365 +vn -0.609027 -0.638600 -0.470351 +vn -0.753166 -0.511521 -0.413556 +vn -0.749718 -0.491745 -0.442793 +vn -0.845668 -0.299081 -0.441969 +vn -0.916166 -0.177557 -0.359264 +vn -0.893124 -0.228492 -0.387402 +vn -0.753502 -0.462447 -0.467238 +vn -0.677908 -0.606586 -0.415235 +vn -0.784295 -0.476424 -0.397320 +vn -0.760765 -0.526902 -0.378887 +vn -0.897610 -0.220191 -0.381787 +vn -0.960875 -0.057649 -0.270852 +vn -0.930448 -0.306284 -0.201086 +vn -0.863369 -0.476333 -0.166387 +vn -0.772454 -0.620899 -0.133274 +vn -0.838984 -0.526658 -0.136692 +vn -0.798334 -0.546098 -0.253700 +vn -0.946440 -0.164037 -0.277993 +vn -0.976287 0.048280 -0.210944 +vn -0.960479 -0.246986 -0.128147 +vn -0.905606 -0.421979 -0.042421 +vn -0.755425 -0.653584 -0.046022 +vn -0.830683 -0.545244 -0.112339 +vn -0.871670 -0.478195 -0.107181 +vn -0.982086 -0.167150 -0.086673 +vn -0.969024 -0.045717 -0.242653 +vn -0.908933 -0.220679 -0.353710 +vn -0.895108 -0.326792 -0.303232 +vn -0.723441 -0.668294 -0.173132 +vn -0.752251 -0.621845 -0.217658 +vn -0.826136 -0.405103 -0.391552 +vn -0.866878 -0.285073 -0.408918 +vn -0.844203 -0.185217 -0.502945 +vn -0.791864 -0.258003 -0.553453 +vn -0.812616 -0.202033 -0.546648 +vn -0.778680 -0.511002 -0.364025 +vn -0.690725 -0.704398 -0.163305 +vn -0.486099 -0.379131 -0.787347 +vn -0.524796 -0.266243 -0.808496 +vn -0.642415 -0.155431 -0.750389 +vn -0.727958 -0.217475 -0.650166 +vn -0.760430 -0.196326 -0.618976 +vn -0.766717 -0.279977 -0.577654 +vn -0.639760 -0.665914 -0.383709 +vn -0.415418 -0.354015 -0.837886 +vn -0.511002 -0.140843 -0.847926 +vn -0.555254 -0.100070 -0.825617 +vn -0.543901 -0.140538 -0.827265 +vn -0.578997 -0.172826 -0.796777 +vn -0.596912 -0.173742 -0.783258 +vn -0.504685 -0.532884 -0.679159 +vn 0.095340 0.289895 -0.952269 +vn 0.058992 0.531419 -0.845027 +vn -0.145421 0.417890 -0.896756 +vn -0.074740 0.319742 -0.944517 +vn -0.220893 0.296579 -0.929106 +vn -0.174535 0.303385 -0.936735 +vn -0.245582 0.196753 -0.949187 +vn -0.168310 0.279794 -0.945158 +vn 0.173162 0.166265 -0.970733 +vn 0.212989 0.246315 -0.945463 +vn 0.574694 0.075045 -0.814905 +vn 0.666921 0.155156 -0.728751 +vn 0.710074 -0.028108 -0.703543 +vn 0.744011 0.060274 -0.665426 +vn 0.879757 0.055361 -0.472152 +vn 0.786676 0.092288 -0.610401 +vn -0.013794 0.540635 -0.841121 +vn -0.278359 0.446944 -0.850124 +vn -0.332469 0.306528 -0.891873 +vn -0.319712 0.182745 -0.929685 +vn 0.155675 0.166570 -0.973632 +vn 0.520554 0.169225 -0.836848 +vn 0.691580 0.194586 -0.695578 +vn 0.919004 0.241554 -0.311502 +vn -0.024781 0.303690 -0.952422 +vn -0.350810 0.291696 -0.889828 +vn -0.419416 0.262886 -0.868862 +vn -0.347118 0.264321 -0.899777 +vn 0.137150 0.318644 -0.937864 +vn 0.537309 0.328715 -0.776666 +vn 0.723228 0.375134 -0.579791 +vn 0.910703 0.326182 -0.253365 +vn -0.000916 0.211890 -0.977264 +vn -0.299234 0.289743 -0.909085 +vn -0.386639 0.383526 -0.838679 +vn -0.301004 0.510453 -0.805475 +vn 0.098819 0.614978 -0.782311 +vn 0.461745 0.564714 -0.684011 +vn 0.704306 0.435865 -0.560289 +vn 0.900998 0.255867 -0.350261 +vn -0.028108 0.160009 -0.986694 +vn -0.206732 0.135929 -0.968902 +vn -0.246742 0.240181 -0.938810 +vn -0.138981 0.485611 -0.863033 +vn 0.114689 0.666707 -0.736412 +vn 0.303751 0.670125 -0.677206 +vn 0.580798 0.515366 -0.630116 +vn 0.805933 0.250404 -0.536424 +vn -0.176244 0.033448 -0.983764 +vn -0.182531 -0.054781 -0.981658 +vn 0.024720 0.062563 -0.997711 +vn 0.156468 0.356334 -0.921140 +vn 0.177374 0.506119 -0.844020 +vn 0.218696 0.471908 -0.854060 +vn 0.457137 0.368389 -0.809473 +vn 0.697043 0.257241 -0.669240 +vn -0.295694 0.093661 -0.950652 +vn -0.204779 0.052919 -0.977355 +vn 0.236732 0.053774 -0.970061 +vn 0.319498 0.165105 -0.933073 +vn 0.160558 0.239753 -0.957427 +vn 0.213904 0.184515 -0.959258 +vn 0.432722 0.210486 -0.876583 +vn 0.645039 0.179449 -0.742759 +vn -0.162053 0.338237 -0.926969 +vn -0.093692 0.116642 -0.988739 +vn -0.365734 0.225837 -0.902860 +vn -0.294107 0.082583 -0.952178 +vn -0.455885 0.075106 -0.886837 +vn -0.396710 0.031617 -0.917386 +vn -0.419141 -0.270028 -0.866817 +vn -0.439283 -0.149724 -0.885739 +vn -0.272591 -0.685873 -0.674703 +vn -0.371288 -0.576830 -0.727561 +vn -0.105594 -0.784539 -0.610981 +vn -0.266488 -0.647969 -0.713492 +vn 0.103122 -0.734367 -0.670827 +vn -0.191198 -0.610645 -0.768456 +vn -0.162389 0.426618 -0.889706 +vn -0.112644 0.306314 -0.945219 +vn -0.075808 0.047731 -0.995972 +vn -0.057283 -0.396588 -0.916196 +vn -0.013184 -0.793451 -0.608448 +vn 0.141575 -0.883267 -0.446913 +vn 0.276040 -0.776147 -0.566851 +vn -0.031281 0.345042 -0.938047 +vn 0.147740 0.250435 -0.956786 +vn 0.301401 0.014100 -0.953368 +vn 0.320017 -0.396588 -0.860408 +vn 0.226753 -0.792627 -0.565905 +vn 0.165288 -0.916807 -0.363475 +vn 0.226051 -0.815332 -0.532975 +vn 0.282388 0.234352 -0.930204 +vn 0.348155 0.139866 -0.926908 +vn 0.432295 -0.068972 -0.899075 +vn 0.488296 -0.375164 -0.787866 +vn 0.410260 -0.732231 -0.543565 +vn 0.259316 -0.897000 -0.357860 +vn 0.252327 -0.845027 -0.471389 +vn 0.723930 0.144505 -0.674551 +vn 0.786889 0.047609 -0.615223 +vn 0.795099 -0.081668 -0.600909 +vn 0.755974 -0.261483 -0.600055 +vn 0.577227 -0.614215 -0.538041 +vn 0.324595 -0.843074 -0.428755 +vn 0.258766 -0.862056 -0.435713 +vn 0.792047 0.051881 -0.608234 +vn 0.868191 -0.132725 -0.478103 +vn 0.904874 -0.064180 -0.420728 +vn 0.889401 -0.034455 -0.455794 +vn 0.772057 -0.420545 -0.476485 +vn 0.579241 -0.704459 -0.410077 +vn 0.407697 -0.812830 -0.415998 +vn 0.761162 -0.008606 -0.648488 +vn 0.762993 -0.288064 -0.578631 +vn 0.809992 -0.136570 -0.570299 +vn 0.875881 0.017853 -0.482131 +vn 0.902005 -0.298837 -0.311502 +vn 0.842524 -0.480148 -0.244057 +vn 0.726310 -0.540147 -0.425031 +vn -0.230293 -0.049745 -0.971831 +vn -0.091250 0.110904 -0.989624 +vn -0.179846 -0.111270 -0.977355 +vn -0.060030 -0.083865 -0.994659 +vn 0.007904 -0.258034 -0.966094 +vn 0.142003 -0.179724 -0.973388 +vn -0.281655 -0.420057 -0.862667 +vn -0.179662 -0.305216 -0.935148 +vn -0.632313 -0.417432 -0.652608 +vn -0.508194 -0.492080 -0.706778 +vn -0.536088 -0.367931 -0.759728 +vn -0.491623 -0.585772 -0.644307 +vn -0.424299 -0.351268 -0.834590 +vn -0.421766 -0.568834 -0.706046 +vn -0.247932 0.019349 -0.968566 +vn -0.255318 -0.011811 -0.966765 +vn -0.252998 -0.184240 -0.949736 +vn -0.310709 -0.329081 -0.891690 +vn -0.545824 -0.155553 -0.823298 +vn -0.529832 0.038301 -0.847194 +vn -0.516221 0.002106 -0.856410 +vn -0.334910 -0.096622 -0.937254 +vn -0.267708 -0.168035 -0.948698 +vn -0.353984 -0.110508 -0.928678 +vn -0.331584 -0.121830 -0.935514 +vn -0.347575 -0.084323 -0.933836 +vn -0.545854 -0.087466 -0.833277 +vn -0.585406 -0.111911 -0.802942 +vn -0.396558 -0.097537 -0.912778 +vn -0.216803 -0.072787 -0.973479 +vn -0.238441 0.026185 -0.970794 +vn -0.438093 0.018647 -0.898709 +vn -0.444563 -0.197180 -0.873745 +vn -0.541948 -0.318278 -0.777764 +vn -0.520432 -0.217139 -0.825800 +vn -0.261818 -0.437452 -0.860256 +vn -0.146764 -0.254799 -0.955779 +vn -0.233985 -0.236946 -0.942900 +vn -0.519211 -0.234474 -0.821833 +vn -0.564043 -0.222724 -0.795099 +vn -0.482559 -0.178381 -0.857479 +vn -0.446120 -0.122501 -0.886532 +vn -0.153783 -0.687704 -0.709494 +vn -0.096164 -0.719687 -0.687582 +vn -0.216956 -0.679556 -0.700797 +vn -0.423536 -0.539628 -0.727592 +vn -0.454512 -0.303446 -0.837428 +vn -0.412336 -0.149907 -0.898587 +vn -0.476363 -0.148930 -0.866512 +vn -0.292520 -0.609638 -0.736717 +vn -0.165868 -0.731620 -0.661184 +vn -0.100589 -0.759453 -0.642720 +vn -0.215918 -0.660237 -0.719321 +vn -0.271065 -0.541642 -0.795679 +vn -0.415387 -0.490371 -0.766106 +vn -0.504074 -0.490768 -0.710624 +vn 0.140355 0.488815 -0.860988 +vn 0.286294 0.498856 -0.818018 +vn 0.326731 0.290475 -0.899350 +vn 0.307138 0.206122 -0.929044 +vn 0.222510 0.250649 -0.942137 +vn 0.077548 0.203192 -0.976043 +vn -0.053224 0.174200 -0.983245 +vn 0.144810 0.282144 -0.948363 +vn 0.352245 0.353496 -0.866573 +vn 0.468398 0.228797 -0.853359 +vn 0.500534 0.198157 -0.842708 +vn 0.455794 0.354411 -0.816462 +vn 0.339244 0.328806 -0.881314 +vn 0.205542 0.301706 -0.930967 +vn 0.211310 0.112888 -0.970855 +vn 0.322428 0.154241 -0.933927 +vn 0.440687 0.114231 -0.890347 +vn 0.422346 0.255593 -0.869625 +vn 0.392865 0.511521 -0.764153 +vn 0.300668 0.504807 -0.809137 +vn 0.023225 0.557482 -0.829829 +vn 0.025483 -0.056887 -0.998047 +vn 0.192511 0.016785 -0.981140 +vn 0.179449 0.129582 -0.975188 +vn 0.085299 0.391034 -0.916379 +vn 0.026399 0.649648 -0.759758 +vn -0.065279 0.737144 -0.672567 +vn -0.248665 0.700949 -0.668447 +vn -0.322977 -0.323191 -0.889492 +vn -0.220618 -0.051607 -0.973968 +vn -0.213569 0.256233 -0.942717 +vn -0.269173 0.517014 -0.812525 +vn -0.301157 0.701804 -0.645558 +vn -0.301462 0.787164 -0.538011 +vn -0.254769 0.730674 -0.633381 +vn -0.526475 -0.442824 -0.725700 +vn -0.542772 -0.131169 -0.829554 +vn -0.495865 0.298196 -0.815577 +vn -0.478042 0.606250 -0.635517 +vn -0.505234 0.708853 -0.492172 +vn -0.468886 0.727531 -0.500778 +vn -0.370739 0.634938 -0.677786 +vn -0.543107 -0.414655 -0.730094 +vn -0.659719 -0.150975 -0.736167 +vn -0.642933 0.241340 -0.726859 +vn -0.455092 0.612476 -0.646321 +vn -0.361888 0.723075 -0.588366 +vn -0.383648 0.673940 -0.631306 +vn -0.376659 0.544542 -0.749382 +g Cube_Cube_Material +usemtl Material +s 1 +f 1/1/1 23/2/2 30/3/3 +f 1/1/1 30/3/3 2/4/4 +f 2/4/4 30/3/3 31/5/5 +f 2/4/4 31/5/5 3/6/6 +f 3/6/6 31/5/5 32/7/7 +f 3/6/6 32/7/7 4/8/8 +f 4/8/8 32/7/7 33/9/9 +f 4/8/8 33/9/9 5/10/10 +f 5/10/10 33/9/9 34/11/11 +f 5/10/10 34/11/11 6/12/12 +f 6/12/12 34/11/11 35/13/13 +f 6/12/12 35/13/13 7/14/14 +f 7/14/14 35/13/13 36/15/15 +f 7/14/14 36/15/15 8/16/16 +f 8/16/16 36/15/15 1357/17/17 +f 8/16/16 1357/17/17 1358/18/18 +f 23/2/2 24/19/19 37/20/20 +f 23/2/2 37/20/20 30/3/3 +f 30/3/3 37/20/20 38/21/21 +f 30/3/3 38/21/21 31/5/5 +f 31/5/5 38/21/21 39/22/22 +f 31/5/5 39/22/22 32/7/7 +f 32/7/7 39/22/22 40/23/23 +f 32/7/7 40/23/23 33/9/9 +f 33/9/9 40/23/23 41/24/24 +f 33/9/9 41/24/24 34/11/11 +f 34/11/11 41/24/24 42/25/25 +f 34/11/11 42/25/25 35/13/13 +f 35/13/13 42/25/25 43/26/26 +f 35/13/13 43/26/26 36/15/15 +f 36/15/15 43/26/26 1356/27/27 +f 36/15/15 1356/27/27 1357/17/17 +f 24/19/19 25/28/28 44/29/29 +f 24/19/19 44/29/29 37/20/20 +f 37/20/20 44/29/29 45/30/30 +f 37/20/20 45/30/30 38/21/21 +f 38/21/21 45/30/30 46/31/31 +f 38/21/21 46/31/31 39/22/22 +f 39/22/22 46/31/31 47/32/32 +f 39/22/22 47/32/32 40/23/23 +f 40/23/23 47/32/32 48/33/33 +f 40/23/23 48/33/33 41/24/24 +f 41/24/24 48/33/33 49/34/34 +f 41/24/24 49/34/34 42/25/25 +f 42/25/25 49/34/34 50/35/35 +f 42/25/25 50/35/35 43/26/26 +f 43/26/26 50/35/35 1355/36/36 +f 43/26/26 1355/36/36 1356/27/27 +f 25/28/28 26/37/37 51/38/38 +f 25/28/28 51/38/38 44/29/29 +f 44/29/29 51/38/38 52/39/39 +f 44/29/29 52/39/39 45/30/30 +f 45/30/30 52/39/39 53/40/40 +f 45/30/30 53/40/40 46/31/31 +f 46/31/31 53/40/40 54/41/41 +f 46/31/31 54/41/41 47/32/32 +f 47/32/32 54/41/41 55/42/42 +f 47/32/32 55/42/42 48/33/33 +f 48/33/33 55/42/42 56/43/43 +f 48/33/33 56/43/43 49/34/34 +f 49/34/34 56/43/43 57/44/44 +f 49/34/34 57/44/44 50/35/35 +f 50/35/35 57/44/44 1354/45/45 +f 50/35/35 1354/45/45 1355/36/36 +f 26/37/37 27/46/46 58/47/47 +f 26/37/37 58/47/47 51/38/38 +f 51/38/38 58/47/47 59/48/48 +f 51/38/38 59/48/48 52/39/39 +f 52/39/39 59/48/48 60/49/49 +f 52/39/39 60/49/49 53/40/40 +f 53/40/40 60/49/49 61/50/50 +f 53/40/40 61/50/50 54/41/41 +f 54/41/41 61/50/50 62/51/51 +f 54/41/41 62/51/51 55/42/42 +f 55/42/42 62/51/51 63/52/52 +f 55/42/42 63/52/52 56/43/43 +f 56/43/43 63/52/52 64/53/53 +f 56/43/43 64/53/53 57/44/44 +f 57/44/44 64/53/53 1353/54/54 +f 57/44/44 1353/54/54 1354/45/45 +f 27/46/46 28/55/55 65/56/56 +f 27/46/46 65/56/56 58/47/47 +f 58/47/47 65/56/56 66/57/57 +f 58/47/47 66/57/57 59/48/48 +f 59/48/48 66/57/57 67/58/58 +f 59/48/48 67/58/58 60/49/49 +f 60/49/49 67/58/58 68/59/59 +f 60/49/49 68/59/59 61/50/50 +f 61/50/50 68/59/59 69/60/60 +f 61/50/50 69/60/60 62/51/51 +f 62/51/51 69/60/60 70/61/61 +f 62/51/51 70/61/61 63/52/52 +f 63/52/52 70/61/61 71/62/62 +f 63/52/52 71/62/62 64/53/53 +f 64/53/53 71/62/62 1352/63/63 +f 64/53/53 1352/63/63 1353/54/54 +f 28/55/55 29/64/64 72/65/65 +f 28/55/55 72/65/65 65/56/56 +f 65/56/56 72/65/65 73/66/66 +f 65/56/56 73/66/66 66/57/57 +f 66/57/57 73/66/66 74/67/67 +f 66/57/57 74/67/67 67/58/58 +f 67/58/58 74/67/67 75/68/68 +f 67/58/58 75/68/68 68/59/59 +f 68/59/59 75/68/68 76/69/69 +f 68/59/59 76/69/69 69/60/60 +f 69/60/60 76/69/69 77/70/70 +f 69/60/60 77/70/70 70/61/61 +f 70/61/61 77/70/70 78/71/71 +f 70/61/61 78/71/71 71/62/62 +f 71/62/62 78/71/71 1351/72/72 +f 71/62/62 1351/72/72 1352/63/63 +f 29/64/64 1373/73/73 1372/74/74 +f 29/64/64 1372/74/74 72/65/65 +f 72/65/65 1372/74/74 1371/75/75 +f 72/65/65 1371/75/75 73/66/66 +f 73/66/66 1371/75/75 1370/76/76 +f 73/66/66 1370/76/76 74/67/67 +f 74/67/67 1370/76/76 1369/77/77 +f 74/67/67 1369/77/77 75/68/68 +f 75/68/68 1369/77/77 1368/78/78 +f 75/68/68 1368/78/78 76/69/69 +f 76/69/69 1368/78/78 1367/79/79 +f 76/69/69 1367/79/79 77/70/70 +f 77/70/70 1367/79/79 1366/80/80 +f 77/70/70 1366/80/80 78/71/71 +f 78/71/71 1366/80/80 1531/81/81 +f 78/71/71 1531/81/81 1351/72/72 +f 1/1/1 2/4/4 79/82/82 +f 1/1/1 79/82/82 9/83/83 +f 9/83/83 79/82/82 80/84/84 +f 9/83/83 80/84/84 10/85/85 +f 10/85/85 80/84/84 81/86/86 +f 10/85/85 81/86/86 11/87/87 +f 11/87/87 81/86/86 82/88/88 +f 11/87/87 82/88/88 12/89/89 +f 12/89/89 82/88/88 83/90/90 +f 12/89/89 83/90/90 13/91/91 +f 13/91/91 83/90/90 84/92/92 +f 13/91/91 84/92/92 14/93/93 +f 14/93/93 84/92/92 85/94/94 +f 14/93/93 85/94/94 15/95/95 +f 15/95/95 85/94/94 1402/96/96 +f 15/95/95 1402/96/96 1403/97/97 +f 2/4/4 3/6/6 86/98/98 +f 2/4/4 86/98/98 79/82/82 +f 79/82/82 86/98/98 87/99/99 +f 79/82/82 87/99/99 80/84/84 +f 80/84/84 87/99/99 88/100/100 +f 80/84/84 88/100/100 81/86/86 +f 81/86/86 88/100/100 89/101/101 +f 81/86/86 89/101/101 82/88/88 +f 82/88/88 89/101/101 90/102/102 +f 82/88/88 90/102/102 83/90/90 +f 83/90/90 90/102/102 91/103/103 +f 83/90/90 91/103/103 84/92/92 +f 84/92/92 91/103/103 92/104/104 +f 84/92/92 92/104/104 85/94/94 +f 85/94/94 92/104/104 1401/105/105 +f 85/94/94 1401/105/105 1402/96/96 +f 3/6/6 4/8/8 93/106/106 +f 3/6/6 93/106/106 86/98/98 +f 86/98/98 93/106/106 94/107/107 +f 86/98/98 94/107/107 87/99/99 +f 87/99/99 94/107/107 95/108/108 +f 87/99/99 95/108/108 88/100/100 +f 88/100/100 95/108/108 96/109/109 +f 88/100/100 96/109/109 89/101/101 +f 89/101/101 96/109/109 97/110/110 +f 89/101/101 97/110/110 90/102/102 +f 90/102/102 97/110/110 98/111/111 +f 90/102/102 98/111/111 91/103/103 +f 91/103/103 98/111/111 99/112/112 +f 91/103/103 99/112/112 92/104/104 +f 92/104/104 99/112/112 1400/113/113 +f 92/104/104 1400/113/113 1401/105/105 +f 4/8/8 5/10/10 100/114/114 +f 4/8/8 100/114/114 93/106/106 +f 93/106/106 100/114/114 101/115/115 +f 93/106/106 101/115/115 94/107/107 +f 94/107/107 101/115/115 102/116/116 +f 94/107/107 102/116/116 95/108/108 +f 95/108/108 102/116/116 103/117/117 +f 95/108/108 103/117/117 96/109/109 +f 96/109/109 103/117/117 104/118/118 +f 96/109/109 104/118/118 97/110/110 +f 97/110/110 104/118/118 105/119/119 +f 97/110/110 105/119/119 98/111/111 +f 98/111/111 105/119/119 106/120/120 +f 98/111/111 106/120/120 99/112/112 +f 99/112/112 106/120/120 1399/121/121 +f 99/112/112 1399/121/121 1400/113/113 +f 5/10/10 6/12/12 107/122/122 +f 5/10/10 107/122/122 100/114/114 +f 100/114/114 107/122/122 108/123/123 +f 100/114/114 108/123/123 101/115/115 +f 101/115/115 108/123/123 109/124/124 +f 101/115/115 109/124/124 102/116/116 +f 102/116/116 109/124/124 110/125/125 +f 102/116/116 110/125/125 103/117/117 +f 103/117/117 110/125/125 111/126/126 +f 103/117/117 111/126/126 104/118/118 +f 104/118/118 111/126/126 112/127/127 +f 104/118/118 112/127/127 105/119/119 +f 105/119/119 112/127/127 113/128/128 +f 105/119/119 113/128/128 106/120/120 +f 106/120/120 113/128/128 1398/129/129 +f 106/120/120 1398/129/129 1399/121/121 +f 6/12/12 7/14/14 114/130/130 +f 6/12/12 114/130/130 107/122/122 +f 107/122/122 114/130/130 115/131/131 +f 107/122/122 115/131/131 108/123/123 +f 108/123/123 115/131/131 116/132/132 +f 108/123/123 116/132/132 109/124/124 +f 109/124/124 116/132/132 117/133/133 +f 109/124/124 117/133/133 110/125/125 +f 110/125/125 117/133/133 118/134/134 +f 110/125/125 118/134/134 111/126/126 +f 111/126/126 118/134/134 119/135/135 +f 111/126/126 119/135/135 112/127/127 +f 112/127/127 119/135/135 120/136/136 +f 112/127/127 120/136/136 113/128/128 +f 113/128/128 120/136/136 1397/137/137 +f 113/128/128 1397/137/137 1398/129/129 +f 7/14/14 8/16/16 121/138/138 +f 7/14/14 121/138/138 114/130/130 +f 114/130/130 121/138/138 122/139/139 +f 114/130/130 122/139/139 115/131/131 +f 115/131/131 122/139/139 123/140/140 +f 115/131/131 123/140/140 116/132/132 +f 116/132/132 123/140/140 124/141/141 +f 116/132/132 124/141/141 117/133/133 +f 117/133/133 124/141/141 125/142/142 +f 117/133/133 125/142/142 118/134/134 +f 118/134/134 125/142/142 126/143/143 +f 118/134/134 126/143/143 119/135/135 +f 119/135/135 126/143/143 127/144/144 +f 119/135/135 127/144/144 120/136/136 +f 120/136/136 127/144/144 1396/145/145 +f 120/136/136 1396/145/145 1397/137/137 +f 8/16/16 1358/18/18 1359/146/146 +f 8/16/16 1359/146/146 121/138/138 +f 121/138/138 1359/146/146 1360/147/147 +f 121/138/138 1360/147/147 122/139/139 +f 122/139/139 1360/147/147 1361/148/148 +f 122/139/139 1361/148/148 123/140/140 +f 123/140/140 1361/148/148 1362/149/149 +f 123/140/140 1362/149/149 124/141/141 +f 124/141/141 1362/149/149 1363/150/150 +f 124/141/141 1363/150/150 125/142/142 +f 125/142/142 1363/150/150 1364/151/151 +f 125/142/142 1364/151/151 126/143/143 +f 126/143/143 1364/151/151 1365/152/152 +f 126/143/143 1365/152/152 127/144/144 +f 127/144/144 1365/152/152 1532/153/153 +f 127/144/144 1532/153/153 1396/145/145 +f 1/1/1 9/83/83 128/154/154 +f 1/1/1 128/154/154 16/155/155 +f 16/155/155 128/154/154 129/156/156 +f 16/155/155 129/156/156 17/157/157 +f 17/157/157 129/156/156 130/158/158 +f 17/157/157 130/158/158 18/159/159 +f 18/159/159 130/158/158 131/160/160 +f 18/159/159 131/160/160 19/161/161 +f 19/161/161 131/160/160 132/162/162 +f 19/161/161 132/162/162 20/163/163 +f 20/163/163 132/162/162 133/164/164 +f 20/163/163 133/164/164 21/165/165 +f 21/165/165 133/164/164 134/166/166 +f 21/165/165 134/166/166 22/167/167 +f 22/167/167 134/166/166 1432/168/168 +f 22/167/167 1432/168/168 1433/169/169 +f 9/83/83 10/85/85 135/170/170 +f 9/83/83 135/170/170 128/154/154 +f 128/154/154 135/170/170 136/171/171 +f 128/154/154 136/171/171 129/156/156 +f 129/156/156 136/171/171 137/172/172 +f 129/156/156 137/172/172 130/158/158 +f 130/158/158 137/172/172 138/173/173 +f 130/158/158 138/173/173 131/160/160 +f 131/160/160 138/173/173 139/174/174 +f 131/160/160 139/174/174 132/162/162 +f 132/162/162 139/174/174 140/175/175 +f 132/162/162 140/175/175 133/164/164 +f 133/164/164 140/175/175 141/176/176 +f 133/164/164 141/176/176 134/166/166 +f 134/166/166 141/176/176 1431/177/177 +f 134/166/166 1431/177/177 1432/168/168 +f 10/85/85 11/87/87 142/178/178 +f 10/85/85 142/178/178 135/170/170 +f 135/170/170 142/178/178 143/179/179 +f 135/170/170 143/179/179 136/171/171 +f 136/171/171 143/179/179 144/180/180 +f 136/171/171 144/180/180 137/172/172 +f 137/172/172 144/180/180 145/181/181 +f 137/172/172 145/181/181 138/173/173 +f 138/173/173 145/181/181 146/182/182 +f 138/173/173 146/182/182 139/174/174 +f 139/174/174 146/182/182 147/183/183 +f 139/174/174 147/183/183 140/175/175 +f 140/175/175 147/183/183 148/184/184 +f 140/175/175 148/184/184 141/176/176 +f 141/176/176 148/184/184 1430/185/185 +f 141/176/176 1430/185/185 1431/177/177 +f 11/87/87 12/89/89 149/186/186 +f 11/87/87 149/186/186 142/178/178 +f 142/178/178 149/186/186 150/187/187 +f 142/178/178 150/187/187 143/179/179 +f 143/179/179 150/187/187 151/188/188 +f 143/179/179 151/188/188 144/180/180 +f 144/180/180 151/188/188 152/189/189 +f 144/180/180 152/189/189 145/181/181 +f 145/181/181 152/189/189 153/190/190 +f 145/181/181 153/190/190 146/182/182 +f 146/182/182 153/190/190 154/191/191 +f 146/182/182 154/191/191 147/183/183 +f 147/183/183 154/191/191 155/192/192 +f 147/183/183 155/192/192 148/184/184 +f 148/184/184 155/192/192 1429/193/193 +f 148/184/184 1429/193/193 1430/185/185 +f 12/89/89 13/91/91 156/194/194 +f 12/89/89 156/194/194 149/186/186 +f 149/186/186 156/194/194 157/195/195 +f 149/186/186 157/195/195 150/187/187 +f 150/187/187 157/195/195 158/196/196 +f 150/187/187 158/196/196 151/188/188 +f 151/188/188 158/196/196 159/197/197 +f 151/188/188 159/197/197 152/189/189 +f 152/189/189 159/197/197 160/198/198 +f 152/189/189 160/198/198 153/190/190 +f 153/190/190 160/198/198 161/199/199 +f 153/190/190 161/199/199 154/191/191 +f 154/191/191 161/199/199 162/200/200 +f 154/191/191 162/200/200 155/192/192 +f 155/192/192 162/200/200 1428/201/201 +f 155/192/192 1428/201/201 1429/193/193 +f 13/91/91 14/93/93 163/202/202 +f 13/91/91 163/202/202 156/194/194 +f 156/194/194 163/202/202 164/203/203 +f 156/194/194 164/203/203 157/195/195 +f 157/195/195 164/203/203 165/204/204 +f 157/195/195 165/204/204 158/196/196 +f 158/196/196 165/204/204 166/205/205 +f 158/196/196 166/205/205 159/197/197 +f 159/197/197 166/205/205 167/206/206 +f 159/197/197 167/206/206 160/198/198 +f 160/198/198 167/206/206 168/207/207 +f 160/198/198 168/207/207 161/199/199 +f 161/199/199 168/207/207 169/208/208 +f 161/199/199 169/208/208 162/200/200 +f 162/200/200 169/208/208 1427/209/209 +f 162/200/200 1427/209/209 1428/201/201 +f 14/93/93 15/95/95 170/210/210 +f 14/93/93 170/210/210 163/202/202 +f 163/202/202 170/210/210 171/211/211 +f 163/202/202 171/211/211 164/203/203 +f 164/203/203 171/211/211 172/212/212 +f 164/203/203 172/212/212 165/204/204 +f 165/204/204 172/212/212 173/213/213 +f 165/204/204 173/213/213 166/205/205 +f 166/205/205 173/213/213 174/214/214 +f 166/205/205 174/214/214 167/206/206 +f 167/206/206 174/214/214 175/215/215 +f 167/206/206 175/215/215 168/207/207 +f 168/207/207 175/215/215 176/216/216 +f 168/207/207 176/216/216 169/208/208 +f 169/208/208 176/216/216 1426/217/217 +f 169/208/208 1426/217/217 1427/209/209 +f 15/95/95 1403/97/97 1404/218/218 +f 15/95/95 1404/218/218 170/210/210 +f 170/210/210 1404/218/218 1405/219/219 +f 170/210/210 1405/219/219 171/211/211 +f 171/211/211 1405/219/219 1406/220/220 +f 171/211/211 1406/220/220 172/212/212 +f 172/212/212 1406/220/220 1407/221/221 +f 172/212/212 1407/221/221 173/213/213 +f 173/213/213 1407/221/221 1408/222/222 +f 173/213/213 1408/222/222 174/214/214 +f 174/214/214 1408/222/222 1409/223/223 +f 174/214/214 1409/223/223 175/215/215 +f 175/215/215 1409/223/223 1410/224/224 +f 175/215/215 1410/224/224 176/216/216 +f 176/216/216 1410/224/224 1533/225/225 +f 176/216/216 1533/225/225 1426/217/217 +f 1/1/1 16/155/155 177/226/226 +f 1/1/1 177/226/226 23/2/2 +f 23/2/2 177/226/226 178/227/227 +f 23/2/2 178/227/227 24/19/19 +f 24/19/19 178/227/227 179/228/228 +f 24/19/19 179/228/228 25/28/28 +f 25/28/28 179/228/228 180/229/229 +f 25/28/28 180/229/229 26/37/37 +f 26/37/37 180/229/229 181/230/230 +f 26/37/37 181/230/230 27/46/46 +f 27/46/46 181/230/230 182/231/231 +f 27/46/46 182/231/231 28/55/55 +f 28/55/55 182/231/231 183/232/232 +f 28/55/55 183/232/232 29/64/64 +f 29/64/64 183/232/232 1374/233/233 +f 29/64/64 1374/233/233 1373/73/73 +f 16/155/155 17/157/157 184/234/234 +f 16/155/155 184/234/234 177/226/226 +f 177/226/226 184/234/234 185/235/235 +f 177/226/226 185/235/235 178/227/227 +f 178/227/227 185/235/235 186/236/236 +f 178/227/227 186/236/236 179/228/228 +f 179/228/228 186/236/236 187/237/237 +f 179/228/228 187/237/237 180/229/229 +f 180/229/229 187/237/237 188/238/238 +f 180/229/229 188/238/238 181/230/230 +f 181/230/230 188/238/238 189/239/239 +f 181/230/230 189/239/239 182/231/231 +f 182/231/231 189/239/239 190/240/240 +f 182/231/231 190/240/240 183/232/232 +f 183/232/232 190/240/240 1375/241/241 +f 183/232/232 1375/241/241 1374/233/233 +f 17/157/157 18/159/159 191/242/242 +f 17/157/157 191/242/242 184/234/234 +f 184/234/234 191/242/242 192/243/243 +f 184/234/234 192/243/243 185/235/235 +f 185/235/235 192/243/243 193/244/244 +f 185/235/235 193/244/244 186/236/236 +f 186/236/236 193/244/244 194/245/245 +f 186/236/236 194/245/245 187/237/237 +f 187/237/237 194/245/245 195/246/246 +f 187/237/237 195/246/246 188/238/238 +f 188/238/238 195/246/246 196/247/247 +f 188/238/238 196/247/247 189/239/239 +f 189/239/239 196/247/247 197/248/248 +f 189/239/239 197/248/248 190/240/240 +f 190/240/240 197/248/248 1376/249/249 +f 190/240/240 1376/249/249 1375/241/241 +f 18/159/159 19/161/161 198/250/250 +f 18/159/159 198/250/250 191/242/242 +f 191/242/242 198/250/250 199/251/251 +f 191/242/242 199/251/251 192/243/243 +f 192/243/243 199/251/251 200/252/252 +f 192/243/243 200/252/252 193/244/244 +f 193/244/244 200/252/252 201/253/253 +f 193/244/244 201/253/253 194/245/245 +f 194/245/245 201/253/253 202/254/254 +f 194/245/245 202/254/254 195/246/246 +f 195/246/246 202/254/254 203/255/255 +f 195/246/246 203/255/255 196/247/247 +f 196/247/247 203/255/255 204/256/256 +f 196/247/247 204/256/256 197/248/248 +f 197/248/248 204/256/256 1377/257/257 +f 197/248/248 1377/257/257 1376/249/249 +f 19/161/161 20/163/163 205/258/258 +f 19/161/161 205/258/258 198/250/250 +f 198/250/250 205/258/258 206/259/259 +f 198/250/250 206/259/259 199/251/251 +f 199/251/251 206/259/259 207/260/260 +f 199/251/251 207/260/260 200/252/252 +f 200/252/252 207/260/260 208/261/261 +f 200/252/252 208/261/261 201/253/253 +f 201/253/253 208/261/261 209/262/262 +f 201/253/253 209/262/262 202/254/254 +f 202/254/254 209/262/262 210/263/263 +f 202/254/254 210/263/263 203/255/255 +f 203/255/255 210/263/263 211/264/264 +f 203/255/255 211/264/264 204/256/256 +f 204/256/256 211/264/264 1378/265/265 +f 204/256/256 1378/265/265 1377/257/257 +f 20/163/163 21/165/165 212/266/266 +f 20/163/163 212/266/266 205/258/258 +f 205/258/258 212/266/266 213/267/267 +f 205/258/258 213/267/267 206/259/259 +f 206/259/259 213/267/267 214/268/268 +f 206/259/259 214/268/268 207/260/260 +f 207/260/260 214/268/268 215/269/269 +f 207/260/260 215/269/269 208/261/261 +f 208/261/261 215/269/269 216/270/270 +f 208/261/261 216/270/270 209/262/262 +f 209/262/262 216/270/270 217/271/271 +f 209/262/262 217/271/271 210/263/263 +f 210/263/263 217/271/271 218/272/272 +f 210/263/263 218/272/272 211/264/264 +f 211/264/264 218/272/272 1379/273/273 +f 211/264/264 1379/273/273 1378/265/265 +f 21/165/165 22/167/167 219/274/274 +f 21/165/165 219/274/274 212/266/266 +f 212/266/266 219/274/274 220/275/275 +f 212/266/266 220/275/275 213/267/267 +f 213/267/267 220/275/275 221/276/276 +f 213/267/267 221/276/276 214/268/268 +f 214/268/268 221/276/276 222/277/277 +f 214/268/268 222/277/277 215/269/269 +f 215/269/269 222/277/277 223/278/278 +f 215/269/269 223/278/278 216/270/270 +f 216/270/270 223/278/278 224/279/279 +f 216/270/270 224/279/279 217/271/271 +f 217/271/271 224/279/279 225/280/280 +f 217/271/271 225/280/280 218/272/272 +f 218/272/272 225/280/280 1380/281/281 +f 218/272/272 1380/281/281 1379/273/273 +f 22/167/167 1433/169/169 1434/282/282 +f 22/167/167 1434/282/282 219/274/274 +f 219/274/274 1434/282/282 1435/283/283 +f 219/274/274 1435/283/283 220/275/275 +f 220/275/275 1435/283/283 1436/284/284 +f 220/275/275 1436/284/284 221/276/276 +f 221/276/276 1436/284/284 1437/285/285 +f 221/276/276 1437/285/285 222/277/277 +f 222/277/277 1437/285/285 1438/286/286 +f 222/277/277 1438/286/286 223/278/278 +f 223/278/278 1438/286/286 1439/287/287 +f 223/278/278 1439/287/287 224/279/279 +f 224/279/279 1439/287/287 1440/288/288 +f 224/279/279 1440/288/288 225/280/280 +f 225/280/280 1440/288/288 1534/289/289 +f 225/280/280 1534/289/289 1380/281/281 +f 226/290/290 248/291/291 255/292/292 +f 226/290/290 255/292/292 227/293/293 +f 227/293/293 255/292/292 256/294/294 +f 227/293/293 256/294/294 228/295/295 +f 228/295/295 256/294/294 257/296/296 +f 228/295/295 257/296/296 229/297/297 +f 229/297/297 257/296/296 258/298/298 +f 229/297/297 258/298/298 230/299/299 +f 230/299/299 258/298/298 259/300/300 +f 230/299/299 259/300/300 231/301/301 +f 231/301/301 259/300/300 260/302/302 +f 231/301/301 260/302/302 232/303/303 +f 232/303/303 260/302/302 261/304/304 +f 232/303/303 261/304/304 233/305/305 +f 233/305/305 261/304/304 1492/306/306 +f 233/305/305 1492/306/306 1493/307/307 +f 248/291/291 249/308/308 262/309/309 +f 248/291/291 262/309/309 255/292/292 +f 255/292/292 262/309/309 263/310/310 +f 255/292/292 263/310/310 256/294/294 +f 256/294/294 263/310/310 264/311/311 +f 256/294/294 264/311/311 257/296/296 +f 257/296/296 264/311/311 265/312/312 +f 257/296/296 265/312/312 258/298/298 +f 258/298/298 265/312/312 266/313/313 +f 258/298/298 266/313/313 259/300/300 +f 259/300/300 266/313/313 267/314/314 +f 259/300/300 267/314/314 260/302/302 +f 260/302/302 267/314/314 268/315/315 +f 260/302/302 268/315/315 261/304/304 +f 261/304/304 268/315/315 1491/316/316 +f 261/304/304 1491/316/316 1492/306/306 +f 249/308/308 250/317/317 269/318/318 +f 249/308/308 269/318/318 262/309/309 +f 262/309/309 269/318/318 270/319/319 +f 262/309/309 270/319/319 263/310/310 +f 263/310/310 270/319/319 271/320/320 +f 263/310/310 271/320/320 264/311/311 +f 264/311/311 271/320/320 272/321/321 +f 264/311/311 272/321/321 265/312/312 +f 265/312/312 272/321/321 273/322/322 +f 265/312/312 273/322/322 266/313/313 +f 266/313/313 273/322/322 274/323/323 +f 266/313/313 274/323/323 267/314/314 +f 267/314/314 274/323/323 275/324/324 +f 267/314/314 275/324/324 268/315/315 +f 268/315/315 275/324/324 1490/325/325 +f 268/315/315 1490/325/325 1491/316/316 +f 250/317/317 251/326/326 276/327/327 +f 250/317/317 276/327/327 269/318/318 +f 269/318/318 276/327/327 277/328/328 +f 269/318/318 277/328/328 270/319/319 +f 270/319/319 277/328/328 278/329/329 +f 270/319/319 278/329/329 271/320/320 +f 271/320/320 278/329/329 279/330/330 +f 271/320/320 279/330/330 272/321/321 +f 272/321/321 279/330/330 280/331/331 +f 272/321/321 280/331/331 273/322/322 +f 273/322/322 280/331/331 281/332/332 +f 273/322/322 281/332/332 274/323/323 +f 274/323/323 281/332/332 282/333/333 +f 274/323/323 282/333/333 275/324/324 +f 275/324/324 282/333/333 1489/334/334 +f 275/324/324 1489/334/334 1490/325/325 +f 251/326/326 252/335/335 283/336/336 +f 251/326/326 283/336/336 276/327/327 +f 276/327/327 283/336/336 284/337/337 +f 276/327/327 284/337/337 277/328/328 +f 277/328/328 284/337/337 285/338/338 +f 277/328/328 285/338/338 278/329/329 +f 278/329/329 285/338/338 286/339/339 +f 278/329/329 286/339/339 279/330/330 +f 279/330/330 286/339/339 287/340/340 +f 279/330/330 287/340/340 280/331/331 +f 280/331/331 287/340/340 288/341/341 +f 280/331/331 288/341/341 281/332/332 +f 281/332/332 288/341/341 289/342/342 +f 281/332/332 289/342/342 282/333/333 +f 282/333/333 289/342/342 1488/343/343 +f 282/333/333 1488/343/343 1489/334/334 +f 252/335/335 253/344/344 290/345/345 +f 252/335/335 290/345/345 283/336/336 +f 283/336/336 290/345/345 291/346/346 +f 283/336/336 291/346/346 284/337/337 +f 284/337/337 291/346/346 292/347/347 +f 284/337/337 292/347/347 285/338/338 +f 285/338/338 292/347/347 293/348/348 +f 285/338/338 293/348/348 286/339/339 +f 286/339/339 293/348/348 294/349/349 +f 286/339/339 294/349/349 287/340/340 +f 287/340/340 294/349/349 295/350/350 +f 287/340/340 295/350/350 288/341/341 +f 288/341/341 295/350/350 296/351/351 +f 288/341/341 296/351/351 289/342/342 +f 289/342/342 296/351/351 1487/352/352 +f 289/342/342 1487/352/352 1488/343/343 +f 253/344/344 254/353/353 297/354/354 +f 253/344/344 297/354/354 290/345/345 +f 290/345/345 297/354/354 298/355/355 +f 290/345/345 298/355/355 291/346/346 +f 291/346/346 298/355/355 299/356/356 +f 291/346/346 299/356/356 292/347/347 +f 292/347/347 299/356/356 300/357/357 +f 292/347/347 300/357/357 293/348/348 +f 293/348/348 300/357/357 301/358/358 +f 293/348/348 301/358/358 294/349/349 +f 294/349/349 301/358/358 302/359/359 +f 294/349/349 302/359/359 295/350/350 +f 295/350/350 302/359/359 303/360/360 +f 295/350/350 303/360/360 296/351/351 +f 296/351/351 303/360/360 1486/361/361 +f 296/351/351 1486/361/361 1487/352/352 +f 254/353/353 1478/362/362 1477/363/363 +f 254/353/353 1477/363/363 297/354/354 +f 297/354/354 1477/363/363 1476/364/364 +f 297/354/354 1476/364/364 298/355/355 +f 298/355/355 1476/364/364 1475/365/365 +f 298/355/355 1475/365/365 299/356/356 +f 299/356/356 1475/365/365 1474/366/366 +f 299/356/356 1474/366/366 300/357/357 +f 300/357/357 1474/366/366 1473/367/367 +f 300/357/357 1473/367/367 301/358/358 +f 301/358/358 1473/367/367 1472/368/368 +f 301/358/358 1472/368/368 302/359/359 +f 302/359/359 1472/368/368 1471/369/369 +f 302/359/359 1471/369/369 303/360/360 +f 303/360/360 1471/369/369 1535/370/370 +f 303/360/360 1535/370/370 1486/361/361 +f 226/290/290 227/293/293 304/371/371 +f 226/290/290 304/371/371 234/372/372 +f 234/372/372 304/371/371 305/373/373 +f 234/372/372 305/373/373 235/374/374 +f 235/374/374 305/373/373 306/375/375 +f 235/374/374 306/375/375 236/376/376 +f 236/376/376 306/375/375 307/377/377 +f 236/376/376 307/377/377 237/378/378 +f 237/378/378 307/377/377 308/379/379 +f 237/378/378 308/379/379 238/380/380 +f 238/380/380 308/379/379 309/381/381 +f 238/380/380 309/381/381 239/382/382 +f 239/382/382 309/381/381 310/383/383 +f 239/382/382 310/383/383 240/384/384 +f 240/384/384 310/383/383 1524/385/385 +f 240/384/384 1524/385/385 1523/386/386 +f 227/293/293 228/295/295 311/387/387 +f 227/293/293 311/387/387 304/371/371 +f 304/371/371 311/387/387 312/388/388 +f 304/371/371 312/388/388 305/373/373 +f 305/373/373 312/388/388 313/389/389 +f 305/373/373 313/389/389 306/375/375 +f 306/375/375 313/389/389 314/390/390 +f 306/375/375 314/390/390 307/377/377 +f 307/377/377 314/390/390 315/391/391 +f 307/377/377 315/391/391 308/379/379 +f 308/379/379 315/391/391 316/392/392 +f 308/379/379 316/392/392 309/381/381 +f 309/381/381 316/392/392 317/393/393 +f 309/381/381 317/393/393 310/383/383 +f 310/383/383 317/393/393 1525/394/394 +f 310/383/383 1525/394/394 1524/385/385 +f 228/295/295 229/297/297 318/395/395 +f 228/295/295 318/395/395 311/387/387 +f 311/387/387 318/395/395 319/396/396 +f 311/387/387 319/396/396 312/388/388 +f 312/388/388 319/396/396 320/397/397 +f 312/388/388 320/397/397 313/389/389 +f 313/389/389 320/397/397 321/398/398 +f 313/389/389 321/398/398 314/390/390 +f 314/390/390 321/398/398 322/399/399 +f 314/390/390 322/399/399 315/391/391 +f 315/391/391 322/399/399 323/400/400 +f 315/391/391 323/400/400 316/392/392 +f 316/392/392 323/400/400 324/401/401 +f 316/392/392 324/401/401 317/393/393 +f 317/393/393 324/401/401 1526/402/402 +f 317/393/393 1526/402/402 1525/394/394 +f 229/297/297 230/299/299 325/403/403 +f 229/297/297 325/403/403 318/395/395 +f 318/395/395 325/403/403 326/404/404 +f 318/395/395 326/404/404 319/396/396 +f 319/396/396 326/404/404 327/405/405 +f 319/396/396 327/405/405 320/397/397 +f 320/397/397 327/405/405 328/406/406 +f 320/397/397 328/406/406 321/398/398 +f 321/398/398 328/406/406 329/407/407 +f 321/398/398 329/407/407 322/399/399 +f 322/399/399 329/407/407 330/408/408 +f 322/399/399 330/408/408 323/400/400 +f 323/400/400 330/408/408 331/409/409 +f 323/400/400 331/409/409 324/401/401 +f 324/401/401 331/409/409 1527/410/410 +f 324/401/401 1527/410/410 1526/402/402 +f 230/299/299 231/301/301 332/411/411 +f 230/299/299 332/411/411 325/403/403 +f 325/403/403 332/411/411 333/412/412 +f 325/403/403 333/412/412 326/404/404 +f 326/404/404 333/412/412 334/413/413 +f 326/404/404 334/413/413 327/405/405 +f 327/405/405 334/413/413 335/414/414 +f 327/405/405 335/414/414 328/406/406 +f 328/406/406 335/414/414 336/415/415 +f 328/406/406 336/415/415 329/407/407 +f 329/407/407 336/415/415 337/416/416 +f 329/407/407 337/416/416 330/408/408 +f 330/408/408 337/416/416 338/417/417 +f 330/408/408 338/417/417 331/409/409 +f 331/409/409 338/417/417 1528/418/418 +f 331/409/409 1528/418/418 1527/410/410 +f 231/301/301 232/303/303 339/419/419 +f 231/301/301 339/419/419 332/411/411 +f 332/411/411 339/419/419 340/420/420 +f 332/411/411 340/420/420 333/412/412 +f 333/412/412 340/420/420 341/421/421 +f 333/412/412 341/421/421 334/413/413 +f 334/413/413 341/421/421 342/422/422 +f 334/413/413 342/422/422 335/414/414 +f 335/414/414 342/422/422 343/423/423 +f 335/414/414 343/423/423 336/415/415 +f 336/415/415 343/423/423 344/424/424 +f 336/415/415 344/424/424 337/416/416 +f 337/416/416 344/424/424 345/425/425 +f 337/416/416 345/425/425 338/417/417 +f 338/417/417 345/425/425 1529/426/426 +f 338/417/417 1529/426/426 1528/418/418 +f 232/303/303 233/305/305 346/427/427 +f 232/303/303 346/427/427 339/419/419 +f 339/419/419 346/427/427 347/428/428 +f 339/419/419 347/428/428 340/420/420 +f 340/420/420 347/428/428 348/429/429 +f 340/420/420 348/429/429 341/421/421 +f 341/421/421 348/429/429 349/430/430 +f 341/421/421 349/430/430 342/422/422 +f 342/422/422 349/430/430 350/431/431 +f 342/422/422 350/431/431 343/423/423 +f 343/423/423 350/431/431 351/432/432 +f 343/423/423 351/432/432 344/424/424 +f 344/424/424 351/432/432 352/433/433 +f 344/424/424 352/433/433 345/425/425 +f 345/425/425 352/433/433 1530/434/434 +f 345/425/425 1530/434/434 1529/426/426 +f 233/305/305 1493/307/307 1494/435/435 +f 233/305/305 1494/435/435 346/427/427 +f 346/427/427 1494/435/435 1495/436/436 +f 346/427/427 1495/436/436 347/428/428 +f 347/428/428 1495/436/436 1496/437/437 +f 347/428/428 1496/437/437 348/429/429 +f 348/429/429 1496/437/437 1497/438/438 +f 348/429/429 1497/438/438 349/430/430 +f 349/430/430 1497/438/438 1498/439/439 +f 349/430/430 1498/439/439 350/431/431 +f 350/431/431 1498/439/439 1499/440/440 +f 350/431/431 1499/440/440 351/432/432 +f 351/432/432 1499/440/440 1500/441/441 +f 351/432/432 1500/441/441 352/433/433 +f 352/433/433 1500/441/441 1538/442/442 +f 352/433/433 1538/442/442 1530/434/434 +f 226/290/290 234/372/372 353/443/443 +f 226/290/290 353/443/443 241/444/444 +f 241/444/444 353/443/443 354/445/445 +f 241/444/444 354/445/445 242/446/446 +f 242/446/446 354/445/445 355/447/447 +f 242/446/446 355/447/447 243/448/448 +f 243/448/448 355/447/447 356/449/449 +f 243/448/448 356/449/449 244/450/450 +f 244/450/450 356/449/449 357/451/451 +f 244/450/450 357/451/451 245/452/452 +f 245/452/452 357/451/451 358/453/453 +f 245/452/452 358/453/453 246/454/454 +f 246/454/454 358/453/453 359/455/455 +f 246/454/454 359/455/455 247/456/456 +f 247/456/456 359/455/455 1509/457/457 +f 247/456/456 1509/457/457 1508/458/458 +f 234/372/372 235/374/374 360/459/459 +f 234/372/372 360/459/459 353/443/443 +f 353/443/443 360/459/459 361/460/460 +f 353/443/443 361/460/460 354/445/445 +f 354/445/445 361/460/460 362/461/461 +f 354/445/445 362/461/461 355/447/447 +f 355/447/447 362/461/461 363/462/462 +f 355/447/447 363/462/462 356/449/449 +f 356/449/449 363/462/462 364/463/463 +f 356/449/449 364/463/463 357/451/451 +f 357/451/451 364/463/463 365/464/464 +f 357/451/451 365/464/464 358/453/453 +f 358/453/453 365/464/464 366/465/465 +f 358/453/453 366/465/465 359/455/455 +f 359/455/455 366/465/465 1510/466/466 +f 359/455/455 1510/466/466 1509/457/457 +f 235/374/374 236/376/376 367/467/467 +f 235/374/374 367/467/467 360/459/459 +f 360/459/459 367/467/467 368/468/468 +f 360/459/459 368/468/468 361/460/460 +f 361/460/460 368/468/468 369/469/469 +f 361/460/460 369/469/469 362/461/461 +f 362/461/461 369/469/469 370/470/470 +f 362/461/461 370/470/470 363/462/462 +f 363/462/462 370/470/470 371/471/471 +f 363/462/462 371/471/471 364/463/463 +f 364/463/463 371/471/471 372/472/472 +f 364/463/463 372/472/472 365/464/464 +f 365/464/464 372/472/472 373/473/473 +f 365/464/464 373/473/473 366/465/465 +f 366/465/465 373/473/473 1511/474/474 +f 366/465/465 1511/474/474 1510/466/466 +f 236/376/376 237/378/378 374/475/475 +f 236/376/376 374/475/475 367/467/467 +f 367/467/467 374/475/475 375/476/476 +f 367/467/467 375/476/476 368/468/468 +f 368/468/468 375/476/476 376/477/477 +f 368/468/468 376/477/477 369/469/469 +f 369/469/469 376/477/477 377/478/478 +f 369/469/469 377/478/478 370/470/470 +f 370/470/470 377/478/478 378/479/479 +f 370/470/470 378/479/479 371/471/471 +f 371/471/471 378/479/479 379/480/480 +f 371/471/471 379/480/480 372/472/472 +f 372/472/472 379/480/480 380/481/481 +f 372/472/472 380/481/481 373/473/473 +f 373/473/473 380/481/481 1512/482/482 +f 373/473/473 1512/482/482 1511/474/474 +f 237/378/378 238/380/380 381/483/483 +f 237/378/378 381/483/483 374/475/475 +f 374/475/475 381/483/483 382/484/484 +f 374/475/475 382/484/484 375/476/476 +f 375/476/476 382/484/484 383/485/485 +f 375/476/476 383/485/485 376/477/477 +f 376/477/477 383/485/485 384/486/486 +f 376/477/477 384/486/486 377/478/478 +f 377/478/478 384/486/486 385/487/487 +f 377/478/478 385/487/487 378/479/479 +f 378/479/479 385/487/487 386/488/488 +f 378/479/479 386/488/488 379/480/480 +f 379/480/480 386/488/488 387/489/489 +f 379/480/480 387/489/489 380/481/481 +f 380/481/481 387/489/489 1513/490/490 +f 380/481/481 1513/490/490 1512/482/482 +f 238/380/380 239/382/382 388/491/491 +f 238/380/380 388/491/491 381/483/483 +f 381/483/483 388/491/491 389/492/492 +f 381/483/483 389/492/492 382/484/484 +f 382/484/484 389/492/492 390/493/493 +f 382/484/484 390/493/493 383/485/485 +f 383/485/485 390/493/493 391/494/494 +f 383/485/485 391/494/494 384/486/486 +f 384/486/486 391/494/494 392/495/495 +f 384/486/486 392/495/495 385/487/487 +f 385/487/487 392/495/495 393/496/496 +f 385/487/487 393/496/496 386/488/488 +f 386/488/488 393/496/496 394/497/497 +f 386/488/488 394/497/497 387/489/489 +f 387/489/489 394/497/497 1514/498/498 +f 387/489/489 1514/498/498 1513/490/490 +f 239/382/382 240/384/384 395/499/499 +f 239/382/382 395/499/499 388/491/491 +f 388/491/491 395/499/499 396/500/500 +f 388/491/491 396/500/500 389/492/492 +f 389/492/492 396/500/500 397/501/501 +f 389/492/492 397/501/501 390/493/493 +f 390/493/493 397/501/501 398/502/502 +f 390/493/493 398/502/502 391/494/494 +f 391/494/494 398/502/502 399/503/503 +f 391/494/494 399/503/503 392/495/495 +f 392/495/495 399/503/503 400/504/504 +f 392/495/495 400/504/504 393/496/496 +f 393/496/496 400/504/504 401/505/505 +f 393/496/496 401/505/505 394/497/497 +f 394/497/497 401/505/505 1515/506/506 +f 394/497/497 1515/506/506 1514/498/498 +f 240/384/384 1523/386/386 1522/507/507 +f 240/384/384 1522/507/507 395/499/499 +f 395/499/499 1522/507/507 1521/508/508 +f 395/499/499 1521/508/508 396/500/500 +f 396/500/500 1521/508/508 1520/509/509 +f 396/500/500 1520/509/509 397/501/501 +f 397/501/501 1520/509/509 1519/510/510 +f 397/501/501 1519/510/510 398/502/502 +f 398/502/502 1519/510/510 1518/511/511 +f 398/502/502 1518/511/511 399/503/503 +f 399/503/503 1518/511/511 1517/512/512 +f 399/503/503 1517/512/512 400/504/504 +f 400/504/504 1517/512/512 1516/513/513 +f 400/504/504 1516/513/513 401/505/505 +f 401/505/505 1516/513/513 1537/153/514 +f 401/505/505 1537/153/514 1515/506/506 +f 226/290/290 241/444/444 402/514/515 +f 226/290/290 402/514/515 248/291/291 +f 248/291/291 402/514/515 403/515/516 +f 248/291/291 403/515/516 249/308/308 +f 249/308/308 403/515/516 404/516/517 +f 249/308/308 404/516/517 250/317/317 +f 250/317/317 404/516/517 405/517/518 +f 250/317/317 405/517/518 251/326/326 +f 251/326/326 405/517/518 406/518/519 +f 251/326/326 406/518/519 252/335/335 +f 252/335/335 406/518/519 407/519/520 +f 252/335/335 407/519/520 253/344/344 +f 253/344/344 407/519/520 408/520/521 +f 253/344/344 408/520/521 254/353/353 +f 254/353/353 408/520/521 1479/521/522 +f 254/353/353 1479/521/522 1478/362/362 +f 241/444/444 242/446/446 409/522/523 +f 241/444/444 409/522/523 402/514/515 +f 402/514/515 409/522/523 410/523/524 +f 402/514/515 410/523/524 403/515/516 +f 403/515/516 410/523/524 411/524/525 +f 403/515/516 411/524/525 404/516/517 +f 404/516/517 411/524/525 412/525/526 +f 404/516/517 412/525/526 405/517/518 +f 405/517/518 412/525/526 413/526/527 +f 405/517/518 413/526/527 406/518/519 +f 406/518/519 413/526/527 414/527/528 +f 406/518/519 414/527/528 407/519/520 +f 407/519/520 414/527/528 415/528/529 +f 407/519/520 415/528/529 408/520/521 +f 408/520/521 415/528/529 1480/529/530 +f 408/520/521 1480/529/530 1479/521/522 +f 242/446/446 243/448/448 416/530/531 +f 242/446/446 416/530/531 409/522/523 +f 409/522/523 416/530/531 417/531/532 +f 409/522/523 417/531/532 410/523/524 +f 410/523/524 417/531/532 418/532/533 +f 410/523/524 418/532/533 411/524/525 +f 411/524/525 418/532/533 419/533/534 +f 411/524/525 419/533/534 412/525/526 +f 412/525/526 419/533/534 420/534/535 +f 412/525/526 420/534/535 413/526/527 +f 413/526/527 420/534/535 421/535/536 +f 413/526/527 421/535/536 414/527/528 +f 414/527/528 421/535/536 422/536/537 +f 414/527/528 422/536/537 415/528/529 +f 415/528/529 422/536/537 1481/537/538 +f 415/528/529 1481/537/538 1480/529/530 +f 243/448/448 244/450/450 423/538/539 +f 243/448/448 423/538/539 416/530/531 +f 416/530/531 423/538/539 424/539/540 +f 416/530/531 424/539/540 417/531/532 +f 417/531/532 424/539/540 425/540/541 +f 417/531/532 425/540/541 418/532/533 +f 418/532/533 425/540/541 426/541/542 +f 418/532/533 426/541/542 419/533/534 +f 419/533/534 426/541/542 427/542/543 +f 419/533/534 427/542/543 420/534/535 +f 420/534/535 427/542/543 428/543/544 +f 420/534/535 428/543/544 421/535/536 +f 421/535/536 428/543/544 429/544/545 +f 421/535/536 429/544/545 422/536/537 +f 422/536/537 429/544/545 1482/545/546 +f 422/536/537 1482/545/546 1481/537/538 +f 244/450/450 245/452/452 430/546/547 +f 244/450/450 430/546/547 423/538/539 +f 423/538/539 430/546/547 431/547/548 +f 423/538/539 431/547/548 424/539/540 +f 424/539/540 431/547/548 432/548/549 +f 424/539/540 432/548/549 425/540/541 +f 425/540/541 432/548/549 433/549/550 +f 425/540/541 433/549/550 426/541/542 +f 426/541/542 433/549/550 434/550/551 +f 426/541/542 434/550/551 427/542/543 +f 427/542/543 434/550/551 435/551/552 +f 427/542/543 435/551/552 428/543/544 +f 428/543/544 435/551/552 436/552/553 +f 428/543/544 436/552/553 429/544/545 +f 429/544/545 436/552/553 1483/553/554 +f 429/544/545 1483/553/554 1482/545/546 +f 245/452/452 246/454/454 437/554/555 +f 245/452/452 437/554/555 430/546/547 +f 430/546/547 437/554/555 438/555/556 +f 430/546/547 438/555/556 431/547/548 +f 431/547/548 438/555/556 439/556/557 +f 431/547/548 439/556/557 432/548/549 +f 432/548/549 439/556/557 440/557/558 +f 432/548/549 440/557/558 433/549/550 +f 433/549/550 440/557/558 441/558/559 +f 433/549/550 441/558/559 434/550/551 +f 434/550/551 441/558/559 442/559/560 +f 434/550/551 442/559/560 435/551/552 +f 435/551/552 442/559/560 443/560/561 +f 435/551/552 443/560/561 436/552/553 +f 436/552/553 443/560/561 1484/561/562 +f 436/552/553 1484/561/562 1483/553/554 +f 246/454/454 247/456/456 444/562/563 +f 246/454/454 444/562/563 437/554/555 +f 437/554/555 444/562/563 445/563/564 +f 437/554/555 445/563/564 438/555/556 +f 438/555/556 445/563/564 446/564/565 +f 438/555/556 446/564/565 439/556/557 +f 439/556/557 446/564/565 447/565/566 +f 439/556/557 447/565/566 440/557/558 +f 440/557/558 447/565/566 448/566/567 +f 440/557/558 448/566/567 441/558/559 +f 441/558/559 448/566/567 449/567/568 +f 441/558/559 449/567/568 442/559/560 +f 442/559/560 449/567/568 450/568/569 +f 442/559/560 450/568/569 443/560/561 +f 443/560/561 450/568/569 1485/569/570 +f 443/560/561 1485/569/570 1484/561/562 +f 247/456/456 1508/458/458 1507/570/571 +f 247/456/456 1507/570/571 444/562/563 +f 444/562/563 1507/570/571 1506/571/572 +f 444/562/563 1506/571/572 445/563/564 +f 445/563/564 1506/571/572 1505/572/573 +f 445/563/564 1505/572/573 446/564/565 +f 446/564/565 1505/572/573 1504/573/574 +f 446/564/565 1504/573/574 447/565/566 +f 447/565/566 1504/573/574 1503/574/575 +f 447/565/566 1503/574/575 448/566/567 +f 448/566/567 1503/574/575 1502/575/576 +f 448/566/567 1502/575/576 449/567/568 +f 449/567/568 1502/575/576 1501/576/577 +f 449/567/568 1501/576/577 450/568/569 +f 450/568/569 1501/576/577 1536/577/578 +f 450/568/569 1536/577/578 1485/569/570 +f 451/578/579 473/579/580 480/580/581 +f 451/578/579 480/580/581 452/581/582 +f 452/581/582 480/580/581 481/582/583 +f 452/581/582 481/582/583 453/583/584 +f 453/583/584 481/582/583 482/584/585 +f 453/583/584 482/584/585 454/585/586 +f 454/585/586 482/584/585 483/586/587 +f 454/585/586 483/586/587 455/587/588 +f 455/587/588 483/586/587 484/588/589 +f 455/587/588 484/588/589 456/589/590 +f 456/589/590 484/588/589 485/590/591 +f 456/589/590 485/590/591 457/591/592 +f 457/591/592 485/590/591 486/592/593 +f 457/591/592 486/592/593 458/593/594 +f 458/593/594 486/592/593 1387/594/595 +f 458/593/594 1387/594/595 1388/595/596 +f 473/579/580 474/596/597 487/597/598 +f 473/579/580 487/597/598 480/580/581 +f 480/580/581 487/597/598 488/598/599 +f 480/580/581 488/598/599 481/582/583 +f 481/582/583 488/598/599 489/599/600 +f 481/582/583 489/599/600 482/584/585 +f 482/584/585 489/599/600 490/600/601 +f 482/584/585 490/600/601 483/586/587 +f 483/586/587 490/600/601 491/601/602 +f 483/586/587 491/601/602 484/588/589 +f 484/588/589 491/601/602 492/602/603 +f 484/588/589 492/602/603 485/590/591 +f 485/590/591 492/602/603 493/603/604 +f 485/590/591 493/603/604 486/592/593 +f 486/592/593 493/603/604 1386/604/605 +f 486/592/593 1386/604/605 1387/594/595 +f 474/596/597 475/605/606 494/606/607 +f 474/596/597 494/606/607 487/597/598 +f 487/597/598 494/606/607 495/607/608 +f 487/597/598 495/607/608 488/598/599 +f 488/598/599 495/607/608 496/608/609 +f 488/598/599 496/608/609 489/599/600 +f 489/599/600 496/608/609 497/609/610 +f 489/599/600 497/609/610 490/600/601 +f 490/600/601 497/609/610 498/610/611 +f 490/600/601 498/610/611 491/601/602 +f 491/601/602 498/610/611 499/611/612 +f 491/601/602 499/611/612 492/602/603 +f 492/602/603 499/611/612 500/612/613 +f 492/602/603 500/612/613 493/603/604 +f 493/603/604 500/612/613 1385/613/614 +f 493/603/604 1385/613/614 1386/604/605 +f 475/605/606 476/614/615 501/615/616 +f 475/605/606 501/615/616 494/606/607 +f 494/606/607 501/615/616 502/616/617 +f 494/606/607 502/616/617 495/607/608 +f 495/607/608 502/616/617 503/617/618 +f 495/607/608 503/617/618 496/608/609 +f 496/608/609 503/617/618 504/618/619 +f 496/608/609 504/618/619 497/609/610 +f 497/609/610 504/618/619 505/619/620 +f 497/609/610 505/619/620 498/610/611 +f 498/610/611 505/619/620 506/620/621 +f 498/610/611 506/620/621 499/611/612 +f 499/611/612 506/620/621 507/621/622 +f 499/611/612 507/621/622 500/612/613 +f 500/612/613 507/621/622 1384/622/623 +f 500/612/613 1384/622/623 1385/613/614 +f 476/614/615 477/623/624 508/624/625 +f 476/614/615 508/624/625 501/615/616 +f 501/615/616 508/624/625 509/625/626 +f 501/615/616 509/625/626 502/616/617 +f 502/616/617 509/625/626 510/626/627 +f 502/616/617 510/626/627 503/617/618 +f 503/617/618 510/626/627 511/627/628 +f 503/617/618 511/627/628 504/618/619 +f 504/618/619 511/627/628 512/628/629 +f 504/618/619 512/628/629 505/619/620 +f 505/619/620 512/628/629 513/629/630 +f 505/619/620 513/629/630 506/620/621 +f 506/620/621 513/629/630 514/630/631 +f 506/620/621 514/630/631 507/621/622 +f 507/621/622 514/630/631 1383/631/632 +f 507/621/622 1383/631/632 1384/622/623 +f 477/623/624 478/632/633 515/633/634 +f 477/623/624 515/633/634 508/624/625 +f 508/624/625 515/633/634 516/634/635 +f 508/624/625 516/634/635 509/625/626 +f 509/625/626 516/634/635 517/635/636 +f 509/625/626 517/635/636 510/626/627 +f 510/626/627 517/635/636 518/636/637 +f 510/626/627 518/636/637 511/627/628 +f 511/627/628 518/636/637 519/637/638 +f 511/627/628 519/637/638 512/628/629 +f 512/628/629 519/637/638 520/638/639 +f 512/628/629 520/638/639 513/629/630 +f 513/629/630 520/638/639 521/639/640 +f 513/629/630 521/639/640 514/630/631 +f 514/630/631 521/639/640 1382/640/641 +f 514/630/631 1382/640/641 1383/631/632 +f 478/632/633 479/641/642 522/642/643 +f 478/632/633 522/642/643 515/633/634 +f 515/633/634 522/642/643 523/643/644 +f 515/633/634 523/643/644 516/634/635 +f 516/634/635 523/643/644 524/644/645 +f 516/634/635 524/644/645 517/635/636 +f 517/635/636 524/644/645 525/645/646 +f 517/635/636 525/645/646 518/636/637 +f 518/636/637 525/645/646 526/646/647 +f 518/636/637 526/646/647 519/637/638 +f 519/637/638 526/646/647 527/647/648 +f 519/637/638 527/647/648 520/638/639 +f 520/638/639 527/647/648 528/648/649 +f 520/638/639 528/648/649 521/639/640 +f 521/639/640 528/648/649 1381/649/650 +f 521/639/640 1381/649/650 1382/640/641 +f 479/641/642 1358/650/18 1357/651/17 +f 479/641/642 1357/651/17 522/642/643 +f 522/642/643 1357/651/17 1356/652/27 +f 522/642/643 1356/652/27 523/643/644 +f 523/643/644 1356/652/27 1355/653/36 +f 523/643/644 1355/653/36 524/644/645 +f 524/644/645 1355/653/36 1354/654/45 +f 524/644/645 1354/654/45 525/645/646 +f 525/645/646 1354/654/45 1353/655/54 +f 525/645/646 1353/655/54 526/646/647 +f 526/646/647 1353/655/54 1352/656/63 +f 526/646/647 1352/656/63 527/647/648 +f 527/647/648 1352/656/63 1351/657/72 +f 527/647/648 1351/657/72 528/648/649 +f 528/648/649 1351/657/72 1531/658/81 +f 528/648/649 1531/658/81 1381/649/650 +f 451/578/579 452/581/582 529/659/651 +f 451/578/579 529/659/651 459/660/652 +f 459/660/652 529/659/651 530/661/653 +f 459/660/652 530/661/653 460/662/654 +f 460/662/654 530/661/653 531/663/655 +f 460/662/654 531/663/655 461/664/656 +f 461/664/656 531/663/655 532/665/657 +f 461/664/656 532/665/657 462/666/658 +f 462/666/658 532/665/657 533/667/659 +f 462/666/658 533/667/659 463/668/660 +f 463/668/660 533/667/659 534/669/661 +f 463/668/660 534/669/661 464/670/662 +f 464/670/662 534/669/661 535/671/663 +f 464/670/662 535/671/663 465/672/664 +f 465/672/664 535/671/663 1477/673/363 +f 465/672/664 1477/673/363 1478/674/362 +f 452/581/582 453/583/584 536/675/665 +f 452/581/582 536/675/665 529/659/651 +f 529/659/651 536/675/665 537/676/666 +f 529/659/651 537/676/666 530/661/653 +f 530/661/653 537/676/666 538/677/667 +f 530/661/653 538/677/667 531/663/655 +f 531/663/655 538/677/667 539/678/668 +f 531/663/655 539/678/668 532/665/657 +f 532/665/657 539/678/668 540/679/669 +f 532/665/657 540/679/669 533/667/659 +f 533/667/659 540/679/669 541/680/670 +f 533/667/659 541/680/670 534/669/661 +f 534/669/661 541/680/670 542/681/671 +f 534/669/661 542/681/671 535/671/663 +f 535/671/663 542/681/671 1476/682/364 +f 535/671/663 1476/682/364 1477/673/363 +f 453/583/584 454/585/586 543/683/672 +f 453/583/584 543/683/672 536/675/665 +f 536/675/665 543/683/672 544/684/673 +f 536/675/665 544/684/673 537/676/666 +f 537/676/666 544/684/673 545/685/674 +f 537/676/666 545/685/674 538/677/667 +f 538/677/667 545/685/674 546/686/675 +f 538/677/667 546/686/675 539/678/668 +f 539/678/668 546/686/675 547/687/676 +f 539/678/668 547/687/676 540/679/669 +f 540/679/669 547/687/676 548/688/677 +f 540/679/669 548/688/677 541/680/670 +f 541/680/670 548/688/677 549/689/678 +f 541/680/670 549/689/678 542/681/671 +f 542/681/671 549/689/678 1475/690/365 +f 542/681/671 1475/690/365 1476/682/364 +f 454/585/586 455/587/588 550/691/679 +f 454/585/586 550/691/679 543/683/672 +f 543/683/672 550/691/679 551/692/680 +f 543/683/672 551/692/680 544/684/673 +f 544/684/673 551/692/680 552/693/681 +f 544/684/673 552/693/681 545/685/674 +f 545/685/674 552/693/681 553/694/682 +f 545/685/674 553/694/682 546/686/675 +f 546/686/675 553/694/682 554/695/683 +f 546/686/675 554/695/683 547/687/676 +f 547/687/676 554/695/683 555/696/684 +f 547/687/676 555/696/684 548/688/677 +f 548/688/677 555/696/684 556/697/685 +f 548/688/677 556/697/685 549/689/678 +f 549/689/678 556/697/685 1474/698/366 +f 549/689/678 1474/698/366 1475/690/365 +f 455/587/588 456/589/590 557/699/686 +f 455/587/588 557/699/686 550/691/679 +f 550/691/679 557/699/686 558/700/687 +f 550/691/679 558/700/687 551/692/680 +f 551/692/680 558/700/687 559/701/688 +f 551/692/680 559/701/688 552/693/681 +f 552/693/681 559/701/688 560/702/689 +f 552/693/681 560/702/689 553/694/682 +f 553/694/682 560/702/689 561/703/690 +f 553/694/682 561/703/690 554/695/683 +f 554/695/683 561/703/690 562/704/691 +f 554/695/683 562/704/691 555/696/684 +f 555/696/684 562/704/691 563/705/692 +f 555/696/684 563/705/692 556/697/685 +f 556/697/685 563/705/692 1473/706/367 +f 556/697/685 1473/706/367 1474/698/366 +f 456/589/590 457/591/592 564/707/693 +f 456/589/590 564/707/693 557/699/686 +f 557/699/686 564/707/693 565/708/694 +f 557/699/686 565/708/694 558/700/687 +f 558/700/687 565/708/694 566/709/695 +f 558/700/687 566/709/695 559/701/688 +f 559/701/688 566/709/695 567/710/696 +f 559/701/688 567/710/696 560/702/689 +f 560/702/689 567/710/696 568/711/697 +f 560/702/689 568/711/697 561/703/690 +f 561/703/690 568/711/697 569/712/698 +f 561/703/690 569/712/698 562/704/691 +f 562/704/691 569/712/698 570/713/699 +f 562/704/691 570/713/699 563/705/692 +f 563/705/692 570/713/699 1472/714/368 +f 563/705/692 1472/714/368 1473/706/367 +f 457/591/592 458/593/594 571/715/700 +f 457/591/592 571/715/700 564/707/693 +f 564/707/693 571/715/700 572/716/701 +f 564/707/693 572/716/701 565/708/694 +f 565/708/694 572/716/701 573/717/702 +f 565/708/694 573/717/702 566/709/695 +f 566/709/695 573/717/702 574/718/703 +f 566/709/695 574/718/703 567/710/696 +f 567/710/696 574/718/703 575/719/704 +f 567/710/696 575/719/704 568/711/697 +f 568/711/697 575/719/704 576/720/705 +f 568/711/697 576/720/705 569/712/698 +f 569/712/698 576/720/705 577/721/706 +f 569/712/698 577/721/706 570/713/699 +f 570/713/699 577/721/706 1471/722/369 +f 570/713/699 1471/722/369 1472/714/368 +f 458/593/594 1388/595/596 1389/723/707 +f 458/593/594 1389/723/707 571/715/700 +f 571/715/700 1389/723/707 1390/724/708 +f 571/715/700 1390/724/708 572/716/701 +f 572/716/701 1390/724/708 1391/725/709 +f 572/716/701 1391/725/709 573/717/702 +f 573/717/702 1391/725/709 1392/726/710 +f 573/717/702 1392/726/710 574/718/703 +f 574/718/703 1392/726/710 1393/727/711 +f 574/718/703 1393/727/711 575/719/704 +f 575/719/704 1393/727/711 1394/728/712 +f 575/719/704 1394/728/712 576/720/705 +f 576/720/705 1394/728/712 1395/729/713 +f 576/720/705 1395/729/713 577/721/706 +f 577/721/706 1395/729/713 1535/730/370 +f 577/721/706 1535/730/370 1471/722/369 +f 451/578/579 459/660/652 578/731/714 +f 451/578/579 578/731/714 466/732/715 +f 466/732/715 578/731/714 579/733/716 +f 466/732/715 579/733/716 467/734/717 +f 467/734/717 579/733/716 580/735/718 +f 467/734/717 580/735/718 468/736/719 +f 468/736/719 580/735/718 581/737/720 +f 468/736/719 581/737/720 469/738/721 +f 469/738/721 581/737/720 582/739/722 +f 469/738/721 582/739/722 470/740/723 +f 470/740/723 582/739/722 583/741/724 +f 470/740/723 583/741/724 471/742/725 +f 471/742/725 583/741/724 584/743/726 +f 471/742/725 584/743/726 472/744/727 +f 472/744/727 584/743/726 1419/745/728 +f 472/744/727 1419/745/728 1418/746/729 +f 459/660/652 460/662/654 585/747/730 +f 459/660/652 585/747/730 578/731/714 +f 578/731/714 585/747/730 586/748/731 +f 578/731/714 586/748/731 579/733/716 +f 579/733/716 586/748/731 587/749/732 +f 579/733/716 587/749/732 580/735/718 +f 580/735/718 587/749/732 588/750/733 +f 580/735/718 588/750/733 581/737/720 +f 581/737/720 588/750/733 589/751/734 +f 581/737/720 589/751/734 582/739/722 +f 582/739/722 589/751/734 590/752/735 +f 582/739/722 590/752/735 583/741/724 +f 583/741/724 590/752/735 591/753/736 +f 583/741/724 591/753/736 584/743/726 +f 584/743/726 591/753/736 1420/754/737 +f 584/743/726 1420/754/737 1419/745/728 +f 460/662/654 461/664/656 592/755/738 +f 460/662/654 592/755/738 585/747/730 +f 585/747/730 592/755/738 593/756/739 +f 585/747/730 593/756/739 586/748/731 +f 586/748/731 593/756/739 594/757/740 +f 586/748/731 594/757/740 587/749/732 +f 587/749/732 594/757/740 595/758/741 +f 587/749/732 595/758/741 588/750/733 +f 588/750/733 595/758/741 596/759/742 +f 588/750/733 596/759/742 589/751/734 +f 589/751/734 596/759/742 597/760/743 +f 589/751/734 597/760/743 590/752/735 +f 590/752/735 597/760/743 598/761/744 +f 590/752/735 598/761/744 591/753/736 +f 591/753/736 598/761/744 1421/762/745 +f 591/753/736 1421/762/745 1420/754/737 +f 461/664/656 462/666/658 599/763/746 +f 461/664/656 599/763/746 592/755/738 +f 592/755/738 599/763/746 600/764/747 +f 592/755/738 600/764/747 593/756/739 +f 593/756/739 600/764/747 601/765/748 +f 593/756/739 601/765/748 594/757/740 +f 594/757/740 601/765/748 602/766/749 +f 594/757/740 602/766/749 595/758/741 +f 595/758/741 602/766/749 603/767/750 +f 595/758/741 603/767/750 596/759/742 +f 596/759/742 603/767/750 604/768/751 +f 596/759/742 604/768/751 597/760/743 +f 597/760/743 604/768/751 605/769/752 +f 597/760/743 605/769/752 598/761/744 +f 598/761/744 605/769/752 1422/770/753 +f 598/761/744 1422/770/753 1421/762/745 +f 462/666/658 463/668/660 606/771/754 +f 462/666/658 606/771/754 599/763/746 +f 599/763/746 606/771/754 607/772/755 +f 599/763/746 607/772/755 600/764/747 +f 600/764/747 607/772/755 608/773/756 +f 600/764/747 608/773/756 601/765/748 +f 601/765/748 608/773/756 609/774/757 +f 601/765/748 609/774/757 602/766/749 +f 602/766/749 609/774/757 610/775/758 +f 602/766/749 610/775/758 603/767/750 +f 603/767/750 610/775/758 611/776/759 +f 603/767/750 611/776/759 604/768/751 +f 604/768/751 611/776/759 612/777/760 +f 604/768/751 612/777/760 605/769/752 +f 605/769/752 612/777/760 1423/778/761 +f 605/769/752 1423/778/761 1422/770/753 +f 463/668/660 464/670/662 613/779/762 +f 463/668/660 613/779/762 606/771/754 +f 606/771/754 613/779/762 614/780/763 +f 606/771/754 614/780/763 607/772/755 +f 607/772/755 614/780/763 615/781/764 +f 607/772/755 615/781/764 608/773/756 +f 608/773/756 615/781/764 616/782/765 +f 608/773/756 616/782/765 609/774/757 +f 609/774/757 616/782/765 617/783/766 +f 609/774/757 617/783/766 610/775/758 +f 610/775/758 617/783/766 618/784/767 +f 610/775/758 618/784/767 611/776/759 +f 611/776/759 618/784/767 619/785/768 +f 611/776/759 619/785/768 612/777/760 +f 612/777/760 619/785/768 1424/786/769 +f 612/777/760 1424/786/769 1423/778/761 +f 464/670/662 465/672/664 620/787/770 +f 464/670/662 620/787/770 613/779/762 +f 613/779/762 620/787/770 621/788/771 +f 613/779/762 621/788/771 614/780/763 +f 614/780/763 621/788/771 622/789/772 +f 614/780/763 622/789/772 615/781/764 +f 615/781/764 622/789/772 623/790/773 +f 615/781/764 623/790/773 616/782/765 +f 616/782/765 623/790/773 624/791/774 +f 616/782/765 624/791/774 617/783/766 +f 617/783/766 624/791/774 625/792/775 +f 617/783/766 625/792/775 618/784/767 +f 618/784/767 625/792/775 626/793/776 +f 618/784/767 626/793/776 619/785/768 +f 619/785/768 626/793/776 1425/794/777 +f 619/785/768 1425/794/777 1424/786/769 +f 465/672/664 1478/674/362 1479/795/522 +f 465/672/664 1479/795/522 620/787/770 +f 620/787/770 1479/795/522 1480/796/530 +f 620/787/770 1480/796/530 621/788/771 +f 621/788/771 1480/796/530 1481/797/538 +f 621/788/771 1481/797/538 622/789/772 +f 622/789/772 1481/797/538 1482/798/546 +f 622/789/772 1482/798/546 623/790/773 +f 623/790/773 1482/798/546 1483/799/554 +f 623/790/773 1483/799/554 624/791/774 +f 624/791/774 1483/799/554 1484/800/562 +f 624/791/774 1484/800/562 625/792/775 +f 625/792/775 1484/800/562 1485/801/570 +f 625/792/775 1485/801/570 626/793/776 +f 626/793/776 1485/801/570 1536/577/578 +f 626/793/776 1536/577/578 1425/794/777 +f 451/578/579 466/732/715 627/802/778 +f 451/578/579 627/802/778 473/579/580 +f 473/579/580 627/802/778 628/803/779 +f 473/579/580 628/803/779 474/596/597 +f 474/596/597 628/803/779 629/804/780 +f 474/596/597 629/804/780 475/605/606 +f 475/605/606 629/804/780 630/805/781 +f 475/605/606 630/805/781 476/614/615 +f 476/614/615 630/805/781 631/806/782 +f 476/614/615 631/806/782 477/623/624 +f 477/623/624 631/806/782 632/807/783 +f 477/623/624 632/807/783 478/632/633 +f 478/632/633 632/807/783 633/808/784 +f 478/632/633 633/808/784 479/641/642 +f 479/641/642 633/808/784 1359/809/146 +f 479/641/642 1359/809/146 1358/650/18 +f 466/732/715 467/734/717 634/810/785 +f 466/732/715 634/810/785 627/802/778 +f 627/802/778 634/810/785 635/811/786 +f 627/802/778 635/811/786 628/803/779 +f 628/803/779 635/811/786 636/812/787 +f 628/803/779 636/812/787 629/804/780 +f 629/804/780 636/812/787 637/813/788 +f 629/804/780 637/813/788 630/805/781 +f 630/805/781 637/813/788 638/814/789 +f 630/805/781 638/814/789 631/806/782 +f 631/806/782 638/814/789 639/815/790 +f 631/806/782 639/815/790 632/807/783 +f 632/807/783 639/815/790 640/816/791 +f 632/807/783 640/816/791 633/808/784 +f 633/808/784 640/816/791 1360/817/147 +f 633/808/784 1360/817/147 1359/809/146 +f 467/734/717 468/736/719 641/818/792 +f 467/734/717 641/818/792 634/810/785 +f 634/810/785 641/818/792 642/819/793 +f 634/810/785 642/819/793 635/811/786 +f 635/811/786 642/819/793 643/820/794 +f 635/811/786 643/820/794 636/812/787 +f 636/812/787 643/820/794 644/821/795 +f 636/812/787 644/821/795 637/813/788 +f 637/813/788 644/821/795 645/822/796 +f 637/813/788 645/822/796 638/814/789 +f 638/814/789 645/822/796 646/823/797 +f 638/814/789 646/823/797 639/815/790 +f 639/815/790 646/823/797 647/824/798 +f 639/815/790 647/824/798 640/816/791 +f 640/816/791 647/824/798 1361/825/148 +f 640/816/791 1361/825/148 1360/817/147 +f 468/736/719 469/738/721 648/826/799 +f 468/736/719 648/826/799 641/818/792 +f 641/818/792 648/826/799 649/827/800 +f 641/818/792 649/827/800 642/819/793 +f 642/819/793 649/827/800 650/828/801 +f 642/819/793 650/828/801 643/820/794 +f 643/820/794 650/828/801 651/829/802 +f 643/820/794 651/829/802 644/821/795 +f 644/821/795 651/829/802 652/830/803 +f 644/821/795 652/830/803 645/822/796 +f 645/822/796 652/830/803 653/831/804 +f 645/822/796 653/831/804 646/823/797 +f 646/823/797 653/831/804 654/832/805 +f 646/823/797 654/832/805 647/824/798 +f 647/824/798 654/832/805 1362/833/149 +f 647/824/798 1362/833/149 1361/825/148 +f 469/738/721 470/740/723 655/834/806 +f 469/738/721 655/834/806 648/826/799 +f 648/826/799 655/834/806 656/835/807 +f 648/826/799 656/835/807 649/827/800 +f 649/827/800 656/835/807 657/836/808 +f 649/827/800 657/836/808 650/828/801 +f 650/828/801 657/836/808 658/837/809 +f 650/828/801 658/837/809 651/829/802 +f 651/829/802 658/837/809 659/838/810 +f 651/829/802 659/838/810 652/830/803 +f 652/830/803 659/838/810 660/839/811 +f 652/830/803 660/839/811 653/831/804 +f 653/831/804 660/839/811 661/840/812 +f 653/831/804 661/840/812 654/832/805 +f 654/832/805 661/840/812 1363/841/150 +f 654/832/805 1363/841/150 1362/833/149 +f 470/740/723 471/742/725 662/842/813 +f 470/740/723 662/842/813 655/834/806 +f 655/834/806 662/842/813 663/843/814 +f 655/834/806 663/843/814 656/835/807 +f 656/835/807 663/843/814 664/844/815 +f 656/835/807 664/844/815 657/836/808 +f 657/836/808 664/844/815 665/845/816 +f 657/836/808 665/845/816 658/837/809 +f 658/837/809 665/845/816 666/846/817 +f 658/837/809 666/846/817 659/838/810 +f 659/838/810 666/846/817 667/847/818 +f 659/838/810 667/847/818 660/839/811 +f 660/839/811 667/847/818 668/848/819 +f 660/839/811 668/848/819 661/840/812 +f 661/840/812 668/848/819 1364/849/151 +f 661/840/812 1364/849/151 1363/841/150 +f 471/742/725 472/744/727 669/850/820 +f 471/742/725 669/850/820 662/842/813 +f 662/842/813 669/850/820 670/851/821 +f 662/842/813 670/851/821 663/843/814 +f 663/843/814 670/851/821 671/852/822 +f 663/843/814 671/852/822 664/844/815 +f 664/844/815 671/852/822 672/853/823 +f 664/844/815 672/853/823 665/845/816 +f 665/845/816 672/853/823 673/854/824 +f 665/845/816 673/854/824 666/846/817 +f 666/846/817 673/854/824 674/855/825 +f 666/846/817 674/855/825 667/847/818 +f 667/847/818 674/855/825 675/856/826 +f 667/847/818 675/856/826 668/848/819 +f 668/848/819 675/856/826 1365/857/152 +f 668/848/819 1365/857/152 1364/849/151 +f 472/744/727 1418/746/729 1417/858/827 +f 472/744/727 1417/858/827 669/850/820 +f 669/850/820 1417/858/827 1416/859/828 +f 669/850/820 1416/859/828 670/851/821 +f 670/851/821 1416/859/828 1415/860/829 +f 670/851/821 1415/860/829 671/852/822 +f 671/852/822 1415/860/829 1414/861/830 +f 671/852/822 1414/861/830 672/853/823 +f 672/853/823 1414/861/830 1413/862/831 +f 672/853/823 1413/862/831 673/854/824 +f 673/854/824 1413/862/831 1412/863/832 +f 673/854/824 1412/863/832 674/855/825 +f 674/855/825 1412/863/832 1411/864/833 +f 674/855/825 1411/864/833 675/856/826 +f 675/856/826 1411/864/833 1532/865/153 +f 675/856/826 1532/865/153 1365/857/152 +f 676/866/834 698/867/835 705/868/836 +f 676/866/834 705/868/836 677/869/837 +f 677/869/837 705/868/836 706/870/838 +f 677/869/837 706/870/838 678/871/839 +f 678/871/839 706/870/838 707/872/840 +f 678/871/839 707/872/840 679/873/841 +f 679/873/841 707/872/840 708/874/842 +f 679/873/841 708/874/842 680/875/843 +f 680/875/843 708/874/842 709/876/844 +f 680/875/843 709/876/844 681/877/845 +f 681/877/845 709/876/844 710/878/846 +f 681/877/845 710/878/846 682/879/847 +f 682/879/847 710/878/846 711/880/848 +f 682/879/847 711/880/848 683/881/849 +f 683/881/849 711/880/848 1417/882/827 +f 683/881/849 1417/882/827 1418/883/729 +f 698/867/835 699/884/850 712/885/851 +f 698/867/835 712/885/851 705/868/836 +f 705/868/836 712/885/851 713/886/852 +f 705/868/836 713/886/852 706/870/838 +f 706/870/838 713/886/852 714/887/853 +f 706/870/838 714/887/853 707/872/840 +f 707/872/840 714/887/853 715/888/854 +f 707/872/840 715/888/854 708/874/842 +f 708/874/842 715/888/854 716/889/855 +f 708/874/842 716/889/855 709/876/844 +f 709/876/844 716/889/855 717/890/856 +f 709/876/844 717/890/856 710/878/846 +f 710/878/846 717/890/856 718/891/857 +f 710/878/846 718/891/857 711/880/848 +f 711/880/848 718/891/857 1416/892/828 +f 711/880/848 1416/892/828 1417/882/827 +f 699/884/850 700/893/858 719/894/859 +f 699/884/850 719/894/859 712/885/851 +f 712/885/851 719/894/859 720/895/860 +f 712/885/851 720/895/860 713/886/852 +f 713/886/852 720/895/860 721/896/861 +f 713/886/852 721/896/861 714/887/853 +f 714/887/853 721/896/861 722/897/862 +f 714/887/853 722/897/862 715/888/854 +f 715/888/854 722/897/862 723/898/863 +f 715/888/854 723/898/863 716/889/855 +f 716/889/855 723/898/863 724/899/864 +f 716/889/855 724/899/864 717/890/856 +f 717/890/856 724/899/864 725/900/865 +f 717/890/856 725/900/865 718/891/857 +f 718/891/857 725/900/865 1415/901/829 +f 718/891/857 1415/901/829 1416/892/828 +f 700/893/858 701/902/866 726/903/867 +f 700/893/858 726/903/867 719/894/859 +f 719/894/859 726/903/867 727/904/868 +f 719/894/859 727/904/868 720/895/860 +f 720/895/860 727/904/868 728/905/869 +f 720/895/860 728/905/869 721/896/861 +f 721/896/861 728/905/869 729/906/870 +f 721/896/861 729/906/870 722/897/862 +f 722/897/862 729/906/870 730/907/871 +f 722/897/862 730/907/871 723/898/863 +f 723/898/863 730/907/871 731/908/872 +f 723/898/863 731/908/872 724/899/864 +f 724/899/864 731/908/872 732/909/873 +f 724/899/864 732/909/873 725/900/865 +f 725/900/865 732/909/873 1414/910/830 +f 725/900/865 1414/910/830 1415/901/829 +f 701/902/866 702/911/874 733/912/875 +f 701/902/866 733/912/875 726/903/867 +f 726/903/867 733/912/875 734/913/876 +f 726/903/867 734/913/876 727/904/868 +f 727/904/868 734/913/876 735/914/877 +f 727/904/868 735/914/877 728/905/869 +f 728/905/869 735/914/877 736/915/878 +f 728/905/869 736/915/878 729/906/870 +f 729/906/870 736/915/878 737/916/879 +f 729/906/870 737/916/879 730/907/871 +f 730/907/871 737/916/879 738/917/880 +f 730/907/871 738/917/880 731/908/872 +f 731/908/872 738/917/880 739/918/881 +f 731/908/872 739/918/881 732/909/873 +f 732/909/873 739/918/881 1413/919/831 +f 732/909/873 1413/919/831 1414/910/830 +f 702/911/874 703/920/882 740/921/883 +f 702/911/874 740/921/883 733/912/875 +f 733/912/875 740/921/883 741/922/884 +f 733/912/875 741/922/884 734/913/876 +f 734/913/876 741/922/884 742/923/885 +f 734/913/876 742/923/885 735/914/877 +f 735/914/877 742/923/885 743/924/886 +f 735/914/877 743/924/886 736/915/878 +f 736/915/878 743/924/886 744/925/887 +f 736/915/878 744/925/887 737/916/879 +f 737/916/879 744/925/887 745/926/888 +f 737/916/879 745/926/888 738/917/880 +f 738/917/880 745/926/888 746/927/889 +f 738/917/880 746/927/889 739/918/881 +f 739/918/881 746/927/889 1412/928/832 +f 739/918/881 1412/928/832 1413/919/831 +f 703/920/882 704/929/890 747/930/891 +f 703/920/882 747/930/891 740/921/883 +f 740/921/883 747/930/891 748/931/892 +f 740/921/883 748/931/892 741/922/884 +f 741/922/884 748/931/892 749/932/893 +f 741/922/884 749/932/893 742/923/885 +f 742/923/885 749/932/893 750/933/894 +f 742/923/885 750/933/894 743/924/886 +f 743/924/886 750/933/894 751/934/895 +f 743/924/886 751/934/895 744/925/887 +f 744/925/887 751/934/895 752/935/896 +f 744/925/887 752/935/896 745/926/888 +f 745/926/888 752/935/896 753/936/897 +f 745/926/888 753/936/897 746/927/889 +f 746/927/889 753/936/897 1411/937/833 +f 746/927/889 1411/937/833 1412/928/832 +f 704/929/890 1403/938/97 1402/939/96 +f 704/929/890 1402/939/96 747/930/891 +f 747/930/891 1402/939/96 1401/940/105 +f 747/930/891 1401/940/105 748/931/892 +f 748/931/892 1401/940/105 1400/941/113 +f 748/931/892 1400/941/113 749/932/893 +f 749/932/893 1400/941/113 1399/942/121 +f 749/932/893 1399/942/121 750/933/894 +f 750/933/894 1399/942/121 1398/943/129 +f 750/933/894 1398/943/129 751/934/895 +f 751/934/895 1398/943/129 1397/944/137 +f 751/934/895 1397/944/137 752/935/896 +f 752/935/896 1397/944/137 1396/945/145 +f 752/935/896 1396/945/145 753/936/897 +f 753/936/897 1396/945/145 1532/946/153 +f 753/936/897 1532/946/153 1411/937/833 +f 676/866/834 677/869/837 754/947/898 +f 676/866/834 754/947/898 684/948/899 +f 684/948/899 754/947/898 755/949/900 +f 684/948/899 755/949/900 685/950/901 +f 685/950/901 755/949/900 756/951/902 +f 685/950/901 756/951/902 686/952/903 +f 686/952/903 756/951/902 757/953/904 +f 686/952/903 757/953/904 687/954/905 +f 687/954/905 757/953/904 758/955/906 +f 687/954/905 758/955/906 688/956/907 +f 688/956/907 758/955/906 759/957/908 +f 688/956/907 759/957/908 689/958/909 +f 689/958/909 759/957/908 760/959/910 +f 689/958/909 760/959/910 690/960/911 +f 690/960/911 760/959/910 1507/961/571 +f 690/960/911 1507/961/571 1508/962/458 +f 677/869/837 678/871/839 761/963/912 +f 677/869/837 761/963/912 754/947/898 +f 754/947/898 761/963/912 762/964/913 +f 754/947/898 762/964/913 755/949/900 +f 755/949/900 762/964/913 763/965/914 +f 755/949/900 763/965/914 756/951/902 +f 756/951/902 763/965/914 764/966/915 +f 756/951/902 764/966/915 757/953/904 +f 757/953/904 764/966/915 765/967/916 +f 757/953/904 765/967/916 758/955/906 +f 758/955/906 765/967/916 766/968/917 +f 758/955/906 766/968/917 759/957/908 +f 759/957/908 766/968/917 767/969/918 +f 759/957/908 767/969/918 760/959/910 +f 760/959/910 767/969/918 1506/970/572 +f 760/959/910 1506/970/572 1507/961/571 +f 678/871/839 679/873/841 768/971/919 +f 678/871/839 768/971/919 761/963/912 +f 761/963/912 768/971/919 769/972/920 +f 761/963/912 769/972/920 762/964/913 +f 762/964/913 769/972/920 770/973/921 +f 762/964/913 770/973/921 763/965/914 +f 763/965/914 770/973/921 771/974/922 +f 763/965/914 771/974/922 764/966/915 +f 764/966/915 771/974/922 772/975/923 +f 764/966/915 772/975/923 765/967/916 +f 765/967/916 772/975/923 773/976/924 +f 765/967/916 773/976/924 766/968/917 +f 766/968/917 773/976/924 774/977/925 +f 766/968/917 774/977/925 767/969/918 +f 767/969/918 774/977/925 1505/978/573 +f 767/969/918 1505/978/573 1506/970/572 +f 679/873/841 680/875/843 775/979/926 +f 679/873/841 775/979/926 768/971/919 +f 768/971/919 775/979/926 776/980/927 +f 768/971/919 776/980/927 769/972/920 +f 769/972/920 776/980/927 777/981/928 +f 769/972/920 777/981/928 770/973/921 +f 770/973/921 777/981/928 778/982/929 +f 770/973/921 778/982/929 771/974/922 +f 771/974/922 778/982/929 779/983/930 +f 771/974/922 779/983/930 772/975/923 +f 772/975/923 779/983/930 780/984/931 +f 772/975/923 780/984/931 773/976/924 +f 773/976/924 780/984/931 781/985/932 +f 773/976/924 781/985/932 774/977/925 +f 774/977/925 781/985/932 1504/986/574 +f 774/977/925 1504/986/574 1505/978/573 +f 680/875/843 681/877/845 782/987/933 +f 680/875/843 782/987/933 775/979/926 +f 775/979/926 782/987/933 783/988/934 +f 775/979/926 783/988/934 776/980/927 +f 776/980/927 783/988/934 784/989/935 +f 776/980/927 784/989/935 777/981/928 +f 777/981/928 784/989/935 785/990/936 +f 777/981/928 785/990/936 778/982/929 +f 778/982/929 785/990/936 786/991/937 +f 778/982/929 786/991/937 779/983/930 +f 779/983/930 786/991/937 787/992/938 +f 779/983/930 787/992/938 780/984/931 +f 780/984/931 787/992/938 788/993/939 +f 780/984/931 788/993/939 781/985/932 +f 781/985/932 788/993/939 1503/994/575 +f 781/985/932 1503/994/575 1504/986/574 +f 681/877/845 682/879/847 789/995/940 +f 681/877/845 789/995/940 782/987/933 +f 782/987/933 789/995/940 790/996/941 +f 782/987/933 790/996/941 783/988/934 +f 783/988/934 790/996/941 791/997/942 +f 783/988/934 791/997/942 784/989/935 +f 784/989/935 791/997/942 792/998/943 +f 784/989/935 792/998/943 785/990/936 +f 785/990/936 792/998/943 793/999/944 +f 785/990/936 793/999/944 786/991/937 +f 786/991/937 793/999/944 794/1000/945 +f 786/991/937 794/1000/945 787/992/938 +f 787/992/938 794/1000/945 795/1001/946 +f 787/992/938 795/1001/946 788/993/939 +f 788/993/939 795/1001/946 1502/1002/576 +f 788/993/939 1502/1002/576 1503/994/575 +f 682/879/847 683/881/849 796/1003/947 +f 682/879/847 796/1003/947 789/995/940 +f 789/995/940 796/1003/947 797/1004/948 +f 789/995/940 797/1004/948 790/996/941 +f 790/996/941 797/1004/948 798/1005/949 +f 790/996/941 798/1005/949 791/997/942 +f 791/997/942 798/1005/949 799/1006/950 +f 791/997/942 799/1006/950 792/998/943 +f 792/998/943 799/1006/950 800/1007/951 +f 792/998/943 800/1007/951 793/999/944 +f 793/999/944 800/1007/951 801/1008/952 +f 793/999/944 801/1008/952 794/1000/945 +f 794/1000/945 801/1008/952 802/1009/953 +f 794/1000/945 802/1009/953 795/1001/946 +f 795/1001/946 802/1009/953 1501/1010/577 +f 795/1001/946 1501/1010/577 1502/1002/576 +f 683/881/849 1418/883/729 1419/1011/728 +f 683/881/849 1419/1011/728 796/1003/947 +f 796/1003/947 1419/1011/728 1420/1012/737 +f 796/1003/947 1420/1012/737 797/1004/948 +f 797/1004/948 1420/1012/737 1421/1013/745 +f 797/1004/948 1421/1013/745 798/1005/949 +f 798/1005/949 1421/1013/745 1422/1014/753 +f 798/1005/949 1422/1014/753 799/1006/950 +f 799/1006/950 1422/1014/753 1423/1015/761 +f 799/1006/950 1423/1015/761 800/1007/951 +f 800/1007/951 1423/1015/761 1424/1016/769 +f 800/1007/951 1424/1016/769 801/1008/952 +f 801/1008/952 1424/1016/769 1425/1017/777 +f 801/1008/952 1425/1017/777 802/1009/953 +f 802/1009/953 1425/1017/777 1536/1018/578 +f 802/1009/953 1536/1018/578 1501/1010/577 +f 676/866/834 684/948/899 803/1019/954 +f 676/866/834 803/1019/954 691/1020/955 +f 691/1020/955 803/1019/954 804/1021/956 +f 691/1020/955 804/1021/956 692/1022/957 +f 692/1022/957 804/1021/956 805/1023/958 +f 692/1022/957 805/1023/958 693/1024/959 +f 693/1024/959 805/1023/958 806/1025/960 +f 693/1024/959 806/1025/960 694/1026/961 +f 694/1026/961 806/1025/960 807/1027/962 +f 694/1026/961 807/1027/962 695/1028/963 +f 695/1028/963 807/1027/962 808/1029/964 +f 695/1028/963 808/1029/964 696/1030/965 +f 696/1030/965 808/1029/964 809/1031/966 +f 696/1030/965 809/1031/966 697/1032/967 +f 697/1032/967 809/1031/966 1449/1033/968 +f 697/1032/967 1449/1033/968 1448/1034/969 +f 684/948/899 685/950/901 810/1035/970 +f 684/948/899 810/1035/970 803/1019/954 +f 803/1019/954 810/1035/970 811/1036/971 +f 803/1019/954 811/1036/971 804/1021/956 +f 804/1021/956 811/1036/971 812/1037/972 +f 804/1021/956 812/1037/972 805/1023/958 +f 805/1023/958 812/1037/972 813/1038/973 +f 805/1023/958 813/1038/973 806/1025/960 +f 806/1025/960 813/1038/973 814/1039/974 +f 806/1025/960 814/1039/974 807/1027/962 +f 807/1027/962 814/1039/974 815/1040/975 +f 807/1027/962 815/1040/975 808/1029/964 +f 808/1029/964 815/1040/975 816/1041/976 +f 808/1029/964 816/1041/976 809/1031/966 +f 809/1031/966 816/1041/976 1450/1042/977 +f 809/1031/966 1450/1042/977 1449/1033/968 +f 685/950/901 686/952/903 817/1043/978 +f 685/950/901 817/1043/978 810/1035/970 +f 810/1035/970 817/1043/978 818/1044/979 +f 810/1035/970 818/1044/979 811/1036/971 +f 811/1036/971 818/1044/979 819/1045/980 +f 811/1036/971 819/1045/980 812/1037/972 +f 812/1037/972 819/1045/980 820/1046/981 +f 812/1037/972 820/1046/981 813/1038/973 +f 813/1038/973 820/1046/981 821/1047/982 +f 813/1038/973 821/1047/982 814/1039/974 +f 814/1039/974 821/1047/982 822/1048/983 +f 814/1039/974 822/1048/983 815/1040/975 +f 815/1040/975 822/1048/983 823/1049/984 +f 815/1040/975 823/1049/984 816/1041/976 +f 816/1041/976 823/1049/984 1451/1050/985 +f 816/1041/976 1451/1050/985 1450/1042/977 +f 686/952/903 687/954/905 824/1051/986 +f 686/952/903 824/1051/986 817/1043/978 +f 817/1043/978 824/1051/986 825/1052/987 +f 817/1043/978 825/1052/987 818/1044/979 +f 818/1044/979 825/1052/987 826/1053/988 +f 818/1044/979 826/1053/988 819/1045/980 +f 819/1045/980 826/1053/988 827/1054/989 +f 819/1045/980 827/1054/989 820/1046/981 +f 820/1046/981 827/1054/989 828/1055/990 +f 820/1046/981 828/1055/990 821/1047/982 +f 821/1047/982 828/1055/990 829/1056/991 +f 821/1047/982 829/1056/991 822/1048/983 +f 822/1048/983 829/1056/991 830/1057/992 +f 822/1048/983 830/1057/992 823/1049/984 +f 823/1049/984 830/1057/992 1452/1058/993 +f 823/1049/984 1452/1058/993 1451/1050/985 +f 687/954/905 688/956/907 831/1059/994 +f 687/954/905 831/1059/994 824/1051/986 +f 824/1051/986 831/1059/994 832/1060/995 +f 824/1051/986 832/1060/995 825/1052/987 +f 825/1052/987 832/1060/995 833/1061/996 +f 825/1052/987 833/1061/996 826/1053/988 +f 826/1053/988 833/1061/996 834/1062/997 +f 826/1053/988 834/1062/997 827/1054/989 +f 827/1054/989 834/1062/997 835/1063/998 +f 827/1054/989 835/1063/998 828/1055/990 +f 828/1055/990 835/1063/998 836/1064/999 +f 828/1055/990 836/1064/999 829/1056/991 +f 829/1056/991 836/1064/999 837/1065/1000 +f 829/1056/991 837/1065/1000 830/1057/992 +f 830/1057/992 837/1065/1000 1453/1066/1001 +f 830/1057/992 1453/1066/1001 1452/1058/993 +f 688/956/907 689/958/909 838/1067/1002 +f 688/956/907 838/1067/1002 831/1059/994 +f 831/1059/994 838/1067/1002 839/1068/1003 +f 831/1059/994 839/1068/1003 832/1060/995 +f 832/1060/995 839/1068/1003 840/1069/1004 +f 832/1060/995 840/1069/1004 833/1061/996 +f 833/1061/996 840/1069/1004 841/1070/1005 +f 833/1061/996 841/1070/1005 834/1062/997 +f 834/1062/997 841/1070/1005 842/1071/1006 +f 834/1062/997 842/1071/1006 835/1063/998 +f 835/1063/998 842/1071/1006 843/1072/1007 +f 835/1063/998 843/1072/1007 836/1064/999 +f 836/1064/999 843/1072/1007 844/1073/1008 +f 836/1064/999 844/1073/1008 837/1065/1000 +f 837/1065/1000 844/1073/1008 1454/1074/1009 +f 837/1065/1000 1454/1074/1009 1453/1066/1001 +f 689/958/909 690/960/911 845/1075/1010 +f 689/958/909 845/1075/1010 838/1067/1002 +f 838/1067/1002 845/1075/1010 846/1076/1011 +f 838/1067/1002 846/1076/1011 839/1068/1003 +f 839/1068/1003 846/1076/1011 847/1077/1012 +f 839/1068/1003 847/1077/1012 840/1069/1004 +f 840/1069/1004 847/1077/1012 848/1078/1013 +f 840/1069/1004 848/1078/1013 841/1070/1005 +f 841/1070/1005 848/1078/1013 849/1079/1014 +f 841/1070/1005 849/1079/1014 842/1071/1006 +f 842/1071/1006 849/1079/1014 850/1080/1015 +f 842/1071/1006 850/1080/1015 843/1072/1007 +f 843/1072/1007 850/1080/1015 851/1081/1016 +f 843/1072/1007 851/1081/1016 844/1073/1008 +f 844/1073/1008 851/1081/1016 1455/1082/1017 +f 844/1073/1008 1455/1082/1017 1454/1074/1009 +f 690/960/911 1508/962/458 1509/1083/457 +f 690/960/911 1509/1083/457 845/1075/1010 +f 845/1075/1010 1509/1083/457 1510/1084/466 +f 845/1075/1010 1510/1084/466 846/1076/1011 +f 846/1076/1011 1510/1084/466 1511/1085/474 +f 846/1076/1011 1511/1085/474 847/1077/1012 +f 847/1077/1012 1511/1085/474 1512/1086/482 +f 847/1077/1012 1512/1086/482 848/1078/1013 +f 848/1078/1013 1512/1086/482 1513/1087/490 +f 848/1078/1013 1513/1087/490 849/1079/1014 +f 849/1079/1014 1513/1087/490 1514/1088/498 +f 849/1079/1014 1514/1088/498 850/1080/1015 +f 850/1080/1015 1514/1088/498 1515/1089/506 +f 850/1080/1015 1515/1089/506 851/1081/1016 +f 851/1081/1016 1515/1089/506 1537/1090/514 +f 851/1081/1016 1537/1090/514 1455/1082/1017 +f 676/866/834 691/1020/955 852/1091/1018 +f 676/866/834 852/1091/1018 698/867/835 +f 698/867/835 852/1091/1018 853/1092/1019 +f 698/867/835 853/1092/1019 699/884/850 +f 699/884/850 853/1092/1019 854/1093/1020 +f 699/884/850 854/1093/1020 700/893/858 +f 700/893/858 854/1093/1020 855/1094/1021 +f 700/893/858 855/1094/1021 701/902/866 +f 701/902/866 855/1094/1021 856/1095/1022 +f 701/902/866 856/1095/1022 702/911/874 +f 702/911/874 856/1095/1022 857/1096/1023 +f 702/911/874 857/1096/1023 703/920/882 +f 703/920/882 857/1096/1023 858/1097/1024 +f 703/920/882 858/1097/1024 704/929/890 +f 704/929/890 858/1097/1024 1404/1098/218 +f 704/929/890 1404/1098/218 1403/938/97 +f 691/1020/955 692/1022/957 859/1099/1025 +f 691/1020/955 859/1099/1025 852/1091/1018 +f 852/1091/1018 859/1099/1025 860/1100/1026 +f 852/1091/1018 860/1100/1026 853/1092/1019 +f 853/1092/1019 860/1100/1026 861/1101/1027 +f 853/1092/1019 861/1101/1027 854/1093/1020 +f 854/1093/1020 861/1101/1027 862/1102/1028 +f 854/1093/1020 862/1102/1028 855/1094/1021 +f 855/1094/1021 862/1102/1028 863/1103/1029 +f 855/1094/1021 863/1103/1029 856/1095/1022 +f 856/1095/1022 863/1103/1029 864/1104/1030 +f 856/1095/1022 864/1104/1030 857/1096/1023 +f 857/1096/1023 864/1104/1030 865/1105/1031 +f 857/1096/1023 865/1105/1031 858/1097/1024 +f 858/1097/1024 865/1105/1031 1405/1106/219 +f 858/1097/1024 1405/1106/219 1404/1098/218 +f 692/1022/957 693/1024/959 866/1107/1032 +f 692/1022/957 866/1107/1032 859/1099/1025 +f 859/1099/1025 866/1107/1032 867/1108/1033 +f 859/1099/1025 867/1108/1033 860/1100/1026 +f 860/1100/1026 867/1108/1033 868/1109/1034 +f 860/1100/1026 868/1109/1034 861/1101/1027 +f 861/1101/1027 868/1109/1034 869/1110/1035 +f 861/1101/1027 869/1110/1035 862/1102/1028 +f 862/1102/1028 869/1110/1035 870/1111/1036 +f 862/1102/1028 870/1111/1036 863/1103/1029 +f 863/1103/1029 870/1111/1036 871/1112/1037 +f 863/1103/1029 871/1112/1037 864/1104/1030 +f 864/1104/1030 871/1112/1037 872/1113/1038 +f 864/1104/1030 872/1113/1038 865/1105/1031 +f 865/1105/1031 872/1113/1038 1406/1114/220 +f 865/1105/1031 1406/1114/220 1405/1106/219 +f 693/1024/959 694/1026/961 873/1115/1039 +f 693/1024/959 873/1115/1039 866/1107/1032 +f 866/1107/1032 873/1115/1039 874/1116/1040 +f 866/1107/1032 874/1116/1040 867/1108/1033 +f 867/1108/1033 874/1116/1040 875/1117/1041 +f 867/1108/1033 875/1117/1041 868/1109/1034 +f 868/1109/1034 875/1117/1041 876/1118/1042 +f 868/1109/1034 876/1118/1042 869/1110/1035 +f 869/1110/1035 876/1118/1042 877/1119/1043 +f 869/1110/1035 877/1119/1043 870/1111/1036 +f 870/1111/1036 877/1119/1043 878/1120/1044 +f 870/1111/1036 878/1120/1044 871/1112/1037 +f 871/1112/1037 878/1120/1044 879/1121/1045 +f 871/1112/1037 879/1121/1045 872/1113/1038 +f 872/1113/1038 879/1121/1045 1407/1122/221 +f 872/1113/1038 1407/1122/221 1406/1114/220 +f 694/1026/961 695/1028/963 880/1123/1046 +f 694/1026/961 880/1123/1046 873/1115/1039 +f 873/1115/1039 880/1123/1046 881/1124/1047 +f 873/1115/1039 881/1124/1047 874/1116/1040 +f 874/1116/1040 881/1124/1047 882/1125/1048 +f 874/1116/1040 882/1125/1048 875/1117/1041 +f 875/1117/1041 882/1125/1048 883/1126/1049 +f 875/1117/1041 883/1126/1049 876/1118/1042 +f 876/1118/1042 883/1126/1049 884/1127/1050 +f 876/1118/1042 884/1127/1050 877/1119/1043 +f 877/1119/1043 884/1127/1050 885/1128/1051 +f 877/1119/1043 885/1128/1051 878/1120/1044 +f 878/1120/1044 885/1128/1051 886/1129/1052 +f 878/1120/1044 886/1129/1052 879/1121/1045 +f 879/1121/1045 886/1129/1052 1408/1130/222 +f 879/1121/1045 1408/1130/222 1407/1122/221 +f 695/1028/963 696/1030/965 887/1131/1053 +f 695/1028/963 887/1131/1053 880/1123/1046 +f 880/1123/1046 887/1131/1053 888/1132/1054 +f 880/1123/1046 888/1132/1054 881/1124/1047 +f 881/1124/1047 888/1132/1054 889/1133/1055 +f 881/1124/1047 889/1133/1055 882/1125/1048 +f 882/1125/1048 889/1133/1055 890/1134/1056 +f 882/1125/1048 890/1134/1056 883/1126/1049 +f 883/1126/1049 890/1134/1056 891/1135/1057 +f 883/1126/1049 891/1135/1057 884/1127/1050 +f 884/1127/1050 891/1135/1057 892/1136/1058 +f 884/1127/1050 892/1136/1058 885/1128/1051 +f 885/1128/1051 892/1136/1058 893/1137/1059 +f 885/1128/1051 893/1137/1059 886/1129/1052 +f 886/1129/1052 893/1137/1059 1409/1138/223 +f 886/1129/1052 1409/1138/223 1408/1130/222 +f 696/1030/965 697/1032/967 894/1139/1060 +f 696/1030/965 894/1139/1060 887/1131/1053 +f 887/1131/1053 894/1139/1060 895/1140/1061 +f 887/1131/1053 895/1140/1061 888/1132/1054 +f 888/1132/1054 895/1140/1061 896/1141/1062 +f 888/1132/1054 896/1141/1062 889/1133/1055 +f 889/1133/1055 896/1141/1062 897/1142/1063 +f 889/1133/1055 897/1142/1063 890/1134/1056 +f 890/1134/1056 897/1142/1063 898/1143/1064 +f 890/1134/1056 898/1143/1064 891/1135/1057 +f 891/1135/1057 898/1143/1064 899/1144/1065 +f 891/1135/1057 899/1144/1065 892/1136/1058 +f 892/1136/1058 899/1144/1065 900/1145/1066 +f 892/1136/1058 900/1145/1066 893/1137/1059 +f 893/1137/1059 900/1145/1066 1410/1146/224 +f 893/1137/1059 1410/1146/224 1409/1138/223 +f 697/1032/967 1448/1034/969 1447/1147/1067 +f 697/1032/967 1447/1147/1067 894/1139/1060 +f 894/1139/1060 1447/1147/1067 1446/1148/1068 +f 894/1139/1060 1446/1148/1068 895/1140/1061 +f 895/1140/1061 1446/1148/1068 1445/1149/1069 +f 895/1140/1061 1445/1149/1069 896/1141/1062 +f 896/1141/1062 1445/1149/1069 1444/1150/1070 +f 896/1141/1062 1444/1150/1070 897/1142/1063 +f 897/1142/1063 1444/1150/1070 1443/1151/1071 +f 897/1142/1063 1443/1151/1071 898/1143/1064 +f 898/1143/1064 1443/1151/1071 1442/1152/1072 +f 898/1143/1064 1442/1152/1072 899/1144/1065 +f 899/1144/1065 1442/1152/1072 1441/1153/1073 +f 899/1144/1065 1441/1153/1073 900/1145/1066 +f 900/1145/1066 1441/1153/1073 1533/1154/225 +f 900/1145/1066 1533/1154/225 1410/1146/224 +f 901/1155/1074 923/1156/1075 930/1157/1076 +f 901/1155/1074 930/1157/1076 902/1158/1077 +f 902/1158/1077 930/1157/1076 931/1159/1078 +f 902/1158/1077 931/1159/1078 903/1160/1079 +f 903/1160/1079 931/1159/1078 932/1161/1080 +f 903/1160/1079 932/1161/1080 904/1162/1081 +f 904/1162/1081 932/1161/1080 933/1163/1082 +f 904/1162/1081 933/1163/1082 905/1164/1083 +f 905/1164/1083 933/1163/1082 934/1165/1084 +f 905/1164/1083 934/1165/1084 906/1166/1085 +f 906/1166/1085 934/1165/1084 935/1167/1086 +f 906/1166/1085 935/1167/1086 907/1168/1087 +f 907/1168/1087 935/1167/1086 936/1169/1088 +f 907/1168/1087 936/1169/1088 908/1170/1089 +f 908/1170/1089 936/1169/1088 1447/1171/1067 +f 908/1170/1089 1447/1171/1067 1448/1172/969 +f 923/1156/1075 924/1173/1090 937/1174/1091 +f 923/1156/1075 937/1174/1091 930/1157/1076 +f 930/1157/1076 937/1174/1091 938/1175/1092 +f 930/1157/1076 938/1175/1092 931/1159/1078 +f 931/1159/1078 938/1175/1092 939/1176/1093 +f 931/1159/1078 939/1176/1093 932/1161/1080 +f 932/1161/1080 939/1176/1093 940/1177/1094 +f 932/1161/1080 940/1177/1094 933/1163/1082 +f 933/1163/1082 940/1177/1094 941/1178/1095 +f 933/1163/1082 941/1178/1095 934/1165/1084 +f 934/1165/1084 941/1178/1095 942/1179/1096 +f 934/1165/1084 942/1179/1096 935/1167/1086 +f 935/1167/1086 942/1179/1096 943/1180/1097 +f 935/1167/1086 943/1180/1097 936/1169/1088 +f 936/1169/1088 943/1180/1097 1446/1181/1068 +f 936/1169/1088 1446/1181/1068 1447/1171/1067 +f 924/1173/1090 925/1182/1098 944/1183/1099 +f 924/1173/1090 944/1183/1099 937/1174/1091 +f 937/1174/1091 944/1183/1099 945/1184/1100 +f 937/1174/1091 945/1184/1100 938/1175/1092 +f 938/1175/1092 945/1184/1100 946/1185/1101 +f 938/1175/1092 946/1185/1101 939/1176/1093 +f 939/1176/1093 946/1185/1101 947/1186/1102 +f 939/1176/1093 947/1186/1102 940/1177/1094 +f 940/1177/1094 947/1186/1102 948/1187/1103 +f 940/1177/1094 948/1187/1103 941/1178/1095 +f 941/1178/1095 948/1187/1103 949/1188/1104 +f 941/1178/1095 949/1188/1104 942/1179/1096 +f 942/1179/1096 949/1188/1104 950/1189/1105 +f 942/1179/1096 950/1189/1105 943/1180/1097 +f 943/1180/1097 950/1189/1105 1445/1190/1069 +f 943/1180/1097 1445/1190/1069 1446/1181/1068 +f 925/1182/1098 926/1191/1106 951/1192/1107 +f 925/1182/1098 951/1192/1107 944/1183/1099 +f 944/1183/1099 951/1192/1107 952/1193/1108 +f 944/1183/1099 952/1193/1108 945/1184/1100 +f 945/1184/1100 952/1193/1108 953/1194/1109 +f 945/1184/1100 953/1194/1109 946/1185/1101 +f 946/1185/1101 953/1194/1109 954/1195/1110 +f 946/1185/1101 954/1195/1110 947/1186/1102 +f 947/1186/1102 954/1195/1110 955/1196/1111 +f 947/1186/1102 955/1196/1111 948/1187/1103 +f 948/1187/1103 955/1196/1111 956/1197/1112 +f 948/1187/1103 956/1197/1112 949/1188/1104 +f 949/1188/1104 956/1197/1112 957/1198/1113 +f 949/1188/1104 957/1198/1113 950/1189/1105 +f 950/1189/1105 957/1198/1113 1444/1199/1070 +f 950/1189/1105 1444/1199/1070 1445/1190/1069 +f 926/1191/1106 927/1200/1114 958/1201/1115 +f 926/1191/1106 958/1201/1115 951/1192/1107 +f 951/1192/1107 958/1201/1115 959/1202/1116 +f 951/1192/1107 959/1202/1116 952/1193/1108 +f 952/1193/1108 959/1202/1116 960/1203/1117 +f 952/1193/1108 960/1203/1117 953/1194/1109 +f 953/1194/1109 960/1203/1117 961/1204/1118 +f 953/1194/1109 961/1204/1118 954/1195/1110 +f 954/1195/1110 961/1204/1118 962/1205/1119 +f 954/1195/1110 962/1205/1119 955/1196/1111 +f 955/1196/1111 962/1205/1119 963/1206/1120 +f 955/1196/1111 963/1206/1120 956/1197/1112 +f 956/1197/1112 963/1206/1120 964/1207/1121 +f 956/1197/1112 964/1207/1121 957/1198/1113 +f 957/1198/1113 964/1207/1121 1443/1208/1071 +f 957/1198/1113 1443/1208/1071 1444/1199/1070 +f 927/1200/1114 928/1209/1122 965/1210/1123 +f 927/1200/1114 965/1210/1123 958/1201/1115 +f 958/1201/1115 965/1210/1123 966/1211/1124 +f 958/1201/1115 966/1211/1124 959/1202/1116 +f 959/1202/1116 966/1211/1124 967/1212/1125 +f 959/1202/1116 967/1212/1125 960/1203/1117 +f 960/1203/1117 967/1212/1125 968/1213/1126 +f 960/1203/1117 968/1213/1126 961/1204/1118 +f 961/1204/1118 968/1213/1126 969/1214/1127 +f 961/1204/1118 969/1214/1127 962/1205/1119 +f 962/1205/1119 969/1214/1127 970/1215/1128 +f 962/1205/1119 970/1215/1128 963/1206/1120 +f 963/1206/1120 970/1215/1128 971/1216/1129 +f 963/1206/1120 971/1216/1129 964/1207/1121 +f 964/1207/1121 971/1216/1129 1442/1217/1072 +f 964/1207/1121 1442/1217/1072 1443/1208/1071 +f 928/1209/1122 929/1218/1130 972/1219/1131 +f 928/1209/1122 972/1219/1131 965/1210/1123 +f 965/1210/1123 972/1219/1131 973/1220/1132 +f 965/1210/1123 973/1220/1132 966/1211/1124 +f 966/1211/1124 973/1220/1132 974/1221/1133 +f 966/1211/1124 974/1221/1133 967/1212/1125 +f 967/1212/1125 974/1221/1133 975/1222/1134 +f 967/1212/1125 975/1222/1134 968/1213/1126 +f 968/1213/1126 975/1222/1134 976/1223/1135 +f 968/1213/1126 976/1223/1135 969/1214/1127 +f 969/1214/1127 976/1223/1135 977/1224/1136 +f 969/1214/1127 977/1224/1136 970/1215/1128 +f 970/1215/1128 977/1224/1136 978/1225/1137 +f 970/1215/1128 978/1225/1137 971/1216/1129 +f 971/1216/1129 978/1225/1137 1441/1226/1073 +f 971/1216/1129 1441/1226/1073 1442/1217/1072 +f 929/1218/1130 1433/1227/169 1432/1228/168 +f 929/1218/1130 1432/1228/168 972/1219/1131 +f 972/1219/1131 1432/1228/168 1431/1229/177 +f 972/1219/1131 1431/1229/177 973/1220/1132 +f 973/1220/1132 1431/1229/177 1430/1230/185 +f 973/1220/1132 1430/1230/185 974/1221/1133 +f 974/1221/1133 1430/1230/185 1429/1231/193 +f 974/1221/1133 1429/1231/193 975/1222/1134 +f 975/1222/1134 1429/1231/193 1428/1232/201 +f 975/1222/1134 1428/1232/201 976/1223/1135 +f 976/1223/1135 1428/1232/201 1427/1233/209 +f 976/1223/1135 1427/1233/209 977/1224/1136 +f 977/1224/1136 1427/1233/209 1426/1234/217 +f 977/1224/1136 1426/1234/217 978/1225/1137 +f 978/1225/1137 1426/1234/217 1533/1235/225 +f 978/1225/1137 1533/1235/225 1441/1226/1073 +f 901/1155/1074 902/1158/1077 979/1236/1138 +f 901/1155/1074 979/1236/1138 909/1237/1139 +f 909/1237/1139 979/1236/1138 980/1238/1140 +f 909/1237/1139 980/1238/1140 910/1239/1141 +f 910/1239/1141 980/1238/1140 981/1240/1142 +f 910/1239/1141 981/1240/1142 911/1241/1143 +f 911/1241/1143 981/1240/1142 982/1242/1144 +f 911/1241/1143 982/1242/1144 912/1243/1145 +f 912/1243/1145 982/1242/1144 983/1244/1146 +f 912/1243/1145 983/1244/1146 913/1245/1147 +f 913/1245/1147 983/1244/1146 984/1246/1148 +f 913/1245/1147 984/1246/1148 914/1247/1149 +f 914/1247/1149 984/1246/1148 985/1248/1150 +f 914/1247/1149 985/1248/1150 915/1249/1151 +f 915/1249/1151 985/1248/1150 1522/1250/507 +f 915/1249/1151 1522/1250/507 1523/1251/386 +f 902/1158/1077 903/1160/1079 986/1252/1152 +f 902/1158/1077 986/1252/1152 979/1236/1138 +f 979/1236/1138 986/1252/1152 987/1253/1153 +f 979/1236/1138 987/1253/1153 980/1238/1140 +f 980/1238/1140 987/1253/1153 988/1254/1154 +f 980/1238/1140 988/1254/1154 981/1240/1142 +f 981/1240/1142 988/1254/1154 989/1255/1155 +f 981/1240/1142 989/1255/1155 982/1242/1144 +f 982/1242/1144 989/1255/1155 990/1256/1156 +f 982/1242/1144 990/1256/1156 983/1244/1146 +f 983/1244/1146 990/1256/1156 991/1257/1157 +f 983/1244/1146 991/1257/1157 984/1246/1148 +f 984/1246/1148 991/1257/1157 992/1258/1158 +f 984/1246/1148 992/1258/1158 985/1248/1150 +f 985/1248/1150 992/1258/1158 1521/1259/508 +f 985/1248/1150 1521/1259/508 1522/1250/507 +f 903/1160/1079 904/1162/1081 993/1260/1159 +f 903/1160/1079 993/1260/1159 986/1252/1152 +f 986/1252/1152 993/1260/1159 994/1261/1160 +f 986/1252/1152 994/1261/1160 987/1253/1153 +f 987/1253/1153 994/1261/1160 995/1262/1161 +f 987/1253/1153 995/1262/1161 988/1254/1154 +f 988/1254/1154 995/1262/1161 996/1263/1162 +f 988/1254/1154 996/1263/1162 989/1255/1155 +f 989/1255/1155 996/1263/1162 997/1264/1163 +f 989/1255/1155 997/1264/1163 990/1256/1156 +f 990/1256/1156 997/1264/1163 998/1265/1164 +f 990/1256/1156 998/1265/1164 991/1257/1157 +f 991/1257/1157 998/1265/1164 999/1266/1165 +f 991/1257/1157 999/1266/1165 992/1258/1158 +f 992/1258/1158 999/1266/1165 1520/1267/509 +f 992/1258/1158 1520/1267/509 1521/1259/508 +f 904/1162/1081 905/1164/1083 1000/1268/1166 +f 904/1162/1081 1000/1268/1166 993/1260/1159 +f 993/1260/1159 1000/1268/1166 1001/1269/1167 +f 993/1260/1159 1001/1269/1167 994/1261/1160 +f 994/1261/1160 1001/1269/1167 1002/1270/1168 +f 994/1261/1160 1002/1270/1168 995/1262/1161 +f 995/1262/1161 1002/1270/1168 1003/1271/1169 +f 995/1262/1161 1003/1271/1169 996/1263/1162 +f 996/1263/1162 1003/1271/1169 1004/1272/1170 +f 996/1263/1162 1004/1272/1170 997/1264/1163 +f 997/1264/1163 1004/1272/1170 1005/1273/1171 +f 997/1264/1163 1005/1273/1171 998/1265/1164 +f 998/1265/1164 1005/1273/1171 1006/1274/1172 +f 998/1265/1164 1006/1274/1172 999/1266/1165 +f 999/1266/1165 1006/1274/1172 1519/1275/510 +f 999/1266/1165 1519/1275/510 1520/1267/509 +f 905/1164/1083 906/1166/1085 1007/1276/1173 +f 905/1164/1083 1007/1276/1173 1000/1268/1166 +f 1000/1268/1166 1007/1276/1173 1008/1277/1174 +f 1000/1268/1166 1008/1277/1174 1001/1269/1167 +f 1001/1269/1167 1008/1277/1174 1009/1278/1175 +f 1001/1269/1167 1009/1278/1175 1002/1270/1168 +f 1002/1270/1168 1009/1278/1175 1010/1279/1176 +f 1002/1270/1168 1010/1279/1176 1003/1271/1169 +f 1003/1271/1169 1010/1279/1176 1011/1280/1177 +f 1003/1271/1169 1011/1280/1177 1004/1272/1170 +f 1004/1272/1170 1011/1280/1177 1012/1281/1178 +f 1004/1272/1170 1012/1281/1178 1005/1273/1171 +f 1005/1273/1171 1012/1281/1178 1013/1282/1179 +f 1005/1273/1171 1013/1282/1179 1006/1274/1172 +f 1006/1274/1172 1013/1282/1179 1518/1283/511 +f 1006/1274/1172 1518/1283/511 1519/1275/510 +f 906/1166/1085 907/1168/1087 1014/1284/1180 +f 906/1166/1085 1014/1284/1180 1007/1276/1173 +f 1007/1276/1173 1014/1284/1180 1015/1285/1181 +f 1007/1276/1173 1015/1285/1181 1008/1277/1174 +f 1008/1277/1174 1015/1285/1181 1016/1286/1182 +f 1008/1277/1174 1016/1286/1182 1009/1278/1175 +f 1009/1278/1175 1016/1286/1182 1017/1287/1183 +f 1009/1278/1175 1017/1287/1183 1010/1279/1176 +f 1010/1279/1176 1017/1287/1183 1018/1288/1184 +f 1010/1279/1176 1018/1288/1184 1011/1280/1177 +f 1011/1280/1177 1018/1288/1184 1019/1289/1185 +f 1011/1280/1177 1019/1289/1185 1012/1281/1178 +f 1012/1281/1178 1019/1289/1185 1020/1290/1186 +f 1012/1281/1178 1020/1290/1186 1013/1282/1179 +f 1013/1282/1179 1020/1290/1186 1517/1291/512 +f 1013/1282/1179 1517/1291/512 1518/1283/511 +f 907/1168/1087 908/1170/1089 1021/1292/1187 +f 907/1168/1087 1021/1292/1187 1014/1284/1180 +f 1014/1284/1180 1021/1292/1187 1022/1293/1188 +f 1014/1284/1180 1022/1293/1188 1015/1285/1181 +f 1015/1285/1181 1022/1293/1188 1023/1294/1189 +f 1015/1285/1181 1023/1294/1189 1016/1286/1182 +f 1016/1286/1182 1023/1294/1189 1024/1295/1190 +f 1016/1286/1182 1024/1295/1190 1017/1287/1183 +f 1017/1287/1183 1024/1295/1190 1025/1296/1191 +f 1017/1287/1183 1025/1296/1191 1018/1288/1184 +f 1018/1288/1184 1025/1296/1191 1026/1297/1192 +f 1018/1288/1184 1026/1297/1192 1019/1289/1185 +f 1019/1289/1185 1026/1297/1192 1027/1298/1193 +f 1019/1289/1185 1027/1298/1193 1020/1290/1186 +f 1020/1290/1186 1027/1298/1193 1516/1299/513 +f 1020/1290/1186 1516/1299/513 1517/1291/512 +f 908/1170/1089 1448/1172/969 1449/1300/968 +f 908/1170/1089 1449/1300/968 1021/1292/1187 +f 1021/1292/1187 1449/1300/968 1450/1301/977 +f 1021/1292/1187 1450/1301/977 1022/1293/1188 +f 1022/1293/1188 1450/1301/977 1451/1302/985 +f 1022/1293/1188 1451/1302/985 1023/1294/1189 +f 1023/1294/1189 1451/1302/985 1452/1303/993 +f 1023/1294/1189 1452/1303/993 1024/1295/1190 +f 1024/1295/1190 1452/1303/993 1453/1304/1001 +f 1024/1295/1190 1453/1304/1001 1025/1296/1191 +f 1025/1296/1191 1453/1304/1001 1454/1305/1009 +f 1025/1296/1191 1454/1305/1009 1026/1297/1192 +f 1026/1297/1192 1454/1305/1009 1455/1306/1017 +f 1026/1297/1192 1455/1306/1017 1027/1298/1193 +f 1027/1298/1193 1455/1306/1017 1537/1307/514 +f 1027/1298/1193 1537/1307/514 1516/1299/513 +f 901/1155/1074 909/1237/1139 1028/1308/1194 +f 901/1155/1074 1028/1308/1194 916/1309/1195 +f 916/1309/1195 1028/1308/1194 1029/1310/1196 +f 916/1309/1195 1029/1310/1196 917/1311/1197 +f 917/1311/1197 1029/1310/1196 1030/1312/1198 +f 917/1311/1197 1030/1312/1198 918/1313/1199 +f 918/1313/1199 1030/1312/1198 1031/1314/1200 +f 918/1313/1199 1031/1314/1200 919/1315/1201 +f 919/1315/1201 1031/1314/1200 1032/1316/1202 +f 919/1315/1201 1032/1316/1202 920/1317/1203 +f 920/1317/1203 1032/1316/1202 1033/1318/1204 +f 920/1317/1203 1033/1318/1204 921/1319/1205 +f 921/1319/1205 1033/1318/1204 1034/1320/1206 +f 921/1319/1205 1034/1320/1206 922/1321/1207 +f 922/1321/1207 1034/1320/1206 1464/1322/1208 +f 922/1321/1207 1464/1322/1208 1463/1323/1209 +f 909/1237/1139 910/1239/1141 1035/1324/1210 +f 909/1237/1139 1035/1324/1210 1028/1308/1194 +f 1028/1308/1194 1035/1324/1210 1036/1325/1211 +f 1028/1308/1194 1036/1325/1211 1029/1310/1196 +f 1029/1310/1196 1036/1325/1211 1037/1326/1212 +f 1029/1310/1196 1037/1326/1212 1030/1312/1198 +f 1030/1312/1198 1037/1326/1212 1038/1327/1213 +f 1030/1312/1198 1038/1327/1213 1031/1314/1200 +f 1031/1314/1200 1038/1327/1213 1039/1328/1214 +f 1031/1314/1200 1039/1328/1214 1032/1316/1202 +f 1032/1316/1202 1039/1328/1214 1040/1329/1215 +f 1032/1316/1202 1040/1329/1215 1033/1318/1204 +f 1033/1318/1204 1040/1329/1215 1041/1330/1216 +f 1033/1318/1204 1041/1330/1216 1034/1320/1206 +f 1034/1320/1206 1041/1330/1216 1465/1331/1217 +f 1034/1320/1206 1465/1331/1217 1464/1322/1208 +f 910/1239/1141 911/1241/1143 1042/1332/1218 +f 910/1239/1141 1042/1332/1218 1035/1324/1210 +f 1035/1324/1210 1042/1332/1218 1043/1333/1219 +f 1035/1324/1210 1043/1333/1219 1036/1325/1211 +f 1036/1325/1211 1043/1333/1219 1044/1334/1220 +f 1036/1325/1211 1044/1334/1220 1037/1326/1212 +f 1037/1326/1212 1044/1334/1220 1045/1335/1221 +f 1037/1326/1212 1045/1335/1221 1038/1327/1213 +f 1038/1327/1213 1045/1335/1221 1046/1336/1222 +f 1038/1327/1213 1046/1336/1222 1039/1328/1214 +f 1039/1328/1214 1046/1336/1222 1047/1337/1223 +f 1039/1328/1214 1047/1337/1223 1040/1329/1215 +f 1040/1329/1215 1047/1337/1223 1048/1338/1224 +f 1040/1329/1215 1048/1338/1224 1041/1330/1216 +f 1041/1330/1216 1048/1338/1224 1466/1339/1225 +f 1041/1330/1216 1466/1339/1225 1465/1331/1217 +f 911/1241/1143 912/1243/1145 1049/1340/1226 +f 911/1241/1143 1049/1340/1226 1042/1332/1218 +f 1042/1332/1218 1049/1340/1226 1050/1341/1227 +f 1042/1332/1218 1050/1341/1227 1043/1333/1219 +f 1043/1333/1219 1050/1341/1227 1051/1342/1228 +f 1043/1333/1219 1051/1342/1228 1044/1334/1220 +f 1044/1334/1220 1051/1342/1228 1052/1343/1229 +f 1044/1334/1220 1052/1343/1229 1045/1335/1221 +f 1045/1335/1221 1052/1343/1229 1053/1344/1230 +f 1045/1335/1221 1053/1344/1230 1046/1336/1222 +f 1046/1336/1222 1053/1344/1230 1054/1345/1231 +f 1046/1336/1222 1054/1345/1231 1047/1337/1223 +f 1047/1337/1223 1054/1345/1231 1055/1346/1232 +f 1047/1337/1223 1055/1346/1232 1048/1338/1224 +f 1048/1338/1224 1055/1346/1232 1467/1347/1233 +f 1048/1338/1224 1467/1347/1233 1466/1339/1225 +f 912/1243/1145 913/1245/1147 1056/1348/1234 +f 912/1243/1145 1056/1348/1234 1049/1340/1226 +f 1049/1340/1226 1056/1348/1234 1057/1349/1235 +f 1049/1340/1226 1057/1349/1235 1050/1341/1227 +f 1050/1341/1227 1057/1349/1235 1058/1350/1236 +f 1050/1341/1227 1058/1350/1236 1051/1342/1228 +f 1051/1342/1228 1058/1350/1236 1059/1351/1237 +f 1051/1342/1228 1059/1351/1237 1052/1343/1229 +f 1052/1343/1229 1059/1351/1237 1060/1352/1238 +f 1052/1343/1229 1060/1352/1238 1053/1344/1230 +f 1053/1344/1230 1060/1352/1238 1061/1353/1239 +f 1053/1344/1230 1061/1353/1239 1054/1345/1231 +f 1054/1345/1231 1061/1353/1239 1062/1354/1240 +f 1054/1345/1231 1062/1354/1240 1055/1346/1232 +f 1055/1346/1232 1062/1354/1240 1468/1355/1241 +f 1055/1346/1232 1468/1355/1241 1467/1347/1233 +f 913/1245/1147 914/1247/1149 1063/1356/1242 +f 913/1245/1147 1063/1356/1242 1056/1348/1234 +f 1056/1348/1234 1063/1356/1242 1064/1357/1243 +f 1056/1348/1234 1064/1357/1243 1057/1349/1235 +f 1057/1349/1235 1064/1357/1243 1065/1358/1244 +f 1057/1349/1235 1065/1358/1244 1058/1350/1236 +f 1058/1350/1236 1065/1358/1244 1066/1359/1245 +f 1058/1350/1236 1066/1359/1245 1059/1351/1237 +f 1059/1351/1237 1066/1359/1245 1067/1360/1246 +f 1059/1351/1237 1067/1360/1246 1060/1352/1238 +f 1060/1352/1238 1067/1360/1246 1068/1361/1247 +f 1060/1352/1238 1068/1361/1247 1061/1353/1239 +f 1061/1353/1239 1068/1361/1247 1069/1362/1248 +f 1061/1353/1239 1069/1362/1248 1062/1354/1240 +f 1062/1354/1240 1069/1362/1248 1469/1363/1249 +f 1062/1354/1240 1469/1363/1249 1468/1355/1241 +f 914/1247/1149 915/1249/1151 1070/1364/1250 +f 914/1247/1149 1070/1364/1250 1063/1356/1242 +f 1063/1356/1242 1070/1364/1250 1071/1365/1251 +f 1063/1356/1242 1071/1365/1251 1064/1357/1243 +f 1064/1357/1243 1071/1365/1251 1072/1366/1252 +f 1064/1357/1243 1072/1366/1252 1065/1358/1244 +f 1065/1358/1244 1072/1366/1252 1073/1367/1253 +f 1065/1358/1244 1073/1367/1253 1066/1359/1245 +f 1066/1359/1245 1073/1367/1253 1074/1368/1254 +f 1066/1359/1245 1074/1368/1254 1067/1360/1246 +f 1067/1360/1246 1074/1368/1254 1075/1369/1255 +f 1067/1360/1246 1075/1369/1255 1068/1361/1247 +f 1068/1361/1247 1075/1369/1255 1076/1370/1256 +f 1068/1361/1247 1076/1370/1256 1069/1362/1248 +f 1069/1362/1248 1076/1370/1256 1470/1371/1257 +f 1069/1362/1248 1470/1371/1257 1469/1363/1249 +f 915/1249/1151 1523/1251/386 1524/1372/385 +f 915/1249/1151 1524/1372/385 1070/1364/1250 +f 1070/1364/1250 1524/1372/385 1525/1373/394 +f 1070/1364/1250 1525/1373/394 1071/1365/1251 +f 1071/1365/1251 1525/1373/394 1526/1374/402 +f 1071/1365/1251 1526/1374/402 1072/1366/1252 +f 1072/1366/1252 1526/1374/402 1527/1375/410 +f 1072/1366/1252 1527/1375/410 1073/1367/1253 +f 1073/1367/1253 1527/1375/410 1528/1376/418 +f 1073/1367/1253 1528/1376/418 1074/1368/1254 +f 1074/1368/1254 1528/1376/418 1529/1377/426 +f 1074/1368/1254 1529/1377/426 1075/1369/1255 +f 1075/1369/1255 1529/1377/426 1530/1378/434 +f 1075/1369/1255 1530/1378/434 1076/1370/1256 +f 1076/1370/1256 1530/1378/434 1538/1379/442 +f 1076/1370/1256 1538/1379/442 1470/1371/1257 +f 901/1155/1074 916/1309/1195 1077/1380/1258 +f 901/1155/1074 1077/1380/1258 923/1156/1075 +f 923/1156/1075 1077/1380/1258 1078/1381/1259 +f 923/1156/1075 1078/1381/1259 924/1173/1090 +f 924/1173/1090 1078/1381/1259 1079/1382/1260 +f 924/1173/1090 1079/1382/1260 925/1182/1098 +f 925/1182/1098 1079/1382/1260 1080/1383/1261 +f 925/1182/1098 1080/1383/1261 926/1191/1106 +f 926/1191/1106 1080/1383/1261 1081/1384/1262 +f 926/1191/1106 1081/1384/1262 927/1200/1114 +f 927/1200/1114 1081/1384/1262 1082/1385/1263 +f 927/1200/1114 1082/1385/1263 928/1209/1122 +f 928/1209/1122 1082/1385/1263 1083/1386/1264 +f 928/1209/1122 1083/1386/1264 929/1218/1130 +f 929/1218/1130 1083/1386/1264 1434/1387/282 +f 929/1218/1130 1434/1387/282 1433/1227/169 +f 916/1309/1195 917/1311/1197 1084/1388/1265 +f 916/1309/1195 1084/1388/1265 1077/1380/1258 +f 1077/1380/1258 1084/1388/1265 1085/1389/1266 +f 1077/1380/1258 1085/1389/1266 1078/1381/1259 +f 1078/1381/1259 1085/1389/1266 1086/1390/1267 +f 1078/1381/1259 1086/1390/1267 1079/1382/1260 +f 1079/1382/1260 1086/1390/1267 1087/1391/1268 +f 1079/1382/1260 1087/1391/1268 1080/1383/1261 +f 1080/1383/1261 1087/1391/1268 1088/1392/1269 +f 1080/1383/1261 1088/1392/1269 1081/1384/1262 +f 1081/1384/1262 1088/1392/1269 1089/1393/1270 +f 1081/1384/1262 1089/1393/1270 1082/1385/1263 +f 1082/1385/1263 1089/1393/1270 1090/1394/1271 +f 1082/1385/1263 1090/1394/1271 1083/1386/1264 +f 1083/1386/1264 1090/1394/1271 1435/1395/283 +f 1083/1386/1264 1435/1395/283 1434/1387/282 +f 917/1311/1197 918/1313/1199 1091/1396/1272 +f 917/1311/1197 1091/1396/1272 1084/1388/1265 +f 1084/1388/1265 1091/1396/1272 1092/1397/1273 +f 1084/1388/1265 1092/1397/1273 1085/1389/1266 +f 1085/1389/1266 1092/1397/1273 1093/1398/1274 +f 1085/1389/1266 1093/1398/1274 1086/1390/1267 +f 1086/1390/1267 1093/1398/1274 1094/1399/1275 +f 1086/1390/1267 1094/1399/1275 1087/1391/1268 +f 1087/1391/1268 1094/1399/1275 1095/1400/1276 +f 1087/1391/1268 1095/1400/1276 1088/1392/1269 +f 1088/1392/1269 1095/1400/1276 1096/1401/1277 +f 1088/1392/1269 1096/1401/1277 1089/1393/1270 +f 1089/1393/1270 1096/1401/1277 1097/1402/1278 +f 1089/1393/1270 1097/1402/1278 1090/1394/1271 +f 1090/1394/1271 1097/1402/1278 1436/1403/284 +f 1090/1394/1271 1436/1403/284 1435/1395/283 +f 918/1313/1199 919/1315/1201 1098/1404/1279 +f 918/1313/1199 1098/1404/1279 1091/1396/1272 +f 1091/1396/1272 1098/1404/1279 1099/1405/1280 +f 1091/1396/1272 1099/1405/1280 1092/1397/1273 +f 1092/1397/1273 1099/1405/1280 1100/1406/1281 +f 1092/1397/1273 1100/1406/1281 1093/1398/1274 +f 1093/1398/1274 1100/1406/1281 1101/1407/1282 +f 1093/1398/1274 1101/1407/1282 1094/1399/1275 +f 1094/1399/1275 1101/1407/1282 1102/1408/1283 +f 1094/1399/1275 1102/1408/1283 1095/1400/1276 +f 1095/1400/1276 1102/1408/1283 1103/1409/1284 +f 1095/1400/1276 1103/1409/1284 1096/1401/1277 +f 1096/1401/1277 1103/1409/1284 1104/1410/1285 +f 1096/1401/1277 1104/1410/1285 1097/1402/1278 +f 1097/1402/1278 1104/1410/1285 1437/1411/285 +f 1097/1402/1278 1437/1411/285 1436/1403/284 +f 919/1315/1201 920/1317/1203 1105/1412/1286 +f 919/1315/1201 1105/1412/1286 1098/1404/1279 +f 1098/1404/1279 1105/1412/1286 1106/1413/1287 +f 1098/1404/1279 1106/1413/1287 1099/1405/1280 +f 1099/1405/1280 1106/1413/1287 1107/1414/1288 +f 1099/1405/1280 1107/1414/1288 1100/1406/1281 +f 1100/1406/1281 1107/1414/1288 1108/1415/1289 +f 1100/1406/1281 1108/1415/1289 1101/1407/1282 +f 1101/1407/1282 1108/1415/1289 1109/1416/1290 +f 1101/1407/1282 1109/1416/1290 1102/1408/1283 +f 1102/1408/1283 1109/1416/1290 1110/1417/1291 +f 1102/1408/1283 1110/1417/1291 1103/1409/1284 +f 1103/1409/1284 1110/1417/1291 1111/1418/1292 +f 1103/1409/1284 1111/1418/1292 1104/1410/1285 +f 1104/1410/1285 1111/1418/1292 1438/1419/286 +f 1104/1410/1285 1438/1419/286 1437/1411/285 +f 920/1317/1203 921/1319/1205 1112/1420/1293 +f 920/1317/1203 1112/1420/1293 1105/1412/1286 +f 1105/1412/1286 1112/1420/1293 1113/1421/1294 +f 1105/1412/1286 1113/1421/1294 1106/1413/1287 +f 1106/1413/1287 1113/1421/1294 1114/1422/1295 +f 1106/1413/1287 1114/1422/1295 1107/1414/1288 +f 1107/1414/1288 1114/1422/1295 1115/1423/1296 +f 1107/1414/1288 1115/1423/1296 1108/1415/1289 +f 1108/1415/1289 1115/1423/1296 1116/1424/1297 +f 1108/1415/1289 1116/1424/1297 1109/1416/1290 +f 1109/1416/1290 1116/1424/1297 1117/1425/1298 +f 1109/1416/1290 1117/1425/1298 1110/1417/1291 +f 1110/1417/1291 1117/1425/1298 1118/1426/1299 +f 1110/1417/1291 1118/1426/1299 1111/1418/1292 +f 1111/1418/1292 1118/1426/1299 1439/1427/287 +f 1111/1418/1292 1439/1427/287 1438/1419/286 +f 921/1319/1205 922/1321/1207 1119/1428/1300 +f 921/1319/1205 1119/1428/1300 1112/1420/1293 +f 1112/1420/1293 1119/1428/1300 1120/1429/1301 +f 1112/1420/1293 1120/1429/1301 1113/1421/1294 +f 1113/1421/1294 1120/1429/1301 1121/1430/1302 +f 1113/1421/1294 1121/1430/1302 1114/1422/1295 +f 1114/1422/1295 1121/1430/1302 1122/1431/1303 +f 1114/1422/1295 1122/1431/1303 1115/1423/1296 +f 1115/1423/1296 1122/1431/1303 1123/1432/1304 +f 1115/1423/1296 1123/1432/1304 1116/1424/1297 +f 1116/1424/1297 1123/1432/1304 1124/1433/1305 +f 1116/1424/1297 1124/1433/1305 1117/1425/1298 +f 1117/1425/1298 1124/1433/1305 1125/1434/1306 +f 1117/1425/1298 1125/1434/1306 1118/1426/1299 +f 1118/1426/1299 1125/1434/1306 1440/1435/288 +f 1118/1426/1299 1440/1435/288 1439/1427/287 +f 922/1321/1207 1463/1323/1209 1462/1436/1307 +f 922/1321/1207 1462/1436/1307 1119/1428/1300 +f 1119/1428/1300 1462/1436/1307 1461/1437/1308 +f 1119/1428/1300 1461/1437/1308 1120/1429/1301 +f 1120/1429/1301 1461/1437/1308 1460/1438/1309 +f 1120/1429/1301 1460/1438/1309 1121/1430/1302 +f 1121/1430/1302 1460/1438/1309 1459/1439/1310 +f 1121/1430/1302 1459/1439/1310 1122/1431/1303 +f 1122/1431/1303 1459/1439/1310 1458/1440/1311 +f 1122/1431/1303 1458/1440/1311 1123/1432/1304 +f 1123/1432/1304 1458/1440/1311 1457/1441/1312 +f 1123/1432/1304 1457/1441/1312 1124/1433/1305 +f 1124/1433/1305 1457/1441/1312 1456/1442/1313 +f 1124/1433/1305 1456/1442/1313 1125/1434/1306 +f 1125/1434/1306 1456/1442/1313 1534/1443/289 +f 1125/1434/1306 1534/1443/289 1440/1435/288 +f 1126/1444/1314 1148/1445/1315 1155/1446/1316 +f 1126/1444/1314 1155/1446/1316 1127/1447/1317 +f 1127/1447/1317 1155/1446/1316 1156/1448/1318 +f 1127/1447/1317 1156/1448/1318 1128/1449/1319 +f 1128/1449/1319 1156/1448/1318 1157/1450/1320 +f 1128/1449/1319 1157/1450/1320 1129/1451/1321 +f 1129/1451/1321 1157/1450/1320 1158/1452/1322 +f 1129/1451/1321 1158/1452/1322 1130/1453/1323 +f 1130/1453/1323 1158/1452/1322 1159/1454/1324 +f 1130/1453/1323 1159/1454/1324 1131/1455/1325 +f 1131/1455/1325 1159/1454/1324 1160/1456/1326 +f 1131/1455/1325 1160/1456/1326 1132/1457/1327 +f 1132/1457/1327 1160/1456/1326 1161/1458/1328 +f 1132/1457/1327 1161/1458/1328 1133/1459/1329 +f 1133/1459/1329 1161/1458/1328 1389/1460/707 +f 1133/1459/1329 1389/1460/707 1388/1461/596 +f 1148/1445/1315 1149/1462/1330 1162/1463/1331 +f 1148/1445/1315 1162/1463/1331 1155/1446/1316 +f 1155/1446/1316 1162/1463/1331 1163/1464/1332 +f 1155/1446/1316 1163/1464/1332 1156/1448/1318 +f 1156/1448/1318 1163/1464/1332 1164/1465/1333 +f 1156/1448/1318 1164/1465/1333 1157/1450/1320 +f 1157/1450/1320 1164/1465/1333 1165/1466/1334 +f 1157/1450/1320 1165/1466/1334 1158/1452/1322 +f 1158/1452/1322 1165/1466/1334 1166/1467/1335 +f 1158/1452/1322 1166/1467/1335 1159/1454/1324 +f 1159/1454/1324 1166/1467/1335 1167/1468/1336 +f 1159/1454/1324 1167/1468/1336 1160/1456/1326 +f 1160/1456/1326 1167/1468/1336 1168/1469/1337 +f 1160/1456/1326 1168/1469/1337 1161/1458/1328 +f 1161/1458/1328 1168/1469/1337 1390/1470/708 +f 1161/1458/1328 1390/1470/708 1389/1460/707 +f 1149/1462/1330 1150/1471/1338 1169/1472/1339 +f 1149/1462/1330 1169/1472/1339 1162/1463/1331 +f 1162/1463/1331 1169/1472/1339 1170/1473/1340 +f 1162/1463/1331 1170/1473/1340 1163/1464/1332 +f 1163/1464/1332 1170/1473/1340 1171/1474/1341 +f 1163/1464/1332 1171/1474/1341 1164/1465/1333 +f 1164/1465/1333 1171/1474/1341 1172/1475/1342 +f 1164/1465/1333 1172/1475/1342 1165/1466/1334 +f 1165/1466/1334 1172/1475/1342 1173/1476/1343 +f 1165/1466/1334 1173/1476/1343 1166/1467/1335 +f 1166/1467/1335 1173/1476/1343 1174/1477/1344 +f 1166/1467/1335 1174/1477/1344 1167/1468/1336 +f 1167/1468/1336 1174/1477/1344 1175/1478/1345 +f 1167/1468/1336 1175/1478/1345 1168/1469/1337 +f 1168/1469/1337 1175/1478/1345 1391/1479/709 +f 1168/1469/1337 1391/1479/709 1390/1470/708 +f 1150/1471/1338 1151/1480/1346 1176/1481/1347 +f 1150/1471/1338 1176/1481/1347 1169/1472/1339 +f 1169/1472/1339 1176/1481/1347 1177/1482/1348 +f 1169/1472/1339 1177/1482/1348 1170/1473/1340 +f 1170/1473/1340 1177/1482/1348 1178/1483/1349 +f 1170/1473/1340 1178/1483/1349 1171/1474/1341 +f 1171/1474/1341 1178/1483/1349 1179/1484/1350 +f 1171/1474/1341 1179/1484/1350 1172/1475/1342 +f 1172/1475/1342 1179/1484/1350 1180/1485/1351 +f 1172/1475/1342 1180/1485/1351 1173/1476/1343 +f 1173/1476/1343 1180/1485/1351 1181/1486/1352 +f 1173/1476/1343 1181/1486/1352 1174/1477/1344 +f 1174/1477/1344 1181/1486/1352 1182/1487/1353 +f 1174/1477/1344 1182/1487/1353 1175/1478/1345 +f 1175/1478/1345 1182/1487/1353 1392/1488/710 +f 1175/1478/1345 1392/1488/710 1391/1479/709 +f 1151/1480/1346 1152/1489/1354 1183/1490/1355 +f 1151/1480/1346 1183/1490/1355 1176/1481/1347 +f 1176/1481/1347 1183/1490/1355 1184/1491/1356 +f 1176/1481/1347 1184/1491/1356 1177/1482/1348 +f 1177/1482/1348 1184/1491/1356 1185/1492/1357 +f 1177/1482/1348 1185/1492/1357 1178/1483/1349 +f 1178/1483/1349 1185/1492/1357 1186/1493/1358 +f 1178/1483/1349 1186/1493/1358 1179/1484/1350 +f 1179/1484/1350 1186/1493/1358 1187/1494/1359 +f 1179/1484/1350 1187/1494/1359 1180/1485/1351 +f 1180/1485/1351 1187/1494/1359 1188/1495/1360 +f 1180/1485/1351 1188/1495/1360 1181/1486/1352 +f 1181/1486/1352 1188/1495/1360 1189/1496/1361 +f 1181/1486/1352 1189/1496/1361 1182/1487/1353 +f 1182/1487/1353 1189/1496/1361 1393/1497/711 +f 1182/1487/1353 1393/1497/711 1392/1488/710 +f 1152/1489/1354 1153/1498/1362 1190/1499/1363 +f 1152/1489/1354 1190/1499/1363 1183/1490/1355 +f 1183/1490/1355 1190/1499/1363 1191/1500/1364 +f 1183/1490/1355 1191/1500/1364 1184/1491/1356 +f 1184/1491/1356 1191/1500/1364 1192/1501/1365 +f 1184/1491/1356 1192/1501/1365 1185/1492/1357 +f 1185/1492/1357 1192/1501/1365 1193/1502/1366 +f 1185/1492/1357 1193/1502/1366 1186/1493/1358 +f 1186/1493/1358 1193/1502/1366 1194/1503/1367 +f 1186/1493/1358 1194/1503/1367 1187/1494/1359 +f 1187/1494/1359 1194/1503/1367 1195/1504/1368 +f 1187/1494/1359 1195/1504/1368 1188/1495/1360 +f 1188/1495/1360 1195/1504/1368 1196/1505/1369 +f 1188/1495/1360 1196/1505/1369 1189/1496/1361 +f 1189/1496/1361 1196/1505/1369 1394/1506/712 +f 1189/1496/1361 1394/1506/712 1393/1497/711 +f 1153/1498/1362 1154/1507/1370 1197/1508/1371 +f 1153/1498/1362 1197/1508/1371 1190/1499/1363 +f 1190/1499/1363 1197/1508/1371 1198/1509/1372 +f 1190/1499/1363 1198/1509/1372 1191/1500/1364 +f 1191/1500/1364 1198/1509/1372 1199/1510/1373 +f 1191/1500/1364 1199/1510/1373 1192/1501/1365 +f 1192/1501/1365 1199/1510/1373 1200/1511/1374 +f 1192/1501/1365 1200/1511/1374 1193/1502/1366 +f 1193/1502/1366 1200/1511/1374 1201/1512/1375 +f 1193/1502/1366 1201/1512/1375 1194/1503/1367 +f 1194/1503/1367 1201/1512/1375 1202/1513/1376 +f 1194/1503/1367 1202/1513/1376 1195/1504/1368 +f 1195/1504/1368 1202/1513/1376 1203/1514/1377 +f 1195/1504/1368 1203/1514/1377 1196/1505/1369 +f 1196/1505/1369 1203/1514/1377 1395/1515/713 +f 1196/1505/1369 1395/1515/713 1394/1506/712 +f 1154/1507/1370 1493/1516/307 1492/1517/306 +f 1154/1507/1370 1492/1517/306 1197/1508/1371 +f 1197/1508/1371 1492/1517/306 1491/1518/316 +f 1197/1508/1371 1491/1518/316 1198/1509/1372 +f 1198/1509/1372 1491/1518/316 1490/1519/325 +f 1198/1509/1372 1490/1519/325 1199/1510/1373 +f 1199/1510/1373 1490/1519/325 1489/1520/334 +f 1199/1510/1373 1489/1520/334 1200/1511/1374 +f 1200/1511/1374 1489/1520/334 1488/1521/343 +f 1200/1511/1374 1488/1521/343 1201/1512/1375 +f 1201/1512/1375 1488/1521/343 1487/1522/352 +f 1201/1512/1375 1487/1522/352 1202/1513/1376 +f 1202/1513/1376 1487/1522/352 1486/1523/361 +f 1202/1513/1376 1486/1523/361 1203/1514/1377 +f 1203/1514/1377 1486/1523/361 1535/1524/370 +f 1203/1514/1377 1535/1524/370 1395/1515/713 +f 1126/1444/1314 1127/1447/1317 1204/1525/1378 +f 1126/1444/1314 1204/1525/1378 1134/1526/1379 +f 1134/1526/1379 1204/1525/1378 1205/1527/1380 +f 1134/1526/1379 1205/1527/1380 1135/1528/1381 +f 1135/1528/1381 1205/1527/1380 1206/1529/1382 +f 1135/1528/1381 1206/1529/1382 1136/1530/1383 +f 1136/1530/1383 1206/1529/1382 1207/1531/1384 +f 1136/1530/1383 1207/1531/1384 1137/1532/1385 +f 1137/1532/1385 1207/1531/1384 1208/1533/1386 +f 1137/1532/1385 1208/1533/1386 1138/1534/1387 +f 1138/1534/1387 1208/1533/1386 1209/1535/1388 +f 1138/1534/1387 1209/1535/1388 1139/1536/1389 +f 1139/1536/1389 1209/1535/1388 1210/1537/1390 +f 1139/1536/1389 1210/1537/1390 1140/1538/1391 +f 1140/1538/1391 1210/1537/1390 1372/1539/74 +f 1140/1538/1391 1372/1539/74 1373/1540/73 +f 1127/1447/1317 1128/1449/1319 1211/1541/1392 +f 1127/1447/1317 1211/1541/1392 1204/1525/1378 +f 1204/1525/1378 1211/1541/1392 1212/1542/1393 +f 1204/1525/1378 1212/1542/1393 1205/1527/1380 +f 1205/1527/1380 1212/1542/1393 1213/1543/1394 +f 1205/1527/1380 1213/1543/1394 1206/1529/1382 +f 1206/1529/1382 1213/1543/1394 1214/1544/1395 +f 1206/1529/1382 1214/1544/1395 1207/1531/1384 +f 1207/1531/1384 1214/1544/1395 1215/1545/1396 +f 1207/1531/1384 1215/1545/1396 1208/1533/1386 +f 1208/1533/1386 1215/1545/1396 1216/1546/1397 +f 1208/1533/1386 1216/1546/1397 1209/1535/1388 +f 1209/1535/1388 1216/1546/1397 1217/1547/1398 +f 1209/1535/1388 1217/1547/1398 1210/1537/1390 +f 1210/1537/1390 1217/1547/1398 1371/1548/75 +f 1210/1537/1390 1371/1548/75 1372/1539/74 +f 1128/1449/1319 1129/1451/1321 1218/1549/1399 +f 1128/1449/1319 1218/1549/1399 1211/1541/1392 +f 1211/1541/1392 1218/1549/1399 1219/1550/1400 +f 1211/1541/1392 1219/1550/1400 1212/1542/1393 +f 1212/1542/1393 1219/1550/1400 1220/1551/1401 +f 1212/1542/1393 1220/1551/1401 1213/1543/1394 +f 1213/1543/1394 1220/1551/1401 1221/1552/1402 +f 1213/1543/1394 1221/1552/1402 1214/1544/1395 +f 1214/1544/1395 1221/1552/1402 1222/1553/1403 +f 1214/1544/1395 1222/1553/1403 1215/1545/1396 +f 1215/1545/1396 1222/1553/1403 1223/1554/1404 +f 1215/1545/1396 1223/1554/1404 1216/1546/1397 +f 1216/1546/1397 1223/1554/1404 1224/1555/1405 +f 1216/1546/1397 1224/1555/1405 1217/1547/1398 +f 1217/1547/1398 1224/1555/1405 1370/1556/76 +f 1217/1547/1398 1370/1556/76 1371/1548/75 +f 1129/1451/1321 1130/1453/1323 1225/1557/1406 +f 1129/1451/1321 1225/1557/1406 1218/1549/1399 +f 1218/1549/1399 1225/1557/1406 1226/1558/1407 +f 1218/1549/1399 1226/1558/1407 1219/1550/1400 +f 1219/1550/1400 1226/1558/1407 1227/1559/1408 +f 1219/1550/1400 1227/1559/1408 1220/1551/1401 +f 1220/1551/1401 1227/1559/1408 1228/1560/1409 +f 1220/1551/1401 1228/1560/1409 1221/1552/1402 +f 1221/1552/1402 1228/1560/1409 1229/1561/1410 +f 1221/1552/1402 1229/1561/1410 1222/1553/1403 +f 1222/1553/1403 1229/1561/1410 1230/1562/1411 +f 1222/1553/1403 1230/1562/1411 1223/1554/1404 +f 1223/1554/1404 1230/1562/1411 1231/1563/1412 +f 1223/1554/1404 1231/1563/1412 1224/1555/1405 +f 1224/1555/1405 1231/1563/1412 1369/1564/77 +f 1224/1555/1405 1369/1564/77 1370/1556/76 +f 1130/1453/1323 1131/1455/1325 1232/1565/1413 +f 1130/1453/1323 1232/1565/1413 1225/1557/1406 +f 1225/1557/1406 1232/1565/1413 1233/1566/1414 +f 1225/1557/1406 1233/1566/1414 1226/1558/1407 +f 1226/1558/1407 1233/1566/1414 1234/1567/1415 +f 1226/1558/1407 1234/1567/1415 1227/1559/1408 +f 1227/1559/1408 1234/1567/1415 1235/1568/1416 +f 1227/1559/1408 1235/1568/1416 1228/1560/1409 +f 1228/1560/1409 1235/1568/1416 1236/1569/1417 +f 1228/1560/1409 1236/1569/1417 1229/1561/1410 +f 1229/1561/1410 1236/1569/1417 1237/1570/1418 +f 1229/1561/1410 1237/1570/1418 1230/1562/1411 +f 1230/1562/1411 1237/1570/1418 1238/1571/1419 +f 1230/1562/1411 1238/1571/1419 1231/1563/1412 +f 1231/1563/1412 1238/1571/1419 1368/1572/78 +f 1231/1563/1412 1368/1572/78 1369/1564/77 +f 1131/1455/1325 1132/1457/1327 1239/1573/1420 +f 1131/1455/1325 1239/1573/1420 1232/1565/1413 +f 1232/1565/1413 1239/1573/1420 1240/1574/1421 +f 1232/1565/1413 1240/1574/1421 1233/1566/1414 +f 1233/1566/1414 1240/1574/1421 1241/1575/1422 +f 1233/1566/1414 1241/1575/1422 1234/1567/1415 +f 1234/1567/1415 1241/1575/1422 1242/1576/1423 +f 1234/1567/1415 1242/1576/1423 1235/1568/1416 +f 1235/1568/1416 1242/1576/1423 1243/1577/1424 +f 1235/1568/1416 1243/1577/1424 1236/1569/1417 +f 1236/1569/1417 1243/1577/1424 1244/1578/1425 +f 1236/1569/1417 1244/1578/1425 1237/1570/1418 +f 1237/1570/1418 1244/1578/1425 1245/1579/1426 +f 1237/1570/1418 1245/1579/1426 1238/1571/1419 +f 1238/1571/1419 1245/1579/1426 1367/1580/79 +f 1238/1571/1419 1367/1580/79 1368/1572/78 +f 1132/1457/1327 1133/1459/1329 1246/1581/1427 +f 1132/1457/1327 1246/1581/1427 1239/1573/1420 +f 1239/1573/1420 1246/1581/1427 1247/1582/1428 +f 1239/1573/1420 1247/1582/1428 1240/1574/1421 +f 1240/1574/1421 1247/1582/1428 1248/1583/1429 +f 1240/1574/1421 1248/1583/1429 1241/1575/1422 +f 1241/1575/1422 1248/1583/1429 1249/1584/1430 +f 1241/1575/1422 1249/1584/1430 1242/1576/1423 +f 1242/1576/1423 1249/1584/1430 1250/1585/1431 +f 1242/1576/1423 1250/1585/1431 1243/1577/1424 +f 1243/1577/1424 1250/1585/1431 1251/1586/1432 +f 1243/1577/1424 1251/1586/1432 1244/1578/1425 +f 1244/1578/1425 1251/1586/1432 1252/1587/1433 +f 1244/1578/1425 1252/1587/1433 1245/1579/1426 +f 1245/1579/1426 1252/1587/1433 1366/1588/80 +f 1245/1579/1426 1366/1588/80 1367/1580/79 +f 1133/1459/1329 1388/1461/596 1387/1589/595 +f 1133/1459/1329 1387/1589/595 1246/1581/1427 +f 1246/1581/1427 1387/1589/595 1386/1590/605 +f 1246/1581/1427 1386/1590/605 1247/1582/1428 +f 1247/1582/1428 1386/1590/605 1385/1591/614 +f 1247/1582/1428 1385/1591/614 1248/1583/1429 +f 1248/1583/1429 1385/1591/614 1384/1592/623 +f 1248/1583/1429 1384/1592/623 1249/1584/1430 +f 1249/1584/1430 1384/1592/623 1383/1593/632 +f 1249/1584/1430 1383/1593/632 1250/1585/1431 +f 1250/1585/1431 1383/1593/632 1382/1594/641 +f 1250/1585/1431 1382/1594/641 1251/1586/1432 +f 1251/1586/1432 1382/1594/641 1381/1595/650 +f 1251/1586/1432 1381/1595/650 1252/1587/1433 +f 1252/1587/1433 1381/1595/650 1531/1596/81 +f 1252/1587/1433 1531/1596/81 1366/1588/80 +f 1126/1444/1314 1134/1526/1379 1253/1597/1434 +f 1126/1444/1314 1253/1597/1434 1141/1598/1435 +f 1141/1598/1435 1253/1597/1434 1254/1599/1436 +f 1141/1598/1435 1254/1599/1436 1142/1600/1437 +f 1142/1600/1437 1254/1599/1436 1255/1601/1438 +f 1142/1600/1437 1255/1601/1438 1143/1602/1439 +f 1143/1602/1439 1255/1601/1438 1256/1603/1440 +f 1143/1602/1439 1256/1603/1440 1144/1604/1441 +f 1144/1604/1441 1256/1603/1440 1257/1605/1442 +f 1144/1604/1441 1257/1605/1442 1145/1606/1443 +f 1145/1606/1443 1257/1605/1442 1258/1607/1444 +f 1145/1606/1443 1258/1607/1444 1146/1608/1445 +f 1146/1608/1445 1258/1607/1444 1259/1609/1446 +f 1146/1608/1445 1259/1609/1446 1147/1610/1447 +f 1147/1610/1447 1259/1609/1446 1462/1611/1307 +f 1147/1610/1447 1462/1611/1307 1463/1612/1209 +f 1134/1526/1379 1135/1528/1381 1260/1613/1448 +f 1134/1526/1379 1260/1613/1448 1253/1597/1434 +f 1253/1597/1434 1260/1613/1448 1261/1614/1449 +f 1253/1597/1434 1261/1614/1449 1254/1599/1436 +f 1254/1599/1436 1261/1614/1449 1262/1615/1450 +f 1254/1599/1436 1262/1615/1450 1255/1601/1438 +f 1255/1601/1438 1262/1615/1450 1263/1616/1451 +f 1255/1601/1438 1263/1616/1451 1256/1603/1440 +f 1256/1603/1440 1263/1616/1451 1264/1617/1452 +f 1256/1603/1440 1264/1617/1452 1257/1605/1442 +f 1257/1605/1442 1264/1617/1452 1265/1618/1453 +f 1257/1605/1442 1265/1618/1453 1258/1607/1444 +f 1258/1607/1444 1265/1618/1453 1266/1619/1454 +f 1258/1607/1444 1266/1619/1454 1259/1609/1446 +f 1259/1609/1446 1266/1619/1454 1461/1620/1308 +f 1259/1609/1446 1461/1620/1308 1462/1611/1307 +f 1135/1528/1381 1136/1530/1383 1267/1621/1455 +f 1135/1528/1381 1267/1621/1455 1260/1613/1448 +f 1260/1613/1448 1267/1621/1455 1268/1622/1456 +f 1260/1613/1448 1268/1622/1456 1261/1614/1449 +f 1261/1614/1449 1268/1622/1456 1269/1623/1457 +f 1261/1614/1449 1269/1623/1457 1262/1615/1450 +f 1262/1615/1450 1269/1623/1457 1270/1624/1458 +f 1262/1615/1450 1270/1624/1458 1263/1616/1451 +f 1263/1616/1451 1270/1624/1458 1271/1625/1459 +f 1263/1616/1451 1271/1625/1459 1264/1617/1452 +f 1264/1617/1452 1271/1625/1459 1272/1626/1460 +f 1264/1617/1452 1272/1626/1460 1265/1618/1453 +f 1265/1618/1453 1272/1626/1460 1273/1627/1461 +f 1265/1618/1453 1273/1627/1461 1266/1619/1454 +f 1266/1619/1454 1273/1627/1461 1460/1628/1309 +f 1266/1619/1454 1460/1628/1309 1461/1620/1308 +f 1136/1530/1383 1137/1532/1385 1274/1629/1462 +f 1136/1530/1383 1274/1629/1462 1267/1621/1455 +f 1267/1621/1455 1274/1629/1462 1275/1630/1463 +f 1267/1621/1455 1275/1630/1463 1268/1622/1456 +f 1268/1622/1456 1275/1630/1463 1276/1631/1464 +f 1268/1622/1456 1276/1631/1464 1269/1623/1457 +f 1269/1623/1457 1276/1631/1464 1277/1632/1465 +f 1269/1623/1457 1277/1632/1465 1270/1624/1458 +f 1270/1624/1458 1277/1632/1465 1278/1633/1466 +f 1270/1624/1458 1278/1633/1466 1271/1625/1459 +f 1271/1625/1459 1278/1633/1466 1279/1634/1467 +f 1271/1625/1459 1279/1634/1467 1272/1626/1460 +f 1272/1626/1460 1279/1634/1467 1280/1635/1468 +f 1272/1626/1460 1280/1635/1468 1273/1627/1461 +f 1273/1627/1461 1280/1635/1468 1459/1636/1310 +f 1273/1627/1461 1459/1636/1310 1460/1628/1309 +f 1137/1532/1385 1138/1534/1387 1281/1637/1469 +f 1137/1532/1385 1281/1637/1469 1274/1629/1462 +f 1274/1629/1462 1281/1637/1469 1282/1638/1470 +f 1274/1629/1462 1282/1638/1470 1275/1630/1463 +f 1275/1630/1463 1282/1638/1470 1283/1639/1471 +f 1275/1630/1463 1283/1639/1471 1276/1631/1464 +f 1276/1631/1464 1283/1639/1471 1284/1640/1472 +f 1276/1631/1464 1284/1640/1472 1277/1632/1465 +f 1277/1632/1465 1284/1640/1472 1285/1641/1473 +f 1277/1632/1465 1285/1641/1473 1278/1633/1466 +f 1278/1633/1466 1285/1641/1473 1286/1642/1474 +f 1278/1633/1466 1286/1642/1474 1279/1634/1467 +f 1279/1634/1467 1286/1642/1474 1287/1643/1475 +f 1279/1634/1467 1287/1643/1475 1280/1635/1468 +f 1280/1635/1468 1287/1643/1475 1458/1644/1311 +f 1280/1635/1468 1458/1644/1311 1459/1636/1310 +f 1138/1534/1387 1139/1536/1389 1288/1645/1476 +f 1138/1534/1387 1288/1645/1476 1281/1637/1469 +f 1281/1637/1469 1288/1645/1476 1289/1646/1477 +f 1281/1637/1469 1289/1646/1477 1282/1638/1470 +f 1282/1638/1470 1289/1646/1477 1290/1647/1478 +f 1282/1638/1470 1290/1647/1478 1283/1639/1471 +f 1283/1639/1471 1290/1647/1478 1291/1648/1479 +f 1283/1639/1471 1291/1648/1479 1284/1640/1472 +f 1284/1640/1472 1291/1648/1479 1292/1649/1480 +f 1284/1640/1472 1292/1649/1480 1285/1641/1473 +f 1285/1641/1473 1292/1649/1480 1293/1650/1481 +f 1285/1641/1473 1293/1650/1481 1286/1642/1474 +f 1286/1642/1474 1293/1650/1481 1294/1651/1482 +f 1286/1642/1474 1294/1651/1482 1287/1643/1475 +f 1287/1643/1475 1294/1651/1482 1457/1652/1312 +f 1287/1643/1475 1457/1652/1312 1458/1644/1311 +f 1139/1536/1389 1140/1538/1391 1295/1653/1483 +f 1139/1536/1389 1295/1653/1483 1288/1645/1476 +f 1288/1645/1476 1295/1653/1483 1296/1654/1484 +f 1288/1645/1476 1296/1654/1484 1289/1646/1477 +f 1289/1646/1477 1296/1654/1484 1297/1655/1485 +f 1289/1646/1477 1297/1655/1485 1290/1647/1478 +f 1290/1647/1478 1297/1655/1485 1298/1656/1486 +f 1290/1647/1478 1298/1656/1486 1291/1648/1479 +f 1291/1648/1479 1298/1656/1486 1299/1657/1487 +f 1291/1648/1479 1299/1657/1487 1292/1649/1480 +f 1292/1649/1480 1299/1657/1487 1300/1658/1488 +f 1292/1649/1480 1300/1658/1488 1293/1650/1481 +f 1293/1650/1481 1300/1658/1488 1301/1659/1489 +f 1293/1650/1481 1301/1659/1489 1294/1651/1482 +f 1294/1651/1482 1301/1659/1489 1456/1660/1313 +f 1294/1651/1482 1456/1660/1313 1457/1652/1312 +f 1140/1538/1391 1373/1540/73 1374/1661/233 +f 1140/1538/1391 1374/1661/233 1295/1653/1483 +f 1295/1653/1483 1374/1661/233 1375/1662/241 +f 1295/1653/1483 1375/1662/241 1296/1654/1484 +f 1296/1654/1484 1375/1662/241 1376/1663/249 +f 1296/1654/1484 1376/1663/249 1297/1655/1485 +f 1297/1655/1485 1376/1663/249 1377/1664/257 +f 1297/1655/1485 1377/1664/257 1298/1656/1486 +f 1298/1656/1486 1377/1664/257 1378/1665/265 +f 1298/1656/1486 1378/1665/265 1299/1657/1487 +f 1299/1657/1487 1378/1665/265 1379/1666/273 +f 1299/1657/1487 1379/1666/273 1300/1658/1488 +f 1300/1658/1488 1379/1666/273 1380/1667/281 +f 1300/1658/1488 1380/1667/281 1301/1659/1489 +f 1301/1659/1489 1380/1667/281 1534/1668/289 +f 1301/1659/1489 1534/1668/289 1456/1660/1313 +f 1126/1444/1314 1141/1598/1435 1302/1669/1490 +f 1126/1444/1314 1302/1669/1490 1148/1445/1315 +f 1148/1445/1315 1302/1669/1490 1303/1670/1491 +f 1148/1445/1315 1303/1670/1491 1149/1462/1330 +f 1149/1462/1330 1303/1670/1491 1304/1671/1492 +f 1149/1462/1330 1304/1671/1492 1150/1471/1338 +f 1150/1471/1338 1304/1671/1492 1305/1672/1493 +f 1150/1471/1338 1305/1672/1493 1151/1480/1346 +f 1151/1480/1346 1305/1672/1493 1306/1673/1494 +f 1151/1480/1346 1306/1673/1494 1152/1489/1354 +f 1152/1489/1354 1306/1673/1494 1307/1674/1495 +f 1152/1489/1354 1307/1674/1495 1153/1498/1362 +f 1153/1498/1362 1307/1674/1495 1308/1675/1496 +f 1153/1498/1362 1308/1675/1496 1154/1507/1370 +f 1154/1507/1370 1308/1675/1496 1494/1676/435 +f 1154/1507/1370 1494/1676/435 1493/1516/307 +f 1141/1598/1435 1142/1600/1437 1309/1677/1497 +f 1141/1598/1435 1309/1677/1497 1302/1669/1490 +f 1302/1669/1490 1309/1677/1497 1310/1678/1498 +f 1302/1669/1490 1310/1678/1498 1303/1670/1491 +f 1303/1670/1491 1310/1678/1498 1311/1679/1499 +f 1303/1670/1491 1311/1679/1499 1304/1671/1492 +f 1304/1671/1492 1311/1679/1499 1312/1680/1500 +f 1304/1671/1492 1312/1680/1500 1305/1672/1493 +f 1305/1672/1493 1312/1680/1500 1313/1681/1501 +f 1305/1672/1493 1313/1681/1501 1306/1673/1494 +f 1306/1673/1494 1313/1681/1501 1314/1682/1502 +f 1306/1673/1494 1314/1682/1502 1307/1674/1495 +f 1307/1674/1495 1314/1682/1502 1315/1683/1503 +f 1307/1674/1495 1315/1683/1503 1308/1675/1496 +f 1308/1675/1496 1315/1683/1503 1495/1684/436 +f 1308/1675/1496 1495/1684/436 1494/1676/435 +f 1142/1600/1437 1143/1602/1439 1316/1685/1504 +f 1142/1600/1437 1316/1685/1504 1309/1677/1497 +f 1309/1677/1497 1316/1685/1504 1317/1686/1505 +f 1309/1677/1497 1317/1686/1505 1310/1678/1498 +f 1310/1678/1498 1317/1686/1505 1318/1687/1506 +f 1310/1678/1498 1318/1687/1506 1311/1679/1499 +f 1311/1679/1499 1318/1687/1506 1319/1688/1507 +f 1311/1679/1499 1319/1688/1507 1312/1680/1500 +f 1312/1680/1500 1319/1688/1507 1320/1689/1508 +f 1312/1680/1500 1320/1689/1508 1313/1681/1501 +f 1313/1681/1501 1320/1689/1508 1321/1690/1509 +f 1313/1681/1501 1321/1690/1509 1314/1682/1502 +f 1314/1682/1502 1321/1690/1509 1322/1691/1510 +f 1314/1682/1502 1322/1691/1510 1315/1683/1503 +f 1315/1683/1503 1322/1691/1510 1496/1692/437 +f 1315/1683/1503 1496/1692/437 1495/1684/436 +f 1143/1602/1439 1144/1604/1441 1323/1693/1511 +f 1143/1602/1439 1323/1693/1511 1316/1685/1504 +f 1316/1685/1504 1323/1693/1511 1324/1694/1512 +f 1316/1685/1504 1324/1694/1512 1317/1686/1505 +f 1317/1686/1505 1324/1694/1512 1325/1695/1513 +f 1317/1686/1505 1325/1695/1513 1318/1687/1506 +f 1318/1687/1506 1325/1695/1513 1326/1696/1514 +f 1318/1687/1506 1326/1696/1514 1319/1688/1507 +f 1319/1688/1507 1326/1696/1514 1327/1697/1515 +f 1319/1688/1507 1327/1697/1515 1320/1689/1508 +f 1320/1689/1508 1327/1697/1515 1328/1698/1516 +f 1320/1689/1508 1328/1698/1516 1321/1690/1509 +f 1321/1690/1509 1328/1698/1516 1329/1699/1517 +f 1321/1690/1509 1329/1699/1517 1322/1691/1510 +f 1322/1691/1510 1329/1699/1517 1497/1700/438 +f 1322/1691/1510 1497/1700/438 1496/1692/437 +f 1144/1604/1441 1145/1606/1443 1330/1701/1518 +f 1144/1604/1441 1330/1701/1518 1323/1693/1511 +f 1323/1693/1511 1330/1701/1518 1331/1702/1519 +f 1323/1693/1511 1331/1702/1519 1324/1694/1512 +f 1324/1694/1512 1331/1702/1519 1332/1703/1520 +f 1324/1694/1512 1332/1703/1520 1325/1695/1513 +f 1325/1695/1513 1332/1703/1520 1333/1704/1521 +f 1325/1695/1513 1333/1704/1521 1326/1696/1514 +f 1326/1696/1514 1333/1704/1521 1334/1705/1522 +f 1326/1696/1514 1334/1705/1522 1327/1697/1515 +f 1327/1697/1515 1334/1705/1522 1335/1706/1523 +f 1327/1697/1515 1335/1706/1523 1328/1698/1516 +f 1328/1698/1516 1335/1706/1523 1336/1707/1524 +f 1328/1698/1516 1336/1707/1524 1329/1699/1517 +f 1329/1699/1517 1336/1707/1524 1498/1708/439 +f 1329/1699/1517 1498/1708/439 1497/1700/438 +f 1145/1606/1443 1146/1608/1445 1337/1709/1525 +f 1145/1606/1443 1337/1709/1525 1330/1701/1518 +f 1330/1701/1518 1337/1709/1525 1338/1710/1526 +f 1330/1701/1518 1338/1710/1526 1331/1702/1519 +f 1331/1702/1519 1338/1710/1526 1339/1711/1527 +f 1331/1702/1519 1339/1711/1527 1332/1703/1520 +f 1332/1703/1520 1339/1711/1527 1340/1712/1528 +f 1332/1703/1520 1340/1712/1528 1333/1704/1521 +f 1333/1704/1521 1340/1712/1528 1341/1713/1529 +f 1333/1704/1521 1341/1713/1529 1334/1705/1522 +f 1334/1705/1522 1341/1713/1529 1342/1714/1530 +f 1334/1705/1522 1342/1714/1530 1335/1706/1523 +f 1335/1706/1523 1342/1714/1530 1343/1715/1531 +f 1335/1706/1523 1343/1715/1531 1336/1707/1524 +f 1336/1707/1524 1343/1715/1531 1499/1716/440 +f 1336/1707/1524 1499/1716/440 1498/1708/439 +f 1146/1608/1445 1147/1610/1447 1344/1717/1532 +f 1146/1608/1445 1344/1717/1532 1337/1709/1525 +f 1337/1709/1525 1344/1717/1532 1345/1718/1533 +f 1337/1709/1525 1345/1718/1533 1338/1710/1526 +f 1338/1710/1526 1345/1718/1533 1346/1719/1534 +f 1338/1710/1526 1346/1719/1534 1339/1711/1527 +f 1339/1711/1527 1346/1719/1534 1347/1720/1535 +f 1339/1711/1527 1347/1720/1535 1340/1712/1528 +f 1340/1712/1528 1347/1720/1535 1348/1721/1536 +f 1340/1712/1528 1348/1721/1536 1341/1713/1529 +f 1341/1713/1529 1348/1721/1536 1349/1722/1537 +f 1341/1713/1529 1349/1722/1537 1342/1714/1530 +f 1342/1714/1530 1349/1722/1537 1350/1723/1538 +f 1342/1714/1530 1350/1723/1538 1343/1715/1531 +f 1343/1715/1531 1350/1723/1538 1500/1724/441 +f 1343/1715/1531 1500/1724/441 1499/1716/440 +f 1147/1610/1447 1463/1612/1209 1464/1725/1208 +f 1147/1610/1447 1464/1725/1208 1344/1717/1532 +f 1344/1717/1532 1464/1725/1208 1465/1726/1217 +f 1344/1717/1532 1465/1726/1217 1345/1718/1533 +f 1345/1718/1533 1465/1726/1217 1466/1727/1225 +f 1345/1718/1533 1466/1727/1225 1346/1719/1534 +f 1346/1719/1534 1466/1727/1225 1467/1728/1233 +f 1346/1719/1534 1467/1728/1233 1347/1720/1535 +f 1347/1720/1535 1467/1728/1233 1468/1729/1241 +f 1347/1720/1535 1468/1729/1241 1348/1721/1536 +f 1348/1721/1536 1468/1729/1241 1469/1730/1249 +f 1348/1721/1536 1469/1730/1249 1349/1722/1537 +f 1349/1722/1537 1469/1730/1249 1470/1731/1257 +f 1349/1722/1537 1470/1731/1257 1350/1723/1538 +f 1350/1723/1538 1470/1731/1257 1538/1732/442 +f 1350/1723/1538 1538/1732/442 1500/1724/441 diff --git a/res/models/asteroids/asteroid05.mtl b/res/models/asteroids/asteroid05.mtl new file mode 100644 index 0000000..68c3da6 --- /dev/null +++ b/res/models/asteroids/asteroid05.mtl @@ -0,0 +1,14 @@ +# Blender MTL File: 'asteroid.blend' +# Material Count: 1 +newmtl Material +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 1 +map_Kd limestone.jpg +map_Bump limestone.jpg + + diff --git a/res/models/asteroids/asteroid05.obj b/res/models/asteroids/asteroid05.obj new file mode 100644 index 0000000..e85cbd7 --- /dev/null +++ b/res/models/asteroids/asteroid05.obj @@ -0,0 +1,7887 @@ +# Blender v2.63 (sub 0) OBJ File: 'asteroid.blend' +# www.blender.org +mtllib asteroid05.mtl +o Cube +v 0.000000 -0.724411 -0.000000 +v 0.077119 -0.736497 -0.000000 +v 0.151331 -0.715386 -0.000000 +v 0.226633 -0.707119 -0.000000 +v 0.303594 -0.700744 -0.000000 +v 0.369905 -0.666373 -0.000000 +v 0.435244 -0.634061 0.000000 +v 0.498250 -0.598680 0.000000 +v 0.000000 -0.721149 0.075814 +v 0.000000 -0.693267 0.147515 +v -0.000000 -0.655507 0.212937 +v -0.000000 -0.628169 0.276942 +v -0.000000 -0.611521 0.343420 +v -0.000000 -0.574963 0.398670 +v -0.000000 -0.558593 0.466756 +v -0.076634 -0.730794 -0.000000 +v -0.152649 -0.723028 -0.000000 +v -0.228638 -0.714673 -0.000000 +v -0.296907 -0.682535 -0.000000 +v -0.356564 -0.638742 -0.000000 +v -0.407067 -0.588531 -0.000000 +v -0.468544 -0.560870 -0.000000 +v 0.000000 -0.734421 -0.076943 +v 0.000000 -0.702720 -0.149146 +v 0.000000 -0.699089 -0.224503 +v 0.000000 -0.688180 -0.298980 +v 0.000000 -0.673171 -0.373187 +v 0.000000 -0.648741 -0.444329 +v 0.000000 -0.637283 -0.528578 +v 0.077621 -0.743962 -0.077622 +v 0.155796 -0.742622 -0.077326 +v 0.230616 -0.723325 -0.075628 +v 0.305772 -0.707632 -0.074650 +v 0.366252 -0.659610 -0.071127 +v 0.431659 -0.628804 -0.070059 +v 0.501110 -0.602571 -0.070702 +v 0.075380 -0.720416 -0.151940 +v 0.149744 -0.709972 -0.149744 +v 0.226561 -0.709705 -0.149715 +v 0.302669 -0.700330 -0.148931 +v 0.364707 -0.657426 -0.142920 +v 0.430687 -0.627933 -0.141065 +v 0.502881 -0.605141 -0.143057 +v 0.073006 -0.694417 -0.222902 +v 0.146436 -0.691693 -0.221681 +v 0.220651 -0.687724 -0.220651 +v 0.291208 -0.669315 -0.216735 +v 0.357202 -0.641895 -0.211807 +v 0.418394 -0.608246 -0.207256 +v 0.499269 -0.600491 -0.214603 +v 0.071801 -0.677647 -0.294711 +v 0.140618 -0.656390 -0.286262 +v 0.208458 -0.640377 -0.280205 +v 0.270647 -0.612439 -0.270647 +v 0.336318 -0.597582 -0.267859 +v 0.409372 -0.592361 -0.272289 +v 0.499401 -0.599700 -0.287886 +v 0.069316 -0.641626 -0.357538 +v 0.134329 -0.614192 -0.343565 +v 0.195452 -0.587002 -0.329992 +v 0.254234 -0.563779 -0.319244 +v 0.321501 -0.562941 -0.321501 +v 0.394055 -0.564579 -0.329088 +v 0.474890 -0.567004 -0.343917 +v 0.068267 -0.612253 -0.421391 +v 0.129602 -0.573781 -0.396871 +v 0.189856 -0.553004 -0.383567 +v 0.249653 -0.538871 -0.375193 +v 0.311164 -0.531385 -0.372439 +v 0.375388 -0.526971 -0.375388 +v 0.437915 -0.516624 -0.380312 +v 0.069802 -0.594968 -0.495128 +v 0.132680 -0.559994 -0.467239 +v 0.194394 -0.541004 -0.452055 +v 0.255938 -0.529333 -0.443122 +v 0.311753 -0.510950 -0.429584 +v 0.367743 -0.498722 -0.423216 +v 0.414488 -0.479662 -0.414488 +v 0.076494 -0.730807 0.076494 +v 0.074338 -0.708525 0.149875 +v 0.069914 -0.660318 0.213802 +v 0.069030 -0.648480 0.283952 +v 0.068369 -0.632230 0.352985 +v 0.068556 -0.614929 0.423051 +v 0.066108 -0.563749 0.470569 +v 0.148263 -0.699237 0.073525 +v 0.149441 -0.708259 0.149441 +v 0.146508 -0.692092 0.221789 +v 0.140784 -0.657269 0.286590 +v 0.143553 -0.660614 0.366266 +v 0.144527 -0.644284 0.440897 +v 0.136599 -0.577043 0.480698 +v 0.220519 -0.685486 0.072197 +v 0.221885 -0.692449 0.146573 +v 0.216145 -0.671477 0.216145 +v 0.218788 -0.676493 0.293937 +v 0.219986 -0.669344 0.370809 +v 0.217753 -0.641573 0.439405 +v 0.200917 -0.560206 0.467295 +v 0.296243 -0.681798 0.072196 +v 0.288539 -0.662487 0.141771 +v 0.285782 -0.655046 0.212653 +v 0.286697 -0.653633 0.286697 +v 0.287259 -0.645714 0.360631 +v 0.283678 -0.619271 0.426567 +v 0.267734 -0.555314 0.463902 +v 0.369300 -0.665901 0.071761 +v 0.360332 -0.648481 0.141142 +v 0.347820 -0.622968 0.206168 +v 0.342012 -0.608853 0.272402 +v 0.342145 -0.602728 0.342146 +v 0.333315 -0.572407 0.399152 +v 0.324289 -0.532798 0.447242 +v 0.447693 -0.654650 0.072857 +v 0.445080 -0.650982 0.145945 +v 0.421197 -0.612692 0.208656 +v 0.394529 -0.569132 0.262459 +v 0.389609 -0.557752 0.325402 +v 0.388984 -0.547276 0.388985 +v 0.380893 -0.517451 0.438594 +v 0.514126 -0.619117 0.072660 +v 0.526238 -0.634726 0.149857 +v 0.496553 -0.597069 0.213440 +v 0.470248 -0.563250 0.271337 +v 0.461424 -0.550345 0.334357 +v 0.451002 -0.532563 0.391504 +v 0.436750 -0.505952 0.436750 +v -0.075056 -0.714020 0.075056 +v -0.145585 -0.683815 0.072173 +v -0.208323 -0.639784 0.068052 +v -0.278770 -0.634431 0.067696 +v -0.337175 -0.599599 0.065082 +v -0.399214 -0.576506 0.064396 +v -0.468590 -0.561233 0.065810 +v -0.072197 -0.684080 0.145631 +v -0.137610 -0.641381 0.137610 +v -0.196701 -0.599503 0.129651 +v -0.264737 -0.598745 0.129712 +v -0.320320 -0.566658 0.124883 +v -0.379656 -0.546212 0.123765 +v -0.458173 -0.548511 0.130041 +v -0.069422 -0.654887 0.212353 +v -0.135214 -0.630056 0.204980 +v -0.193444 -0.589624 0.193444 +v -0.256109 -0.577004 0.190331 +v -0.315917 -0.558609 0.186992 +v -0.374822 -0.539132 0.185486 +v -0.451455 -0.540248 0.194136 +v -0.065859 -0.615095 0.271637 +v -0.131038 -0.605751 0.267353 +v -0.188536 -0.570727 0.253722 +v -0.250744 -0.561356 0.250744 +v -0.307314 -0.540162 0.244715 +v -0.368321 -0.528116 0.245101 +v -0.439757 -0.525126 0.254028 +v -0.064279 -0.591620 0.333309 +v -0.124826 -0.566370 0.320180 +v -0.182652 -0.544040 0.308695 +v -0.239123 -0.526286 0.300305 +v -0.291008 -0.504173 0.291008 +v -0.343869 -0.487509 0.287472 +v -0.413161 -0.490632 0.300094 +v -0.063122 -0.564735 0.391911 +v -0.122128 -0.538478 0.374826 +v -0.170823 -0.492578 0.345473 +v -0.220822 -0.470743 0.331660 +v -0.265246 -0.446347 0.317064 +v -0.324855 -0.451506 0.324855 +v -0.389680 -0.457877 0.339064 +v -0.064084 -0.546640 0.457109 +v -0.121846 -0.512854 0.430022 +v -0.168931 -0.466056 0.392569 +v -0.214919 -0.438987 0.370865 +v -0.260386 -0.421431 0.357229 +v -0.313817 -0.421919 0.360156 +v -0.372186 -0.429705 0.372186 +v -0.076974 -0.736402 -0.076974 +v -0.074901 -0.714944 -0.150990 +v -0.073258 -0.697190 -0.223642 +v -0.071051 -0.669755 -0.291800 +v -0.070935 -0.657705 -0.365329 +v -0.070379 -0.631769 -0.433499 +v -0.071629 -0.610408 -0.507275 +v -0.150460 -0.711894 -0.074634 +v -0.144307 -0.679236 -0.144307 +v -0.145619 -0.687209 -0.220466 +v -0.146512 -0.687544 -0.297895 +v -0.143952 -0.662621 -0.367247 +v -0.140318 -0.624405 -0.428484 +v -0.144676 -0.612188 -0.508445 +v -0.227347 -0.711076 -0.074517 +v -0.220688 -0.688029 -0.145769 +v -0.221308 -0.690095 -0.221309 +v -0.224448 -0.696283 -0.301462 +v -0.219168 -0.666601 -0.369449 +v -0.216480 -0.637532 -0.436857 +v -0.214566 -0.600382 -0.499182 +v -0.301231 -0.695321 -0.073481 +v -0.301607 -0.697486 -0.148393 +v -0.288581 -0.662407 -0.214759 +v -0.285748 -0.651199 -0.285748 +v -0.295687 -0.666626 -0.371194 +v -0.287493 -0.628286 -0.432328 +v -0.289595 -0.603464 -0.502411 +v -0.367486 -0.662157 -0.071384 +v -0.364177 -0.656343 -0.142704 +v -0.350322 -0.628016 -0.207672 +v -0.345426 -0.615614 -0.275127 +v -0.349601 -0.617098 -0.349602 +v -0.345499 -0.594972 -0.413846 +v -0.343833 -0.566859 -0.474772 +v -0.419734 -0.609583 -0.067978 +v -0.426332 -0.620959 -0.139589 +v -0.424251 -0.617535 -0.210182 +v -0.404359 -0.584515 -0.268969 +v -0.402605 -0.577709 -0.336178 +v -0.394576 -0.555627 -0.394577 +v -0.388750 -0.528641 -0.447781 +v -0.481587 -0.577755 -0.067766 +v -0.491337 -0.590519 -0.139696 +v -0.483334 -0.580414 -0.207782 +v -0.460337 -0.550858 -0.265711 +v -0.444569 -0.529491 -0.322392 +v -0.427990 -0.504536 -0.371825 +v -0.424440 -0.491414 -0.424440 +v -0.000000 0.936158 0.000000 +v -0.000000 0.945899 -0.094923 +v -0.000000 0.905482 -0.184122 +v -0.000000 0.877842 -0.271937 +v 0.000000 0.789262 -0.336099 +v 0.000000 0.695251 -0.383848 +v 0.000000 0.620886 -0.427090 +v 0.000000 0.537912 -0.450508 +v -0.094189 0.937257 0.000000 +v -0.184331 0.906692 0.000000 +v -0.274816 0.888694 0.000000 +v -0.364126 0.865582 0.000000 +v -0.446130 0.824243 0.000000 +v -0.550534 0.820351 -0.000000 +v -0.641469 0.780975 -0.000000 +v -0.000000 0.848568 0.086648 +v -0.000000 0.794293 0.164942 +v -0.000000 0.746633 0.237119 +v -0.000000 0.705532 0.305352 +v -0.000000 0.648379 0.361217 +v -0.000000 0.589936 0.407937 +v -0.000000 0.572146 0.477404 +v 0.093980 0.934804 0.000000 +v 0.185715 0.914714 0.000000 +v 0.271810 0.877366 0.000000 +v 0.362937 0.862347 0.000000 +v 0.432433 0.795876 0.000000 +v 0.498267 0.735896 0.000000 +v 0.563869 0.682202 0.000000 +v 0.093020 0.923680 -0.093019 +v 0.091221 0.901222 -0.183335 +v 0.087956 0.859275 -0.266894 +v 0.082152 0.786598 -0.334901 +v 0.074153 0.689645 -0.380805 +v 0.070898 0.636560 -0.436471 +v 0.062411 0.532498 -0.445985 +v 0.188380 0.930274 -0.093766 +v 0.182225 0.893589 -0.182225 +v 0.175228 0.849841 -0.264531 +v 0.164518 0.782721 -0.333434 +v 0.153351 0.709920 -0.390377 +v 0.140393 0.624755 -0.428703 +v 0.127687 0.538267 -0.450085 +v 0.279252 0.905585 -0.092156 +v 0.276732 0.894869 -0.183426 +v 0.265746 0.850324 -0.265746 +v 0.251541 0.791004 -0.337476 +v 0.228232 0.697019 -0.384527 +v 0.208739 0.612955 -0.421363 +v 0.193240 0.537609 -0.449360 +v 0.367265 0.874334 -0.090487 +v 0.361059 0.856704 -0.178513 +v 0.349973 0.823871 -0.260942 +v 0.331335 0.768206 -0.331335 +v 0.303776 0.686695 -0.381331 +v 0.280926 0.612769 -0.422412 +v 0.263416 0.545804 -0.456295 +v 0.442903 0.817809 -0.087062 +v 0.442873 0.817273 -0.174682 +v 0.432315 0.793424 -0.256955 +v 0.410458 0.744358 -0.327017 +v 0.382066 0.679666 -0.382066 +v 0.349899 0.603119 -0.419152 +v 0.332658 0.547383 -0.459030 +v 0.520746 0.772402 -0.085606 +v 0.517199 0.766472 -0.170394 +v 0.502342 0.741404 -0.249195 +v 0.486567 0.713170 -0.323415 +v 0.447315 0.646369 -0.373252 +v 0.411635 0.581102 -0.411635 +v 0.391400 0.532415 -0.450880 +v 0.586116 0.710629 -0.083487 +v 0.580955 0.704033 -0.165786 +v 0.567591 0.686573 -0.243847 +v 0.554936 0.669140 -0.319412 +v 0.517947 0.620275 -0.374484 +v 0.480564 0.568569 -0.416784 +v 0.459156 0.532412 -0.459155 +v -0.093690 0.931503 -0.093690 +v -0.187028 0.922485 -0.093084 +v -0.270379 0.872331 -0.089140 +v -0.352441 0.834149 -0.086669 +v -0.437483 0.806623 -0.085935 +v -0.536787 0.798258 -0.088406 +v -0.616125 0.748775 -0.088001 +v -0.091050 0.899267 -0.182996 +v -0.179671 0.879153 -0.179671 +v -0.264502 0.849730 -0.175208 +v -0.341293 0.803767 -0.168499 +v -0.423974 0.778624 -0.167003 +v -0.528857 0.785142 -0.174346 +v -0.604001 0.733225 -0.172495 +v -0.085943 0.837075 -0.260970 +v -0.166110 0.799760 -0.250962 +v -0.251338 0.798372 -0.251338 +v -0.334182 0.782340 -0.249063 +v -0.414125 0.756730 -0.246022 +v -0.501645 0.740299 -0.248849 +v -0.569329 0.688763 -0.244592 +v -0.080134 0.765359 -0.327066 +v -0.160469 0.761323 -0.325444 +v -0.246710 0.774111 -0.331053 +v -0.329254 0.762865 -0.329254 +v -0.407715 0.738926 -0.324828 +v -0.485238 0.711090 -0.322535 +v -0.547800 0.660216 -0.315361 +v -0.074468 0.692782 -0.382324 +v -0.151594 0.701082 -0.386055 +v -0.231380 0.707587 -0.389765 +v -0.309690 0.701369 -0.388743 +v -0.390130 0.695206 -0.390130 +v -0.460398 0.666459 -0.384101 +v -0.533456 0.639464 -0.385494 +v -0.070492 0.632807 -0.434142 +v -0.144805 0.645599 -0.441719 +v -0.214725 0.631959 -0.433344 +v -0.287409 0.628088 -0.432201 +v -0.362325 0.626131 -0.434137 +v -0.437470 0.619683 -0.437470 +v -0.504784 0.598067 -0.437496 +v -0.065845 0.561521 -0.468816 +v -0.141178 0.596969 -0.496429 +v -0.212766 0.595085 -0.494978 +v -0.282998 0.588934 -0.490790 +v -0.349077 0.575998 -0.482159 +v -0.424215 0.579152 -0.489253 +v -0.483747 0.561454 -0.483747 +v -0.087340 0.857385 0.087340 +v -0.082673 0.803649 0.166393 +v -0.079649 0.767661 0.242447 +v -0.074773 0.708926 0.306249 +v -0.070878 0.657135 0.365053 +v -0.067488 0.605065 0.416932 +v -0.066400 0.566215 0.472509 +v -0.178049 0.870776 0.088554 +v -0.169171 0.819796 0.169171 +v -0.161610 0.775039 0.244264 +v -0.158198 0.749316 0.320961 +v -0.149761 0.691856 0.381544 +v -0.140531 0.625406 0.429109 +v -0.137975 0.583028 0.485424 +v -0.274434 0.887528 0.090519 +v -0.262726 0.843177 0.174015 +v -0.252373 0.802102 0.252373 +v -0.247301 0.776178 0.331839 +v -0.230271 0.703864 0.387920 +v -0.220881 0.651504 0.445666 +v -0.210506 0.588431 0.489697 +v -0.367497 0.874963 0.090547 +v -0.360966 0.856455 0.178467 +v -0.340739 0.799585 0.253996 +v -0.325408 0.752993 0.325408 +v -0.307977 0.697118 0.386596 +v -0.298794 0.654991 0.449391 +v -0.288021 0.599996 0.499637 +v -0.457865 0.848689 0.090172 +v -0.450227 0.832311 0.177671 +v -0.426671 0.782038 0.253563 +v -0.403550 0.730681 0.321505 +v -0.386292 0.687809 0.386291 +v -0.373692 0.647183 0.447845 +v -0.354490 0.585430 0.489782 +v -0.564368 0.842714 0.093219 +v -0.542335 0.806725 0.178915 +v -0.512388 0.757339 0.254216 +v -0.481495 0.705233 0.320056 +v -0.454600 0.657555 0.379293 +v -0.432401 0.612112 0.432400 +v -0.415878 0.567278 0.479504 +v -0.646645 0.787571 0.092591 +v -0.628732 0.764550 0.179695 +v -0.603657 0.732015 0.259286 +v -0.568680 0.686324 0.327214 +v -0.519889 0.622679 0.375863 +v -0.486876 0.576256 0.422182 +v -0.469736 0.544906 0.469736 +v 0.086417 0.846623 0.086418 +v 0.173827 0.846460 0.086424 +v 0.251505 0.801607 0.082727 +v 0.346632 0.818400 0.085174 +v 0.422492 0.775683 0.082819 +v 0.490789 0.724115 0.080379 +v 0.556688 0.673220 0.079061 +v 0.080036 0.773561 0.161168 +v 0.160112 0.768584 0.160112 +v 0.236685 0.747069 0.156517 +v 0.327175 0.765960 0.161347 +v 0.409498 0.749022 0.161121 +v 0.475547 0.699771 0.156274 +v 0.534173 0.644777 0.152167 +v 0.074350 0.709230 0.226855 +v 0.150495 0.713990 0.227722 +v 0.235354 0.740740 0.235355 +v 0.318051 0.739915 0.236929 +v 0.392323 0.712747 0.232918 +v 0.445830 0.651765 0.220964 +v 0.494744 0.594790 0.212666 +v 0.070802 0.667132 0.290833 +v 0.142030 0.663856 0.289050 +v 0.225608 0.700338 0.303003 +v 0.308786 0.710330 0.308787 +v 0.385079 0.694116 0.306767 +v 0.433179 0.629620 0.288057 +v 0.476098 0.570565 0.274658 +v 0.068136 0.629915 0.351864 +v 0.135256 0.618861 0.345849 +v 0.215427 0.654046 0.363225 +v 0.296174 0.667834 0.371804 +v 0.371084 0.658500 0.371084 +v 0.416703 0.599359 0.347869 +v 0.453003 0.539926 0.328379 +v 0.065788 0.589363 0.407190 +v 0.134920 0.598904 0.412560 +v 0.213600 0.628387 0.431092 +v 0.282762 0.617108 0.425185 +v 0.343573 0.591405 0.411524 +v 0.395432 0.556904 0.395432 +v 0.434948 0.513011 0.377775 +v 0.066035 0.563130 0.470082 +v 0.134376 0.567375 0.473065 +v 0.206895 0.577803 0.481262 +v 0.271490 0.563587 0.470518 +v 0.332844 0.547707 0.459293 +v 0.382090 0.519157 0.439994 +v 0.426353 0.493674 0.426353 +v 0.859221 0.000000 0.000000 +v 0.838168 0.000000 -0.085763 +v 0.839256 0.000000 -0.172698 +v 0.813051 0.000000 -0.254743 +v 0.782476 0.000000 -0.333607 +v 0.727978 0.000000 -0.399649 +v 0.676247 0.000000 -0.461352 +v 0.624310 0.000000 -0.518386 +v 0.859423 0.087571 0.000000 +v 0.836694 0.172256 0.000000 +v 0.817047 0.255804 0.000000 +v 0.792385 0.337246 0.000000 +v 0.739448 0.405188 0.000000 +v 0.692720 0.471546 0.000000 +v 0.659194 0.545793 0.000000 +v 0.901191 0.000000 0.091123 +v 0.950062 0.000000 0.191813 +v 0.947074 0.000000 0.290308 +v 0.880728 0.000000 0.369688 +v 0.797186 0.000000 0.433066 +v 0.738274 0.000000 0.499739 +v 0.672781 0.000000 0.556467 +v 0.865194 -0.088062 0.000000 +v 0.866034 -0.177318 0.000000 +v 0.846365 -0.263584 0.000000 +v 0.808240 -0.343068 0.000000 +v 0.772246 -0.421024 0.000000 +v 0.740759 -0.501276 0.000000 +v 0.657674 -0.544598 0.000000 +v 0.808409 -0.083143 -0.083143 +v 0.785173 -0.081054 -0.163184 +v 0.770600 -0.079915 -0.243231 +v 0.764680 -0.080070 -0.326816 +v 0.728418 -0.078058 -0.399591 +v 0.648161 -0.072154 -0.443668 +v 0.588643 -0.069054 -0.490152 +v 0.809070 -0.167334 -0.083147 +v 0.785880 -0.163172 -0.163171 +v 0.761259 -0.159101 -0.240530 +v 0.723936 -0.153396 -0.311484 +v 0.674674 -0.146347 -0.373141 +v 0.608018 -0.136849 -0.418251 +v 0.552530 -0.130965 -0.461346 +v 0.812728 -0.254473 -0.083735 +v 0.782317 -0.246236 -0.162934 +v 0.761521 -0.241118 -0.241118 +v 0.704245 -0.226726 -0.304488 +v 0.655925 -0.215988 -0.364156 +v 0.601267 -0.205058 -0.413994 +v 0.555303 -0.199251 -0.463403 +v 0.798120 -0.339151 -0.083246 +v 0.774481 -0.330357 -0.162958 +v 0.742293 -0.318955 -0.237608 +v 0.684739 -0.298816 -0.298816 +v 0.645304 -0.287093 -0.360424 +v 0.597585 -0.274500 -0.412710 +v 0.537662 -0.259719 -0.449783 +v 0.750275 -0.410181 -0.080259 +v 0.740612 -0.405386 -0.159449 +v 0.712931 -0.392415 -0.232972 +v 0.679516 -0.377705 -0.300882 +v 0.648232 -0.365756 -0.365756 +v 0.597383 -0.346801 -0.415416 +v 0.516002 -0.314652 -0.433666 +v 0.714439 -0.484786 -0.079330 +v 0.692874 -0.471240 -0.154813 +v 0.671701 -0.458399 -0.227243 +v 0.646511 -0.443973 -0.295206 +v 0.618968 -0.429472 -0.358457 +v 0.571408 -0.405144 -0.405144 +v 0.520583 -0.383092 -0.441165 +v 0.643485 -0.533295 -0.075543 +v 0.643149 -0.532887 -0.151792 +v 0.624747 -0.518520 -0.222843 +v 0.607314 -0.505489 -0.291342 +v 0.578944 -0.484540 -0.350768 +v 0.529460 -0.448454 -0.389325 +v 0.485526 -0.419454 -0.419454 +v 0.858405 0.087427 -0.087427 +v 0.852361 0.174851 -0.086940 +v 0.835056 0.260432 -0.085760 +v 0.824108 0.348737 -0.085715 +v 0.772135 0.420773 -0.082461 +v 0.726439 0.492231 -0.080630 +v 0.698132 0.576285 -0.082008 +v 0.842964 0.086117 -0.173219 +v 0.846708 0.173932 -0.173932 +v 0.851501 0.264981 -0.175530 +v 0.836157 0.353387 -0.174626 +v 0.793111 0.431058 -0.169881 +v 0.753891 0.509342 -0.167730 +v 0.720028 0.593583 -0.169462 +v 0.830956 0.085388 -0.259337 +v 0.826838 0.171040 -0.258299 +v 0.829274 0.259908 -0.259908 +v 0.820301 0.348616 -0.259921 +v 0.791764 0.431492 -0.256460 +v 0.757252 0.512333 -0.254189 +v 0.721210 0.595081 -0.255614 +v 0.816796 0.085021 -0.346040 +v 0.811947 0.170046 -0.344346 +v 0.805769 0.255764 -0.343090 +v 0.789142 0.339492 -0.339492 +v 0.779415 0.428166 -0.341147 +v 0.731675 0.498391 -0.331246 +v 0.686000 0.568421 -0.327067 +v 0.743199 0.079547 -0.406752 +v 0.747195 0.160757 -0.408604 +v 0.718109 0.234515 -0.394981 +v 0.721464 0.317790 -0.398894 +v 0.710816 0.398229 -0.398229 +v 0.676917 0.467208 -0.389748 +v 0.624438 0.521311 -0.376872 +v 0.662287 0.073684 -0.452431 +v 0.659203 0.147685 -0.450214 +v 0.656280 0.222385 -0.448676 +v 0.645890 0.294942 -0.443575 +v 0.633088 0.366081 -0.438667 +v 0.613291 0.433190 -0.433190 +v 0.580758 0.490572 -0.425342 +v 0.620276 0.072797 -0.515037 +v 0.601488 0.142217 -0.499997 +v 0.602062 0.215137 -0.500515 +v 0.616248 0.295399 -0.512635 +v 0.602532 0.364303 -0.503605 +v 0.569323 0.417314 -0.481183 +v 0.546144 0.470784 -0.470784 +v 0.892186 0.090321 0.090322 +v 0.907281 0.091752 0.184388 +v 0.908735 0.092442 0.280093 +v 0.853163 0.088476 0.359455 +v 0.796095 0.084875 0.432382 +v 0.745006 0.082640 0.503750 +v 0.681875 0.080085 0.563496 +v 0.844199 0.173434 0.086226 +v 0.841711 0.173048 0.173048 +v 0.838261 0.173120 0.261394 +v 0.827861 0.173057 0.350289 +v 0.792410 0.169742 0.430716 +v 0.750574 0.167028 0.507271 +v 0.687413 0.161966 0.567834 +v 0.813134 0.254582 0.083773 +v 0.813933 0.254802 0.168691 +v 0.810598 0.254729 0.254729 +v 0.805067 0.255564 0.342824 +v 0.765556 0.248652 0.418501 +v 0.714908 0.240852 0.485638 +v 0.676086 0.240285 0.559268 +v 0.770010 0.328782 0.080576 +v 0.752989 0.322332 0.158893 +v 0.754306 0.323523 0.241045 +v 0.742951 0.321496 0.321496 +v 0.728560 0.320650 0.402479 +v 0.676998 0.308107 0.463454 +v 0.628903 0.301144 0.522756 +v 0.703366 0.387453 0.075535 +v 0.702321 0.386661 0.151841 +v 0.696808 0.384422 0.228169 +v 0.675955 0.375906 0.299448 +v 0.672563 0.378381 0.378381 +v 0.641168 0.370444 0.443929 +v 0.582128 0.352595 0.487114 +v 0.647509 0.443263 0.072084 +v 0.641071 0.438891 0.143847 +v 0.628971 0.431460 0.213784 +v 0.617606 0.425503 0.282973 +v 0.624962 0.433375 0.361694 +v 0.601121 0.425040 0.425041 +v 0.551581 0.404857 0.466616 +v 0.642148 0.532244 0.075385 +v 0.619865 0.514506 0.146441 +v 0.598807 0.497932 0.214031 +v 0.589630 0.491347 0.283314 +v 0.576942 0.482922 0.349620 +v 0.552392 0.467282 0.405426 +v 0.516313 0.445524 0.445524 +v 0.935887 -0.094066 0.094066 +v 0.913090 -0.185396 0.092261 +v 0.861192 -0.267406 0.088130 +v 0.855541 -0.360332 0.088702 +v 0.799959 -0.434254 0.085264 +v 0.762573 -0.514648 0.084542 +v 0.679053 -0.561276 0.079751 +v 0.967427 -0.097022 0.194832 +v 0.946454 -0.191576 0.191577 +v 0.888462 -0.274996 0.182260 +v 0.848399 -0.357958 0.176943 +v 0.800706 -0.434772 0.171391 +v 0.751211 -0.507669 0.167163 +v 0.670736 -0.554667 0.158133 +v 0.953778 -0.096526 0.292113 +v 0.905793 -0.185415 0.279692 +v 0.835891 -0.261744 0.261744 +v 0.804957 -0.342782 0.255532 +v 0.754005 -0.412775 0.245210 +v 0.690810 -0.470446 0.233262 +v 0.646949 -0.536141 0.230386 +v 0.883556 -0.091363 0.370666 +v 0.861218 -0.179368 0.362745 +v 0.789364 -0.251072 0.336853 +v 0.740295 -0.320461 0.320461 +v 0.703070 -0.389603 0.310376 +v 0.657946 -0.451280 0.300045 +v 0.605673 -0.504177 0.290598 +v 0.823509 -0.087636 0.445665 +v 0.782827 -0.167838 0.426029 +v 0.723164 -0.236021 0.397487 +v 0.691053 -0.305533 0.383533 +v 0.666444 -0.375206 0.375206 +v 0.620469 -0.430449 0.359267 +v 0.572535 -0.479360 0.347090 +v 0.743358 -0.082462 0.502728 +v 0.723403 -0.161276 0.490304 +v 0.673014 -0.227656 0.459227 +v 0.649136 -0.296316 0.445650 +v 0.636096 -0.367706 0.440626 +v 0.589350 -0.417159 0.417159 +v 0.545646 -0.461743 0.400689 +v 0.666972 -0.078322 0.551772 +v 0.655341 -0.154595 0.542513 +v 0.625197 -0.222996 0.518878 +v 0.600641 -0.288313 0.500153 +v 0.584925 -0.354200 0.489375 +v 0.556380 -0.408226 0.470557 +v 0.524794 -0.452705 0.452705 +v -0.000000 0.000000 0.741682 +v 0.077327 0.000000 0.738949 +v 0.156425 0.000000 0.744919 +v 0.235712 0.000000 0.741332 +v 0.314189 0.000000 0.729599 +v 0.396910 0.000000 0.722304 +v 0.478583 0.000000 0.704091 +v 0.552516 0.000000 0.667753 +v -0.000000 0.075376 0.716001 +v -0.000000 0.145550 0.681875 +v -0.000000 0.219451 0.680053 +v -0.000000 0.300080 0.691176 +v -0.000000 0.380454 0.688222 +v -0.000000 0.445086 0.649964 +v -0.000000 0.479258 0.574507 +v -0.075465 0.000000 0.717045 +v -0.155102 0.000000 0.737247 +v -0.242335 0.000000 0.766290 +v -0.324475 0.000000 0.757607 +v -0.403114 0.000000 0.735152 +v -0.475037 0.000000 0.698360 +v -0.584031 0.000000 0.707866 +v -0.000000 -0.075991 0.723225 +v -0.000000 -0.152037 0.719477 +v -0.000000 -0.223377 0.694848 +v -0.000000 -0.282090 0.642186 +v -0.000000 -0.354438 0.634339 +v -0.000000 -0.413983 0.599706 +v -0.000000 -0.480344 0.575888 +v 0.077249 -0.077249 0.739618 +v 0.157726 -0.078300 0.753736 +v 0.236226 -0.077534 0.744347 +v 0.317793 -0.077746 0.740221 +v 0.400214 -0.078188 0.729704 +v 0.469978 -0.076746 0.690570 +v 0.545549 -0.077386 0.659062 +v 0.076150 -0.153467 0.729209 +v 0.152559 -0.152560 0.725891 +v 0.231979 -0.153355 0.729701 +v 0.313560 -0.154448 0.729497 +v 0.390205 -0.153281 0.709570 +v 0.455212 -0.149380 0.667208 +v 0.513793 -0.146233 0.618962 +v 0.072071 -0.220150 0.684106 +v 0.145061 -0.219636 0.684147 +v 0.223289 -0.223289 0.697236 +v 0.300322 -0.223592 0.693288 +v 0.370616 -0.219870 0.668957 +v 0.430173 -0.213141 0.626931 +v 0.488712 -0.210084 0.587190 +v 0.070365 -0.289135 0.662530 +v 0.141816 -0.288626 0.662721 +v 0.216022 -0.290261 0.666825 +v 0.283192 -0.283192 0.644639 +v 0.348636 -0.277688 0.621969 +v 0.407473 -0.271032 0.589390 +v 0.477930 -0.275698 0.572855 +v 0.067541 -0.349000 0.624004 +v 0.137460 -0.351272 0.629953 +v 0.215190 -0.362830 0.653249 +v 0.287366 -0.360765 0.645980 +v 0.338878 -0.338878 0.596430 +v 0.400014 -0.334029 0.573730 +v 0.477286 -0.345618 0.569969 +v 0.068943 -0.425265 0.618498 +v 0.139261 -0.425365 0.619410 +v 0.212495 -0.428881 0.624880 +v 0.286462 -0.430771 0.625850 +v 0.340368 -0.407658 0.585468 +v 0.394612 -0.394612 0.555680 +v 0.455973 -0.395755 0.538618 +v 0.067093 -0.477114 0.572068 +v 0.133007 -0.468361 0.561415 +v 0.203610 -0.473586 0.568133 +v 0.274103 -0.475121 0.569342 +v 0.337422 -0.465741 0.555686 +v 0.393141 -0.452916 0.534895 +v 0.443357 -0.443358 0.513755 +v 0.075066 0.075067 0.714144 +v 0.073257 0.147732 0.696184 +v 0.073686 0.224902 0.701913 +v 0.073517 0.301373 0.695707 +v 0.074381 0.381903 0.691913 +v 0.071785 0.441556 0.644757 +v 0.069500 0.493121 0.592416 +v 0.153559 0.076197 0.729738 +v 0.151924 0.151925 0.722301 +v 0.152621 0.230887 0.725672 +v 0.151948 0.308626 0.716282 +v 0.149945 0.381996 0.692781 +v 0.144548 0.440961 0.644386 +v 0.139775 0.491610 0.590865 +v 0.231336 0.075873 0.726025 +v 0.233780 0.154566 0.736350 +v 0.237957 0.237957 0.750125 +v 0.235296 0.315882 0.734209 +v 0.230330 0.388018 0.704063 +v 0.221754 0.447413 0.654276 +v 0.212365 0.494041 0.593904 +v 0.312716 0.076438 0.726456 +v 0.318371 0.156886 0.742381 +v 0.328089 0.244480 0.766316 +v 0.323524 0.323524 0.748158 +v 0.316913 0.397795 0.719289 +v 0.296469 0.445882 0.649498 +v 0.281999 0.489031 0.586735 +v 0.398376 0.077806 0.725912 +v 0.399912 0.157225 0.729418 +v 0.403659 0.239731 0.735615 +v 0.402825 0.320926 0.729246 +v 0.382204 0.382204 0.679932 +v 0.365728 0.438241 0.632434 +v 0.355518 0.491232 0.587223 +v 0.489978 0.080237 0.722807 +v 0.482755 0.158717 0.711316 +v 0.471014 0.233545 0.691711 +v 0.461589 0.306873 0.674081 +v 0.445569 0.371805 0.643688 +v 0.422267 0.422268 0.596980 +v 0.401690 0.462914 0.547072 +v 0.551869 0.078336 0.667095 +v 0.556397 0.158637 0.672927 +v 0.542562 0.233134 0.655038 +v 0.518085 0.298493 0.623063 +v 0.496916 0.359554 0.594256 +v 0.472957 0.410280 0.559305 +v 0.456978 0.456978 0.529840 +v -0.073833 0.073832 0.699737 +v -0.149836 0.074319 0.708299 +v -0.234867 0.077072 0.739253 +v -0.321775 0.078771 0.751013 +v -0.402381 0.078638 0.734175 +v -0.473341 0.077333 0.695990 +v -0.570211 0.081095 0.690411 +v -0.071314 0.143881 0.674003 +v -0.144455 0.144455 0.680072 +v -0.227074 0.150059 0.711597 +v -0.311497 0.153403 0.723970 +v -0.395893 0.155592 0.721199 +v -0.464016 0.152364 0.681305 +v -0.531238 0.151312 0.641059 +v -0.072162 0.220415 0.685097 +v -0.145253 0.219920 0.685194 +v -0.222304 0.222304 0.693685 +v -0.298693 0.222366 0.689001 +v -0.378324 0.224503 0.684505 +v -0.460504 0.228295 0.675041 +v -0.510874 0.219571 0.615113 +v -0.073332 0.300652 0.693753 +v -0.145761 0.296412 0.683574 +v -0.223016 0.299556 0.691273 +v -0.289711 0.289711 0.661370 +v -0.373815 0.297778 0.671815 +v -0.444016 0.295234 0.646579 +v -0.503815 0.290392 0.605220 +v -0.074319 0.381605 0.691298 +v -0.147557 0.376118 0.680762 +v -0.225796 0.380474 0.688842 +v -0.301938 0.379027 0.682134 +v -0.369040 0.369040 0.654561 +v -0.427751 0.357029 0.616324 +v -0.484757 0.350922 0.579212 +v -0.070420 0.433730 0.632142 +v -0.146089 0.445506 0.651664 +v -0.223722 0.451352 0.660524 +v -0.298006 0.448201 0.653129 +v -0.362476 0.434318 0.626410 +v -0.423751 0.423750 0.599194 +v -0.483380 0.419192 0.571998 +v -0.069613 0.493868 0.593366 +v -0.139908 0.492065 0.591441 +v -0.211778 0.492669 0.592176 +v -0.283288 0.491300 0.589572 +v -0.352969 0.487641 0.582780 +v -0.417992 0.481976 0.570289 +v -0.475341 0.475341 0.551526 +v -0.074849 -0.074849 0.711604 +v -0.072410 -0.146053 0.686514 +v -0.071818 -0.219404 0.681311 +v -0.069253 -0.284815 0.650817 +v -0.069445 -0.358160 0.642909 +v -0.068242 -0.421252 0.612029 +v -0.068364 -0.485566 0.582812 +v -0.150675 -0.074742 0.713128 +v -0.146723 -0.146723 0.692894 +v -0.144646 -0.219017 0.681862 +v -0.142491 -0.289959 0.666290 +v -0.141698 -0.361701 0.651278 +v -0.132812 -0.406343 0.588948 +v -0.130021 -0.458103 0.548422 +v -0.236263 -0.077547 0.744485 +v -0.224081 -0.148049 0.700553 +v -0.219298 -0.219297 0.682843 +v -0.211725 -0.284548 0.651799 +v -0.201303 -0.339726 0.606640 +v -0.195919 -0.395703 0.572253 +v -0.184548 -0.429054 0.512024 +v -0.316856 -0.077505 0.737679 +v -0.301341 -0.148258 0.696772 +v -0.295015 -0.219599 0.679329 +v -0.284951 -0.284951 0.649153 +v -0.266316 -0.334385 0.593754 +v -0.253460 -0.380941 0.547871 +v -0.246003 -0.425622 0.507451 +v -0.384416 -0.074903 0.697099 +v -0.372875 -0.146239 0.674130 +v -0.365427 -0.216751 0.658488 +v -0.361099 -0.287632 0.646640 +v -0.344386 -0.344386 0.607046 +v -0.311124 -0.372391 0.531310 +v -0.294744 -0.405625 0.481308 +v -0.451652 -0.073548 0.661030 +v -0.449489 -0.147440 0.658042 +v -0.443850 -0.219974 0.648623 +v -0.437172 -0.290701 0.635868 +v -0.423993 -0.353914 0.610554 +v -0.381461 -0.381461 0.536040 +v -0.347292 -0.399302 0.469595 +v -0.553889 -0.078640 0.669663 +v -0.545832 -0.155561 0.659544 +v -0.541525 -0.232690 0.653731 +v -0.530041 -0.305280 0.638011 +v -0.502431 -0.363469 0.601079 +v -0.461243 -0.400262 0.545036 +v -0.413928 -0.413928 0.479000 +v -0.893702 0.000000 -0.000000 +v -0.868150 0.000000 0.088313 +v -0.866377 0.000000 0.177376 +v -0.859436 0.000000 0.267052 +v -0.846535 0.000000 0.357131 +v -0.843029 0.000000 0.455200 +v -0.800953 0.000000 0.538529 +v -0.760052 0.000000 0.625031 +v -0.937048 0.094171 -0.000000 +v -0.961851 0.193846 -0.000000 +v -0.938887 0.288136 -0.000000 +v -0.917543 0.383207 -0.000000 +v -0.860090 0.463438 -0.000000 +v -0.821612 0.551314 -0.000000 +v -0.767493 0.630877 -0.000000 +v -0.850929 0.000000 -0.086849 +v -0.769258 0.000000 -0.160624 +v -0.712336 0.000000 -0.228018 +v -0.658227 0.000000 -0.287980 +v -0.616027 0.000000 -0.345596 +v -0.564379 0.000000 -0.392120 +v -0.550878 0.000000 -0.460694 +v -0.866586 -0.088180 -0.000000 +v -0.850089 -0.174567 -0.000000 +v -0.803674 -0.252255 -0.000000 +v -0.766019 -0.327564 -0.000000 +v -0.670009 -0.371660 -0.000000 +v -0.593548 -0.410172 -0.000000 +v -0.550609 -0.460483 -0.000000 +v -0.853318 -0.086991 0.086991 +v -0.844150 -0.086221 0.173425 +v -0.870256 -0.088952 0.269825 +v -0.872940 -0.090355 0.366750 +v -0.862504 -0.091564 0.464558 +v -0.822307 -0.091010 0.551706 +v -0.769890 -0.090499 0.632736 +v -0.827984 -0.170618 0.084805 +v -0.843704 -0.173400 0.173400 +v -0.865541 -0.178086 0.268785 +v -0.857927 -0.178745 0.361516 +v -0.851261 -0.181436 0.459494 +v -0.797494 -0.176961 0.536570 +v -0.748017 -0.175895 0.615679 +v -0.798856 -0.250771 0.082477 +v -0.797671 -0.250396 0.165730 +v -0.822977 -0.258162 0.258162 +v -0.826072 -0.261572 0.350810 +v -0.809853 -0.261850 0.440458 +v -0.764622 -0.256511 0.516979 +v -0.716491 -0.254012 0.591336 +v -0.750576 -0.321613 0.078730 +v -0.742628 -0.318463 0.156932 +v -0.762321 -0.326570 0.243337 +v -0.782112 -0.336753 0.336753 +v -0.771116 -0.337802 0.423974 +v -0.719713 -0.326184 0.490747 +v -0.659731 -0.315141 0.547412 +v -0.681065 -0.376647 0.073288 +v -0.677844 -0.374692 0.146977 +v -0.709766 -0.390846 0.232029 +v -0.711960 -0.394093 0.313959 +v -0.684546 -0.384599 0.384598 +v -0.654998 -0.377912 0.452934 +v -0.602044 -0.364023 0.503211 +v -0.596833 -0.411824 0.066597 +v -0.626471 -0.429774 0.140756 +v -0.638218 -0.437290 0.216696 +v -0.644746 -0.442845 0.294458 +v -0.610647 -0.424054 0.353963 +v -0.585267 -0.414424 0.414424 +v -0.548865 -0.402950 0.464386 +v -0.572111 -0.477147 0.067098 +v -0.576055 -0.479918 0.136371 +v -0.569029 -0.474297 0.203914 +v -0.568388 -0.474358 0.273669 +v -0.552160 -0.462892 0.335399 +v -0.521409 -0.441843 0.383671 +v -0.491587 -0.424586 0.424586 +v -0.941265 0.094526 0.094526 +v -0.955445 0.192751 0.095972 +v -0.954831 0.292394 0.096622 +v -0.929260 0.387525 0.095705 +v -0.877307 0.471731 0.093055 +v -0.844960 0.565760 0.093462 +v -0.800488 0.656807 0.094120 +v -0.923648 0.093186 0.187229 +v -0.964224 0.194720 0.194720 +v -0.963504 0.295329 0.195921 +v -0.920663 0.384941 0.190613 +v -0.881121 0.474096 0.187370 +v -0.850542 0.569697 0.188191 +v -0.810937 0.665353 0.190357 +v -0.897327 0.091407 0.277049 +v -0.917704 0.187583 0.282919 +v -0.937719 0.289985 0.289984 +v -0.923748 0.387948 0.289510 +v -0.892055 0.481206 0.286342 +v -0.839106 0.563937 0.279971 +v -0.775934 0.638515 0.274206 +v -0.846306 0.087824 0.356925 +v -0.870177 0.181062 0.366090 +v -0.890928 0.280122 0.375469 +v -0.911409 0.387128 0.387128 +v -0.863691 0.470736 0.375114 +v -0.815187 0.551754 0.366588 +v -0.732952 0.605971 0.348384 +v -0.831076 0.088398 0.449331 +v -0.822957 0.175812 0.445653 +v -0.827318 0.267054 0.449116 +v -0.834500 0.363349 0.455991 +v -0.794684 0.441746 0.441746 +v -0.730167 0.501883 0.418501 +v -0.673635 0.561075 0.405102 +v -0.775242 0.085914 0.522508 +v -0.771134 0.171381 0.520109 +v -0.754995 0.253478 0.510910 +v -0.734260 0.332340 0.500043 +v -0.701736 0.403149 0.483369 +v -0.662640 0.466235 0.466235 +v -0.607084 0.512187 0.443826 +v -0.724937 0.085180 0.597372 +v -0.701893 0.165294 0.579265 +v -0.691243 0.245434 0.571297 +v -0.660796 0.315624 0.548263 +v -0.623010 0.376053 0.520157 +v -0.602905 0.440893 0.508756 +v -0.562269 0.484438 0.484438 +v -0.881769 0.089429 -0.089429 +v -0.795603 0.081968 -0.164996 +v -0.733529 0.076553 -0.233339 +v -0.695277 0.073476 -0.301215 +v -0.645496 0.069706 -0.359413 +v -0.598093 0.066733 -0.412606 +v -0.573772 0.067294 -0.478454 +v -0.901114 0.183317 -0.091212 +v -0.819844 0.169180 -0.169180 +v -0.762278 0.159286 -0.240806 +v -0.733290 0.155166 -0.314977 +v -0.680368 0.147478 -0.375926 +v -0.625751 0.140604 -0.429325 +v -0.594809 0.140682 -0.494724 +v -0.897215 0.277019 -0.091397 +v -0.834368 0.260339 -0.172411 +v -0.798523 0.251380 -0.251380 +v -0.762791 0.243472 -0.326749 +v -0.713737 0.233212 -0.392814 +v -0.646489 0.219302 -0.442504 +v -0.601175 0.214835 -0.499812 +v -0.880971 0.369713 -0.091118 +v -0.847205 0.357512 -0.176717 +v -0.825251 0.350498 -0.261337 +v -0.783660 0.337356 -0.337357 +v -0.707504 0.312163 -0.391843 +v -0.658966 0.300476 -0.451932 +v -0.593727 0.285174 -0.494623 +v -0.841862 0.454557 -0.089485 +v -0.822352 0.445357 -0.175692 +v -0.797000 0.434088 -0.258021 +v -0.772108 0.424475 -0.338202 +v -0.692545 0.388749 -0.388749 +v -0.634598 0.366897 -0.439650 +v -0.588861 0.356459 -0.492556 +v -0.810523 0.544396 -0.089734 +v -0.786882 0.529944 -0.174715 +v -0.766745 0.518318 -0.257179 +v -0.743974 0.506250 -0.336451 +v -0.685711 0.472934 -0.394497 +v -0.633896 0.446987 -0.446987 +v -0.586203 0.429166 -0.495043 +v -0.743653 0.612096 -0.087395 +v -0.743644 0.612226 -0.174890 +v -0.704477 0.581800 -0.249930 +v -0.675096 0.559700 -0.322117 +v -0.638195 0.532431 -0.384767 +v -0.596326 0.503355 -0.436274 +v -0.558387 0.481151 -0.481151 +v -0.818915 -0.084043 -0.084044 +v -0.816303 -0.168590 -0.083781 +v -0.787110 -0.247637 -0.081412 +v -0.745071 -0.319582 -0.078207 +v -0.680496 -0.376372 -0.073231 +v -0.622575 -0.427795 -0.069384 +v -0.565631 -0.472050 -0.066331 +v -0.743328 -0.077388 -0.155919 +v -0.743970 -0.155758 -0.155758 +v -0.711703 -0.227102 -0.150079 +v -0.715606 -0.308373 -0.151821 +v -0.660431 -0.366177 -0.143517 +v -0.622113 -0.427053 -0.139834 +v -0.557925 -0.465605 -0.132205 +v -0.697419 -0.073279 -0.223703 +v -0.671455 -0.142751 -0.216197 +v -0.675944 -0.217384 -0.217384 +v -0.662033 -0.288439 -0.214652 +v -0.631227 -0.351914 -0.208629 +v -0.587839 -0.405529 -0.200828 +v -0.546167 -0.456153 -0.196148 +v -0.633304 -0.067589 -0.278355 +v -0.638774 -0.137285 -0.279685 +v -0.628360 -0.205021 -0.275636 +v -0.608062 -0.268942 -0.268942 +v -0.571245 -0.323015 -0.257244 +v -0.545491 -0.379423 -0.252455 +v -0.511613 -0.428950 -0.247893 +v -0.605517 -0.065679 -0.340043 +v -0.616763 -0.134839 -0.344823 +v -0.599038 -0.199038 -0.335958 +v -0.569302 -0.256461 -0.322034 +v -0.561635 -0.320824 -0.320824 +v -0.519245 -0.364534 -0.304609 +v -0.485650 -0.409135 -0.297236 +v -0.566488 -0.063311 -0.392999 +v -0.598135 -0.134757 -0.412079 +v -0.586323 -0.200351 -0.404573 +v -0.571491 -0.263458 -0.396037 +v -0.534819 -0.313019 -0.374676 +v -0.501506 -0.358336 -0.358337 +v -0.476389 -0.404880 -0.352062 +v -0.548552 -0.064310 -0.458614 +v -0.570975 -0.135204 -0.475908 +v -0.557635 -0.200044 -0.465255 +v -0.554539 -0.267382 -0.463282 +v -0.526224 -0.320517 -0.441929 +v -0.489382 -0.361185 -0.415548 +v -0.459684 -0.397571 -0.397571 +v 0.000000 0.000000 -0.629975 +v 0.070959 0.000000 -0.664050 +v 0.146177 0.000000 -0.685510 +v 0.223580 0.000000 -0.695611 +v 0.308441 0.000000 -0.713945 +v 0.366394 0.000000 -0.659101 +v 0.434029 0.000000 -0.632097 +v 0.484489 0.000000 -0.581165 +v 0.000000 -0.069672 -0.648907 +v 0.000000 -0.148405 -0.698426 +v 0.000000 -0.220926 -0.685612 +v 0.000000 -0.285324 -0.650994 +v 0.000000 -0.338031 -0.600360 +v 0.000000 -0.402889 -0.581780 +v 0.000000 -0.484674 -0.581400 +v -0.066944 0.000000 -0.616824 +v -0.133573 0.000000 -0.612440 +v -0.208044 0.000000 -0.637068 +v -0.281620 0.000000 -0.640907 +v -0.355617 0.000000 -0.636783 +v -0.436419 0.000000 -0.635960 +v -0.489129 0.000000 -0.587072 +v 0.000000 0.066019 -0.605949 +v 0.000000 0.129641 -0.589648 +v 0.000000 0.196168 -0.592312 +v 0.000000 0.262000 -0.587480 +v 0.000000 0.315019 -0.552698 +v 0.000000 0.349158 -0.494960 +v 0.000000 0.404597 -0.479475 +v 0.068347 0.068347 -0.635720 +v 0.141090 0.069905 -0.657927 +v 0.218870 0.071636 -0.679309 +v 0.296413 0.072240 -0.682260 +v 0.363632 0.070583 -0.654202 +v 0.427876 0.069398 -0.622706 +v 0.482591 0.067916 -0.579030 +v 0.065478 0.132314 -0.607391 +v 0.135240 0.135240 -0.627982 +v 0.215765 0.142460 -0.669859 +v 0.288950 0.141980 -0.663589 +v 0.366358 0.143590 -0.660801 +v 0.426892 0.139779 -0.621855 +v 0.476343 0.135331 -0.571526 +v 0.063472 0.194845 -0.589277 +v 0.129593 0.196613 -0.599179 +v 0.207432 0.207432 -0.640061 +v 0.281655 0.209549 -0.644191 +v 0.351863 0.208598 -0.631124 +v 0.421177 0.208646 -0.612660 +v 0.483891 0.208021 -0.581116 +v 0.062664 0.259231 -0.581463 +v 0.127429 0.260231 -0.586675 +v 0.198777 0.267336 -0.606531 +v 0.275427 0.275427 -0.624707 +v 0.344834 0.274653 -0.614440 +v 0.420782 0.279846 -0.610217 +v 0.497417 0.286760 -0.597220 +v 0.060970 0.317391 -0.558768 +v 0.127303 0.326275 -0.578834 +v 0.198519 0.335094 -0.597295 +v 0.269478 0.338347 -0.601599 +v 0.345623 0.345623 -0.609429 +v 0.418125 0.349047 -0.601542 +v 0.498237 0.360492 -0.595890 +v 0.056714 0.355194 -0.505551 +v 0.124716 0.382460 -0.550702 +v 0.198403 0.400675 -0.580140 +v 0.267557 0.402226 -0.581177 +v 0.338507 0.405413 -0.582021 +v 0.407003 0.407003 -0.574184 +v 0.485856 0.421309 -0.575013 +v 0.056879 0.409205 -0.485745 +v 0.121574 0.429087 -0.511670 +v 0.191601 0.445531 -0.532784 +v 0.258407 0.447472 -0.534771 +v 0.330808 0.456425 -0.544159 +v 0.398380 0.459042 -0.542356 +v 0.450041 0.450041 -0.521648 +v 0.072613 -0.072613 -0.685501 +v 0.074897 -0.150982 -0.714899 +v 0.072248 -0.220670 -0.686055 +v 0.071182 -0.292308 -0.671131 +v 0.064195 -0.332903 -0.590783 +v 0.062823 -0.390197 -0.561973 +v 0.067922 -0.482625 -0.579075 +v 0.149967 -0.074385 -0.709052 +v 0.151877 -0.151876 -0.722028 +v 0.147919 -0.223888 -0.699840 +v 0.140635 -0.286295 -0.656477 +v 0.131807 -0.337359 -0.601502 +v 0.125425 -0.384552 -0.554053 +v 0.129077 -0.454861 -0.544317 +v 0.230180 -0.075480 -0.721690 +v 0.229711 -0.151831 -0.721330 +v 0.219673 -0.219672 -0.684196 +v 0.210329 -0.282692 -0.646917 +v 0.198022 -0.334267 -0.595627 +v 0.192397 -0.388654 -0.561072 +v 0.198229 -0.461016 -0.552295 +v 0.312865 -0.076477 -0.726859 +v 0.304373 -0.149794 -0.704892 +v 0.294973 -0.219568 -0.679219 +v 0.279245 -0.279245 -0.634507 +v 0.263475 -0.330824 -0.586706 +v 0.256756 -0.385917 -0.555655 +v 0.257727 -0.446274 -0.533273 +v 0.376544 -0.073267 -0.680852 +v 0.363661 -0.142495 -0.655287 +v 0.357105 -0.211749 -0.641698 +v 0.339735 -0.270585 -0.604345 +v 0.325301 -0.325301 -0.570265 +v 0.314578 -0.376556 -0.537706 +v 0.308334 -0.424767 -0.504991 +v 0.432475 -0.070201 -0.630119 +v 0.414541 -0.135592 -0.602076 +v 0.406753 -0.201440 -0.589781 +v 0.390672 -0.259905 -0.563095 +v 0.377065 -0.314999 -0.538487 +v 0.369499 -0.369499 -0.518176 +v 0.356883 -0.410517 -0.483255 +v 0.474803 -0.066745 -0.569131 +v 0.452234 -0.128312 -0.540989 +v 0.450892 -0.193896 -0.539539 +v 0.442022 -0.255313 -0.527957 +v 0.437300 -0.317231 -0.520497 +v 0.428009 -0.371841 -0.504559 +v 0.403801 -0.403801 -0.467041 +v -0.071309 -0.071309 -0.670285 +v -0.141571 -0.070148 -0.660698 +v -0.216442 -0.070811 -0.670212 +v -0.288958 -0.070319 -0.662050 +v -0.362306 -0.070307 -0.651466 +v -0.440730 -0.071642 -0.643425 +v -0.485579 -0.068366 -0.582830 +v -0.073602 -0.148417 -0.700123 +v -0.148946 -0.148946 -0.705465 +v -0.224743 -0.148494 -0.702998 +v -0.292190 -0.143622 -0.672267 +v -0.370296 -0.145191 -0.668857 +v -0.437215 -0.143279 -0.638387 +v -0.486057 -0.138159 -0.583831 +v -0.070863 -0.216594 -0.670779 +v -0.147631 -0.223459 -0.698259 +v -0.220421 -0.220422 -0.686897 +v -0.284002 -0.211314 -0.650364 +v -0.361898 -0.214630 -0.651368 +v -0.433214 -0.214660 -0.631753 +v -0.474245 -0.203892 -0.568962 +v -0.070054 -0.287929 -0.659260 +v -0.143759 -0.292463 -0.672997 +v -0.216236 -0.290544 -0.667571 +v -0.293430 -0.293430 -0.670915 +v -0.365191 -0.290897 -0.654743 +v -0.433859 -0.288507 -0.630683 +v -0.471401 -0.271992 -0.564692 +v -0.067757 -0.350041 -0.626152 +v -0.142695 -0.364154 -0.656295 +v -0.214828 -0.362227 -0.652032 +v -0.288332 -0.361976 -0.648377 +v -0.346787 -0.346787 -0.611673 +v -0.411959 -0.343935 -0.592074 +v -0.462895 -0.335402 -0.552164 +v -0.067435 -0.416628 -0.604576 +v -0.142963 -0.436286 -0.636900 +v -0.213179 -0.430249 -0.627050 +v -0.272930 -0.410339 -0.593875 +v -0.331943 -0.397497 -0.569866 +v -0.381948 -0.381948 -0.536767 +v -0.428924 -0.372624 -0.505674 +v -0.069453 -0.492805 -0.592014 +v -0.142220 -0.500009 -0.601503 +v -0.206766 -0.480960 -0.577423 +v -0.269882 -0.467686 -0.560046 +v -0.323824 -0.446587 -0.531988 +v -0.375685 -0.432503 -0.510034 +v -0.417022 -0.417022 -0.482654 +v -0.066178 0.066178 -0.610400 +v -0.062770 0.126948 -0.576484 +v -0.064192 0.196965 -0.597223 +v -0.065057 0.268525 -0.606658 +v -0.060248 0.313920 -0.551604 +v -0.056736 0.355323 -0.505760 +v -0.058836 0.422218 -0.502286 +v -0.130691 0.064659 -0.598041 +v -0.128500 0.128500 -0.589883 +v -0.133879 0.202993 -0.622725 +v -0.135909 0.276968 -0.631499 +v -0.128311 0.328758 -0.583911 +v -0.121771 0.373774 -0.536794 +v -0.123580 0.435979 -0.520399 +v -0.201357 0.065685 -0.613680 +v -0.200300 0.132070 -0.612787 +v -0.208240 0.208240 -0.642976 +v -0.213887 0.287422 -0.659359 +v -0.202055 0.340977 -0.609164 +v -0.193749 0.391359 -0.565363 +v -0.193701 0.450436 -0.538965 +v -0.269351 0.065270 -0.608898 +v -0.266727 0.130721 -0.604074 +v -0.278381 0.207086 -0.635581 +v -0.286266 0.286266 -0.652529 +v -0.278031 0.349067 -0.622821 +v -0.265699 0.399421 -0.576787 +v -0.261858 0.453552 -0.542373 +v -0.349822 0.067712 -0.625701 +v -0.332418 0.129799 -0.591397 +v -0.342367 0.202890 -0.611967 +v -0.350139 0.278887 -0.624944 +v -0.347184 0.347184 -0.612439 +v -0.328274 0.393074 -0.563072 +v -0.332791 0.459218 -0.547615 +v -0.425393 0.068965 -0.618705 +v -0.413413 0.135209 -0.600271 +v -0.410316 0.203220 -0.595433 +v -0.414173 0.275469 -0.599875 +v -0.399822 0.333870 -0.573435 +v -0.389553 0.389553 -0.548125 +v -0.401110 0.462235 -0.546245 +v -0.477964 0.067221 -0.573150 +v -0.483246 0.137340 -0.580270 +v -0.490468 0.210836 -0.589403 +v -0.468459 0.270321 -0.561013 +v -0.456674 0.330985 -0.544467 +v -0.454084 0.394139 -0.536317 +v -0.469651 0.469651 -0.544806 +v 0.456822 -0.456822 -0.413860 +v 0.494770 -0.494770 -0.387292 +v 0.535543 -0.535543 -0.348414 +v 0.562081 -0.562081 -0.290594 +v 0.582897 -0.582897 -0.224514 +v 0.588064 -0.588064 -0.150122 +v 0.572639 -0.572639 -0.072622 +v 0.575070 -0.575070 0.000000 +v 0.581950 -0.581950 0.073852 +v 0.592554 -0.592554 0.151270 +v 0.557339 -0.557339 0.214897 +v 0.537661 -0.537661 0.278370 +v 0.520139 -0.520139 0.338743 +v 0.498174 -0.498174 0.389878 +v 0.494088 -0.494088 0.447339 +v 0.402469 -0.444142 -0.444142 +v 0.354692 -0.451859 -0.451859 +v 0.310813 -0.475654 -0.475654 +v 0.256401 -0.493772 -0.493772 +v 0.197758 -0.511791 -0.511791 +v 0.137202 -0.537517 -0.537517 +v 0.070241 -0.554608 -0.554608 +v 0.000000 -0.561125 -0.561125 +v -0.071627 -0.565104 -0.565105 +v -0.141856 -0.555723 -0.555724 +v -0.212986 -0.552260 -0.552260 +v -0.273024 -0.526980 -0.526980 +v -0.327274 -0.501872 -0.501872 +v -0.375048 -0.478654 -0.478654 +v -0.415373 -0.458506 -0.458506 +v 0.447828 -0.405781 -0.447828 +v 0.472502 -0.370374 -0.472502 +v 0.486431 -0.317580 -0.486431 +v 0.483696 -0.251357 -0.483696 +v 0.488703 -0.189071 -0.488703 +v 0.505420 -0.128997 -0.505420 +v 0.535416 -0.067706 -0.535416 +v 0.547366 0.000000 -0.547366 +v 0.550174 0.069655 -0.550174 +v 0.547769 0.139822 -0.547769 +v 0.543471 0.209679 -0.543471 +v 0.558130 0.288617 -0.558130 +v 0.560021 0.363782 -0.560021 +v 0.530448 0.414398 -0.530448 +v 0.506408 0.458406 -0.506408 +v 0.438741 -0.484518 0.484518 +v 0.384276 -0.490800 0.490800 +v 0.325931 -0.499733 0.499733 +v 0.265493 -0.511935 0.511935 +v 0.196716 -0.509022 0.509022 +v 0.129612 -0.507823 0.507823 +v 0.065324 -0.517382 0.517382 +v -0.000000 -0.530135 0.530135 +v -0.067096 -0.530798 0.530798 +v -0.125452 -0.491550 0.491550 +v -0.178258 -0.459969 0.459969 +v -0.226902 -0.434843 0.434842 +v -0.268358 -0.408032 0.408032 +v -0.318336 -0.404006 0.404006 +v -0.378963 -0.417975 0.417975 +v 0.491017 -0.444579 0.491017 +v 0.513445 -0.401480 0.513445 +v 0.525241 -0.341946 0.525241 +v 0.543898 -0.281492 0.543898 +v 0.555570 -0.214232 0.555570 +v 0.588021 -0.150112 0.588022 +v 0.612074 -0.077831 0.612075 +v 0.606956 0.000000 0.606956 +v 0.619162 0.078767 0.619162 +v 0.634272 0.161934 0.634272 +v 0.609531 0.234536 0.609532 +v 0.577505 0.298315 0.577505 +v 0.539697 0.351022 0.539698 +v 0.510338 0.399120 0.510339 +v 0.490877 0.444454 0.490877 +v -0.428413 -0.428413 0.388339 +v -0.451448 -0.451448 0.354379 +v -0.483750 -0.483749 0.315896 +v -0.498882 -0.498882 0.258958 +v -0.507644 -0.507644 0.196198 +v -0.527690 -0.527690 0.134690 +v -0.522299 -0.522299 0.065973 +v -0.513665 -0.513665 -0.000000 +v -0.523019 -0.523019 -0.066069 +v -0.533554 -0.533554 -0.136189 +v -0.519757 -0.519757 -0.200756 +v -0.493260 -0.493260 -0.256145 +v -0.465056 -0.465056 -0.304160 +v -0.457742 -0.457742 -0.359161 +v -0.451774 -0.451775 -0.409326 +v -0.466598 -0.422643 0.466598 +v -0.514447 -0.402241 0.514447 +v -0.559660 -0.363555 0.559660 +v -0.605010 -0.312083 0.605010 +v -0.636350 -0.244628 0.636350 +v -0.649249 -0.165762 0.649249 +v -0.664171 -0.084712 0.664171 +v -0.671056 0.000000 0.671055 +v -0.653303 0.083276 0.653302 +v -0.621935 0.158780 0.621935 +v -0.586050 0.225701 0.586050 +v -0.572152 0.295636 0.572152 +v -0.561144 0.364487 0.561144 +v -0.551342 0.430271 0.551342 +v -0.527024 0.476927 0.527024 +v -0.443911 -0.402262 -0.443912 +v -0.460764 -0.361457 -0.460765 +v -0.504278 -0.328785 -0.504278 +v -0.524792 -0.271928 -0.524792 +v -0.517353 -0.199851 -0.517353 +v -0.534418 -0.136410 -0.534418 +v -0.529052 -0.066865 -0.529053 +v -0.529228 0.000000 -0.529228 +v -0.538991 0.068178 -0.538991 +v -0.555444 0.141784 -0.555444 +v -0.548440 0.211549 -0.548440 +v -0.527908 0.273488 -0.527908 +v -0.524068 0.341210 -0.524068 +v -0.512562 0.400809 -0.512562 +v -0.517594 0.468455 -0.517594 +v 0.510343 0.510343 -0.461941 +v 0.546682 0.546682 -0.426731 +v 0.586630 0.586630 -0.380488 +v 0.626333 0.626333 -0.322757 +v 0.643222 0.643222 -0.247213 +v 0.666544 0.666544 -0.170183 +v 0.648083 0.648083 -0.082587 +v 0.619576 0.619576 0.000000 +v 0.605321 0.605321 0.076939 +v 0.591070 0.591070 0.150891 +v 0.561333 0.561333 0.216400 +v 0.532156 0.532156 0.275615 +v 0.522207 0.522208 0.340042 +v 0.489526 0.489526 0.383309 +v 0.469970 0.469970 0.425672 +v 0.437734 0.483397 -0.483396 +v 0.382897 0.488984 -0.488984 +v 0.327336 0.501970 -0.501970 +v 0.257564 0.496096 -0.496096 +v 0.188978 0.488456 -0.488456 +v 0.123401 0.483526 -0.483526 +v 0.057968 0.461688 -0.461688 +v 0.000000 0.466644 -0.466644 +v -0.063337 0.502338 -0.502338 +v -0.133265 0.522116 -0.522116 +v -0.201537 0.521834 -0.521834 +v -0.271102 0.523140 -0.523140 +v -0.338853 0.520315 -0.520315 +v -0.407644 0.521558 -0.521558 +v -0.472369 0.521951 -0.521951 +v 0.435233 0.480613 0.480613 +v 0.392910 0.502165 0.502165 +v 0.341523 0.524567 0.524568 +v 0.278525 0.537970 0.537970 +v 0.205339 0.531939 0.531939 +v 0.137507 0.538712 0.538713 +v 0.066579 0.526890 0.526890 +v -0.000000 0.522328 0.522328 +v -0.067331 0.532573 0.532574 +v -0.134222 0.525858 0.525858 +v -0.208139 0.539379 0.539379 +v -0.282003 0.544917 0.544917 +v -0.345472 0.530856 0.530856 +v -0.408577 0.522786 0.522786 +v -0.467781 0.516843 0.516843 +v -0.524904 0.524904 0.475022 +v -0.551022 0.551022 0.430028 +v -0.610806 0.610806 0.395666 +v -0.660258 0.660257 0.339739 +v -0.700968 0.700968 0.268943 +v -0.722529 0.722528 0.184493 +v -0.726323 0.726323 0.092921 +v -0.719292 0.719292 -0.000000 +v -0.691961 0.691961 -0.088383 +v -0.669661 0.669661 -0.170980 +v -0.631815 0.631815 -0.242921 +v -0.609585 0.609585 -0.314374 +v -0.592694 0.592694 -0.384295 +v -0.546560 0.546560 -0.426639 +v -0.524452 0.524452 -0.474616 +v 0.429562 -0.429562 -0.429562 +v 0.469429 -0.469429 0.469429 +v -0.428505 -0.428505 0.428505 +v -0.439452 -0.439452 -0.439452 +v 0.483923 0.483923 -0.483923 +v 0.469252 0.469252 0.469253 +v -0.504589 0.504589 0.504589 +v -0.510117 0.510117 -0.510117 +vt 0.500000 0.500000 +vt 0.499936 0.479231 +vt 0.520706 0.479167 +vt 0.520770 0.499936 +vt 0.541476 0.479103 +vt 0.541539 0.499873 +vt 0.562245 0.479039 +vt 0.562309 0.499809 +vt 0.583015 0.478976 +vt 0.583079 0.499745 +vt 0.603784 0.478912 +vt 0.603848 0.499682 +vt 0.624554 0.478848 +vt 0.624618 0.499618 +vt 0.645324 0.478785 +vt 0.645387 0.499554 +vt 0.666093 0.478721 +vt 0.666157 0.499490 +vt 0.499873 0.458461 +vt 0.520642 0.458397 +vt 0.541412 0.458333 +vt 0.562181 0.458270 +vt 0.582951 0.458206 +vt 0.603721 0.458142 +vt 0.624490 0.458079 +vt 0.645260 0.458015 +vt 0.666030 0.457951 +vt 0.499809 0.437691 +vt 0.520579 0.437628 +vt 0.541348 0.437564 +vt 0.562118 0.437500 +vt 0.582887 0.437436 +vt 0.603657 0.437373 +vt 0.624427 0.437309 +vt 0.645196 0.437245 +vt 0.665966 0.437182 +vt 0.499745 0.416922 +vt 0.520515 0.416858 +vt 0.541284 0.416794 +vt 0.562054 0.416731 +vt 0.582824 0.416667 +vt 0.603593 0.416603 +vt 0.624363 0.416539 +vt 0.645132 0.416476 +vt 0.665902 0.416412 +vt 0.499681 0.396152 +vt 0.520451 0.396088 +vt 0.541221 0.396025 +vt 0.561990 0.395961 +vt 0.582760 0.395897 +vt 0.603530 0.395833 +vt 0.624299 0.395770 +vt 0.645069 0.395706 +vt 0.665838 0.395642 +vt 0.499618 0.375382 +vt 0.520387 0.375319 +vt 0.541157 0.375255 +vt 0.561927 0.375191 +vt 0.582696 0.375128 +vt 0.603466 0.375064 +vt 0.624235 0.375000 +vt 0.645005 0.374936 +vt 0.665775 0.374873 +vt 0.499554 0.354613 +vt 0.520324 0.354549 +vt 0.541093 0.354485 +vt 0.561863 0.354422 +vt 0.582632 0.354358 +vt 0.603402 0.354294 +vt 0.624172 0.354231 +vt 0.644941 0.354167 +vt 0.665711 0.354103 +vt 0.499490 0.333843 +vt 0.520260 0.333780 +vt 0.541030 0.333716 +vt 0.561799 0.333652 +vt 0.582569 0.333588 +vt 0.603338 0.333525 +vt 0.624108 0.333461 +vt 0.644878 0.333397 +vt 0.665647 0.333333 +vt 0.520833 0.520706 +vt 0.500064 0.520770 +vt 0.520897 0.541476 +vt 0.500127 0.541539 +vt 0.520961 0.562245 +vt 0.500191 0.562309 +vt 0.521025 0.583015 +vt 0.500255 0.583079 +vt 0.521088 0.603785 +vt 0.500319 0.603848 +vt 0.521152 0.624554 +vt 0.500382 0.624618 +vt 0.521216 0.645324 +vt 0.500446 0.645387 +vt 0.521279 0.666093 +vt 0.500510 0.666157 +vt 0.541603 0.520642 +vt 0.541667 0.541412 +vt 0.541730 0.562182 +vt 0.541794 0.582951 +vt 0.541858 0.603721 +vt 0.541922 0.624490 +vt 0.541985 0.645260 +vt 0.542049 0.666030 +vt 0.562373 0.520579 +vt 0.562436 0.541348 +vt 0.562500 0.562118 +vt 0.562564 0.582887 +vt 0.562627 0.603657 +vt 0.562691 0.624427 +vt 0.562755 0.645196 +vt 0.562819 0.665966 +vt 0.583142 0.520515 +vt 0.583206 0.541285 +vt 0.583270 0.562054 +vt 0.583333 0.582824 +vt 0.583397 0.603593 +vt 0.583461 0.624363 +vt 0.583525 0.645133 +vt 0.583588 0.665902 +vt 0.603912 0.520451 +vt 0.603976 0.541221 +vt 0.604039 0.561990 +vt 0.604103 0.582760 +vt 0.604167 0.603530 +vt 0.604230 0.624299 +vt 0.604294 0.645069 +vt 0.604358 0.665839 +vt 0.624681 0.520387 +vt 0.624745 0.541157 +vt 0.624809 0.561927 +vt 0.624873 0.582696 +vt 0.624936 0.603466 +vt 0.625000 0.624236 +vt 0.625064 0.645005 +vt 0.625127 0.665775 +vt 0.645451 0.520324 +vt 0.645515 0.541093 +vt 0.645579 0.561863 +vt 0.645642 0.582633 +vt 0.645706 0.603402 +vt 0.645770 0.624172 +vt 0.645833 0.644941 +vt 0.645897 0.665711 +vt 0.666221 0.520260 +vt 0.666284 0.541030 +vt 0.666348 0.561799 +vt 0.666412 0.582569 +vt 0.666476 0.603338 +vt 0.666539 0.624108 +vt 0.666603 0.644878 +vt 0.666667 0.665647 +vt 0.479294 0.520833 +vt 0.479230 0.500064 +vt 0.458525 0.520897 +vt 0.458461 0.500128 +vt 0.437755 0.520961 +vt 0.437691 0.500191 +vt 0.416985 0.521025 +vt 0.416922 0.500255 +vt 0.396216 0.521088 +vt 0.396152 0.500319 +vt 0.375446 0.521152 +vt 0.375382 0.500382 +vt 0.354676 0.521216 +vt 0.354613 0.500446 +vt 0.333907 0.521280 +vt 0.333843 0.500510 +vt 0.479358 0.541603 +vt 0.458588 0.541667 +vt 0.437819 0.541731 +vt 0.417049 0.541794 +vt 0.396279 0.541858 +vt 0.375510 0.541922 +vt 0.354740 0.541985 +vt 0.333971 0.542049 +vt 0.479422 0.562373 +vt 0.458652 0.562436 +vt 0.437882 0.562500 +vt 0.417113 0.562564 +vt 0.396343 0.562628 +vt 0.375574 0.562691 +vt 0.354804 0.562755 +vt 0.334034 0.562819 +vt 0.479485 0.583142 +vt 0.458716 0.583206 +vt 0.437946 0.583270 +vt 0.417176 0.583333 +vt 0.396407 0.583397 +vt 0.375637 0.583461 +vt 0.354868 0.583525 +vt 0.334098 0.583588 +vt 0.479549 0.603912 +vt 0.458779 0.603976 +vt 0.438010 0.604039 +vt 0.417240 0.604103 +vt 0.396471 0.604167 +vt 0.375701 0.604231 +vt 0.354931 0.604294 +vt 0.334162 0.604358 +vt 0.479613 0.624682 +vt 0.458843 0.624745 +vt 0.438074 0.624809 +vt 0.417304 0.624873 +vt 0.396534 0.624936 +vt 0.375765 0.625000 +vt 0.354995 0.625064 +vt 0.334225 0.625128 +vt 0.479676 0.645451 +vt 0.458907 0.645515 +vt 0.438137 0.645579 +vt 0.417368 0.645642 +vt 0.396598 0.645706 +vt 0.375828 0.645770 +vt 0.355059 0.645833 +vt 0.334289 0.645897 +vt 0.479740 0.666221 +vt 0.458971 0.666285 +vt 0.438201 0.666348 +vt 0.417431 0.666412 +vt 0.396662 0.666476 +vt 0.375892 0.666539 +vt 0.355123 0.666603 +vt 0.334353 0.666667 +vt 0.479167 0.479294 +vt 0.479103 0.458525 +vt 0.479039 0.437755 +vt 0.478976 0.416985 +vt 0.478912 0.396216 +vt 0.478848 0.375446 +vt 0.478784 0.354677 +vt 0.478721 0.333907 +vt 0.458397 0.479358 +vt 0.458333 0.458588 +vt 0.458270 0.437819 +vt 0.458206 0.417049 +vt 0.458142 0.396280 +vt 0.458079 0.375510 +vt 0.458015 0.354740 +vt 0.457951 0.333971 +vt 0.437627 0.479422 +vt 0.437564 0.458652 +vt 0.437500 0.437882 +vt 0.437436 0.417113 +vt 0.437373 0.396343 +vt 0.437309 0.375574 +vt 0.437245 0.354804 +vt 0.437181 0.334034 +vt 0.416858 0.479485 +vt 0.416794 0.458716 +vt 0.416730 0.437946 +vt 0.416667 0.417177 +vt 0.416603 0.396407 +vt 0.416539 0.375637 +vt 0.416476 0.354868 +vt 0.416412 0.334098 +vt 0.396088 0.479549 +vt 0.396025 0.458780 +vt 0.395961 0.438010 +vt 0.395897 0.417240 +vt 0.395833 0.396471 +vt 0.395770 0.375701 +vt 0.395706 0.354931 +vt 0.395642 0.334162 +vt 0.375319 0.479613 +vt 0.375255 0.458843 +vt 0.375191 0.438074 +vt 0.375127 0.417304 +vt 0.375064 0.396534 +vt 0.375000 0.375765 +vt 0.374936 0.354995 +vt 0.374873 0.334226 +vt 0.354549 0.479677 +vt 0.354485 0.458907 +vt 0.354422 0.438137 +vt 0.354358 0.417368 +vt 0.354294 0.396598 +vt 0.354230 0.375829 +vt 0.354167 0.355059 +vt 0.354103 0.334289 +vt 0.333779 0.479740 +vt 0.333716 0.458971 +vt 0.333652 0.438201 +vt 0.333588 0.417431 +vt 0.333525 0.396662 +vt 0.333461 0.375892 +vt 0.333397 0.355123 +vt 0.333333 0.334353 +vt 0.833333 0.500000 +vt 0.833397 0.479230 +vt 0.854167 0.479294 +vt 0.854103 0.500064 +vt 0.874936 0.479358 +vt 0.874873 0.500127 +vt 0.895706 0.479422 +vt 0.895642 0.500191 +vt 0.916475 0.479485 +vt 0.916412 0.500255 +vt 0.937245 0.479549 +vt 0.937181 0.500319 +vt 0.958015 0.479613 +vt 0.957951 0.500382 +vt 0.978784 0.479676 +vt 0.978721 0.500446 +vt 0.999554 0.479740 +vt 0.999490 0.500510 +vt 0.833461 0.458461 +vt 0.854230 0.458525 +vt 0.875000 0.458588 +vt 0.895770 0.458652 +vt 0.916539 0.458716 +vt 0.937309 0.458779 +vt 0.958078 0.458843 +vt 0.978848 0.458907 +vt 0.999618 0.458971 +vt 0.833524 0.437691 +vt 0.854294 0.437755 +vt 0.875064 0.437819 +vt 0.895833 0.437882 +vt 0.916603 0.437946 +vt 0.937373 0.438010 +vt 0.958142 0.438073 +vt 0.978912 0.438137 +vt 0.999681 0.438201 +vt 0.833588 0.416922 +vt 0.854358 0.416985 +vt 0.875127 0.417049 +vt 0.895897 0.417113 +vt 0.916667 0.417176 +vt 0.937436 0.417240 +vt 0.958206 0.417304 +vt 0.978975 0.417368 +vt 0.999745 0.417431 +vt 0.833652 0.396152 +vt 0.854421 0.396216 +vt 0.875191 0.396279 +vt 0.895961 0.396343 +vt 0.916730 0.396407 +vt 0.937500 0.396471 +vt 0.958270 0.396534 +vt 0.979039 0.396598 +vt 0.999809 0.396662 +vt 0.833716 0.375382 +vt 0.854485 0.375446 +vt 0.875255 0.375510 +vt 0.896024 0.375574 +vt 0.916794 0.375637 +vt 0.937564 0.375701 +vt 0.958333 0.375765 +vt 0.979103 0.375828 +vt 0.999873 0.375892 +vt 0.833779 0.354613 +vt 0.854549 0.354676 +vt 0.875319 0.354740 +vt 0.896088 0.354804 +vt 0.916858 0.354868 +vt 0.937627 0.354931 +vt 0.958397 0.354995 +vt 0.979167 0.355059 +vt 0.999936 0.355122 +vt 0.833843 0.333843 +vt 0.854613 0.333907 +vt 0.875382 0.333971 +vt 0.896152 0.334034 +vt 0.916921 0.334098 +vt 0.937691 0.334162 +vt 0.958461 0.334225 +vt 0.979230 0.334289 +vt 1.000000 0.334353 +vt 0.854039 0.520833 +vt 0.833270 0.520770 +vt 0.853975 0.541603 +vt 0.833206 0.541539 +vt 0.853912 0.562373 +vt 0.833142 0.562309 +vt 0.853848 0.583142 +vt 0.833078 0.583079 +vt 0.853784 0.603912 +vt 0.833015 0.603848 +vt 0.853721 0.624681 +vt 0.832951 0.624618 +vt 0.853657 0.645451 +vt 0.832887 0.645387 +vt 0.853593 0.666221 +vt 0.832824 0.666157 +vt 0.874809 0.520897 +vt 0.874745 0.541667 +vt 0.874681 0.562436 +vt 0.874618 0.583206 +vt 0.874554 0.603976 +vt 0.874490 0.624745 +vt 0.874427 0.645515 +vt 0.874363 0.666284 +vt 0.895578 0.520961 +vt 0.895515 0.541730 +vt 0.895451 0.562500 +vt 0.895387 0.583270 +vt 0.895324 0.604039 +vt 0.895260 0.624809 +vt 0.895196 0.645579 +vt 0.895132 0.666348 +vt 0.916348 0.521025 +vt 0.916284 0.541794 +vt 0.916221 0.562564 +vt 0.916157 0.583333 +vt 0.916093 0.604103 +vt 0.916029 0.624873 +vt 0.915966 0.645642 +vt 0.915902 0.666412 +vt 0.937118 0.521088 +vt 0.937054 0.541858 +vt 0.936990 0.562627 +vt 0.936926 0.583397 +vt 0.936863 0.604167 +vt 0.936799 0.624936 +vt 0.936735 0.645706 +vt 0.936672 0.666476 +vt 0.957887 0.521152 +vt 0.957824 0.541922 +vt 0.957760 0.562691 +vt 0.957696 0.583461 +vt 0.957632 0.604230 +vt 0.957569 0.625000 +vt 0.957505 0.645770 +vt 0.957441 0.666539 +vt 0.978657 0.521216 +vt 0.978593 0.541985 +vt 0.978529 0.562755 +vt 0.978466 0.583525 +vt 0.978402 0.604294 +vt 0.978338 0.625064 +vt 0.978275 0.645833 +vt 0.978211 0.666603 +vt 0.999426 0.521279 +vt 0.999363 0.542049 +vt 0.999299 0.562819 +vt 0.999235 0.583588 +vt 0.999172 0.604358 +vt 0.999108 0.625127 +vt 0.999044 0.645897 +vt 0.998980 0.666667 +vt 0.812500 0.520706 +vt 0.812564 0.499936 +vt 0.791730 0.520642 +vt 0.791794 0.499873 +vt 0.770961 0.520579 +vt 0.771024 0.499809 +vt 0.750191 0.520515 +vt 0.750255 0.499745 +vt 0.729422 0.520451 +vt 0.729485 0.499682 +vt 0.708652 0.520387 +vt 0.708716 0.499618 +vt 0.687882 0.520324 +vt 0.687946 0.499554 +vt 0.667113 0.520260 +vt 0.667176 0.499490 +vt 0.812436 0.541476 +vt 0.791667 0.541412 +vt 0.770897 0.541348 +vt 0.750127 0.541284 +vt 0.729358 0.541221 +vt 0.708588 0.541157 +vt 0.687819 0.541093 +vt 0.667049 0.541030 +vt 0.812373 0.562245 +vt 0.791603 0.562181 +vt 0.770833 0.562118 +vt 0.750064 0.562054 +vt 0.729294 0.561990 +vt 0.708525 0.561927 +vt 0.687755 0.561863 +vt 0.666985 0.561799 +vt 0.812309 0.583015 +vt 0.791539 0.582951 +vt 0.770770 0.582887 +vt 0.750000 0.582824 +vt 0.729230 0.582760 +vt 0.708461 0.582696 +vt 0.687691 0.582632 +vt 0.666922 0.582569 +vt 0.812245 0.603784 +vt 0.791476 0.603721 +vt 0.770706 0.603657 +vt 0.749936 0.603593 +vt 0.729167 0.603530 +vt 0.708397 0.603466 +vt 0.687627 0.603402 +vt 0.666858 0.603338 +vt 0.812181 0.624554 +vt 0.791412 0.624490 +vt 0.770642 0.624427 +vt 0.749873 0.624363 +vt 0.729103 0.624299 +vt 0.708333 0.624235 +vt 0.687564 0.624172 +vt 0.666794 0.624108 +vt 0.812118 0.645324 +vt 0.791348 0.645260 +vt 0.770579 0.645196 +vt 0.749809 0.645132 +vt 0.729039 0.645069 +vt 0.708270 0.645005 +vt 0.687500 0.644941 +vt 0.666730 0.644878 +vt 0.812054 0.666093 +vt 0.791284 0.666030 +vt 0.770515 0.665966 +vt 0.749745 0.665902 +vt 0.728976 0.665838 +vt 0.708206 0.665775 +vt 0.687436 0.665711 +vt 0.812627 0.479167 +vt 0.812691 0.458397 +vt 0.812755 0.437627 +vt 0.812819 0.416858 +vt 0.812882 0.396088 +vt 0.812946 0.375319 +vt 0.813010 0.354549 +vt 0.813073 0.333779 +vt 0.791858 0.479103 +vt 0.791921 0.458333 +vt 0.791985 0.437564 +vt 0.792049 0.416794 +vt 0.792113 0.396025 +vt 0.792176 0.375255 +vt 0.792240 0.354485 +vt 0.792304 0.333716 +vt 0.771088 0.479039 +vt 0.771152 0.458270 +vt 0.771216 0.437500 +vt 0.771279 0.416730 +vt 0.771343 0.395961 +vt 0.771407 0.375191 +vt 0.771470 0.354422 +vt 0.771534 0.333652 +vt 0.750319 0.478976 +vt 0.750382 0.458206 +vt 0.750446 0.437436 +vt 0.750510 0.416667 +vt 0.750573 0.395897 +vt 0.750637 0.375128 +vt 0.750701 0.354358 +vt 0.750765 0.333588 +vt 0.729549 0.478912 +vt 0.729613 0.458142 +vt 0.729676 0.437373 +vt 0.729740 0.416603 +vt 0.729804 0.395833 +vt 0.729868 0.375064 +vt 0.729931 0.354294 +vt 0.729995 0.333525 +vt 0.708779 0.478848 +vt 0.708843 0.458079 +vt 0.708907 0.437309 +vt 0.708970 0.416539 +vt 0.709034 0.395770 +vt 0.709098 0.375000 +vt 0.709162 0.354231 +vt 0.709225 0.333461 +vt 0.688010 0.478784 +vt 0.688073 0.458015 +vt 0.688137 0.437245 +vt 0.688201 0.416476 +vt 0.688265 0.395706 +vt 0.688328 0.374936 +vt 0.688392 0.354167 +vt 0.688456 0.333397 +vt 0.667240 0.478721 +vt 0.667304 0.457951 +vt 0.667368 0.437182 +vt 0.667431 0.416412 +vt 0.667495 0.395642 +vt 0.667559 0.374873 +vt 0.667622 0.354103 +vt 0.667686 0.333333 +vt 0.833333 0.166667 +vt 0.833270 0.145897 +vt 0.854039 0.145833 +vt 0.854103 0.166603 +vt 0.874809 0.145770 +vt 0.874873 0.166539 +vt 0.895578 0.145706 +vt 0.895642 0.166476 +vt 0.916348 0.145642 +vt 0.916412 0.166412 +vt 0.937118 0.145578 +vt 0.937181 0.166348 +vt 0.957887 0.145515 +vt 0.957951 0.166284 +vt 0.978657 0.145451 +vt 0.978721 0.166221 +vt 0.999427 0.145387 +vt 0.999490 0.166157 +vt 0.833206 0.125127 +vt 0.853976 0.125064 +vt 0.874745 0.125000 +vt 0.895515 0.124936 +vt 0.916284 0.124873 +vt 0.937054 0.124809 +vt 0.957824 0.124745 +vt 0.978593 0.124681 +vt 0.999363 0.124618 +vt 0.833142 0.104358 +vt 0.853912 0.104294 +vt 0.874681 0.104230 +vt 0.895451 0.104167 +vt 0.916221 0.104103 +vt 0.936990 0.104039 +vt 0.957760 0.103976 +vt 0.978530 0.103912 +vt 0.999299 0.103848 +vt 0.833079 0.083588 +vt 0.853848 0.083524 +vt 0.874618 0.083461 +vt 0.895387 0.083397 +vt 0.916157 0.083333 +vt 0.936927 0.083270 +vt 0.957696 0.083206 +vt 0.978466 0.083142 +vt 0.999235 0.083078 +vt 0.833015 0.062819 +vt 0.853784 0.062755 +vt 0.874554 0.062691 +vt 0.895324 0.062627 +vt 0.916093 0.062564 +vt 0.936863 0.062500 +vt 0.957632 0.062436 +vt 0.978402 0.062373 +vt 0.999172 0.062309 +vt 0.832951 0.042049 +vt 0.853721 0.041985 +vt 0.874490 0.041922 +vt 0.895260 0.041858 +vt 0.916030 0.041794 +vt 0.936799 0.041730 +vt 0.957569 0.041667 +vt 0.978338 0.041603 +vt 0.999108 0.041539 +vt 0.832887 0.021279 +vt 0.853657 0.021216 +vt 0.874427 0.021152 +vt 0.895196 0.021088 +vt 0.915966 0.021024 +vt 0.936735 0.020961 +vt 0.957505 0.020897 +vt 0.978275 0.020833 +vt 0.999044 0.020770 +vt 0.832824 0.000510 +vt 0.853593 0.000446 +vt 0.874363 0.000382 +vt 0.895133 0.000319 +vt 0.915902 0.000255 +vt 0.936672 0.000191 +vt 0.957441 0.000127 +vt 0.978211 0.000064 +vt 0.998981 0.000000 +vt 0.854167 0.187373 +vt 0.833397 0.187436 +vt 0.854230 0.208142 +vt 0.833461 0.208206 +vt 0.854294 0.228912 +vt 0.833524 0.228976 +vt 0.854358 0.249681 +vt 0.833588 0.249745 +vt 0.854421 0.270451 +vt 0.833652 0.270515 +vt 0.854485 0.291221 +vt 0.833716 0.291284 +vt 0.854549 0.311990 +vt 0.833779 0.312054 +vt 0.854613 0.332760 +vt 0.833843 0.332824 +vt 0.874936 0.187309 +vt 0.875000 0.208078 +vt 0.875064 0.228848 +vt 0.875127 0.249618 +vt 0.875191 0.270387 +vt 0.875255 0.291157 +vt 0.875319 0.311927 +vt 0.875382 0.332696 +vt 0.895706 0.187245 +vt 0.895770 0.208015 +vt 0.895833 0.228784 +vt 0.895897 0.249554 +vt 0.895961 0.270324 +vt 0.896024 0.291093 +vt 0.896088 0.311863 +vt 0.896152 0.332632 +vt 0.916475 0.187181 +vt 0.916539 0.207951 +vt 0.916603 0.228721 +vt 0.916667 0.249490 +vt 0.916730 0.270260 +vt 0.916794 0.291030 +vt 0.916858 0.311799 +vt 0.916921 0.332569 +vt 0.937245 0.187118 +vt 0.937309 0.207887 +vt 0.937373 0.228657 +vt 0.937436 0.249427 +vt 0.937500 0.270196 +vt 0.937564 0.290966 +vt 0.937627 0.311735 +vt 0.937691 0.332505 +vt 0.958015 0.187054 +vt 0.958078 0.207824 +vt 0.958142 0.228593 +vt 0.958206 0.249363 +vt 0.958270 0.270132 +vt 0.958333 0.290902 +vt 0.958397 0.311672 +vt 0.958461 0.332441 +vt 0.978784 0.186990 +vt 0.978848 0.207760 +vt 0.978912 0.228529 +vt 0.978975 0.249299 +vt 0.979039 0.270069 +vt 0.979103 0.290838 +vt 0.979167 0.311608 +vt 0.979230 0.332378 +vt 0.999554 0.186927 +vt 0.999618 0.207696 +vt 0.999681 0.228466 +vt 0.999745 0.249235 +vt 0.999809 0.270005 +vt 0.999873 0.290775 +vt 0.999936 0.311544 +vt 1.000000 0.332314 +vt 0.812627 0.187500 +vt 0.812564 0.166730 +vt 0.791858 0.187564 +vt 0.791794 0.166794 +vt 0.771088 0.187627 +vt 0.771025 0.166858 +vt 0.750319 0.187691 +vt 0.750255 0.166922 +vt 0.729549 0.187755 +vt 0.729485 0.166985 +vt 0.708779 0.187819 +vt 0.708716 0.167049 +vt 0.688010 0.187882 +vt 0.687946 0.167113 +vt 0.667240 0.187946 +vt 0.667176 0.167176 +vt 0.812691 0.208270 +vt 0.791922 0.208333 +vt 0.771152 0.208397 +vt 0.750382 0.208461 +vt 0.729613 0.208525 +vt 0.708843 0.208588 +vt 0.688073 0.208652 +vt 0.667304 0.208716 +vt 0.812755 0.229039 +vt 0.791985 0.229103 +vt 0.771216 0.229167 +vt 0.750446 0.229230 +vt 0.729676 0.229294 +vt 0.708907 0.229358 +vt 0.688137 0.229422 +vt 0.667368 0.229485 +vt 0.812819 0.249809 +vt 0.792049 0.249873 +vt 0.771279 0.249936 +vt 0.750510 0.250000 +vt 0.729740 0.250064 +vt 0.708970 0.250128 +vt 0.688201 0.250191 +vt 0.667431 0.250255 +vt 0.812882 0.270579 +vt 0.792113 0.270642 +vt 0.771343 0.270706 +vt 0.750573 0.270770 +vt 0.729804 0.270833 +vt 0.709034 0.270897 +vt 0.688265 0.270961 +vt 0.667495 0.271025 +vt 0.812946 0.291348 +vt 0.792176 0.291412 +vt 0.771407 0.291476 +vt 0.750637 0.291539 +vt 0.729868 0.291603 +vt 0.709098 0.291667 +vt 0.688328 0.291730 +vt 0.667559 0.291794 +vt 0.813010 0.312118 +vt 0.792240 0.312182 +vt 0.771470 0.312245 +vt 0.750701 0.312309 +vt 0.729931 0.312373 +vt 0.709162 0.312436 +vt 0.688392 0.312500 +vt 0.667622 0.312564 +vt 0.813073 0.332887 +vt 0.792304 0.332951 +vt 0.771534 0.333015 +vt 0.750765 0.333079 +vt 0.729995 0.333142 +vt 0.709225 0.333206 +vt 0.688456 0.333270 +vt 0.812500 0.145961 +vt 0.812436 0.125191 +vt 0.812373 0.104422 +vt 0.812309 0.083652 +vt 0.812245 0.062882 +vt 0.812181 0.042113 +vt 0.812118 0.021343 +vt 0.812054 0.000573 +vt 0.791730 0.146025 +vt 0.791667 0.125255 +vt 0.791603 0.104485 +vt 0.791539 0.083716 +vt 0.791476 0.062946 +vt 0.791412 0.042176 +vt 0.791348 0.021407 +vt 0.791284 0.000637 +vt 0.770961 0.146088 +vt 0.770897 0.125319 +vt 0.770833 0.104549 +vt 0.770770 0.083779 +vt 0.770706 0.063010 +vt 0.770642 0.042240 +vt 0.770579 0.021470 +vt 0.770515 0.000701 +vt 0.750191 0.146152 +vt 0.750127 0.125382 +vt 0.750064 0.104613 +vt 0.750000 0.083843 +vt 0.749936 0.063073 +vt 0.749873 0.042304 +vt 0.749809 0.021534 +vt 0.749745 0.000765 +vt 0.729422 0.146216 +vt 0.729358 0.125446 +vt 0.729294 0.104676 +vt 0.729230 0.083907 +vt 0.729167 0.063137 +vt 0.729103 0.042368 +vt 0.729039 0.021598 +vt 0.728976 0.000828 +vt 0.708652 0.146279 +vt 0.708588 0.125510 +vt 0.708525 0.104740 +vt 0.708461 0.083971 +vt 0.708397 0.063201 +vt 0.708333 0.042431 +vt 0.708270 0.021662 +vt 0.708206 0.000892 +vt 0.687882 0.146343 +vt 0.687819 0.125573 +vt 0.687755 0.104804 +vt 0.687691 0.084034 +vt 0.687627 0.063265 +vt 0.687564 0.042495 +vt 0.687500 0.021725 +vt 0.687436 0.000956 +vt 0.667113 0.146407 +vt 0.667049 0.125637 +vt 0.666985 0.104868 +vt 0.666922 0.084098 +vt 0.666858 0.063328 +vt 0.666794 0.042559 +vt 0.666730 0.021789 +vt 0.666667 0.001019 +vt 0.500000 0.166667 +vt 0.500064 0.187436 +vt 0.479294 0.187500 +vt 0.479230 0.166730 +vt 0.458525 0.187564 +vt 0.458461 0.166794 +vt 0.437755 0.187627 +vt 0.437691 0.166858 +vt 0.416985 0.187691 +vt 0.416922 0.166922 +vt 0.396216 0.187755 +vt 0.396152 0.166985 +vt 0.375446 0.187819 +vt 0.375382 0.167049 +vt 0.354676 0.187882 +vt 0.354613 0.167113 +vt 0.333907 0.187946 +vt 0.333843 0.167176 +vt 0.500127 0.208206 +vt 0.479358 0.208270 +vt 0.458588 0.208333 +vt 0.437819 0.208397 +vt 0.417049 0.208461 +vt 0.396279 0.208525 +vt 0.375510 0.208588 +vt 0.354740 0.208652 +vt 0.333971 0.208716 +vt 0.500191 0.228976 +vt 0.479422 0.229039 +vt 0.458652 0.229103 +vt 0.437882 0.229167 +vt 0.417113 0.229230 +vt 0.396343 0.229294 +vt 0.375574 0.229358 +vt 0.354804 0.229422 +vt 0.334034 0.229485 +vt 0.500255 0.249745 +vt 0.479485 0.249809 +vt 0.458716 0.249873 +vt 0.437946 0.249936 +vt 0.417176 0.250000 +vt 0.396407 0.250064 +vt 0.375637 0.250128 +vt 0.354868 0.250191 +vt 0.334098 0.250255 +vt 0.500319 0.270515 +vt 0.479549 0.270579 +vt 0.458779 0.270642 +vt 0.438010 0.270706 +vt 0.417240 0.270770 +vt 0.396471 0.270833 +vt 0.375701 0.270897 +vt 0.354931 0.270961 +vt 0.334162 0.271025 +vt 0.500382 0.291284 +vt 0.479613 0.291348 +vt 0.458843 0.291412 +vt 0.438074 0.291476 +vt 0.417304 0.291539 +vt 0.396534 0.291603 +vt 0.375765 0.291667 +vt 0.354995 0.291730 +vt 0.334225 0.291794 +vt 0.500446 0.312054 +vt 0.479676 0.312118 +vt 0.458907 0.312182 +vt 0.438137 0.312245 +vt 0.417368 0.312309 +vt 0.396598 0.312373 +vt 0.375828 0.312436 +vt 0.355059 0.312500 +vt 0.334289 0.312564 +vt 0.500510 0.332824 +vt 0.479740 0.332887 +vt 0.458971 0.332951 +vt 0.438201 0.333015 +vt 0.417431 0.333079 +vt 0.396662 0.333142 +vt 0.375892 0.333206 +vt 0.355122 0.333270 +vt 0.334353 0.333333 +vt 0.479167 0.145961 +vt 0.499936 0.145897 +vt 0.479103 0.125191 +vt 0.499873 0.125127 +vt 0.479039 0.104422 +vt 0.499809 0.104358 +vt 0.478976 0.083652 +vt 0.499745 0.083588 +vt 0.478912 0.062882 +vt 0.499681 0.062819 +vt 0.478848 0.042113 +vt 0.499618 0.042049 +vt 0.478784 0.021343 +vt 0.499554 0.021279 +vt 0.478721 0.000573 +vt 0.499490 0.000510 +vt 0.458397 0.146025 +vt 0.458333 0.125255 +vt 0.458270 0.104485 +vt 0.458206 0.083716 +vt 0.458142 0.062946 +vt 0.458079 0.042176 +vt 0.458015 0.021407 +vt 0.457951 0.000637 +vt 0.437627 0.146088 +vt 0.437564 0.125319 +vt 0.437500 0.104549 +vt 0.437436 0.083779 +vt 0.437373 0.063010 +vt 0.437309 0.042240 +vt 0.437245 0.021471 +vt 0.437181 0.000701 +vt 0.416858 0.146152 +vt 0.416794 0.125382 +vt 0.416730 0.104613 +vt 0.416667 0.083843 +vt 0.416603 0.063073 +vt 0.416539 0.042304 +vt 0.416476 0.021534 +vt 0.416412 0.000765 +vt 0.396088 0.146216 +vt 0.396025 0.125446 +vt 0.395961 0.104676 +vt 0.395897 0.083907 +vt 0.395833 0.063137 +vt 0.395770 0.042368 +vt 0.395706 0.021598 +vt 0.395642 0.000828 +vt 0.375319 0.146279 +vt 0.375255 0.125510 +vt 0.375191 0.104740 +vt 0.375127 0.083971 +vt 0.375064 0.063201 +vt 0.375000 0.042431 +vt 0.374936 0.021662 +vt 0.374873 0.000892 +vt 0.354549 0.146343 +vt 0.354485 0.125574 +vt 0.354422 0.104804 +vt 0.354358 0.084034 +vt 0.354294 0.063265 +vt 0.354230 0.042495 +vt 0.354167 0.021725 +vt 0.354103 0.000956 +vt 0.333779 0.146407 +vt 0.333716 0.125637 +vt 0.333652 0.104868 +vt 0.333588 0.084098 +vt 0.333525 0.063328 +vt 0.333461 0.042559 +vt 0.333397 0.021789 +vt 0.333333 0.001020 +vt 0.520706 0.145833 +vt 0.520770 0.166603 +vt 0.541476 0.145770 +vt 0.541539 0.166539 +vt 0.562245 0.145706 +vt 0.562309 0.166476 +vt 0.583015 0.145642 +vt 0.583079 0.166412 +vt 0.603784 0.145579 +vt 0.603848 0.166348 +vt 0.624554 0.145515 +vt 0.624618 0.166284 +vt 0.645324 0.145451 +vt 0.645387 0.166221 +vt 0.666093 0.145387 +vt 0.666157 0.166157 +vt 0.520642 0.125064 +vt 0.541412 0.125000 +vt 0.562181 0.124936 +vt 0.582951 0.124873 +vt 0.603721 0.124809 +vt 0.624490 0.124745 +vt 0.645260 0.124681 +vt 0.666030 0.124618 +vt 0.520579 0.104294 +vt 0.541348 0.104230 +vt 0.562118 0.104167 +vt 0.582887 0.104103 +vt 0.603657 0.104039 +vt 0.624427 0.103976 +vt 0.645196 0.103912 +vt 0.665966 0.103848 +vt 0.520515 0.083525 +vt 0.541284 0.083461 +vt 0.562054 0.083397 +vt 0.582824 0.083333 +vt 0.603593 0.083270 +vt 0.624363 0.083206 +vt 0.645132 0.083142 +vt 0.665902 0.083078 +vt 0.520451 0.062755 +vt 0.541221 0.062691 +vt 0.561990 0.062627 +vt 0.582760 0.062564 +vt 0.603530 0.062500 +vt 0.624299 0.062436 +vt 0.645069 0.062373 +vt 0.665838 0.062309 +vt 0.520387 0.041985 +vt 0.541157 0.041922 +vt 0.561927 0.041858 +vt 0.582696 0.041794 +vt 0.603466 0.041730 +vt 0.624235 0.041667 +vt 0.645005 0.041603 +vt 0.665775 0.041539 +vt 0.520324 0.021216 +vt 0.541093 0.021152 +vt 0.561863 0.021088 +vt 0.582632 0.021024 +vt 0.603402 0.020961 +vt 0.624172 0.020897 +vt 0.644941 0.020833 +vt 0.665711 0.020770 +vt 0.520260 0.000446 +vt 0.541030 0.000382 +vt 0.561799 0.000319 +vt 0.582569 0.000255 +vt 0.603338 0.000191 +vt 0.624108 0.000127 +vt 0.644878 0.000064 +vt 0.665647 0.000000 +vt 0.520833 0.187373 +vt 0.520897 0.208142 +vt 0.520961 0.228912 +vt 0.521025 0.249681 +vt 0.521088 0.270451 +vt 0.521152 0.291221 +vt 0.521216 0.311990 +vt 0.521279 0.332760 +vt 0.541603 0.187309 +vt 0.541667 0.208079 +vt 0.541730 0.228848 +vt 0.541794 0.249618 +vt 0.541858 0.270387 +vt 0.541922 0.291157 +vt 0.541985 0.311927 +vt 0.542049 0.332696 +vt 0.562373 0.187245 +vt 0.562436 0.208015 +vt 0.562500 0.228784 +vt 0.562564 0.249554 +vt 0.562627 0.270324 +vt 0.562691 0.291093 +vt 0.562755 0.311863 +vt 0.562819 0.332633 +vt 0.583142 0.187181 +vt 0.583206 0.207951 +vt 0.583270 0.228721 +vt 0.583333 0.249490 +vt 0.583397 0.270260 +vt 0.583461 0.291030 +vt 0.583525 0.311799 +vt 0.583588 0.332569 +vt 0.603912 0.187118 +vt 0.603976 0.207887 +vt 0.604039 0.228657 +vt 0.604103 0.249427 +vt 0.604167 0.270196 +vt 0.604230 0.290966 +vt 0.604294 0.311735 +vt 0.604358 0.332505 +vt 0.624681 0.187054 +vt 0.624745 0.207824 +vt 0.624809 0.228593 +vt 0.624873 0.249363 +vt 0.624936 0.270133 +vt 0.625000 0.290902 +vt 0.625064 0.311672 +vt 0.625127 0.332441 +vt 0.645451 0.186990 +vt 0.645515 0.207760 +vt 0.645579 0.228530 +vt 0.645642 0.249299 +vt 0.645706 0.270069 +vt 0.645770 0.290838 +vt 0.645833 0.311608 +vt 0.645897 0.332378 +vt 0.666221 0.186927 +vt 0.666284 0.207696 +vt 0.666348 0.228466 +vt 0.666412 0.249235 +vt 0.666476 0.270005 +vt 0.666539 0.290775 +vt 0.666603 0.311544 +vt 0.666667 0.332314 +vt 0.166667 0.500000 +vt 0.166603 0.479231 +vt 0.187373 0.479167 +vt 0.187436 0.499936 +vt 0.208142 0.479103 +vt 0.208206 0.499873 +vt 0.228912 0.479039 +vt 0.228976 0.499809 +vt 0.249681 0.478976 +vt 0.249745 0.499745 +vt 0.270451 0.478912 +vt 0.270515 0.499682 +vt 0.291221 0.478848 +vt 0.291284 0.499618 +vt 0.311990 0.478785 +vt 0.312054 0.499554 +vt 0.332760 0.478721 +vt 0.332824 0.499490 +vt 0.166539 0.458461 +vt 0.187309 0.458397 +vt 0.208078 0.458333 +vt 0.228848 0.458270 +vt 0.249618 0.458206 +vt 0.270387 0.458142 +vt 0.291157 0.458079 +vt 0.311927 0.458015 +vt 0.332696 0.457951 +vt 0.166476 0.437691 +vt 0.187245 0.437628 +vt 0.208015 0.437564 +vt 0.228784 0.437500 +vt 0.249554 0.437436 +vt 0.270324 0.437373 +vt 0.291093 0.437309 +vt 0.311863 0.437245 +vt 0.332632 0.437182 +vt 0.166412 0.416922 +vt 0.187181 0.416858 +vt 0.207951 0.416794 +vt 0.228721 0.416731 +vt 0.249490 0.416667 +vt 0.270260 0.416603 +vt 0.291030 0.416539 +vt 0.311799 0.416476 +vt 0.332569 0.416412 +vt 0.166348 0.396152 +vt 0.187118 0.396088 +vt 0.207887 0.396025 +vt 0.228657 0.395961 +vt 0.249427 0.395897 +vt 0.270196 0.395833 +vt 0.290966 0.395770 +vt 0.311735 0.395706 +vt 0.332505 0.395642 +vt 0.166284 0.375382 +vt 0.187054 0.375319 +vt 0.207824 0.375255 +vt 0.228593 0.375191 +vt 0.249363 0.375128 +vt 0.270132 0.375064 +vt 0.290902 0.375000 +vt 0.311672 0.374936 +vt 0.332441 0.374873 +vt 0.166221 0.354613 +vt 0.186990 0.354549 +vt 0.207760 0.354485 +vt 0.228530 0.354422 +vt 0.249299 0.354358 +vt 0.270069 0.354294 +vt 0.290838 0.354231 +vt 0.311608 0.354167 +vt 0.332378 0.354103 +vt 0.166157 0.333843 +vt 0.186927 0.333780 +vt 0.207696 0.333716 +vt 0.228466 0.333652 +vt 0.249235 0.333588 +vt 0.270005 0.333525 +vt 0.290775 0.333461 +vt 0.311544 0.333397 +vt 0.332314 0.333333 +vt 0.187500 0.520706 +vt 0.166730 0.520770 +vt 0.187564 0.541476 +vt 0.166794 0.541539 +vt 0.187627 0.562245 +vt 0.166858 0.562309 +vt 0.187691 0.583015 +vt 0.166922 0.583079 +vt 0.187755 0.603785 +vt 0.166985 0.603848 +vt 0.187819 0.624554 +vt 0.167049 0.624618 +vt 0.187882 0.645324 +vt 0.167113 0.645387 +vt 0.187946 0.666093 +vt 0.167176 0.666157 +vt 0.208270 0.520642 +vt 0.208333 0.541412 +vt 0.208397 0.562182 +vt 0.208461 0.582951 +vt 0.208525 0.603721 +vt 0.208588 0.624490 +vt 0.208652 0.645260 +vt 0.208716 0.666030 +vt 0.229039 0.520579 +vt 0.229103 0.541348 +vt 0.229167 0.562118 +vt 0.229230 0.582887 +vt 0.229294 0.603657 +vt 0.229358 0.624427 +vt 0.229422 0.645196 +vt 0.229485 0.665966 +vt 0.249809 0.520515 +vt 0.249873 0.541285 +vt 0.249936 0.562054 +vt 0.250000 0.582824 +vt 0.250064 0.603593 +vt 0.250127 0.624363 +vt 0.250191 0.645133 +vt 0.250255 0.665902 +vt 0.270579 0.520451 +vt 0.270642 0.541221 +vt 0.270706 0.561990 +vt 0.270770 0.582760 +vt 0.270833 0.603530 +vt 0.270897 0.624299 +vt 0.270961 0.645069 +vt 0.271025 0.665839 +vt 0.291348 0.520387 +vt 0.291412 0.541157 +vt 0.291476 0.561927 +vt 0.291539 0.582696 +vt 0.291603 0.603466 +vt 0.291667 0.624236 +vt 0.291730 0.645005 +vt 0.291794 0.665775 +vt 0.312118 0.520324 +vt 0.312181 0.541093 +vt 0.312245 0.561863 +vt 0.312309 0.582633 +vt 0.312373 0.603402 +vt 0.312436 0.624172 +vt 0.312500 0.644941 +vt 0.312564 0.665711 +vt 0.332887 0.520260 +vt 0.332951 0.541030 +vt 0.333015 0.561799 +vt 0.333079 0.582569 +vt 0.333142 0.603338 +vt 0.333206 0.624108 +vt 0.333270 0.644878 +vt 0.333333 0.665647 +vt 0.145961 0.520833 +vt 0.145897 0.500064 +vt 0.125191 0.520897 +vt 0.125127 0.500128 +vt 0.104422 0.520961 +vt 0.104358 0.500191 +vt 0.083652 0.521025 +vt 0.083588 0.500255 +vt 0.062882 0.521088 +vt 0.062819 0.500319 +vt 0.042113 0.521152 +vt 0.042049 0.500382 +vt 0.021343 0.521216 +vt 0.021279 0.500446 +vt 0.000573 0.521280 +vt 0.000510 0.500510 +vt 0.146025 0.541603 +vt 0.125255 0.541667 +vt 0.104485 0.541731 +vt 0.083716 0.541794 +vt 0.062946 0.541858 +vt 0.042176 0.541922 +vt 0.021407 0.541985 +vt 0.000637 0.542049 +vt 0.146088 0.562373 +vt 0.125319 0.562436 +vt 0.104549 0.562500 +vt 0.083779 0.562564 +vt 0.063010 0.562628 +vt 0.042240 0.562691 +vt 0.021471 0.562755 +vt 0.000701 0.562819 +vt 0.146152 0.583142 +vt 0.125382 0.583206 +vt 0.104613 0.583270 +vt 0.083843 0.583333 +vt 0.063074 0.583397 +vt 0.042304 0.583461 +vt 0.021534 0.583525 +vt 0.000765 0.583588 +vt 0.146216 0.603912 +vt 0.125446 0.603976 +vt 0.104676 0.604039 +vt 0.083907 0.604103 +vt 0.063137 0.604167 +vt 0.042368 0.604231 +vt 0.021598 0.604294 +vt 0.000828 0.604358 +vt 0.146279 0.624682 +vt 0.125510 0.624745 +vt 0.104740 0.624809 +vt 0.083971 0.624873 +vt 0.063201 0.624936 +vt 0.042431 0.625000 +vt 0.021662 0.625064 +vt 0.000892 0.625128 +vt 0.146343 0.645451 +vt 0.125574 0.645515 +vt 0.104804 0.645579 +vt 0.084034 0.645642 +vt 0.063265 0.645706 +vt 0.042495 0.645770 +vt 0.021725 0.645833 +vt 0.000956 0.645897 +vt 0.146407 0.666221 +vt 0.125637 0.666285 +vt 0.104868 0.666348 +vt 0.084098 0.666412 +vt 0.063328 0.666476 +vt 0.042559 0.666539 +vt 0.021789 0.666603 +vt 0.001020 0.666667 +vt 0.145833 0.479294 +vt 0.145770 0.458525 +vt 0.145706 0.437755 +vt 0.145642 0.416985 +vt 0.145578 0.396216 +vt 0.145515 0.375446 +vt 0.145451 0.354677 +vt 0.145387 0.333907 +vt 0.125064 0.479358 +vt 0.125000 0.458588 +vt 0.124936 0.437819 +vt 0.124873 0.417049 +vt 0.124809 0.396280 +vt 0.124745 0.375510 +vt 0.124681 0.354740 +vt 0.124618 0.333971 +vt 0.104294 0.479422 +vt 0.104230 0.458652 +vt 0.104167 0.437882 +vt 0.104103 0.417113 +vt 0.104039 0.396343 +vt 0.103976 0.375574 +vt 0.103912 0.354804 +vt 0.103848 0.334034 +vt 0.083525 0.479485 +vt 0.083461 0.458716 +vt 0.083397 0.437946 +vt 0.083333 0.417177 +vt 0.083270 0.396407 +vt 0.083206 0.375637 +vt 0.083142 0.354868 +vt 0.083078 0.334098 +vt 0.062755 0.479549 +vt 0.062691 0.458780 +vt 0.062627 0.438010 +vt 0.062564 0.417240 +vt 0.062500 0.396471 +vt 0.062436 0.375701 +vt 0.062373 0.354931 +vt 0.062309 0.334162 +vt 0.041985 0.479613 +vt 0.041922 0.458843 +vt 0.041858 0.438074 +vt 0.041794 0.417304 +vt 0.041730 0.396534 +vt 0.041667 0.375765 +vt 0.041603 0.354995 +vt 0.041539 0.334226 +vt 0.021216 0.479677 +vt 0.021152 0.458907 +vt 0.021088 0.438137 +vt 0.021025 0.417368 +vt 0.020961 0.396598 +vt 0.020897 0.375829 +vt 0.020833 0.355059 +vt 0.020770 0.334289 +vt 0.000446 0.479740 +vt 0.000382 0.458971 +vt 0.000319 0.438201 +vt 0.000255 0.417431 +vt 0.000191 0.396662 +vt 0.000127 0.375892 +vt 0.000064 0.355123 +vt 0.000000 0.334353 +vt 0.166667 0.166667 +vt 0.166603 0.145897 +vt 0.187373 0.145833 +vt 0.187436 0.166603 +vt 0.208142 0.145770 +vt 0.208206 0.166539 +vt 0.228912 0.145706 +vt 0.228976 0.166476 +vt 0.249682 0.145642 +vt 0.249745 0.166412 +vt 0.270451 0.145579 +vt 0.270515 0.166348 +vt 0.291221 0.145515 +vt 0.291284 0.166284 +vt 0.311990 0.145451 +vt 0.312054 0.166221 +vt 0.332760 0.145387 +vt 0.332824 0.166157 +vt 0.166539 0.125128 +vt 0.187309 0.125064 +vt 0.208079 0.125000 +vt 0.228848 0.124936 +vt 0.249618 0.124873 +vt 0.270387 0.124809 +vt 0.291157 0.124745 +vt 0.311927 0.124681 +vt 0.332696 0.124618 +vt 0.166476 0.104358 +vt 0.187245 0.104294 +vt 0.208015 0.104230 +vt 0.228784 0.104167 +vt 0.249554 0.104103 +vt 0.270324 0.104039 +vt 0.291093 0.103976 +vt 0.311863 0.103912 +vt 0.332633 0.103848 +vt 0.166412 0.083588 +vt 0.187181 0.083525 +vt 0.207951 0.083461 +vt 0.228721 0.083397 +vt 0.249490 0.083333 +vt 0.270260 0.083270 +vt 0.291030 0.083206 +vt 0.311799 0.083142 +vt 0.332569 0.083078 +vt 0.166348 0.062819 +vt 0.187118 0.062755 +vt 0.207887 0.062691 +vt 0.228657 0.062627 +vt 0.249427 0.062564 +vt 0.270196 0.062500 +vt 0.290966 0.062436 +vt 0.311735 0.062373 +vt 0.332505 0.062309 +vt 0.166284 0.042049 +vt 0.187054 0.041985 +vt 0.207824 0.041922 +vt 0.228593 0.041858 +vt 0.249363 0.041794 +vt 0.270133 0.041730 +vt 0.290902 0.041667 +vt 0.311672 0.041603 +vt 0.332441 0.041539 +vt 0.166221 0.021279 +vt 0.186990 0.021216 +vt 0.207760 0.021152 +vt 0.228530 0.021088 +vt 0.249299 0.021025 +vt 0.270069 0.020961 +vt 0.290838 0.020897 +vt 0.311608 0.020833 +vt 0.332378 0.020770 +vt 0.166157 0.000510 +vt 0.186927 0.000446 +vt 0.207696 0.000382 +vt 0.228466 0.000319 +vt 0.249235 0.000255 +vt 0.270005 0.000191 +vt 0.290775 0.000127 +vt 0.311544 0.000064 +vt 0.332314 0.000000 +vt 0.187500 0.187373 +vt 0.166730 0.187436 +vt 0.187564 0.208142 +vt 0.166794 0.208206 +vt 0.187628 0.228912 +vt 0.166858 0.228976 +vt 0.187691 0.249681 +vt 0.166922 0.249745 +vt 0.187755 0.270451 +vt 0.166985 0.270515 +vt 0.187819 0.291221 +vt 0.167049 0.291284 +vt 0.187882 0.311990 +vt 0.167113 0.312054 +vt 0.187946 0.332760 +vt 0.167176 0.332824 +vt 0.208270 0.187309 +vt 0.208333 0.208079 +vt 0.208397 0.228848 +vt 0.208461 0.249618 +vt 0.208525 0.270387 +vt 0.208588 0.291157 +vt 0.208652 0.311927 +vt 0.208716 0.332696 +vt 0.229039 0.187245 +vt 0.229103 0.208015 +vt 0.229167 0.228784 +vt 0.229230 0.249554 +vt 0.229294 0.270324 +vt 0.229358 0.291093 +vt 0.229422 0.311863 +vt 0.229485 0.332633 +vt 0.249809 0.187181 +vt 0.249873 0.207951 +vt 0.249936 0.228721 +vt 0.250000 0.249490 +vt 0.250064 0.270260 +vt 0.250127 0.291030 +vt 0.250191 0.311799 +vt 0.250255 0.332569 +vt 0.270579 0.187118 +vt 0.270642 0.207887 +vt 0.270706 0.228657 +vt 0.270770 0.249427 +vt 0.270833 0.270196 +vt 0.270897 0.290966 +vt 0.270961 0.311735 +vt 0.271025 0.332505 +vt 0.291348 0.187054 +vt 0.291412 0.207824 +vt 0.291476 0.228593 +vt 0.291539 0.249363 +vt 0.291603 0.270133 +vt 0.291667 0.290902 +vt 0.291730 0.311672 +vt 0.291794 0.332441 +vt 0.312118 0.186990 +vt 0.312182 0.207760 +vt 0.312245 0.228530 +vt 0.312309 0.249299 +vt 0.312373 0.270069 +vt 0.312436 0.290838 +vt 0.312500 0.311608 +vt 0.312564 0.332378 +vt 0.332887 0.186927 +vt 0.332951 0.207696 +vt 0.333015 0.228466 +vt 0.333079 0.249235 +vt 0.333142 0.270005 +vt 0.333206 0.290775 +vt 0.333270 0.311544 +vt 0.333333 0.332314 +vt 0.145961 0.187500 +vt 0.145897 0.166730 +vt 0.125191 0.187564 +vt 0.125127 0.166794 +vt 0.104422 0.187628 +vt 0.104358 0.166858 +vt 0.083652 0.187691 +vt 0.083588 0.166922 +vt 0.062882 0.187755 +vt 0.062819 0.166985 +vt 0.042113 0.187819 +vt 0.042049 0.167049 +vt 0.021343 0.187882 +vt 0.021279 0.167113 +vt 0.000574 0.187946 +vt 0.000510 0.167177 +vt 0.146025 0.208270 +vt 0.125255 0.208333 +vt 0.104485 0.208397 +vt 0.083716 0.208461 +vt 0.062946 0.208525 +vt 0.042176 0.208588 +vt 0.021407 0.208652 +vt 0.000637 0.208716 +vt 0.146088 0.229039 +vt 0.125319 0.229103 +vt 0.104549 0.229167 +vt 0.083779 0.229230 +vt 0.063010 0.229294 +vt 0.042240 0.229358 +vt 0.021471 0.229422 +vt 0.000701 0.229485 +vt 0.146152 0.249809 +vt 0.125382 0.249873 +vt 0.104613 0.249936 +vt 0.083843 0.250000 +vt 0.063074 0.250064 +vt 0.042304 0.250128 +vt 0.021534 0.250191 +vt 0.000765 0.250255 +vt 0.146216 0.270579 +vt 0.125446 0.270642 +vt 0.104676 0.270706 +vt 0.083907 0.270770 +vt 0.063137 0.270833 +vt 0.042368 0.270897 +vt 0.021598 0.270961 +vt 0.000828 0.271025 +vt 0.146279 0.291348 +vt 0.125510 0.291412 +vt 0.104740 0.291476 +vt 0.083971 0.291539 +vt 0.063201 0.291603 +vt 0.042431 0.291667 +vt 0.021662 0.291731 +vt 0.000892 0.291794 +vt 0.146343 0.312118 +vt 0.125574 0.312182 +vt 0.104804 0.312245 +vt 0.084034 0.312309 +vt 0.063265 0.312373 +vt 0.042495 0.312436 +vt 0.021725 0.312500 +vt 0.000956 0.312564 +vt 0.146407 0.332887 +vt 0.125637 0.332951 +vt 0.104868 0.333015 +vt 0.084098 0.333079 +vt 0.063328 0.333142 +vt 0.042559 0.333206 +vt 0.021789 0.333270 +vt 0.001020 0.333333 +vt 0.145833 0.145961 +vt 0.145770 0.125191 +vt 0.145706 0.104422 +vt 0.145642 0.083652 +vt 0.145579 0.062882 +vt 0.145515 0.042113 +vt 0.145451 0.021343 +vt 0.145387 0.000574 +vt 0.125064 0.146025 +vt 0.125000 0.125255 +vt 0.124936 0.104485 +vt 0.124873 0.083716 +vt 0.124809 0.062946 +vt 0.124745 0.042176 +vt 0.124681 0.021407 +vt 0.124618 0.000637 +vt 0.104294 0.146088 +vt 0.104230 0.125319 +vt 0.104167 0.104549 +vt 0.104103 0.083779 +vt 0.104039 0.063010 +vt 0.103976 0.042240 +vt 0.103912 0.021471 +vt 0.103848 0.000701 +vt 0.083525 0.146152 +vt 0.083461 0.125382 +vt 0.083397 0.104613 +vt 0.083333 0.083843 +vt 0.083270 0.063074 +vt 0.083206 0.042304 +vt 0.083142 0.021534 +vt 0.083078 0.000765 +vt 0.062755 0.146216 +vt 0.062691 0.125446 +vt 0.062627 0.104677 +vt 0.062564 0.083907 +vt 0.062500 0.063137 +vt 0.062436 0.042368 +vt 0.062373 0.021598 +vt 0.062309 0.000828 +vt 0.041985 0.146279 +vt 0.041922 0.125510 +vt 0.041858 0.104740 +vt 0.041794 0.083971 +vt 0.041730 0.063201 +vt 0.041667 0.042431 +vt 0.041603 0.021662 +vt 0.041539 0.000892 +vt 0.021216 0.146343 +vt 0.021152 0.125574 +vt 0.021088 0.104804 +vt 0.021025 0.084034 +vt 0.020961 0.063265 +vt 0.020897 0.042495 +vt 0.020833 0.021725 +vt 0.020770 0.000956 +vt 0.000446 0.146407 +vt 0.000382 0.125637 +vt 0.000319 0.104868 +vt 0.000255 0.084098 +vt 0.000191 0.063328 +vt 0.000127 0.042559 +vt 0.000064 0.021789 +vt 0.000000 0.001020 +vn -0.057375 -0.993255 0.100497 +vn -0.043184 -0.991455 -0.123020 +vn -0.021027 -0.994995 -0.097568 +vn 0.051576 -0.989257 0.136662 +vn 0.134922 -0.989837 -0.044527 +vn 0.200537 -0.953337 0.225562 +vn 0.154485 -0.987976 -0.002930 +vn 0.129521 -0.961364 0.242897 +vn 0.373089 -0.927641 -0.016327 +vn 0.280587 -0.948912 0.144169 +vn 0.500107 -0.864498 -0.049867 +vn 0.405377 -0.913663 -0.029145 +vn 0.400739 -0.915647 -0.031220 +vn 0.402478 -0.903409 -0.147832 +vn 0.346049 -0.937376 0.039399 +vn 0.404584 -0.903836 -0.139073 +vn 0.410047 -0.911100 0.041475 +vn 0.353496 -0.925382 -0.136631 +vn -0.024079 -0.965972 -0.257393 +vn -0.023469 -0.952300 -0.304147 +vn 0.079928 -0.947325 -0.310038 +vn 0.127598 -0.952239 -0.277352 +vn 0.364299 -0.900632 -0.236854 +vn 0.489669 -0.852504 -0.182714 +vn 0.343211 -0.931211 -0.122440 +vn 0.251381 -0.967559 -0.024537 +vn 0.489334 -0.872066 -0.005097 +vn -0.014008 -0.980255 -0.197150 +vn 0.073244 -0.962279 -0.261940 +vn 0.111515 -0.918546 -0.379162 +vn 0.167730 -0.858455 -0.484664 +vn 0.308359 -0.784478 -0.538011 +vn 0.362407 -0.810816 -0.459548 +vn 0.219794 -0.936247 -0.273995 +vn 0.169042 -0.975036 -0.143834 +vn 0.546129 -0.808374 -0.219642 +vn 0.007508 -0.969268 -0.245796 +vn 0.245369 -0.901669 -0.355968 +vn 0.258065 -0.804926 -0.534257 +vn 0.284433 -0.692373 -0.663076 +vn 0.252876 -0.673452 -0.694601 +vn 0.142613 -0.793420 -0.591723 +vn 0.021668 -0.921598 -0.387494 +vn 0.169042 -0.924406 -0.341838 +vn 0.554125 -0.720237 -0.417310 +vn 0.082247 -0.946593 -0.311747 +vn 0.425855 -0.803766 -0.415418 +vn 0.407636 -0.728233 -0.550890 +vn 0.362529 -0.709189 -0.604633 +vn 0.221870 -0.775811 -0.590625 +vn 0.027802 -0.831782 -0.554338 +vn -0.058107 -0.826472 -0.559923 +vn 0.096133 -0.754814 -0.648823 +vn 0.426008 -0.574480 -0.698874 +vn 0.125736 -0.955992 -0.265023 +vn 0.528459 -0.804102 -0.272225 +vn 0.460189 -0.820856 -0.338176 +vn 0.334941 -0.879757 -0.337352 +vn 0.221076 -0.917234 -0.331309 +vn 0.103641 -0.898831 -0.425855 +vn 0.066073 -0.798700 -0.598071 +vn 0.113468 -0.632374 -0.766259 +vn 0.276925 -0.446516 -0.850826 +vn 0.106265 -0.838893 -0.533769 +vn 0.502914 -0.786401 -0.358623 +vn 0.449660 -0.857875 -0.248604 +vn 0.327280 -0.905209 -0.270943 +vn 0.300394 -0.887326 -0.349834 +vn 0.308176 -0.819239 -0.483535 +vn 0.267098 -0.696707 -0.665731 +vn 0.267342 -0.546922 -0.793329 +vn 0.282022 -0.439314 -0.852870 +vn 0.112461 -0.453993 -0.883847 +vn 0.359935 -0.491195 -0.793176 +vn 0.415052 -0.586627 -0.695395 +vn 0.342021 -0.684866 -0.643391 +vn 0.403760 -0.673177 -0.619465 +vn 0.468032 -0.574938 -0.671072 +vn 0.390881 -0.520829 -0.758873 +vn 0.341105 -0.499741 -0.796136 +vn 0.359111 -0.490555 -0.793939 +vn 0.064272 -0.985656 0.155919 +vn -0.105319 -0.968902 0.223823 +vn -0.074343 -0.934660 0.347636 +vn -0.117222 -0.896329 0.427564 +vn -0.197699 -0.900143 0.388073 +vn -0.123997 -0.889523 0.439711 +vn -0.255287 -0.940886 0.222571 +vn -0.218085 -0.922086 0.319590 +vn -0.351543 -0.909757 0.220740 +vn -0.325266 -0.883755 0.336344 +vn -0.388165 -0.796533 0.463454 +vn -0.319559 -0.866390 0.383648 +vn -0.159368 -0.716300 0.679312 +vn -0.149632 -0.902463 0.403882 +vn 0.111637 -0.735466 0.668264 +vn 0.056459 -0.822748 0.565539 +vn 0.225715 -0.969512 0.095157 +vn 0.121189 -0.978057 0.169408 +vn -0.052278 -0.951933 0.301737 +vn -0.182257 -0.969939 0.161168 +vn -0.221229 -0.962401 0.157598 +vn -0.144200 -0.782373 0.605823 +vn -0.020447 -0.510910 0.859371 +vn 0.064364 -0.681753 0.728690 +vn 0.161931 -0.977966 0.131535 +vn 0.255257 -0.960326 0.112125 +vn 0.219916 -0.961974 0.161870 +vn 0.109287 -0.991272 0.073428 +vn 0.123569 -0.970794 0.205512 +vn 0.176611 -0.718436 0.672781 +vn 0.122196 -0.491501 0.862239 +vn 0.010376 -0.725669 0.687948 +vn 0.205206 -0.957701 0.201605 +vn 0.271767 -0.939848 0.206915 +vn 0.378857 -0.915128 0.137791 +vn 0.456740 -0.887600 0.059145 +vn 0.517563 -0.824152 0.229926 +vn 0.475082 -0.623432 0.620960 +vn 0.292825 -0.576861 0.762505 +vn 0.139714 -0.796167 0.588702 +vn 0.219581 -0.970092 0.103183 +vn 0.146519 -0.944914 0.292611 +vn 0.325694 -0.883938 0.335459 +vn 0.564898 -0.801447 0.196234 +vn 0.649373 -0.730247 0.212134 +vn 0.572497 -0.651082 0.498276 +vn 0.399365 -0.697958 0.594409 +vn 0.287210 -0.810511 0.510453 +vn 0.289224 -0.951048 -0.108768 +vn 0.147343 -0.950011 0.275185 +vn 0.129002 -0.841945 0.523850 +vn 0.304300 -0.880825 0.362651 +vn 0.385327 -0.896573 0.218299 +vn 0.330027 -0.844783 0.421125 +vn 0.247444 -0.825495 0.507248 +vn 0.250801 -0.814692 0.522782 +vn 0.416974 -0.883145 -0.214789 +vn 0.392071 -0.891903 0.225227 +vn 0.253273 -0.785974 0.563952 +vn 0.212073 -0.887295 0.409497 +vn 0.262642 -0.919156 0.293497 +vn 0.290475 -0.876675 0.383404 +vn 0.242805 -0.850185 0.467116 +vn 0.284890 -0.757653 0.587176 +vn 0.371593 -0.912320 -0.171941 +vn 0.390790 -0.895779 0.211737 +vn 0.318461 -0.800012 0.508438 +vn 0.340983 -0.834590 0.432569 +vn 0.426771 -0.800714 0.420301 +vn 0.489944 -0.783898 0.381298 +vn 0.452040 -0.762810 0.462294 +vn 0.360118 -0.675832 0.643055 +vn -0.202795 -0.920408 0.334147 +vn -0.103244 -0.984680 0.140385 +vn -0.378491 -0.777642 0.501968 +vn -0.212226 -0.950072 0.228706 +vn -0.269448 -0.752983 0.600299 +vn -0.231330 -0.913175 0.335521 +vn -0.297555 -0.746513 0.595080 +vn -0.382855 -0.826350 0.412946 +vn -0.429212 -0.745964 0.509171 +vn -0.540849 -0.740135 0.399548 +vn -0.296213 -0.888180 0.351238 +vn -0.477767 -0.827937 0.293619 +vn -0.384747 -0.917051 0.104526 +vn -0.547349 -0.823176 0.150853 +vn -0.635029 -0.765618 -0.102451 +vn -0.742576 -0.669210 0.026307 +vn -0.279122 -0.873928 0.397839 +vn -0.516190 -0.779748 0.354259 +vn -0.328806 -0.865596 0.377636 +vn -0.255867 -0.875790 0.409253 +vn -0.377026 -0.851741 0.363750 +vn -0.171789 -0.941069 0.291299 +vn -0.210425 -0.954894 0.209449 +vn -0.527177 -0.839503 0.131321 +vn -0.230140 -0.876827 0.422071 +vn -0.475448 -0.824915 0.305612 +vn -0.372997 -0.891568 0.256722 +vn -0.253029 -0.927458 0.275277 +vn -0.326029 -0.914182 0.240699 +vn -0.131932 -0.973937 0.184454 +vn -0.195074 -0.956236 0.217994 +vn -0.437025 -0.871334 0.223060 +vn -0.234504 -0.871731 0.430158 +vn -0.400067 -0.802545 0.442488 +vn -0.374920 -0.829279 0.414319 +vn -0.282296 -0.852962 0.438978 +vn -0.289376 -0.826441 0.482955 +vn -0.075808 -0.885952 0.457503 +vn -0.131413 -0.912351 0.387677 +vn -0.309336 -0.912107 0.268929 +vn -0.320200 -0.853725 0.410565 +vn -0.455214 -0.738517 0.497299 +vn -0.422712 -0.653645 0.627705 +vn -0.335032 -0.588183 0.736045 +vn -0.242012 -0.581164 0.776940 +vn 0.009308 -0.719626 0.694266 +vn 0.050447 -0.808710 0.585986 +vn -0.089877 -0.877895 0.470290 +vn -0.364666 -0.860134 0.356578 +vn -0.593188 -0.698660 0.399945 +vn -0.570452 -0.582537 0.578967 +vn -0.442824 -0.538347 0.716971 +vn -0.216407 -0.627308 0.748070 +vn 0.109867 -0.734519 0.669607 +vn 0.138066 -0.794702 0.591052 +vn 0.069430 -0.843776 0.532121 +vn -0.368236 -0.893246 0.257851 +vn -0.636525 -0.740287 0.216163 +vn -0.626820 -0.745262 0.227149 +vn -0.513871 -0.807001 0.290994 +vn -0.255928 -0.879208 0.401776 +vn 0.118809 -0.881924 0.456130 +vn 0.181738 -0.883969 0.430708 +vn 0.082797 -0.942625 0.323374 +vn -0.323099 -0.830866 0.453017 +vn -0.627918 -0.729667 0.270608 +vn -0.531205 -0.829096 0.174383 +vn -0.427992 -0.902707 0.043825 +vn -0.275033 -0.957213 0.089846 +vn 0.069124 -0.975280 0.209754 +vn 0.199957 -0.956786 0.211035 +vn 0.073672 -0.987518 0.139134 +vn -0.115787 -0.980132 -0.160894 +vn -0.137455 -0.963042 -0.231605 +vn -0.082095 -0.983032 -0.163945 +vn -0.046144 -0.974700 -0.218665 +vn -0.093234 -0.948363 -0.303079 +vn -0.164403 -0.940153 -0.298349 +vn -0.173132 -0.853420 -0.491592 +vn -0.039796 -0.537828 -0.842097 +vn -0.153752 -0.963347 -0.219672 +vn -0.147649 -0.971892 -0.183325 +vn -0.028840 -0.998962 -0.035066 +vn 0.096103 -0.977355 -0.188482 +vn 0.091586 -0.921018 -0.378521 +vn 0.016388 -0.931516 -0.363323 +vn -0.066347 -0.858547 -0.508347 +vn -0.118870 -0.596484 -0.793756 +vn -0.094089 -0.986297 -0.135350 +vn -0.006561 -0.984710 -0.173925 +vn -0.126286 -0.991272 -0.037690 +vn -0.164190 -0.979736 -0.114658 +vn -0.038087 -0.934874 -0.352886 +vn 0.008484 -0.907315 -0.420301 +vn -0.102084 -0.791375 -0.602710 +vn -0.251686 -0.508469 -0.823450 +vn -0.350810 -0.935697 0.036683 +vn -0.304941 -0.924894 -0.226966 +vn -0.415876 -0.879543 -0.231117 +vn -0.486221 -0.873348 -0.028108 +vn -0.418470 -0.878842 -0.229072 +vn -0.343608 -0.842952 -0.413892 +vn -0.370373 -0.656911 -0.656697 +vn -0.423780 -0.354228 -0.833613 +vn -0.574480 -0.804865 0.148778 +vn -0.490951 -0.852718 -0.178320 +vn -0.407300 -0.854427 -0.322520 +vn -0.488357 -0.865322 -0.112705 +vn -0.611866 -0.778466 -0.139927 +vn -0.641438 -0.687368 -0.340648 +vn -0.631245 -0.487472 -0.603198 +vn -0.536576 -0.312906 -0.783654 +vn -0.538163 -0.810785 0.230110 +vn -0.468245 -0.883053 -0.030183 +vn -0.393567 -0.858272 -0.329264 +vn -0.493027 -0.812586 -0.310739 +vn -0.669393 -0.701682 -0.243995 +vn -0.741478 -0.584338 -0.329722 +vn -0.710776 -0.452010 -0.538896 +vn -0.581225 -0.368877 -0.725272 +vn -0.604816 -0.757134 0.246803 +vn -0.657430 -0.753410 0.010590 +vn -0.659749 -0.657186 -0.364422 +vn -0.701071 -0.534623 -0.471877 +vn -0.811426 -0.458174 -0.362835 +vn -0.846370 -0.450148 -0.284555 +vn -0.792383 -0.447707 -0.414289 +vn -0.696951 -0.365001 -0.617237 +vn -0.794397 -0.579485 0.181829 +vn -0.863247 -0.501724 -0.055269 +vn -0.839625 -0.376446 -0.391522 +vn -0.806421 -0.264443 -0.528886 +vn -0.881558 -0.272713 -0.385296 +vn -0.915555 -0.328654 -0.231697 +vn -0.894925 -0.311075 -0.319803 +vn -0.840236 -0.249428 -0.481368 +vn 0.029969 0.923063 0.383404 +vn 0.079440 0.925291 0.370800 +vn 0.086703 0.983184 -0.160558 +vn 0.021302 0.984252 -0.175420 +vn 0.092318 0.923917 -0.371227 +vn -0.024079 0.919370 -0.392560 +vn 0.102237 0.796228 -0.596271 +vn -0.082186 0.792749 -0.603961 +vn 0.031983 0.577197 -0.815943 +vn -0.083499 0.557115 -0.826197 +vn -0.039338 0.537706 -0.842189 +vn -0.026521 0.538530 -0.842158 +vn -0.035401 0.404492 -0.913846 +vn 0.055544 0.426038 -0.902982 +vn -0.050905 0.236579 -0.970244 +vn 0.211737 0.270089 -0.939238 +vn -0.155614 0.333110 -0.929929 +vn 0.266884 0.227088 -0.936583 +vn 0.216346 0.885159 0.411908 +vn 0.135319 0.987548 -0.079897 +vn 0.049898 0.923612 -0.380016 +vn 0.022675 0.810572 -0.585192 +vn -0.009919 0.626057 -0.779687 +vn 0.007782 0.498764 -0.866665 +vn 0.056185 0.350597 -0.934812 +vn -0.043123 0.348949 -0.936125 +vn -0.243934 0.487106 -0.838557 +vn 0.232185 0.865841 0.443098 +vn 0.273110 0.961913 0.008850 +vn 0.212958 0.917081 -0.337016 +vn 0.137242 0.815760 -0.561846 +vn 0.094028 0.630818 -0.770196 +vn 0.088076 0.448531 -0.889401 +vn 0.048555 0.377178 -0.924833 +vn -0.044221 0.478744 -0.876797 +vn -0.134434 0.612262 -0.779107 +vn 0.374584 0.857265 0.353160 +vn 0.452101 0.891110 0.038514 +vn 0.409528 0.872860 -0.265236 +vn 0.319376 0.794031 -0.517167 +vn 0.206030 0.622272 -0.755150 +vn 0.097079 0.464400 -0.880276 +vn 0.020356 0.451369 -0.892087 +vn -0.071902 0.551988 -0.830714 +vn -0.121464 0.647877 -0.751976 +vn 0.592822 0.751213 0.290139 +vn 0.571459 0.813959 0.104343 +vn 0.507614 0.836665 -0.205603 +vn 0.427229 0.782373 -0.453108 +vn 0.297281 0.641041 -0.707572 +vn 0.193152 0.466659 -0.863063 +vn 0.157384 0.458693 -0.874508 +vn 0.123936 0.583514 -0.802545 +vn 0.042665 0.689993 -0.722526 +vn 0.601794 0.744041 0.290139 +vn 0.612201 0.773766 0.162633 +vn 0.618244 0.762627 -0.190069 +vn 0.566698 0.736503 -0.369243 +vn 0.420423 0.652791 -0.630146 +vn 0.237648 0.479598 -0.844661 +vn 0.160894 0.528733 -0.833369 +vn 0.146916 0.599353 -0.786859 +vn 0.173559 0.713157 -0.679159 +vn 0.667531 0.680319 0.302499 +vn 0.644704 0.732414 0.218787 +vn 0.593371 0.789575 -0.156346 +vn 0.533219 0.785791 -0.313334 +vn 0.428816 0.718833 -0.547105 +vn 0.218390 0.579791 -0.784936 +vn 0.109165 0.617237 -0.779138 +vn 0.060213 0.609333 -0.790582 +vn 0.095767 0.676107 -0.730522 +vn 0.767479 0.541581 0.342936 +vn 0.702536 0.632313 0.326426 +vn 0.633259 0.773339 -0.029603 +vn 0.523637 0.796350 -0.302622 +vn 0.472671 0.681326 -0.558855 +vn 0.394910 0.503555 -0.768395 +vn 0.367779 0.512375 -0.775994 +vn 0.273690 0.559984 -0.781945 +vn 0.127628 0.614795 -0.778283 +vn -0.138676 0.973968 -0.179266 +vn -0.084323 0.936552 0.340190 +vn -0.290750 0.940062 -0.178076 +vn -0.169164 0.962432 0.212226 +vn -0.395856 0.886502 -0.239448 +vn -0.227668 0.973174 -0.032716 +vn -0.359722 0.879574 -0.311258 +vn -0.312357 0.927580 -0.204840 +vn -0.176397 0.942473 -0.283822 +vn -0.210242 0.945891 -0.247078 +vn -0.263894 0.927976 -0.262978 +vn -0.258309 0.929838 -0.262001 +vn -0.540330 0.779626 -0.316538 +vn -0.525773 0.809351 -0.261696 +vn -0.685903 0.654500 -0.317972 +vn -0.696371 0.658101 -0.286172 +vn -0.201972 0.851283 -0.484207 +vn -0.257820 0.805444 -0.533616 +vn -0.348704 0.822474 -0.449324 +vn -0.347697 0.871212 -0.346507 +vn -0.153478 0.932127 -0.327921 +vn -0.286508 0.880795 -0.376934 +vn -0.563250 0.706412 -0.428571 +vn -0.602466 0.678884 -0.419599 +vn -0.280404 0.716422 -0.638813 +vn -0.148137 0.792962 -0.590960 +vn -0.149876 0.879055 -0.452498 +vn -0.279122 0.909543 -0.307871 +vn -0.219092 0.924406 -0.312113 +vn -0.340709 0.822443 -0.455489 +vn -0.557237 0.648213 -0.518876 +vn -0.532884 0.678030 -0.506211 +vn -0.167852 0.638417 -0.751152 +vn -0.004608 0.775567 -0.631214 +vn -0.018738 0.841212 -0.540330 +vn -0.182562 0.851436 -0.491592 +vn -0.260842 0.846004 -0.465011 +vn -0.402478 0.786645 -0.468184 +vn -0.558702 0.713462 -0.422803 +vn -0.577074 0.706442 -0.409711 +vn 0.025361 0.614154 -0.788751 +vn 0.055330 0.658010 -0.750938 +vn -0.009430 0.616932 -0.786920 +vn -0.070803 0.608203 -0.790582 +vn -0.164586 0.659078 -0.733818 +vn -0.290902 0.697714 -0.654622 +vn -0.461592 0.665792 -0.586169 +vn -0.550523 0.588824 -0.591723 +vn 0.212958 0.557848 -0.802118 +vn 0.081179 0.680563 -0.728141 +vn -0.078341 0.699393 -0.710410 +vn -0.063692 0.665059 -0.744041 +vn -0.053957 0.655660 -0.753105 +vn -0.156011 0.687307 -0.709372 +vn -0.410688 0.587420 -0.697317 +vn -0.521470 0.491989 -0.697134 +vn 0.377972 0.404981 -0.832514 +vn 0.151860 0.557604 -0.816065 +vn -0.067995 0.619373 -0.782098 +vn -0.091922 0.638905 -0.763756 +vn -0.037233 0.638234 -0.768914 +vn -0.068178 0.655202 -0.752342 +vn -0.391644 0.608142 -0.690451 +vn -0.584033 0.525132 -0.618946 +vn 0.408673 0.207648 -0.888730 +vn 0.216895 0.235664 -0.947295 +vn 0.032441 0.274239 -0.961089 +vn -0.023316 0.366863 -0.929960 +vn -0.012329 0.439955 -0.897916 +vn 0.002197 0.474624 -0.880154 +vn -0.261177 0.481063 -0.836848 +vn -0.543046 0.443068 -0.713248 +vn 0.057497 0.804743 0.590777 +vn 0.067934 0.754723 0.652455 +vn 0.139164 0.849147 0.509445 +vn 0.179296 0.798273 0.574969 +vn 0.191809 0.843074 0.502396 +vn 0.282022 0.786615 0.549242 +vn 0.246040 0.763878 0.596606 +vn 0.276009 0.755638 0.593951 +vn 0.263009 0.679830 0.684561 +vn 0.208350 0.705802 0.677053 +vn 0.229896 0.756890 0.611713 +vn 0.127079 0.826441 0.548448 +vn 0.127903 0.812555 0.568651 +vn 0.063601 0.859828 0.506546 +vn 0.081362 0.800989 0.593066 +vn 0.038087 0.797052 0.602649 +vn 0.068758 0.888791 0.453108 +vn 0.189764 0.856197 0.480453 +vn 0.246712 0.873867 0.418867 +vn 0.309641 0.791192 0.527299 +vn 0.321848 0.668233 0.670675 +vn 0.290811 0.687765 0.665090 +vn 0.200995 0.715354 0.669179 +vn 0.073916 0.777581 0.624409 +vn -0.002319 0.969665 0.244331 +vn 0.135777 0.879574 0.455947 +vn 0.125004 0.891568 0.435255 +vn 0.050661 0.824458 0.563646 +vn 0.085482 0.706046 0.702963 +vn 0.156560 0.694052 0.702658 +vn 0.174749 0.660909 0.729789 +vn 0.124882 0.711936 0.691031 +vn -0.209357 0.974761 0.077181 +vn -0.102451 0.897946 0.427992 +vn -0.113926 0.827143 0.550279 +vn -0.171911 0.773217 0.610370 +vn -0.110965 0.752953 0.648610 +vn -0.038087 0.717673 0.695303 +vn -0.035340 0.627033 0.778161 +vn -0.066256 0.672292 0.737297 +vn -0.206397 0.978362 0.013123 +vn -0.207801 0.876614 0.433943 +vn -0.207862 0.762871 0.612201 +vn -0.228065 0.742668 0.629566 +vn -0.257759 0.740501 0.620624 +vn -0.275216 0.663167 0.696005 +vn -0.260384 0.572680 0.777306 +vn -0.224311 0.663839 0.713401 +vn -0.309793 0.948332 0.068270 +vn -0.279000 0.846675 0.453078 +vn -0.215400 0.769616 0.601032 +vn -0.219337 0.702872 0.676626 +vn -0.340220 0.636311 0.692312 +vn -0.423841 0.582324 0.693686 +vn -0.340953 0.618183 0.708182 +vn -0.226966 0.707053 0.669729 +vn -0.525742 0.847530 0.072329 +vn -0.393597 0.841273 0.370556 +vn -0.230720 0.813959 0.533067 +vn -0.123020 0.719260 0.683737 +vn -0.153630 0.615558 0.772942 +vn -0.283608 0.647359 0.707419 +vn -0.321238 0.720817 0.614154 +vn -0.283639 0.724631 0.628010 +vn -0.637165 0.768639 -0.056642 +vn -0.501175 0.833888 0.231086 +vn -0.379772 0.783135 0.492386 +vn -0.254646 0.685171 0.682363 +vn -0.124241 0.574664 0.808893 +vn -0.176794 0.620136 0.764275 +vn -0.332957 0.711112 0.619190 +vn -0.367229 0.706046 0.605457 +vn 0.059175 0.724326 0.686880 +vn 0.200018 0.704581 0.680807 +vn 0.116733 0.770379 0.626789 +vn 0.190161 0.834407 0.517289 +vn 0.526444 0.770898 0.358470 +vn 0.608661 0.742119 0.280648 +vn 0.681051 0.677816 0.276894 +vn 0.810633 0.514054 0.280343 +vn 0.122623 0.740043 0.661245 +vn 0.081637 0.777032 0.624104 +vn 0.007965 0.884915 0.465621 +vn 0.064119 0.898556 0.434126 +vn 0.447737 0.765587 0.461928 +vn 0.595691 0.628651 0.499893 +vn 0.591723 0.610614 0.526292 +vn 0.733268 0.513504 0.445601 +vn 0.205512 0.775597 0.596789 +vn -0.114017 0.825739 0.552355 +vn -0.139073 0.913175 0.383068 +vn 0.089267 0.932951 0.348674 +vn 0.501358 0.759392 0.414624 +vn 0.687735 0.541185 0.483810 +vn 0.559404 0.612873 0.558031 +vn 0.609241 0.608264 0.508713 +vn 0.248115 0.783135 0.570177 +vn -0.175787 0.807276 0.563341 +vn -0.256081 0.820002 0.511826 +vn 0.050813 0.878628 0.474746 +vn 0.527757 0.738945 0.418775 +vn 0.780938 0.487594 0.390301 +vn 0.602252 0.656819 0.453658 +vn 0.504379 0.775811 0.379009 +vn 0.171392 0.794244 0.582904 +vn -0.173132 0.862545 0.475356 +vn -0.272164 0.832820 0.481948 +vn 0.046052 0.776452 0.628468 +vn 0.466231 0.594348 0.655232 +vn 0.736961 0.382336 0.557360 +vn 0.550310 0.632801 0.544664 +vn 0.351756 0.829127 0.434492 +vn 0.036287 0.877438 0.478286 +vn -0.213965 0.875973 0.432234 +vn -0.129460 0.819849 0.557726 +vn 0.191260 0.681936 0.705924 +vn 0.441908 0.515213 0.734306 +vn 0.650594 0.446181 0.614490 +vn 0.516434 0.650533 0.556810 +vn 0.238838 0.808496 0.537797 +vn -0.034516 0.883572 0.466964 +vn -0.152470 0.853298 0.498581 +vn -0.019532 0.799249 0.600665 +vn 0.231727 0.776269 0.586230 +vn 0.438643 0.760094 0.479385 +vn 0.577624 0.722251 0.380352 +vn 0.513443 0.795648 0.321299 +vn 0.359630 0.869869 0.337596 +vn -0.105838 0.824030 0.556505 +vn -0.058535 0.836055 0.545488 +vn 0.020508 0.823603 0.566759 +vn 0.116977 0.851619 0.510880 +vn 0.379864 0.845790 0.374523 +vn 0.511856 0.812952 0.277596 +vn 0.459944 0.857356 0.230934 +vn 0.477676 0.860073 0.179083 +vn 0.931181 -0.007202 -0.364483 +vn 0.858516 -0.004822 -0.512742 +vn 0.923338 -0.151830 -0.352641 +vn 0.956908 -0.216834 -0.193030 +vn 0.938597 -0.264718 -0.221137 +vn 0.936003 -0.312571 -0.161748 +vn 0.915799 -0.325663 -0.234931 +vn 0.915250 -0.335276 -0.223273 +vn 0.852718 -0.357707 -0.380627 +vn 0.856502 -0.278146 -0.434736 +vn 0.666066 -0.369610 -0.647847 +vn 0.695944 -0.149266 -0.702353 +vn 0.518509 -0.467330 -0.716025 +vn 0.672445 -0.134434 -0.727805 +vn 0.512986 -0.508042 -0.691885 +vn 0.593982 -0.181921 -0.783624 +vn 0.479110 -0.435591 -0.762017 +vn 0.444655 -0.160833 -0.881100 +vn 0.864986 -0.137944 -0.482406 +vn 0.909116 -0.014283 -0.416272 +vn 0.959685 -0.015961 -0.280587 +vn 0.926084 -0.133274 -0.352947 +vn 0.797754 -0.339366 -0.498367 +vn 0.603381 -0.416791 -0.679830 +vn 0.551927 -0.348735 -0.757439 +vn 0.564745 -0.350169 -0.747276 +vn 0.548418 -0.380352 -0.744652 +vn 0.901089 -0.244545 -0.358043 +vn 0.925993 -0.126041 -0.355846 +vn 0.944762 -0.075900 -0.318827 +vn 0.865108 -0.133854 -0.483322 +vn 0.752342 -0.202734 -0.626759 +vn 0.701041 -0.188299 -0.687796 +vn 0.636769 -0.128483 -0.760247 +vn 0.553514 -0.143803 -0.820307 +vn 0.598956 -0.185430 -0.778985 +vn 0.873074 -0.373333 -0.313547 +vn 0.899289 -0.352367 -0.259041 +vn 0.899106 -0.290811 -0.327128 +vn 0.824641 -0.239235 -0.512558 +vn 0.786157 -0.148076 -0.599994 +vn 0.773583 -0.061129 -0.630696 +vn 0.587603 -0.101596 -0.802698 +vn 0.514481 -0.187201 -0.836787 +vn 0.637623 -0.154881 -0.754570 +vn 0.846675 -0.425947 -0.318857 +vn 0.851009 -0.463637 -0.246529 +vn 0.824274 -0.480117 -0.299997 +vn 0.798090 -0.400922 -0.449751 +vn 0.817988 -0.275124 -0.505112 +vn 0.769219 -0.191748 -0.609516 +vn 0.525376 -0.130375 -0.840785 +vn 0.544450 -0.135411 -0.827754 +vn 0.663289 -0.162481 -0.730491 +vn 0.705924 -0.635456 -0.312784 +vn 0.731101 -0.631275 -0.258705 +vn 0.754112 -0.600360 -0.266182 +vn 0.756615 -0.544359 -0.362194 +vn 0.756157 -0.495621 -0.427229 +vn 0.630116 -0.464919 -0.621906 +vn 0.399091 -0.392224 -0.828761 +vn 0.407605 -0.368114 -0.835627 +vn 0.505753 -0.474319 -0.720542 +vn 0.407270 -0.886074 -0.221259 +vn 0.547014 -0.830103 -0.107883 +vn 0.701041 -0.699210 -0.140019 +vn 0.753502 -0.581683 -0.306314 +vn 0.720847 -0.547227 -0.425275 +vn 0.553850 -0.499344 -0.666219 +vn 0.338878 -0.451552 -0.825373 +vn 0.272866 -0.533952 -0.800256 +vn 0.317026 -0.645161 -0.695151 +vn 0.997925 -0.018555 -0.061342 +vn 0.978484 0.122684 -0.165716 +vn 0.991821 0.114719 0.055696 +vn 0.964354 0.264290 0.012177 +vn 0.971374 0.155889 0.179174 +vn 0.947600 0.276284 0.160192 +vn 0.896512 0.359416 0.258889 +vn 0.834834 0.457350 0.306284 +vn 0.794855 0.511063 0.327036 +vn 0.707755 0.567431 0.420759 +vn 0.828516 0.408582 0.382824 +vn 0.787652 0.400250 0.468337 +vn 0.817438 0.424970 0.388775 +vn 0.836818 0.362407 0.410321 +vn 0.986389 -0.063051 -0.151769 +vn 0.992492 0.010590 -0.121677 +vn 0.994964 0.079257 -0.061129 +vn 0.950682 0.310038 0.007874 +vn 0.881375 0.459853 0.108097 +vn 0.897763 0.404950 0.173162 +vn 0.843776 0.523911 0.116245 +vn 0.973724 -0.095920 -0.206427 +vn 0.979125 0.008545 -0.202948 +vn 0.964965 0.063692 -0.254463 +vn 0.946135 0.226844 -0.230964 +vn 0.910215 0.385754 -0.150548 +vn 0.884640 0.437544 -0.161077 +vn 0.761467 0.594928 -0.257241 +vn 0.866878 -0.132572 -0.480483 +vn 0.853969 0.076449 -0.514603 +vn 0.814783 0.105045 -0.570147 +vn 0.810389 0.124332 -0.572497 +vn 0.785211 0.314951 -0.533097 +vn 0.674367 0.459120 -0.578265 +vn 0.587207 0.524369 -0.616565 +vn 0.617359 -0.077944 -0.782769 +vn 0.561418 0.099643 -0.821467 +vn 0.556993 0.118595 -0.821955 +vn 0.556810 0.064211 -0.828120 +vn 0.515091 0.207343 -0.831660 +vn 0.442763 0.391736 -0.806513 +vn 0.479141 0.403668 -0.779382 +vn 0.661275 0.087863 -0.744957 +vn 0.597980 0.096438 -0.795648 +vn 0.653432 0.052980 -0.755120 +vn 0.715323 0.075289 -0.694693 +vn 0.647023 0.257942 -0.717490 +vn 0.538377 0.393323 -0.745262 +vn 0.525163 0.408002 -0.746788 +vn 0.626972 0.134190 -0.767357 +vn 0.646016 0.108798 -0.755486 +vn 0.685781 -0.062349 -0.725089 +vn 0.779931 0.009735 -0.625751 +vn 0.758263 0.347179 -0.551775 +vn 0.637501 0.499710 -0.586383 +vn 0.513565 0.490249 -0.704154 +vn 0.432569 0.068331 -0.898984 +vn 0.491226 0.067812 -0.868374 +vn 0.551469 -0.123630 -0.824946 +vn 0.596728 -0.107242 -0.795221 +vn 0.624195 0.309519 -0.717307 +vn 0.519303 0.616779 -0.591479 +vn 0.329783 0.678976 -0.655904 +vn 0.915922 0.318186 -0.244484 +vn 0.901914 0.178014 -0.393475 +vn 0.876370 0.472121 -0.095126 +vn 0.954650 0.261116 -0.142918 +vn 0.840297 0.484298 0.243538 +vn 0.906674 0.235420 0.349956 +vn 0.781762 0.304056 0.544389 +vn 0.724357 0.181677 0.665029 +vn 0.795618 0.071108 0.601581 +vn 0.706656 0.118961 0.697439 +vn 0.751610 -0.062380 0.656636 +vn 0.682638 0.005005 0.730735 +vn 0.676992 -0.135380 0.723411 +vn 0.644215 -0.076510 0.760979 +vn 0.630390 -0.155736 0.760460 +vn 0.659719 -0.076205 0.747612 +vn 0.914975 0.396588 -0.073885 +vn 0.881008 0.473037 -0.003021 +vn 0.881497 0.459181 0.109836 +vn 0.875637 0.335948 0.346873 +vn 0.832942 0.227271 0.504471 +vn 0.780663 0.170019 0.601367 +vn 0.720756 0.100284 0.685873 +vn 0.612598 0.084445 0.785852 +vn 0.908750 0.412152 0.065249 +vn 0.873592 0.485183 0.037019 +vn 0.866604 0.496078 0.053255 +vn 0.848140 0.478805 0.226661 +vn 0.756005 0.465865 0.459761 +vn 0.695669 0.478744 0.535508 +vn 0.645772 0.482040 0.592090 +vn 0.529954 0.468429 0.706870 +vn 0.782373 0.592364 0.192145 +vn 0.757561 0.649739 0.062288 +vn 0.724631 0.685018 0.074953 +vn 0.699576 0.698935 0.148381 +vn 0.676809 0.635548 0.371441 +vn 0.584429 0.602893 0.543077 +vn 0.522507 0.661122 0.538408 +vn 0.513382 0.635670 0.576464 +vn 0.689138 0.670675 0.274239 +vn 0.684866 0.723899 0.083041 +vn 0.644459 0.752525 0.135441 +vn 0.649953 0.753594 0.098025 +vn 0.674184 0.704550 0.221442 +vn 0.537370 0.625202 0.565935 +vn 0.484451 0.635060 0.601642 +vn 0.581622 0.650502 0.488388 +vn 0.839259 0.440535 0.318644 +vn 0.829157 0.529954 0.177831 +vn 0.771233 0.603809 0.201422 +vn 0.769066 0.631458 0.098697 +vn 0.710654 0.680898 0.176916 +vn 0.508652 0.660176 0.552629 +vn 0.477096 0.614124 0.628620 +vn 0.645283 0.597369 0.476119 +vn 0.903073 0.296884 0.310312 +vn 0.900845 0.301859 0.311930 +vn 0.841182 0.435347 0.320627 +vn 0.761345 0.615894 0.202368 +vn 0.589190 0.751396 0.297037 +vn 0.347728 0.767144 0.538987 +vn 0.405377 0.768364 0.495224 +vn 0.605152 0.705588 0.368664 +vn 0.902768 0.025880 -0.429304 +vn 0.876370 -0.303842 -0.373669 +vn 0.899503 -0.340129 -0.274178 +vn 0.897153 -0.390149 -0.207038 +vn 0.858272 -0.485946 -0.164800 +vn 0.724357 -0.682485 -0.097385 +vn 0.399121 -0.911985 -0.094516 +vn 0.995422 -0.059908 -0.074282 +vn 0.893674 -0.447462 0.032899 +vn 0.864009 -0.481491 0.146977 +vn 0.857845 -0.445631 0.255837 +vn 0.762749 -0.555010 0.331858 +vn 0.645131 -0.671316 0.364788 +vn 0.413556 -0.862087 0.292825 +vn 0.902310 -0.138432 0.408216 +vn 0.741478 -0.512558 0.432936 +vn 0.675771 -0.534745 0.507279 +vn 0.673574 -0.447829 0.587939 +vn 0.591113 -0.534043 0.604419 +vn 0.557939 -0.587634 0.585925 +vn 0.411786 -0.741783 0.529252 +vn 0.732139 -0.129765 0.668661 +vn 0.626484 -0.519059 0.581408 +vn 0.564684 -0.575213 0.591784 +vn 0.631428 -0.447096 0.633503 +vn 0.618885 -0.520859 0.587909 +vn 0.575060 -0.598285 0.557939 +vn 0.441816 -0.724906 0.528459 +vn 0.671224 -0.094943 0.735130 +vn 0.549699 -0.518723 0.654775 +vn 0.567339 -0.555284 0.608051 +vn 0.711905 -0.390332 0.583758 +vn 0.699393 -0.495010 0.515519 +vn 0.571459 -0.650472 0.500259 +vn 0.488693 -0.712577 0.503372 +vn 0.615223 -0.105319 0.781243 +vn 0.562548 -0.465529 0.683218 +vn 0.617969 -0.514817 0.594134 +vn 0.725639 -0.324931 0.606464 +vn 0.685903 -0.458968 0.564684 +vn 0.573656 -0.669240 0.472213 +vn 0.574419 -0.706565 0.413190 +vn 0.615558 -0.137913 0.775903 +vn 0.537553 -0.410047 0.736778 +vn 0.531327 -0.459853 0.711478 +vn 0.589312 -0.319773 0.741874 +vn 0.569018 -0.391644 0.723014 +vn 0.550310 -0.578326 0.602191 +vn 0.563494 -0.662191 0.493881 +vn 0.609302 -0.213630 0.763604 +vn 0.441786 -0.470687 0.763695 +vn 0.399518 -0.408826 0.820490 +vn 0.474105 -0.275460 0.836238 +vn 0.509598 -0.340342 0.790216 +vn 0.469741 -0.491348 0.733390 +vn 0.417341 -0.595019 0.686819 +vn -0.138737 0.082156 0.986908 +vn -0.197302 -0.137364 0.970641 +vn -0.112461 -0.098025 0.988800 +vn -0.081210 0.130711 0.988067 +vn -0.017365 -0.096652 0.995148 +vn -0.032167 0.146184 0.988708 +vn 0.060366 -0.068178 0.995819 +vn 0.074068 0.121311 0.989837 +vn 0.106021 -0.042848 0.993439 +vn 0.080294 0.081668 0.993408 +vn 0.297006 -0.119572 0.947356 +vn 0.158300 -0.019623 0.987182 +vn 0.435804 -0.261849 0.861080 +vn 0.361400 -0.128025 0.923551 +vn 0.497269 -0.301187 0.813623 +vn 0.577990 -0.108432 0.808771 +vn -0.191321 -0.236274 0.952635 +vn -0.052004 -0.338664 0.939451 +vn -0.032685 -0.385296 0.922208 +vn -0.004761 -0.340342 0.940275 +vn 0.128147 -0.341655 0.931028 +vn 0.368358 -0.413587 0.832575 +vn 0.493515 -0.488113 0.719810 +vn 0.422834 -0.525681 0.738121 +vn -0.105136 -0.430525 0.896420 +vn -0.009033 -0.449721 0.893094 +vn -0.048891 -0.417982 0.907132 +vn -0.006012 -0.458388 0.888699 +vn 0.183966 -0.548570 0.815577 +vn 0.378338 -0.600513 0.704398 +vn 0.459304 -0.557604 0.691427 +vn 0.402051 -0.453169 0.795587 +vn -0.011444 -0.378796 0.925382 +vn -0.046846 -0.412061 0.909940 +vn -0.090030 -0.363720 0.927122 +vn 0.016907 -0.326151 0.945158 +vn 0.319437 -0.380230 0.867946 +vn 0.437117 -0.469863 0.766869 +vn 0.352184 -0.406995 0.842799 +vn 0.349223 -0.265847 0.898495 +vn 0.040895 -0.299020 0.953337 +vn -0.060244 -0.308145 0.949400 +vn -0.121616 -0.300790 0.945891 +vn -0.036012 -0.251015 0.967284 +vn 0.385235 -0.192602 0.902463 +vn 0.521378 -0.218940 0.824732 +vn 0.274239 -0.283761 0.918821 +vn 0.327616 -0.316385 0.890225 +vn 0.035218 -0.410474 0.911161 +vn -0.036561 -0.429945 0.902097 +vn -0.074587 -0.507157 0.858608 +vn -0.076113 -0.566820 0.820307 +vn 0.309671 -0.511795 0.801324 +vn 0.529221 -0.338298 0.778100 +vn 0.332987 -0.354808 0.873592 +vn 0.304086 -0.457991 0.835292 +vn 0.073000 -0.595508 0.799982 +vn 0.085849 -0.706320 0.702628 +vn 0.033052 -0.793847 0.607166 +vn -0.061342 -0.811731 0.580767 +vn 0.159917 -0.794153 0.586230 +vn 0.377941 -0.676901 0.631581 +vn 0.350200 -0.578387 0.736747 +vn 0.337107 -0.567339 0.751305 +vn -0.112796 0.267617 0.956877 +vn -0.118870 0.330729 0.936186 +vn -0.220801 0.108829 0.969207 +vn -0.127842 0.164617 0.978027 +vn -0.247963 -0.004822 0.968749 +vn -0.096530 -0.059999 0.993500 +vn -0.165136 0.068819 0.983856 +vn -0.036134 -0.019715 0.999146 +vn -0.048189 0.367168 0.928892 +vn -0.032380 0.335887 0.941313 +vn -0.018281 0.692160 0.721458 +vn -0.050325 0.706839 0.705557 +vn -0.096225 0.799890 0.592364 +vn -0.003571 0.812098 0.583453 +vn -0.103885 0.148381 0.983428 +vn -0.212653 -0.002503 0.977111 +vn -0.261971 0.022858 0.964782 +vn -0.217566 0.188757 0.957610 +vn -0.127506 0.448622 0.884548 +vn -0.058321 0.684072 0.727042 +vn -0.033326 0.775689 0.630177 +vn 0.003754 0.037507 0.999268 +vn -0.109958 -0.120884 0.986541 +vn -0.191137 0.010132 0.981506 +vn -0.203589 0.260140 0.943846 +vn -0.155431 0.522324 0.838435 +vn -0.061617 0.733848 0.676473 +vn 0.001831 0.789270 0.614002 +vn 0.039277 -0.041627 0.998352 +vn 0.043550 -0.171850 0.984130 +vn 0.078799 -0.001038 0.996887 +vn 0.085421 0.324076 0.942137 +vn 0.125065 0.613056 0.780053 +vn 0.109561 0.771538 0.626637 +vn 0.077303 0.793451 0.603656 +vn 0.093020 -0.057558 0.993988 +vn 0.212287 -0.041841 0.976287 +vn 0.404431 0.055055 0.912900 +vn 0.482040 0.354076 0.801386 +vn 0.450972 0.630146 0.632069 +vn 0.398541 0.724296 0.562609 +vn 0.366314 0.762108 0.533830 +vn 0.358684 -0.045534 0.932340 +vn 0.384228 0.123112 0.914975 +vn 0.501236 0.238563 0.831721 +vn 0.604327 0.396435 0.691061 +vn 0.571551 0.590991 0.569231 +vn 0.523698 0.674947 0.519761 +vn 0.515061 0.729270 0.450362 +vn 0.577197 -0.092318 0.811335 +vn 0.507187 0.128758 0.852138 +vn 0.483108 0.400372 0.778619 +vn 0.565783 0.511734 0.646504 +vn 0.620685 0.593829 0.511917 +vn 0.604083 0.633900 0.482894 +vn 0.520554 0.724754 0.451338 +vn -0.037660 0.331248 0.942778 +vn -0.045595 0.059633 0.997162 +vn 0.236579 0.315409 0.918973 +vn 0.255562 0.038392 0.966002 +vn 0.209113 0.294290 0.932524 +vn 0.136082 -0.004517 0.990661 +vn -0.052431 0.215155 0.975158 +vn -0.180517 -0.102054 0.978240 +vn -0.332255 0.138981 0.932859 +vn -0.384350 -0.207343 0.899594 +vn -0.298837 0.212073 0.930418 +vn -0.188025 -0.216437 0.958007 +vn -0.204749 0.353954 0.912564 +vn -0.146336 -0.074404 0.986419 +vn -0.405560 0.398663 0.822504 +vn -0.378002 0.091983 0.921201 +vn -0.012757 0.149754 0.988617 +vn 0.179754 0.163488 0.970000 +vn 0.201422 0.272774 0.940733 +vn 0.016785 0.356975 0.933927 +vn -0.237983 0.313669 0.919187 +vn -0.422834 0.314554 0.849818 +vn -0.331065 0.447188 0.830866 +vn -0.288400 0.453017 0.843532 +vn 0.001892 -0.084048 0.996429 +vn 0.083285 -0.011322 0.996429 +vn 0.043825 0.165654 0.985198 +vn -0.035920 0.325724 0.944762 +vn -0.115970 0.346568 0.930815 +vn -0.465712 0.304636 0.830836 +vn -0.485946 0.321909 0.812525 +vn -0.237526 0.338298 0.910550 +vn -0.030915 -0.024812 0.999207 +vn -0.000641 0.011109 0.999908 +vn -0.068239 0.032380 0.997131 +vn -0.141392 0.091708 0.985687 +vn -0.184973 0.234596 0.954314 +vn -0.464949 0.368999 0.804743 +vn -0.469680 0.332255 0.817896 +vn -0.269997 0.300302 0.914823 +vn -0.038881 0.339640 0.939726 +vn 0.040223 0.259346 0.964934 +vn -0.031007 0.173345 0.984344 +vn -0.225806 0.166234 0.959868 +vn -0.372417 0.259468 0.891049 +vn -0.490707 0.334758 0.804437 +vn -0.394726 0.292978 0.870815 +vn -0.337260 0.278146 0.899350 +vn 0.027192 0.673299 0.738853 +vn 0.101749 0.627888 0.771599 +vn 0.006684 0.632984 0.774102 +vn -0.214362 0.611499 0.761620 +vn -0.377270 0.507950 0.774346 +vn -0.424787 0.363689 0.829005 +vn -0.345012 0.290048 0.892636 +vn -0.396527 0.384259 0.833705 +vn 0.080020 0.783502 0.616199 +vn 0.067629 0.798486 0.598163 +vn 0.046785 0.797876 0.600940 +vn -0.117038 0.758507 0.641041 +vn -0.237953 0.698294 0.675069 +vn -0.275704 0.616627 0.737388 +vn -0.306467 0.564745 0.766228 +vn -0.383404 0.615467 0.688559 +vn -0.086184 -0.211463 0.973571 +vn -0.128025 -0.200446 0.971282 +vn -0.049196 -0.301950 0.952025 +vn 0.094241 -0.291086 0.952025 +vn 0.085055 -0.359935 0.929075 +vn -0.079287 -0.508011 0.857662 +vn -0.233039 -0.600269 0.765069 +vn 0.183721 -0.283090 0.941313 +vn 0.094241 -0.247139 0.964354 +vn 0.028718 -0.237770 0.970885 +vn -0.071444 -0.314829 0.946440 +vn -0.225166 -0.490432 0.841853 +vn -0.402905 -0.627827 0.665914 +vn -0.563311 -0.635731 0.527726 +vn 0.100192 -0.363750 0.926084 +vn 0.052095 -0.338267 0.939573 +vn -0.028748 -0.300485 0.953337 +vn -0.173864 -0.486190 0.856349 +vn -0.345347 -0.606586 0.716056 +vn -0.387677 -0.693777 0.606891 +vn -0.429731 -0.798822 0.420911 +vn -0.230811 -0.405347 0.884518 +vn -0.195532 -0.373455 0.906796 +vn -0.131321 -0.305155 0.943175 +vn -0.038240 -0.530992 0.846492 +vn -0.084017 -0.728843 0.679495 +vn -0.258095 -0.760460 0.595874 +vn -0.360973 -0.866085 0.345775 +vn -0.376751 -0.383740 0.843074 +vn -0.294778 -0.271371 0.916196 +vn -0.182897 -0.229041 0.956053 +vn -0.047639 -0.404157 0.913419 +vn 0.074190 -0.750694 0.656453 +vn -0.075442 -0.875637 0.477004 +vn -0.258370 -0.940642 0.220008 +vn -0.168676 -0.310923 0.935331 +vn -0.097812 -0.141820 0.985015 +vn -0.042970 -0.162420 0.985778 +vn -0.008881 -0.324046 0.945982 +vn 0.078860 -0.690023 0.719443 +vn 0.152379 -0.898526 0.411603 +vn 0.103000 -0.963286 0.247902 +vn -0.015473 -0.253151 0.967284 +vn -0.019257 -0.119419 0.992645 +vn -0.063478 -0.199835 0.977752 +vn -0.129337 -0.445998 0.885617 +vn -0.119724 -0.734672 0.667714 +vn 0.021516 -0.909848 0.414350 +vn 0.178106 -0.942351 0.283212 +vn -0.231117 -0.177648 0.956542 +vn -0.204596 -0.213782 0.955199 +vn -0.294015 -0.382397 0.875942 +vn -0.362560 -0.645405 0.672292 +vn -0.365551 -0.812250 0.454482 +vn -0.248268 -0.917844 0.309671 +vn -0.057863 -0.979736 0.191687 +vn -0.913755 -0.373730 -0.159185 +vn -0.964263 -0.231361 -0.128849 +vn -0.971984 -0.207465 0.110202 +vn -0.914884 -0.386334 0.117008 +vn -0.990143 -0.114902 -0.080050 +vn -0.939177 -0.339732 0.049806 +vn -0.997772 0.003693 -0.066347 +vn -0.982818 -0.143681 0.115604 +vn -0.996948 0.049837 0.059816 +vn -0.986267 0.080264 0.144230 +vn -0.958892 0.028535 0.282296 +vn -0.936064 0.210211 0.282083 +vn -0.871059 -0.024232 0.490524 +vn -0.839930 0.274819 0.467910 +vn -0.636677 -0.090609 0.765770 +vn -0.667165 0.249825 0.701743 +vn -0.946898 -0.306619 -0.096500 +vn -0.946379 -0.317331 0.060244 +vn -0.949309 -0.269845 -0.161138 +vn -0.960265 -0.256478 -0.109958 +vn -0.958892 -0.277810 0.057466 +vn -0.895657 -0.322489 0.306162 +vn -0.786004 -0.363109 0.500290 +vn -0.577563 -0.342906 0.740806 +vn -0.883450 -0.464431 -0.061678 +vn -0.866848 -0.493973 0.067110 +vn -0.838221 -0.528764 -0.133244 +vn -0.844752 -0.511612 -0.156804 +vn -0.878719 -0.476333 0.030152 +vn -0.811640 -0.489608 0.318522 +vn -0.676504 -0.534227 0.506821 +vn -0.536912 -0.531510 0.655110 +vn -0.727409 -0.685110 -0.037904 +vn -0.711386 -0.699149 0.071383 +vn -0.739280 -0.664357 -0.109836 +vn -0.751274 -0.626484 -0.207404 +vn -0.740654 -0.671804 0.009156 +vn -0.645985 -0.700583 0.303049 +vn -0.487655 -0.730033 0.478744 +vn -0.426008 -0.741111 0.518876 +vn -0.505356 -0.861843 0.042451 +vn -0.537126 -0.842311 -0.044618 +vn -0.641713 -0.747734 -0.170476 +vn -0.665792 -0.719230 -0.198370 +vn -0.570452 -0.817530 0.078585 +vn -0.409986 -0.866756 0.283883 +vn -0.328379 -0.857509 0.395947 +vn -0.354686 -0.836207 0.418195 +vn -0.652791 -0.753227 0.080447 +vn -0.680776 -0.706107 -0.194678 +vn -0.653493 -0.733390 -0.187201 +vn -0.564592 -0.816645 -0.119663 +vn -0.458876 -0.875393 0.151860 +vn -0.349803 -0.868954 0.350047 +vn -0.266518 -0.888668 0.373058 +vn -0.262185 -0.905271 0.334208 +vn -0.780297 -0.624958 0.022370 +vn -0.770989 -0.599109 -0.215796 +vn -0.684957 -0.727897 -0.030824 +vn -0.500839 -0.862667 0.070345 +vn -0.360607 -0.918546 0.161840 +vn -0.235023 -0.889431 0.391919 +vn -0.091037 -0.893582 0.439558 +vn -0.080111 -0.960723 0.265633 +vn -0.918638 -0.390515 0.059450 +vn -0.918332 -0.326426 -0.223701 +vn -0.996094 -0.085910 -0.020234 +vn -0.963347 -0.032075 -0.266243 +vn -0.981109 0.179144 -0.072970 +vn -0.944731 0.167974 -0.281472 +vn -0.912503 0.402570 -0.072481 +vn -0.892880 0.368267 -0.259072 +vn -0.898251 0.424879 -0.112003 +vn -0.870754 0.437117 -0.225135 +vn -0.900845 0.391156 -0.188177 +vn -0.853816 0.454482 -0.253822 +vn -0.792810 0.579272 -0.189276 +vn -0.785485 0.538743 -0.304514 +vn -0.898984 -0.406537 0.162786 +vn -0.972228 -0.161840 0.168981 +vn -0.984985 0.140263 0.100467 +vn -0.929655 0.368145 0.012238 +vn -0.919218 0.392590 -0.029908 +vn -0.907529 0.418409 0.036287 +vn -0.753044 0.641987 0.143956 +vn -0.888333 -0.308267 0.340312 +vn -0.883053 -0.215674 0.416700 +vn -0.948485 -0.015656 0.316416 +vn -0.954527 0.261483 0.142979 +vn -0.892483 0.437056 0.111454 +vn -0.790704 0.552049 0.264534 +vn -0.603381 0.666951 0.437117 +vn -0.940001 -0.117710 0.320200 +vn -0.864589 -0.173467 0.471541 +vn -0.845302 -0.146153 0.513871 +vn -0.838893 0.179632 0.513779 +vn -0.689261 0.481826 0.541032 +vn -0.538285 0.591510 0.600238 +vn -0.405377 0.625782 0.666341 +vn -0.915128 0.077792 0.395520 +vn -0.834223 -0.021546 0.550951 +vn -0.703757 -0.044404 0.709037 +vn -0.550310 0.156957 0.820032 +vn -0.369396 0.425489 0.826106 +vn -0.269967 0.502884 0.821100 +vn -0.238807 0.512253 0.824915 +vn -0.795038 0.232795 0.560045 +vn -0.731254 0.133732 0.668844 +vn -0.616871 0.170293 0.768395 +vn -0.424024 0.300485 0.854335 +vn -0.303537 0.408032 0.860988 +vn -0.267586 0.498154 0.824732 +vn -0.238044 0.553758 0.797906 +vn -0.639363 0.354015 0.682516 +vn -0.534318 0.295938 0.791742 +vn -0.410321 0.302042 0.860439 +vn -0.327036 0.376385 0.866787 +vn -0.384136 0.364483 0.848262 +vn -0.406934 0.485611 0.773644 +vn -0.374615 0.650563 0.660604 +vn -0.758812 -0.246925 -0.602680 +vn -0.752678 -0.289590 -0.591235 +vn -0.702078 -0.244484 -0.668783 +vn -0.700674 -0.255165 -0.666280 +vn -0.776513 -0.323801 -0.540513 +vn -0.736167 -0.283242 -0.614643 +vn -0.755882 -0.405042 -0.514359 +vn -0.742882 -0.335734 -0.579119 +vn -0.684805 -0.431806 -0.586963 +vn -0.739006 -0.318308 -0.593707 +vn -0.774407 -0.426466 -0.467330 +vn -0.849971 -0.243385 -0.467208 +vn -0.856960 -0.351909 -0.376476 +vn -0.937040 -0.197028 -0.288278 +vn -0.718894 -0.209021 -0.662923 +vn -0.853450 -0.087344 -0.513749 +vn -0.794580 -0.080691 -0.601733 +vn -0.756767 -0.201025 -0.621998 +vn -0.825190 -0.325022 -0.461959 +vn -0.798273 -0.385571 -0.462630 +vn -0.692862 -0.385907 -0.609058 +vn -0.764214 -0.339000 -0.548631 +vn -0.828639 -0.223029 -0.513352 +vn -0.635731 -0.132450 -0.760430 +vn -0.851588 0.065737 -0.520035 +vn -0.855068 -0.134251 -0.500809 +vn -0.877529 -0.273659 -0.393750 +vn -0.813990 -0.269234 -0.514664 +vn -0.711051 -0.215155 -0.669362 +vn -0.716483 -0.174718 -0.675344 +vn -0.720389 0.006226 -0.693533 +vn -0.570849 0.184179 -0.800104 +vn -0.883938 0.257363 -0.390332 +vn -0.923338 0.108280 -0.368358 +vn -0.931150 0.014557 -0.364330 +vn -0.785852 -0.013794 -0.618244 +vn -0.659536 0.046419 -0.750206 +vn -0.666860 0.090396 -0.739647 +vn -0.568041 0.117405 -0.814570 +vn -0.452498 0.256996 -0.853908 +vn -0.883297 0.382092 -0.271584 +vn -0.896939 0.330027 -0.294168 +vn -0.898495 0.294046 -0.325907 +vn -0.765893 0.194220 -0.612903 +vn -0.620319 0.101382 -0.777734 +vn -0.681387 0.109287 -0.723685 +vn -0.528733 0.093326 -0.843623 +vn -0.355327 0.132328 -0.925321 +vn -0.848903 0.482925 -0.214728 +vn -0.838008 0.461989 -0.290323 +vn -0.792566 0.495712 -0.355052 +vn -0.683065 0.469619 -0.559313 +vn -0.575060 0.308603 -0.757653 +vn -0.640858 0.232856 -0.731437 +vn -0.529344 0.173803 -0.830378 +vn -0.357738 0.060762 -0.931822 +vn -0.772240 0.590136 -0.235206 +vn -0.695608 0.636219 -0.333628 +vn -0.574664 0.685293 -0.447279 +vn -0.540696 0.690878 -0.479873 +vn -0.501602 0.560961 -0.658528 +vn -0.491745 0.510941 -0.705039 +vn -0.524674 0.423902 -0.738212 +vn -0.478133 0.171789 -0.861293 +vn -0.780755 -0.171697 -0.600757 +vn -0.803613 -0.216224 -0.554430 +vn -0.801355 -0.359844 -0.477798 +vn -0.741295 -0.587573 -0.324351 +vn -0.630055 -0.772881 -0.075198 +vn -0.637471 -0.764031 0.099155 +vn -0.732871 -0.664785 0.144658 +vn -0.714438 -0.171361 -0.678365 +vn -0.695212 -0.156163 -0.701590 +vn -0.744469 -0.173894 -0.644551 +vn -0.746849 -0.394024 -0.535630 +vn -0.687246 -0.611713 -0.391736 +vn -0.657186 -0.697897 -0.284616 +vn -0.761284 -0.624195 -0.175512 +vn -0.727958 -0.201605 -0.655263 +vn -0.765679 -0.123905 -0.631153 +vn -0.770012 -0.127476 -0.625141 +vn -0.687246 -0.307047 -0.658315 +vn -0.598041 -0.477248 -0.643849 +vn -0.593707 -0.550920 -0.586474 +vn -0.741997 -0.460768 -0.486892 +vn -0.820521 -0.135960 -0.555193 +vn -0.866543 -0.076754 -0.493088 +vn -0.806848 -0.226051 -0.545732 +vn -0.712058 -0.352977 -0.606922 +vn -0.678152 -0.458083 -0.574664 +vn -0.630360 -0.510178 -0.585101 +vn -0.719230 -0.367382 -0.589648 +vn -0.866451 0.029420 -0.498337 +vn -0.936674 -0.001679 -0.350169 +vn -0.903775 -0.312204 -0.292734 +vn -0.873989 -0.383953 -0.297800 +vn -0.799341 -0.508927 -0.319376 +vn -0.721458 -0.589831 -0.362712 +vn -0.820521 -0.415998 -0.392010 +vn -0.891751 0.161321 -0.422773 +vn -0.934874 0.070162 -0.347911 +vn -0.935972 -0.245796 -0.252022 +vn -0.911985 -0.375469 -0.165105 +vn -0.797937 -0.575823 -0.177953 +vn -0.745293 -0.622700 -0.238227 +vn -0.877957 -0.418378 -0.232612 +vn -0.938414 0.160802 -0.305704 +vn -0.900815 0.027680 -0.433302 +vn -0.875912 -0.162114 -0.454360 +vn -0.895505 -0.291726 -0.336070 +vn -0.750511 -0.637623 -0.173467 +vn -0.716330 -0.666890 -0.205115 +vn -0.869686 -0.395367 -0.295450 +vn -0.866756 0.062899 -0.494675 +vn -0.811151 -0.080569 -0.579241 +vn -0.775384 -0.139225 -0.615925 +vn -0.787866 -0.191778 -0.585192 +vn -0.673208 -0.634724 -0.379315 +vn -0.654775 -0.696616 -0.293191 +vn -0.831874 -0.372509 -0.411298 +vn -0.215400 0.324412 -0.921049 +vn -0.216254 0.312052 -0.925108 +vn -0.320627 0.341685 -0.883419 +vn -0.341105 0.297983 -0.891537 +vn -0.283303 0.309061 -0.907834 +vn -0.217383 0.298929 -0.929167 +vn -0.167089 0.255562 -0.952239 +vn -0.145726 0.281899 -0.948302 +vn 0.160772 0.222633 -0.961547 +vn 0.244972 0.275307 -0.929594 +vn 0.417402 0.108951 -0.902127 +vn 0.521531 0.190832 -0.831599 +vn 0.563707 0.066103 -0.823298 +vn 0.603107 0.060488 -0.795343 +vn 0.537065 0.066744 -0.840877 +vn 0.596088 -0.067965 -0.800012 +vn -0.146458 0.159001 -0.976348 +vn -0.238227 0.287057 -0.927793 +vn -0.340098 0.325541 -0.882229 +vn -0.196661 0.285165 -0.938078 +vn 0.083895 0.252358 -0.963958 +vn 0.308908 0.182684 -0.933348 +vn 0.543748 0.082980 -0.835109 +vn 0.516892 0.031739 -0.855434 +vn 0.020661 0.002533 -0.999756 +vn -0.094241 0.175634 -0.979919 +vn -0.296915 0.281137 -0.912564 +vn -0.260994 0.342540 -0.902493 +vn 0.029969 0.339702 -0.940031 +vn 0.197180 0.276040 -0.940672 +vn 0.368603 0.087497 -0.925443 +vn 0.464827 -0.104556 -0.879177 +vn 0.104740 0.313486 -0.943785 +vn -0.061739 0.236763 -0.969573 +vn -0.245857 0.201453 -0.948119 +vn -0.255440 0.252113 -0.933348 +vn -0.040437 0.273476 -0.961028 +vn 0.099124 0.184210 -0.977844 +vn 0.163701 0.047182 -0.985351 +vn 0.374157 -0.077242 -0.924131 +vn 0.019654 0.709311 -0.704581 +vn -0.225654 0.542070 -0.809442 +vn -0.333262 0.310465 -0.890225 +vn -0.210578 0.241371 -0.947295 +vn -0.072329 0.267403 -0.960845 +vn 0.024079 0.274300 -0.961333 +vn 0.060671 0.241523 -0.968474 +vn 0.309091 0.248573 -0.917936 +vn 0.023927 0.563829 -0.825526 +vn -0.329722 0.559587 -0.760338 +vn -0.442366 0.483596 -0.755242 +vn -0.200629 0.503281 -0.840480 +vn -0.070315 0.507981 -0.858455 +vn -0.015595 0.501328 -0.865108 +vn 0.042848 0.533921 -0.844417 +vn 0.237587 0.621967 -0.746086 +vn 0.146031 0.223365 -0.963713 +vn -0.296091 0.367901 -0.881436 +vn -0.408124 0.502518 -0.762169 +vn -0.199438 0.649556 -0.733634 +vn -0.095920 0.669912 -0.736198 +vn -0.020295 0.670003 -0.742058 +vn 0.122684 0.738914 -0.662496 +vn 0.153630 0.780786 -0.605579 +vn -0.292856 0.307352 -0.905393 +vn -0.142888 0.399945 -0.905301 +vn -0.191015 0.013276 -0.981475 +vn -0.103824 0.092746 -0.990234 +vn -0.096377 -0.336833 -0.936583 +vn -0.102145 -0.306253 -0.946440 +vn -0.043916 -0.611744 -0.789819 +vn 0.002472 -0.541093 -0.840938 +vn 0.055727 -0.665059 -0.744682 +vn 0.211737 -0.526170 -0.823573 +vn 0.191900 -0.211859 -0.958251 +vn 0.262246 -0.147557 -0.953642 +vn 0.246071 -0.084414 -0.965545 +vn 0.155858 -0.143803 -0.977233 +vn -0.164678 0.230964 -0.958892 +vn -0.071352 -0.105197 -0.991882 +vn 0.040040 -0.423994 -0.904752 +vn 0.083010 -0.641255 -0.762780 +vn 0.028413 -0.705863 -0.707755 +vn 0.047334 -0.345378 -0.937254 +vn 0.192389 -0.127079 -0.973022 +vn -0.068697 0.117740 -0.990661 +vn 0.061342 -0.227729 -0.971770 +vn 0.132725 -0.487716 -0.862819 +vn 0.139042 -0.639363 -0.756188 +vn 0.093204 -0.649403 -0.754662 +vn 0.046754 -0.385144 -0.921659 +vn 0.178137 -0.332713 -0.926023 +vn 0.321421 -0.005585 -0.946898 +vn 0.359172 -0.308023 -0.880947 +vn 0.330332 -0.478591 -0.813501 +vn 0.263405 -0.629231 -0.731193 +vn 0.224708 -0.604572 -0.764153 +vn 0.274270 -0.427381 -0.861446 +vn 0.393567 -0.433729 -0.810511 +vn 0.627918 -0.090518 -0.772973 +vn 0.644246 -0.307779 -0.700125 +vn 0.609882 -0.399731 -0.684255 +vn 0.505325 -0.559618 -0.656819 +vn 0.414167 -0.536393 -0.735313 +vn 0.396924 -0.508133 -0.764336 +vn 0.475417 -0.494644 -0.727500 +vn 0.705191 -0.211768 -0.676626 +vn 0.749962 -0.299905 -0.589557 +vn 0.715445 -0.296365 -0.632679 +vn 0.576403 -0.417768 -0.702261 +vn 0.424177 -0.407727 -0.808557 +vn 0.328929 -0.548173 -0.768944 +vn 0.366802 -0.593616 -0.716269 +vn 0.631733 -0.351451 -0.690909 +vn 0.691336 -0.334666 -0.640339 +vn 0.732841 -0.207465 -0.647969 +vn 0.634724 -0.219031 -0.741020 +vn 0.473525 -0.256691 -0.842524 +vn 0.345988 -0.553026 -0.757897 +vn 0.307138 -0.665334 -0.680410 +vn 0.022706 0.482589 -0.875546 +vn -0.057222 0.361675 -0.930509 +vn 0.038026 0.487960 -0.872005 +vn 0.061983 0.375866 -0.924589 +vn -0.012055 0.395032 -0.918577 +vn 0.105594 0.381481 -0.918302 +vn -0.117161 0.272805 -0.954894 +vn -0.008881 0.326029 -0.945280 +vn -0.122318 0.173986 -0.977111 +vn -0.031312 0.230628 -0.972503 +vn -0.492935 0.061159 -0.867885 +vn -0.406720 0.173193 -0.896969 +vn -0.767724 0.001862 -0.640767 +vn -0.723716 0.071200 -0.686392 +vn 0.063936 0.097140 -0.993194 +vn 0.036897 0.123508 -0.991638 +vn -0.208350 0.068728 -0.975616 +vn -0.207862 -0.015809 -0.978027 +vn -0.181799 -0.050295 -0.982025 +vn -0.569292 -0.082583 -0.817957 +vn -0.765221 -0.118168 -0.632771 +vn 0.085696 -0.274300 -0.957793 +vn 0.066073 -0.240455 -0.968383 +vn -0.228278 -0.181402 -0.956542 +vn -0.214087 -0.106296 -0.971007 +vn -0.184759 -0.072176 -0.980102 +vn -0.606769 -0.098514 -0.788720 +vn -0.771294 -0.125553 -0.623951 +vn 0.201086 -0.366985 -0.908200 +vn 0.101840 -0.277322 -0.955351 +vn -0.105167 -0.198157 -0.974487 +vn -0.187597 -0.155217 -0.969878 +vn -0.277657 -0.250587 -0.927396 +vn -0.583789 -0.284768 -0.760308 +vn -0.757958 -0.184362 -0.625660 +vn 0.340159 -0.360973 -0.868282 +vn 0.141758 -0.283547 -0.948393 +vn -0.121891 -0.344279 -0.930906 +vn -0.288705 -0.515458 -0.806787 +vn -0.373791 -0.651051 -0.660573 +vn -0.461745 -0.683187 -0.565691 +vn -0.611347 -0.632344 -0.475784 +vn 0.338878 -0.225349 -0.913419 +vn 0.077609 -0.387249 -0.918699 +vn -0.289102 -0.511216 -0.809320 +vn -0.421216 -0.591388 -0.687582 +vn -0.459822 -0.631245 -0.624531 +vn -0.478347 -0.664632 -0.573931 +vn -0.584552 -0.690329 -0.426221 +vn 0.174261 -0.304514 -0.936399 +vn -0.061281 -0.478103 -0.876125 +vn -0.351146 -0.495956 -0.794153 +vn -0.467635 -0.461013 -0.754143 +vn -0.509507 -0.467666 -0.722251 +vn -0.545518 -0.467483 -0.695578 +vn -0.691000 -0.417005 -0.590411 +vn -0.063387 0.269509 -0.960875 +vn 0.030213 0.055300 -0.997986 +vn 0.176092 -0.168004 -0.969909 +vn 0.292825 0.317118 -0.902036 +vn 0.271126 0.695456 -0.665395 +vn 0.316080 0.472701 -0.822535 +vn 0.369854 0.105655 -0.923032 +vn 0.101749 0.198981 -0.974700 +vn 0.197028 -0.073763 -0.977599 +vn 0.277779 -0.234779 -0.931486 +vn 0.360088 0.268471 -0.893429 +vn 0.388897 0.622913 -0.678732 +vn 0.410993 0.434400 -0.801477 +vn 0.299448 0.148595 -0.942442 +vn 0.110721 0.190130 -0.975463 +vn 0.087313 -0.173864 -0.980865 +vn 0.084750 -0.273385 -0.958129 +vn 0.145054 0.222877 -0.963958 +vn 0.252205 0.606830 -0.753746 +vn 0.278634 0.511521 -0.812830 +vn 0.170812 0.285897 -0.942900 +vn -0.001129 0.261452 -0.965209 +vn -0.107242 -0.107059 -0.988433 +vn -0.198004 -0.289132 -0.936583 +vn -0.179083 0.124119 -0.975951 +vn -0.054598 0.577715 -0.814386 +vn 0.032502 0.563005 -0.825770 +vn 0.035371 0.360790 -0.931974 +vn 0.024445 0.296487 -0.954711 +vn -0.065981 0.048036 -0.996643 +vn -0.233894 -0.204901 -0.950407 +vn -0.367931 0.069308 -0.927244 +vn -0.348155 0.500137 -0.792840 +vn -0.195074 0.486831 -0.851405 +vn -0.038820 0.302774 -0.952239 +vn -0.301706 0.246529 -0.920957 +vn -0.166478 0.089724 -0.981933 +vn -0.207923 -0.024720 -0.977813 +vn -0.409162 0.198248 -0.890652 +vn -0.432752 0.404004 -0.805902 +vn -0.253487 0.265572 -0.930143 +vn -0.052278 0.203711 -0.977599 +vn -0.562304 0.049562 -0.825404 +vn -0.374798 -0.045167 -0.925993 +vn -0.367168 0.166570 -0.915098 +vn -0.410596 0.314798 -0.855739 +vn -0.374279 0.268288 -0.887631 +vn -0.279275 0.071017 -0.957549 +vn -0.247719 0.132145 -0.959746 +g Cube_Cube_Material +usemtl Material +s 1 +f 1/1/1 23/2/2 30/3/3 +f 1/1/1 30/3/3 2/4/4 +f 2/4/4 30/3/3 31/5/5 +f 2/4/4 31/5/5 3/6/6 +f 3/6/6 31/5/5 32/7/7 +f 3/6/6 32/7/7 4/8/8 +f 4/8/8 32/7/7 33/9/9 +f 4/8/8 33/9/9 5/10/10 +f 5/10/10 33/9/9 34/11/11 +f 5/10/10 34/11/11 6/12/12 +f 6/12/12 34/11/11 35/13/13 +f 6/12/12 35/13/13 7/14/14 +f 7/14/14 35/13/13 36/15/15 +f 7/14/14 36/15/15 8/16/16 +f 8/16/16 36/15/15 1357/17/17 +f 8/16/16 1357/17/17 1358/18/18 +f 23/2/2 24/19/19 37/20/20 +f 23/2/2 37/20/20 30/3/3 +f 30/3/3 37/20/20 38/21/21 +f 30/3/3 38/21/21 31/5/5 +f 31/5/5 38/21/21 39/22/22 +f 31/5/5 39/22/22 32/7/7 +f 32/7/7 39/22/22 40/23/23 +f 32/7/7 40/23/23 33/9/9 +f 33/9/9 40/23/23 41/24/24 +f 33/9/9 41/24/24 34/11/11 +f 34/11/11 41/24/24 42/25/25 +f 34/11/11 42/25/25 35/13/13 +f 35/13/13 42/25/25 43/26/26 +f 35/13/13 43/26/26 36/15/15 +f 36/15/15 43/26/26 1356/27/27 +f 36/15/15 1356/27/27 1357/17/17 +f 24/19/19 25/28/28 44/29/29 +f 24/19/19 44/29/29 37/20/20 +f 37/20/20 44/29/29 45/30/30 +f 37/20/20 45/30/30 38/21/21 +f 38/21/21 45/30/30 46/31/31 +f 38/21/21 46/31/31 39/22/22 +f 39/22/22 46/31/31 47/32/32 +f 39/22/22 47/32/32 40/23/23 +f 40/23/23 47/32/32 48/33/33 +f 40/23/23 48/33/33 41/24/24 +f 41/24/24 48/33/33 49/34/34 +f 41/24/24 49/34/34 42/25/25 +f 42/25/25 49/34/34 50/35/35 +f 42/25/25 50/35/35 43/26/26 +f 43/26/26 50/35/35 1355/36/36 +f 43/26/26 1355/36/36 1356/27/27 +f 25/28/28 26/37/37 51/38/38 +f 25/28/28 51/38/38 44/29/29 +f 44/29/29 51/38/38 52/39/39 +f 44/29/29 52/39/39 45/30/30 +f 45/30/30 52/39/39 53/40/40 +f 45/30/30 53/40/40 46/31/31 +f 46/31/31 53/40/40 54/41/41 +f 46/31/31 54/41/41 47/32/32 +f 47/32/32 54/41/41 55/42/42 +f 47/32/32 55/42/42 48/33/33 +f 48/33/33 55/42/42 56/43/43 +f 48/33/33 56/43/43 49/34/34 +f 49/34/34 56/43/43 57/44/44 +f 49/34/34 57/44/44 50/35/35 +f 50/35/35 57/44/44 1354/45/45 +f 50/35/35 1354/45/45 1355/36/36 +f 26/37/37 27/46/46 58/47/47 +f 26/37/37 58/47/47 51/38/38 +f 51/38/38 58/47/47 59/48/48 +f 51/38/38 59/48/48 52/39/39 +f 52/39/39 59/48/48 60/49/49 +f 52/39/39 60/49/49 53/40/40 +f 53/40/40 60/49/49 61/50/50 +f 53/40/40 61/50/50 54/41/41 +f 54/41/41 61/50/50 62/51/51 +f 54/41/41 62/51/51 55/42/42 +f 55/42/42 62/51/51 63/52/52 +f 55/42/42 63/52/52 56/43/43 +f 56/43/43 63/52/52 64/53/53 +f 56/43/43 64/53/53 57/44/44 +f 57/44/44 64/53/53 1353/54/54 +f 57/44/44 1353/54/54 1354/45/45 +f 27/46/46 28/55/55 65/56/56 +f 27/46/46 65/56/56 58/47/47 +f 58/47/47 65/56/56 66/57/57 +f 58/47/47 66/57/57 59/48/48 +f 59/48/48 66/57/57 67/58/58 +f 59/48/48 67/58/58 60/49/49 +f 60/49/49 67/58/58 68/59/59 +f 60/49/49 68/59/59 61/50/50 +f 61/50/50 68/59/59 69/60/60 +f 61/50/50 69/60/60 62/51/51 +f 62/51/51 69/60/60 70/61/61 +f 62/51/51 70/61/61 63/52/52 +f 63/52/52 70/61/61 71/62/62 +f 63/52/52 71/62/62 64/53/53 +f 64/53/53 71/62/62 1352/63/63 +f 64/53/53 1352/63/63 1353/54/54 +f 28/55/55 29/64/64 72/65/65 +f 28/55/55 72/65/65 65/56/56 +f 65/56/56 72/65/65 73/66/66 +f 65/56/56 73/66/66 66/57/57 +f 66/57/57 73/66/66 74/67/67 +f 66/57/57 74/67/67 67/58/58 +f 67/58/58 74/67/67 75/68/68 +f 67/58/58 75/68/68 68/59/59 +f 68/59/59 75/68/68 76/69/69 +f 68/59/59 76/69/69 69/60/60 +f 69/60/60 76/69/69 77/70/70 +f 69/60/60 77/70/70 70/61/61 +f 70/61/61 77/70/70 78/71/71 +f 70/61/61 78/71/71 71/62/62 +f 71/62/62 78/71/71 1351/72/72 +f 71/62/62 1351/72/72 1352/63/63 +f 29/64/64 1373/73/73 1372/74/74 +f 29/64/64 1372/74/74 72/65/65 +f 72/65/65 1372/74/74 1371/75/75 +f 72/65/65 1371/75/75 73/66/66 +f 73/66/66 1371/75/75 1370/76/76 +f 73/66/66 1370/76/76 74/67/67 +f 74/67/67 1370/76/76 1369/77/77 +f 74/67/67 1369/77/77 75/68/68 +f 75/68/68 1369/77/77 1368/78/78 +f 75/68/68 1368/78/78 76/69/69 +f 76/69/69 1368/78/78 1367/79/79 +f 76/69/69 1367/79/79 77/70/70 +f 77/70/70 1367/79/79 1366/80/80 +f 77/70/70 1366/80/80 78/71/71 +f 78/71/71 1366/80/80 1531/81/81 +f 78/71/71 1531/81/81 1351/72/72 +f 1/1/1 2/4/4 79/82/82 +f 1/1/1 79/82/82 9/83/83 +f 9/83/83 79/82/82 80/84/84 +f 9/83/83 80/84/84 10/85/85 +f 10/85/85 80/84/84 81/86/86 +f 10/85/85 81/86/86 11/87/87 +f 11/87/87 81/86/86 82/88/88 +f 11/87/87 82/88/88 12/89/89 +f 12/89/89 82/88/88 83/90/90 +f 12/89/89 83/90/90 13/91/91 +f 13/91/91 83/90/90 84/92/92 +f 13/91/91 84/92/92 14/93/93 +f 14/93/93 84/92/92 85/94/94 +f 14/93/93 85/94/94 15/95/95 +f 15/95/95 85/94/94 1402/96/96 +f 15/95/95 1402/96/96 1403/97/97 +f 2/4/4 3/6/6 86/98/98 +f 2/4/4 86/98/98 79/82/82 +f 79/82/82 86/98/98 87/99/99 +f 79/82/82 87/99/99 80/84/84 +f 80/84/84 87/99/99 88/100/100 +f 80/84/84 88/100/100 81/86/86 +f 81/86/86 88/100/100 89/101/101 +f 81/86/86 89/101/101 82/88/88 +f 82/88/88 89/101/101 90/102/102 +f 82/88/88 90/102/102 83/90/90 +f 83/90/90 90/102/102 91/103/103 +f 83/90/90 91/103/103 84/92/92 +f 84/92/92 91/103/103 92/104/104 +f 84/92/92 92/104/104 85/94/94 +f 85/94/94 92/104/104 1401/105/105 +f 85/94/94 1401/105/105 1402/96/96 +f 3/6/6 4/8/8 93/106/106 +f 3/6/6 93/106/106 86/98/98 +f 86/98/98 93/106/106 94/107/107 +f 86/98/98 94/107/107 87/99/99 +f 87/99/99 94/107/107 95/108/108 +f 87/99/99 95/108/108 88/100/100 +f 88/100/100 95/108/108 96/109/109 +f 88/100/100 96/109/109 89/101/101 +f 89/101/101 96/109/109 97/110/110 +f 89/101/101 97/110/110 90/102/102 +f 90/102/102 97/110/110 98/111/111 +f 90/102/102 98/111/111 91/103/103 +f 91/103/103 98/111/111 99/112/112 +f 91/103/103 99/112/112 92/104/104 +f 92/104/104 99/112/112 1400/113/113 +f 92/104/104 1400/113/113 1401/105/105 +f 4/8/8 5/10/10 100/114/114 +f 4/8/8 100/114/114 93/106/106 +f 93/106/106 100/114/114 101/115/115 +f 93/106/106 101/115/115 94/107/107 +f 94/107/107 101/115/115 102/116/116 +f 94/107/107 102/116/116 95/108/108 +f 95/108/108 102/116/116 103/117/117 +f 95/108/108 103/117/117 96/109/109 +f 96/109/109 103/117/117 104/118/118 +f 96/109/109 104/118/118 97/110/110 +f 97/110/110 104/118/118 105/119/119 +f 97/110/110 105/119/119 98/111/111 +f 98/111/111 105/119/119 106/120/120 +f 98/111/111 106/120/120 99/112/112 +f 99/112/112 106/120/120 1399/121/121 +f 99/112/112 1399/121/121 1400/113/113 +f 5/10/10 6/12/12 107/122/122 +f 5/10/10 107/122/122 100/114/114 +f 100/114/114 107/122/122 108/123/123 +f 100/114/114 108/123/123 101/115/115 +f 101/115/115 108/123/123 109/124/124 +f 101/115/115 109/124/124 102/116/116 +f 102/116/116 109/124/124 110/125/125 +f 102/116/116 110/125/125 103/117/117 +f 103/117/117 110/125/125 111/126/126 +f 103/117/117 111/126/126 104/118/118 +f 104/118/118 111/126/126 112/127/127 +f 104/118/118 112/127/127 105/119/119 +f 105/119/119 112/127/127 113/128/128 +f 105/119/119 113/128/128 106/120/120 +f 106/120/120 113/128/128 1398/129/129 +f 106/120/120 1398/129/129 1399/121/121 +f 6/12/12 7/14/14 114/130/130 +f 6/12/12 114/130/130 107/122/122 +f 107/122/122 114/130/130 115/131/131 +f 107/122/122 115/131/131 108/123/123 +f 108/123/123 115/131/131 116/132/132 +f 108/123/123 116/132/132 109/124/124 +f 109/124/124 116/132/132 117/133/133 +f 109/124/124 117/133/133 110/125/125 +f 110/125/125 117/133/133 118/134/134 +f 110/125/125 118/134/134 111/126/126 +f 111/126/126 118/134/134 119/135/135 +f 111/126/126 119/135/135 112/127/127 +f 112/127/127 119/135/135 120/136/136 +f 112/127/127 120/136/136 113/128/128 +f 113/128/128 120/136/136 1397/137/137 +f 113/128/128 1397/137/137 1398/129/129 +f 7/14/14 8/16/16 121/138/138 +f 7/14/14 121/138/138 114/130/130 +f 114/130/130 121/138/138 122/139/139 +f 114/130/130 122/139/139 115/131/131 +f 115/131/131 122/139/139 123/140/140 +f 115/131/131 123/140/140 116/132/132 +f 116/132/132 123/140/140 124/141/141 +f 116/132/132 124/141/141 117/133/133 +f 117/133/133 124/141/141 125/142/142 +f 117/133/133 125/142/142 118/134/134 +f 118/134/134 125/142/142 126/143/143 +f 118/134/134 126/143/143 119/135/135 +f 119/135/135 126/143/143 127/144/144 +f 119/135/135 127/144/144 120/136/136 +f 120/136/136 127/144/144 1396/145/145 +f 120/136/136 1396/145/145 1397/137/137 +f 8/16/16 1358/18/18 1359/146/146 +f 8/16/16 1359/146/146 121/138/138 +f 121/138/138 1359/146/146 1360/147/147 +f 121/138/138 1360/147/147 122/139/139 +f 122/139/139 1360/147/147 1361/148/148 +f 122/139/139 1361/148/148 123/140/140 +f 123/140/140 1361/148/148 1362/149/149 +f 123/140/140 1362/149/149 124/141/141 +f 124/141/141 1362/149/149 1363/150/150 +f 124/141/141 1363/150/150 125/142/142 +f 125/142/142 1363/150/150 1364/151/151 +f 125/142/142 1364/151/151 126/143/143 +f 126/143/143 1364/151/151 1365/152/152 +f 126/143/143 1365/152/152 127/144/144 +f 127/144/144 1365/152/152 1532/153/153 +f 127/144/144 1532/153/153 1396/145/145 +f 1/1/1 9/83/83 128/154/154 +f 1/1/1 128/154/154 16/155/155 +f 16/155/155 128/154/154 129/156/156 +f 16/155/155 129/156/156 17/157/157 +f 17/157/157 129/156/156 130/158/158 +f 17/157/157 130/158/158 18/159/159 +f 18/159/159 130/158/158 131/160/160 +f 18/159/159 131/160/160 19/161/161 +f 19/161/161 131/160/160 132/162/162 +f 19/161/161 132/162/162 20/163/163 +f 20/163/163 132/162/162 133/164/164 +f 20/163/163 133/164/164 21/165/165 +f 21/165/165 133/164/164 134/166/166 +f 21/165/165 134/166/166 22/167/167 +f 22/167/167 134/166/166 1432/168/168 +f 22/167/167 1432/168/168 1433/169/169 +f 9/83/83 10/85/85 135/170/170 +f 9/83/83 135/170/170 128/154/154 +f 128/154/154 135/170/170 136/171/171 +f 128/154/154 136/171/171 129/156/156 +f 129/156/156 136/171/171 137/172/172 +f 129/156/156 137/172/172 130/158/158 +f 130/158/158 137/172/172 138/173/173 +f 130/158/158 138/173/173 131/160/160 +f 131/160/160 138/173/173 139/174/174 +f 131/160/160 139/174/174 132/162/162 +f 132/162/162 139/174/174 140/175/175 +f 132/162/162 140/175/175 133/164/164 +f 133/164/164 140/175/175 141/176/176 +f 133/164/164 141/176/176 134/166/166 +f 134/166/166 141/176/176 1431/177/177 +f 134/166/166 1431/177/177 1432/168/168 +f 10/85/85 11/87/87 142/178/178 +f 10/85/85 142/178/178 135/170/170 +f 135/170/170 142/178/178 143/179/179 +f 135/170/170 143/179/179 136/171/171 +f 136/171/171 143/179/179 144/180/180 +f 136/171/171 144/180/180 137/172/172 +f 137/172/172 144/180/180 145/181/181 +f 137/172/172 145/181/181 138/173/173 +f 138/173/173 145/181/181 146/182/182 +f 138/173/173 146/182/182 139/174/174 +f 139/174/174 146/182/182 147/183/183 +f 139/174/174 147/183/183 140/175/175 +f 140/175/175 147/183/183 148/184/184 +f 140/175/175 148/184/184 141/176/176 +f 141/176/176 148/184/184 1430/185/185 +f 141/176/176 1430/185/185 1431/177/177 +f 11/87/87 12/89/89 149/186/186 +f 11/87/87 149/186/186 142/178/178 +f 142/178/178 149/186/186 150/187/187 +f 142/178/178 150/187/187 143/179/179 +f 143/179/179 150/187/187 151/188/188 +f 143/179/179 151/188/188 144/180/180 +f 144/180/180 151/188/188 152/189/189 +f 144/180/180 152/189/189 145/181/181 +f 145/181/181 152/189/189 153/190/190 +f 145/181/181 153/190/190 146/182/182 +f 146/182/182 153/190/190 154/191/191 +f 146/182/182 154/191/191 147/183/183 +f 147/183/183 154/191/191 155/192/192 +f 147/183/183 155/192/192 148/184/184 +f 148/184/184 155/192/192 1429/193/193 +f 148/184/184 1429/193/193 1430/185/185 +f 12/89/89 13/91/91 156/194/194 +f 12/89/89 156/194/194 149/186/186 +f 149/186/186 156/194/194 157/195/195 +f 149/186/186 157/195/195 150/187/187 +f 150/187/187 157/195/195 158/196/196 +f 150/187/187 158/196/196 151/188/188 +f 151/188/188 158/196/196 159/197/197 +f 151/188/188 159/197/197 152/189/189 +f 152/189/189 159/197/197 160/198/198 +f 152/189/189 160/198/198 153/190/190 +f 153/190/190 160/198/198 161/199/199 +f 153/190/190 161/199/199 154/191/191 +f 154/191/191 161/199/199 162/200/200 +f 154/191/191 162/200/200 155/192/192 +f 155/192/192 162/200/200 1428/201/201 +f 155/192/192 1428/201/201 1429/193/193 +f 13/91/91 14/93/93 163/202/202 +f 13/91/91 163/202/202 156/194/194 +f 156/194/194 163/202/202 164/203/203 +f 156/194/194 164/203/203 157/195/195 +f 157/195/195 164/203/203 165/204/204 +f 157/195/195 165/204/204 158/196/196 +f 158/196/196 165/204/204 166/205/205 +f 158/196/196 166/205/205 159/197/197 +f 159/197/197 166/205/205 167/206/206 +f 159/197/197 167/206/206 160/198/198 +f 160/198/198 167/206/206 168/207/207 +f 160/198/198 168/207/207 161/199/199 +f 161/199/199 168/207/207 169/208/208 +f 161/199/199 169/208/208 162/200/200 +f 162/200/200 169/208/208 1427/209/209 +f 162/200/200 1427/209/209 1428/201/201 +f 14/93/93 15/95/95 170/210/210 +f 14/93/93 170/210/210 163/202/202 +f 163/202/202 170/210/210 171/211/211 +f 163/202/202 171/211/211 164/203/203 +f 164/203/203 171/211/211 172/212/212 +f 164/203/203 172/212/212 165/204/204 +f 165/204/204 172/212/212 173/213/213 +f 165/204/204 173/213/213 166/205/205 +f 166/205/205 173/213/213 174/214/214 +f 166/205/205 174/214/214 167/206/206 +f 167/206/206 174/214/214 175/215/215 +f 167/206/206 175/215/215 168/207/207 +f 168/207/207 175/215/215 176/216/216 +f 168/207/207 176/216/216 169/208/208 +f 169/208/208 176/216/216 1426/217/217 +f 169/208/208 1426/217/217 1427/209/209 +f 15/95/95 1403/97/97 1404/218/218 +f 15/95/95 1404/218/218 170/210/210 +f 170/210/210 1404/218/218 1405/219/219 +f 170/210/210 1405/219/219 171/211/211 +f 171/211/211 1405/219/219 1406/220/220 +f 171/211/211 1406/220/220 172/212/212 +f 172/212/212 1406/220/220 1407/221/221 +f 172/212/212 1407/221/221 173/213/213 +f 173/213/213 1407/221/221 1408/222/222 +f 173/213/213 1408/222/222 174/214/214 +f 174/214/214 1408/222/222 1409/223/223 +f 174/214/214 1409/223/223 175/215/215 +f 175/215/215 1409/223/223 1410/224/224 +f 175/215/215 1410/224/224 176/216/216 +f 176/216/216 1410/224/224 1533/225/225 +f 176/216/216 1533/225/225 1426/217/217 +f 1/1/1 16/155/155 177/226/226 +f 1/1/1 177/226/226 23/2/2 +f 23/2/2 177/226/226 178/227/227 +f 23/2/2 178/227/227 24/19/19 +f 24/19/19 178/227/227 179/228/228 +f 24/19/19 179/228/228 25/28/28 +f 25/28/28 179/228/228 180/229/229 +f 25/28/28 180/229/229 26/37/37 +f 26/37/37 180/229/229 181/230/230 +f 26/37/37 181/230/230 27/46/46 +f 27/46/46 181/230/230 182/231/231 +f 27/46/46 182/231/231 28/55/55 +f 28/55/55 182/231/231 183/232/232 +f 28/55/55 183/232/232 29/64/64 +f 29/64/64 183/232/232 1374/233/233 +f 29/64/64 1374/233/233 1373/73/73 +f 16/155/155 17/157/157 184/234/234 +f 16/155/155 184/234/234 177/226/226 +f 177/226/226 184/234/234 185/235/235 +f 177/226/226 185/235/235 178/227/227 +f 178/227/227 185/235/235 186/236/236 +f 178/227/227 186/236/236 179/228/228 +f 179/228/228 186/236/236 187/237/237 +f 179/228/228 187/237/237 180/229/229 +f 180/229/229 187/237/237 188/238/238 +f 180/229/229 188/238/238 181/230/230 +f 181/230/230 188/238/238 189/239/239 +f 181/230/230 189/239/239 182/231/231 +f 182/231/231 189/239/239 190/240/240 +f 182/231/231 190/240/240 183/232/232 +f 183/232/232 190/240/240 1375/241/241 +f 183/232/232 1375/241/241 1374/233/233 +f 17/157/157 18/159/159 191/242/242 +f 17/157/157 191/242/242 184/234/234 +f 184/234/234 191/242/242 192/243/243 +f 184/234/234 192/243/243 185/235/235 +f 185/235/235 192/243/243 193/244/244 +f 185/235/235 193/244/244 186/236/236 +f 186/236/236 193/244/244 194/245/245 +f 186/236/236 194/245/245 187/237/237 +f 187/237/237 194/245/245 195/246/246 +f 187/237/237 195/246/246 188/238/238 +f 188/238/238 195/246/246 196/247/247 +f 188/238/238 196/247/247 189/239/239 +f 189/239/239 196/247/247 197/248/248 +f 189/239/239 197/248/248 190/240/240 +f 190/240/240 197/248/248 1376/249/249 +f 190/240/240 1376/249/249 1375/241/241 +f 18/159/159 19/161/161 198/250/250 +f 18/159/159 198/250/250 191/242/242 +f 191/242/242 198/250/250 199/251/251 +f 191/242/242 199/251/251 192/243/243 +f 192/243/243 199/251/251 200/252/252 +f 192/243/243 200/252/252 193/244/244 +f 193/244/244 200/252/252 201/253/253 +f 193/244/244 201/253/253 194/245/245 +f 194/245/245 201/253/253 202/254/254 +f 194/245/245 202/254/254 195/246/246 +f 195/246/246 202/254/254 203/255/255 +f 195/246/246 203/255/255 196/247/247 +f 196/247/247 203/255/255 204/256/256 +f 196/247/247 204/256/256 197/248/248 +f 197/248/248 204/256/256 1377/257/257 +f 197/248/248 1377/257/257 1376/249/249 +f 19/161/161 20/163/163 205/258/258 +f 19/161/161 205/258/258 198/250/250 +f 198/250/250 205/258/258 206/259/259 +f 198/250/250 206/259/259 199/251/251 +f 199/251/251 206/259/259 207/260/260 +f 199/251/251 207/260/260 200/252/252 +f 200/252/252 207/260/260 208/261/261 +f 200/252/252 208/261/261 201/253/253 +f 201/253/253 208/261/261 209/262/262 +f 201/253/253 209/262/262 202/254/254 +f 202/254/254 209/262/262 210/263/263 +f 202/254/254 210/263/263 203/255/255 +f 203/255/255 210/263/263 211/264/264 +f 203/255/255 211/264/264 204/256/256 +f 204/256/256 211/264/264 1378/265/265 +f 204/256/256 1378/265/265 1377/257/257 +f 20/163/163 21/165/165 212/266/266 +f 20/163/163 212/266/266 205/258/258 +f 205/258/258 212/266/266 213/267/267 +f 205/258/258 213/267/267 206/259/259 +f 206/259/259 213/267/267 214/268/268 +f 206/259/259 214/268/268 207/260/260 +f 207/260/260 214/268/268 215/269/269 +f 207/260/260 215/269/269 208/261/261 +f 208/261/261 215/269/269 216/270/270 +f 208/261/261 216/270/270 209/262/262 +f 209/262/262 216/270/270 217/271/271 +f 209/262/262 217/271/271 210/263/263 +f 210/263/263 217/271/271 218/272/272 +f 210/263/263 218/272/272 211/264/264 +f 211/264/264 218/272/272 1379/273/273 +f 211/264/264 1379/273/273 1378/265/265 +f 21/165/165 22/167/167 219/274/274 +f 21/165/165 219/274/274 212/266/266 +f 212/266/266 219/274/274 220/275/275 +f 212/266/266 220/275/275 213/267/267 +f 213/267/267 220/275/275 221/276/276 +f 213/267/267 221/276/276 214/268/268 +f 214/268/268 221/276/276 222/277/277 +f 214/268/268 222/277/277 215/269/269 +f 215/269/269 222/277/277 223/278/278 +f 215/269/269 223/278/278 216/270/270 +f 216/270/270 223/278/278 224/279/279 +f 216/270/270 224/279/279 217/271/271 +f 217/271/271 224/279/279 225/280/280 +f 217/271/271 225/280/280 218/272/272 +f 218/272/272 225/280/280 1380/281/281 +f 218/272/272 1380/281/281 1379/273/273 +f 22/167/167 1433/169/169 1434/282/282 +f 22/167/167 1434/282/282 219/274/274 +f 219/274/274 1434/282/282 1435/283/283 +f 219/274/274 1435/283/283 220/275/275 +f 220/275/275 1435/283/283 1436/284/284 +f 220/275/275 1436/284/284 221/276/276 +f 221/276/276 1436/284/284 1437/285/285 +f 221/276/276 1437/285/285 222/277/277 +f 222/277/277 1437/285/285 1438/286/286 +f 222/277/277 1438/286/286 223/278/278 +f 223/278/278 1438/286/286 1439/287/287 +f 223/278/278 1439/287/287 224/279/279 +f 224/279/279 1439/287/287 1440/288/288 +f 224/279/279 1440/288/288 225/280/280 +f 225/280/280 1440/288/288 1534/289/289 +f 225/280/280 1534/289/289 1380/281/281 +f 226/290/290 248/291/291 255/292/292 +f 226/290/290 255/292/292 227/293/293 +f 227/293/293 255/292/292 256/294/294 +f 227/293/293 256/294/294 228/295/295 +f 228/295/295 256/294/294 257/296/296 +f 228/295/295 257/296/296 229/297/297 +f 229/297/297 257/296/296 258/298/298 +f 229/297/297 258/298/298 230/299/299 +f 230/299/299 258/298/298 259/300/300 +f 230/299/299 259/300/300 231/301/301 +f 231/301/301 259/300/300 260/302/302 +f 231/301/301 260/302/302 232/303/303 +f 232/303/303 260/302/302 261/304/304 +f 232/303/303 261/304/304 233/305/305 +f 233/305/305 261/304/304 1492/306/306 +f 233/305/305 1492/306/306 1493/307/307 +f 248/291/291 249/308/308 262/309/309 +f 248/291/291 262/309/309 255/292/292 +f 255/292/292 262/309/309 263/310/310 +f 255/292/292 263/310/310 256/294/294 +f 256/294/294 263/310/310 264/311/311 +f 256/294/294 264/311/311 257/296/296 +f 257/296/296 264/311/311 265/312/312 +f 257/296/296 265/312/312 258/298/298 +f 258/298/298 265/312/312 266/313/313 +f 258/298/298 266/313/313 259/300/300 +f 259/300/300 266/313/313 267/314/314 +f 259/300/300 267/314/314 260/302/302 +f 260/302/302 267/314/314 268/315/315 +f 260/302/302 268/315/315 261/304/304 +f 261/304/304 268/315/315 1491/316/316 +f 261/304/304 1491/316/316 1492/306/306 +f 249/308/308 250/317/317 269/318/318 +f 249/308/308 269/318/318 262/309/309 +f 262/309/309 269/318/318 270/319/319 +f 262/309/309 270/319/319 263/310/310 +f 263/310/310 270/319/319 271/320/320 +f 263/310/310 271/320/320 264/311/311 +f 264/311/311 271/320/320 272/321/321 +f 264/311/311 272/321/321 265/312/312 +f 265/312/312 272/321/321 273/322/322 +f 265/312/312 273/322/322 266/313/313 +f 266/313/313 273/322/322 274/323/323 +f 266/313/313 274/323/323 267/314/314 +f 267/314/314 274/323/323 275/324/324 +f 267/314/314 275/324/324 268/315/315 +f 268/315/315 275/324/324 1490/325/325 +f 268/315/315 1490/325/325 1491/316/316 +f 250/317/317 251/326/326 276/327/327 +f 250/317/317 276/327/327 269/318/318 +f 269/318/318 276/327/327 277/328/328 +f 269/318/318 277/328/328 270/319/319 +f 270/319/319 277/328/328 278/329/329 +f 270/319/319 278/329/329 271/320/320 +f 271/320/320 278/329/329 279/330/330 +f 271/320/320 279/330/330 272/321/321 +f 272/321/321 279/330/330 280/331/331 +f 272/321/321 280/331/331 273/322/322 +f 273/322/322 280/331/331 281/332/332 +f 273/322/322 281/332/332 274/323/323 +f 274/323/323 281/332/332 282/333/333 +f 274/323/323 282/333/333 275/324/324 +f 275/324/324 282/333/333 1489/334/334 +f 275/324/324 1489/334/334 1490/325/325 +f 251/326/326 252/335/335 283/336/336 +f 251/326/326 283/336/336 276/327/327 +f 276/327/327 283/336/336 284/337/337 +f 276/327/327 284/337/337 277/328/328 +f 277/328/328 284/337/337 285/338/338 +f 277/328/328 285/338/338 278/329/329 +f 278/329/329 285/338/338 286/339/339 +f 278/329/329 286/339/339 279/330/330 +f 279/330/330 286/339/339 287/340/340 +f 279/330/330 287/340/340 280/331/331 +f 280/331/331 287/340/340 288/341/341 +f 280/331/331 288/341/341 281/332/332 +f 281/332/332 288/341/341 289/342/342 +f 281/332/332 289/342/342 282/333/333 +f 282/333/333 289/342/342 1488/343/343 +f 282/333/333 1488/343/343 1489/334/334 +f 252/335/335 253/344/344 290/345/345 +f 252/335/335 290/345/345 283/336/336 +f 283/336/336 290/345/345 291/346/346 +f 283/336/336 291/346/346 284/337/337 +f 284/337/337 291/346/346 292/347/347 +f 284/337/337 292/347/347 285/338/338 +f 285/338/338 292/347/347 293/348/348 +f 285/338/338 293/348/348 286/339/339 +f 286/339/339 293/348/348 294/349/349 +f 286/339/339 294/349/349 287/340/340 +f 287/340/340 294/349/349 295/350/350 +f 287/340/340 295/350/350 288/341/341 +f 288/341/341 295/350/350 296/351/351 +f 288/341/341 296/351/351 289/342/342 +f 289/342/342 296/351/351 1487/352/352 +f 289/342/342 1487/352/352 1488/343/343 +f 253/344/344 254/353/353 297/354/354 +f 253/344/344 297/354/354 290/345/345 +f 290/345/345 297/354/354 298/355/355 +f 290/345/345 298/355/355 291/346/346 +f 291/346/346 298/355/355 299/356/356 +f 291/346/346 299/356/356 292/347/347 +f 292/347/347 299/356/356 300/357/357 +f 292/347/347 300/357/357 293/348/348 +f 293/348/348 300/357/357 301/358/358 +f 293/348/348 301/358/358 294/349/349 +f 294/349/349 301/358/358 302/359/359 +f 294/349/349 302/359/359 295/350/350 +f 295/350/350 302/359/359 303/360/360 +f 295/350/350 303/360/360 296/351/351 +f 296/351/351 303/360/360 1486/361/361 +f 296/351/351 1486/361/361 1487/352/352 +f 254/353/353 1478/362/362 1477/363/363 +f 254/353/353 1477/363/363 297/354/354 +f 297/354/354 1477/363/363 1476/364/364 +f 297/354/354 1476/364/364 298/355/355 +f 298/355/355 1476/364/364 1475/365/365 +f 298/355/355 1475/365/365 299/356/356 +f 299/356/356 1475/365/365 1474/366/366 +f 299/356/356 1474/366/366 300/357/357 +f 300/357/357 1474/366/366 1473/367/367 +f 300/357/357 1473/367/367 301/358/358 +f 301/358/358 1473/367/367 1472/368/368 +f 301/358/358 1472/368/368 302/359/359 +f 302/359/359 1472/368/368 1471/369/369 +f 302/359/359 1471/369/369 303/360/360 +f 303/360/360 1471/369/369 1535/370/370 +f 303/360/360 1535/370/370 1486/361/361 +f 226/290/290 227/293/293 304/371/371 +f 226/290/290 304/371/371 234/372/372 +f 234/372/372 304/371/371 305/373/373 +f 234/372/372 305/373/373 235/374/374 +f 235/374/374 305/373/373 306/375/375 +f 235/374/374 306/375/375 236/376/376 +f 236/376/376 306/375/375 307/377/377 +f 236/376/376 307/377/377 237/378/378 +f 237/378/378 307/377/377 308/379/379 +f 237/378/378 308/379/379 238/380/380 +f 238/380/380 308/379/379 309/381/381 +f 238/380/380 309/381/381 239/382/382 +f 239/382/382 309/381/381 310/383/383 +f 239/382/382 310/383/383 240/384/384 +f 240/384/384 310/383/383 1524/385/385 +f 240/384/384 1524/385/385 1523/386/386 +f 227/293/293 228/295/295 311/387/387 +f 227/293/293 311/387/387 304/371/371 +f 304/371/371 311/387/387 312/388/388 +f 304/371/371 312/388/388 305/373/373 +f 305/373/373 312/388/388 313/389/389 +f 305/373/373 313/389/389 306/375/375 +f 306/375/375 313/389/389 314/390/390 +f 306/375/375 314/390/390 307/377/377 +f 307/377/377 314/390/390 315/391/391 +f 307/377/377 315/391/391 308/379/379 +f 308/379/379 315/391/391 316/392/392 +f 308/379/379 316/392/392 309/381/381 +f 309/381/381 316/392/392 317/393/393 +f 309/381/381 317/393/393 310/383/383 +f 310/383/383 317/393/393 1525/394/394 +f 310/383/383 1525/394/394 1524/385/385 +f 228/295/295 229/297/297 318/395/395 +f 228/295/295 318/395/395 311/387/387 +f 311/387/387 318/395/395 319/396/396 +f 311/387/387 319/396/396 312/388/388 +f 312/388/388 319/396/396 320/397/397 +f 312/388/388 320/397/397 313/389/389 +f 313/389/389 320/397/397 321/398/398 +f 313/389/389 321/398/398 314/390/390 +f 314/390/390 321/398/398 322/399/399 +f 314/390/390 322/399/399 315/391/391 +f 315/391/391 322/399/399 323/400/400 +f 315/391/391 323/400/400 316/392/392 +f 316/392/392 323/400/400 324/401/401 +f 316/392/392 324/401/401 317/393/393 +f 317/393/393 324/401/401 1526/402/402 +f 317/393/393 1526/402/402 1525/394/394 +f 229/297/297 230/299/299 325/403/403 +f 229/297/297 325/403/403 318/395/395 +f 318/395/395 325/403/403 326/404/404 +f 318/395/395 326/404/404 319/396/396 +f 319/396/396 326/404/404 327/405/405 +f 319/396/396 327/405/405 320/397/397 +f 320/397/397 327/405/405 328/406/406 +f 320/397/397 328/406/406 321/398/398 +f 321/398/398 328/406/406 329/407/407 +f 321/398/398 329/407/407 322/399/399 +f 322/399/399 329/407/407 330/408/408 +f 322/399/399 330/408/408 323/400/400 +f 323/400/400 330/408/408 331/409/409 +f 323/400/400 331/409/409 324/401/401 +f 324/401/401 331/409/409 1527/410/410 +f 324/401/401 1527/410/410 1526/402/402 +f 230/299/299 231/301/301 332/411/411 +f 230/299/299 332/411/411 325/403/403 +f 325/403/403 332/411/411 333/412/412 +f 325/403/403 333/412/412 326/404/404 +f 326/404/404 333/412/412 334/413/413 +f 326/404/404 334/413/413 327/405/405 +f 327/405/405 334/413/413 335/414/414 +f 327/405/405 335/414/414 328/406/406 +f 328/406/406 335/414/414 336/415/415 +f 328/406/406 336/415/415 329/407/407 +f 329/407/407 336/415/415 337/416/416 +f 329/407/407 337/416/416 330/408/408 +f 330/408/408 337/416/416 338/417/417 +f 330/408/408 338/417/417 331/409/409 +f 331/409/409 338/417/417 1528/418/418 +f 331/409/409 1528/418/418 1527/410/410 +f 231/301/301 232/303/303 339/419/419 +f 231/301/301 339/419/419 332/411/411 +f 332/411/411 339/419/419 340/420/420 +f 332/411/411 340/420/420 333/412/412 +f 333/412/412 340/420/420 341/421/421 +f 333/412/412 341/421/421 334/413/413 +f 334/413/413 341/421/421 342/422/422 +f 334/413/413 342/422/422 335/414/414 +f 335/414/414 342/422/422 343/423/423 +f 335/414/414 343/423/423 336/415/415 +f 336/415/415 343/423/423 344/424/424 +f 336/415/415 344/424/424 337/416/416 +f 337/416/416 344/424/424 345/425/425 +f 337/416/416 345/425/425 338/417/417 +f 338/417/417 345/425/425 1529/426/426 +f 338/417/417 1529/426/426 1528/418/418 +f 232/303/303 233/305/305 346/427/427 +f 232/303/303 346/427/427 339/419/419 +f 339/419/419 346/427/427 347/428/428 +f 339/419/419 347/428/428 340/420/420 +f 340/420/420 347/428/428 348/429/429 +f 340/420/420 348/429/429 341/421/421 +f 341/421/421 348/429/429 349/430/430 +f 341/421/421 349/430/430 342/422/422 +f 342/422/422 349/430/430 350/431/431 +f 342/422/422 350/431/431 343/423/423 +f 343/423/423 350/431/431 351/432/432 +f 343/423/423 351/432/432 344/424/424 +f 344/424/424 351/432/432 352/433/433 +f 344/424/424 352/433/433 345/425/425 +f 345/425/425 352/433/433 1530/434/434 +f 345/425/425 1530/434/434 1529/426/426 +f 233/305/305 1493/307/307 1494/435/435 +f 233/305/305 1494/435/435 346/427/427 +f 346/427/427 1494/435/435 1495/436/436 +f 346/427/427 1495/436/436 347/428/428 +f 347/428/428 1495/436/436 1496/437/437 +f 347/428/428 1496/437/437 348/429/429 +f 348/429/429 1496/437/437 1497/438/438 +f 348/429/429 1497/438/438 349/430/430 +f 349/430/430 1497/438/438 1498/439/439 +f 349/430/430 1498/439/439 350/431/431 +f 350/431/431 1498/439/439 1499/440/440 +f 350/431/431 1499/440/440 351/432/432 +f 351/432/432 1499/440/440 1500/441/441 +f 351/432/432 1500/441/441 352/433/433 +f 352/433/433 1500/441/441 1538/442/442 +f 352/433/433 1538/442/442 1530/434/434 +f 226/290/290 234/372/372 353/443/443 +f 226/290/290 353/443/443 241/444/444 +f 241/444/444 353/443/443 354/445/445 +f 241/444/444 354/445/445 242/446/446 +f 242/446/446 354/445/445 355/447/447 +f 242/446/446 355/447/447 243/448/448 +f 243/448/448 355/447/447 356/449/449 +f 243/448/448 356/449/449 244/450/450 +f 244/450/450 356/449/449 357/451/451 +f 244/450/450 357/451/451 245/452/452 +f 245/452/452 357/451/451 358/453/453 +f 245/452/452 358/453/453 246/454/454 +f 246/454/454 358/453/453 359/455/455 +f 246/454/454 359/455/455 247/456/456 +f 247/456/456 359/455/455 1509/457/457 +f 247/456/456 1509/457/457 1508/458/458 +f 234/372/372 235/374/374 360/459/459 +f 234/372/372 360/459/459 353/443/443 +f 353/443/443 360/459/459 361/460/460 +f 353/443/443 361/460/460 354/445/445 +f 354/445/445 361/460/460 362/461/461 +f 354/445/445 362/461/461 355/447/447 +f 355/447/447 362/461/461 363/462/462 +f 355/447/447 363/462/462 356/449/449 +f 356/449/449 363/462/462 364/463/463 +f 356/449/449 364/463/463 357/451/451 +f 357/451/451 364/463/463 365/464/464 +f 357/451/451 365/464/464 358/453/453 +f 358/453/453 365/464/464 366/465/465 +f 358/453/453 366/465/465 359/455/455 +f 359/455/455 366/465/465 1510/466/466 +f 359/455/455 1510/466/466 1509/457/457 +f 235/374/374 236/376/376 367/467/467 +f 235/374/374 367/467/467 360/459/459 +f 360/459/459 367/467/467 368/468/468 +f 360/459/459 368/468/468 361/460/460 +f 361/460/460 368/468/468 369/469/469 +f 361/460/460 369/469/469 362/461/461 +f 362/461/461 369/469/469 370/470/470 +f 362/461/461 370/470/470 363/462/462 +f 363/462/462 370/470/470 371/471/471 +f 363/462/462 371/471/471 364/463/463 +f 364/463/463 371/471/471 372/472/472 +f 364/463/463 372/472/472 365/464/464 +f 365/464/464 372/472/472 373/473/473 +f 365/464/464 373/473/473 366/465/465 +f 366/465/465 373/473/473 1511/474/474 +f 366/465/465 1511/474/474 1510/466/466 +f 236/376/376 237/378/378 374/475/475 +f 236/376/376 374/475/475 367/467/467 +f 367/467/467 374/475/475 375/476/476 +f 367/467/467 375/476/476 368/468/468 +f 368/468/468 375/476/476 376/477/477 +f 368/468/468 376/477/477 369/469/469 +f 369/469/469 376/477/477 377/478/478 +f 369/469/469 377/478/478 370/470/470 +f 370/470/470 377/478/478 378/479/479 +f 370/470/470 378/479/479 371/471/471 +f 371/471/471 378/479/479 379/480/480 +f 371/471/471 379/480/480 372/472/472 +f 372/472/472 379/480/480 380/481/481 +f 372/472/472 380/481/481 373/473/473 +f 373/473/473 380/481/481 1512/482/482 +f 373/473/473 1512/482/482 1511/474/474 +f 237/378/378 238/380/380 381/483/483 +f 237/378/378 381/483/483 374/475/475 +f 374/475/475 381/483/483 382/484/484 +f 374/475/475 382/484/484 375/476/476 +f 375/476/476 382/484/484 383/485/485 +f 375/476/476 383/485/485 376/477/477 +f 376/477/477 383/485/485 384/486/486 +f 376/477/477 384/486/486 377/478/478 +f 377/478/478 384/486/486 385/487/487 +f 377/478/478 385/487/487 378/479/479 +f 378/479/479 385/487/487 386/488/488 +f 378/479/479 386/488/488 379/480/480 +f 379/480/480 386/488/488 387/489/489 +f 379/480/480 387/489/489 380/481/481 +f 380/481/481 387/489/489 1513/490/490 +f 380/481/481 1513/490/490 1512/482/482 +f 238/380/380 239/382/382 388/491/491 +f 238/380/380 388/491/491 381/483/483 +f 381/483/483 388/491/491 389/492/492 +f 381/483/483 389/492/492 382/484/484 +f 382/484/484 389/492/492 390/493/493 +f 382/484/484 390/493/493 383/485/485 +f 383/485/485 390/493/493 391/494/494 +f 383/485/485 391/494/494 384/486/486 +f 384/486/486 391/494/494 392/495/495 +f 384/486/486 392/495/495 385/487/487 +f 385/487/487 392/495/495 393/496/496 +f 385/487/487 393/496/496 386/488/488 +f 386/488/488 393/496/496 394/497/497 +f 386/488/488 394/497/497 387/489/489 +f 387/489/489 394/497/497 1514/498/498 +f 387/489/489 1514/498/498 1513/490/490 +f 239/382/382 240/384/384 395/499/499 +f 239/382/382 395/499/499 388/491/491 +f 388/491/491 395/499/499 396/500/500 +f 388/491/491 396/500/500 389/492/492 +f 389/492/492 396/500/500 397/501/501 +f 389/492/492 397/501/501 390/493/493 +f 390/493/493 397/501/501 398/502/502 +f 390/493/493 398/502/502 391/494/494 +f 391/494/494 398/502/502 399/503/503 +f 391/494/494 399/503/503 392/495/495 +f 392/495/495 399/503/503 400/504/504 +f 392/495/495 400/504/504 393/496/496 +f 393/496/496 400/504/504 401/505/505 +f 393/496/496 401/505/505 394/497/497 +f 394/497/497 401/505/505 1515/506/506 +f 394/497/497 1515/506/506 1514/498/498 +f 240/384/384 1523/386/386 1522/507/507 +f 240/384/384 1522/507/507 395/499/499 +f 395/499/499 1522/507/507 1521/508/508 +f 395/499/499 1521/508/508 396/500/500 +f 396/500/500 1521/508/508 1520/509/509 +f 396/500/500 1520/509/509 397/501/501 +f 397/501/501 1520/509/509 1519/510/510 +f 397/501/501 1519/510/510 398/502/502 +f 398/502/502 1519/510/510 1518/511/511 +f 398/502/502 1518/511/511 399/503/503 +f 399/503/503 1518/511/511 1517/512/512 +f 399/503/503 1517/512/512 400/504/504 +f 400/504/504 1517/512/512 1516/513/513 +f 400/504/504 1516/513/513 401/505/505 +f 401/505/505 1516/513/513 1537/153/514 +f 401/505/505 1537/153/514 1515/506/506 +f 226/290/290 241/444/444 402/514/515 +f 226/290/290 402/514/515 248/291/291 +f 248/291/291 402/514/515 403/515/516 +f 248/291/291 403/515/516 249/308/308 +f 249/308/308 403/515/516 404/516/517 +f 249/308/308 404/516/517 250/317/317 +f 250/317/317 404/516/517 405/517/518 +f 250/317/317 405/517/518 251/326/326 +f 251/326/326 405/517/518 406/518/519 +f 251/326/326 406/518/519 252/335/335 +f 252/335/335 406/518/519 407/519/520 +f 252/335/335 407/519/520 253/344/344 +f 253/344/344 407/519/520 408/520/521 +f 253/344/344 408/520/521 254/353/353 +f 254/353/353 408/520/521 1479/521/522 +f 254/353/353 1479/521/522 1478/362/362 +f 241/444/444 242/446/446 409/522/523 +f 241/444/444 409/522/523 402/514/515 +f 402/514/515 409/522/523 410/523/524 +f 402/514/515 410/523/524 403/515/516 +f 403/515/516 410/523/524 411/524/525 +f 403/515/516 411/524/525 404/516/517 +f 404/516/517 411/524/525 412/525/526 +f 404/516/517 412/525/526 405/517/518 +f 405/517/518 412/525/526 413/526/527 +f 405/517/518 413/526/527 406/518/519 +f 406/518/519 413/526/527 414/527/528 +f 406/518/519 414/527/528 407/519/520 +f 407/519/520 414/527/528 415/528/529 +f 407/519/520 415/528/529 408/520/521 +f 408/520/521 415/528/529 1480/529/530 +f 408/520/521 1480/529/530 1479/521/522 +f 242/446/446 243/448/448 416/530/531 +f 242/446/446 416/530/531 409/522/523 +f 409/522/523 416/530/531 417/531/532 +f 409/522/523 417/531/532 410/523/524 +f 410/523/524 417/531/532 418/532/533 +f 410/523/524 418/532/533 411/524/525 +f 411/524/525 418/532/533 419/533/534 +f 411/524/525 419/533/534 412/525/526 +f 412/525/526 419/533/534 420/534/535 +f 412/525/526 420/534/535 413/526/527 +f 413/526/527 420/534/535 421/535/536 +f 413/526/527 421/535/536 414/527/528 +f 414/527/528 421/535/536 422/536/537 +f 414/527/528 422/536/537 415/528/529 +f 415/528/529 422/536/537 1481/537/538 +f 415/528/529 1481/537/538 1480/529/530 +f 243/448/448 244/450/450 423/538/539 +f 243/448/448 423/538/539 416/530/531 +f 416/530/531 423/538/539 424/539/540 +f 416/530/531 424/539/540 417/531/532 +f 417/531/532 424/539/540 425/540/541 +f 417/531/532 425/540/541 418/532/533 +f 418/532/533 425/540/541 426/541/542 +f 418/532/533 426/541/542 419/533/534 +f 419/533/534 426/541/542 427/542/543 +f 419/533/534 427/542/543 420/534/535 +f 420/534/535 427/542/543 428/543/544 +f 420/534/535 428/543/544 421/535/536 +f 421/535/536 428/543/544 429/544/545 +f 421/535/536 429/544/545 422/536/537 +f 422/536/537 429/544/545 1482/545/546 +f 422/536/537 1482/545/546 1481/537/538 +f 244/450/450 245/452/452 430/546/547 +f 244/450/450 430/546/547 423/538/539 +f 423/538/539 430/546/547 431/547/548 +f 423/538/539 431/547/548 424/539/540 +f 424/539/540 431/547/548 432/548/549 +f 424/539/540 432/548/549 425/540/541 +f 425/540/541 432/548/549 433/549/550 +f 425/540/541 433/549/550 426/541/542 +f 426/541/542 433/549/550 434/550/551 +f 426/541/542 434/550/551 427/542/543 +f 427/542/543 434/550/551 435/551/552 +f 427/542/543 435/551/552 428/543/544 +f 428/543/544 435/551/552 436/552/553 +f 428/543/544 436/552/553 429/544/545 +f 429/544/545 436/552/553 1483/553/554 +f 429/544/545 1483/553/554 1482/545/546 +f 245/452/452 246/454/454 437/554/555 +f 245/452/452 437/554/555 430/546/547 +f 430/546/547 437/554/555 438/555/556 +f 430/546/547 438/555/556 431/547/548 +f 431/547/548 438/555/556 439/556/557 +f 431/547/548 439/556/557 432/548/549 +f 432/548/549 439/556/557 440/557/558 +f 432/548/549 440/557/558 433/549/550 +f 433/549/550 440/557/558 441/558/559 +f 433/549/550 441/558/559 434/550/551 +f 434/550/551 441/558/559 442/559/560 +f 434/550/551 442/559/560 435/551/552 +f 435/551/552 442/559/560 443/560/561 +f 435/551/552 443/560/561 436/552/553 +f 436/552/553 443/560/561 1484/561/562 +f 436/552/553 1484/561/562 1483/553/554 +f 246/454/454 247/456/456 444/562/563 +f 246/454/454 444/562/563 437/554/555 +f 437/554/555 444/562/563 445/563/564 +f 437/554/555 445/563/564 438/555/556 +f 438/555/556 445/563/564 446/564/565 +f 438/555/556 446/564/565 439/556/557 +f 439/556/557 446/564/565 447/565/566 +f 439/556/557 447/565/566 440/557/558 +f 440/557/558 447/565/566 448/566/567 +f 440/557/558 448/566/567 441/558/559 +f 441/558/559 448/566/567 449/567/568 +f 441/558/559 449/567/568 442/559/560 +f 442/559/560 449/567/568 450/568/569 +f 442/559/560 450/568/569 443/560/561 +f 443/560/561 450/568/569 1485/569/570 +f 443/560/561 1485/569/570 1484/561/562 +f 247/456/456 1508/458/458 1507/570/571 +f 247/456/456 1507/570/571 444/562/563 +f 444/562/563 1507/570/571 1506/571/572 +f 444/562/563 1506/571/572 445/563/564 +f 445/563/564 1506/571/572 1505/572/573 +f 445/563/564 1505/572/573 446/564/565 +f 446/564/565 1505/572/573 1504/573/574 +f 446/564/565 1504/573/574 447/565/566 +f 447/565/566 1504/573/574 1503/574/575 +f 447/565/566 1503/574/575 448/566/567 +f 448/566/567 1503/574/575 1502/575/576 +f 448/566/567 1502/575/576 449/567/568 +f 449/567/568 1502/575/576 1501/576/577 +f 449/567/568 1501/576/577 450/568/569 +f 450/568/569 1501/576/577 1536/577/578 +f 450/568/569 1536/577/578 1485/569/570 +f 451/578/579 473/579/580 480/580/581 +f 451/578/579 480/580/581 452/581/582 +f 452/581/582 480/580/581 481/582/583 +f 452/581/582 481/582/583 453/583/584 +f 453/583/584 481/582/583 482/584/585 +f 453/583/584 482/584/585 454/585/586 +f 454/585/586 482/584/585 483/586/587 +f 454/585/586 483/586/587 455/587/588 +f 455/587/588 483/586/587 484/588/589 +f 455/587/588 484/588/589 456/589/590 +f 456/589/590 484/588/589 485/590/591 +f 456/589/590 485/590/591 457/591/592 +f 457/591/592 485/590/591 486/592/593 +f 457/591/592 486/592/593 458/593/594 +f 458/593/594 486/592/593 1387/594/595 +f 458/593/594 1387/594/595 1388/595/596 +f 473/579/580 474/596/597 487/597/598 +f 473/579/580 487/597/598 480/580/581 +f 480/580/581 487/597/598 488/598/599 +f 480/580/581 488/598/599 481/582/583 +f 481/582/583 488/598/599 489/599/600 +f 481/582/583 489/599/600 482/584/585 +f 482/584/585 489/599/600 490/600/601 +f 482/584/585 490/600/601 483/586/587 +f 483/586/587 490/600/601 491/601/602 +f 483/586/587 491/601/602 484/588/589 +f 484/588/589 491/601/602 492/602/603 +f 484/588/589 492/602/603 485/590/591 +f 485/590/591 492/602/603 493/603/604 +f 485/590/591 493/603/604 486/592/593 +f 486/592/593 493/603/604 1386/604/605 +f 486/592/593 1386/604/605 1387/594/595 +f 474/596/597 475/605/606 494/606/607 +f 474/596/597 494/606/607 487/597/598 +f 487/597/598 494/606/607 495/607/608 +f 487/597/598 495/607/608 488/598/599 +f 488/598/599 495/607/608 496/608/609 +f 488/598/599 496/608/609 489/599/600 +f 489/599/600 496/608/609 497/609/610 +f 489/599/600 497/609/610 490/600/601 +f 490/600/601 497/609/610 498/610/611 +f 490/600/601 498/610/611 491/601/602 +f 491/601/602 498/610/611 499/611/612 +f 491/601/602 499/611/612 492/602/603 +f 492/602/603 499/611/612 500/612/613 +f 492/602/603 500/612/613 493/603/604 +f 493/603/604 500/612/613 1385/613/614 +f 493/603/604 1385/613/614 1386/604/605 +f 475/605/606 476/614/615 501/615/616 +f 475/605/606 501/615/616 494/606/607 +f 494/606/607 501/615/616 502/616/617 +f 494/606/607 502/616/617 495/607/608 +f 495/607/608 502/616/617 503/617/618 +f 495/607/608 503/617/618 496/608/609 +f 496/608/609 503/617/618 504/618/619 +f 496/608/609 504/618/619 497/609/610 +f 497/609/610 504/618/619 505/619/620 +f 497/609/610 505/619/620 498/610/611 +f 498/610/611 505/619/620 506/620/621 +f 498/610/611 506/620/621 499/611/612 +f 499/611/612 506/620/621 507/621/622 +f 499/611/612 507/621/622 500/612/613 +f 500/612/613 507/621/622 1384/622/623 +f 500/612/613 1384/622/623 1385/613/614 +f 476/614/615 477/623/624 508/624/625 +f 476/614/615 508/624/625 501/615/616 +f 501/615/616 508/624/625 509/625/626 +f 501/615/616 509/625/626 502/616/617 +f 502/616/617 509/625/626 510/626/627 +f 502/616/617 510/626/627 503/617/618 +f 503/617/618 510/626/627 511/627/628 +f 503/617/618 511/627/628 504/618/619 +f 504/618/619 511/627/628 512/628/629 +f 504/618/619 512/628/629 505/619/620 +f 505/619/620 512/628/629 513/629/630 +f 505/619/620 513/629/630 506/620/621 +f 506/620/621 513/629/630 514/630/631 +f 506/620/621 514/630/631 507/621/622 +f 507/621/622 514/630/631 1383/631/632 +f 507/621/622 1383/631/632 1384/622/623 +f 477/623/624 478/632/633 515/633/634 +f 477/623/624 515/633/634 508/624/625 +f 508/624/625 515/633/634 516/634/635 +f 508/624/625 516/634/635 509/625/626 +f 509/625/626 516/634/635 517/635/636 +f 509/625/626 517/635/636 510/626/627 +f 510/626/627 517/635/636 518/636/637 +f 510/626/627 518/636/637 511/627/628 +f 511/627/628 518/636/637 519/637/638 +f 511/627/628 519/637/638 512/628/629 +f 512/628/629 519/637/638 520/638/639 +f 512/628/629 520/638/639 513/629/630 +f 513/629/630 520/638/639 521/639/640 +f 513/629/630 521/639/640 514/630/631 +f 514/630/631 521/639/640 1382/640/641 +f 514/630/631 1382/640/641 1383/631/632 +f 478/632/633 479/641/642 522/642/643 +f 478/632/633 522/642/643 515/633/634 +f 515/633/634 522/642/643 523/643/644 +f 515/633/634 523/643/644 516/634/635 +f 516/634/635 523/643/644 524/644/645 +f 516/634/635 524/644/645 517/635/636 +f 517/635/636 524/644/645 525/645/646 +f 517/635/636 525/645/646 518/636/637 +f 518/636/637 525/645/646 526/646/647 +f 518/636/637 526/646/647 519/637/638 +f 519/637/638 526/646/647 527/647/648 +f 519/637/638 527/647/648 520/638/639 +f 520/638/639 527/647/648 528/648/649 +f 520/638/639 528/648/649 521/639/640 +f 521/639/640 528/648/649 1381/649/650 +f 521/639/640 1381/649/650 1382/640/641 +f 479/641/642 1358/650/18 1357/651/17 +f 479/641/642 1357/651/17 522/642/643 +f 522/642/643 1357/651/17 1356/652/27 +f 522/642/643 1356/652/27 523/643/644 +f 523/643/644 1356/652/27 1355/653/36 +f 523/643/644 1355/653/36 524/644/645 +f 524/644/645 1355/653/36 1354/654/45 +f 524/644/645 1354/654/45 525/645/646 +f 525/645/646 1354/654/45 1353/655/54 +f 525/645/646 1353/655/54 526/646/647 +f 526/646/647 1353/655/54 1352/656/63 +f 526/646/647 1352/656/63 527/647/648 +f 527/647/648 1352/656/63 1351/657/72 +f 527/647/648 1351/657/72 528/648/649 +f 528/648/649 1351/657/72 1531/658/81 +f 528/648/649 1531/658/81 1381/649/650 +f 451/578/579 452/581/582 529/659/651 +f 451/578/579 529/659/651 459/660/652 +f 459/660/652 529/659/651 530/661/653 +f 459/660/652 530/661/653 460/662/654 +f 460/662/654 530/661/653 531/663/655 +f 460/662/654 531/663/655 461/664/656 +f 461/664/656 531/663/655 532/665/657 +f 461/664/656 532/665/657 462/666/658 +f 462/666/658 532/665/657 533/667/659 +f 462/666/658 533/667/659 463/668/660 +f 463/668/660 533/667/659 534/669/661 +f 463/668/660 534/669/661 464/670/662 +f 464/670/662 534/669/661 535/671/663 +f 464/670/662 535/671/663 465/672/664 +f 465/672/664 535/671/663 1477/673/363 +f 465/672/664 1477/673/363 1478/674/362 +f 452/581/582 453/583/584 536/675/665 +f 452/581/582 536/675/665 529/659/651 +f 529/659/651 536/675/665 537/676/666 +f 529/659/651 537/676/666 530/661/653 +f 530/661/653 537/676/666 538/677/667 +f 530/661/653 538/677/667 531/663/655 +f 531/663/655 538/677/667 539/678/668 +f 531/663/655 539/678/668 532/665/657 +f 532/665/657 539/678/668 540/679/669 +f 532/665/657 540/679/669 533/667/659 +f 533/667/659 540/679/669 541/680/670 +f 533/667/659 541/680/670 534/669/661 +f 534/669/661 541/680/670 542/681/671 +f 534/669/661 542/681/671 535/671/663 +f 535/671/663 542/681/671 1476/682/364 +f 535/671/663 1476/682/364 1477/673/363 +f 453/583/584 454/585/586 543/683/672 +f 453/583/584 543/683/672 536/675/665 +f 536/675/665 543/683/672 544/684/673 +f 536/675/665 544/684/673 537/676/666 +f 537/676/666 544/684/673 545/685/674 +f 537/676/666 545/685/674 538/677/667 +f 538/677/667 545/685/674 546/686/675 +f 538/677/667 546/686/675 539/678/668 +f 539/678/668 546/686/675 547/687/676 +f 539/678/668 547/687/676 540/679/669 +f 540/679/669 547/687/676 548/688/677 +f 540/679/669 548/688/677 541/680/670 +f 541/680/670 548/688/677 549/689/678 +f 541/680/670 549/689/678 542/681/671 +f 542/681/671 549/689/678 1475/690/365 +f 542/681/671 1475/690/365 1476/682/364 +f 454/585/586 455/587/588 550/691/679 +f 454/585/586 550/691/679 543/683/672 +f 543/683/672 550/691/679 551/692/680 +f 543/683/672 551/692/680 544/684/673 +f 544/684/673 551/692/680 552/693/681 +f 544/684/673 552/693/681 545/685/674 +f 545/685/674 552/693/681 553/694/682 +f 545/685/674 553/694/682 546/686/675 +f 546/686/675 553/694/682 554/695/683 +f 546/686/675 554/695/683 547/687/676 +f 547/687/676 554/695/683 555/696/684 +f 547/687/676 555/696/684 548/688/677 +f 548/688/677 555/696/684 556/697/685 +f 548/688/677 556/697/685 549/689/678 +f 549/689/678 556/697/685 1474/698/366 +f 549/689/678 1474/698/366 1475/690/365 +f 455/587/588 456/589/590 557/699/686 +f 455/587/588 557/699/686 550/691/679 +f 550/691/679 557/699/686 558/700/687 +f 550/691/679 558/700/687 551/692/680 +f 551/692/680 558/700/687 559/701/688 +f 551/692/680 559/701/688 552/693/681 +f 552/693/681 559/701/688 560/702/689 +f 552/693/681 560/702/689 553/694/682 +f 553/694/682 560/702/689 561/703/690 +f 553/694/682 561/703/690 554/695/683 +f 554/695/683 561/703/690 562/704/691 +f 554/695/683 562/704/691 555/696/684 +f 555/696/684 562/704/691 563/705/692 +f 555/696/684 563/705/692 556/697/685 +f 556/697/685 563/705/692 1473/706/367 +f 556/697/685 1473/706/367 1474/698/366 +f 456/589/590 457/591/592 564/707/693 +f 456/589/590 564/707/693 557/699/686 +f 557/699/686 564/707/693 565/708/694 +f 557/699/686 565/708/694 558/700/687 +f 558/700/687 565/708/694 566/709/695 +f 558/700/687 566/709/695 559/701/688 +f 559/701/688 566/709/695 567/710/696 +f 559/701/688 567/710/696 560/702/689 +f 560/702/689 567/710/696 568/711/697 +f 560/702/689 568/711/697 561/703/690 +f 561/703/690 568/711/697 569/712/698 +f 561/703/690 569/712/698 562/704/691 +f 562/704/691 569/712/698 570/713/699 +f 562/704/691 570/713/699 563/705/692 +f 563/705/692 570/713/699 1472/714/368 +f 563/705/692 1472/714/368 1473/706/367 +f 457/591/592 458/593/594 571/715/700 +f 457/591/592 571/715/700 564/707/693 +f 564/707/693 571/715/700 572/716/701 +f 564/707/693 572/716/701 565/708/694 +f 565/708/694 572/716/701 573/717/702 +f 565/708/694 573/717/702 566/709/695 +f 566/709/695 573/717/702 574/718/703 +f 566/709/695 574/718/703 567/710/696 +f 567/710/696 574/718/703 575/719/704 +f 567/710/696 575/719/704 568/711/697 +f 568/711/697 575/719/704 576/720/705 +f 568/711/697 576/720/705 569/712/698 +f 569/712/698 576/720/705 577/721/706 +f 569/712/698 577/721/706 570/713/699 +f 570/713/699 577/721/706 1471/722/369 +f 570/713/699 1471/722/369 1472/714/368 +f 458/593/594 1388/595/596 1389/723/707 +f 458/593/594 1389/723/707 571/715/700 +f 571/715/700 1389/723/707 1390/724/708 +f 571/715/700 1390/724/708 572/716/701 +f 572/716/701 1390/724/708 1391/725/709 +f 572/716/701 1391/725/709 573/717/702 +f 573/717/702 1391/725/709 1392/726/710 +f 573/717/702 1392/726/710 574/718/703 +f 574/718/703 1392/726/710 1393/727/711 +f 574/718/703 1393/727/711 575/719/704 +f 575/719/704 1393/727/711 1394/728/712 +f 575/719/704 1394/728/712 576/720/705 +f 576/720/705 1394/728/712 1395/729/713 +f 576/720/705 1395/729/713 577/721/706 +f 577/721/706 1395/729/713 1535/730/370 +f 577/721/706 1535/730/370 1471/722/369 +f 451/578/579 459/660/652 578/731/714 +f 451/578/579 578/731/714 466/732/715 +f 466/732/715 578/731/714 579/733/716 +f 466/732/715 579/733/716 467/734/717 +f 467/734/717 579/733/716 580/735/718 +f 467/734/717 580/735/718 468/736/719 +f 468/736/719 580/735/718 581/737/720 +f 468/736/719 581/737/720 469/738/721 +f 469/738/721 581/737/720 582/739/722 +f 469/738/721 582/739/722 470/740/723 +f 470/740/723 582/739/722 583/741/724 +f 470/740/723 583/741/724 471/742/725 +f 471/742/725 583/741/724 584/743/726 +f 471/742/725 584/743/726 472/744/727 +f 472/744/727 584/743/726 1419/745/728 +f 472/744/727 1419/745/728 1418/746/729 +f 459/660/652 460/662/654 585/747/730 +f 459/660/652 585/747/730 578/731/714 +f 578/731/714 585/747/730 586/748/731 +f 578/731/714 586/748/731 579/733/716 +f 579/733/716 586/748/731 587/749/732 +f 579/733/716 587/749/732 580/735/718 +f 580/735/718 587/749/732 588/750/733 +f 580/735/718 588/750/733 581/737/720 +f 581/737/720 588/750/733 589/751/734 +f 581/737/720 589/751/734 582/739/722 +f 582/739/722 589/751/734 590/752/735 +f 582/739/722 590/752/735 583/741/724 +f 583/741/724 590/752/735 591/753/736 +f 583/741/724 591/753/736 584/743/726 +f 584/743/726 591/753/736 1420/754/737 +f 584/743/726 1420/754/737 1419/745/728 +f 460/662/654 461/664/656 592/755/738 +f 460/662/654 592/755/738 585/747/730 +f 585/747/730 592/755/738 593/756/739 +f 585/747/730 593/756/739 586/748/731 +f 586/748/731 593/756/739 594/757/740 +f 586/748/731 594/757/740 587/749/732 +f 587/749/732 594/757/740 595/758/741 +f 587/749/732 595/758/741 588/750/733 +f 588/750/733 595/758/741 596/759/742 +f 588/750/733 596/759/742 589/751/734 +f 589/751/734 596/759/742 597/760/743 +f 589/751/734 597/760/743 590/752/735 +f 590/752/735 597/760/743 598/761/744 +f 590/752/735 598/761/744 591/753/736 +f 591/753/736 598/761/744 1421/762/745 +f 591/753/736 1421/762/745 1420/754/737 +f 461/664/656 462/666/658 599/763/746 +f 461/664/656 599/763/746 592/755/738 +f 592/755/738 599/763/746 600/764/747 +f 592/755/738 600/764/747 593/756/739 +f 593/756/739 600/764/747 601/765/748 +f 593/756/739 601/765/748 594/757/740 +f 594/757/740 601/765/748 602/766/749 +f 594/757/740 602/766/749 595/758/741 +f 595/758/741 602/766/749 603/767/750 +f 595/758/741 603/767/750 596/759/742 +f 596/759/742 603/767/750 604/768/751 +f 596/759/742 604/768/751 597/760/743 +f 597/760/743 604/768/751 605/769/752 +f 597/760/743 605/769/752 598/761/744 +f 598/761/744 605/769/752 1422/770/753 +f 598/761/744 1422/770/753 1421/762/745 +f 462/666/658 463/668/660 606/771/754 +f 462/666/658 606/771/754 599/763/746 +f 599/763/746 606/771/754 607/772/755 +f 599/763/746 607/772/755 600/764/747 +f 600/764/747 607/772/755 608/773/756 +f 600/764/747 608/773/756 601/765/748 +f 601/765/748 608/773/756 609/774/757 +f 601/765/748 609/774/757 602/766/749 +f 602/766/749 609/774/757 610/775/758 +f 602/766/749 610/775/758 603/767/750 +f 603/767/750 610/775/758 611/776/759 +f 603/767/750 611/776/759 604/768/751 +f 604/768/751 611/776/759 612/777/760 +f 604/768/751 612/777/760 605/769/752 +f 605/769/752 612/777/760 1423/778/761 +f 605/769/752 1423/778/761 1422/770/753 +f 463/668/660 464/670/662 613/779/762 +f 463/668/660 613/779/762 606/771/754 +f 606/771/754 613/779/762 614/780/763 +f 606/771/754 614/780/763 607/772/755 +f 607/772/755 614/780/763 615/781/764 +f 607/772/755 615/781/764 608/773/756 +f 608/773/756 615/781/764 616/782/765 +f 608/773/756 616/782/765 609/774/757 +f 609/774/757 616/782/765 617/783/766 +f 609/774/757 617/783/766 610/775/758 +f 610/775/758 617/783/766 618/784/767 +f 610/775/758 618/784/767 611/776/759 +f 611/776/759 618/784/767 619/785/768 +f 611/776/759 619/785/768 612/777/760 +f 612/777/760 619/785/768 1424/786/769 +f 612/777/760 1424/786/769 1423/778/761 +f 464/670/662 465/672/664 620/787/770 +f 464/670/662 620/787/770 613/779/762 +f 613/779/762 620/787/770 621/788/771 +f 613/779/762 621/788/771 614/780/763 +f 614/780/763 621/788/771 622/789/772 +f 614/780/763 622/789/772 615/781/764 +f 615/781/764 622/789/772 623/790/773 +f 615/781/764 623/790/773 616/782/765 +f 616/782/765 623/790/773 624/791/774 +f 616/782/765 624/791/774 617/783/766 +f 617/783/766 624/791/774 625/792/775 +f 617/783/766 625/792/775 618/784/767 +f 618/784/767 625/792/775 626/793/776 +f 618/784/767 626/793/776 619/785/768 +f 619/785/768 626/793/776 1425/794/777 +f 619/785/768 1425/794/777 1424/786/769 +f 465/672/664 1478/674/362 1479/795/522 +f 465/672/664 1479/795/522 620/787/770 +f 620/787/770 1479/795/522 1480/796/530 +f 620/787/770 1480/796/530 621/788/771 +f 621/788/771 1480/796/530 1481/797/538 +f 621/788/771 1481/797/538 622/789/772 +f 622/789/772 1481/797/538 1482/798/546 +f 622/789/772 1482/798/546 623/790/773 +f 623/790/773 1482/798/546 1483/799/554 +f 623/790/773 1483/799/554 624/791/774 +f 624/791/774 1483/799/554 1484/800/562 +f 624/791/774 1484/800/562 625/792/775 +f 625/792/775 1484/800/562 1485/801/570 +f 625/792/775 1485/801/570 626/793/776 +f 626/793/776 1485/801/570 1536/577/578 +f 626/793/776 1536/577/578 1425/794/777 +f 451/578/579 466/732/715 627/802/778 +f 451/578/579 627/802/778 473/579/580 +f 473/579/580 627/802/778 628/803/779 +f 473/579/580 628/803/779 474/596/597 +f 474/596/597 628/803/779 629/804/780 +f 474/596/597 629/804/780 475/605/606 +f 475/605/606 629/804/780 630/805/781 +f 475/605/606 630/805/781 476/614/615 +f 476/614/615 630/805/781 631/806/782 +f 476/614/615 631/806/782 477/623/624 +f 477/623/624 631/806/782 632/807/783 +f 477/623/624 632/807/783 478/632/633 +f 478/632/633 632/807/783 633/808/784 +f 478/632/633 633/808/784 479/641/642 +f 479/641/642 633/808/784 1359/809/146 +f 479/641/642 1359/809/146 1358/650/18 +f 466/732/715 467/734/717 634/810/785 +f 466/732/715 634/810/785 627/802/778 +f 627/802/778 634/810/785 635/811/786 +f 627/802/778 635/811/786 628/803/779 +f 628/803/779 635/811/786 636/812/787 +f 628/803/779 636/812/787 629/804/780 +f 629/804/780 636/812/787 637/813/788 +f 629/804/780 637/813/788 630/805/781 +f 630/805/781 637/813/788 638/814/789 +f 630/805/781 638/814/789 631/806/782 +f 631/806/782 638/814/789 639/815/790 +f 631/806/782 639/815/790 632/807/783 +f 632/807/783 639/815/790 640/816/791 +f 632/807/783 640/816/791 633/808/784 +f 633/808/784 640/816/791 1360/817/147 +f 633/808/784 1360/817/147 1359/809/146 +f 467/734/717 468/736/719 641/818/792 +f 467/734/717 641/818/792 634/810/785 +f 634/810/785 641/818/792 642/819/793 +f 634/810/785 642/819/793 635/811/786 +f 635/811/786 642/819/793 643/820/794 +f 635/811/786 643/820/794 636/812/787 +f 636/812/787 643/820/794 644/821/795 +f 636/812/787 644/821/795 637/813/788 +f 637/813/788 644/821/795 645/822/796 +f 637/813/788 645/822/796 638/814/789 +f 638/814/789 645/822/796 646/823/797 +f 638/814/789 646/823/797 639/815/790 +f 639/815/790 646/823/797 647/824/798 +f 639/815/790 647/824/798 640/816/791 +f 640/816/791 647/824/798 1361/825/148 +f 640/816/791 1361/825/148 1360/817/147 +f 468/736/719 469/738/721 648/826/799 +f 468/736/719 648/826/799 641/818/792 +f 641/818/792 648/826/799 649/827/800 +f 641/818/792 649/827/800 642/819/793 +f 642/819/793 649/827/800 650/828/801 +f 642/819/793 650/828/801 643/820/794 +f 643/820/794 650/828/801 651/829/802 +f 643/820/794 651/829/802 644/821/795 +f 644/821/795 651/829/802 652/830/803 +f 644/821/795 652/830/803 645/822/796 +f 645/822/796 652/830/803 653/831/804 +f 645/822/796 653/831/804 646/823/797 +f 646/823/797 653/831/804 654/832/805 +f 646/823/797 654/832/805 647/824/798 +f 647/824/798 654/832/805 1362/833/149 +f 647/824/798 1362/833/149 1361/825/148 +f 469/738/721 470/740/723 655/834/806 +f 469/738/721 655/834/806 648/826/799 +f 648/826/799 655/834/806 656/835/807 +f 648/826/799 656/835/807 649/827/800 +f 649/827/800 656/835/807 657/836/808 +f 649/827/800 657/836/808 650/828/801 +f 650/828/801 657/836/808 658/837/809 +f 650/828/801 658/837/809 651/829/802 +f 651/829/802 658/837/809 659/838/810 +f 651/829/802 659/838/810 652/830/803 +f 652/830/803 659/838/810 660/839/811 +f 652/830/803 660/839/811 653/831/804 +f 653/831/804 660/839/811 661/840/812 +f 653/831/804 661/840/812 654/832/805 +f 654/832/805 661/840/812 1363/841/150 +f 654/832/805 1363/841/150 1362/833/149 +f 470/740/723 471/742/725 662/842/813 +f 470/740/723 662/842/813 655/834/806 +f 655/834/806 662/842/813 663/843/814 +f 655/834/806 663/843/814 656/835/807 +f 656/835/807 663/843/814 664/844/815 +f 656/835/807 664/844/815 657/836/808 +f 657/836/808 664/844/815 665/845/816 +f 657/836/808 665/845/816 658/837/809 +f 658/837/809 665/845/816 666/846/817 +f 658/837/809 666/846/817 659/838/810 +f 659/838/810 666/846/817 667/847/818 +f 659/838/810 667/847/818 660/839/811 +f 660/839/811 667/847/818 668/848/819 +f 660/839/811 668/848/819 661/840/812 +f 661/840/812 668/848/819 1364/849/151 +f 661/840/812 1364/849/151 1363/841/150 +f 471/742/725 472/744/727 669/850/820 +f 471/742/725 669/850/820 662/842/813 +f 662/842/813 669/850/820 670/851/821 +f 662/842/813 670/851/821 663/843/814 +f 663/843/814 670/851/821 671/852/822 +f 663/843/814 671/852/822 664/844/815 +f 664/844/815 671/852/822 672/853/823 +f 664/844/815 672/853/823 665/845/816 +f 665/845/816 672/853/823 673/854/824 +f 665/845/816 673/854/824 666/846/817 +f 666/846/817 673/854/824 674/855/825 +f 666/846/817 674/855/825 667/847/818 +f 667/847/818 674/855/825 675/856/826 +f 667/847/818 675/856/826 668/848/819 +f 668/848/819 675/856/826 1365/857/152 +f 668/848/819 1365/857/152 1364/849/151 +f 472/744/727 1418/746/729 1417/858/827 +f 472/744/727 1417/858/827 669/850/820 +f 669/850/820 1417/858/827 1416/859/828 +f 669/850/820 1416/859/828 670/851/821 +f 670/851/821 1416/859/828 1415/860/829 +f 670/851/821 1415/860/829 671/852/822 +f 671/852/822 1415/860/829 1414/861/830 +f 671/852/822 1414/861/830 672/853/823 +f 672/853/823 1414/861/830 1413/862/831 +f 672/853/823 1413/862/831 673/854/824 +f 673/854/824 1413/862/831 1412/863/832 +f 673/854/824 1412/863/832 674/855/825 +f 674/855/825 1412/863/832 1411/864/833 +f 674/855/825 1411/864/833 675/856/826 +f 675/856/826 1411/864/833 1532/865/153 +f 675/856/826 1532/865/153 1365/857/152 +f 676/866/834 698/867/835 705/868/836 +f 676/866/834 705/868/836 677/869/837 +f 677/869/837 705/868/836 706/870/838 +f 677/869/837 706/870/838 678/871/839 +f 678/871/839 706/870/838 707/872/840 +f 678/871/839 707/872/840 679/873/841 +f 679/873/841 707/872/840 708/874/842 +f 679/873/841 708/874/842 680/875/843 +f 680/875/843 708/874/842 709/876/844 +f 680/875/843 709/876/844 681/877/845 +f 681/877/845 709/876/844 710/878/846 +f 681/877/845 710/878/846 682/879/847 +f 682/879/847 710/878/846 711/880/848 +f 682/879/847 711/880/848 683/881/849 +f 683/881/849 711/880/848 1417/882/827 +f 683/881/849 1417/882/827 1418/883/729 +f 698/867/835 699/884/850 712/885/851 +f 698/867/835 712/885/851 705/868/836 +f 705/868/836 712/885/851 713/886/852 +f 705/868/836 713/886/852 706/870/838 +f 706/870/838 713/886/852 714/887/853 +f 706/870/838 714/887/853 707/872/840 +f 707/872/840 714/887/853 715/888/854 +f 707/872/840 715/888/854 708/874/842 +f 708/874/842 715/888/854 716/889/855 +f 708/874/842 716/889/855 709/876/844 +f 709/876/844 716/889/855 717/890/856 +f 709/876/844 717/890/856 710/878/846 +f 710/878/846 717/890/856 718/891/857 +f 710/878/846 718/891/857 711/880/848 +f 711/880/848 718/891/857 1416/892/828 +f 711/880/848 1416/892/828 1417/882/827 +f 699/884/850 700/893/858 719/894/859 +f 699/884/850 719/894/859 712/885/851 +f 712/885/851 719/894/859 720/895/860 +f 712/885/851 720/895/860 713/886/852 +f 713/886/852 720/895/860 721/896/861 +f 713/886/852 721/896/861 714/887/853 +f 714/887/853 721/896/861 722/897/862 +f 714/887/853 722/897/862 715/888/854 +f 715/888/854 722/897/862 723/898/863 +f 715/888/854 723/898/863 716/889/855 +f 716/889/855 723/898/863 724/899/864 +f 716/889/855 724/899/864 717/890/856 +f 717/890/856 724/899/864 725/900/865 +f 717/890/856 725/900/865 718/891/857 +f 718/891/857 725/900/865 1415/901/829 +f 718/891/857 1415/901/829 1416/892/828 +f 700/893/858 701/902/866 726/903/867 +f 700/893/858 726/903/867 719/894/859 +f 719/894/859 726/903/867 727/904/868 +f 719/894/859 727/904/868 720/895/860 +f 720/895/860 727/904/868 728/905/869 +f 720/895/860 728/905/869 721/896/861 +f 721/896/861 728/905/869 729/906/870 +f 721/896/861 729/906/870 722/897/862 +f 722/897/862 729/906/870 730/907/871 +f 722/897/862 730/907/871 723/898/863 +f 723/898/863 730/907/871 731/908/872 +f 723/898/863 731/908/872 724/899/864 +f 724/899/864 731/908/872 732/909/873 +f 724/899/864 732/909/873 725/900/865 +f 725/900/865 732/909/873 1414/910/830 +f 725/900/865 1414/910/830 1415/901/829 +f 701/902/866 702/911/874 733/912/875 +f 701/902/866 733/912/875 726/903/867 +f 726/903/867 733/912/875 734/913/876 +f 726/903/867 734/913/876 727/904/868 +f 727/904/868 734/913/876 735/914/877 +f 727/904/868 735/914/877 728/905/869 +f 728/905/869 735/914/877 736/915/878 +f 728/905/869 736/915/878 729/906/870 +f 729/906/870 736/915/878 737/916/879 +f 729/906/870 737/916/879 730/907/871 +f 730/907/871 737/916/879 738/917/880 +f 730/907/871 738/917/880 731/908/872 +f 731/908/872 738/917/880 739/918/881 +f 731/908/872 739/918/881 732/909/873 +f 732/909/873 739/918/881 1413/919/831 +f 732/909/873 1413/919/831 1414/910/830 +f 702/911/874 703/920/882 740/921/883 +f 702/911/874 740/921/883 733/912/875 +f 733/912/875 740/921/883 741/922/884 +f 733/912/875 741/922/884 734/913/876 +f 734/913/876 741/922/884 742/923/885 +f 734/913/876 742/923/885 735/914/877 +f 735/914/877 742/923/885 743/924/886 +f 735/914/877 743/924/886 736/915/878 +f 736/915/878 743/924/886 744/925/887 +f 736/915/878 744/925/887 737/916/879 +f 737/916/879 744/925/887 745/926/888 +f 737/916/879 745/926/888 738/917/880 +f 738/917/880 745/926/888 746/927/889 +f 738/917/880 746/927/889 739/918/881 +f 739/918/881 746/927/889 1412/928/832 +f 739/918/881 1412/928/832 1413/919/831 +f 703/920/882 704/929/890 747/930/891 +f 703/920/882 747/930/891 740/921/883 +f 740/921/883 747/930/891 748/931/892 +f 740/921/883 748/931/892 741/922/884 +f 741/922/884 748/931/892 749/932/893 +f 741/922/884 749/932/893 742/923/885 +f 742/923/885 749/932/893 750/933/894 +f 742/923/885 750/933/894 743/924/886 +f 743/924/886 750/933/894 751/934/895 +f 743/924/886 751/934/895 744/925/887 +f 744/925/887 751/934/895 752/935/896 +f 744/925/887 752/935/896 745/926/888 +f 745/926/888 752/935/896 753/936/897 +f 745/926/888 753/936/897 746/927/889 +f 746/927/889 753/936/897 1411/937/833 +f 746/927/889 1411/937/833 1412/928/832 +f 704/929/890 1403/938/97 1402/939/96 +f 704/929/890 1402/939/96 747/930/891 +f 747/930/891 1402/939/96 1401/940/105 +f 747/930/891 1401/940/105 748/931/892 +f 748/931/892 1401/940/105 1400/941/113 +f 748/931/892 1400/941/113 749/932/893 +f 749/932/893 1400/941/113 1399/942/121 +f 749/932/893 1399/942/121 750/933/894 +f 750/933/894 1399/942/121 1398/943/129 +f 750/933/894 1398/943/129 751/934/895 +f 751/934/895 1398/943/129 1397/944/137 +f 751/934/895 1397/944/137 752/935/896 +f 752/935/896 1397/944/137 1396/945/145 +f 752/935/896 1396/945/145 753/936/897 +f 753/936/897 1396/945/145 1532/946/153 +f 753/936/897 1532/946/153 1411/937/833 +f 676/866/834 677/869/837 754/947/898 +f 676/866/834 754/947/898 684/948/899 +f 684/948/899 754/947/898 755/949/900 +f 684/948/899 755/949/900 685/950/901 +f 685/950/901 755/949/900 756/951/902 +f 685/950/901 756/951/902 686/952/903 +f 686/952/903 756/951/902 757/953/904 +f 686/952/903 757/953/904 687/954/905 +f 687/954/905 757/953/904 758/955/906 +f 687/954/905 758/955/906 688/956/907 +f 688/956/907 758/955/906 759/957/908 +f 688/956/907 759/957/908 689/958/909 +f 689/958/909 759/957/908 760/959/910 +f 689/958/909 760/959/910 690/960/911 +f 690/960/911 760/959/910 1507/961/571 +f 690/960/911 1507/961/571 1508/962/458 +f 677/869/837 678/871/839 761/963/912 +f 677/869/837 761/963/912 754/947/898 +f 754/947/898 761/963/912 762/964/913 +f 754/947/898 762/964/913 755/949/900 +f 755/949/900 762/964/913 763/965/914 +f 755/949/900 763/965/914 756/951/902 +f 756/951/902 763/965/914 764/966/915 +f 756/951/902 764/966/915 757/953/904 +f 757/953/904 764/966/915 765/967/916 +f 757/953/904 765/967/916 758/955/906 +f 758/955/906 765/967/916 766/968/917 +f 758/955/906 766/968/917 759/957/908 +f 759/957/908 766/968/917 767/969/918 +f 759/957/908 767/969/918 760/959/910 +f 760/959/910 767/969/918 1506/970/572 +f 760/959/910 1506/970/572 1507/961/571 +f 678/871/839 679/873/841 768/971/919 +f 678/871/839 768/971/919 761/963/912 +f 761/963/912 768/971/919 769/972/920 +f 761/963/912 769/972/920 762/964/913 +f 762/964/913 769/972/920 770/973/921 +f 762/964/913 770/973/921 763/965/914 +f 763/965/914 770/973/921 771/974/922 +f 763/965/914 771/974/922 764/966/915 +f 764/966/915 771/974/922 772/975/923 +f 764/966/915 772/975/923 765/967/916 +f 765/967/916 772/975/923 773/976/924 +f 765/967/916 773/976/924 766/968/917 +f 766/968/917 773/976/924 774/977/925 +f 766/968/917 774/977/925 767/969/918 +f 767/969/918 774/977/925 1505/978/573 +f 767/969/918 1505/978/573 1506/970/572 +f 679/873/841 680/875/843 775/979/926 +f 679/873/841 775/979/926 768/971/919 +f 768/971/919 775/979/926 776/980/927 +f 768/971/919 776/980/927 769/972/920 +f 769/972/920 776/980/927 777/981/928 +f 769/972/920 777/981/928 770/973/921 +f 770/973/921 777/981/928 778/982/929 +f 770/973/921 778/982/929 771/974/922 +f 771/974/922 778/982/929 779/983/930 +f 771/974/922 779/983/930 772/975/923 +f 772/975/923 779/983/930 780/984/931 +f 772/975/923 780/984/931 773/976/924 +f 773/976/924 780/984/931 781/985/932 +f 773/976/924 781/985/932 774/977/925 +f 774/977/925 781/985/932 1504/986/574 +f 774/977/925 1504/986/574 1505/978/573 +f 680/875/843 681/877/845 782/987/933 +f 680/875/843 782/987/933 775/979/926 +f 775/979/926 782/987/933 783/988/934 +f 775/979/926 783/988/934 776/980/927 +f 776/980/927 783/988/934 784/989/935 +f 776/980/927 784/989/935 777/981/928 +f 777/981/928 784/989/935 785/990/936 +f 777/981/928 785/990/936 778/982/929 +f 778/982/929 785/990/936 786/991/937 +f 778/982/929 786/991/937 779/983/930 +f 779/983/930 786/991/937 787/992/938 +f 779/983/930 787/992/938 780/984/931 +f 780/984/931 787/992/938 788/993/939 +f 780/984/931 788/993/939 781/985/932 +f 781/985/932 788/993/939 1503/994/575 +f 781/985/932 1503/994/575 1504/986/574 +f 681/877/845 682/879/847 789/995/940 +f 681/877/845 789/995/940 782/987/933 +f 782/987/933 789/995/940 790/996/941 +f 782/987/933 790/996/941 783/988/934 +f 783/988/934 790/996/941 791/997/942 +f 783/988/934 791/997/942 784/989/935 +f 784/989/935 791/997/942 792/998/943 +f 784/989/935 792/998/943 785/990/936 +f 785/990/936 792/998/943 793/999/944 +f 785/990/936 793/999/944 786/991/937 +f 786/991/937 793/999/944 794/1000/945 +f 786/991/937 794/1000/945 787/992/938 +f 787/992/938 794/1000/945 795/1001/946 +f 787/992/938 795/1001/946 788/993/939 +f 788/993/939 795/1001/946 1502/1002/576 +f 788/993/939 1502/1002/576 1503/994/575 +f 682/879/847 683/881/849 796/1003/947 +f 682/879/847 796/1003/947 789/995/940 +f 789/995/940 796/1003/947 797/1004/948 +f 789/995/940 797/1004/948 790/996/941 +f 790/996/941 797/1004/948 798/1005/949 +f 790/996/941 798/1005/949 791/997/942 +f 791/997/942 798/1005/949 799/1006/950 +f 791/997/942 799/1006/950 792/998/943 +f 792/998/943 799/1006/950 800/1007/951 +f 792/998/943 800/1007/951 793/999/944 +f 793/999/944 800/1007/951 801/1008/952 +f 793/999/944 801/1008/952 794/1000/945 +f 794/1000/945 801/1008/952 802/1009/953 +f 794/1000/945 802/1009/953 795/1001/946 +f 795/1001/946 802/1009/953 1501/1010/577 +f 795/1001/946 1501/1010/577 1502/1002/576 +f 683/881/849 1418/883/729 1419/1011/728 +f 683/881/849 1419/1011/728 796/1003/947 +f 796/1003/947 1419/1011/728 1420/1012/737 +f 796/1003/947 1420/1012/737 797/1004/948 +f 797/1004/948 1420/1012/737 1421/1013/745 +f 797/1004/948 1421/1013/745 798/1005/949 +f 798/1005/949 1421/1013/745 1422/1014/753 +f 798/1005/949 1422/1014/753 799/1006/950 +f 799/1006/950 1422/1014/753 1423/1015/761 +f 799/1006/950 1423/1015/761 800/1007/951 +f 800/1007/951 1423/1015/761 1424/1016/769 +f 800/1007/951 1424/1016/769 801/1008/952 +f 801/1008/952 1424/1016/769 1425/1017/777 +f 801/1008/952 1425/1017/777 802/1009/953 +f 802/1009/953 1425/1017/777 1536/1018/578 +f 802/1009/953 1536/1018/578 1501/1010/577 +f 676/866/834 684/948/899 803/1019/954 +f 676/866/834 803/1019/954 691/1020/955 +f 691/1020/955 803/1019/954 804/1021/956 +f 691/1020/955 804/1021/956 692/1022/957 +f 692/1022/957 804/1021/956 805/1023/958 +f 692/1022/957 805/1023/958 693/1024/959 +f 693/1024/959 805/1023/958 806/1025/960 +f 693/1024/959 806/1025/960 694/1026/961 +f 694/1026/961 806/1025/960 807/1027/962 +f 694/1026/961 807/1027/962 695/1028/963 +f 695/1028/963 807/1027/962 808/1029/964 +f 695/1028/963 808/1029/964 696/1030/965 +f 696/1030/965 808/1029/964 809/1031/966 +f 696/1030/965 809/1031/966 697/1032/967 +f 697/1032/967 809/1031/966 1449/1033/968 +f 697/1032/967 1449/1033/968 1448/1034/969 +f 684/948/899 685/950/901 810/1035/970 +f 684/948/899 810/1035/970 803/1019/954 +f 803/1019/954 810/1035/970 811/1036/971 +f 803/1019/954 811/1036/971 804/1021/956 +f 804/1021/956 811/1036/971 812/1037/972 +f 804/1021/956 812/1037/972 805/1023/958 +f 805/1023/958 812/1037/972 813/1038/973 +f 805/1023/958 813/1038/973 806/1025/960 +f 806/1025/960 813/1038/973 814/1039/974 +f 806/1025/960 814/1039/974 807/1027/962 +f 807/1027/962 814/1039/974 815/1040/975 +f 807/1027/962 815/1040/975 808/1029/964 +f 808/1029/964 815/1040/975 816/1041/976 +f 808/1029/964 816/1041/976 809/1031/966 +f 809/1031/966 816/1041/976 1450/1042/977 +f 809/1031/966 1450/1042/977 1449/1033/968 +f 685/950/901 686/952/903 817/1043/978 +f 685/950/901 817/1043/978 810/1035/970 +f 810/1035/970 817/1043/978 818/1044/979 +f 810/1035/970 818/1044/979 811/1036/971 +f 811/1036/971 818/1044/979 819/1045/980 +f 811/1036/971 819/1045/980 812/1037/972 +f 812/1037/972 819/1045/980 820/1046/981 +f 812/1037/972 820/1046/981 813/1038/973 +f 813/1038/973 820/1046/981 821/1047/982 +f 813/1038/973 821/1047/982 814/1039/974 +f 814/1039/974 821/1047/982 822/1048/983 +f 814/1039/974 822/1048/983 815/1040/975 +f 815/1040/975 822/1048/983 823/1049/984 +f 815/1040/975 823/1049/984 816/1041/976 +f 816/1041/976 823/1049/984 1451/1050/985 +f 816/1041/976 1451/1050/985 1450/1042/977 +f 686/952/903 687/954/905 824/1051/986 +f 686/952/903 824/1051/986 817/1043/978 +f 817/1043/978 824/1051/986 825/1052/987 +f 817/1043/978 825/1052/987 818/1044/979 +f 818/1044/979 825/1052/987 826/1053/988 +f 818/1044/979 826/1053/988 819/1045/980 +f 819/1045/980 826/1053/988 827/1054/989 +f 819/1045/980 827/1054/989 820/1046/981 +f 820/1046/981 827/1054/989 828/1055/990 +f 820/1046/981 828/1055/990 821/1047/982 +f 821/1047/982 828/1055/990 829/1056/991 +f 821/1047/982 829/1056/991 822/1048/983 +f 822/1048/983 829/1056/991 830/1057/992 +f 822/1048/983 830/1057/992 823/1049/984 +f 823/1049/984 830/1057/992 1452/1058/993 +f 823/1049/984 1452/1058/993 1451/1050/985 +f 687/954/905 688/956/907 831/1059/994 +f 687/954/905 831/1059/994 824/1051/986 +f 824/1051/986 831/1059/994 832/1060/995 +f 824/1051/986 832/1060/995 825/1052/987 +f 825/1052/987 832/1060/995 833/1061/996 +f 825/1052/987 833/1061/996 826/1053/988 +f 826/1053/988 833/1061/996 834/1062/997 +f 826/1053/988 834/1062/997 827/1054/989 +f 827/1054/989 834/1062/997 835/1063/998 +f 827/1054/989 835/1063/998 828/1055/990 +f 828/1055/990 835/1063/998 836/1064/999 +f 828/1055/990 836/1064/999 829/1056/991 +f 829/1056/991 836/1064/999 837/1065/1000 +f 829/1056/991 837/1065/1000 830/1057/992 +f 830/1057/992 837/1065/1000 1453/1066/1001 +f 830/1057/992 1453/1066/1001 1452/1058/993 +f 688/956/907 689/958/909 838/1067/1002 +f 688/956/907 838/1067/1002 831/1059/994 +f 831/1059/994 838/1067/1002 839/1068/1003 +f 831/1059/994 839/1068/1003 832/1060/995 +f 832/1060/995 839/1068/1003 840/1069/1004 +f 832/1060/995 840/1069/1004 833/1061/996 +f 833/1061/996 840/1069/1004 841/1070/1005 +f 833/1061/996 841/1070/1005 834/1062/997 +f 834/1062/997 841/1070/1005 842/1071/1006 +f 834/1062/997 842/1071/1006 835/1063/998 +f 835/1063/998 842/1071/1006 843/1072/1007 +f 835/1063/998 843/1072/1007 836/1064/999 +f 836/1064/999 843/1072/1007 844/1073/1008 +f 836/1064/999 844/1073/1008 837/1065/1000 +f 837/1065/1000 844/1073/1008 1454/1074/1009 +f 837/1065/1000 1454/1074/1009 1453/1066/1001 +f 689/958/909 690/960/911 845/1075/1010 +f 689/958/909 845/1075/1010 838/1067/1002 +f 838/1067/1002 845/1075/1010 846/1076/1011 +f 838/1067/1002 846/1076/1011 839/1068/1003 +f 839/1068/1003 846/1076/1011 847/1077/1012 +f 839/1068/1003 847/1077/1012 840/1069/1004 +f 840/1069/1004 847/1077/1012 848/1078/1013 +f 840/1069/1004 848/1078/1013 841/1070/1005 +f 841/1070/1005 848/1078/1013 849/1079/1014 +f 841/1070/1005 849/1079/1014 842/1071/1006 +f 842/1071/1006 849/1079/1014 850/1080/1015 +f 842/1071/1006 850/1080/1015 843/1072/1007 +f 843/1072/1007 850/1080/1015 851/1081/1016 +f 843/1072/1007 851/1081/1016 844/1073/1008 +f 844/1073/1008 851/1081/1016 1455/1082/1017 +f 844/1073/1008 1455/1082/1017 1454/1074/1009 +f 690/960/911 1508/962/458 1509/1083/457 +f 690/960/911 1509/1083/457 845/1075/1010 +f 845/1075/1010 1509/1083/457 1510/1084/466 +f 845/1075/1010 1510/1084/466 846/1076/1011 +f 846/1076/1011 1510/1084/466 1511/1085/474 +f 846/1076/1011 1511/1085/474 847/1077/1012 +f 847/1077/1012 1511/1085/474 1512/1086/482 +f 847/1077/1012 1512/1086/482 848/1078/1013 +f 848/1078/1013 1512/1086/482 1513/1087/490 +f 848/1078/1013 1513/1087/490 849/1079/1014 +f 849/1079/1014 1513/1087/490 1514/1088/498 +f 849/1079/1014 1514/1088/498 850/1080/1015 +f 850/1080/1015 1514/1088/498 1515/1089/506 +f 850/1080/1015 1515/1089/506 851/1081/1016 +f 851/1081/1016 1515/1089/506 1537/1090/514 +f 851/1081/1016 1537/1090/514 1455/1082/1017 +f 676/866/834 691/1020/955 852/1091/1018 +f 676/866/834 852/1091/1018 698/867/835 +f 698/867/835 852/1091/1018 853/1092/1019 +f 698/867/835 853/1092/1019 699/884/850 +f 699/884/850 853/1092/1019 854/1093/1020 +f 699/884/850 854/1093/1020 700/893/858 +f 700/893/858 854/1093/1020 855/1094/1021 +f 700/893/858 855/1094/1021 701/902/866 +f 701/902/866 855/1094/1021 856/1095/1022 +f 701/902/866 856/1095/1022 702/911/874 +f 702/911/874 856/1095/1022 857/1096/1023 +f 702/911/874 857/1096/1023 703/920/882 +f 703/920/882 857/1096/1023 858/1097/1024 +f 703/920/882 858/1097/1024 704/929/890 +f 704/929/890 858/1097/1024 1404/1098/218 +f 704/929/890 1404/1098/218 1403/938/97 +f 691/1020/955 692/1022/957 859/1099/1025 +f 691/1020/955 859/1099/1025 852/1091/1018 +f 852/1091/1018 859/1099/1025 860/1100/1026 +f 852/1091/1018 860/1100/1026 853/1092/1019 +f 853/1092/1019 860/1100/1026 861/1101/1027 +f 853/1092/1019 861/1101/1027 854/1093/1020 +f 854/1093/1020 861/1101/1027 862/1102/1028 +f 854/1093/1020 862/1102/1028 855/1094/1021 +f 855/1094/1021 862/1102/1028 863/1103/1029 +f 855/1094/1021 863/1103/1029 856/1095/1022 +f 856/1095/1022 863/1103/1029 864/1104/1030 +f 856/1095/1022 864/1104/1030 857/1096/1023 +f 857/1096/1023 864/1104/1030 865/1105/1031 +f 857/1096/1023 865/1105/1031 858/1097/1024 +f 858/1097/1024 865/1105/1031 1405/1106/219 +f 858/1097/1024 1405/1106/219 1404/1098/218 +f 692/1022/957 693/1024/959 866/1107/1032 +f 692/1022/957 866/1107/1032 859/1099/1025 +f 859/1099/1025 866/1107/1032 867/1108/1033 +f 859/1099/1025 867/1108/1033 860/1100/1026 +f 860/1100/1026 867/1108/1033 868/1109/1034 +f 860/1100/1026 868/1109/1034 861/1101/1027 +f 861/1101/1027 868/1109/1034 869/1110/1035 +f 861/1101/1027 869/1110/1035 862/1102/1028 +f 862/1102/1028 869/1110/1035 870/1111/1036 +f 862/1102/1028 870/1111/1036 863/1103/1029 +f 863/1103/1029 870/1111/1036 871/1112/1037 +f 863/1103/1029 871/1112/1037 864/1104/1030 +f 864/1104/1030 871/1112/1037 872/1113/1038 +f 864/1104/1030 872/1113/1038 865/1105/1031 +f 865/1105/1031 872/1113/1038 1406/1114/220 +f 865/1105/1031 1406/1114/220 1405/1106/219 +f 693/1024/959 694/1026/961 873/1115/1039 +f 693/1024/959 873/1115/1039 866/1107/1032 +f 866/1107/1032 873/1115/1039 874/1116/1040 +f 866/1107/1032 874/1116/1040 867/1108/1033 +f 867/1108/1033 874/1116/1040 875/1117/1041 +f 867/1108/1033 875/1117/1041 868/1109/1034 +f 868/1109/1034 875/1117/1041 876/1118/1042 +f 868/1109/1034 876/1118/1042 869/1110/1035 +f 869/1110/1035 876/1118/1042 877/1119/1043 +f 869/1110/1035 877/1119/1043 870/1111/1036 +f 870/1111/1036 877/1119/1043 878/1120/1044 +f 870/1111/1036 878/1120/1044 871/1112/1037 +f 871/1112/1037 878/1120/1044 879/1121/1045 +f 871/1112/1037 879/1121/1045 872/1113/1038 +f 872/1113/1038 879/1121/1045 1407/1122/221 +f 872/1113/1038 1407/1122/221 1406/1114/220 +f 694/1026/961 695/1028/963 880/1123/1046 +f 694/1026/961 880/1123/1046 873/1115/1039 +f 873/1115/1039 880/1123/1046 881/1124/1047 +f 873/1115/1039 881/1124/1047 874/1116/1040 +f 874/1116/1040 881/1124/1047 882/1125/1048 +f 874/1116/1040 882/1125/1048 875/1117/1041 +f 875/1117/1041 882/1125/1048 883/1126/1049 +f 875/1117/1041 883/1126/1049 876/1118/1042 +f 876/1118/1042 883/1126/1049 884/1127/1050 +f 876/1118/1042 884/1127/1050 877/1119/1043 +f 877/1119/1043 884/1127/1050 885/1128/1051 +f 877/1119/1043 885/1128/1051 878/1120/1044 +f 878/1120/1044 885/1128/1051 886/1129/1052 +f 878/1120/1044 886/1129/1052 879/1121/1045 +f 879/1121/1045 886/1129/1052 1408/1130/222 +f 879/1121/1045 1408/1130/222 1407/1122/221 +f 695/1028/963 696/1030/965 887/1131/1053 +f 695/1028/963 887/1131/1053 880/1123/1046 +f 880/1123/1046 887/1131/1053 888/1132/1054 +f 880/1123/1046 888/1132/1054 881/1124/1047 +f 881/1124/1047 888/1132/1054 889/1133/1055 +f 881/1124/1047 889/1133/1055 882/1125/1048 +f 882/1125/1048 889/1133/1055 890/1134/1056 +f 882/1125/1048 890/1134/1056 883/1126/1049 +f 883/1126/1049 890/1134/1056 891/1135/1057 +f 883/1126/1049 891/1135/1057 884/1127/1050 +f 884/1127/1050 891/1135/1057 892/1136/1058 +f 884/1127/1050 892/1136/1058 885/1128/1051 +f 885/1128/1051 892/1136/1058 893/1137/1059 +f 885/1128/1051 893/1137/1059 886/1129/1052 +f 886/1129/1052 893/1137/1059 1409/1138/223 +f 886/1129/1052 1409/1138/223 1408/1130/222 +f 696/1030/965 697/1032/967 894/1139/1060 +f 696/1030/965 894/1139/1060 887/1131/1053 +f 887/1131/1053 894/1139/1060 895/1140/1061 +f 887/1131/1053 895/1140/1061 888/1132/1054 +f 888/1132/1054 895/1140/1061 896/1141/1062 +f 888/1132/1054 896/1141/1062 889/1133/1055 +f 889/1133/1055 896/1141/1062 897/1142/1063 +f 889/1133/1055 897/1142/1063 890/1134/1056 +f 890/1134/1056 897/1142/1063 898/1143/1064 +f 890/1134/1056 898/1143/1064 891/1135/1057 +f 891/1135/1057 898/1143/1064 899/1144/1065 +f 891/1135/1057 899/1144/1065 892/1136/1058 +f 892/1136/1058 899/1144/1065 900/1145/1066 +f 892/1136/1058 900/1145/1066 893/1137/1059 +f 893/1137/1059 900/1145/1066 1410/1146/224 +f 893/1137/1059 1410/1146/224 1409/1138/223 +f 697/1032/967 1448/1034/969 1447/1147/1067 +f 697/1032/967 1447/1147/1067 894/1139/1060 +f 894/1139/1060 1447/1147/1067 1446/1148/1068 +f 894/1139/1060 1446/1148/1068 895/1140/1061 +f 895/1140/1061 1446/1148/1068 1445/1149/1069 +f 895/1140/1061 1445/1149/1069 896/1141/1062 +f 896/1141/1062 1445/1149/1069 1444/1150/1070 +f 896/1141/1062 1444/1150/1070 897/1142/1063 +f 897/1142/1063 1444/1150/1070 1443/1151/1071 +f 897/1142/1063 1443/1151/1071 898/1143/1064 +f 898/1143/1064 1443/1151/1071 1442/1152/1072 +f 898/1143/1064 1442/1152/1072 899/1144/1065 +f 899/1144/1065 1442/1152/1072 1441/1153/1073 +f 899/1144/1065 1441/1153/1073 900/1145/1066 +f 900/1145/1066 1441/1153/1073 1533/1154/225 +f 900/1145/1066 1533/1154/225 1410/1146/224 +f 901/1155/1074 923/1156/1075 930/1157/1076 +f 901/1155/1074 930/1157/1076 902/1158/1077 +f 902/1158/1077 930/1157/1076 931/1159/1078 +f 902/1158/1077 931/1159/1078 903/1160/1079 +f 903/1160/1079 931/1159/1078 932/1161/1080 +f 903/1160/1079 932/1161/1080 904/1162/1081 +f 904/1162/1081 932/1161/1080 933/1163/1082 +f 904/1162/1081 933/1163/1082 905/1164/1083 +f 905/1164/1083 933/1163/1082 934/1165/1084 +f 905/1164/1083 934/1165/1084 906/1166/1085 +f 906/1166/1085 934/1165/1084 935/1167/1086 +f 906/1166/1085 935/1167/1086 907/1168/1087 +f 907/1168/1087 935/1167/1086 936/1169/1088 +f 907/1168/1087 936/1169/1088 908/1170/1089 +f 908/1170/1089 936/1169/1088 1447/1171/1067 +f 908/1170/1089 1447/1171/1067 1448/1172/969 +f 923/1156/1075 924/1173/1090 937/1174/1091 +f 923/1156/1075 937/1174/1091 930/1157/1076 +f 930/1157/1076 937/1174/1091 938/1175/1092 +f 930/1157/1076 938/1175/1092 931/1159/1078 +f 931/1159/1078 938/1175/1092 939/1176/1093 +f 931/1159/1078 939/1176/1093 932/1161/1080 +f 932/1161/1080 939/1176/1093 940/1177/1094 +f 932/1161/1080 940/1177/1094 933/1163/1082 +f 933/1163/1082 940/1177/1094 941/1178/1095 +f 933/1163/1082 941/1178/1095 934/1165/1084 +f 934/1165/1084 941/1178/1095 942/1179/1096 +f 934/1165/1084 942/1179/1096 935/1167/1086 +f 935/1167/1086 942/1179/1096 943/1180/1097 +f 935/1167/1086 943/1180/1097 936/1169/1088 +f 936/1169/1088 943/1180/1097 1446/1181/1068 +f 936/1169/1088 1446/1181/1068 1447/1171/1067 +f 924/1173/1090 925/1182/1098 944/1183/1099 +f 924/1173/1090 944/1183/1099 937/1174/1091 +f 937/1174/1091 944/1183/1099 945/1184/1100 +f 937/1174/1091 945/1184/1100 938/1175/1092 +f 938/1175/1092 945/1184/1100 946/1185/1101 +f 938/1175/1092 946/1185/1101 939/1176/1093 +f 939/1176/1093 946/1185/1101 947/1186/1102 +f 939/1176/1093 947/1186/1102 940/1177/1094 +f 940/1177/1094 947/1186/1102 948/1187/1103 +f 940/1177/1094 948/1187/1103 941/1178/1095 +f 941/1178/1095 948/1187/1103 949/1188/1104 +f 941/1178/1095 949/1188/1104 942/1179/1096 +f 942/1179/1096 949/1188/1104 950/1189/1105 +f 942/1179/1096 950/1189/1105 943/1180/1097 +f 943/1180/1097 950/1189/1105 1445/1190/1069 +f 943/1180/1097 1445/1190/1069 1446/1181/1068 +f 925/1182/1098 926/1191/1106 951/1192/1107 +f 925/1182/1098 951/1192/1107 944/1183/1099 +f 944/1183/1099 951/1192/1107 952/1193/1108 +f 944/1183/1099 952/1193/1108 945/1184/1100 +f 945/1184/1100 952/1193/1108 953/1194/1109 +f 945/1184/1100 953/1194/1109 946/1185/1101 +f 946/1185/1101 953/1194/1109 954/1195/1110 +f 946/1185/1101 954/1195/1110 947/1186/1102 +f 947/1186/1102 954/1195/1110 955/1196/1111 +f 947/1186/1102 955/1196/1111 948/1187/1103 +f 948/1187/1103 955/1196/1111 956/1197/1112 +f 948/1187/1103 956/1197/1112 949/1188/1104 +f 949/1188/1104 956/1197/1112 957/1198/1113 +f 949/1188/1104 957/1198/1113 950/1189/1105 +f 950/1189/1105 957/1198/1113 1444/1199/1070 +f 950/1189/1105 1444/1199/1070 1445/1190/1069 +f 926/1191/1106 927/1200/1114 958/1201/1115 +f 926/1191/1106 958/1201/1115 951/1192/1107 +f 951/1192/1107 958/1201/1115 959/1202/1116 +f 951/1192/1107 959/1202/1116 952/1193/1108 +f 952/1193/1108 959/1202/1116 960/1203/1117 +f 952/1193/1108 960/1203/1117 953/1194/1109 +f 953/1194/1109 960/1203/1117 961/1204/1118 +f 953/1194/1109 961/1204/1118 954/1195/1110 +f 954/1195/1110 961/1204/1118 962/1205/1119 +f 954/1195/1110 962/1205/1119 955/1196/1111 +f 955/1196/1111 962/1205/1119 963/1206/1120 +f 955/1196/1111 963/1206/1120 956/1197/1112 +f 956/1197/1112 963/1206/1120 964/1207/1121 +f 956/1197/1112 964/1207/1121 957/1198/1113 +f 957/1198/1113 964/1207/1121 1443/1208/1071 +f 957/1198/1113 1443/1208/1071 1444/1199/1070 +f 927/1200/1114 928/1209/1122 965/1210/1123 +f 927/1200/1114 965/1210/1123 958/1201/1115 +f 958/1201/1115 965/1210/1123 966/1211/1124 +f 958/1201/1115 966/1211/1124 959/1202/1116 +f 959/1202/1116 966/1211/1124 967/1212/1125 +f 959/1202/1116 967/1212/1125 960/1203/1117 +f 960/1203/1117 967/1212/1125 968/1213/1126 +f 960/1203/1117 968/1213/1126 961/1204/1118 +f 961/1204/1118 968/1213/1126 969/1214/1127 +f 961/1204/1118 969/1214/1127 962/1205/1119 +f 962/1205/1119 969/1214/1127 970/1215/1128 +f 962/1205/1119 970/1215/1128 963/1206/1120 +f 963/1206/1120 970/1215/1128 971/1216/1129 +f 963/1206/1120 971/1216/1129 964/1207/1121 +f 964/1207/1121 971/1216/1129 1442/1217/1072 +f 964/1207/1121 1442/1217/1072 1443/1208/1071 +f 928/1209/1122 929/1218/1130 972/1219/1131 +f 928/1209/1122 972/1219/1131 965/1210/1123 +f 965/1210/1123 972/1219/1131 973/1220/1132 +f 965/1210/1123 973/1220/1132 966/1211/1124 +f 966/1211/1124 973/1220/1132 974/1221/1133 +f 966/1211/1124 974/1221/1133 967/1212/1125 +f 967/1212/1125 974/1221/1133 975/1222/1134 +f 967/1212/1125 975/1222/1134 968/1213/1126 +f 968/1213/1126 975/1222/1134 976/1223/1135 +f 968/1213/1126 976/1223/1135 969/1214/1127 +f 969/1214/1127 976/1223/1135 977/1224/1136 +f 969/1214/1127 977/1224/1136 970/1215/1128 +f 970/1215/1128 977/1224/1136 978/1225/1137 +f 970/1215/1128 978/1225/1137 971/1216/1129 +f 971/1216/1129 978/1225/1137 1441/1226/1073 +f 971/1216/1129 1441/1226/1073 1442/1217/1072 +f 929/1218/1130 1433/1227/169 1432/1228/168 +f 929/1218/1130 1432/1228/168 972/1219/1131 +f 972/1219/1131 1432/1228/168 1431/1229/177 +f 972/1219/1131 1431/1229/177 973/1220/1132 +f 973/1220/1132 1431/1229/177 1430/1230/185 +f 973/1220/1132 1430/1230/185 974/1221/1133 +f 974/1221/1133 1430/1230/185 1429/1231/193 +f 974/1221/1133 1429/1231/193 975/1222/1134 +f 975/1222/1134 1429/1231/193 1428/1232/201 +f 975/1222/1134 1428/1232/201 976/1223/1135 +f 976/1223/1135 1428/1232/201 1427/1233/209 +f 976/1223/1135 1427/1233/209 977/1224/1136 +f 977/1224/1136 1427/1233/209 1426/1234/217 +f 977/1224/1136 1426/1234/217 978/1225/1137 +f 978/1225/1137 1426/1234/217 1533/1235/225 +f 978/1225/1137 1533/1235/225 1441/1226/1073 +f 901/1155/1074 902/1158/1077 979/1236/1138 +f 901/1155/1074 979/1236/1138 909/1237/1139 +f 909/1237/1139 979/1236/1138 980/1238/1140 +f 909/1237/1139 980/1238/1140 910/1239/1141 +f 910/1239/1141 980/1238/1140 981/1240/1142 +f 910/1239/1141 981/1240/1142 911/1241/1143 +f 911/1241/1143 981/1240/1142 982/1242/1144 +f 911/1241/1143 982/1242/1144 912/1243/1145 +f 912/1243/1145 982/1242/1144 983/1244/1146 +f 912/1243/1145 983/1244/1146 913/1245/1147 +f 913/1245/1147 983/1244/1146 984/1246/1148 +f 913/1245/1147 984/1246/1148 914/1247/1149 +f 914/1247/1149 984/1246/1148 985/1248/1150 +f 914/1247/1149 985/1248/1150 915/1249/1151 +f 915/1249/1151 985/1248/1150 1522/1250/507 +f 915/1249/1151 1522/1250/507 1523/1251/386 +f 902/1158/1077 903/1160/1079 986/1252/1152 +f 902/1158/1077 986/1252/1152 979/1236/1138 +f 979/1236/1138 986/1252/1152 987/1253/1153 +f 979/1236/1138 987/1253/1153 980/1238/1140 +f 980/1238/1140 987/1253/1153 988/1254/1154 +f 980/1238/1140 988/1254/1154 981/1240/1142 +f 981/1240/1142 988/1254/1154 989/1255/1155 +f 981/1240/1142 989/1255/1155 982/1242/1144 +f 982/1242/1144 989/1255/1155 990/1256/1156 +f 982/1242/1144 990/1256/1156 983/1244/1146 +f 983/1244/1146 990/1256/1156 991/1257/1157 +f 983/1244/1146 991/1257/1157 984/1246/1148 +f 984/1246/1148 991/1257/1157 992/1258/1158 +f 984/1246/1148 992/1258/1158 985/1248/1150 +f 985/1248/1150 992/1258/1158 1521/1259/508 +f 985/1248/1150 1521/1259/508 1522/1250/507 +f 903/1160/1079 904/1162/1081 993/1260/1159 +f 903/1160/1079 993/1260/1159 986/1252/1152 +f 986/1252/1152 993/1260/1159 994/1261/1160 +f 986/1252/1152 994/1261/1160 987/1253/1153 +f 987/1253/1153 994/1261/1160 995/1262/1161 +f 987/1253/1153 995/1262/1161 988/1254/1154 +f 988/1254/1154 995/1262/1161 996/1263/1162 +f 988/1254/1154 996/1263/1162 989/1255/1155 +f 989/1255/1155 996/1263/1162 997/1264/1163 +f 989/1255/1155 997/1264/1163 990/1256/1156 +f 990/1256/1156 997/1264/1163 998/1265/1164 +f 990/1256/1156 998/1265/1164 991/1257/1157 +f 991/1257/1157 998/1265/1164 999/1266/1165 +f 991/1257/1157 999/1266/1165 992/1258/1158 +f 992/1258/1158 999/1266/1165 1520/1267/509 +f 992/1258/1158 1520/1267/509 1521/1259/508 +f 904/1162/1081 905/1164/1083 1000/1268/1166 +f 904/1162/1081 1000/1268/1166 993/1260/1159 +f 993/1260/1159 1000/1268/1166 1001/1269/1167 +f 993/1260/1159 1001/1269/1167 994/1261/1160 +f 994/1261/1160 1001/1269/1167 1002/1270/1168 +f 994/1261/1160 1002/1270/1168 995/1262/1161 +f 995/1262/1161 1002/1270/1168 1003/1271/1169 +f 995/1262/1161 1003/1271/1169 996/1263/1162 +f 996/1263/1162 1003/1271/1169 1004/1272/1170 +f 996/1263/1162 1004/1272/1170 997/1264/1163 +f 997/1264/1163 1004/1272/1170 1005/1273/1171 +f 997/1264/1163 1005/1273/1171 998/1265/1164 +f 998/1265/1164 1005/1273/1171 1006/1274/1172 +f 998/1265/1164 1006/1274/1172 999/1266/1165 +f 999/1266/1165 1006/1274/1172 1519/1275/510 +f 999/1266/1165 1519/1275/510 1520/1267/509 +f 905/1164/1083 906/1166/1085 1007/1276/1173 +f 905/1164/1083 1007/1276/1173 1000/1268/1166 +f 1000/1268/1166 1007/1276/1173 1008/1277/1174 +f 1000/1268/1166 1008/1277/1174 1001/1269/1167 +f 1001/1269/1167 1008/1277/1174 1009/1278/1175 +f 1001/1269/1167 1009/1278/1175 1002/1270/1168 +f 1002/1270/1168 1009/1278/1175 1010/1279/1176 +f 1002/1270/1168 1010/1279/1176 1003/1271/1169 +f 1003/1271/1169 1010/1279/1176 1011/1280/1177 +f 1003/1271/1169 1011/1280/1177 1004/1272/1170 +f 1004/1272/1170 1011/1280/1177 1012/1281/1178 +f 1004/1272/1170 1012/1281/1178 1005/1273/1171 +f 1005/1273/1171 1012/1281/1178 1013/1282/1179 +f 1005/1273/1171 1013/1282/1179 1006/1274/1172 +f 1006/1274/1172 1013/1282/1179 1518/1283/511 +f 1006/1274/1172 1518/1283/511 1519/1275/510 +f 906/1166/1085 907/1168/1087 1014/1284/1180 +f 906/1166/1085 1014/1284/1180 1007/1276/1173 +f 1007/1276/1173 1014/1284/1180 1015/1285/1181 +f 1007/1276/1173 1015/1285/1181 1008/1277/1174 +f 1008/1277/1174 1015/1285/1181 1016/1286/1182 +f 1008/1277/1174 1016/1286/1182 1009/1278/1175 +f 1009/1278/1175 1016/1286/1182 1017/1287/1183 +f 1009/1278/1175 1017/1287/1183 1010/1279/1176 +f 1010/1279/1176 1017/1287/1183 1018/1288/1184 +f 1010/1279/1176 1018/1288/1184 1011/1280/1177 +f 1011/1280/1177 1018/1288/1184 1019/1289/1185 +f 1011/1280/1177 1019/1289/1185 1012/1281/1178 +f 1012/1281/1178 1019/1289/1185 1020/1290/1186 +f 1012/1281/1178 1020/1290/1186 1013/1282/1179 +f 1013/1282/1179 1020/1290/1186 1517/1291/512 +f 1013/1282/1179 1517/1291/512 1518/1283/511 +f 907/1168/1087 908/1170/1089 1021/1292/1187 +f 907/1168/1087 1021/1292/1187 1014/1284/1180 +f 1014/1284/1180 1021/1292/1187 1022/1293/1188 +f 1014/1284/1180 1022/1293/1188 1015/1285/1181 +f 1015/1285/1181 1022/1293/1188 1023/1294/1189 +f 1015/1285/1181 1023/1294/1189 1016/1286/1182 +f 1016/1286/1182 1023/1294/1189 1024/1295/1190 +f 1016/1286/1182 1024/1295/1190 1017/1287/1183 +f 1017/1287/1183 1024/1295/1190 1025/1296/1191 +f 1017/1287/1183 1025/1296/1191 1018/1288/1184 +f 1018/1288/1184 1025/1296/1191 1026/1297/1192 +f 1018/1288/1184 1026/1297/1192 1019/1289/1185 +f 1019/1289/1185 1026/1297/1192 1027/1298/1193 +f 1019/1289/1185 1027/1298/1193 1020/1290/1186 +f 1020/1290/1186 1027/1298/1193 1516/1299/513 +f 1020/1290/1186 1516/1299/513 1517/1291/512 +f 908/1170/1089 1448/1172/969 1449/1300/968 +f 908/1170/1089 1449/1300/968 1021/1292/1187 +f 1021/1292/1187 1449/1300/968 1450/1301/977 +f 1021/1292/1187 1450/1301/977 1022/1293/1188 +f 1022/1293/1188 1450/1301/977 1451/1302/985 +f 1022/1293/1188 1451/1302/985 1023/1294/1189 +f 1023/1294/1189 1451/1302/985 1452/1303/993 +f 1023/1294/1189 1452/1303/993 1024/1295/1190 +f 1024/1295/1190 1452/1303/993 1453/1304/1001 +f 1024/1295/1190 1453/1304/1001 1025/1296/1191 +f 1025/1296/1191 1453/1304/1001 1454/1305/1009 +f 1025/1296/1191 1454/1305/1009 1026/1297/1192 +f 1026/1297/1192 1454/1305/1009 1455/1306/1017 +f 1026/1297/1192 1455/1306/1017 1027/1298/1193 +f 1027/1298/1193 1455/1306/1017 1537/1307/514 +f 1027/1298/1193 1537/1307/514 1516/1299/513 +f 901/1155/1074 909/1237/1139 1028/1308/1194 +f 901/1155/1074 1028/1308/1194 916/1309/1195 +f 916/1309/1195 1028/1308/1194 1029/1310/1196 +f 916/1309/1195 1029/1310/1196 917/1311/1197 +f 917/1311/1197 1029/1310/1196 1030/1312/1198 +f 917/1311/1197 1030/1312/1198 918/1313/1199 +f 918/1313/1199 1030/1312/1198 1031/1314/1200 +f 918/1313/1199 1031/1314/1200 919/1315/1201 +f 919/1315/1201 1031/1314/1200 1032/1316/1202 +f 919/1315/1201 1032/1316/1202 920/1317/1203 +f 920/1317/1203 1032/1316/1202 1033/1318/1204 +f 920/1317/1203 1033/1318/1204 921/1319/1205 +f 921/1319/1205 1033/1318/1204 1034/1320/1206 +f 921/1319/1205 1034/1320/1206 922/1321/1207 +f 922/1321/1207 1034/1320/1206 1464/1322/1208 +f 922/1321/1207 1464/1322/1208 1463/1323/1209 +f 909/1237/1139 910/1239/1141 1035/1324/1210 +f 909/1237/1139 1035/1324/1210 1028/1308/1194 +f 1028/1308/1194 1035/1324/1210 1036/1325/1211 +f 1028/1308/1194 1036/1325/1211 1029/1310/1196 +f 1029/1310/1196 1036/1325/1211 1037/1326/1212 +f 1029/1310/1196 1037/1326/1212 1030/1312/1198 +f 1030/1312/1198 1037/1326/1212 1038/1327/1213 +f 1030/1312/1198 1038/1327/1213 1031/1314/1200 +f 1031/1314/1200 1038/1327/1213 1039/1328/1214 +f 1031/1314/1200 1039/1328/1214 1032/1316/1202 +f 1032/1316/1202 1039/1328/1214 1040/1329/1215 +f 1032/1316/1202 1040/1329/1215 1033/1318/1204 +f 1033/1318/1204 1040/1329/1215 1041/1330/1216 +f 1033/1318/1204 1041/1330/1216 1034/1320/1206 +f 1034/1320/1206 1041/1330/1216 1465/1331/1217 +f 1034/1320/1206 1465/1331/1217 1464/1322/1208 +f 910/1239/1141 911/1241/1143 1042/1332/1218 +f 910/1239/1141 1042/1332/1218 1035/1324/1210 +f 1035/1324/1210 1042/1332/1218 1043/1333/1219 +f 1035/1324/1210 1043/1333/1219 1036/1325/1211 +f 1036/1325/1211 1043/1333/1219 1044/1334/1220 +f 1036/1325/1211 1044/1334/1220 1037/1326/1212 +f 1037/1326/1212 1044/1334/1220 1045/1335/1221 +f 1037/1326/1212 1045/1335/1221 1038/1327/1213 +f 1038/1327/1213 1045/1335/1221 1046/1336/1222 +f 1038/1327/1213 1046/1336/1222 1039/1328/1214 +f 1039/1328/1214 1046/1336/1222 1047/1337/1223 +f 1039/1328/1214 1047/1337/1223 1040/1329/1215 +f 1040/1329/1215 1047/1337/1223 1048/1338/1224 +f 1040/1329/1215 1048/1338/1224 1041/1330/1216 +f 1041/1330/1216 1048/1338/1224 1466/1339/1225 +f 1041/1330/1216 1466/1339/1225 1465/1331/1217 +f 911/1241/1143 912/1243/1145 1049/1340/1226 +f 911/1241/1143 1049/1340/1226 1042/1332/1218 +f 1042/1332/1218 1049/1340/1226 1050/1341/1227 +f 1042/1332/1218 1050/1341/1227 1043/1333/1219 +f 1043/1333/1219 1050/1341/1227 1051/1342/1228 +f 1043/1333/1219 1051/1342/1228 1044/1334/1220 +f 1044/1334/1220 1051/1342/1228 1052/1343/1229 +f 1044/1334/1220 1052/1343/1229 1045/1335/1221 +f 1045/1335/1221 1052/1343/1229 1053/1344/1230 +f 1045/1335/1221 1053/1344/1230 1046/1336/1222 +f 1046/1336/1222 1053/1344/1230 1054/1345/1231 +f 1046/1336/1222 1054/1345/1231 1047/1337/1223 +f 1047/1337/1223 1054/1345/1231 1055/1346/1232 +f 1047/1337/1223 1055/1346/1232 1048/1338/1224 +f 1048/1338/1224 1055/1346/1232 1467/1347/1233 +f 1048/1338/1224 1467/1347/1233 1466/1339/1225 +f 912/1243/1145 913/1245/1147 1056/1348/1234 +f 912/1243/1145 1056/1348/1234 1049/1340/1226 +f 1049/1340/1226 1056/1348/1234 1057/1349/1235 +f 1049/1340/1226 1057/1349/1235 1050/1341/1227 +f 1050/1341/1227 1057/1349/1235 1058/1350/1236 +f 1050/1341/1227 1058/1350/1236 1051/1342/1228 +f 1051/1342/1228 1058/1350/1236 1059/1351/1237 +f 1051/1342/1228 1059/1351/1237 1052/1343/1229 +f 1052/1343/1229 1059/1351/1237 1060/1352/1238 +f 1052/1343/1229 1060/1352/1238 1053/1344/1230 +f 1053/1344/1230 1060/1352/1238 1061/1353/1239 +f 1053/1344/1230 1061/1353/1239 1054/1345/1231 +f 1054/1345/1231 1061/1353/1239 1062/1354/1240 +f 1054/1345/1231 1062/1354/1240 1055/1346/1232 +f 1055/1346/1232 1062/1354/1240 1468/1355/1241 +f 1055/1346/1232 1468/1355/1241 1467/1347/1233 +f 913/1245/1147 914/1247/1149 1063/1356/1242 +f 913/1245/1147 1063/1356/1242 1056/1348/1234 +f 1056/1348/1234 1063/1356/1242 1064/1357/1243 +f 1056/1348/1234 1064/1357/1243 1057/1349/1235 +f 1057/1349/1235 1064/1357/1243 1065/1358/1244 +f 1057/1349/1235 1065/1358/1244 1058/1350/1236 +f 1058/1350/1236 1065/1358/1244 1066/1359/1245 +f 1058/1350/1236 1066/1359/1245 1059/1351/1237 +f 1059/1351/1237 1066/1359/1245 1067/1360/1246 +f 1059/1351/1237 1067/1360/1246 1060/1352/1238 +f 1060/1352/1238 1067/1360/1246 1068/1361/1247 +f 1060/1352/1238 1068/1361/1247 1061/1353/1239 +f 1061/1353/1239 1068/1361/1247 1069/1362/1248 +f 1061/1353/1239 1069/1362/1248 1062/1354/1240 +f 1062/1354/1240 1069/1362/1248 1469/1363/1249 +f 1062/1354/1240 1469/1363/1249 1468/1355/1241 +f 914/1247/1149 915/1249/1151 1070/1364/1250 +f 914/1247/1149 1070/1364/1250 1063/1356/1242 +f 1063/1356/1242 1070/1364/1250 1071/1365/1251 +f 1063/1356/1242 1071/1365/1251 1064/1357/1243 +f 1064/1357/1243 1071/1365/1251 1072/1366/1252 +f 1064/1357/1243 1072/1366/1252 1065/1358/1244 +f 1065/1358/1244 1072/1366/1252 1073/1367/1253 +f 1065/1358/1244 1073/1367/1253 1066/1359/1245 +f 1066/1359/1245 1073/1367/1253 1074/1368/1254 +f 1066/1359/1245 1074/1368/1254 1067/1360/1246 +f 1067/1360/1246 1074/1368/1254 1075/1369/1255 +f 1067/1360/1246 1075/1369/1255 1068/1361/1247 +f 1068/1361/1247 1075/1369/1255 1076/1370/1256 +f 1068/1361/1247 1076/1370/1256 1069/1362/1248 +f 1069/1362/1248 1076/1370/1256 1470/1371/1257 +f 1069/1362/1248 1470/1371/1257 1469/1363/1249 +f 915/1249/1151 1523/1251/386 1524/1372/385 +f 915/1249/1151 1524/1372/385 1070/1364/1250 +f 1070/1364/1250 1524/1372/385 1525/1373/394 +f 1070/1364/1250 1525/1373/394 1071/1365/1251 +f 1071/1365/1251 1525/1373/394 1526/1374/402 +f 1071/1365/1251 1526/1374/402 1072/1366/1252 +f 1072/1366/1252 1526/1374/402 1527/1375/410 +f 1072/1366/1252 1527/1375/410 1073/1367/1253 +f 1073/1367/1253 1527/1375/410 1528/1376/418 +f 1073/1367/1253 1528/1376/418 1074/1368/1254 +f 1074/1368/1254 1528/1376/418 1529/1377/426 +f 1074/1368/1254 1529/1377/426 1075/1369/1255 +f 1075/1369/1255 1529/1377/426 1530/1378/434 +f 1075/1369/1255 1530/1378/434 1076/1370/1256 +f 1076/1370/1256 1530/1378/434 1538/1379/442 +f 1076/1370/1256 1538/1379/442 1470/1371/1257 +f 901/1155/1074 916/1309/1195 1077/1380/1258 +f 901/1155/1074 1077/1380/1258 923/1156/1075 +f 923/1156/1075 1077/1380/1258 1078/1381/1259 +f 923/1156/1075 1078/1381/1259 924/1173/1090 +f 924/1173/1090 1078/1381/1259 1079/1382/1260 +f 924/1173/1090 1079/1382/1260 925/1182/1098 +f 925/1182/1098 1079/1382/1260 1080/1383/1261 +f 925/1182/1098 1080/1383/1261 926/1191/1106 +f 926/1191/1106 1080/1383/1261 1081/1384/1262 +f 926/1191/1106 1081/1384/1262 927/1200/1114 +f 927/1200/1114 1081/1384/1262 1082/1385/1263 +f 927/1200/1114 1082/1385/1263 928/1209/1122 +f 928/1209/1122 1082/1385/1263 1083/1386/1264 +f 928/1209/1122 1083/1386/1264 929/1218/1130 +f 929/1218/1130 1083/1386/1264 1434/1387/282 +f 929/1218/1130 1434/1387/282 1433/1227/169 +f 916/1309/1195 917/1311/1197 1084/1388/1265 +f 916/1309/1195 1084/1388/1265 1077/1380/1258 +f 1077/1380/1258 1084/1388/1265 1085/1389/1266 +f 1077/1380/1258 1085/1389/1266 1078/1381/1259 +f 1078/1381/1259 1085/1389/1266 1086/1390/1267 +f 1078/1381/1259 1086/1390/1267 1079/1382/1260 +f 1079/1382/1260 1086/1390/1267 1087/1391/1268 +f 1079/1382/1260 1087/1391/1268 1080/1383/1261 +f 1080/1383/1261 1087/1391/1268 1088/1392/1269 +f 1080/1383/1261 1088/1392/1269 1081/1384/1262 +f 1081/1384/1262 1088/1392/1269 1089/1393/1270 +f 1081/1384/1262 1089/1393/1270 1082/1385/1263 +f 1082/1385/1263 1089/1393/1270 1090/1394/1271 +f 1082/1385/1263 1090/1394/1271 1083/1386/1264 +f 1083/1386/1264 1090/1394/1271 1435/1395/283 +f 1083/1386/1264 1435/1395/283 1434/1387/282 +f 917/1311/1197 918/1313/1199 1091/1396/1272 +f 917/1311/1197 1091/1396/1272 1084/1388/1265 +f 1084/1388/1265 1091/1396/1272 1092/1397/1273 +f 1084/1388/1265 1092/1397/1273 1085/1389/1266 +f 1085/1389/1266 1092/1397/1273 1093/1398/1274 +f 1085/1389/1266 1093/1398/1274 1086/1390/1267 +f 1086/1390/1267 1093/1398/1274 1094/1399/1275 +f 1086/1390/1267 1094/1399/1275 1087/1391/1268 +f 1087/1391/1268 1094/1399/1275 1095/1400/1276 +f 1087/1391/1268 1095/1400/1276 1088/1392/1269 +f 1088/1392/1269 1095/1400/1276 1096/1401/1277 +f 1088/1392/1269 1096/1401/1277 1089/1393/1270 +f 1089/1393/1270 1096/1401/1277 1097/1402/1278 +f 1089/1393/1270 1097/1402/1278 1090/1394/1271 +f 1090/1394/1271 1097/1402/1278 1436/1403/284 +f 1090/1394/1271 1436/1403/284 1435/1395/283 +f 918/1313/1199 919/1315/1201 1098/1404/1279 +f 918/1313/1199 1098/1404/1279 1091/1396/1272 +f 1091/1396/1272 1098/1404/1279 1099/1405/1280 +f 1091/1396/1272 1099/1405/1280 1092/1397/1273 +f 1092/1397/1273 1099/1405/1280 1100/1406/1281 +f 1092/1397/1273 1100/1406/1281 1093/1398/1274 +f 1093/1398/1274 1100/1406/1281 1101/1407/1282 +f 1093/1398/1274 1101/1407/1282 1094/1399/1275 +f 1094/1399/1275 1101/1407/1282 1102/1408/1283 +f 1094/1399/1275 1102/1408/1283 1095/1400/1276 +f 1095/1400/1276 1102/1408/1283 1103/1409/1284 +f 1095/1400/1276 1103/1409/1284 1096/1401/1277 +f 1096/1401/1277 1103/1409/1284 1104/1410/1285 +f 1096/1401/1277 1104/1410/1285 1097/1402/1278 +f 1097/1402/1278 1104/1410/1285 1437/1411/285 +f 1097/1402/1278 1437/1411/285 1436/1403/284 +f 919/1315/1201 920/1317/1203 1105/1412/1286 +f 919/1315/1201 1105/1412/1286 1098/1404/1279 +f 1098/1404/1279 1105/1412/1286 1106/1413/1287 +f 1098/1404/1279 1106/1413/1287 1099/1405/1280 +f 1099/1405/1280 1106/1413/1287 1107/1414/1288 +f 1099/1405/1280 1107/1414/1288 1100/1406/1281 +f 1100/1406/1281 1107/1414/1288 1108/1415/1289 +f 1100/1406/1281 1108/1415/1289 1101/1407/1282 +f 1101/1407/1282 1108/1415/1289 1109/1416/1290 +f 1101/1407/1282 1109/1416/1290 1102/1408/1283 +f 1102/1408/1283 1109/1416/1290 1110/1417/1291 +f 1102/1408/1283 1110/1417/1291 1103/1409/1284 +f 1103/1409/1284 1110/1417/1291 1111/1418/1292 +f 1103/1409/1284 1111/1418/1292 1104/1410/1285 +f 1104/1410/1285 1111/1418/1292 1438/1419/286 +f 1104/1410/1285 1438/1419/286 1437/1411/285 +f 920/1317/1203 921/1319/1205 1112/1420/1293 +f 920/1317/1203 1112/1420/1293 1105/1412/1286 +f 1105/1412/1286 1112/1420/1293 1113/1421/1294 +f 1105/1412/1286 1113/1421/1294 1106/1413/1287 +f 1106/1413/1287 1113/1421/1294 1114/1422/1295 +f 1106/1413/1287 1114/1422/1295 1107/1414/1288 +f 1107/1414/1288 1114/1422/1295 1115/1423/1296 +f 1107/1414/1288 1115/1423/1296 1108/1415/1289 +f 1108/1415/1289 1115/1423/1296 1116/1424/1297 +f 1108/1415/1289 1116/1424/1297 1109/1416/1290 +f 1109/1416/1290 1116/1424/1297 1117/1425/1298 +f 1109/1416/1290 1117/1425/1298 1110/1417/1291 +f 1110/1417/1291 1117/1425/1298 1118/1426/1299 +f 1110/1417/1291 1118/1426/1299 1111/1418/1292 +f 1111/1418/1292 1118/1426/1299 1439/1427/287 +f 1111/1418/1292 1439/1427/287 1438/1419/286 +f 921/1319/1205 922/1321/1207 1119/1428/1300 +f 921/1319/1205 1119/1428/1300 1112/1420/1293 +f 1112/1420/1293 1119/1428/1300 1120/1429/1301 +f 1112/1420/1293 1120/1429/1301 1113/1421/1294 +f 1113/1421/1294 1120/1429/1301 1121/1430/1302 +f 1113/1421/1294 1121/1430/1302 1114/1422/1295 +f 1114/1422/1295 1121/1430/1302 1122/1431/1303 +f 1114/1422/1295 1122/1431/1303 1115/1423/1296 +f 1115/1423/1296 1122/1431/1303 1123/1432/1304 +f 1115/1423/1296 1123/1432/1304 1116/1424/1297 +f 1116/1424/1297 1123/1432/1304 1124/1433/1305 +f 1116/1424/1297 1124/1433/1305 1117/1425/1298 +f 1117/1425/1298 1124/1433/1305 1125/1434/1306 +f 1117/1425/1298 1125/1434/1306 1118/1426/1299 +f 1118/1426/1299 1125/1434/1306 1440/1435/288 +f 1118/1426/1299 1440/1435/288 1439/1427/287 +f 922/1321/1207 1463/1323/1209 1462/1436/1307 +f 922/1321/1207 1462/1436/1307 1119/1428/1300 +f 1119/1428/1300 1462/1436/1307 1461/1437/1308 +f 1119/1428/1300 1461/1437/1308 1120/1429/1301 +f 1120/1429/1301 1461/1437/1308 1460/1438/1309 +f 1120/1429/1301 1460/1438/1309 1121/1430/1302 +f 1121/1430/1302 1460/1438/1309 1459/1439/1310 +f 1121/1430/1302 1459/1439/1310 1122/1431/1303 +f 1122/1431/1303 1459/1439/1310 1458/1440/1311 +f 1122/1431/1303 1458/1440/1311 1123/1432/1304 +f 1123/1432/1304 1458/1440/1311 1457/1441/1312 +f 1123/1432/1304 1457/1441/1312 1124/1433/1305 +f 1124/1433/1305 1457/1441/1312 1456/1442/1313 +f 1124/1433/1305 1456/1442/1313 1125/1434/1306 +f 1125/1434/1306 1456/1442/1313 1534/1443/289 +f 1125/1434/1306 1534/1443/289 1440/1435/288 +f 1126/1444/1314 1148/1445/1315 1155/1446/1316 +f 1126/1444/1314 1155/1446/1316 1127/1447/1317 +f 1127/1447/1317 1155/1446/1316 1156/1448/1318 +f 1127/1447/1317 1156/1448/1318 1128/1449/1319 +f 1128/1449/1319 1156/1448/1318 1157/1450/1320 +f 1128/1449/1319 1157/1450/1320 1129/1451/1321 +f 1129/1451/1321 1157/1450/1320 1158/1452/1322 +f 1129/1451/1321 1158/1452/1322 1130/1453/1323 +f 1130/1453/1323 1158/1452/1322 1159/1454/1324 +f 1130/1453/1323 1159/1454/1324 1131/1455/1325 +f 1131/1455/1325 1159/1454/1324 1160/1456/1326 +f 1131/1455/1325 1160/1456/1326 1132/1457/1327 +f 1132/1457/1327 1160/1456/1326 1161/1458/1328 +f 1132/1457/1327 1161/1458/1328 1133/1459/1329 +f 1133/1459/1329 1161/1458/1328 1389/1460/707 +f 1133/1459/1329 1389/1460/707 1388/1461/596 +f 1148/1445/1315 1149/1462/1330 1162/1463/1331 +f 1148/1445/1315 1162/1463/1331 1155/1446/1316 +f 1155/1446/1316 1162/1463/1331 1163/1464/1332 +f 1155/1446/1316 1163/1464/1332 1156/1448/1318 +f 1156/1448/1318 1163/1464/1332 1164/1465/1333 +f 1156/1448/1318 1164/1465/1333 1157/1450/1320 +f 1157/1450/1320 1164/1465/1333 1165/1466/1334 +f 1157/1450/1320 1165/1466/1334 1158/1452/1322 +f 1158/1452/1322 1165/1466/1334 1166/1467/1335 +f 1158/1452/1322 1166/1467/1335 1159/1454/1324 +f 1159/1454/1324 1166/1467/1335 1167/1468/1336 +f 1159/1454/1324 1167/1468/1336 1160/1456/1326 +f 1160/1456/1326 1167/1468/1336 1168/1469/1337 +f 1160/1456/1326 1168/1469/1337 1161/1458/1328 +f 1161/1458/1328 1168/1469/1337 1390/1470/708 +f 1161/1458/1328 1390/1470/708 1389/1460/707 +f 1149/1462/1330 1150/1471/1338 1169/1472/1339 +f 1149/1462/1330 1169/1472/1339 1162/1463/1331 +f 1162/1463/1331 1169/1472/1339 1170/1473/1340 +f 1162/1463/1331 1170/1473/1340 1163/1464/1332 +f 1163/1464/1332 1170/1473/1340 1171/1474/1341 +f 1163/1464/1332 1171/1474/1341 1164/1465/1333 +f 1164/1465/1333 1171/1474/1341 1172/1475/1342 +f 1164/1465/1333 1172/1475/1342 1165/1466/1334 +f 1165/1466/1334 1172/1475/1342 1173/1476/1343 +f 1165/1466/1334 1173/1476/1343 1166/1467/1335 +f 1166/1467/1335 1173/1476/1343 1174/1477/1344 +f 1166/1467/1335 1174/1477/1344 1167/1468/1336 +f 1167/1468/1336 1174/1477/1344 1175/1478/1345 +f 1167/1468/1336 1175/1478/1345 1168/1469/1337 +f 1168/1469/1337 1175/1478/1345 1391/1479/709 +f 1168/1469/1337 1391/1479/709 1390/1470/708 +f 1150/1471/1338 1151/1480/1346 1176/1481/1347 +f 1150/1471/1338 1176/1481/1347 1169/1472/1339 +f 1169/1472/1339 1176/1481/1347 1177/1482/1348 +f 1169/1472/1339 1177/1482/1348 1170/1473/1340 +f 1170/1473/1340 1177/1482/1348 1178/1483/1349 +f 1170/1473/1340 1178/1483/1349 1171/1474/1341 +f 1171/1474/1341 1178/1483/1349 1179/1484/1350 +f 1171/1474/1341 1179/1484/1350 1172/1475/1342 +f 1172/1475/1342 1179/1484/1350 1180/1485/1351 +f 1172/1475/1342 1180/1485/1351 1173/1476/1343 +f 1173/1476/1343 1180/1485/1351 1181/1486/1352 +f 1173/1476/1343 1181/1486/1352 1174/1477/1344 +f 1174/1477/1344 1181/1486/1352 1182/1487/1353 +f 1174/1477/1344 1182/1487/1353 1175/1478/1345 +f 1175/1478/1345 1182/1487/1353 1392/1488/710 +f 1175/1478/1345 1392/1488/710 1391/1479/709 +f 1151/1480/1346 1152/1489/1354 1183/1490/1355 +f 1151/1480/1346 1183/1490/1355 1176/1481/1347 +f 1176/1481/1347 1183/1490/1355 1184/1491/1356 +f 1176/1481/1347 1184/1491/1356 1177/1482/1348 +f 1177/1482/1348 1184/1491/1356 1185/1492/1357 +f 1177/1482/1348 1185/1492/1357 1178/1483/1349 +f 1178/1483/1349 1185/1492/1357 1186/1493/1358 +f 1178/1483/1349 1186/1493/1358 1179/1484/1350 +f 1179/1484/1350 1186/1493/1358 1187/1494/1359 +f 1179/1484/1350 1187/1494/1359 1180/1485/1351 +f 1180/1485/1351 1187/1494/1359 1188/1495/1360 +f 1180/1485/1351 1188/1495/1360 1181/1486/1352 +f 1181/1486/1352 1188/1495/1360 1189/1496/1361 +f 1181/1486/1352 1189/1496/1361 1182/1487/1353 +f 1182/1487/1353 1189/1496/1361 1393/1497/711 +f 1182/1487/1353 1393/1497/711 1392/1488/710 +f 1152/1489/1354 1153/1498/1362 1190/1499/1363 +f 1152/1489/1354 1190/1499/1363 1183/1490/1355 +f 1183/1490/1355 1190/1499/1363 1191/1500/1364 +f 1183/1490/1355 1191/1500/1364 1184/1491/1356 +f 1184/1491/1356 1191/1500/1364 1192/1501/1365 +f 1184/1491/1356 1192/1501/1365 1185/1492/1357 +f 1185/1492/1357 1192/1501/1365 1193/1502/1366 +f 1185/1492/1357 1193/1502/1366 1186/1493/1358 +f 1186/1493/1358 1193/1502/1366 1194/1503/1367 +f 1186/1493/1358 1194/1503/1367 1187/1494/1359 +f 1187/1494/1359 1194/1503/1367 1195/1504/1368 +f 1187/1494/1359 1195/1504/1368 1188/1495/1360 +f 1188/1495/1360 1195/1504/1368 1196/1505/1369 +f 1188/1495/1360 1196/1505/1369 1189/1496/1361 +f 1189/1496/1361 1196/1505/1369 1394/1506/712 +f 1189/1496/1361 1394/1506/712 1393/1497/711 +f 1153/1498/1362 1154/1507/1370 1197/1508/1371 +f 1153/1498/1362 1197/1508/1371 1190/1499/1363 +f 1190/1499/1363 1197/1508/1371 1198/1509/1372 +f 1190/1499/1363 1198/1509/1372 1191/1500/1364 +f 1191/1500/1364 1198/1509/1372 1199/1510/1373 +f 1191/1500/1364 1199/1510/1373 1192/1501/1365 +f 1192/1501/1365 1199/1510/1373 1200/1511/1374 +f 1192/1501/1365 1200/1511/1374 1193/1502/1366 +f 1193/1502/1366 1200/1511/1374 1201/1512/1375 +f 1193/1502/1366 1201/1512/1375 1194/1503/1367 +f 1194/1503/1367 1201/1512/1375 1202/1513/1376 +f 1194/1503/1367 1202/1513/1376 1195/1504/1368 +f 1195/1504/1368 1202/1513/1376 1203/1514/1377 +f 1195/1504/1368 1203/1514/1377 1196/1505/1369 +f 1196/1505/1369 1203/1514/1377 1395/1515/713 +f 1196/1505/1369 1395/1515/713 1394/1506/712 +f 1154/1507/1370 1493/1516/307 1492/1517/306 +f 1154/1507/1370 1492/1517/306 1197/1508/1371 +f 1197/1508/1371 1492/1517/306 1491/1518/316 +f 1197/1508/1371 1491/1518/316 1198/1509/1372 +f 1198/1509/1372 1491/1518/316 1490/1519/325 +f 1198/1509/1372 1490/1519/325 1199/1510/1373 +f 1199/1510/1373 1490/1519/325 1489/1520/334 +f 1199/1510/1373 1489/1520/334 1200/1511/1374 +f 1200/1511/1374 1489/1520/334 1488/1521/343 +f 1200/1511/1374 1488/1521/343 1201/1512/1375 +f 1201/1512/1375 1488/1521/343 1487/1522/352 +f 1201/1512/1375 1487/1522/352 1202/1513/1376 +f 1202/1513/1376 1487/1522/352 1486/1523/361 +f 1202/1513/1376 1486/1523/361 1203/1514/1377 +f 1203/1514/1377 1486/1523/361 1535/1524/370 +f 1203/1514/1377 1535/1524/370 1395/1515/713 +f 1126/1444/1314 1127/1447/1317 1204/1525/1378 +f 1126/1444/1314 1204/1525/1378 1134/1526/1379 +f 1134/1526/1379 1204/1525/1378 1205/1527/1380 +f 1134/1526/1379 1205/1527/1380 1135/1528/1381 +f 1135/1528/1381 1205/1527/1380 1206/1529/1382 +f 1135/1528/1381 1206/1529/1382 1136/1530/1383 +f 1136/1530/1383 1206/1529/1382 1207/1531/1384 +f 1136/1530/1383 1207/1531/1384 1137/1532/1385 +f 1137/1532/1385 1207/1531/1384 1208/1533/1386 +f 1137/1532/1385 1208/1533/1386 1138/1534/1387 +f 1138/1534/1387 1208/1533/1386 1209/1535/1388 +f 1138/1534/1387 1209/1535/1388 1139/1536/1389 +f 1139/1536/1389 1209/1535/1388 1210/1537/1390 +f 1139/1536/1389 1210/1537/1390 1140/1538/1391 +f 1140/1538/1391 1210/1537/1390 1372/1539/74 +f 1140/1538/1391 1372/1539/74 1373/1540/73 +f 1127/1447/1317 1128/1449/1319 1211/1541/1392 +f 1127/1447/1317 1211/1541/1392 1204/1525/1378 +f 1204/1525/1378 1211/1541/1392 1212/1542/1393 +f 1204/1525/1378 1212/1542/1393 1205/1527/1380 +f 1205/1527/1380 1212/1542/1393 1213/1543/1394 +f 1205/1527/1380 1213/1543/1394 1206/1529/1382 +f 1206/1529/1382 1213/1543/1394 1214/1544/1395 +f 1206/1529/1382 1214/1544/1395 1207/1531/1384 +f 1207/1531/1384 1214/1544/1395 1215/1545/1396 +f 1207/1531/1384 1215/1545/1396 1208/1533/1386 +f 1208/1533/1386 1215/1545/1396 1216/1546/1397 +f 1208/1533/1386 1216/1546/1397 1209/1535/1388 +f 1209/1535/1388 1216/1546/1397 1217/1547/1398 +f 1209/1535/1388 1217/1547/1398 1210/1537/1390 +f 1210/1537/1390 1217/1547/1398 1371/1548/75 +f 1210/1537/1390 1371/1548/75 1372/1539/74 +f 1128/1449/1319 1129/1451/1321 1218/1549/1399 +f 1128/1449/1319 1218/1549/1399 1211/1541/1392 +f 1211/1541/1392 1218/1549/1399 1219/1550/1400 +f 1211/1541/1392 1219/1550/1400 1212/1542/1393 +f 1212/1542/1393 1219/1550/1400 1220/1551/1401 +f 1212/1542/1393 1220/1551/1401 1213/1543/1394 +f 1213/1543/1394 1220/1551/1401 1221/1552/1402 +f 1213/1543/1394 1221/1552/1402 1214/1544/1395 +f 1214/1544/1395 1221/1552/1402 1222/1553/1403 +f 1214/1544/1395 1222/1553/1403 1215/1545/1396 +f 1215/1545/1396 1222/1553/1403 1223/1554/1404 +f 1215/1545/1396 1223/1554/1404 1216/1546/1397 +f 1216/1546/1397 1223/1554/1404 1224/1555/1405 +f 1216/1546/1397 1224/1555/1405 1217/1547/1398 +f 1217/1547/1398 1224/1555/1405 1370/1556/76 +f 1217/1547/1398 1370/1556/76 1371/1548/75 +f 1129/1451/1321 1130/1453/1323 1225/1557/1406 +f 1129/1451/1321 1225/1557/1406 1218/1549/1399 +f 1218/1549/1399 1225/1557/1406 1226/1558/1407 +f 1218/1549/1399 1226/1558/1407 1219/1550/1400 +f 1219/1550/1400 1226/1558/1407 1227/1559/1408 +f 1219/1550/1400 1227/1559/1408 1220/1551/1401 +f 1220/1551/1401 1227/1559/1408 1228/1560/1409 +f 1220/1551/1401 1228/1560/1409 1221/1552/1402 +f 1221/1552/1402 1228/1560/1409 1229/1561/1410 +f 1221/1552/1402 1229/1561/1410 1222/1553/1403 +f 1222/1553/1403 1229/1561/1410 1230/1562/1411 +f 1222/1553/1403 1230/1562/1411 1223/1554/1404 +f 1223/1554/1404 1230/1562/1411 1231/1563/1412 +f 1223/1554/1404 1231/1563/1412 1224/1555/1405 +f 1224/1555/1405 1231/1563/1412 1369/1564/77 +f 1224/1555/1405 1369/1564/77 1370/1556/76 +f 1130/1453/1323 1131/1455/1325 1232/1565/1413 +f 1130/1453/1323 1232/1565/1413 1225/1557/1406 +f 1225/1557/1406 1232/1565/1413 1233/1566/1414 +f 1225/1557/1406 1233/1566/1414 1226/1558/1407 +f 1226/1558/1407 1233/1566/1414 1234/1567/1415 +f 1226/1558/1407 1234/1567/1415 1227/1559/1408 +f 1227/1559/1408 1234/1567/1415 1235/1568/1416 +f 1227/1559/1408 1235/1568/1416 1228/1560/1409 +f 1228/1560/1409 1235/1568/1416 1236/1569/1417 +f 1228/1560/1409 1236/1569/1417 1229/1561/1410 +f 1229/1561/1410 1236/1569/1417 1237/1570/1418 +f 1229/1561/1410 1237/1570/1418 1230/1562/1411 +f 1230/1562/1411 1237/1570/1418 1238/1571/1419 +f 1230/1562/1411 1238/1571/1419 1231/1563/1412 +f 1231/1563/1412 1238/1571/1419 1368/1572/78 +f 1231/1563/1412 1368/1572/78 1369/1564/77 +f 1131/1455/1325 1132/1457/1327 1239/1573/1420 +f 1131/1455/1325 1239/1573/1420 1232/1565/1413 +f 1232/1565/1413 1239/1573/1420 1240/1574/1421 +f 1232/1565/1413 1240/1574/1421 1233/1566/1414 +f 1233/1566/1414 1240/1574/1421 1241/1575/1422 +f 1233/1566/1414 1241/1575/1422 1234/1567/1415 +f 1234/1567/1415 1241/1575/1422 1242/1576/1423 +f 1234/1567/1415 1242/1576/1423 1235/1568/1416 +f 1235/1568/1416 1242/1576/1423 1243/1577/1424 +f 1235/1568/1416 1243/1577/1424 1236/1569/1417 +f 1236/1569/1417 1243/1577/1424 1244/1578/1425 +f 1236/1569/1417 1244/1578/1425 1237/1570/1418 +f 1237/1570/1418 1244/1578/1425 1245/1579/1426 +f 1237/1570/1418 1245/1579/1426 1238/1571/1419 +f 1238/1571/1419 1245/1579/1426 1367/1580/79 +f 1238/1571/1419 1367/1580/79 1368/1572/78 +f 1132/1457/1327 1133/1459/1329 1246/1581/1427 +f 1132/1457/1327 1246/1581/1427 1239/1573/1420 +f 1239/1573/1420 1246/1581/1427 1247/1582/1428 +f 1239/1573/1420 1247/1582/1428 1240/1574/1421 +f 1240/1574/1421 1247/1582/1428 1248/1583/1429 +f 1240/1574/1421 1248/1583/1429 1241/1575/1422 +f 1241/1575/1422 1248/1583/1429 1249/1584/1430 +f 1241/1575/1422 1249/1584/1430 1242/1576/1423 +f 1242/1576/1423 1249/1584/1430 1250/1585/1431 +f 1242/1576/1423 1250/1585/1431 1243/1577/1424 +f 1243/1577/1424 1250/1585/1431 1251/1586/1432 +f 1243/1577/1424 1251/1586/1432 1244/1578/1425 +f 1244/1578/1425 1251/1586/1432 1252/1587/1433 +f 1244/1578/1425 1252/1587/1433 1245/1579/1426 +f 1245/1579/1426 1252/1587/1433 1366/1588/80 +f 1245/1579/1426 1366/1588/80 1367/1580/79 +f 1133/1459/1329 1388/1461/596 1387/1589/595 +f 1133/1459/1329 1387/1589/595 1246/1581/1427 +f 1246/1581/1427 1387/1589/595 1386/1590/605 +f 1246/1581/1427 1386/1590/605 1247/1582/1428 +f 1247/1582/1428 1386/1590/605 1385/1591/614 +f 1247/1582/1428 1385/1591/614 1248/1583/1429 +f 1248/1583/1429 1385/1591/614 1384/1592/623 +f 1248/1583/1429 1384/1592/623 1249/1584/1430 +f 1249/1584/1430 1384/1592/623 1383/1593/632 +f 1249/1584/1430 1383/1593/632 1250/1585/1431 +f 1250/1585/1431 1383/1593/632 1382/1594/641 +f 1250/1585/1431 1382/1594/641 1251/1586/1432 +f 1251/1586/1432 1382/1594/641 1381/1595/650 +f 1251/1586/1432 1381/1595/650 1252/1587/1433 +f 1252/1587/1433 1381/1595/650 1531/1596/81 +f 1252/1587/1433 1531/1596/81 1366/1588/80 +f 1126/1444/1314 1134/1526/1379 1253/1597/1434 +f 1126/1444/1314 1253/1597/1434 1141/1598/1435 +f 1141/1598/1435 1253/1597/1434 1254/1599/1436 +f 1141/1598/1435 1254/1599/1436 1142/1600/1437 +f 1142/1600/1437 1254/1599/1436 1255/1601/1438 +f 1142/1600/1437 1255/1601/1438 1143/1602/1439 +f 1143/1602/1439 1255/1601/1438 1256/1603/1440 +f 1143/1602/1439 1256/1603/1440 1144/1604/1441 +f 1144/1604/1441 1256/1603/1440 1257/1605/1442 +f 1144/1604/1441 1257/1605/1442 1145/1606/1443 +f 1145/1606/1443 1257/1605/1442 1258/1607/1444 +f 1145/1606/1443 1258/1607/1444 1146/1608/1445 +f 1146/1608/1445 1258/1607/1444 1259/1609/1446 +f 1146/1608/1445 1259/1609/1446 1147/1610/1447 +f 1147/1610/1447 1259/1609/1446 1462/1611/1307 +f 1147/1610/1447 1462/1611/1307 1463/1612/1209 +f 1134/1526/1379 1135/1528/1381 1260/1613/1448 +f 1134/1526/1379 1260/1613/1448 1253/1597/1434 +f 1253/1597/1434 1260/1613/1448 1261/1614/1449 +f 1253/1597/1434 1261/1614/1449 1254/1599/1436 +f 1254/1599/1436 1261/1614/1449 1262/1615/1450 +f 1254/1599/1436 1262/1615/1450 1255/1601/1438 +f 1255/1601/1438 1262/1615/1450 1263/1616/1451 +f 1255/1601/1438 1263/1616/1451 1256/1603/1440 +f 1256/1603/1440 1263/1616/1451 1264/1617/1452 +f 1256/1603/1440 1264/1617/1452 1257/1605/1442 +f 1257/1605/1442 1264/1617/1452 1265/1618/1453 +f 1257/1605/1442 1265/1618/1453 1258/1607/1444 +f 1258/1607/1444 1265/1618/1453 1266/1619/1454 +f 1258/1607/1444 1266/1619/1454 1259/1609/1446 +f 1259/1609/1446 1266/1619/1454 1461/1620/1308 +f 1259/1609/1446 1461/1620/1308 1462/1611/1307 +f 1135/1528/1381 1136/1530/1383 1267/1621/1455 +f 1135/1528/1381 1267/1621/1455 1260/1613/1448 +f 1260/1613/1448 1267/1621/1455 1268/1622/1456 +f 1260/1613/1448 1268/1622/1456 1261/1614/1449 +f 1261/1614/1449 1268/1622/1456 1269/1623/1457 +f 1261/1614/1449 1269/1623/1457 1262/1615/1450 +f 1262/1615/1450 1269/1623/1457 1270/1624/1458 +f 1262/1615/1450 1270/1624/1458 1263/1616/1451 +f 1263/1616/1451 1270/1624/1458 1271/1625/1459 +f 1263/1616/1451 1271/1625/1459 1264/1617/1452 +f 1264/1617/1452 1271/1625/1459 1272/1626/1460 +f 1264/1617/1452 1272/1626/1460 1265/1618/1453 +f 1265/1618/1453 1272/1626/1460 1273/1627/1461 +f 1265/1618/1453 1273/1627/1461 1266/1619/1454 +f 1266/1619/1454 1273/1627/1461 1460/1628/1309 +f 1266/1619/1454 1460/1628/1309 1461/1620/1308 +f 1136/1530/1383 1137/1532/1385 1274/1629/1462 +f 1136/1530/1383 1274/1629/1462 1267/1621/1455 +f 1267/1621/1455 1274/1629/1462 1275/1630/1463 +f 1267/1621/1455 1275/1630/1463 1268/1622/1456 +f 1268/1622/1456 1275/1630/1463 1276/1631/1464 +f 1268/1622/1456 1276/1631/1464 1269/1623/1457 +f 1269/1623/1457 1276/1631/1464 1277/1632/1465 +f 1269/1623/1457 1277/1632/1465 1270/1624/1458 +f 1270/1624/1458 1277/1632/1465 1278/1633/1466 +f 1270/1624/1458 1278/1633/1466 1271/1625/1459 +f 1271/1625/1459 1278/1633/1466 1279/1634/1467 +f 1271/1625/1459 1279/1634/1467 1272/1626/1460 +f 1272/1626/1460 1279/1634/1467 1280/1635/1468 +f 1272/1626/1460 1280/1635/1468 1273/1627/1461 +f 1273/1627/1461 1280/1635/1468 1459/1636/1310 +f 1273/1627/1461 1459/1636/1310 1460/1628/1309 +f 1137/1532/1385 1138/1534/1387 1281/1637/1469 +f 1137/1532/1385 1281/1637/1469 1274/1629/1462 +f 1274/1629/1462 1281/1637/1469 1282/1638/1470 +f 1274/1629/1462 1282/1638/1470 1275/1630/1463 +f 1275/1630/1463 1282/1638/1470 1283/1639/1471 +f 1275/1630/1463 1283/1639/1471 1276/1631/1464 +f 1276/1631/1464 1283/1639/1471 1284/1640/1472 +f 1276/1631/1464 1284/1640/1472 1277/1632/1465 +f 1277/1632/1465 1284/1640/1472 1285/1641/1473 +f 1277/1632/1465 1285/1641/1473 1278/1633/1466 +f 1278/1633/1466 1285/1641/1473 1286/1642/1474 +f 1278/1633/1466 1286/1642/1474 1279/1634/1467 +f 1279/1634/1467 1286/1642/1474 1287/1643/1475 +f 1279/1634/1467 1287/1643/1475 1280/1635/1468 +f 1280/1635/1468 1287/1643/1475 1458/1644/1311 +f 1280/1635/1468 1458/1644/1311 1459/1636/1310 +f 1138/1534/1387 1139/1536/1389 1288/1645/1476 +f 1138/1534/1387 1288/1645/1476 1281/1637/1469 +f 1281/1637/1469 1288/1645/1476 1289/1646/1477 +f 1281/1637/1469 1289/1646/1477 1282/1638/1470 +f 1282/1638/1470 1289/1646/1477 1290/1647/1478 +f 1282/1638/1470 1290/1647/1478 1283/1639/1471 +f 1283/1639/1471 1290/1647/1478 1291/1648/1479 +f 1283/1639/1471 1291/1648/1479 1284/1640/1472 +f 1284/1640/1472 1291/1648/1479 1292/1649/1480 +f 1284/1640/1472 1292/1649/1480 1285/1641/1473 +f 1285/1641/1473 1292/1649/1480 1293/1650/1481 +f 1285/1641/1473 1293/1650/1481 1286/1642/1474 +f 1286/1642/1474 1293/1650/1481 1294/1651/1482 +f 1286/1642/1474 1294/1651/1482 1287/1643/1475 +f 1287/1643/1475 1294/1651/1482 1457/1652/1312 +f 1287/1643/1475 1457/1652/1312 1458/1644/1311 +f 1139/1536/1389 1140/1538/1391 1295/1653/1483 +f 1139/1536/1389 1295/1653/1483 1288/1645/1476 +f 1288/1645/1476 1295/1653/1483 1296/1654/1484 +f 1288/1645/1476 1296/1654/1484 1289/1646/1477 +f 1289/1646/1477 1296/1654/1484 1297/1655/1485 +f 1289/1646/1477 1297/1655/1485 1290/1647/1478 +f 1290/1647/1478 1297/1655/1485 1298/1656/1486 +f 1290/1647/1478 1298/1656/1486 1291/1648/1479 +f 1291/1648/1479 1298/1656/1486 1299/1657/1487 +f 1291/1648/1479 1299/1657/1487 1292/1649/1480 +f 1292/1649/1480 1299/1657/1487 1300/1658/1488 +f 1292/1649/1480 1300/1658/1488 1293/1650/1481 +f 1293/1650/1481 1300/1658/1488 1301/1659/1489 +f 1293/1650/1481 1301/1659/1489 1294/1651/1482 +f 1294/1651/1482 1301/1659/1489 1456/1660/1313 +f 1294/1651/1482 1456/1660/1313 1457/1652/1312 +f 1140/1538/1391 1373/1540/73 1374/1661/233 +f 1140/1538/1391 1374/1661/233 1295/1653/1483 +f 1295/1653/1483 1374/1661/233 1375/1662/241 +f 1295/1653/1483 1375/1662/241 1296/1654/1484 +f 1296/1654/1484 1375/1662/241 1376/1663/249 +f 1296/1654/1484 1376/1663/249 1297/1655/1485 +f 1297/1655/1485 1376/1663/249 1377/1664/257 +f 1297/1655/1485 1377/1664/257 1298/1656/1486 +f 1298/1656/1486 1377/1664/257 1378/1665/265 +f 1298/1656/1486 1378/1665/265 1299/1657/1487 +f 1299/1657/1487 1378/1665/265 1379/1666/273 +f 1299/1657/1487 1379/1666/273 1300/1658/1488 +f 1300/1658/1488 1379/1666/273 1380/1667/281 +f 1300/1658/1488 1380/1667/281 1301/1659/1489 +f 1301/1659/1489 1380/1667/281 1534/1668/289 +f 1301/1659/1489 1534/1668/289 1456/1660/1313 +f 1126/1444/1314 1141/1598/1435 1302/1669/1490 +f 1126/1444/1314 1302/1669/1490 1148/1445/1315 +f 1148/1445/1315 1302/1669/1490 1303/1670/1491 +f 1148/1445/1315 1303/1670/1491 1149/1462/1330 +f 1149/1462/1330 1303/1670/1491 1304/1671/1492 +f 1149/1462/1330 1304/1671/1492 1150/1471/1338 +f 1150/1471/1338 1304/1671/1492 1305/1672/1493 +f 1150/1471/1338 1305/1672/1493 1151/1480/1346 +f 1151/1480/1346 1305/1672/1493 1306/1673/1494 +f 1151/1480/1346 1306/1673/1494 1152/1489/1354 +f 1152/1489/1354 1306/1673/1494 1307/1674/1495 +f 1152/1489/1354 1307/1674/1495 1153/1498/1362 +f 1153/1498/1362 1307/1674/1495 1308/1675/1496 +f 1153/1498/1362 1308/1675/1496 1154/1507/1370 +f 1154/1507/1370 1308/1675/1496 1494/1676/435 +f 1154/1507/1370 1494/1676/435 1493/1516/307 +f 1141/1598/1435 1142/1600/1437 1309/1677/1497 +f 1141/1598/1435 1309/1677/1497 1302/1669/1490 +f 1302/1669/1490 1309/1677/1497 1310/1678/1498 +f 1302/1669/1490 1310/1678/1498 1303/1670/1491 +f 1303/1670/1491 1310/1678/1498 1311/1679/1499 +f 1303/1670/1491 1311/1679/1499 1304/1671/1492 +f 1304/1671/1492 1311/1679/1499 1312/1680/1500 +f 1304/1671/1492 1312/1680/1500 1305/1672/1493 +f 1305/1672/1493 1312/1680/1500 1313/1681/1501 +f 1305/1672/1493 1313/1681/1501 1306/1673/1494 +f 1306/1673/1494 1313/1681/1501 1314/1682/1502 +f 1306/1673/1494 1314/1682/1502 1307/1674/1495 +f 1307/1674/1495 1314/1682/1502 1315/1683/1503 +f 1307/1674/1495 1315/1683/1503 1308/1675/1496 +f 1308/1675/1496 1315/1683/1503 1495/1684/436 +f 1308/1675/1496 1495/1684/436 1494/1676/435 +f 1142/1600/1437 1143/1602/1439 1316/1685/1504 +f 1142/1600/1437 1316/1685/1504 1309/1677/1497 +f 1309/1677/1497 1316/1685/1504 1317/1686/1505 +f 1309/1677/1497 1317/1686/1505 1310/1678/1498 +f 1310/1678/1498 1317/1686/1505 1318/1687/1506 +f 1310/1678/1498 1318/1687/1506 1311/1679/1499 +f 1311/1679/1499 1318/1687/1506 1319/1688/1507 +f 1311/1679/1499 1319/1688/1507 1312/1680/1500 +f 1312/1680/1500 1319/1688/1507 1320/1689/1508 +f 1312/1680/1500 1320/1689/1508 1313/1681/1501 +f 1313/1681/1501 1320/1689/1508 1321/1690/1509 +f 1313/1681/1501 1321/1690/1509 1314/1682/1502 +f 1314/1682/1502 1321/1690/1509 1322/1691/1510 +f 1314/1682/1502 1322/1691/1510 1315/1683/1503 +f 1315/1683/1503 1322/1691/1510 1496/1692/437 +f 1315/1683/1503 1496/1692/437 1495/1684/436 +f 1143/1602/1439 1144/1604/1441 1323/1693/1511 +f 1143/1602/1439 1323/1693/1511 1316/1685/1504 +f 1316/1685/1504 1323/1693/1511 1324/1694/1512 +f 1316/1685/1504 1324/1694/1512 1317/1686/1505 +f 1317/1686/1505 1324/1694/1512 1325/1695/1513 +f 1317/1686/1505 1325/1695/1513 1318/1687/1506 +f 1318/1687/1506 1325/1695/1513 1326/1696/1514 +f 1318/1687/1506 1326/1696/1514 1319/1688/1507 +f 1319/1688/1507 1326/1696/1514 1327/1697/1515 +f 1319/1688/1507 1327/1697/1515 1320/1689/1508 +f 1320/1689/1508 1327/1697/1515 1328/1698/1516 +f 1320/1689/1508 1328/1698/1516 1321/1690/1509 +f 1321/1690/1509 1328/1698/1516 1329/1699/1517 +f 1321/1690/1509 1329/1699/1517 1322/1691/1510 +f 1322/1691/1510 1329/1699/1517 1497/1700/438 +f 1322/1691/1510 1497/1700/438 1496/1692/437 +f 1144/1604/1441 1145/1606/1443 1330/1701/1518 +f 1144/1604/1441 1330/1701/1518 1323/1693/1511 +f 1323/1693/1511 1330/1701/1518 1331/1702/1519 +f 1323/1693/1511 1331/1702/1519 1324/1694/1512 +f 1324/1694/1512 1331/1702/1519 1332/1703/1520 +f 1324/1694/1512 1332/1703/1520 1325/1695/1513 +f 1325/1695/1513 1332/1703/1520 1333/1704/1521 +f 1325/1695/1513 1333/1704/1521 1326/1696/1514 +f 1326/1696/1514 1333/1704/1521 1334/1705/1522 +f 1326/1696/1514 1334/1705/1522 1327/1697/1515 +f 1327/1697/1515 1334/1705/1522 1335/1706/1523 +f 1327/1697/1515 1335/1706/1523 1328/1698/1516 +f 1328/1698/1516 1335/1706/1523 1336/1707/1524 +f 1328/1698/1516 1336/1707/1524 1329/1699/1517 +f 1329/1699/1517 1336/1707/1524 1498/1708/439 +f 1329/1699/1517 1498/1708/439 1497/1700/438 +f 1145/1606/1443 1146/1608/1445 1337/1709/1525 +f 1145/1606/1443 1337/1709/1525 1330/1701/1518 +f 1330/1701/1518 1337/1709/1525 1338/1710/1526 +f 1330/1701/1518 1338/1710/1526 1331/1702/1519 +f 1331/1702/1519 1338/1710/1526 1339/1711/1527 +f 1331/1702/1519 1339/1711/1527 1332/1703/1520 +f 1332/1703/1520 1339/1711/1527 1340/1712/1528 +f 1332/1703/1520 1340/1712/1528 1333/1704/1521 +f 1333/1704/1521 1340/1712/1528 1341/1713/1529 +f 1333/1704/1521 1341/1713/1529 1334/1705/1522 +f 1334/1705/1522 1341/1713/1529 1342/1714/1530 +f 1334/1705/1522 1342/1714/1530 1335/1706/1523 +f 1335/1706/1523 1342/1714/1530 1343/1715/1531 +f 1335/1706/1523 1343/1715/1531 1336/1707/1524 +f 1336/1707/1524 1343/1715/1531 1499/1716/440 +f 1336/1707/1524 1499/1716/440 1498/1708/439 +f 1146/1608/1445 1147/1610/1447 1344/1717/1532 +f 1146/1608/1445 1344/1717/1532 1337/1709/1525 +f 1337/1709/1525 1344/1717/1532 1345/1718/1533 +f 1337/1709/1525 1345/1718/1533 1338/1710/1526 +f 1338/1710/1526 1345/1718/1533 1346/1719/1534 +f 1338/1710/1526 1346/1719/1534 1339/1711/1527 +f 1339/1711/1527 1346/1719/1534 1347/1720/1535 +f 1339/1711/1527 1347/1720/1535 1340/1712/1528 +f 1340/1712/1528 1347/1720/1535 1348/1721/1536 +f 1340/1712/1528 1348/1721/1536 1341/1713/1529 +f 1341/1713/1529 1348/1721/1536 1349/1722/1537 +f 1341/1713/1529 1349/1722/1537 1342/1714/1530 +f 1342/1714/1530 1349/1722/1537 1350/1723/1538 +f 1342/1714/1530 1350/1723/1538 1343/1715/1531 +f 1343/1715/1531 1350/1723/1538 1500/1724/441 +f 1343/1715/1531 1500/1724/441 1499/1716/440 +f 1147/1610/1447 1463/1612/1209 1464/1725/1208 +f 1147/1610/1447 1464/1725/1208 1344/1717/1532 +f 1344/1717/1532 1464/1725/1208 1465/1726/1217 +f 1344/1717/1532 1465/1726/1217 1345/1718/1533 +f 1345/1718/1533 1465/1726/1217 1466/1727/1225 +f 1345/1718/1533 1466/1727/1225 1346/1719/1534 +f 1346/1719/1534 1466/1727/1225 1467/1728/1233 +f 1346/1719/1534 1467/1728/1233 1347/1720/1535 +f 1347/1720/1535 1467/1728/1233 1468/1729/1241 +f 1347/1720/1535 1468/1729/1241 1348/1721/1536 +f 1348/1721/1536 1468/1729/1241 1469/1730/1249 +f 1348/1721/1536 1469/1730/1249 1349/1722/1537 +f 1349/1722/1537 1469/1730/1249 1470/1731/1257 +f 1349/1722/1537 1470/1731/1257 1350/1723/1538 +f 1350/1723/1538 1470/1731/1257 1538/1732/442 +f 1350/1723/1538 1538/1732/442 1500/1724/441 diff --git a/res/models/asteroids/asteroid06.mtl b/res/models/asteroids/asteroid06.mtl new file mode 100644 index 0000000..68c3da6 --- /dev/null +++ b/res/models/asteroids/asteroid06.mtl @@ -0,0 +1,14 @@ +# Blender MTL File: 'asteroid.blend' +# Material Count: 1 +newmtl Material +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 1 +map_Kd limestone.jpg +map_Bump limestone.jpg + + diff --git a/res/models/asteroids/asteroid06.obj b/res/models/asteroids/asteroid06.obj new file mode 100644 index 0000000..a8c197f --- /dev/null +++ b/res/models/asteroids/asteroid06.obj @@ -0,0 +1,7887 @@ +# Blender v2.63 (sub 0) OBJ File: 'asteroid.blend' +# www.blender.org +mtllib asteroid06.mtl +o Cube +v 0.000000 -0.889361 -0.000000 +v 0.092512 -0.917532 -0.000000 +v 0.187446 -0.924751 -0.000000 +v 0.279769 -0.907356 -0.000000 +v 0.362419 -0.860934 -0.000000 +v 0.456870 -0.846487 -0.000000 +v 0.542851 -0.807937 0.000000 +v 0.612141 -0.743645 0.000000 +v 0.000000 -0.847539 0.086560 +v 0.000000 -0.787859 0.163832 +v -0.000000 -0.778077 0.245463 +v -0.000000 -0.801507 0.340596 +v -0.000000 -0.762458 0.416298 +v -0.000000 -0.724307 0.491095 +v -0.000000 -0.668538 0.553133 +v -0.086620 -0.848234 -0.000000 +v -0.174411 -0.849187 -0.000000 +v -0.270700 -0.873181 -0.000000 +v -0.366634 -0.872414 -0.000000 +v -0.458661 -0.850196 -0.000000 +v -0.533369 -0.792616 -0.000000 +v -0.615315 -0.747685 -0.000000 +v 0.000000 -0.908489 -0.091743 +v 0.000000 -0.922393 -0.187039 +v 0.000000 -0.948793 -0.290764 +v 0.000000 -0.939268 -0.391185 +v 0.000000 -0.920154 -0.492439 +v 0.000000 -0.844420 -0.565429 +v 0.000000 -0.751862 -0.618597 +v 0.093650 -0.931041 -0.093650 +v 0.187364 -0.924420 -0.093254 +v 0.280699 -0.911007 -0.092648 +v 0.368696 -0.878214 -0.090856 +v 0.450898 -0.834310 -0.088724 +v 0.529595 -0.786665 -0.087151 +v 0.595421 -0.722457 -0.084887 +v 0.094119 -0.934294 -0.189078 +v 0.191236 -0.944531 -0.191236 +v 0.290926 -0.947254 -0.192963 +v 0.374661 -0.893131 -0.185405 +v 0.456553 -0.845246 -0.180241 +v 0.520757 -0.772170 -0.171600 +v 0.583843 -0.707692 -0.166627 +v 0.094050 -0.926471 -0.284826 +v 0.190964 -0.936275 -0.287952 +v 0.284011 -0.916180 -0.284011 +v 0.375331 -0.890562 -0.280018 +v 0.453466 -0.836094 -0.269669 +v 0.518746 -0.767424 -0.257393 +v 0.572279 -0.692480 -0.245855 +v 0.093367 -0.904646 -0.378446 +v 0.187286 -0.903072 -0.378373 +v 0.280123 -0.890929 -0.375470 +v 0.368649 -0.863978 -0.368649 +v 0.454121 -0.830797 -0.361857 +v 0.518399 -0.762987 -0.344497 +v 0.570424 -0.688505 -0.328205 +v 0.094421 -0.890869 -0.478302 +v 0.184313 -0.865736 -0.466572 +v 0.273565 -0.849172 -0.459949 +v 0.358200 -0.821723 -0.449537 +v 0.435716 -0.783063 -0.435716 +v 0.496144 -0.721353 -0.413742 +v 0.556960 -0.668543 -0.402180 +v 0.090952 -0.821770 -0.551374 +v 0.176409 -0.794884 -0.534940 +v 0.268043 -0.801236 -0.540062 +v 0.351846 -0.780350 -0.529494 +v 0.430592 -0.752557 -0.516463 +v 0.481102 -0.684842 -0.481102 +v 0.533642 -0.633214 -0.462174 +v 0.087548 -0.744942 -0.613110 +v 0.173328 -0.736847 -0.606861 +v 0.261874 -0.739634 -0.609704 +v 0.343087 -0.721283 -0.596639 +v 0.417449 -0.695153 -0.578467 +v 0.473797 -0.649769 -0.547234 +v 0.508507 -0.590693 -0.508507 +v 0.088457 -0.870426 0.088457 +v 0.082345 -0.799906 0.165743 +v 0.081308 -0.785963 0.247331 +v 0.082155 -0.786627 0.334911 +v 0.080539 -0.753046 0.411524 +v 0.077273 -0.695437 0.472997 +v 0.076529 -0.651823 0.539855 +v 0.184723 -0.909212 0.091921 +v 0.174884 -0.852090 0.174884 +v 0.164461 -0.790704 0.248508 +v 0.161599 -0.767296 0.327674 +v 0.158049 -0.733564 0.401939 +v 0.156148 -0.699177 0.475176 +v 0.152407 -0.645823 0.534999 +v 0.274800 -0.888898 0.090643 +v 0.265637 -0.853920 0.175970 +v 0.247985 -0.786280 0.247985 +v 0.237572 -0.742166 0.318907 +v 0.233349 -0.714195 0.393041 +v 0.228121 -0.674491 0.460157 +v 0.227415 -0.638204 0.529201 +v 0.357979 -0.849161 0.088096 +v 0.347855 -0.821342 0.171824 +v 0.328472 -0.767321 0.244767 +v 0.314178 -0.724168 0.314178 +v 0.300629 -0.678886 0.377387 +v 0.293596 -0.642707 0.441542 +v 0.293210 -0.611427 0.508779 +v 0.452841 -0.838319 0.089128 +v 0.433656 -0.798424 0.170937 +v 0.411087 -0.750601 0.244196 +v 0.392916 -0.709630 0.313020 +v 0.376653 -0.669233 0.376653 +v 0.376301 -0.652014 0.450991 +v 0.373308 -0.618226 0.516290 +v 0.528203 -0.784421 0.086908 +v 0.508349 -0.752301 0.167394 +v 0.499516 -0.736921 0.247785 +v 0.481045 -0.704528 0.319758 +v 0.463819 -0.671713 0.386938 +v 0.456910 -0.648714 0.456910 +v 0.447872 -0.612846 0.516918 +v 0.599044 -0.727062 0.085432 +v 0.591935 -0.717942 0.168983 +v 0.566925 -0.685734 0.243563 +v 0.553972 -0.667934 0.318865 +v 0.543467 -0.651850 0.392602 +v 0.530902 -0.629878 0.459831 +v 0.506440 -0.588252 0.506440 +v -0.083041 -0.807221 0.083041 +v -0.164510 -0.792803 0.081722 +v -0.258644 -0.828359 0.085153 +v -0.353439 -0.836855 0.086926 +v -0.445665 -0.823509 0.087636 +v -0.524625 -0.778654 0.086283 +v -0.602611 -0.731597 0.085968 +v -0.081861 -0.794391 0.164785 +v -0.162942 -0.784581 0.162942 +v -0.250035 -0.796340 0.165487 +v -0.346269 -0.817095 0.171020 +v -0.447621 -0.826982 0.176612 +v -0.515358 -0.763524 0.169770 +v -0.592498 -0.718654 0.169146 +v -0.080233 -0.774110 0.244168 +v -0.162623 -0.780606 0.245772 +v -0.251045 -0.797315 0.251045 +v -0.346064 -0.813589 0.258001 +v -0.434233 -0.797295 0.258108 +v -0.513688 -0.759401 0.254866 +v -0.576908 -0.698312 0.247836 +v -0.083196 -0.797584 0.338953 +v -0.165397 -0.787371 0.335170 +v -0.252913 -0.795798 0.339299 +v -0.336934 -0.782577 0.336934 +v -0.422957 -0.769102 0.336990 +v -0.499319 -0.733127 0.331861 +v -0.566688 -0.683834 0.326084 +v -0.082084 -0.768388 0.418957 +v -0.166269 -0.774931 0.422168 +v -0.251435 -0.774895 0.423130 +v -0.330134 -0.752091 0.414364 +v -0.406121 -0.726026 0.406121 +v -0.478249 -0.693873 0.398903 +v -0.551796 -0.662155 0.398515 +v -0.082441 -0.743162 0.502606 +v -0.169093 -0.760328 0.513362 +v -0.246598 -0.733150 0.497138 +v -0.317621 -0.699479 0.477818 +v -0.390021 -0.677423 0.467537 +v -0.457962 -0.650285 0.457961 +v -0.530163 -0.628978 0.459199 +v -0.080625 -0.686432 0.567081 +v -0.168410 -0.715450 0.589968 +v -0.247770 -0.698120 0.576755 +v -0.311412 -0.651517 0.540842 +v -0.379600 -0.629191 0.525152 +v -0.436307 -0.596374 0.503393 +v -0.504957 -0.586500 0.504956 +v -0.089447 -0.881982 -0.089447 +v -0.092724 -0.918377 -0.186315 +v -0.097775 -0.967551 -0.295788 +v -0.099086 -0.964850 -0.400654 +v -0.098739 -0.933740 -0.499074 +v -0.093793 -0.848013 -0.567655 +v -0.089168 -0.758643 -0.623888 +v -0.180861 -0.886970 -0.089973 +v -0.190179 -0.938555 -0.190179 +v -0.195857 -0.963151 -0.295234 +v -0.193228 -0.934487 -0.390103 +v -0.189797 -0.893334 -0.480068 +v -0.182753 -0.824853 -0.553655 +v -0.177449 -0.754778 -0.621017 +v -0.276722 -0.896103 -0.091296 +v -0.284755 -0.924480 -0.188817 +v -0.283657 -0.914905 -0.283657 +v -0.281761 -0.896656 -0.377648 +v -0.274639 -0.852778 -0.461737 +v -0.268371 -0.802279 -0.540720 +v -0.257922 -0.728002 -0.600472 +v -0.372041 -0.887284 -0.091718 +v -0.377551 -0.900870 -0.186869 +v -0.366225 -0.866615 -0.273168 +v -0.355491 -0.830206 -0.355491 +v -0.342374 -0.782460 -0.429705 +v -0.331965 -0.733373 -0.499476 +v -0.323251 -0.677594 -0.561698 +v -0.461349 -0.855879 -0.090897 +v -0.459622 -0.851523 -0.181489 +v -0.446287 -0.821612 -0.265354 +v -0.424475 -0.772108 -0.338202 +v -0.406884 -0.727496 -0.406884 +v -0.396289 -0.689031 -0.475097 +v -0.378059 -0.626506 -0.522982 +v -0.538900 -0.801663 -0.088775 +v -0.530097 -0.787128 -0.174767 +v -0.515137 -0.761700 -0.255590 +v -0.490187 -0.718835 -0.325813 +v -0.469766 -0.680845 -0.391869 +v -0.460769 -0.654477 -0.460769 +v -0.447141 -0.611804 -0.516063 +v -0.612685 -0.744403 -0.087484 +v -0.594908 -0.721707 -0.169848 +v -0.582408 -0.705242 -0.250190 +v -0.560263 -0.675800 -0.322437 +v -0.551025 -0.661201 -0.397967 +v -0.526350 -0.624334 -0.455939 +v -0.502187 -0.583230 -0.502187 +v -0.000000 0.803014 0.000000 +v -0.000000 0.818677 -0.084106 +v -0.000000 0.845581 -0.173789 +v -0.000000 0.854533 -0.265751 +v 0.000000 0.834543 -0.352727 +v 0.000000 0.783063 -0.426247 +v 0.000000 0.729115 -0.494070 +v 0.000000 0.680717 -0.562702 +v -0.084361 0.821664 0.000000 +v -0.164080 0.789293 0.000000 +v -0.235068 0.738904 0.000000 +v -0.299935 0.690781 0.000000 +v -0.363393 0.652886 0.000000 +v -0.438122 0.638711 -0.000000 +v -0.518324 0.624232 -0.000000 +v -0.000000 0.772171 0.080152 +v -0.000000 0.749554 0.157225 +v -0.000000 0.727914 0.232152 +v -0.000000 0.689439 0.299442 +v -0.000000 0.674687 0.373919 +v -0.000000 0.651971 0.446328 +v -0.000000 0.611674 0.508458 +v 0.082227 0.796578 0.000000 +v 0.161779 0.775955 0.000000 +v 0.254246 0.811175 0.000000 +v 0.345226 0.814115 0.000000 +v 0.429417 0.789630 0.000000 +v 0.503495 0.744344 0.000000 +v 0.564940 0.683566 0.000000 +v 0.083916 0.817426 -0.083916 +v 0.086775 0.850478 -0.174524 +v 0.088880 0.869455 -0.269611 +v 0.087090 0.838577 -0.354075 +v 0.084653 0.793892 -0.431314 +v 0.081542 0.734859 -0.497455 +v 0.081181 0.691132 -0.570779 +v 0.167802 0.811765 -0.083383 +v 0.173898 0.846515 -0.173897 +v 0.177567 0.862689 -0.268013 +v 0.175724 0.841960 -0.355554 +v 0.173736 0.812511 -0.440545 +v 0.168067 0.755479 -0.510334 +v 0.162870 0.691345 -0.570937 +v 0.259481 0.831494 -0.085437 +v 0.261039 0.836953 -0.172881 +v 0.265077 0.847909 -0.265076 +v 0.267661 0.847361 -0.358904 +v 0.261618 0.809074 -0.440072 +v 0.252424 0.751648 -0.508800 +v 0.245997 0.692900 -0.572613 +v 0.350111 0.827832 -0.086069 +v 0.346167 0.816821 -0.170968 +v 0.341413 0.801356 -0.254502 +v 0.343607 0.799704 -0.343607 +v 0.334620 0.763222 -0.419987 +v 0.324383 0.715456 -0.488027 +v 0.315472 0.660459 -0.547993 +v 0.436483 0.804560 -0.085727 +v 0.421281 0.773117 -0.165908 +v 0.412729 0.753913 -0.245183 +v 0.416986 0.757281 -0.332226 +v 0.409940 0.733387 -0.409940 +v 0.400495 0.696819 -0.480168 +v 0.381871 0.633150 -0.528352 +v 0.503729 0.744973 -0.082636 +v 0.489728 0.722480 -0.161081 +v 0.485237 0.714272 -0.240650 +v 0.482513 0.706825 -0.320730 +v 0.482238 0.699999 -0.402211 +v 0.470995 0.669748 -0.470994 +v 0.443536 0.606669 -0.511846 +v 0.556213 0.672617 -0.078989 +v 0.551449 0.666660 -0.157196 +v 0.552480 0.667535 -0.237380 +v 0.548576 0.661187 -0.315802 +v 0.547231 0.656507 -0.395273 +v 0.535070 0.634954 -0.463395 +v 0.499250 0.579761 -0.499250 +v -0.084379 0.822831 -0.084379 +v -0.166197 0.802519 -0.082573 +v -0.238628 0.753349 -0.078351 +v -0.300510 0.693366 -0.073295 +v -0.366100 0.659297 -0.071096 +v -0.441539 0.644728 -0.071783 +v -0.506560 0.609499 -0.071522 +v -0.085788 0.839212 -0.172568 +v -0.168303 0.814885 -0.168302 +v -0.241766 0.765822 -0.159931 +v -0.303932 0.703713 -0.149571 +v -0.373109 0.674607 -0.146334 +v -0.442771 0.647284 -0.145162 +v -0.503909 0.606443 -0.143356 +v -0.086307 0.841084 -0.262040 +v -0.169694 0.819446 -0.256296 +v -0.241479 0.762825 -0.241479 +v -0.308734 0.715410 -0.229919 +v -0.380281 0.688453 -0.225679 +v -0.441430 0.644785 -0.218765 +v -0.507820 0.611265 -0.218263 +v -0.085761 0.824586 -0.348914 +v -0.171558 0.819936 -0.347330 +v -0.249957 0.785466 -0.335371 +v -0.316756 0.730785 -0.316756 +v -0.378520 0.681129 -0.301532 +v -0.439898 0.640134 -0.292507 +v -0.505735 0.607621 -0.291482 +v -0.082051 0.768063 -0.418800 +v -0.167903 0.783153 -0.426188 +v -0.253944 0.783318 -0.427305 +v -0.326859 0.743965 -0.410260 +v -0.380959 0.677532 -0.380959 +v -0.431115 0.621491 -0.359819 +v -0.496481 0.593718 -0.359245 +v -0.080019 0.720794 -0.488729 +v -0.164650 0.739340 -0.500256 +v -0.241907 0.718258 -0.487750 +v -0.309873 0.681170 -0.466120 +v -0.376889 0.653103 -0.451700 +v -0.428598 0.606433 -0.428598 +v -0.472737 0.559036 -0.410091 +v -0.079117 0.673690 -0.557057 +v -0.154615 0.655429 -0.542583 +v -0.229505 0.644356 -0.534084 +v -0.297493 0.620861 -0.516324 +v -0.372570 0.616939 -0.515250 +v -0.424658 0.579783 -0.489772 +v -0.458886 0.532094 -0.458887 +v -0.081264 0.786480 0.081264 +v -0.077600 0.745750 0.156339 +v -0.074891 0.715194 0.228446 +v -0.071823 0.677871 0.294794 +v -0.071620 0.664495 0.368619 +v -0.071512 0.642222 0.439983 +v -0.070390 0.599929 0.499031 +v -0.161232 0.773924 0.080068 +v -0.154706 0.738024 0.154706 +v -0.151291 0.718362 0.228907 +v -0.141947 0.663415 0.288885 +v -0.141488 0.650221 0.361184 +v -0.141580 0.630360 0.432203 +v -0.138298 0.584436 0.486535 +v -0.233935 0.735761 0.076756 +v -0.228006 0.715038 0.150686 +v -0.218410 0.679642 0.218409 +v -0.209046 0.642431 0.280986 +v -0.202251 0.609822 0.341303 +v -0.198225 0.579574 0.400319 +v -0.205709 0.574312 0.478491 +v -0.296897 0.683572 0.072364 +v -0.287872 0.660702 0.141434 +v -0.290028 0.666211 0.215847 +v -0.276268 0.626865 0.276267 +v -0.269301 0.601159 0.338125 +v -0.259085 0.561158 0.389434 +v -0.264142 0.547402 0.457573 +v -0.363739 0.654424 0.070605 +v -0.353597 0.634706 0.138405 +v -0.354540 0.636524 0.210207 +v -0.347649 0.620012 0.276899 +v -0.345307 0.608820 0.345307 +v -0.327298 0.561263 0.391896 +v -0.325661 0.535189 0.449175 +v -0.435655 0.635244 0.070756 +v -0.434851 0.634601 0.142477 +v -0.426522 0.621139 0.211317 +v -0.424342 0.615788 0.282204 +v -0.410921 0.590479 0.343074 +v -0.384119 0.540010 0.384119 +v -0.382148 0.519238 0.440061 +v -0.525190 0.633181 0.074324 +v -0.512984 0.617938 0.145998 +v -0.515635 0.621112 0.221608 +v -0.500956 0.601646 0.288769 +v -0.477147 0.569797 0.345520 +v -0.449175 0.530338 0.389942 +v -0.427024 0.494466 0.427024 +v 0.078011 0.748512 0.078011 +v 0.158618 0.758873 0.078750 +v 0.246844 0.784139 0.081143 +v 0.331350 0.776973 0.081238 +v 0.412767 0.755613 0.080797 +v 0.485346 0.715342 0.079429 +v 0.560787 0.678432 0.079678 +v 0.075597 0.722895 0.152371 +v 0.154521 0.736978 0.154521 +v 0.230933 0.725842 0.152653 +v 0.306823 0.711454 0.151035 +v 0.376646 0.681842 0.147771 +v 0.460066 0.674980 0.151026 +v 0.551609 0.666862 0.157243 +v 0.073949 0.704817 0.225677 +v 0.150717 0.715210 0.228053 +v 0.228828 0.717209 0.228828 +v 0.298174 0.687638 0.221976 +v 0.360527 0.648602 0.213806 +v 0.433829 0.632728 0.214967 +v 0.536052 0.646836 0.230348 +v 0.074568 0.706774 0.305456 +v 0.151580 0.714333 0.307898 +v 0.224844 0.697666 0.301988 +v 0.290504 0.663405 0.290504 +v 0.354045 0.632676 0.282004 +v 0.417221 0.604644 0.277488 +v 0.508905 0.611584 0.293282 +v 0.074599 0.694077 0.382952 +v 0.150318 0.694661 0.382916 +v 0.221563 0.674639 0.373433 +v 0.292800 0.659464 0.367576 +v 0.345521 0.609234 0.345522 +v 0.413167 0.593929 0.344937 +v 0.487137 0.582157 0.352612 +v 0.073730 0.662718 0.452699 +v 0.150082 0.670527 0.457286 +v 0.221344 0.652976 0.446594 +v 0.287407 0.628083 0.432198 +v 0.346064 0.596017 0.414527 +v 0.417240 0.589472 0.417240 +v 0.486308 0.575565 0.421697 +v 0.072190 0.615150 0.511005 +v 0.150913 0.639326 0.529870 +v 0.223107 0.625524 0.519137 +v 0.284688 0.592657 0.493767 +v 0.346894 0.572193 0.479084 +v 0.409806 0.558631 0.472405 +v 0.481562 0.558873 0.481562 +v 0.839225 0.000000 0.000000 +v 0.785727 0.000000 -0.081305 +v 0.772915 0.000000 -0.161254 +v 0.710475 0.000000 -0.227523 +v 0.680058 0.000000 -0.295997 +v 0.633586 0.000000 -0.354074 +v 0.600040 0.000000 -0.414189 +v 0.601390 0.000000 -0.500378 +v 0.854429 0.087146 0.000000 +v 0.896267 0.182533 0.000000 +v 0.898631 0.277453 0.000000 +v 0.877448 0.368483 0.000000 +v 0.825792 0.446878 0.000000 +v 0.765311 0.516471 0.000000 +v 0.712130 0.587381 0.000000 +v 0.905636 0.000000 0.091501 +v 0.922684 0.000000 0.187090 +v 0.914784 0.000000 0.281740 +v 0.877746 0.000000 0.368593 +v 0.850674 0.000000 0.458892 +v 0.797184 0.000000 0.536197 +v 0.746668 0.000000 0.614516 +v 0.817916 -0.084042 0.000000 +v 0.793275 -0.164767 0.000000 +v 0.771221 -0.243644 0.000000 +v 0.772015 -0.329766 0.000000 +v 0.762412 -0.416275 0.000000 +v 0.743219 -0.502799 0.000000 +v 0.699980 -0.577836 0.000000 +v 0.787865 -0.081383 -0.081383 +v 0.757797 -0.078655 -0.158431 +v 0.683771 -0.072041 -0.220061 +v 0.647281 -0.068916 -0.283510 +v 0.613942 -0.066527 -0.344124 +v 0.605262 -0.067510 -0.417054 +v 0.587040 -0.068864 -0.488891 +v 0.753760 -0.157730 -0.078301 +v 0.726142 -0.152604 -0.152604 +v 0.658304 -0.140357 -0.212633 +v 0.625764 -0.134824 -0.274826 +v 0.598971 -0.131304 -0.336122 +v 0.605550 -0.136327 -0.416710 +v 0.570730 -0.135148 -0.475714 +v 0.771664 -0.243515 -0.080011 +v 0.735869 -0.233650 -0.154478 +v 0.670566 -0.215892 -0.215892 +v 0.619561 -0.202504 -0.272290 +v 0.605436 -0.200944 -0.339129 +v 0.577203 -0.197478 -0.398824 +v 0.552449 -0.198281 -0.461138 +v 0.776838 -0.331301 -0.081225 +v 0.752969 -0.322324 -0.158889 +v 0.690413 -0.299230 -0.222769 +v 0.623555 -0.274978 -0.274978 +v 0.611267 -0.273374 -0.343230 +v 0.570100 -0.262869 -0.395147 +v 0.537224 -0.259520 -0.449433 +v 0.769391 -0.419443 -0.082185 +v 0.738095 -0.404155 -0.158949 +v 0.681505 -0.376837 -0.223609 +v 0.627911 -0.351638 -0.280083 +v 0.614086 -0.348039 -0.348038 +v 0.577897 -0.336279 -0.402727 +v 0.550089 -0.334211 -0.461218 +v 0.747205 -0.505114 -0.082878 +v 0.719971 -0.488161 -0.160550 +v 0.674054 -0.459882 -0.227984 +v 0.651939 -0.447441 -0.297502 +v 0.611424 -0.424560 -0.354383 +v 0.583959 -0.413549 -0.413549 +v 0.562436 -0.412478 -0.475528 +v 0.679207 -0.561397 -0.079769 +v 0.658535 -0.545035 -0.155329 +v 0.641627 -0.531918 -0.228578 +v 0.641468 -0.532805 -0.306849 +v 0.614127 -0.512977 -0.370956 +v 0.566937 -0.479224 -0.415638 +v 0.542740 -0.467901 -0.467901 +v 0.822136 0.084319 -0.084319 +v 0.868212 0.177604 -0.088329 +v 0.885782 0.273968 -0.090360 +v 0.869872 0.365619 -0.090063 +v 0.831877 0.449719 -0.088479 +v 0.756435 0.510840 -0.083877 +v 0.689994 0.569883 -0.081046 +v 0.782477 0.080818 -0.162716 +v 0.805827 0.166700 -0.166700 +v 0.837257 0.261122 -0.172937 +v 0.859796 0.362214 -0.179098 +v 0.826904 0.447583 -0.176596 +v 0.761966 0.514385 -0.169440 +v 0.693442 0.572594 -0.163352 +v 0.728790 0.076123 -0.232074 +v 0.758011 0.158509 -0.239649 +v 0.767992 0.242913 -0.242912 +v 0.785171 0.335259 -0.249873 +v 0.783159 0.427226 -0.253896 +v 0.744495 0.504290 -0.250171 +v 0.692729 0.572477 -0.245939 +v 0.674081 0.071462 -0.293395 +v 0.701147 0.149085 -0.302974 +v 0.716943 0.230358 -0.309316 +v 0.725169 0.314568 -0.314567 +v 0.755294 0.415982 -0.331425 +v 0.733411 0.499501 -0.331981 +v 0.671293 0.556659 -0.320390 +v 0.636409 0.068790 -0.355010 +v 0.643568 0.140166 -0.357930 +v 0.646026 0.213038 -0.359249 +v 0.672784 0.298169 -0.374304 +v 0.699871 0.392550 -0.392550 +v 0.679641 0.468982 -0.391219 +v 0.644863 0.537819 -0.388592 +v 0.617172 0.068799 -0.424443 +v 0.596874 0.134490 -0.411292 +v 0.618526 0.210494 -0.424875 +v 0.621794 0.284745 -0.428179 +v 0.626361 0.362449 -0.434286 +v 0.604147 0.427067 -0.427067 +v 0.604113 0.509747 -0.441740 +v 0.594128 0.069703 -0.494467 +v 0.575113 0.136155 -0.479174 +v 0.561829 0.201468 -0.468583 +v 0.554284 0.267266 -0.463077 +v 0.558061 0.338785 -0.467661 +v 0.561848 0.412065 -0.475045 +v 0.554803 0.478116 -0.478115 +v 0.914998 0.092276 0.092276 +v 0.961955 0.096542 0.193882 +v 0.940255 0.095300 0.288505 +v 0.911823 0.094049 0.381094 +v 0.880331 0.093359 0.473197 +v 0.837651 0.092671 0.561226 +v 0.775820 0.091201 0.637401 +v 0.918588 0.186351 0.092743 +v 0.939482 0.190343 0.190343 +v 0.961736 0.195600 0.294851 +v 0.932446 0.192843 0.389341 +v 0.903539 0.191825 0.485059 +v 0.857954 0.189760 0.574325 +v 0.798262 0.187444 0.655347 +v 0.913584 0.281387 0.092882 +v 0.904690 0.279393 0.185214 +v 0.927565 0.287169 0.287169 +v 0.931844 0.291826 0.391027 +v 0.907066 0.290815 0.488647 +v 0.852776 0.284277 0.572555 +v 0.796791 0.281292 0.655070 +v 0.861957 0.362699 0.089312 +v 0.851160 0.358989 0.177465 +v 0.871596 0.368119 0.274593 +v 0.878039 0.374127 0.374128 +v 0.873142 0.378924 0.475510 +v 0.840799 0.377427 0.568120 +v 0.786478 0.372686 0.648781 +v 0.815962 0.442008 0.086876 +v 0.801896 0.435354 0.171628 +v 0.808452 0.439764 0.261433 +v 0.811436 0.444341 0.354053 +v 0.799736 0.444367 0.444368 +v 0.775138 0.442785 0.531168 +v 0.738018 0.442045 0.613113 +v 0.782407 0.526953 0.086690 +v 0.777410 0.524029 0.172710 +v 0.742930 0.503304 0.249679 +v 0.735085 0.500571 0.332690 +v 0.728331 0.500687 0.417510 +v 0.710527 0.498301 0.498301 +v 0.673516 0.490471 0.566732 +v 0.713631 0.588478 0.083843 +v 0.703602 0.580615 0.165687 +v 0.685217 0.566515 0.243388 +v 0.662073 0.549285 0.316205 +v 0.658674 0.548983 0.396518 +v 0.645461 0.543697 0.470773 +v 0.614221 0.528430 0.528430 +v 0.868992 -0.088334 0.088334 +v 0.812510 -0.167931 0.083449 +v 0.785548 -0.247220 0.081271 +v 0.782530 -0.333400 0.081766 +v 0.758568 -0.414199 0.081095 +v 0.757859 -0.511724 0.084032 +v 0.713364 -0.588268 0.083811 +v 0.878131 -0.089198 0.179326 +v 0.831605 -0.171260 0.171260 +v 0.815809 -0.255311 0.169032 +v 0.817527 -0.346430 0.171102 +v 0.801347 -0.435085 0.171518 +v 0.774186 -0.522016 0.172027 +v 0.696359 -0.574896 0.164022 +v 0.881939 -0.090012 0.272943 +v 0.854627 -0.176099 0.265829 +v 0.849118 -0.265412 0.265412 +v 0.834086 -0.353857 0.263864 +v 0.820732 -0.445851 0.265092 +v 0.765012 -0.517225 0.256633 +v 0.719309 -0.593573 0.254969 +v 0.847218 -0.087911 0.357263 +v 0.842885 -0.175899 0.355899 +v 0.856111 -0.270164 0.362232 +v 0.832868 -0.356528 0.356528 +v 0.810998 -0.444120 0.353877 +v 0.753236 -0.512171 0.340373 +v 0.708950 -0.586776 0.337487 +v 0.812765 -0.086554 0.440459 +v 0.803870 -0.172019 0.436320 +v 0.813225 -0.262855 0.442130 +v 0.819828 -0.357436 0.448580 +v 0.799637 -0.444316 0.444316 +v 0.752147 -0.516196 0.430370 +v 0.686726 -0.571656 0.412614 +v 0.778069 -0.086220 0.524262 +v 0.775648 -0.172337 0.522929 +v 0.785173 -0.262984 0.529936 +v 0.785244 -0.353919 0.532624 +v 0.751934 -0.430255 0.516057 +v 0.715629 -0.501718 0.501718 +v 0.665214 -0.559915 0.484642 +v 0.721230 -0.084742 0.594456 +v 0.707646 -0.166617 0.583808 +v 0.718620 -0.254735 0.593026 +v 0.730937 -0.347470 0.604361 +v 0.706408 -0.423907 0.587564 +v 0.663246 -0.483260 0.558299 +v 0.621166 -0.534311 0.534311 +v -0.000000 0.000000 0.838876 +v 0.086604 0.000000 0.848059 +v 0.177127 0.000000 0.864931 +v 0.274213 0.000000 0.886421 +v 0.367316 0.000000 0.874270 +v 0.462848 0.000000 0.858868 +v 0.534838 0.000000 0.794990 +v 0.625168 0.000000 0.760226 +v -0.000000 0.088615 0.871703 +v -0.000000 0.178132 0.870756 +v -0.000000 0.260408 0.834397 +v -0.000000 0.337840 0.794002 +v -0.000000 0.404832 0.738711 +v -0.000000 0.467378 0.685985 +v -0.000000 0.519381 0.625577 +v -0.083519 0.000000 0.811768 +v -0.168123 0.000000 0.812730 +v -0.246299 0.000000 0.781226 +v -0.329816 0.000000 0.772152 +v -0.415726 0.000000 0.761274 +v -0.496983 0.000000 0.733820 +v -0.577709 0.000000 0.699818 +v -0.000000 -0.086055 0.841598 +v -0.000000 -0.171533 0.832499 +v -0.000000 -0.257026 0.821652 +v -0.000000 -0.334786 0.785685 +v -0.000000 -0.418714 0.767463 +v -0.000000 -0.487744 0.718892 +v -0.000000 -0.563447 0.681665 +v 0.086396 -0.086397 0.846380 +v 0.179868 -0.089472 0.881253 +v 0.274476 -0.090533 0.887685 +v 0.363939 -0.089631 0.865319 +v 0.454604 -0.089494 0.841959 +v 0.530231 -0.087262 0.787691 +v 0.607378 -0.086685 0.737656 +v 0.087055 -0.175079 0.853672 +v 0.178287 -0.178287 0.871328 +v 0.269268 -0.178411 0.867322 +v 0.358664 -0.177300 0.850289 +v 0.445390 -0.175706 0.822421 +v 0.524968 -0.173028 0.778914 +v 0.593551 -0.169453 0.719989 +v 0.087505 -0.265566 0.854297 +v 0.172491 -0.260459 0.834811 +v 0.253376 -0.253377 0.805722 +v 0.340512 -0.253825 0.798989 +v 0.427543 -0.254087 0.783798 +v 0.515930 -0.255986 0.762958 +v 0.580401 -0.249331 0.702714 +v 0.083213 -0.339022 0.797771 +v 0.162217 -0.328895 0.770564 +v 0.238176 -0.319710 0.744276 +v 0.322781 -0.322781 0.746251 +v 0.409161 -0.325982 0.741789 +v 0.506757 -0.336787 0.744768 +v 0.573943 -0.330202 0.692905 +v 0.081568 -0.416476 0.763266 +v 0.160980 -0.409152 0.748315 +v 0.232341 -0.391364 0.710812 +v 0.317283 -0.398259 0.720207 +v 0.401825 -0.401825 0.717745 +v 0.488441 -0.407356 0.709525 +v 0.578435 -0.417426 0.695113 +v 0.079245 -0.484297 0.713651 +v 0.157010 -0.477720 0.703251 +v 0.226978 -0.457869 0.670860 +v 0.306933 -0.461681 0.674224 +v 0.394200 -0.472577 0.685162 +v 0.472309 -0.472310 0.671712 +v 0.556221 -0.481483 0.660715 +v 0.078493 -0.552913 0.668422 +v 0.152400 -0.534974 0.645791 +v 0.222570 -0.517882 0.623943 +v 0.297897 -0.517036 0.621751 +v 0.375910 -0.519955 0.622760 +v 0.447437 -0.516409 0.612226 +v 0.521365 -0.521366 0.605879 +v 0.089381 0.089381 0.881218 +v 0.091237 0.183367 0.901402 +v 0.089417 0.271194 0.875387 +v 0.084924 0.345664 0.815777 +v 0.080454 0.411117 0.752208 +v 0.077106 0.472044 0.693900 +v 0.075342 0.531959 0.641786 +v 0.176913 0.087981 0.864236 +v 0.182901 0.182902 0.897416 +v 0.179377 0.270707 0.872633 +v 0.175498 0.355107 0.840764 +v 0.167863 0.426092 0.782956 +v 0.154391 0.469994 0.690879 +v 0.151628 0.532323 0.642434 +v 0.270688 0.089246 0.873493 +v 0.275047 0.182294 0.888651 +v 0.273021 0.273021 0.876554 +v 0.267017 0.358049 0.845111 +v 0.255201 0.429397 0.787538 +v 0.238805 0.481542 0.708411 +v 0.234281 0.545243 0.658416 +v 0.366928 0.090401 0.873423 +v 0.371895 0.184004 0.885725 +v 0.365030 0.272269 0.863472 +v 0.356776 0.356777 0.833506 +v 0.345118 0.433144 0.789269 +v 0.317788 0.478071 0.699874 +v 0.304098 0.527960 0.635410 +v 0.454995 0.089576 0.842766 +v 0.455474 0.179803 0.843042 +v 0.453487 0.269681 0.836136 +v 0.445754 0.355181 0.814235 +v 0.424298 0.424298 0.761057 +v 0.397353 0.476379 0.691002 +v 0.372688 0.515417 0.617145 +v 0.546237 0.090055 0.813490 +v 0.546229 0.180236 0.812962 +v 0.544656 0.270338 0.808523 +v 0.533768 0.354676 0.787040 +v 0.512616 0.427401 0.746649 +v 0.481094 0.481095 0.684831 +v 0.446192 0.514953 0.610453 +v 0.640756 0.091706 0.780086 +v 0.643502 0.183995 0.783259 +v 0.622049 0.267158 0.755188 +v 0.610649 0.351040 0.738800 +v 0.593030 0.427788 0.713172 +v 0.555133 0.480553 0.659390 +v 0.506696 0.506696 0.588555 +v -0.086368 0.086368 0.846042 +v -0.172076 0.085540 0.836379 +v -0.249117 0.081915 0.792656 +v -0.334641 0.082085 0.785894 +v -0.419067 0.082107 0.768613 +v -0.501801 0.082300 0.741865 +v -0.593930 0.084663 0.720561 +v -0.086224 0.173430 0.844178 +v -0.170471 0.170471 0.827142 +v -0.253207 0.167619 0.808045 +v -0.334435 0.165025 0.785403 +v -0.413684 0.162821 0.757581 +v -0.488740 0.160746 0.720898 +v -0.568870 0.162268 0.688726 +v -0.082638 0.251244 0.800628 +v -0.165613 0.250221 0.797025 +v -0.245707 0.245707 0.778068 +v -0.313382 0.233415 0.727633 +v -0.397581 0.236077 0.723352 +v -0.480455 0.238262 0.706686 +v -0.549029 0.235902 0.663186 +v -0.080398 0.328088 0.768129 +v -0.158831 0.322210 0.752662 +v -0.237511 0.318825 0.741950 +v -0.306909 0.306908 0.705510 +v -0.384186 0.306054 0.692347 +v -0.471990 0.313761 0.690358 +v -0.527242 0.303691 0.634512 +v -0.076805 0.393565 0.715980 +v -0.151507 0.385840 0.700643 +v -0.228517 0.385002 0.697977 +v -0.298134 0.374261 0.672697 +v -0.366897 0.366897 0.650430 +v -0.441904 0.368766 0.638059 +v -0.505634 0.365743 0.605042 +v -0.076782 0.470182 0.690898 +v -0.151672 0.461972 0.678033 +v -0.224782 0.453473 0.663887 +v -0.288223 0.433430 0.630011 +v -0.363920 0.436060 0.629084 +v -0.428332 0.428332 0.606036 +v -0.478299 0.414847 0.565810 +v -0.074524 0.526517 0.634869 +v -0.147760 0.519037 0.625605 +v -0.217183 0.505294 0.608083 +v -0.284906 0.494150 0.593136 +v -0.348037 0.480693 0.574184 +v -0.406367 0.468383 0.553732 +v -0.450526 0.450526 0.522220 +v -0.082599 -0.082598 0.802049 +v -0.084130 -0.169281 0.820279 +v -0.082373 -0.250464 0.797704 +v -0.081691 -0.333108 0.781739 +v -0.083321 -0.424908 0.780670 +v -0.082927 -0.505393 0.747655 +v -0.081905 -0.575592 0.697251 +v -0.160467 -0.079683 0.769521 +v -0.164331 -0.164331 0.792435 +v -0.164407 -0.248426 0.790401 +v -0.160451 -0.325407 0.761224 +v -0.161305 -0.409951 0.749948 +v -0.164244 -0.499057 0.737420 +v -0.160533 -0.562910 0.681177 +v -0.243464 -0.079994 0.771471 +v -0.241161 -0.159525 0.763589 +v -0.235829 -0.235829 0.742451 +v -0.232200 -0.311766 0.723383 +v -0.235047 -0.395866 0.719895 +v -0.238311 -0.480553 0.706842 +v -0.238730 -0.555634 0.671508 +v -0.320102 -0.078340 0.746478 +v -0.312917 -0.154123 0.727775 +v -0.307561 -0.229037 0.712325 +v -0.303456 -0.303456 0.696649 +v -0.306493 -0.384736 0.693435 +v -0.308721 -0.464380 0.678447 +v -0.306318 -0.531869 0.640297 +v -0.402560 -0.078675 0.734546 +v -0.386176 -0.151644 0.701330 +v -0.374594 -0.222261 0.676981 +v -0.378934 -0.301863 0.681949 +v -0.373649 -0.373648 0.663442 +v -0.368831 -0.441983 0.638181 +v -0.363954 -0.503114 0.601924 +v -0.483417 -0.079092 0.712232 +v -0.467170 -0.153434 0.686357 +v -0.445195 -0.220646 0.650756 +v -0.435292 -0.289456 0.632926 +v -0.429911 -0.358821 0.619642 +v -0.428761 -0.428761 0.606677 +v -0.422604 -0.487370 0.576858 +v -0.561485 -0.079783 0.679318 +v -0.530375 -0.151061 0.639966 +v -0.512914 -0.220444 0.617683 +v -0.496811 -0.286416 0.596463 +v -0.498898 -0.360961 0.596708 +v -0.493116 -0.427518 0.583856 +v -0.491833 -0.491833 0.571002 +v -0.833279 0.000000 -0.000000 +v -0.818984 0.000000 0.084132 +v -0.800433 0.000000 0.166001 +v -0.827254 0.000000 0.258512 +v -0.848257 0.000000 0.357763 +v -0.853924 0.000000 0.460461 +v -0.814281 0.000000 0.546777 +v -0.743047 0.000000 0.611671 +v -0.806922 0.083107 -0.000000 +v -0.787567 0.163782 -0.000000 +v -0.783100 0.246796 -0.000000 +v -0.764050 0.326841 -0.000000 +v -0.743246 0.407022 -0.000000 +v -0.711551 0.483200 -0.000000 +v -0.655563 0.542940 -0.000000 +v -0.851482 0.000000 -0.086896 +v -0.819226 0.000000 -0.169243 +v -0.791251 0.000000 -0.248959 +v -0.755952 0.000000 -0.323867 +v -0.740598 0.000000 -0.405743 +v -0.668362 0.000000 -0.456472 +v -0.609080 0.000000 -0.506420 +v -0.855111 -0.087204 -0.000000 +v -0.852712 -0.175019 -0.000000 +v -0.850262 -0.264618 -0.000000 +v -0.834440 -0.352690 -0.000000 +v -0.815380 -0.441850 -0.000000 +v -0.777560 -0.524051 -0.000000 +v -0.711275 -0.586709 -0.000000 +v -0.840727 -0.085912 0.085912 +v -0.817423 -0.083879 0.168784 +v -0.831417 -0.085430 0.259460 +v -0.846829 -0.087874 0.357118 +v -0.837909 -0.089086 0.452641 +v -0.789253 -0.087431 0.531200 +v -0.716308 -0.084159 0.590583 +v -0.844590 -0.173502 0.086259 +v -0.842728 -0.173228 0.173227 +v -0.862248 -0.177487 0.267893 +v -0.856428 -0.178461 0.360956 +v -0.831617 -0.177533 0.449888 +v -0.754912 -0.167947 0.509980 +v -0.681811 -0.160679 0.563411 +v -0.862664 -0.267799 0.088264 +v -0.855361 -0.266027 0.176233 +v -0.853824 -0.266717 0.266717 +v -0.839666 -0.265460 0.355979 +v -0.795622 -0.257610 0.433404 +v -0.712739 -0.240169 0.484270 +v -0.649084 -0.231112 0.537836 +v -0.838074 -0.353889 0.087042 +v -0.823350 -0.348605 0.172204 +v -0.837490 -0.355151 0.264837 +v -0.812595 -0.348629 0.348629 +v -0.771613 -0.338002 0.424225 +v -0.708668 -0.321510 0.483690 +v -0.637279 -0.304947 0.529454 +v -0.815890 -0.441973 0.086868 +v -0.805725 -0.437226 0.172388 +v -0.795606 -0.433396 0.257605 +v -0.785800 -0.431392 0.343720 +v -0.753074 -0.420156 0.420156 +v -0.687020 -0.395203 0.473786 +v -0.632558 -0.381532 0.527874 +v -0.772110 -0.520565 0.085575 +v -0.760602 -0.513533 0.169151 +v -0.764423 -0.516854 0.256447 +v -0.751346 -0.510961 0.339571 +v -0.728430 -0.500752 0.417563 +v -0.670236 -0.471321 0.471321 +v -0.632284 -0.461521 0.532878 +v -0.716850 -0.591010 0.084223 +v -0.716019 -0.590417 0.168541 +v -0.713723 -0.589140 0.253071 +v -0.704969 -0.583592 0.335680 +v -0.693175 -0.576868 0.416314 +v -0.663635 -0.558619 0.483533 +v -0.614286 -0.528485 0.528485 +v -0.790885 0.081642 0.081642 +v -0.755349 0.158006 0.078441 +v -0.765135 0.241773 0.079419 +v -0.766728 0.327571 0.080264 +v -0.747687 0.408927 0.079999 +v -0.728486 0.493501 0.080851 +v -0.690026 0.569908 0.081050 +v -0.818627 0.083985 0.168993 +v -0.773739 0.161024 0.161024 +v -0.746868 0.236630 0.156480 +v -0.749442 0.321008 0.158221 +v -0.721682 0.396129 0.155688 +v -0.699331 0.475272 0.156180 +v -0.665611 0.550621 0.156955 +v -0.829510 0.085257 0.258952 +v -0.793624 0.164993 0.249299 +v -0.767125 0.242672 0.242672 +v -0.748902 0.321468 0.239499 +v -0.706868 0.389409 0.231166 +v -0.681311 0.464457 0.230269 +v -0.650616 0.539052 0.231632 +v -0.844539 0.087657 0.356274 +v -0.809599 0.169602 0.343470 +v -0.792203 0.251884 0.337932 +v -0.744703 0.322178 0.322178 +v -0.693090 0.384561 0.306353 +v -0.660571 0.452957 0.301155 +v -0.625954 0.520398 0.299806 +v -0.857819 0.091092 0.462288 +v -0.825369 0.176291 0.446832 +v -0.770238 0.250047 0.420821 +v -0.734314 0.322969 0.405385 +v -0.666431 0.375199 0.375199 +v -0.636914 0.441158 0.368147 +v -0.592360 0.495384 0.358466 +v -0.808650 0.089531 0.543234 +v -0.772118 0.171589 0.520724 +v -0.725464 0.244177 0.492293 +v -0.689564 0.313425 0.471483 +v -0.647298 0.373754 0.447920 +v -0.615170 0.434448 0.434448 +v -0.573345 0.484485 0.420138 +v -0.758468 0.089148 0.623750 +v -0.729149 0.171559 0.600783 +v -0.678827 0.241216 0.561443 +v -0.650836 0.311102 0.540297 +v -0.603673 0.364957 0.504527 +v -0.570481 0.418127 0.482134 +v -0.528011 0.455429 0.455429 +v -0.822417 0.084343 -0.084344 +v -0.796498 0.082046 -0.165151 +v -0.756548 0.078641 -0.239482 +v -0.752471 0.078910 -0.322313 +v -0.714181 0.076624 -0.392693 +v -0.656564 0.073064 -0.448881 +v -0.599850 0.070380 -0.498969 +v -0.798763 0.165545 -0.082245 +v -0.766295 0.159707 -0.159707 +v -0.744267 0.156007 -0.235926 +v -0.724264 0.153458 -0.311606 +v -0.681506 0.147704 -0.376482 +v -0.672100 0.150415 -0.458268 +v -0.610974 0.144398 -0.507487 +v -0.790825 0.248629 -0.081749 +v -0.772300 0.243522 -0.161111 +v -0.748477 0.237500 -0.237500 +v -0.711042 0.228670 -0.307073 +v -0.699031 0.228831 -0.385524 +v -0.645292 0.218925 -0.441750 +v -0.593712 0.212300 -0.493889 +v -0.782230 0.333290 -0.081737 +v -0.782498 0.333351 -0.164475 +v -0.758877 0.325261 -0.242352 +v -0.711206 0.309128 -0.309128 +v -0.678434 0.300447 -0.377159 +v -0.614422 0.281626 -0.423469 +v -0.564747 0.272017 -0.471446 +v -0.732619 0.401627 -0.078481 +v -0.724635 0.397573 -0.156275 +v -0.722809 0.397311 -0.235916 +v -0.704795 0.390474 -0.311071 +v -0.654127 0.368815 -0.368815 +v -0.603910 0.350326 -0.419667 +v -0.548350 0.333213 -0.459812 +v -0.681311 0.464234 -0.075744 +v -0.664873 0.453754 -0.148886 +v -0.682499 0.465206 -0.230644 +v -0.651248 0.447000 -0.297210 +v -0.615864 0.427451 -0.356781 +v -0.572779 0.406062 -0.406062 +v -0.521060 0.383427 -0.441557 +v -0.617818 0.513104 -0.072506 +v -0.614721 0.510444 -0.145259 +v -0.628293 0.521335 -0.224048 +v -0.607290 0.505471 -0.291332 +v -0.586598 0.490726 -0.355160 +v -0.543439 0.459931 -0.399140 +v -0.507861 0.438366 -0.438366 +v -0.852655 -0.086934 -0.086934 +v -0.847039 -0.173927 -0.086474 +v -0.846736 -0.263548 -0.086820 +v -0.831259 -0.351375 -0.086395 +v -0.803467 -0.435954 -0.085617 +v -0.764884 -0.516082 -0.084793 +v -0.705856 -0.582362 -0.082923 +v -0.831541 -0.085116 -0.171236 +v -0.838262 -0.172438 -0.172438 +v -0.822762 -0.257194 -0.170298 +v -0.810878 -0.343948 -0.169844 +v -0.768541 -0.419043 -0.164999 +v -0.728051 -0.493207 -0.162261 +v -0.708009 -0.584094 -0.166700 +v -0.794103 -0.082046 -0.249503 +v -0.788142 -0.163995 -0.247814 +v -0.805158 -0.253220 -0.253220 +v -0.790632 -0.337335 -0.251435 +v -0.754270 -0.412906 -0.245289 +v -0.714048 -0.485096 -0.240581 +v -0.680333 -0.562638 -0.241728 +v -0.762945 -0.079905 -0.326176 +v -0.755248 -0.159320 -0.323176 +v -0.743587 -0.237979 -0.319448 +v -0.757507 -0.327167 -0.327167 +v -0.730972 -0.403697 -0.321622 +v -0.699197 -0.477638 -0.317502 +v -0.666122 -0.552523 -0.318043 +v -0.747546 -0.079985 -0.408859 +v -0.727972 -0.156938 -0.399205 +v -0.714220 -0.233357 -0.393054 +v -0.719626 -0.317049 -0.397966 +v -0.699925 -0.392578 -0.392578 +v -0.687835 -0.474318 -0.395644 +v -0.656783 -0.547454 -0.395433 +v -0.676455 -0.075218 -0.461222 +v -0.679347 -0.151950 -0.462793 +v -0.694785 -0.234514 -0.472952 +v -0.700334 -0.317983 -0.478365 +v -0.692473 -0.398148 -0.477338 +v -0.672803 -0.473041 -0.473041 +v -0.633525 -0.533897 -0.462392 +v -0.626093 -0.073485 -0.519614 +v -0.644371 -0.152073 -0.533853 +v -0.648299 -0.230845 -0.537214 +v -0.632212 -0.302647 -0.525403 +v -0.626584 -0.378104 -0.523046 +v -0.619161 -0.452306 -0.522103 +v -0.598526 -0.515139 -0.515139 +v 0.000000 0.000000 -0.860034 +v 0.088292 0.000000 -0.867898 +v 0.175212 0.000000 -0.853827 +v 0.263081 0.000000 -0.844468 +v 0.344364 0.000000 -0.811767 +v 0.412577 0.000000 -0.754752 +v 0.463054 0.000000 -0.678998 +v 0.516619 0.000000 -0.622061 +v 0.000000 -0.089140 -0.877871 +v 0.000000 -0.180864 -0.886593 +v 0.000000 -0.261185 -0.837326 +v 0.000000 -0.330902 -0.775110 +v 0.000000 -0.416761 -0.763417 +v 0.000000 -0.496068 -0.732343 +v 0.000000 -0.584397 -0.708332 +v -0.083910 0.000000 -0.816372 +v -0.166217 0.000000 -0.801684 +v -0.238870 0.000000 -0.753234 +v -0.312208 0.000000 -0.724203 +v -0.382546 0.000000 -0.692554 +v -0.450714 0.000000 -0.659058 +v -0.514465 0.000000 -0.619319 +v 0.000000 0.083866 -0.815844 +v 0.000000 0.163728 -0.787251 +v 0.000000 0.238620 -0.752290 +v 0.000000 0.314938 -0.731636 +v 0.000000 0.387697 -0.703222 +v 0.000000 0.458478 -0.671604 +v 0.000000 0.548291 -0.662374 +v 0.085327 0.085326 -0.833889 +v 0.169227 0.084103 -0.819973 +v 0.256993 0.084592 -0.822171 +v 0.335567 0.082324 -0.788403 +v 0.406475 0.079489 -0.742625 +v 0.449249 0.073128 -0.657156 +v 0.499836 0.070510 -0.600952 +v 0.081179 0.163432 -0.786600 +v 0.162772 0.162772 -0.783620 +v 0.245240 0.162266 -0.778643 +v 0.322198 0.158825 -0.752629 +v 0.391525 0.153817 -0.712267 +v 0.424301 0.138900 -0.617706 +v 0.471652 0.133965 -0.565584 +v 0.080559 0.245126 -0.777700 +v 0.156764 0.237053 -0.748426 +v 0.233081 0.233081 -0.732542 +v 0.302701 0.225381 -0.699543 +v 0.370979 0.220088 -0.669688 +v 0.411604 0.203863 -0.597475 +v 0.456500 0.196296 -0.546604 +v 0.078355 0.320156 -0.746627 +v 0.151994 0.308716 -0.716524 +v 0.222756 0.299212 -0.690367 +v 0.295406 0.295405 -0.675985 +v 0.353623 0.281666 -0.631840 +v 0.404262 0.268905 -0.584364 +v 0.443335 0.256059 -0.529599 +v 0.077511 0.396957 -0.722982 +v 0.154090 0.392197 -0.713642 +v 0.225673 0.380271 -0.688433 +v 0.287207 0.360566 -0.645586 +v 0.345838 0.345838 -0.609843 +v 0.397313 0.331790 -0.569582 +v 0.441535 0.320238 -0.525737 +v 0.075833 0.464747 -0.682138 +v 0.152952 0.465750 -0.684082 +v 0.225809 0.455530 -0.667150 +v 0.284885 0.428389 -0.622122 +v 0.348579 0.417559 -0.600673 +v 0.395902 0.395902 -0.557606 +v 0.444676 0.386094 -0.524858 +v 0.077552 0.546650 -0.660460 +v 0.156490 0.549023 -0.663586 +v 0.230283 0.535899 -0.646643 +v 0.296939 0.515348 -0.619640 +v 0.349777 0.483144 -0.577217 +v 0.402779 0.464187 -0.548622 +v 0.450240 0.450240 -0.521882 +v 0.091381 -0.091381 -0.904550 +v 0.089912 -0.180740 -0.886276 +v 0.086904 -0.263797 -0.847667 +v 0.084215 -0.342909 -0.808309 +v 0.083537 -0.425944 -0.782807 +v 0.082746 -0.504355 -0.745982 +v 0.083457 -0.585915 -0.710373 +v 0.181130 -0.090108 -0.888520 +v 0.176729 -0.176729 -0.862518 +v 0.173501 -0.261962 -0.840357 +v 0.171557 -0.347328 -0.819930 +v 0.168893 -0.428626 -0.788137 +v 0.165030 -0.501376 -0.741135 +v 0.165780 -0.580932 -0.704005 +v 0.269427 -0.088817 -0.868766 +v 0.261172 -0.172970 -0.837441 +v 0.257311 -0.257311 -0.819909 +v 0.252430 -0.338658 -0.794112 +v 0.249184 -0.419386 -0.767341 +v 0.248290 -0.500525 -0.738522 +v 0.247835 -0.576906 -0.698310 +v 0.354525 -0.087206 -0.839797 +v 0.347848 -0.171820 -0.821323 +v 0.335264 -0.249877 -0.785184 +v 0.329118 -0.329118 -0.762515 +v 0.323210 -0.405686 -0.734911 +v 0.324247 -0.487822 -0.715135 +v 0.325851 -0.566277 -0.683319 +v 0.419110 -0.082116 -0.768703 +v 0.419472 -0.165173 -0.769418 +v 0.409427 -0.243198 -0.747251 +v 0.400200 -0.318832 -0.724050 +v 0.397941 -0.397940 -0.710259 +v 0.391160 -0.468911 -0.679532 +v 0.394163 -0.545666 -0.654571 +v 0.476898 -0.077954 -0.701723 +v 0.463283 -0.152116 -0.680131 +v 0.459041 -0.227564 -0.672720 +v 0.452473 -0.300835 -0.659813 +v 0.439627 -0.366877 -0.634562 +v 0.439769 -0.439769 -0.623115 +v 0.442613 -0.510768 -0.605355 +v 0.522323 -0.073892 -0.629537 +v 0.500488 -0.142360 -0.602109 +v 0.487546 -0.209585 -0.585721 +v 0.499362 -0.287864 -0.599652 +v 0.491993 -0.356059 -0.588165 +v 0.487406 -0.422635 -0.576901 +v 0.486371 -0.486371 -0.564552 +v -0.086617 -0.086617 -0.848952 +v -0.168008 -0.083488 -0.812953 +v -0.248581 -0.081733 -0.790648 +v -0.317120 -0.077573 -0.738396 +v -0.376791 -0.073318 -0.681362 +v -0.436172 -0.070846 -0.636079 +v -0.503609 -0.071078 -0.605748 +v -0.087320 -0.175604 -0.856694 +v -0.167782 -0.167782 -0.811942 +v -0.244751 -0.161937 -0.776840 +v -0.317404 -0.156396 -0.739790 +v -0.376864 -0.147860 -0.682287 +v -0.436857 -0.143157 -0.637814 +v -0.509286 -0.144921 -0.613254 +v -0.083535 -0.253885 -0.810522 +v -0.160500 -0.242612 -0.768943 +v -0.229937 -0.229938 -0.721209 +v -0.304036 -0.226385 -0.703054 +v -0.373355 -0.221517 -0.674483 +v -0.433004 -0.214555 -0.631420 +v -0.503131 -0.216256 -0.605358 +v -0.078340 -0.320100 -0.746474 +v -0.152995 -0.310692 -0.721817 +v -0.224953 -0.302133 -0.698049 +v -0.300511 -0.300511 -0.689091 +v -0.376585 -0.299989 -0.677300 +v -0.439265 -0.292088 -0.639144 +v -0.495931 -0.285917 -0.595363 +v -0.078186 -0.400207 -0.729690 +v -0.156620 -0.398422 -0.726373 +v -0.226201 -0.381149 -0.690204 +v -0.302333 -0.379523 -0.683115 +v -0.373000 -0.373001 -0.662194 +v -0.441127 -0.368122 -0.636867 +v -0.489045 -0.353966 -0.584518 +v -0.081629 -0.497957 -0.735669 +v -0.161926 -0.492220 -0.726472 +v -0.236419 -0.476766 -0.700836 +v -0.308239 -0.463652 -0.677308 +v -0.371929 -0.445719 -0.643918 +v -0.429156 -0.429156 -0.607267 +v -0.482113 -0.418109 -0.570455 +v -0.084896 -0.595481 -0.722534 +v -0.166574 -0.583664 -0.707464 +v -0.241915 -0.563075 -0.680884 +v -0.310706 -0.539600 -0.649964 +v -0.364971 -0.504546 -0.603697 +v -0.429124 -0.494994 -0.586144 +v -0.483239 -0.483239 -0.560854 +v -0.081775 0.081775 -0.792439 +v -0.078833 0.158783 -0.759821 +v -0.077773 0.236928 -0.746979 +v -0.075872 0.310517 -0.720496 +v -0.074844 0.384131 -0.696510 +v -0.074356 0.456281 -0.668492 +v -0.077663 0.547392 -0.661404 +v -0.160557 0.079728 -0.770039 +v -0.155810 0.155810 -0.744266 +v -0.155106 0.234585 -0.739319 +v -0.146288 0.297453 -0.686361 +v -0.143859 0.367018 -0.662153 +v -0.145410 0.443504 -0.648457 +v -0.146882 0.516021 -0.621785 +v -0.234065 0.076800 -0.736252 +v -0.230146 0.152124 -0.722938 +v -0.222629 0.222629 -0.694857 +v -0.210129 0.282427 -0.646222 +v -0.210740 0.355426 -0.638312 +v -0.214506 0.432906 -0.631265 +v -0.217959 0.507110 -0.610371 +v -0.303070 0.073954 -0.700308 +v -0.295926 0.145514 -0.682270 +v -0.292367 0.217607 -0.672364 +v -0.276949 0.276949 -0.628615 +v -0.275794 0.346264 -0.617272 +v -0.288681 0.434122 -0.631095 +v -0.293090 0.508568 -0.611163 +v -0.375968 0.073147 -0.679663 +v -0.365419 0.143209 -0.658883 +v -0.361699 0.214510 -0.650967 +v -0.344952 0.274748 -0.614675 +v -0.341761 0.341761 -0.601986 +v -0.351255 0.420788 -0.605631 +v -0.352545 0.487044 -0.582042 +v -0.458954 0.074822 -0.672801 +v -0.445032 0.145929 -0.650905 +v -0.428450 0.212280 -0.624197 +v -0.409919 0.272652 -0.593217 +v -0.405044 0.338201 -0.581455 +v -0.410688 0.410688 -0.579687 +v -0.405553 0.467431 -0.552573 +v -0.522415 0.073906 -0.629654 +v -0.505708 0.143880 -0.608721 +v -0.495108 0.212822 -0.595249 +v -0.467197 0.269605 -0.559435 +v -0.460917 0.333997 -0.549717 +v -0.452012 0.392368 -0.533794 +v -0.448906 0.448906 -0.520307 +v 0.527694 -0.527694 -0.477528 +v 0.559737 -0.559737 -0.436649 +v 0.603470 -0.603470 -0.391060 +v 0.615420 -0.615420 -0.317294 +v 0.611594 -0.611594 -0.235312 +v 0.625658 -0.625658 -0.159732 +v 0.633968 -0.633968 -0.080723 +v 0.654555 -0.654555 0.000000 +v 0.656206 -0.656206 0.083660 +v 0.637710 -0.637710 0.162813 +v 0.633515 -0.633515 0.243561 +v 0.629398 -0.629398 0.324291 +v 0.624905 -0.624905 0.404518 +v 0.604850 -0.604851 0.470923 +v 0.577433 -0.577433 0.522212 +v 0.493734 -0.545734 -0.545734 +v 0.455434 -0.584462 -0.584462 +v 0.404762 -0.625293 -0.625293 +v 0.336030 -0.652847 -0.652847 +v 0.258230 -0.672498 -0.672499 +v 0.169325 -0.663186 -0.663187 +v 0.085763 -0.672128 -0.672128 +v 0.000000 -0.679346 -0.679346 +v -0.087022 -0.681660 -0.681660 +v -0.172813 -0.676832 -0.676832 +v -0.250743 -0.652602 -0.652602 +v -0.316652 -0.614137 -0.614137 +v -0.370017 -0.569953 -0.569953 +v -0.430569 -0.551734 -0.551735 +v -0.489258 -0.540751 -0.540752 +v 0.517782 -0.468624 -0.517782 +v 0.524099 -0.409574 -0.524099 +v 0.520405 -0.338910 -0.520405 +v 0.522073 -0.270567 -0.522072 +v 0.513110 -0.198255 -0.513110 +v 0.535173 -0.136603 -0.535173 +v 0.558732 -0.070785 -0.558731 +v 0.562962 0.000000 -0.562962 +v 0.554067 0.070169 -0.554066 +v 0.529516 0.135157 -0.529516 +v 0.503209 0.194529 -0.503209 +v 0.502445 0.260742 -0.502444 +v 0.499951 0.326068 -0.499951 +v 0.502022 0.392802 -0.502022 +v 0.506929 0.458874 -0.506928 +v 0.495799 -0.548032 0.548032 +v 0.435751 -0.558555 0.558555 +v 0.370969 -0.571469 0.571469 +v 0.293728 -0.568341 0.568341 +v 0.222767 -0.578253 0.578253 +v 0.150934 -0.591238 0.591238 +v 0.077081 -0.606397 0.606397 +v -0.000000 -0.629828 0.629828 +v -0.082038 -0.643924 0.643924 +v -0.164231 -0.643258 0.643258 +v -0.241657 -0.628454 0.628454 +v -0.310240 -0.601326 0.601326 +v -0.368583 -0.567668 0.567668 +v -0.425505 -0.545068 0.545068 +v -0.487263 -0.538530 0.538530 +v 0.575660 -0.520618 0.575660 +v 0.611741 -0.476158 0.611742 +v 0.640115 -0.414068 0.640115 +v 0.651105 -0.335158 0.651106 +v 0.643567 -0.247343 0.643567 +v 0.648820 -0.165653 0.648821 +v 0.668270 -0.085253 0.668270 +v 0.697420 0.000000 0.697420 +v 0.723211 0.092510 0.723211 +v 0.728546 0.186032 0.728546 +v 0.729386 0.279636 0.729387 +v 0.711447 0.365363 0.711447 +v 0.671406 0.433713 0.671407 +v 0.624583 0.485914 0.624583 +v 0.564303 0.510416 0.564304 +v -0.560244 -0.560244 0.506769 +v -0.597370 -0.597370 0.465240 +v -0.634708 -0.634708 0.410673 +v -0.650412 -0.650412 0.334810 +v -0.646399 -0.646399 0.248409 +v -0.661301 -0.661301 0.168843 +v -0.669417 -0.669417 0.085405 +v -0.678692 -0.678692 -0.000000 +v -0.673066 -0.673066 -0.085887 +v -0.658602 -0.658602 -0.168153 +v -0.631064 -0.631064 -0.242639 +v -0.618093 -0.618093 -0.318633 +v -0.607823 -0.607823 -0.393794 +v -0.585216 -0.585217 -0.456007 +v -0.551294 -0.551294 -0.498729 +v -0.559181 -0.505815 0.559181 +v -0.567636 -0.442651 0.567636 +v -0.562788 -0.365519 0.562788 +v -0.574792 -0.296957 0.574791 +v -0.581873 -0.224129 0.581873 +v -0.606651 -0.154873 0.606650 +v -0.645547 -0.082252 0.645547 +v -0.672710 0.000000 0.672709 +v -0.680599 0.086882 0.680599 +v -0.647384 0.165285 0.647383 +v -0.624241 0.240071 0.624241 +v -0.600652 0.309902 0.600652 +v -0.561785 0.364889 0.561784 +v -0.535284 0.418071 0.535283 +v -0.491740 0.445229 0.491739 +v -0.543553 -0.491775 -0.543553 +v -0.546964 -0.426945 -0.546964 +v -0.544105 -0.353789 -0.544105 +v -0.560653 -0.289880 -0.560654 +v -0.589822 -0.227120 -0.589822 +v -0.589104 -0.150388 -0.589104 +v -0.575532 -0.073004 -0.575532 +v -0.574373 0.000000 -0.574373 +v -0.567817 0.071985 -0.567817 +v -0.562440 0.143573 -0.562440 +v -0.550119 0.212180 -0.550119 +v -0.513419 0.266236 -0.513419 +v -0.504778 0.329099 -0.504778 +v -0.491669 0.384936 -0.491669 +v -0.486820 0.440809 -0.486820 +v 0.527539 0.527539 -0.477388 +v 0.569558 0.569558 -0.444110 +v 0.600276 0.600275 -0.389055 +v 0.623455 0.623455 -0.321316 +v 0.624055 0.624055 -0.240001 +v 0.620837 0.620837 -0.158499 +v 0.627967 0.627967 -0.079930 +v 0.642685 0.642685 0.000000 +v 0.645572 0.645572 0.082256 +v 0.642510 0.642510 0.164040 +v 0.616593 0.616593 0.237194 +v 0.596422 0.596422 0.307785 +v 0.575869 0.575869 0.373732 +v 0.562046 0.562046 0.438404 +v 0.547030 0.547031 0.494900 +v 0.454993 0.502609 -0.502609 +v 0.415046 0.531301 -0.531301 +v 0.362456 0.557908 -0.557908 +v 0.306146 0.593148 -0.593148 +v 0.242120 0.629686 -0.629685 +v 0.159181 0.623501 -0.623501 +v 0.079504 0.624742 -0.624742 +v 0.000000 0.628148 -0.628148 +v -0.079022 0.621090 -0.621090 +v -0.151326 0.592771 -0.592771 +v -0.219507 0.569590 -0.569590 +v -0.293227 0.567340 -0.567340 +v -0.357212 0.549556 -0.549556 +v -0.411244 0.526297 -0.526297 +v -0.453544 0.500996 -0.500996 +v 0.480856 0.531399 0.531399 +v 0.419083 0.536615 0.536616 +v 0.348563 0.535780 0.535780 +v 0.293164 0.567215 0.567215 +v 0.226855 0.589119 0.589120 +v 0.148100 0.580153 0.580154 +v 0.072645 0.572811 0.572811 +v -0.000000 0.563486 0.563486 +v -0.071953 0.567568 0.567568 +v -0.141795 0.555486 0.555486 +v -0.213661 0.554052 0.554052 +v -0.274823 0.530574 0.530574 +v -0.337285 0.517817 0.517817 +v -0.384570 0.491186 0.491186 +v -0.432065 0.477086 0.477086 +v -0.480565 0.480565 0.435190 +v -0.510414 0.510414 0.399177 +v -0.539762 0.539762 0.351063 +v -0.574937 0.574937 0.297030 +v -0.597992 0.597992 0.230194 +v -0.595657 0.595656 0.152063 +v -0.614112 0.614112 0.078100 +v -0.599346 0.599346 -0.000000 +v -0.574434 0.574434 -0.072859 +v -0.558073 0.558073 -0.142456 +v -0.560795 0.560795 -0.216198 +v -0.566247 0.566247 -0.292680 +v -0.547458 0.547458 -0.355894 +v -0.513788 0.513788 -0.401741 +v -0.490231 0.490231 -0.443874 +v 0.513923 -0.513923 -0.513923 +v 0.549846 -0.549846 0.549846 +v -0.538962 -0.538962 0.538962 +v -0.530837 -0.530837 -0.530837 +v 0.501209 0.501209 -0.501209 +v 0.526819 0.526819 0.526820 +v -0.462144 0.462143 0.462143 +v -0.480273 0.480273 -0.480273 +vt 0.500000 0.500000 +vt 0.499936 0.479231 +vt 0.520706 0.479167 +vt 0.520770 0.499936 +vt 0.541476 0.479103 +vt 0.541539 0.499873 +vt 0.562245 0.479039 +vt 0.562309 0.499809 +vt 0.583015 0.478976 +vt 0.583079 0.499745 +vt 0.603784 0.478912 +vt 0.603848 0.499682 +vt 0.624554 0.478848 +vt 0.624618 0.499618 +vt 0.645324 0.478785 +vt 0.645387 0.499554 +vt 0.666093 0.478721 +vt 0.666157 0.499490 +vt 0.499873 0.458461 +vt 0.520642 0.458397 +vt 0.541412 0.458333 +vt 0.562181 0.458270 +vt 0.582951 0.458206 +vt 0.603721 0.458142 +vt 0.624490 0.458079 +vt 0.645260 0.458015 +vt 0.666030 0.457951 +vt 0.499809 0.437691 +vt 0.520579 0.437628 +vt 0.541348 0.437564 +vt 0.562118 0.437500 +vt 0.582887 0.437436 +vt 0.603657 0.437373 +vt 0.624427 0.437309 +vt 0.645196 0.437245 +vt 0.665966 0.437182 +vt 0.499745 0.416922 +vt 0.520515 0.416858 +vt 0.541284 0.416794 +vt 0.562054 0.416731 +vt 0.582824 0.416667 +vt 0.603593 0.416603 +vt 0.624363 0.416539 +vt 0.645132 0.416476 +vt 0.665902 0.416412 +vt 0.499681 0.396152 +vt 0.520451 0.396088 +vt 0.541221 0.396025 +vt 0.561990 0.395961 +vt 0.582760 0.395897 +vt 0.603530 0.395833 +vt 0.624299 0.395770 +vt 0.645069 0.395706 +vt 0.665838 0.395642 +vt 0.499618 0.375382 +vt 0.520387 0.375319 +vt 0.541157 0.375255 +vt 0.561927 0.375191 +vt 0.582696 0.375128 +vt 0.603466 0.375064 +vt 0.624235 0.375000 +vt 0.645005 0.374936 +vt 0.665775 0.374873 +vt 0.499554 0.354613 +vt 0.520324 0.354549 +vt 0.541093 0.354485 +vt 0.561863 0.354422 +vt 0.582632 0.354358 +vt 0.603402 0.354294 +vt 0.624172 0.354231 +vt 0.644941 0.354167 +vt 0.665711 0.354103 +vt 0.499490 0.333843 +vt 0.520260 0.333780 +vt 0.541030 0.333716 +vt 0.561799 0.333652 +vt 0.582569 0.333588 +vt 0.603338 0.333525 +vt 0.624108 0.333461 +vt 0.644878 0.333397 +vt 0.665647 0.333333 +vt 0.520833 0.520706 +vt 0.500064 0.520770 +vt 0.520897 0.541476 +vt 0.500127 0.541539 +vt 0.520961 0.562245 +vt 0.500191 0.562309 +vt 0.521025 0.583015 +vt 0.500255 0.583079 +vt 0.521088 0.603785 +vt 0.500319 0.603848 +vt 0.521152 0.624554 +vt 0.500382 0.624618 +vt 0.521216 0.645324 +vt 0.500446 0.645387 +vt 0.521279 0.666093 +vt 0.500510 0.666157 +vt 0.541603 0.520642 +vt 0.541667 0.541412 +vt 0.541730 0.562182 +vt 0.541794 0.582951 +vt 0.541858 0.603721 +vt 0.541922 0.624490 +vt 0.541985 0.645260 +vt 0.542049 0.666030 +vt 0.562373 0.520579 +vt 0.562436 0.541348 +vt 0.562500 0.562118 +vt 0.562564 0.582887 +vt 0.562627 0.603657 +vt 0.562691 0.624427 +vt 0.562755 0.645196 +vt 0.562819 0.665966 +vt 0.583142 0.520515 +vt 0.583206 0.541285 +vt 0.583270 0.562054 +vt 0.583333 0.582824 +vt 0.583397 0.603593 +vt 0.583461 0.624363 +vt 0.583525 0.645133 +vt 0.583588 0.665902 +vt 0.603912 0.520451 +vt 0.603976 0.541221 +vt 0.604039 0.561990 +vt 0.604103 0.582760 +vt 0.604167 0.603530 +vt 0.604230 0.624299 +vt 0.604294 0.645069 +vt 0.604358 0.665839 +vt 0.624681 0.520387 +vt 0.624745 0.541157 +vt 0.624809 0.561927 +vt 0.624873 0.582696 +vt 0.624936 0.603466 +vt 0.625000 0.624236 +vt 0.625064 0.645005 +vt 0.625127 0.665775 +vt 0.645451 0.520324 +vt 0.645515 0.541093 +vt 0.645579 0.561863 +vt 0.645642 0.582633 +vt 0.645706 0.603402 +vt 0.645770 0.624172 +vt 0.645833 0.644941 +vt 0.645897 0.665711 +vt 0.666221 0.520260 +vt 0.666284 0.541030 +vt 0.666348 0.561799 +vt 0.666412 0.582569 +vt 0.666476 0.603338 +vt 0.666539 0.624108 +vt 0.666603 0.644878 +vt 0.666667 0.665647 +vt 0.479294 0.520833 +vt 0.479230 0.500064 +vt 0.458525 0.520897 +vt 0.458461 0.500128 +vt 0.437755 0.520961 +vt 0.437691 0.500191 +vt 0.416985 0.521025 +vt 0.416922 0.500255 +vt 0.396216 0.521088 +vt 0.396152 0.500319 +vt 0.375446 0.521152 +vt 0.375382 0.500382 +vt 0.354676 0.521216 +vt 0.354613 0.500446 +vt 0.333907 0.521280 +vt 0.333843 0.500510 +vt 0.479358 0.541603 +vt 0.458588 0.541667 +vt 0.437819 0.541731 +vt 0.417049 0.541794 +vt 0.396279 0.541858 +vt 0.375510 0.541922 +vt 0.354740 0.541985 +vt 0.333971 0.542049 +vt 0.479422 0.562373 +vt 0.458652 0.562436 +vt 0.437882 0.562500 +vt 0.417113 0.562564 +vt 0.396343 0.562628 +vt 0.375574 0.562691 +vt 0.354804 0.562755 +vt 0.334034 0.562819 +vt 0.479485 0.583142 +vt 0.458716 0.583206 +vt 0.437946 0.583270 +vt 0.417176 0.583333 +vt 0.396407 0.583397 +vt 0.375637 0.583461 +vt 0.354868 0.583525 +vt 0.334098 0.583588 +vt 0.479549 0.603912 +vt 0.458779 0.603976 +vt 0.438010 0.604039 +vt 0.417240 0.604103 +vt 0.396471 0.604167 +vt 0.375701 0.604231 +vt 0.354931 0.604294 +vt 0.334162 0.604358 +vt 0.479613 0.624682 +vt 0.458843 0.624745 +vt 0.438074 0.624809 +vt 0.417304 0.624873 +vt 0.396534 0.624936 +vt 0.375765 0.625000 +vt 0.354995 0.625064 +vt 0.334225 0.625128 +vt 0.479676 0.645451 +vt 0.458907 0.645515 +vt 0.438137 0.645579 +vt 0.417368 0.645642 +vt 0.396598 0.645706 +vt 0.375828 0.645770 +vt 0.355059 0.645833 +vt 0.334289 0.645897 +vt 0.479740 0.666221 +vt 0.458971 0.666285 +vt 0.438201 0.666348 +vt 0.417431 0.666412 +vt 0.396662 0.666476 +vt 0.375892 0.666539 +vt 0.355123 0.666603 +vt 0.334353 0.666667 +vt 0.479167 0.479294 +vt 0.479103 0.458525 +vt 0.479039 0.437755 +vt 0.478976 0.416985 +vt 0.478912 0.396216 +vt 0.478848 0.375446 +vt 0.478784 0.354677 +vt 0.478721 0.333907 +vt 0.458397 0.479358 +vt 0.458333 0.458588 +vt 0.458270 0.437819 +vt 0.458206 0.417049 +vt 0.458142 0.396280 +vt 0.458079 0.375510 +vt 0.458015 0.354740 +vt 0.457951 0.333971 +vt 0.437627 0.479422 +vt 0.437564 0.458652 +vt 0.437500 0.437882 +vt 0.437436 0.417113 +vt 0.437373 0.396343 +vt 0.437309 0.375574 +vt 0.437245 0.354804 +vt 0.437181 0.334034 +vt 0.416858 0.479485 +vt 0.416794 0.458716 +vt 0.416730 0.437946 +vt 0.416667 0.417177 +vt 0.416603 0.396407 +vt 0.416539 0.375637 +vt 0.416476 0.354868 +vt 0.416412 0.334098 +vt 0.396088 0.479549 +vt 0.396025 0.458780 +vt 0.395961 0.438010 +vt 0.395897 0.417240 +vt 0.395833 0.396471 +vt 0.395770 0.375701 +vt 0.395706 0.354931 +vt 0.395642 0.334162 +vt 0.375319 0.479613 +vt 0.375255 0.458843 +vt 0.375191 0.438074 +vt 0.375127 0.417304 +vt 0.375064 0.396534 +vt 0.375000 0.375765 +vt 0.374936 0.354995 +vt 0.374873 0.334226 +vt 0.354549 0.479677 +vt 0.354485 0.458907 +vt 0.354422 0.438137 +vt 0.354358 0.417368 +vt 0.354294 0.396598 +vt 0.354230 0.375829 +vt 0.354167 0.355059 +vt 0.354103 0.334289 +vt 0.333779 0.479740 +vt 0.333716 0.458971 +vt 0.333652 0.438201 +vt 0.333588 0.417431 +vt 0.333525 0.396662 +vt 0.333461 0.375892 +vt 0.333397 0.355123 +vt 0.333333 0.334353 +vt 0.833333 0.500000 +vt 0.833397 0.479230 +vt 0.854167 0.479294 +vt 0.854103 0.500064 +vt 0.874936 0.479358 +vt 0.874873 0.500127 +vt 0.895706 0.479422 +vt 0.895642 0.500191 +vt 0.916475 0.479485 +vt 0.916412 0.500255 +vt 0.937245 0.479549 +vt 0.937181 0.500319 +vt 0.958015 0.479613 +vt 0.957951 0.500382 +vt 0.978784 0.479676 +vt 0.978721 0.500446 +vt 0.999554 0.479740 +vt 0.999490 0.500510 +vt 0.833461 0.458461 +vt 0.854230 0.458525 +vt 0.875000 0.458588 +vt 0.895770 0.458652 +vt 0.916539 0.458716 +vt 0.937309 0.458779 +vt 0.958078 0.458843 +vt 0.978848 0.458907 +vt 0.999618 0.458971 +vt 0.833524 0.437691 +vt 0.854294 0.437755 +vt 0.875064 0.437819 +vt 0.895833 0.437882 +vt 0.916603 0.437946 +vt 0.937373 0.438010 +vt 0.958142 0.438073 +vt 0.978912 0.438137 +vt 0.999681 0.438201 +vt 0.833588 0.416922 +vt 0.854358 0.416985 +vt 0.875127 0.417049 +vt 0.895897 0.417113 +vt 0.916667 0.417176 +vt 0.937436 0.417240 +vt 0.958206 0.417304 +vt 0.978975 0.417368 +vt 0.999745 0.417431 +vt 0.833652 0.396152 +vt 0.854421 0.396216 +vt 0.875191 0.396279 +vt 0.895961 0.396343 +vt 0.916730 0.396407 +vt 0.937500 0.396471 +vt 0.958270 0.396534 +vt 0.979039 0.396598 +vt 0.999809 0.396662 +vt 0.833716 0.375382 +vt 0.854485 0.375446 +vt 0.875255 0.375510 +vt 0.896024 0.375574 +vt 0.916794 0.375637 +vt 0.937564 0.375701 +vt 0.958333 0.375765 +vt 0.979103 0.375828 +vt 0.999873 0.375892 +vt 0.833779 0.354613 +vt 0.854549 0.354676 +vt 0.875319 0.354740 +vt 0.896088 0.354804 +vt 0.916858 0.354868 +vt 0.937627 0.354931 +vt 0.958397 0.354995 +vt 0.979167 0.355059 +vt 0.999936 0.355122 +vt 0.833843 0.333843 +vt 0.854613 0.333907 +vt 0.875382 0.333971 +vt 0.896152 0.334034 +vt 0.916921 0.334098 +vt 0.937691 0.334162 +vt 0.958461 0.334225 +vt 0.979230 0.334289 +vt 1.000000 0.334353 +vt 0.854039 0.520833 +vt 0.833270 0.520770 +vt 0.853975 0.541603 +vt 0.833206 0.541539 +vt 0.853912 0.562373 +vt 0.833142 0.562309 +vt 0.853848 0.583142 +vt 0.833078 0.583079 +vt 0.853784 0.603912 +vt 0.833015 0.603848 +vt 0.853721 0.624681 +vt 0.832951 0.624618 +vt 0.853657 0.645451 +vt 0.832887 0.645387 +vt 0.853593 0.666221 +vt 0.832824 0.666157 +vt 0.874809 0.520897 +vt 0.874745 0.541667 +vt 0.874681 0.562436 +vt 0.874618 0.583206 +vt 0.874554 0.603976 +vt 0.874490 0.624745 +vt 0.874427 0.645515 +vt 0.874363 0.666284 +vt 0.895578 0.520961 +vt 0.895515 0.541730 +vt 0.895451 0.562500 +vt 0.895387 0.583270 +vt 0.895324 0.604039 +vt 0.895260 0.624809 +vt 0.895196 0.645579 +vt 0.895132 0.666348 +vt 0.916348 0.521025 +vt 0.916284 0.541794 +vt 0.916221 0.562564 +vt 0.916157 0.583333 +vt 0.916093 0.604103 +vt 0.916029 0.624873 +vt 0.915966 0.645642 +vt 0.915902 0.666412 +vt 0.937118 0.521088 +vt 0.937054 0.541858 +vt 0.936990 0.562627 +vt 0.936926 0.583397 +vt 0.936863 0.604167 +vt 0.936799 0.624936 +vt 0.936735 0.645706 +vt 0.936672 0.666476 +vt 0.957887 0.521152 +vt 0.957824 0.541922 +vt 0.957760 0.562691 +vt 0.957696 0.583461 +vt 0.957632 0.604230 +vt 0.957569 0.625000 +vt 0.957505 0.645770 +vt 0.957441 0.666539 +vt 0.978657 0.521216 +vt 0.978593 0.541985 +vt 0.978529 0.562755 +vt 0.978466 0.583525 +vt 0.978402 0.604294 +vt 0.978338 0.625064 +vt 0.978275 0.645833 +vt 0.978211 0.666603 +vt 0.999426 0.521279 +vt 0.999363 0.542049 +vt 0.999299 0.562819 +vt 0.999235 0.583588 +vt 0.999172 0.604358 +vt 0.999108 0.625127 +vt 0.999044 0.645897 +vt 0.998980 0.666667 +vt 0.812500 0.520706 +vt 0.812564 0.499936 +vt 0.791730 0.520642 +vt 0.791794 0.499873 +vt 0.770961 0.520579 +vt 0.771024 0.499809 +vt 0.750191 0.520515 +vt 0.750255 0.499745 +vt 0.729422 0.520451 +vt 0.729485 0.499682 +vt 0.708652 0.520387 +vt 0.708716 0.499618 +vt 0.687882 0.520324 +vt 0.687946 0.499554 +vt 0.667113 0.520260 +vt 0.667176 0.499490 +vt 0.812436 0.541476 +vt 0.791667 0.541412 +vt 0.770897 0.541348 +vt 0.750127 0.541284 +vt 0.729358 0.541221 +vt 0.708588 0.541157 +vt 0.687819 0.541093 +vt 0.667049 0.541030 +vt 0.812373 0.562245 +vt 0.791603 0.562181 +vt 0.770833 0.562118 +vt 0.750064 0.562054 +vt 0.729294 0.561990 +vt 0.708525 0.561927 +vt 0.687755 0.561863 +vt 0.666985 0.561799 +vt 0.812309 0.583015 +vt 0.791539 0.582951 +vt 0.770770 0.582887 +vt 0.750000 0.582824 +vt 0.729230 0.582760 +vt 0.708461 0.582696 +vt 0.687691 0.582632 +vt 0.666922 0.582569 +vt 0.812245 0.603784 +vt 0.791476 0.603721 +vt 0.770706 0.603657 +vt 0.749936 0.603593 +vt 0.729167 0.603530 +vt 0.708397 0.603466 +vt 0.687627 0.603402 +vt 0.666858 0.603338 +vt 0.812181 0.624554 +vt 0.791412 0.624490 +vt 0.770642 0.624427 +vt 0.749873 0.624363 +vt 0.729103 0.624299 +vt 0.708333 0.624235 +vt 0.687564 0.624172 +vt 0.666794 0.624108 +vt 0.812118 0.645324 +vt 0.791348 0.645260 +vt 0.770579 0.645196 +vt 0.749809 0.645132 +vt 0.729039 0.645069 +vt 0.708270 0.645005 +vt 0.687500 0.644941 +vt 0.666730 0.644878 +vt 0.812054 0.666093 +vt 0.791284 0.666030 +vt 0.770515 0.665966 +vt 0.749745 0.665902 +vt 0.728976 0.665838 +vt 0.708206 0.665775 +vt 0.687436 0.665711 +vt 0.812627 0.479167 +vt 0.812691 0.458397 +vt 0.812755 0.437627 +vt 0.812819 0.416858 +vt 0.812882 0.396088 +vt 0.812946 0.375319 +vt 0.813010 0.354549 +vt 0.813073 0.333779 +vt 0.791858 0.479103 +vt 0.791921 0.458333 +vt 0.791985 0.437564 +vt 0.792049 0.416794 +vt 0.792113 0.396025 +vt 0.792176 0.375255 +vt 0.792240 0.354485 +vt 0.792304 0.333716 +vt 0.771088 0.479039 +vt 0.771152 0.458270 +vt 0.771216 0.437500 +vt 0.771279 0.416730 +vt 0.771343 0.395961 +vt 0.771407 0.375191 +vt 0.771470 0.354422 +vt 0.771534 0.333652 +vt 0.750319 0.478976 +vt 0.750382 0.458206 +vt 0.750446 0.437436 +vt 0.750510 0.416667 +vt 0.750573 0.395897 +vt 0.750637 0.375128 +vt 0.750701 0.354358 +vt 0.750765 0.333588 +vt 0.729549 0.478912 +vt 0.729613 0.458142 +vt 0.729676 0.437373 +vt 0.729740 0.416603 +vt 0.729804 0.395833 +vt 0.729868 0.375064 +vt 0.729931 0.354294 +vt 0.729995 0.333525 +vt 0.708779 0.478848 +vt 0.708843 0.458079 +vt 0.708907 0.437309 +vt 0.708970 0.416539 +vt 0.709034 0.395770 +vt 0.709098 0.375000 +vt 0.709162 0.354231 +vt 0.709225 0.333461 +vt 0.688010 0.478784 +vt 0.688073 0.458015 +vt 0.688137 0.437245 +vt 0.688201 0.416476 +vt 0.688265 0.395706 +vt 0.688328 0.374936 +vt 0.688392 0.354167 +vt 0.688456 0.333397 +vt 0.667240 0.478721 +vt 0.667304 0.457951 +vt 0.667368 0.437182 +vt 0.667431 0.416412 +vt 0.667495 0.395642 +vt 0.667559 0.374873 +vt 0.667622 0.354103 +vt 0.667686 0.333333 +vt 0.833333 0.166667 +vt 0.833270 0.145897 +vt 0.854039 0.145833 +vt 0.854103 0.166603 +vt 0.874809 0.145770 +vt 0.874873 0.166539 +vt 0.895578 0.145706 +vt 0.895642 0.166476 +vt 0.916348 0.145642 +vt 0.916412 0.166412 +vt 0.937118 0.145578 +vt 0.937181 0.166348 +vt 0.957887 0.145515 +vt 0.957951 0.166284 +vt 0.978657 0.145451 +vt 0.978721 0.166221 +vt 0.999427 0.145387 +vt 0.999490 0.166157 +vt 0.833206 0.125127 +vt 0.853976 0.125064 +vt 0.874745 0.125000 +vt 0.895515 0.124936 +vt 0.916284 0.124873 +vt 0.937054 0.124809 +vt 0.957824 0.124745 +vt 0.978593 0.124681 +vt 0.999363 0.124618 +vt 0.833142 0.104358 +vt 0.853912 0.104294 +vt 0.874681 0.104230 +vt 0.895451 0.104167 +vt 0.916221 0.104103 +vt 0.936990 0.104039 +vt 0.957760 0.103976 +vt 0.978530 0.103912 +vt 0.999299 0.103848 +vt 0.833079 0.083588 +vt 0.853848 0.083524 +vt 0.874618 0.083461 +vt 0.895387 0.083397 +vt 0.916157 0.083333 +vt 0.936927 0.083270 +vt 0.957696 0.083206 +vt 0.978466 0.083142 +vt 0.999235 0.083078 +vt 0.833015 0.062819 +vt 0.853784 0.062755 +vt 0.874554 0.062691 +vt 0.895324 0.062627 +vt 0.916093 0.062564 +vt 0.936863 0.062500 +vt 0.957632 0.062436 +vt 0.978402 0.062373 +vt 0.999172 0.062309 +vt 0.832951 0.042049 +vt 0.853721 0.041985 +vt 0.874490 0.041922 +vt 0.895260 0.041858 +vt 0.916030 0.041794 +vt 0.936799 0.041730 +vt 0.957569 0.041667 +vt 0.978338 0.041603 +vt 0.999108 0.041539 +vt 0.832887 0.021279 +vt 0.853657 0.021216 +vt 0.874427 0.021152 +vt 0.895196 0.021088 +vt 0.915966 0.021024 +vt 0.936735 0.020961 +vt 0.957505 0.020897 +vt 0.978275 0.020833 +vt 0.999044 0.020770 +vt 0.832824 0.000510 +vt 0.853593 0.000446 +vt 0.874363 0.000382 +vt 0.895133 0.000319 +vt 0.915902 0.000255 +vt 0.936672 0.000191 +vt 0.957441 0.000127 +vt 0.978211 0.000064 +vt 0.998981 0.000000 +vt 0.854167 0.187373 +vt 0.833397 0.187436 +vt 0.854230 0.208142 +vt 0.833461 0.208206 +vt 0.854294 0.228912 +vt 0.833524 0.228976 +vt 0.854358 0.249681 +vt 0.833588 0.249745 +vt 0.854421 0.270451 +vt 0.833652 0.270515 +vt 0.854485 0.291221 +vt 0.833716 0.291284 +vt 0.854549 0.311990 +vt 0.833779 0.312054 +vt 0.854613 0.332760 +vt 0.833843 0.332824 +vt 0.874936 0.187309 +vt 0.875000 0.208078 +vt 0.875064 0.228848 +vt 0.875127 0.249618 +vt 0.875191 0.270387 +vt 0.875255 0.291157 +vt 0.875319 0.311927 +vt 0.875382 0.332696 +vt 0.895706 0.187245 +vt 0.895770 0.208015 +vt 0.895833 0.228784 +vt 0.895897 0.249554 +vt 0.895961 0.270324 +vt 0.896024 0.291093 +vt 0.896088 0.311863 +vt 0.896152 0.332632 +vt 0.916475 0.187181 +vt 0.916539 0.207951 +vt 0.916603 0.228721 +vt 0.916667 0.249490 +vt 0.916730 0.270260 +vt 0.916794 0.291030 +vt 0.916858 0.311799 +vt 0.916921 0.332569 +vt 0.937245 0.187118 +vt 0.937309 0.207887 +vt 0.937373 0.228657 +vt 0.937436 0.249427 +vt 0.937500 0.270196 +vt 0.937564 0.290966 +vt 0.937627 0.311735 +vt 0.937691 0.332505 +vt 0.958015 0.187054 +vt 0.958078 0.207824 +vt 0.958142 0.228593 +vt 0.958206 0.249363 +vt 0.958270 0.270132 +vt 0.958333 0.290902 +vt 0.958397 0.311672 +vt 0.958461 0.332441 +vt 0.978784 0.186990 +vt 0.978848 0.207760 +vt 0.978912 0.228529 +vt 0.978975 0.249299 +vt 0.979039 0.270069 +vt 0.979103 0.290838 +vt 0.979167 0.311608 +vt 0.979230 0.332378 +vt 0.999554 0.186927 +vt 0.999618 0.207696 +vt 0.999681 0.228466 +vt 0.999745 0.249235 +vt 0.999809 0.270005 +vt 0.999873 0.290775 +vt 0.999936 0.311544 +vt 1.000000 0.332314 +vt 0.812627 0.187500 +vt 0.812564 0.166730 +vt 0.791858 0.187564 +vt 0.791794 0.166794 +vt 0.771088 0.187627 +vt 0.771025 0.166858 +vt 0.750319 0.187691 +vt 0.750255 0.166922 +vt 0.729549 0.187755 +vt 0.729485 0.166985 +vt 0.708779 0.187819 +vt 0.708716 0.167049 +vt 0.688010 0.187882 +vt 0.687946 0.167113 +vt 0.667240 0.187946 +vt 0.667176 0.167176 +vt 0.812691 0.208270 +vt 0.791922 0.208333 +vt 0.771152 0.208397 +vt 0.750382 0.208461 +vt 0.729613 0.208525 +vt 0.708843 0.208588 +vt 0.688073 0.208652 +vt 0.667304 0.208716 +vt 0.812755 0.229039 +vt 0.791985 0.229103 +vt 0.771216 0.229167 +vt 0.750446 0.229230 +vt 0.729676 0.229294 +vt 0.708907 0.229358 +vt 0.688137 0.229422 +vt 0.667368 0.229485 +vt 0.812819 0.249809 +vt 0.792049 0.249873 +vt 0.771279 0.249936 +vt 0.750510 0.250000 +vt 0.729740 0.250064 +vt 0.708970 0.250128 +vt 0.688201 0.250191 +vt 0.667431 0.250255 +vt 0.812882 0.270579 +vt 0.792113 0.270642 +vt 0.771343 0.270706 +vt 0.750573 0.270770 +vt 0.729804 0.270833 +vt 0.709034 0.270897 +vt 0.688265 0.270961 +vt 0.667495 0.271025 +vt 0.812946 0.291348 +vt 0.792176 0.291412 +vt 0.771407 0.291476 +vt 0.750637 0.291539 +vt 0.729868 0.291603 +vt 0.709098 0.291667 +vt 0.688328 0.291730 +vt 0.667559 0.291794 +vt 0.813010 0.312118 +vt 0.792240 0.312182 +vt 0.771470 0.312245 +vt 0.750701 0.312309 +vt 0.729931 0.312373 +vt 0.709162 0.312436 +vt 0.688392 0.312500 +vt 0.667622 0.312564 +vt 0.813073 0.332887 +vt 0.792304 0.332951 +vt 0.771534 0.333015 +vt 0.750765 0.333079 +vt 0.729995 0.333142 +vt 0.709225 0.333206 +vt 0.688456 0.333270 +vt 0.812500 0.145961 +vt 0.812436 0.125191 +vt 0.812373 0.104422 +vt 0.812309 0.083652 +vt 0.812245 0.062882 +vt 0.812181 0.042113 +vt 0.812118 0.021343 +vt 0.812054 0.000573 +vt 0.791730 0.146025 +vt 0.791667 0.125255 +vt 0.791603 0.104485 +vt 0.791539 0.083716 +vt 0.791476 0.062946 +vt 0.791412 0.042176 +vt 0.791348 0.021407 +vt 0.791284 0.000637 +vt 0.770961 0.146088 +vt 0.770897 0.125319 +vt 0.770833 0.104549 +vt 0.770770 0.083779 +vt 0.770706 0.063010 +vt 0.770642 0.042240 +vt 0.770579 0.021470 +vt 0.770515 0.000701 +vt 0.750191 0.146152 +vt 0.750127 0.125382 +vt 0.750064 0.104613 +vt 0.750000 0.083843 +vt 0.749936 0.063073 +vt 0.749873 0.042304 +vt 0.749809 0.021534 +vt 0.749745 0.000765 +vt 0.729422 0.146216 +vt 0.729358 0.125446 +vt 0.729294 0.104676 +vt 0.729230 0.083907 +vt 0.729167 0.063137 +vt 0.729103 0.042368 +vt 0.729039 0.021598 +vt 0.728976 0.000828 +vt 0.708652 0.146279 +vt 0.708588 0.125510 +vt 0.708525 0.104740 +vt 0.708461 0.083971 +vt 0.708397 0.063201 +vt 0.708333 0.042431 +vt 0.708270 0.021662 +vt 0.708206 0.000892 +vt 0.687882 0.146343 +vt 0.687819 0.125573 +vt 0.687755 0.104804 +vt 0.687691 0.084034 +vt 0.687627 0.063265 +vt 0.687564 0.042495 +vt 0.687500 0.021725 +vt 0.687436 0.000956 +vt 0.667113 0.146407 +vt 0.667049 0.125637 +vt 0.666985 0.104868 +vt 0.666922 0.084098 +vt 0.666858 0.063328 +vt 0.666794 0.042559 +vt 0.666730 0.021789 +vt 0.666667 0.001019 +vt 0.500000 0.166667 +vt 0.500064 0.187436 +vt 0.479294 0.187500 +vt 0.479230 0.166730 +vt 0.458525 0.187564 +vt 0.458461 0.166794 +vt 0.437755 0.187627 +vt 0.437691 0.166858 +vt 0.416985 0.187691 +vt 0.416922 0.166922 +vt 0.396216 0.187755 +vt 0.396152 0.166985 +vt 0.375446 0.187819 +vt 0.375382 0.167049 +vt 0.354676 0.187882 +vt 0.354613 0.167113 +vt 0.333907 0.187946 +vt 0.333843 0.167176 +vt 0.500127 0.208206 +vt 0.479358 0.208270 +vt 0.458588 0.208333 +vt 0.437819 0.208397 +vt 0.417049 0.208461 +vt 0.396279 0.208525 +vt 0.375510 0.208588 +vt 0.354740 0.208652 +vt 0.333971 0.208716 +vt 0.500191 0.228976 +vt 0.479422 0.229039 +vt 0.458652 0.229103 +vt 0.437882 0.229167 +vt 0.417113 0.229230 +vt 0.396343 0.229294 +vt 0.375574 0.229358 +vt 0.354804 0.229422 +vt 0.334034 0.229485 +vt 0.500255 0.249745 +vt 0.479485 0.249809 +vt 0.458716 0.249873 +vt 0.437946 0.249936 +vt 0.417176 0.250000 +vt 0.396407 0.250064 +vt 0.375637 0.250128 +vt 0.354868 0.250191 +vt 0.334098 0.250255 +vt 0.500319 0.270515 +vt 0.479549 0.270579 +vt 0.458779 0.270642 +vt 0.438010 0.270706 +vt 0.417240 0.270770 +vt 0.396471 0.270833 +vt 0.375701 0.270897 +vt 0.354931 0.270961 +vt 0.334162 0.271025 +vt 0.500382 0.291284 +vt 0.479613 0.291348 +vt 0.458843 0.291412 +vt 0.438074 0.291476 +vt 0.417304 0.291539 +vt 0.396534 0.291603 +vt 0.375765 0.291667 +vt 0.354995 0.291730 +vt 0.334225 0.291794 +vt 0.500446 0.312054 +vt 0.479676 0.312118 +vt 0.458907 0.312182 +vt 0.438137 0.312245 +vt 0.417368 0.312309 +vt 0.396598 0.312373 +vt 0.375828 0.312436 +vt 0.355059 0.312500 +vt 0.334289 0.312564 +vt 0.500510 0.332824 +vt 0.479740 0.332887 +vt 0.458971 0.332951 +vt 0.438201 0.333015 +vt 0.417431 0.333079 +vt 0.396662 0.333142 +vt 0.375892 0.333206 +vt 0.355122 0.333270 +vt 0.334353 0.333333 +vt 0.479167 0.145961 +vt 0.499936 0.145897 +vt 0.479103 0.125191 +vt 0.499873 0.125127 +vt 0.479039 0.104422 +vt 0.499809 0.104358 +vt 0.478976 0.083652 +vt 0.499745 0.083588 +vt 0.478912 0.062882 +vt 0.499681 0.062819 +vt 0.478848 0.042113 +vt 0.499618 0.042049 +vt 0.478784 0.021343 +vt 0.499554 0.021279 +vt 0.478721 0.000573 +vt 0.499490 0.000510 +vt 0.458397 0.146025 +vt 0.458333 0.125255 +vt 0.458270 0.104485 +vt 0.458206 0.083716 +vt 0.458142 0.062946 +vt 0.458079 0.042176 +vt 0.458015 0.021407 +vt 0.457951 0.000637 +vt 0.437627 0.146088 +vt 0.437564 0.125319 +vt 0.437500 0.104549 +vt 0.437436 0.083779 +vt 0.437373 0.063010 +vt 0.437309 0.042240 +vt 0.437245 0.021471 +vt 0.437181 0.000701 +vt 0.416858 0.146152 +vt 0.416794 0.125382 +vt 0.416730 0.104613 +vt 0.416667 0.083843 +vt 0.416603 0.063073 +vt 0.416539 0.042304 +vt 0.416476 0.021534 +vt 0.416412 0.000765 +vt 0.396088 0.146216 +vt 0.396025 0.125446 +vt 0.395961 0.104676 +vt 0.395897 0.083907 +vt 0.395833 0.063137 +vt 0.395770 0.042368 +vt 0.395706 0.021598 +vt 0.395642 0.000828 +vt 0.375319 0.146279 +vt 0.375255 0.125510 +vt 0.375191 0.104740 +vt 0.375127 0.083971 +vt 0.375064 0.063201 +vt 0.375000 0.042431 +vt 0.374936 0.021662 +vt 0.374873 0.000892 +vt 0.354549 0.146343 +vt 0.354485 0.125574 +vt 0.354422 0.104804 +vt 0.354358 0.084034 +vt 0.354294 0.063265 +vt 0.354230 0.042495 +vt 0.354167 0.021725 +vt 0.354103 0.000956 +vt 0.333779 0.146407 +vt 0.333716 0.125637 +vt 0.333652 0.104868 +vt 0.333588 0.084098 +vt 0.333525 0.063328 +vt 0.333461 0.042559 +vt 0.333397 0.021789 +vt 0.333333 0.001020 +vt 0.520706 0.145833 +vt 0.520770 0.166603 +vt 0.541476 0.145770 +vt 0.541539 0.166539 +vt 0.562245 0.145706 +vt 0.562309 0.166476 +vt 0.583015 0.145642 +vt 0.583079 0.166412 +vt 0.603784 0.145579 +vt 0.603848 0.166348 +vt 0.624554 0.145515 +vt 0.624618 0.166284 +vt 0.645324 0.145451 +vt 0.645387 0.166221 +vt 0.666093 0.145387 +vt 0.666157 0.166157 +vt 0.520642 0.125064 +vt 0.541412 0.125000 +vt 0.562181 0.124936 +vt 0.582951 0.124873 +vt 0.603721 0.124809 +vt 0.624490 0.124745 +vt 0.645260 0.124681 +vt 0.666030 0.124618 +vt 0.520579 0.104294 +vt 0.541348 0.104230 +vt 0.562118 0.104167 +vt 0.582887 0.104103 +vt 0.603657 0.104039 +vt 0.624427 0.103976 +vt 0.645196 0.103912 +vt 0.665966 0.103848 +vt 0.520515 0.083525 +vt 0.541284 0.083461 +vt 0.562054 0.083397 +vt 0.582824 0.083333 +vt 0.603593 0.083270 +vt 0.624363 0.083206 +vt 0.645132 0.083142 +vt 0.665902 0.083078 +vt 0.520451 0.062755 +vt 0.541221 0.062691 +vt 0.561990 0.062627 +vt 0.582760 0.062564 +vt 0.603530 0.062500 +vt 0.624299 0.062436 +vt 0.645069 0.062373 +vt 0.665838 0.062309 +vt 0.520387 0.041985 +vt 0.541157 0.041922 +vt 0.561927 0.041858 +vt 0.582696 0.041794 +vt 0.603466 0.041730 +vt 0.624235 0.041667 +vt 0.645005 0.041603 +vt 0.665775 0.041539 +vt 0.520324 0.021216 +vt 0.541093 0.021152 +vt 0.561863 0.021088 +vt 0.582632 0.021024 +vt 0.603402 0.020961 +vt 0.624172 0.020897 +vt 0.644941 0.020833 +vt 0.665711 0.020770 +vt 0.520260 0.000446 +vt 0.541030 0.000382 +vt 0.561799 0.000319 +vt 0.582569 0.000255 +vt 0.603338 0.000191 +vt 0.624108 0.000127 +vt 0.644878 0.000064 +vt 0.665647 0.000000 +vt 0.520833 0.187373 +vt 0.520897 0.208142 +vt 0.520961 0.228912 +vt 0.521025 0.249681 +vt 0.521088 0.270451 +vt 0.521152 0.291221 +vt 0.521216 0.311990 +vt 0.521279 0.332760 +vt 0.541603 0.187309 +vt 0.541667 0.208079 +vt 0.541730 0.228848 +vt 0.541794 0.249618 +vt 0.541858 0.270387 +vt 0.541922 0.291157 +vt 0.541985 0.311927 +vt 0.542049 0.332696 +vt 0.562373 0.187245 +vt 0.562436 0.208015 +vt 0.562500 0.228784 +vt 0.562564 0.249554 +vt 0.562627 0.270324 +vt 0.562691 0.291093 +vt 0.562755 0.311863 +vt 0.562819 0.332633 +vt 0.583142 0.187181 +vt 0.583206 0.207951 +vt 0.583270 0.228721 +vt 0.583333 0.249490 +vt 0.583397 0.270260 +vt 0.583461 0.291030 +vt 0.583525 0.311799 +vt 0.583588 0.332569 +vt 0.603912 0.187118 +vt 0.603976 0.207887 +vt 0.604039 0.228657 +vt 0.604103 0.249427 +vt 0.604167 0.270196 +vt 0.604230 0.290966 +vt 0.604294 0.311735 +vt 0.604358 0.332505 +vt 0.624681 0.187054 +vt 0.624745 0.207824 +vt 0.624809 0.228593 +vt 0.624873 0.249363 +vt 0.624936 0.270133 +vt 0.625000 0.290902 +vt 0.625064 0.311672 +vt 0.625127 0.332441 +vt 0.645451 0.186990 +vt 0.645515 0.207760 +vt 0.645579 0.228530 +vt 0.645642 0.249299 +vt 0.645706 0.270069 +vt 0.645770 0.290838 +vt 0.645833 0.311608 +vt 0.645897 0.332378 +vt 0.666221 0.186927 +vt 0.666284 0.207696 +vt 0.666348 0.228466 +vt 0.666412 0.249235 +vt 0.666476 0.270005 +vt 0.666539 0.290775 +vt 0.666603 0.311544 +vt 0.666667 0.332314 +vt 0.166667 0.500000 +vt 0.166603 0.479231 +vt 0.187373 0.479167 +vt 0.187436 0.499936 +vt 0.208142 0.479103 +vt 0.208206 0.499873 +vt 0.228912 0.479039 +vt 0.228976 0.499809 +vt 0.249681 0.478976 +vt 0.249745 0.499745 +vt 0.270451 0.478912 +vt 0.270515 0.499682 +vt 0.291221 0.478848 +vt 0.291284 0.499618 +vt 0.311990 0.478785 +vt 0.312054 0.499554 +vt 0.332760 0.478721 +vt 0.332824 0.499490 +vt 0.166539 0.458461 +vt 0.187309 0.458397 +vt 0.208078 0.458333 +vt 0.228848 0.458270 +vt 0.249618 0.458206 +vt 0.270387 0.458142 +vt 0.291157 0.458079 +vt 0.311927 0.458015 +vt 0.332696 0.457951 +vt 0.166476 0.437691 +vt 0.187245 0.437628 +vt 0.208015 0.437564 +vt 0.228784 0.437500 +vt 0.249554 0.437436 +vt 0.270324 0.437373 +vt 0.291093 0.437309 +vt 0.311863 0.437245 +vt 0.332632 0.437182 +vt 0.166412 0.416922 +vt 0.187181 0.416858 +vt 0.207951 0.416794 +vt 0.228721 0.416731 +vt 0.249490 0.416667 +vt 0.270260 0.416603 +vt 0.291030 0.416539 +vt 0.311799 0.416476 +vt 0.332569 0.416412 +vt 0.166348 0.396152 +vt 0.187118 0.396088 +vt 0.207887 0.396025 +vt 0.228657 0.395961 +vt 0.249427 0.395897 +vt 0.270196 0.395833 +vt 0.290966 0.395770 +vt 0.311735 0.395706 +vt 0.332505 0.395642 +vt 0.166284 0.375382 +vt 0.187054 0.375319 +vt 0.207824 0.375255 +vt 0.228593 0.375191 +vt 0.249363 0.375128 +vt 0.270132 0.375064 +vt 0.290902 0.375000 +vt 0.311672 0.374936 +vt 0.332441 0.374873 +vt 0.166221 0.354613 +vt 0.186990 0.354549 +vt 0.207760 0.354485 +vt 0.228530 0.354422 +vt 0.249299 0.354358 +vt 0.270069 0.354294 +vt 0.290838 0.354231 +vt 0.311608 0.354167 +vt 0.332378 0.354103 +vt 0.166157 0.333843 +vt 0.186927 0.333780 +vt 0.207696 0.333716 +vt 0.228466 0.333652 +vt 0.249235 0.333588 +vt 0.270005 0.333525 +vt 0.290775 0.333461 +vt 0.311544 0.333397 +vt 0.332314 0.333333 +vt 0.187500 0.520706 +vt 0.166730 0.520770 +vt 0.187564 0.541476 +vt 0.166794 0.541539 +vt 0.187627 0.562245 +vt 0.166858 0.562309 +vt 0.187691 0.583015 +vt 0.166922 0.583079 +vt 0.187755 0.603785 +vt 0.166985 0.603848 +vt 0.187819 0.624554 +vt 0.167049 0.624618 +vt 0.187882 0.645324 +vt 0.167113 0.645387 +vt 0.187946 0.666093 +vt 0.167176 0.666157 +vt 0.208270 0.520642 +vt 0.208333 0.541412 +vt 0.208397 0.562182 +vt 0.208461 0.582951 +vt 0.208525 0.603721 +vt 0.208588 0.624490 +vt 0.208652 0.645260 +vt 0.208716 0.666030 +vt 0.229039 0.520579 +vt 0.229103 0.541348 +vt 0.229167 0.562118 +vt 0.229230 0.582887 +vt 0.229294 0.603657 +vt 0.229358 0.624427 +vt 0.229422 0.645196 +vt 0.229485 0.665966 +vt 0.249809 0.520515 +vt 0.249873 0.541285 +vt 0.249936 0.562054 +vt 0.250000 0.582824 +vt 0.250064 0.603593 +vt 0.250127 0.624363 +vt 0.250191 0.645133 +vt 0.250255 0.665902 +vt 0.270579 0.520451 +vt 0.270642 0.541221 +vt 0.270706 0.561990 +vt 0.270770 0.582760 +vt 0.270833 0.603530 +vt 0.270897 0.624299 +vt 0.270961 0.645069 +vt 0.271025 0.665839 +vt 0.291348 0.520387 +vt 0.291412 0.541157 +vt 0.291476 0.561927 +vt 0.291539 0.582696 +vt 0.291603 0.603466 +vt 0.291667 0.624236 +vt 0.291730 0.645005 +vt 0.291794 0.665775 +vt 0.312118 0.520324 +vt 0.312181 0.541093 +vt 0.312245 0.561863 +vt 0.312309 0.582633 +vt 0.312373 0.603402 +vt 0.312436 0.624172 +vt 0.312500 0.644941 +vt 0.312564 0.665711 +vt 0.332887 0.520260 +vt 0.332951 0.541030 +vt 0.333015 0.561799 +vt 0.333079 0.582569 +vt 0.333142 0.603338 +vt 0.333206 0.624108 +vt 0.333270 0.644878 +vt 0.333333 0.665647 +vt 0.145961 0.520833 +vt 0.145897 0.500064 +vt 0.125191 0.520897 +vt 0.125127 0.500128 +vt 0.104422 0.520961 +vt 0.104358 0.500191 +vt 0.083652 0.521025 +vt 0.083588 0.500255 +vt 0.062882 0.521088 +vt 0.062819 0.500319 +vt 0.042113 0.521152 +vt 0.042049 0.500382 +vt 0.021343 0.521216 +vt 0.021279 0.500446 +vt 0.000573 0.521280 +vt 0.000510 0.500510 +vt 0.146025 0.541603 +vt 0.125255 0.541667 +vt 0.104485 0.541731 +vt 0.083716 0.541794 +vt 0.062946 0.541858 +vt 0.042176 0.541922 +vt 0.021407 0.541985 +vt 0.000637 0.542049 +vt 0.146088 0.562373 +vt 0.125319 0.562436 +vt 0.104549 0.562500 +vt 0.083779 0.562564 +vt 0.063010 0.562628 +vt 0.042240 0.562691 +vt 0.021471 0.562755 +vt 0.000701 0.562819 +vt 0.146152 0.583142 +vt 0.125382 0.583206 +vt 0.104613 0.583270 +vt 0.083843 0.583333 +vt 0.063074 0.583397 +vt 0.042304 0.583461 +vt 0.021534 0.583525 +vt 0.000765 0.583588 +vt 0.146216 0.603912 +vt 0.125446 0.603976 +vt 0.104676 0.604039 +vt 0.083907 0.604103 +vt 0.063137 0.604167 +vt 0.042368 0.604231 +vt 0.021598 0.604294 +vt 0.000828 0.604358 +vt 0.146279 0.624682 +vt 0.125510 0.624745 +vt 0.104740 0.624809 +vt 0.083971 0.624873 +vt 0.063201 0.624936 +vt 0.042431 0.625000 +vt 0.021662 0.625064 +vt 0.000892 0.625128 +vt 0.146343 0.645451 +vt 0.125574 0.645515 +vt 0.104804 0.645579 +vt 0.084034 0.645642 +vt 0.063265 0.645706 +vt 0.042495 0.645770 +vt 0.021725 0.645833 +vt 0.000956 0.645897 +vt 0.146407 0.666221 +vt 0.125637 0.666285 +vt 0.104868 0.666348 +vt 0.084098 0.666412 +vt 0.063328 0.666476 +vt 0.042559 0.666539 +vt 0.021789 0.666603 +vt 0.001020 0.666667 +vt 0.145833 0.479294 +vt 0.145770 0.458525 +vt 0.145706 0.437755 +vt 0.145642 0.416985 +vt 0.145578 0.396216 +vt 0.145515 0.375446 +vt 0.145451 0.354677 +vt 0.145387 0.333907 +vt 0.125064 0.479358 +vt 0.125000 0.458588 +vt 0.124936 0.437819 +vt 0.124873 0.417049 +vt 0.124809 0.396280 +vt 0.124745 0.375510 +vt 0.124681 0.354740 +vt 0.124618 0.333971 +vt 0.104294 0.479422 +vt 0.104230 0.458652 +vt 0.104167 0.437882 +vt 0.104103 0.417113 +vt 0.104039 0.396343 +vt 0.103976 0.375574 +vt 0.103912 0.354804 +vt 0.103848 0.334034 +vt 0.083525 0.479485 +vt 0.083461 0.458716 +vt 0.083397 0.437946 +vt 0.083333 0.417177 +vt 0.083270 0.396407 +vt 0.083206 0.375637 +vt 0.083142 0.354868 +vt 0.083078 0.334098 +vt 0.062755 0.479549 +vt 0.062691 0.458780 +vt 0.062627 0.438010 +vt 0.062564 0.417240 +vt 0.062500 0.396471 +vt 0.062436 0.375701 +vt 0.062373 0.354931 +vt 0.062309 0.334162 +vt 0.041985 0.479613 +vt 0.041922 0.458843 +vt 0.041858 0.438074 +vt 0.041794 0.417304 +vt 0.041730 0.396534 +vt 0.041667 0.375765 +vt 0.041603 0.354995 +vt 0.041539 0.334226 +vt 0.021216 0.479677 +vt 0.021152 0.458907 +vt 0.021088 0.438137 +vt 0.021025 0.417368 +vt 0.020961 0.396598 +vt 0.020897 0.375829 +vt 0.020833 0.355059 +vt 0.020770 0.334289 +vt 0.000446 0.479740 +vt 0.000382 0.458971 +vt 0.000319 0.438201 +vt 0.000255 0.417431 +vt 0.000191 0.396662 +vt 0.000127 0.375892 +vt 0.000064 0.355123 +vt 0.000000 0.334353 +vt 0.166667 0.166667 +vt 0.166603 0.145897 +vt 0.187373 0.145833 +vt 0.187436 0.166603 +vt 0.208142 0.145770 +vt 0.208206 0.166539 +vt 0.228912 0.145706 +vt 0.228976 0.166476 +vt 0.249682 0.145642 +vt 0.249745 0.166412 +vt 0.270451 0.145579 +vt 0.270515 0.166348 +vt 0.291221 0.145515 +vt 0.291284 0.166284 +vt 0.311990 0.145451 +vt 0.312054 0.166221 +vt 0.332760 0.145387 +vt 0.332824 0.166157 +vt 0.166539 0.125128 +vt 0.187309 0.125064 +vt 0.208079 0.125000 +vt 0.228848 0.124936 +vt 0.249618 0.124873 +vt 0.270387 0.124809 +vt 0.291157 0.124745 +vt 0.311927 0.124681 +vt 0.332696 0.124618 +vt 0.166476 0.104358 +vt 0.187245 0.104294 +vt 0.208015 0.104230 +vt 0.228784 0.104167 +vt 0.249554 0.104103 +vt 0.270324 0.104039 +vt 0.291093 0.103976 +vt 0.311863 0.103912 +vt 0.332633 0.103848 +vt 0.166412 0.083588 +vt 0.187181 0.083525 +vt 0.207951 0.083461 +vt 0.228721 0.083397 +vt 0.249490 0.083333 +vt 0.270260 0.083270 +vt 0.291030 0.083206 +vt 0.311799 0.083142 +vt 0.332569 0.083078 +vt 0.166348 0.062819 +vt 0.187118 0.062755 +vt 0.207887 0.062691 +vt 0.228657 0.062627 +vt 0.249427 0.062564 +vt 0.270196 0.062500 +vt 0.290966 0.062436 +vt 0.311735 0.062373 +vt 0.332505 0.062309 +vt 0.166284 0.042049 +vt 0.187054 0.041985 +vt 0.207824 0.041922 +vt 0.228593 0.041858 +vt 0.249363 0.041794 +vt 0.270133 0.041730 +vt 0.290902 0.041667 +vt 0.311672 0.041603 +vt 0.332441 0.041539 +vt 0.166221 0.021279 +vt 0.186990 0.021216 +vt 0.207760 0.021152 +vt 0.228530 0.021088 +vt 0.249299 0.021025 +vt 0.270069 0.020961 +vt 0.290838 0.020897 +vt 0.311608 0.020833 +vt 0.332378 0.020770 +vt 0.166157 0.000510 +vt 0.186927 0.000446 +vt 0.207696 0.000382 +vt 0.228466 0.000319 +vt 0.249235 0.000255 +vt 0.270005 0.000191 +vt 0.290775 0.000127 +vt 0.311544 0.000064 +vt 0.332314 0.000000 +vt 0.187500 0.187373 +vt 0.166730 0.187436 +vt 0.187564 0.208142 +vt 0.166794 0.208206 +vt 0.187628 0.228912 +vt 0.166858 0.228976 +vt 0.187691 0.249681 +vt 0.166922 0.249745 +vt 0.187755 0.270451 +vt 0.166985 0.270515 +vt 0.187819 0.291221 +vt 0.167049 0.291284 +vt 0.187882 0.311990 +vt 0.167113 0.312054 +vt 0.187946 0.332760 +vt 0.167176 0.332824 +vt 0.208270 0.187309 +vt 0.208333 0.208079 +vt 0.208397 0.228848 +vt 0.208461 0.249618 +vt 0.208525 0.270387 +vt 0.208588 0.291157 +vt 0.208652 0.311927 +vt 0.208716 0.332696 +vt 0.229039 0.187245 +vt 0.229103 0.208015 +vt 0.229167 0.228784 +vt 0.229230 0.249554 +vt 0.229294 0.270324 +vt 0.229358 0.291093 +vt 0.229422 0.311863 +vt 0.229485 0.332633 +vt 0.249809 0.187181 +vt 0.249873 0.207951 +vt 0.249936 0.228721 +vt 0.250000 0.249490 +vt 0.250064 0.270260 +vt 0.250127 0.291030 +vt 0.250191 0.311799 +vt 0.250255 0.332569 +vt 0.270579 0.187118 +vt 0.270642 0.207887 +vt 0.270706 0.228657 +vt 0.270770 0.249427 +vt 0.270833 0.270196 +vt 0.270897 0.290966 +vt 0.270961 0.311735 +vt 0.271025 0.332505 +vt 0.291348 0.187054 +vt 0.291412 0.207824 +vt 0.291476 0.228593 +vt 0.291539 0.249363 +vt 0.291603 0.270133 +vt 0.291667 0.290902 +vt 0.291730 0.311672 +vt 0.291794 0.332441 +vt 0.312118 0.186990 +vt 0.312182 0.207760 +vt 0.312245 0.228530 +vt 0.312309 0.249299 +vt 0.312373 0.270069 +vt 0.312436 0.290838 +vt 0.312500 0.311608 +vt 0.312564 0.332378 +vt 0.332887 0.186927 +vt 0.332951 0.207696 +vt 0.333015 0.228466 +vt 0.333079 0.249235 +vt 0.333142 0.270005 +vt 0.333206 0.290775 +vt 0.333270 0.311544 +vt 0.333333 0.332314 +vt 0.145961 0.187500 +vt 0.145897 0.166730 +vt 0.125191 0.187564 +vt 0.125127 0.166794 +vt 0.104422 0.187628 +vt 0.104358 0.166858 +vt 0.083652 0.187691 +vt 0.083588 0.166922 +vt 0.062882 0.187755 +vt 0.062819 0.166985 +vt 0.042113 0.187819 +vt 0.042049 0.167049 +vt 0.021343 0.187882 +vt 0.021279 0.167113 +vt 0.000574 0.187946 +vt 0.000510 0.167177 +vt 0.146025 0.208270 +vt 0.125255 0.208333 +vt 0.104485 0.208397 +vt 0.083716 0.208461 +vt 0.062946 0.208525 +vt 0.042176 0.208588 +vt 0.021407 0.208652 +vt 0.000637 0.208716 +vt 0.146088 0.229039 +vt 0.125319 0.229103 +vt 0.104549 0.229167 +vt 0.083779 0.229230 +vt 0.063010 0.229294 +vt 0.042240 0.229358 +vt 0.021471 0.229422 +vt 0.000701 0.229485 +vt 0.146152 0.249809 +vt 0.125382 0.249873 +vt 0.104613 0.249936 +vt 0.083843 0.250000 +vt 0.063074 0.250064 +vt 0.042304 0.250128 +vt 0.021534 0.250191 +vt 0.000765 0.250255 +vt 0.146216 0.270579 +vt 0.125446 0.270642 +vt 0.104676 0.270706 +vt 0.083907 0.270770 +vt 0.063137 0.270833 +vt 0.042368 0.270897 +vt 0.021598 0.270961 +vt 0.000828 0.271025 +vt 0.146279 0.291348 +vt 0.125510 0.291412 +vt 0.104740 0.291476 +vt 0.083971 0.291539 +vt 0.063201 0.291603 +vt 0.042431 0.291667 +vt 0.021662 0.291731 +vt 0.000892 0.291794 +vt 0.146343 0.312118 +vt 0.125574 0.312182 +vt 0.104804 0.312245 +vt 0.084034 0.312309 +vt 0.063265 0.312373 +vt 0.042495 0.312436 +vt 0.021725 0.312500 +vt 0.000956 0.312564 +vt 0.146407 0.332887 +vt 0.125637 0.332951 +vt 0.104868 0.333015 +vt 0.084098 0.333079 +vt 0.063328 0.333142 +vt 0.042559 0.333206 +vt 0.021789 0.333270 +vt 0.001020 0.333333 +vt 0.145833 0.145961 +vt 0.145770 0.125191 +vt 0.145706 0.104422 +vt 0.145642 0.083652 +vt 0.145579 0.062882 +vt 0.145515 0.042113 +vt 0.145451 0.021343 +vt 0.145387 0.000574 +vt 0.125064 0.146025 +vt 0.125000 0.125255 +vt 0.124936 0.104485 +vt 0.124873 0.083716 +vt 0.124809 0.062946 +vt 0.124745 0.042176 +vt 0.124681 0.021407 +vt 0.124618 0.000637 +vt 0.104294 0.146088 +vt 0.104230 0.125319 +vt 0.104167 0.104549 +vt 0.104103 0.083779 +vt 0.104039 0.063010 +vt 0.103976 0.042240 +vt 0.103912 0.021471 +vt 0.103848 0.000701 +vt 0.083525 0.146152 +vt 0.083461 0.125382 +vt 0.083397 0.104613 +vt 0.083333 0.083843 +vt 0.083270 0.063074 +vt 0.083206 0.042304 +vt 0.083142 0.021534 +vt 0.083078 0.000765 +vt 0.062755 0.146216 +vt 0.062691 0.125446 +vt 0.062627 0.104677 +vt 0.062564 0.083907 +vt 0.062500 0.063137 +vt 0.062436 0.042368 +vt 0.062373 0.021598 +vt 0.062309 0.000828 +vt 0.041985 0.146279 +vt 0.041922 0.125510 +vt 0.041858 0.104740 +vt 0.041794 0.083971 +vt 0.041730 0.063201 +vt 0.041667 0.042431 +vt 0.041603 0.021662 +vt 0.041539 0.000892 +vt 0.021216 0.146343 +vt 0.021152 0.125574 +vt 0.021088 0.104804 +vt 0.021025 0.084034 +vt 0.020961 0.063265 +vt 0.020897 0.042495 +vt 0.020833 0.021725 +vt 0.020770 0.000956 +vt 0.000446 0.146407 +vt 0.000382 0.125637 +vt 0.000319 0.104868 +vt 0.000255 0.084098 +vt 0.000191 0.063328 +vt 0.000127 0.042559 +vt 0.000064 0.021789 +vt 0.000000 0.001020 +vn -0.312418 -0.893490 0.322489 +vn -0.233253 -0.952666 0.194952 +vn -0.113742 -0.987274 0.110935 +vn -0.187323 -0.951262 0.244881 +vn 0.049287 -0.991272 0.122044 +vn 0.035646 -0.988159 0.149022 +vn 0.269509 -0.947081 0.174169 +vn 0.312052 -0.941771 0.125004 +vn 0.411603 -0.900327 0.141301 +vn 0.331919 -0.936766 0.110691 +vn 0.481796 -0.876095 -0.016663 +vn 0.356975 -0.933470 0.034059 +vn 0.621845 -0.760521 -0.186712 +vn 0.581256 -0.813685 -0.006897 +vn 0.796075 -0.553301 -0.245155 +vn 0.784478 -0.618000 -0.051393 +vn 0.863796 -0.434156 -0.255623 +vn 0.849940 -0.501877 -0.160222 +vn -0.055574 -0.979400 0.194037 +vn -0.061159 -0.996582 0.055177 +vn 0.006195 -0.999542 0.028565 +vn 0.257088 -0.965789 0.033235 +vn 0.473159 -0.879604 0.048738 +vn 0.608417 -0.793603 -0.001068 +vn 0.716178 -0.688803 -0.112278 +vn 0.819697 -0.541337 -0.187048 +vn 0.889431 -0.401044 -0.219153 +vn 0.165807 -0.984497 0.057161 +vn 0.050966 -0.992859 -0.107822 +vn 0.029389 -0.974334 -0.223151 +vn 0.242561 -0.938688 -0.244972 +vn 0.433424 -0.884304 -0.173467 +vn 0.630665 -0.771477 -0.083895 +vn 0.767083 -0.637532 -0.071352 +vn 0.843715 -0.527604 -0.098544 +vn 0.913175 -0.392132 -0.111026 +vn 0.268502 -0.951659 -0.149113 +vn 0.189093 -0.958068 -0.215186 +vn 0.110965 -0.940794 -0.320231 +vn 0.233345 -0.900235 -0.367504 +vn 0.372112 -0.855556 -0.359874 +vn 0.594378 -0.737144 -0.321329 +vn 0.759453 -0.597919 -0.256233 +vn 0.824763 -0.537858 -0.174444 +vn 0.917356 -0.375958 -0.130711 +vn 0.240547 -0.844844 -0.477828 +vn 0.287088 -0.840358 -0.459700 +vn 0.173315 -0.842982 -0.509201 +vn 0.205725 -0.841517 -0.499496 +vn 0.355449 -0.811884 -0.463118 +vn 0.588427 -0.668294 -0.455061 +vn 0.715201 -0.536210 -0.448225 +vn 0.751091 -0.472915 -0.460585 +vn 0.850642 -0.230293 -0.472549 +vn 0.159703 -0.606586 -0.778802 +vn 0.253456 -0.643666 -0.722098 +vn 0.131565 -0.730033 -0.670583 +vn 0.137791 -0.780023 -0.610370 +vn 0.338054 -0.761498 -0.552995 +vn 0.594745 -0.645009 -0.479751 +vn 0.753563 -0.480728 -0.448286 +vn 0.763909 -0.316568 -0.562304 +vn 0.790338 -0.038270 -0.611438 +vn 0.105380 -0.581072 -0.806970 +vn 0.163152 -0.619373 -0.767907 +vn 0.050600 -0.682943 -0.728690 +vn 0.099277 -0.698630 -0.708518 +vn 0.339030 -0.626301 -0.701956 +vn 0.570727 -0.494003 -0.655873 +vn 0.765069 -0.324503 -0.556139 +vn 0.834193 -0.164739 -0.526231 +vn 0.868526 -0.068606 -0.490829 +vn 0.084323 -0.496933 -0.863674 +vn 0.100284 -0.507309 -0.855892 +vn 0.032167 -0.511460 -0.858669 +vn 0.110782 -0.491653 -0.863674 +vn 0.360302 -0.418195 -0.833827 +vn 0.570025 -0.297922 -0.765679 +vn 0.735649 -0.157414 -0.658773 +vn 0.821497 -0.105319 -0.560350 +vn 0.884426 -0.103336 -0.455031 +vn -0.272652 -0.828059 0.489822 +vn -0.259285 -0.837764 0.480483 +vn -0.244819 -0.863277 0.441298 +vn -0.118625 -0.930296 0.347026 +vn -0.075625 -0.987426 0.138737 +vn -0.029023 -0.999481 -0.011780 +vn 0.142521 -0.966765 0.212134 +vn 0.045045 -0.991089 0.125309 +vn 0.201514 -0.848323 0.489608 +vn 0.154973 -0.883724 0.441542 +vn 0.186377 -0.791833 0.581561 +vn 0.261727 -0.800043 0.539781 +vn 0.222755 -0.786065 0.576586 +vn 0.296030 -0.788202 0.539506 +vn 0.288980 -0.737449 0.610431 +vn 0.281228 -0.743187 0.607105 +vn -0.073519 -0.917325 0.391278 +vn -0.157659 -0.819544 0.550829 +vn -0.009735 -0.908353 0.418043 +vn 0.212592 -0.918119 0.334391 +vn 0.250435 -0.856105 0.452040 +vn 0.177526 -0.815210 0.551225 +vn 0.162420 -0.756279 0.633747 +vn 0.252358 -0.687521 0.680868 +vn 0.288766 -0.907315 0.305490 +vn 0.191900 -0.814051 0.548143 +vn 0.165227 -0.796594 0.581469 +vn 0.269631 -0.848537 0.455245 +vn 0.371319 -0.814539 0.445631 +vn 0.386364 -0.792444 0.471938 +vn 0.311655 -0.740989 0.594745 +vn 0.234077 -0.658406 0.715293 +vn 0.290445 -0.918424 0.268471 +vn 0.253517 -0.821131 0.511277 +vn 0.207617 -0.782006 0.587664 +vn 0.218970 -0.814447 0.537278 +vn 0.248909 -0.841426 0.479598 +vn 0.218909 -0.873318 0.435133 +vn 0.154576 -0.823542 0.545732 +vn 0.078280 -0.720237 0.689291 +vn 0.334605 -0.894589 0.296121 +vn 0.298990 -0.831324 0.468429 +vn 0.180120 -0.839076 0.513291 +vn 0.082034 -0.850154 0.520066 +vn 0.019776 -0.902188 0.430830 +vn -0.036805 -0.921079 0.387585 +vn -0.011444 -0.819025 0.573626 +vn 0.049898 -0.736076 0.675039 +vn 0.533952 -0.788507 0.305094 +vn 0.447218 -0.810236 0.378735 +vn 0.346873 -0.844050 0.408918 +vn 0.217597 -0.874172 0.434095 +vn 0.113681 -0.922147 0.369671 +vn 0.126560 -0.892087 0.433729 +vn 0.190863 -0.732933 0.652974 +vn 0.190161 -0.724815 0.662130 +vn 0.710349 -0.667135 0.224342 +vn 0.639027 -0.712394 0.290048 +vn 0.564653 -0.769189 0.299081 +vn 0.432936 -0.859584 0.271401 +vn 0.288827 -0.909177 0.299905 +vn 0.206824 -0.854335 0.476730 +vn 0.165258 -0.719901 0.674093 +vn 0.132694 -0.768792 0.625538 +vn 0.807245 -0.576769 0.125065 +vn 0.728568 -0.663869 0.168462 +vn 0.586108 -0.803369 0.105136 +vn 0.462294 -0.873043 0.155126 +vn 0.432844 -0.862362 0.262581 +vn 0.340739 -0.804346 0.486709 +vn 0.201453 -0.721274 0.662679 +vn 0.119510 -0.761071 0.637532 +vn -0.202307 -0.906095 0.371502 +vn -0.203467 -0.892850 0.401715 +vn 0.070406 -0.938200 0.338786 +vn 0.105350 -0.900174 0.422559 +vn 0.186254 -0.914945 0.357952 +vn 0.101901 -0.930540 0.351695 +vn 0.002411 -0.956145 0.292856 +vn -0.120975 -0.953673 0.275399 +vn -0.342082 -0.916898 0.205481 +vn -0.406262 -0.889889 0.207434 +vn -0.531816 -0.825953 0.186926 +vn -0.542894 -0.826350 0.149510 +vn -0.588397 -0.785241 0.192663 +vn -0.630726 -0.770501 0.092166 +vn -0.781457 -0.612842 0.117069 +vn -0.839839 -0.542467 0.019318 +vn -0.087100 -0.971496 0.220405 +vn 0.061068 -0.989502 0.130741 +vn 0.193426 -0.971862 0.134159 +vn 0.080294 -0.985534 0.149174 +vn -0.318552 -0.935545 0.152379 +vn -0.566210 -0.807031 0.167486 +vn -0.588061 -0.781732 0.207434 +vn -0.703299 -0.691061 0.166601 +vn -0.017060 -0.999695 -0.016419 +vn 0.064638 -0.997864 -0.006714 +vn 0.131230 -0.990234 0.046693 +vn 0.004120 -0.980316 0.197363 +vn -0.296121 -0.910092 0.289834 +vn -0.557482 -0.787835 0.261696 +vn -0.581469 -0.786737 0.207068 +vn -0.632527 -0.762749 0.134373 +vn -0.018555 -0.997772 0.063570 +vn 0.039552 -0.997467 0.058718 +vn -0.004456 -0.985321 0.170507 +vn -0.147435 -0.930815 0.334361 +vn -0.299509 -0.846431 0.440230 +vn -0.478500 -0.773309 0.415876 +vn -0.479507 -0.831996 0.278939 +vn -0.568651 -0.807276 0.157811 +vn 0.078646 -0.947264 0.310556 +vn 0.002258 -0.969512 0.244911 +vn -0.189825 -0.916196 0.352824 +vn -0.290170 -0.817866 0.496841 +vn -0.322733 -0.752007 0.574694 +vn -0.371868 -0.741386 0.558580 +vn -0.321512 -0.813990 0.483718 +vn -0.446303 -0.789087 0.422010 +vn 0.228736 -0.862362 0.451613 +vn -0.011658 -0.915098 0.402997 +vn -0.375195 -0.816919 0.437971 +vn -0.408094 -0.718558 0.563097 +vn -0.364605 -0.668020 0.648671 +vn -0.304880 -0.672048 0.674795 +vn -0.225593 -0.708792 0.668325 +vn -0.272469 -0.707785 0.651753 +vn 0.258431 -0.776971 0.573992 +vn -0.020203 -0.770379 0.637257 +vn -0.442824 -0.682394 0.581530 +vn -0.512803 -0.630879 0.582232 +vn -0.449568 -0.578722 0.680380 +vn -0.309153 -0.569109 0.761895 +vn -0.154363 -0.626057 0.764336 +vn -0.190832 -0.657277 0.729057 +vn 0.142094 -0.696982 0.702841 +vn -0.094241 -0.584460 0.805902 +vn -0.387127 -0.502609 0.772973 +vn -0.551927 -0.467849 0.690268 +vn -0.529405 -0.438643 0.726127 +vn -0.306467 -0.495834 0.812525 +vn -0.085360 -0.572497 0.815424 +vn -0.115757 -0.627705 0.769768 +vn -0.094455 -0.939909 0.328013 +vn 0.024354 -0.943480 0.330454 +vn 0.046937 -0.993103 0.107334 +vn -0.037904 -0.977172 -0.208991 +vn -0.111026 -0.835780 -0.537675 +vn -0.091983 -0.611621 -0.785760 +vn -0.024415 -0.582751 -0.812250 +vn -0.007172 -0.490585 -0.871334 +vn 0.074679 -0.929014 0.362377 +vn -0.043092 -0.953673 0.297678 +vn -0.229774 -0.973235 0.001862 +vn -0.366466 -0.885311 -0.286111 +vn -0.390118 -0.759667 -0.520249 +vn -0.304849 -0.638997 -0.706198 +vn -0.235786 -0.581622 -0.778497 +vn -0.243080 -0.443251 -0.862789 +vn -0.021393 -0.959593 0.280496 +vn -0.231361 -0.966491 0.110996 +vn -0.447829 -0.878658 -0.165441 +vn -0.556047 -0.759117 -0.338389 +vn -0.580157 -0.663228 -0.472762 +vn -0.556108 -0.582568 -0.592700 +vn -0.531175 -0.497330 -0.685903 +vn -0.491806 -0.370495 -0.787927 +vn -0.233314 -0.960479 0.151738 +vn -0.377819 -0.921812 -0.086428 +vn -0.512314 -0.785546 -0.347026 +vn -0.632405 -0.647359 -0.425367 +vn -0.690115 -0.560930 -0.457228 +vn -0.702994 -0.485611 -0.519547 +vn -0.697043 -0.405133 -0.591540 +vn -0.667318 -0.330454 -0.667409 +vn -0.487503 -0.872341 0.036561 +vn -0.557176 -0.806970 -0.195654 +vn -0.571978 -0.690573 -0.442610 +vn -0.591144 -0.610736 -0.526811 +vn -0.607166 -0.627064 -0.487930 +vn -0.565020 -0.596454 -0.570025 +vn -0.530534 -0.487533 -0.693381 +vn -0.553514 -0.404370 -0.728050 +vn -0.608936 -0.790674 -0.062838 +vn -0.647572 -0.718589 -0.253426 +vn -0.610279 -0.663869 -0.432203 +vn -0.516343 -0.688559 -0.509140 +vn -0.450758 -0.760430 -0.467452 +vn -0.404920 -0.707175 -0.579577 +vn -0.345683 -0.560717 -0.752373 +vn -0.329356 -0.457839 -0.825739 +vn -0.671957 -0.726249 -0.144963 +vn -0.689352 -0.660024 -0.298502 +vn -0.672018 -0.636433 -0.378491 +vn -0.591357 -0.714805 -0.373211 +vn -0.478408 -0.776025 -0.410932 +vn -0.406781 -0.681539 -0.608264 +vn -0.382641 -0.568743 -0.728050 +vn -0.333201 -0.448592 -0.829279 +vn -0.836268 -0.531022 -0.136601 +vn -0.780877 -0.550279 -0.295633 +vn -0.755669 -0.557817 -0.343181 +vn -0.754875 -0.612110 -0.235420 +vn -0.683584 -0.652150 -0.327677 +vn -0.520493 -0.624683 -0.582080 +vn -0.378155 -0.584826 -0.717582 +vn -0.316202 -0.498001 -0.807428 +vn 0.135014 0.948790 0.285501 +vn 0.107150 0.933409 0.342357 +vn 0.056154 0.951598 0.302072 +vn 0.037294 0.975524 0.216590 +vn -0.005219 0.968261 0.249763 +vn -0.063112 0.979705 0.190222 +vn -0.035035 0.997284 -0.064455 +vn -0.119755 0.990295 -0.070345 +vn -0.081637 0.921201 -0.380352 +vn -0.127232 0.902737 -0.410901 +vn -0.148320 0.817866 -0.555925 +vn -0.129826 0.796472 -0.590564 +vn -0.153264 0.780511 -0.606006 +vn -0.127110 0.801660 -0.584094 +vn -0.077120 0.740318 -0.667776 +vn -0.102542 0.784173 -0.611988 +vn -0.003204 0.551225 -0.834315 +vn -0.049745 0.594073 -0.802820 +vn -0.095187 0.944700 0.313761 +vn -0.038331 0.952696 0.301401 +vn 0.046632 0.973022 0.225929 +vn 0.066378 0.997620 -0.018433 +vn -0.020356 0.953734 -0.299844 +vn -0.087161 0.850276 -0.519028 +vn -0.087130 0.754418 -0.650563 +vn -0.050111 0.691977 -0.720145 +vn 0.003540 0.510544 -0.859828 +vn -0.137455 0.950285 0.279275 +vn -0.042909 0.984741 0.168493 +vn 0.152196 0.985198 0.078646 +vn 0.281625 0.959502 0.003601 +vn 0.293680 0.925260 -0.240028 +vn 0.283914 0.807703 -0.516678 +vn 0.272530 0.706473 -0.653127 +vn 0.256417 0.640309 -0.724021 +vn 0.273171 0.438795 -0.856014 +vn 0.137547 0.945708 0.294382 +vn 0.203589 0.978912 0.015198 +vn 0.361766 0.921812 -0.139073 +vn 0.493179 0.868374 -0.051485 +vn 0.524766 0.830531 -0.186529 +vn 0.465438 0.750298 -0.469436 +vn 0.422132 0.662343 -0.618915 +vn 0.482894 0.505478 -0.715018 +vn 0.549699 0.275369 -0.788629 +vn 0.400891 0.871853 0.281259 +vn 0.476760 0.874447 -0.089267 +vn 0.515580 0.816462 -0.259835 +vn 0.538713 0.836421 -0.100589 +vn 0.519486 0.843898 -0.133824 +vn 0.426740 0.818384 -0.384808 +vn 0.353496 0.676931 -0.645558 +vn 0.408460 0.390027 -0.825220 +vn 0.522904 0.185583 -0.831935 +vn 0.609363 0.774010 0.171911 +vn 0.683126 0.717338 -0.136662 +vn 0.632618 0.747856 -0.201178 +vn 0.571429 0.815882 -0.088137 +vn 0.554613 0.827509 -0.087161 +vn 0.507370 0.818079 -0.270669 +vn 0.415632 0.635517 -0.650624 +vn 0.375134 0.247078 -0.893399 +vn 0.467544 0.100131 -0.878262 +vn 0.570116 0.821497 -0.007538 +vn 0.637349 0.755150 -0.153386 +vn 0.615101 0.783837 -0.084750 +vn 0.555193 0.830744 -0.039460 +vn 0.549760 0.827754 -0.112094 +vn 0.620655 0.728172 -0.290658 +vn 0.597583 0.471603 -0.648396 +vn 0.438002 0.124729 -0.890255 +vn 0.371136 0.115543 -0.921323 +vn 0.547319 0.826655 -0.130497 +vn 0.569262 0.805872 -0.162755 +vn 0.568163 0.822596 -0.022126 +vn 0.577136 0.815668 -0.039705 +vn 0.638539 0.734642 -0.229163 +vn 0.696799 0.558336 -0.450209 +vn 0.647511 0.298746 -0.701010 +vn 0.468154 0.143284 -0.871944 +vn 0.324137 0.166997 -0.931120 +vn -0.111911 0.982421 0.149327 +vn -0.066317 0.974364 0.214911 +vn -0.421247 0.896390 0.137791 +vn -0.418439 0.892544 0.168035 +vn -0.611469 0.779626 0.134953 +vn -0.587848 0.801233 0.111423 +vn -0.560137 0.819422 0.121494 +vn -0.553697 0.829646 0.071230 +vn -0.343059 0.931974 0.117038 +vn -0.341685 0.938169 0.055177 +vn -0.330149 0.943266 0.034974 +vn -0.207465 0.978210 -0.001129 +vn -0.441206 0.884610 -0.150792 +vn -0.256844 0.952727 -0.162114 +vn -0.583819 0.748955 -0.313334 +vn -0.472793 0.807154 -0.353435 +vn -0.161168 0.979034 0.124332 +vn -0.418744 0.903806 0.087954 +vn -0.613514 0.784936 0.086154 +vn -0.532853 0.834498 0.140080 +vn -0.380200 0.913877 0.142155 +vn -0.443922 0.894192 0.057405 +vn -0.567248 0.823115 -0.025758 +vn -0.641530 0.765709 -0.046052 +vn -0.168523 0.984466 -0.048708 +vn -0.381207 0.924009 0.028748 +vn -0.574755 0.811121 0.107974 +vn -0.519791 0.845119 0.124668 +vn -0.477004 0.876858 0.059572 +vn -0.499283 0.866390 -0.006439 +vn -0.567522 0.823237 0.012848 +vn -0.639637 0.768059 0.030061 +vn -0.098819 0.925443 -0.365703 +vn -0.205206 0.960509 -0.187841 +vn -0.465041 0.883389 0.057649 +vn -0.580004 0.805353 0.122257 +vn -0.608356 0.793451 -0.017579 +vn -0.528764 0.837672 -0.136570 +vn -0.527146 0.835658 -0.154118 +vn -0.677725 0.707450 -0.200385 +vn -0.006195 0.825343 -0.564562 +vn -0.017731 0.871883 -0.489334 +vn -0.371990 0.837764 -0.399640 +vn -0.624500 0.727470 -0.284158 +vn -0.703635 0.686666 -0.182531 +vn -0.603900 0.752983 -0.261269 +vn -0.542192 0.724570 -0.425367 +vn -0.648793 0.543535 -0.532517 +vn -0.019593 0.783654 -0.620838 +vn -0.035737 0.699698 -0.713523 +vn -0.321726 0.569659 -0.756279 +vn -0.454237 0.586596 -0.670461 +vn -0.592364 0.665731 -0.453688 +vn -0.708548 0.619556 -0.337748 +vn -0.668599 0.541765 -0.509293 +vn -0.640858 0.387371 -0.662709 +vn -0.163579 0.729667 -0.663930 +vn -0.235237 0.566240 -0.789941 +vn -0.291330 0.486892 -0.823420 +vn -0.273385 0.570025 -0.774773 +vn -0.430738 0.592059 -0.681082 +vn -0.706656 0.466353 -0.532060 +vn -0.764824 0.442701 -0.467971 +vn -0.781549 0.362072 -0.507981 +vn -0.278817 0.572436 -0.771050 +vn -0.389599 0.474319 -0.789422 +vn -0.209510 0.503861 -0.837977 +vn -0.215552 0.535112 -0.816797 +vn -0.426160 0.427045 -0.797479 +vn -0.610767 0.320353 -0.724082 +vn -0.715873 0.328135 -0.616291 +vn -0.801935 0.323679 -0.502091 +vn -0.033662 0.923246 0.382702 +vn 0.180486 0.908963 0.375713 +vn -0.049837 0.924924 0.376843 +vn 0.148259 0.935575 0.320475 +vn -0.100131 0.891568 0.441603 +vn 0.021699 0.941496 0.336283 +vn -0.160680 0.915922 0.367718 +vn -0.138646 0.950835 0.276803 +vn -0.183752 0.954741 0.233833 +vn -0.198309 0.947844 0.249428 +vn -0.198767 0.876125 0.439161 +vn -0.170934 0.876309 0.450331 +vn -0.186132 0.830897 0.524308 +vn -0.120823 0.809931 0.573931 +vn -0.095340 0.863552 0.495132 +vn -0.071444 0.823145 0.563280 +vn -0.327097 0.892392 0.310800 +vn -0.238105 0.892575 0.382794 +vn -0.231635 0.849178 0.474532 +vn -0.300272 0.849544 0.433637 +vn -0.399640 0.876614 0.267983 +vn -0.402326 0.832850 0.380047 +vn -0.274545 0.869472 0.410596 +vn -0.175512 0.884823 0.431562 +vn -0.546373 0.810907 0.209387 +vn -0.477554 0.823145 0.307108 +vn -0.369762 0.819330 0.438093 +vn -0.315378 0.818354 0.480422 +vn -0.396771 0.822962 0.406507 +vn -0.458419 0.833430 0.308512 +vn -0.357463 0.906522 0.224464 +vn -0.268288 0.874050 0.404981 +vn -0.533830 0.825129 0.184790 +vn -0.477645 0.857692 0.190191 +vn -0.337840 0.895840 0.288644 +vn -0.152013 0.892087 0.425489 +vn -0.075594 0.867794 0.491073 +vn -0.168523 0.894864 0.413251 +vn -0.288827 0.939024 0.186438 +vn -0.337504 0.878201 0.338847 +vn -0.296518 0.945463 0.134770 +vn -0.254006 0.957976 0.133213 +vn -0.220618 0.963286 0.152867 +vn -0.126774 0.948393 0.290567 +vn -0.086856 0.849483 0.520402 +vn -0.147862 0.823481 0.547716 +vn -0.275857 0.917875 0.285195 +vn -0.352153 0.880947 0.316019 +vn -0.136967 0.988647 0.061556 +vn -0.103671 0.988708 0.108127 +vn -0.094882 0.987426 0.126408 +vn -0.128574 0.950987 0.281167 +vn -0.170904 0.793085 0.584582 +vn -0.254158 0.734611 0.629078 +vn -0.382183 0.841121 0.382641 +vn -0.441084 0.849696 0.288858 +vn -0.173803 0.983978 0.039125 +vn -0.167760 0.980193 0.105136 +vn -0.177526 0.973571 0.143498 +vn -0.190588 0.892666 0.408399 +vn -0.191443 0.760613 0.620319 +vn -0.166265 0.713370 0.680746 +vn -0.295785 0.801477 0.519730 +vn -0.406232 0.857601 0.315348 +vn -0.414594 0.909940 0.010071 +vn -0.404004 0.899075 0.168493 +vn -0.484390 0.846797 0.219672 +vn -0.435041 0.742637 0.509079 +vn -0.342662 0.728568 0.593066 +vn -0.196356 0.747093 0.635029 +vn -0.153508 0.782067 0.603931 +vn -0.296640 0.865627 0.403302 +vn 0.097171 0.929044 0.356945 +vn -0.117008 0.927885 0.353923 +vn -0.070345 0.890896 0.448683 +vn 0.152806 0.812067 0.563189 +vn 0.292459 0.769189 0.568102 +vn 0.373913 0.819117 0.434919 +vn 0.384869 0.903745 0.187384 +vn 0.514939 0.855800 0.049135 +vn 0.083651 0.956542 0.279275 +vn -0.081301 0.948637 0.305704 +vn 0.096683 0.909909 0.403363 +vn 0.275765 0.796319 0.538316 +vn 0.249184 0.761010 0.598926 +vn 0.113041 0.855220 0.505753 +vn 0.187964 0.931516 0.311319 +vn 0.477981 0.845729 0.237159 +vn 0.025483 0.981567 0.189398 +vn -0.031617 0.988647 0.146764 +vn 0.227943 0.948698 0.218970 +vn 0.420179 0.853755 0.307474 +vn 0.343730 0.849605 0.400006 +vn 0.039308 0.901700 0.430525 +vn 0.062441 0.913633 0.401685 +vn 0.396832 0.833796 0.383740 +vn -0.100375 0.983154 0.152684 +vn 0.051057 0.986145 0.157628 +vn 0.289743 0.931578 0.219428 +vn 0.476119 0.846858 0.236854 +vn 0.427534 0.860744 0.276131 +vn 0.118564 0.934019 0.336894 +vn 0.001404 0.923582 0.383343 +vn 0.296304 0.888333 0.350780 +vn -0.147221 0.950346 0.274087 +vn 0.107852 0.952055 0.286203 +vn 0.302408 0.913205 0.273049 +vn 0.476516 0.843806 0.246742 +vn 0.435438 0.875057 0.211249 +vn 0.155583 0.968230 0.195685 +vn 0.068514 0.970763 0.230018 +vn 0.184484 0.955168 0.231452 +vn -0.163305 0.877773 0.450362 +vn 0.055025 0.920072 0.387768 +vn 0.332621 0.877895 0.344432 +vn 0.467177 0.812250 0.349162 +vn 0.365123 0.880673 0.301737 +vn 0.133091 0.959410 0.248573 +vn 0.102817 0.968902 0.225013 +vn 0.129429 0.965941 0.223975 +vn -0.184088 0.788232 0.587176 +vn -0.052736 0.834651 0.548204 +vn 0.312143 0.847896 0.428510 +vn 0.472488 0.806421 0.355541 +vn 0.307352 0.863948 0.398846 +vn 0.085421 0.909085 0.407727 +vn 0.067995 0.918729 0.388928 +vn 0.070894 0.920316 0.384625 +vn -0.168249 0.789788 0.589801 +vn -0.124912 0.786615 0.604633 +vn 0.170049 0.841823 0.512223 +vn 0.437574 0.833064 0.338359 +vn 0.272866 0.902585 0.332926 +vn 0.066103 0.939299 0.336650 +vn 0.096988 0.920621 0.378155 +vn 0.057833 0.895535 0.441145 +vn 0.844569 -0.191595 -0.499924 +vn 0.854671 -0.279031 -0.437788 +vn 0.899869 -0.228828 -0.371227 +vn 0.914090 -0.177770 -0.364391 +vn 0.804621 -0.263894 -0.531877 +vn 0.849971 -0.188635 -0.491867 +vn 0.731254 -0.328715 -0.597644 +vn 0.774529 -0.219855 -0.593066 +vn 0.811731 -0.355388 -0.463393 +vn 0.824335 -0.210913 -0.525315 +vn 0.917386 -0.233192 -0.322489 +vn 0.876705 -0.165319 -0.451674 +vn 0.973968 -0.112522 -0.196753 +vn 0.966155 -0.108951 -0.233680 +vn 0.923338 -0.192175 -0.332377 +vn 0.945677 -0.040376 -0.322520 +vn 0.859401 -0.237709 -0.452651 +vn 0.828730 0.070894 -0.555101 +vn 0.913907 -0.268319 -0.304483 +vn 0.924650 -0.147496 -0.351054 +vn 0.799188 -0.111545 -0.590594 +vn 0.756676 -0.131046 -0.640461 +vn 0.878658 -0.152898 -0.452254 +vn 0.960265 -0.150792 -0.234687 +vn 0.944273 -0.220405 -0.244362 +vn 0.842341 -0.330393 -0.425733 +vn 0.828394 -0.381359 -0.410230 +vn 0.987091 -0.073366 -0.142216 +vn 0.969359 0.074953 -0.233894 +vn 0.828150 0.158788 -0.537492 +vn 0.725730 0.127415 -0.676046 +vn 0.890133 0.065432 -0.450942 +vn 0.953581 -0.025666 -0.299936 +vn 0.901151 -0.204566 -0.382122 +vn 0.854640 -0.272927 -0.441664 +vn 0.896084 -0.169408 -0.410230 +vn 0.997467 -0.067324 -0.022614 +vn 0.988342 -0.018647 -0.150914 +vn 0.850917 0.017579 -0.524949 +vn 0.704062 0.068819 -0.706748 +vn 0.874233 0.083712 -0.478195 +vn 0.924650 0.062319 -0.375591 +vn 0.863430 0.018250 -0.504105 +vn 0.909909 -0.002228 -0.414777 +vn 0.938139 0.048341 -0.342845 +vn 0.987274 -0.158666 0.008942 +vn 0.973632 -0.171636 -0.150090 +vn 0.842830 -0.132145 -0.521653 +vn 0.768578 -0.008454 -0.639668 +vn 0.877529 0.087893 -0.471358 +vn 0.910459 0.101413 -0.400891 +vn 0.870632 0.132633 -0.473678 +vn 0.895718 0.149419 -0.418683 +vn 0.911069 0.031495 -0.410993 +vn 0.922056 -0.377728 -0.084353 +vn 0.855220 -0.475936 -0.205084 +vn 0.780084 -0.411298 -0.471450 +vn 0.864406 -0.190741 -0.465163 +vn 0.922422 0.017609 -0.385754 +vn 0.877010 0.070833 -0.475204 +vn 0.887234 -0.004517 -0.461257 +vn 0.883145 -0.054964 -0.465804 +vn 0.853145 -0.058931 -0.518296 +vn 0.811274 -0.551225 -0.194769 +vn 0.770837 -0.580187 -0.263009 +vn 0.788995 -0.516831 -0.332163 +vn 0.899655 -0.373913 -0.225257 +vn 0.956542 -0.184301 -0.225837 +vn 0.853847 -0.003754 -0.520463 +vn 0.834681 -0.058687 -0.547563 +vn 0.865261 -0.177862 -0.468673 +vn 0.851650 -0.153172 -0.501175 +vn 0.863308 -0.319010 -0.391003 +vn 0.868252 -0.255562 -0.425153 +vn 0.880337 -0.275521 -0.386090 +vn 0.943968 -0.176153 -0.279000 +vn 0.954527 -0.040956 -0.295236 +vn 0.982665 0.127659 -0.134190 +vn 0.954772 0.263955 -0.136723 +vn 0.915189 0.402936 0.008026 +vn 0.805444 0.591937 -0.028291 +vn 0.822901 0.567888 0.018128 +vn 0.689016 0.723350 -0.044740 +vn 0.752831 0.649312 -0.107730 +vn 0.660543 0.740287 -0.124882 +vn 0.680624 0.712943 -0.168462 +vn 0.828089 -0.264138 -0.494400 +vn 0.797479 -0.267434 -0.540757 +vn 0.819208 -0.177068 -0.545427 +vn 0.891385 0.094211 -0.443312 +vn 0.823359 0.485183 -0.294382 +vn 0.707724 0.697409 -0.112766 +vn 0.644154 0.764733 -0.015198 +vn 0.776543 -0.215155 -0.592120 +vn 0.770562 -0.240089 -0.590381 +vn 0.762169 -0.179052 -0.622089 +vn 0.783898 -0.109409 -0.611133 +vn 0.850185 0.230720 -0.473190 +vn 0.775750 0.576312 -0.256966 +vn 0.679830 0.722098 -0.127842 +vn 0.794733 -0.147557 -0.588733 +vn 0.725181 -0.207465 -0.656514 +vn 0.722587 -0.167302 -0.670675 +vn 0.769951 -0.224433 -0.597308 +vn 0.845393 0.025117 -0.533525 +vn 0.763512 0.455733 -0.457503 +vn 0.699576 0.617176 -0.359996 +vn 0.855831 -0.060457 -0.513657 +vn 0.795740 -0.112094 -0.595141 +vn 0.755852 -0.182562 -0.628742 +vn 0.722251 -0.244575 -0.646901 +vn 0.648213 -0.049898 -0.759789 +vn 0.591876 0.242866 -0.768517 +vn 0.662008 0.401563 -0.632801 +vn 0.945494 0.057619 -0.320475 +vn 0.880123 0.055513 -0.471419 +vn 0.765496 -0.109500 -0.633992 +vn 0.637257 -0.132481 -0.759148 +vn 0.540574 -0.026612 -0.840846 +vn 0.560228 0.067904 -0.825526 +vn 0.598956 0.178014 -0.780725 +vn 0.893979 0.209143 -0.396222 +vn 0.782586 0.283578 -0.554155 +vn 0.635731 0.111087 -0.763848 +vn 0.527604 0.002350 -0.849483 +vn 0.507797 -0.037629 -0.860622 +vn 0.554430 -0.020081 -0.831965 +vn 0.544145 0.087680 -0.834376 +vn 0.703207 0.342601 -0.622974 +vn 0.586261 0.448775 -0.674429 +vn 0.556413 0.280862 -0.781976 +vn 0.512619 0.073031 -0.855495 +vn 0.455367 -0.014618 -0.890164 +vn 0.410108 -0.048952 -0.910703 +vn 0.356548 0.092715 -0.929624 +vn 0.910306 -0.121708 -0.395550 +vn 0.887814 -0.257759 -0.381146 +vn 0.986633 -0.115879 -0.114536 +vn 0.937284 -0.341288 -0.070711 +vn 0.957549 -0.216620 0.190100 +vn 0.911771 -0.349223 0.216102 +vn 0.913144 -0.278573 0.297525 +vn 0.879482 -0.350536 0.321818 +vn 0.876583 -0.307688 0.369945 +vn 0.847438 -0.372631 0.378094 +vn 0.797021 -0.331278 0.504929 +vn 0.782556 -0.368358 0.501877 +vn 0.773400 -0.312113 0.551714 +vn 0.769097 -0.371776 0.519822 +vn 0.692129 -0.234169 0.682699 +vn 0.707968 -0.365825 0.604053 +vn 0.968078 0.026826 -0.249184 +vn 0.973357 0.164098 -0.160070 +vn 0.995636 0.077548 0.051759 +vn 0.966186 -0.075594 0.246437 +vn 0.917386 -0.125797 0.377544 +vn 0.839900 -0.119053 0.529466 +vn 0.780145 -0.104862 0.616718 +vn 0.626728 -0.016297 0.779015 +vn 0.953368 0.299448 -0.037294 +vn 0.903348 0.415754 -0.105075 +vn 0.907682 0.407392 -0.100467 +vn 0.946287 0.300882 0.118259 +vn 0.921537 0.183386 0.342204 +vn 0.846431 0.106540 0.521683 +vn 0.765160 0.093112 0.637013 +vn 0.518479 0.158177 0.840297 +vn 0.860927 0.497726 0.105167 +vn 0.831446 0.554796 -0.028779 +vn 0.800195 0.584674 -0.133457 +vn 0.792352 0.610004 0.003723 +vn 0.791894 0.571947 0.213782 +vn 0.769158 0.483383 0.417982 +vn 0.676901 0.434553 0.594104 +vn 0.427107 0.400128 0.810816 +vn 0.875973 0.472884 0.094821 +vn 0.868129 0.489792 0.080172 +vn 0.764702 0.644185 -0.014283 +vn 0.671346 0.741081 0.007813 +vn 0.623951 0.772515 0.117862 +vn 0.574969 0.776574 0.257485 +vn 0.490585 0.751518 0.440992 +vn 0.343211 0.683798 0.643849 +vn 0.811487 0.584124 0.015564 +vn 0.781396 0.590899 0.200568 +vn 0.687338 0.697256 0.203314 +vn 0.603687 0.793512 0.076724 +vn 0.565966 0.818049 0.102329 +vn 0.500381 0.831477 0.241249 +vn 0.355480 0.857082 0.372845 +vn 0.224097 0.863704 0.451369 +vn 0.671499 0.740898 0.011200 +vn 0.632038 0.738090 0.236000 +vn 0.586047 0.740471 0.328990 +vn 0.527757 0.823359 0.208502 +vn 0.428388 0.893582 0.133915 +vn 0.324015 0.913480 0.245979 +vn 0.173650 0.909635 0.377300 +vn 0.073946 0.923765 0.375713 +vn 0.862850 -0.406201 -0.300760 +vn 0.895169 -0.365825 -0.254616 +vn 0.959471 -0.139714 -0.244667 +vn 0.963042 -0.107700 -0.246803 +vn 0.961364 -0.168889 -0.217353 +vn 0.913175 -0.374950 -0.159551 +vn 0.792138 -0.610279 -0.002075 +vn 0.898099 -0.427839 -0.101596 +vn 0.921201 -0.323130 -0.216712 +vn 0.949004 -0.107578 -0.296304 +vn 0.943480 -0.116550 -0.310190 +vn 0.934385 -0.244819 -0.258766 +vn 0.848750 -0.512345 -0.130619 +vn 0.697714 -0.716117 0.018433 +vn 0.931913 -0.338542 0.129887 +vn 0.984588 -0.169317 -0.043428 +vn 0.986175 -0.088137 -0.140263 +vn 0.980468 -0.161016 -0.112888 +vn 0.925871 -0.377361 -0.018342 +vn 0.815790 -0.577929 0.021699 +vn 0.667165 -0.744835 0.007660 +vn 0.905515 -0.254738 0.339305 +vn 0.957183 -0.020661 0.288705 +vn 0.980743 -0.033387 0.192389 +vn 0.976226 -0.184057 0.114353 +vn 0.899686 -0.427595 0.087771 +vn 0.788629 -0.603748 0.116245 +vn 0.658956 -0.736564 0.152287 +vn 0.894955 -0.228217 0.383312 +vn 0.925077 0.024079 0.378979 +vn 0.933653 0.058260 0.353343 +vn 0.935240 -0.153844 0.318766 +vn 0.850795 -0.432936 0.297739 +vn 0.724754 -0.633778 0.270272 +vn 0.613147 -0.744865 0.263009 +vn 0.825709 -0.216651 0.520768 +vn 0.846278 0.022492 0.532212 +vn 0.849330 0.104984 0.517289 +vn 0.840388 -0.147984 0.521378 +vn 0.721183 -0.448775 0.527665 +vn 0.593738 -0.604541 0.530992 +vn 0.507859 -0.700705 0.501053 +vn 0.757653 -0.272317 0.593066 +vn 0.710166 -0.053377 0.701956 +vn 0.655080 0.110782 0.747368 +vn 0.664144 -0.110721 0.739341 +vn 0.601093 -0.457045 0.655538 +vn 0.491928 -0.617908 0.613300 +vn 0.393323 -0.659474 0.640584 +vn 0.733360 -0.332987 0.592669 +vn 0.728416 -0.175176 0.662313 +vn 0.637165 -0.001892 0.770684 +vn 0.558031 -0.040834 0.828791 +vn 0.554582 -0.368175 0.746208 +vn 0.474319 -0.661489 0.580859 +vn 0.316355 -0.763634 0.562792 +vn -0.212958 -0.187689 0.958831 +vn -0.224219 0.002289 0.974517 +vn -0.192938 0.015137 0.981079 +vn -0.115787 -0.114109 0.986694 +vn -0.173986 -0.003906 0.984710 +vn -0.145878 0.015625 0.989166 +vn 0.062807 -0.082522 0.994598 +vn -0.011567 0.050172 0.998657 +vn 0.219031 -0.153111 0.963622 +vn 0.174841 -0.004913 0.984558 +vn 0.412854 -0.176275 0.893551 +vn 0.399579 -0.057009 0.914914 +vn 0.547502 -0.182592 0.816614 +vn 0.479568 -0.157170 0.863277 +vn 0.615680 -0.269967 0.740287 +vn 0.510422 -0.290139 0.809473 +vn -0.240638 -0.052522 0.969176 +vn -0.182104 -0.070803 0.980712 +vn -0.023988 -0.242195 0.969909 +vn 0.122318 -0.388714 0.913175 +vn 0.206183 -0.392743 0.896207 +vn 0.343120 -0.319773 0.883145 +vn 0.535295 -0.241493 0.809381 +vn 0.684591 -0.223792 0.693686 +vn -0.241249 -0.268685 0.932493 +vn -0.066408 -0.371746 0.925932 +vn 0.195044 -0.529496 0.825556 +vn 0.150426 -0.624928 0.766045 +vn 0.102206 -0.590136 0.800775 +vn 0.173284 -0.460707 0.870449 +vn 0.443861 -0.299631 0.844508 +vn 0.660115 -0.153447 0.735282 +vn -0.106388 -0.310648 0.944517 +vn 0.059420 -0.466353 0.882595 +vn 0.325877 -0.505661 0.798791 +vn 0.171606 -0.523576 0.834498 +vn 0.006928 -0.485427 0.874233 +vn 0.041810 -0.417554 0.907682 +vn 0.285470 -0.301828 0.909574 +vn 0.552385 -0.122318 0.824519 +vn 0.092563 -0.373669 0.922910 +vn 0.119694 -0.454543 0.882626 +vn 0.345531 -0.435041 0.831416 +vn 0.192602 -0.452254 0.870815 +vn -0.060701 -0.431288 0.900143 +vn 0.009583 -0.415326 0.909604 +vn 0.131870 -0.399731 0.907071 +vn 0.425245 -0.347118 0.835841 +vn 0.199927 -0.508744 0.837367 +vn 0.163793 -0.566973 0.807276 +vn 0.338328 -0.579028 0.741752 +vn 0.209296 -0.598346 0.773400 +vn -0.080538 -0.610248 0.788079 +vn 0.010163 -0.641926 0.766656 +vn 0.068117 -0.661031 0.747246 +vn 0.276986 -0.683981 0.674825 +vn 0.251045 -0.562731 0.787561 +vn 0.259316 -0.619160 0.741172 +vn 0.328257 -0.640522 0.694205 +vn 0.211951 -0.648823 0.730796 +vn -0.015717 -0.689840 0.723777 +vn 0.033052 -0.755089 0.654744 +vn 0.104068 -0.811670 0.574755 +vn 0.140110 -0.839808 0.524430 +vn -0.051393 -0.225593 0.972839 +vn -0.220435 -0.194769 0.955748 +vn -0.110691 0.059450 0.992065 +vn -0.311167 0.166936 0.935545 +vn -0.202033 0.403455 0.892392 +vn -0.351238 0.418104 0.837733 +vn -0.256661 0.569903 0.780572 +vn -0.304331 0.545488 0.780877 +vn -0.205786 0.690512 0.693411 +vn -0.200995 0.604572 0.770745 +vn -0.119053 0.702292 0.701834 +vn -0.088351 0.651265 0.753685 +vn -0.113529 0.751579 0.649739 +vn -0.045442 0.781976 0.621601 +vn -0.014130 -0.157811 0.987365 +vn 0.042787 -0.010712 0.999023 +vn -0.029969 0.331797 0.942869 +vn -0.134983 0.526200 0.839564 +vn -0.175390 0.733299 0.656880 +vn -0.134373 0.727622 0.672658 +vn -0.124607 0.723441 0.679006 +vn -0.021516 -0.063417 0.997742 +vn 0.031007 -0.001068 0.999512 +vn 0.047365 0.273415 0.960723 +vn 0.014496 0.475814 0.879391 +vn -0.033784 0.746269 0.664754 +vn -0.033113 0.781640 0.622822 +vn 0.047792 0.760460 0.647572 +vn 0.179968 -0.012146 0.983581 +vn 0.224128 0.037324 0.973815 +vn 0.210578 0.254433 0.943876 +vn 0.171422 0.455397 0.873592 +vn 0.125004 0.733940 0.667562 +vn 0.145146 0.832606 0.534440 +vn 0.307535 0.825129 0.473861 +vn 0.361095 0.002350 0.932524 +vn 0.346507 0.038728 0.937223 +vn 0.304544 0.201239 0.930967 +vn 0.243629 0.435530 0.866543 +vn 0.161290 0.716758 0.678365 +vn 0.097293 0.859737 0.501358 +vn 0.152043 0.917417 0.367626 +vn 0.365703 -0.073305 0.927824 +vn 0.337016 0.066286 0.939146 +vn 0.389752 0.202979 0.898251 +vn 0.363689 0.392163 0.844935 +vn 0.223975 0.661946 0.715262 +vn 0.111728 0.862636 0.493301 +vn 0.085849 0.941527 0.325785 +vn 0.456252 -0.161412 0.875057 +vn 0.419874 0.080081 0.904019 +vn 0.388318 0.223426 0.894009 +vn 0.365398 0.358440 0.859035 +vn 0.298166 0.629444 0.717551 +vn 0.180181 0.870235 0.458419 +vn 0.128910 0.944426 0.302286 +vn -0.197760 -0.153447 0.968139 +vn -0.224250 -0.257271 0.939940 +vn -0.250252 -0.125645 0.959960 +vn -0.210791 -0.290994 0.933195 +vn -0.266579 -0.125706 0.955565 +vn -0.224464 -0.229469 0.947050 +vn -0.174474 -0.075716 0.981719 +vn -0.145329 -0.214331 0.965880 +vn -0.281075 0.016572 0.959532 +vn -0.222907 -0.223457 0.948851 +vn -0.319742 0.074129 0.944578 +vn -0.317209 -0.232337 0.919431 +vn -0.343303 0.116916 0.931883 +vn -0.326640 -0.262978 0.907804 +vn -0.484878 0.142430 0.862880 +vn -0.471847 -0.279427 0.836177 +vn -0.233711 0.239418 0.942351 +vn -0.221931 0.208441 0.952483 +vn -0.310465 0.198737 0.929563 +vn -0.263710 0.281442 0.922605 +vn -0.279153 0.302683 0.911283 +vn -0.344523 0.307413 0.886990 +vn -0.371715 0.385144 0.844661 +vn -0.442305 0.468337 0.764824 +vn -0.235054 0.432264 0.870540 +vn -0.164068 0.436018 0.884823 +vn -0.346934 0.440321 0.828089 +vn -0.311289 0.458357 0.832423 +vn -0.159948 0.403729 0.900754 +vn -0.366100 0.335368 0.868007 +vn -0.456893 0.372051 0.807947 +vn -0.498825 0.458724 0.735343 +vn -0.252297 0.529283 0.810022 +vn -0.149388 0.546648 0.823908 +vn -0.314219 0.494675 0.810266 +vn -0.332011 0.441877 0.833369 +vn -0.107028 0.469100 0.876614 +vn -0.331828 0.502426 0.798364 +vn -0.476485 0.513077 0.713889 +vn -0.511277 0.558794 0.652913 +vn -0.215583 0.507126 0.834437 +vn -0.159429 0.477767 0.863857 +vn -0.271950 0.500931 0.821619 +vn -0.315897 0.496048 0.808771 +vn -0.168920 0.506577 0.845454 +vn -0.316385 0.590716 0.742241 +vn -0.451430 0.620441 0.641255 +vn -0.506119 0.648579 0.568468 +vn -0.103732 0.563555 0.819514 +vn -0.198004 0.521439 0.829951 +vn -0.309580 0.548967 0.776360 +vn -0.297037 0.564318 0.770226 +vn -0.224891 0.593524 0.772729 +vn -0.404859 0.660817 0.631947 +vn -0.433393 0.735832 0.520218 +vn -0.446883 0.744407 0.496109 +vn -0.036195 0.788293 0.614185 +vn -0.197974 0.770226 0.606220 +vn -0.297372 0.731132 0.613971 +vn -0.309763 0.728874 0.610523 +vn -0.304910 0.798242 0.519395 +vn -0.427168 0.828272 0.362529 +vn -0.412183 0.854976 0.314707 +vn -0.291055 0.873806 0.389508 +vn -0.305277 -0.015503 0.952116 +vn -0.269570 -0.017884 0.962798 +vn -0.197485 -0.229530 0.953032 +vn -0.157689 -0.187933 0.969420 +vn -0.061983 -0.235542 0.969878 +vn 0.027619 -0.475051 0.879513 +vn 0.055727 -0.569262 0.820215 +vn -0.221046 -0.080416 0.971923 +vn -0.307352 0.010895 0.951506 +vn -0.351756 -0.213721 0.911344 +vn -0.370434 -0.172826 0.912625 +vn -0.356975 -0.122593 0.926023 +vn -0.297586 -0.391186 0.870846 +vn -0.208045 -0.530778 0.821558 +vn -0.233741 -0.163579 0.958434 +vn -0.362133 -0.117161 0.924711 +vn -0.451369 -0.221686 0.864345 +vn -0.429151 -0.152806 0.890194 +vn -0.393078 -0.090121 0.915067 +vn -0.393353 -0.305063 0.867275 +vn -0.362621 -0.457839 0.811670 +vn -0.236732 -0.274972 0.931822 +vn -0.360729 -0.264870 0.894253 +vn -0.386364 -0.203955 0.899472 +vn -0.345317 -0.116733 0.931181 +vn -0.393658 -0.134831 0.909299 +vn -0.500595 -0.305185 0.810083 +vn -0.548173 -0.399579 0.734733 +vn -0.205756 -0.353801 0.912381 +vn -0.266732 -0.371532 0.889248 +vn -0.379864 -0.224128 0.897458 +vn -0.460677 -0.131169 0.877804 +vn -0.511582 -0.207801 0.833705 +vn -0.548143 -0.339030 0.764550 +vn -0.548967 -0.407544 0.729698 +vn -0.324564 -0.381024 0.865688 +vn -0.337321 -0.447584 0.828150 +vn -0.420698 -0.337138 0.842219 +vn -0.512009 -0.180517 0.839778 +vn -0.498642 -0.186590 0.846461 +vn -0.398267 -0.309061 0.863613 +vn -0.316721 -0.434980 0.842860 +vn -0.350932 -0.427564 0.833033 +vn -0.397656 -0.475173 0.784875 +vn -0.410932 -0.359325 0.837825 +vn -0.393017 -0.196020 0.898373 +vn -0.354686 -0.110721 0.928373 +vn -0.256661 -0.187780 0.948057 +vn -0.117435 -0.391034 0.912839 +vn -0.413953 -0.460860 0.784997 +vn -0.389447 -0.494980 0.776696 +vn -0.426130 -0.319895 0.846187 +vn -0.437147 -0.159551 0.885098 +vn -0.414533 -0.062563 0.907865 +vn -0.352855 -0.077578 0.932432 +vn -0.224067 -0.395276 0.890805 +vn -0.956145 0.249458 0.153447 +vn -0.993072 0.083041 0.083010 +vn -0.972747 0.160527 0.167241 +vn -0.968108 0.212592 0.132298 +vn -0.980132 0.198279 0.001251 +vn -0.995605 0.074892 -0.055757 +vn -0.975127 0.158391 -0.154942 +vn -0.980743 0.006500 -0.195166 +vn -0.999146 0.040071 -0.009339 +vn -0.993835 -0.019593 -0.109012 +vn -0.926542 -0.157476 0.341594 +vn -0.970336 -0.089602 0.224464 +vn -0.686056 -0.330821 0.647938 +vn -0.796319 -0.164861 0.581927 +vn -0.545091 -0.431166 0.718986 +vn -0.650044 -0.245888 0.718986 +vn -0.999939 0.008209 0.001007 +vn -0.991577 0.105258 0.075228 +vn -0.986145 0.164678 -0.019501 +vn -0.994812 0.090304 -0.046358 +vn -0.984710 -0.062777 0.162297 +vn -0.810511 -0.264687 0.522477 +vn -0.547410 -0.423078 0.722007 +vn -0.475967 -0.492904 0.728324 +vn -0.995178 -0.082369 -0.053102 +vn -0.996734 -0.078555 0.017396 +vn -0.994751 -0.102206 0.000641 +vn -0.985809 -0.162725 0.040529 +vn -0.917173 -0.258339 0.303323 +vn -0.703360 -0.320170 0.634602 +vn -0.534989 -0.310648 0.785638 +vn -0.520371 -0.317240 0.792810 +vn -0.972991 -0.221717 -0.063906 +vn -0.967864 -0.247932 0.041597 +vn -0.956786 -0.286905 0.047212 +vn -0.944884 -0.316599 0.083071 +vn -0.887692 -0.304971 0.344890 +vn -0.727500 -0.240455 0.642537 +vn -0.585437 -0.160955 0.794549 +vn -0.551714 -0.139836 0.822199 +vn -0.937132 -0.343272 -0.062563 +vn -0.932524 -0.352641 0.077486 +vn -0.924863 -0.372326 0.077364 +vn -0.918668 -0.385418 0.086398 +vn -0.892331 -0.345744 0.290109 +vn -0.753563 -0.257118 0.604968 +vn -0.645070 -0.162450 0.746635 +vn -0.586779 -0.074343 0.806299 +vn -0.820582 -0.567736 -0.065462 +vn -0.833277 -0.548906 0.065371 +vn -0.858974 -0.508042 0.063478 +vn -0.875027 -0.477767 0.077761 +vn -0.871120 -0.438307 0.221320 +vn -0.805597 -0.300027 0.510819 +vn -0.720969 -0.127171 0.681143 +vn -0.625263 -0.074007 0.776879 +vn -0.839412 -0.541459 -0.046663 +vn -0.828028 -0.558672 0.046846 +vn -0.804926 -0.588916 0.072237 +vn -0.777886 -0.623951 0.074343 +vn -0.781243 -0.603839 0.157994 +vn -0.733360 -0.527848 0.428358 +vn -0.582965 -0.442671 0.681265 +vn -0.439924 -0.422071 0.792627 +vn -0.953551 0.298959 0.036195 +vn -0.933256 0.297891 0.200629 +vn -0.971862 0.217811 0.089419 +vn -0.963225 0.154912 0.219428 +vn -0.986236 0.035096 0.161412 +vn -0.982513 0.078463 0.168828 +vn -0.977569 0.154057 0.143559 +vn -0.969756 0.234962 0.065767 +vn -0.956023 0.266945 0.121250 +vn -0.921903 0.370312 -0.113804 +vn -0.917478 0.392438 0.064608 +vn -0.798914 0.504105 -0.327952 +vn -0.733848 0.679220 0.008332 +vn -0.647786 0.627918 -0.431349 +vn -0.962737 0.207801 -0.172887 +vn -0.929106 0.328929 -0.168981 +vn -0.992065 0.121647 -0.031037 +vn -0.971313 0.200537 0.127659 +vn -0.915708 0.310678 0.254799 +vn -0.892117 0.321451 0.317423 +vn -0.737785 0.611286 0.286294 +vn -0.966521 0.180914 -0.181921 +vn -0.919004 0.342418 -0.195288 +vn -0.949156 0.260262 -0.177007 +vn -0.921140 0.389019 -0.010254 +vn -0.886563 0.427442 0.176763 +vn -0.891842 0.357311 0.277291 +vn -0.780786 0.552812 0.290994 +vn -0.971801 0.184729 -0.146367 +vn -0.927122 0.352397 -0.127232 +vn -0.914914 0.401807 -0.037904 +vn -0.814722 0.573962 0.082186 +vn -0.806299 0.542802 0.234993 +vn -0.827784 0.424665 0.366588 +vn -0.696921 0.535173 0.477340 +vn -0.954894 0.208228 0.211646 +vn -0.850002 0.476302 0.224982 +vn -0.795770 0.527177 0.297983 +vn -0.713981 0.628346 0.308786 +vn -0.741813 0.601489 0.296487 +vn -0.779534 0.511246 0.361766 +vn -0.586871 0.650655 0.481857 +vn -0.819636 0.205847 0.534593 +vn -0.707511 0.533525 0.463393 +vn -0.684469 0.559038 0.467879 +vn -0.661214 0.602893 0.446364 +vn -0.659597 0.620167 0.424574 +vn -0.644368 0.587268 0.489731 +vn -0.407361 0.730064 0.548631 +vn -0.699454 0.169317 0.694296 +vn -0.617847 0.523972 0.586230 +vn -0.650502 0.534715 0.539354 +vn -0.645527 0.585192 0.490707 +vn -0.595294 0.636189 0.490738 +vn -0.492538 0.669729 0.555712 +vn -0.225806 0.781487 0.581591 +vn -0.949583 0.302194 -0.083254 +vn -0.974364 0.205298 -0.091769 +vn -0.882717 0.304361 -0.357952 +vn -0.914396 0.201453 -0.351054 +vn -0.915708 0.280770 -0.287423 +vn -0.916349 0.185553 -0.354747 +vn -0.908048 0.286874 -0.305155 +vn -0.945219 0.153050 -0.288308 +vn -0.815943 0.259285 -0.516709 +vn -0.821253 0.169317 -0.544847 +vn -0.713736 0.086123 -0.695059 +vn -0.633564 0.184637 -0.751305 +vn -0.772973 0.020569 -0.634083 +vn -0.769127 0.169347 -0.616199 +vn -0.799860 0.077853 -0.595080 +vn -0.748894 0.042055 -0.661306 +vn -0.980682 0.168889 -0.098544 +vn -0.933470 0.132969 -0.333018 +vn -0.943815 0.135380 -0.301431 +vn -0.919858 0.182104 -0.347362 +vn -0.888913 0.151799 -0.432142 +vn -0.791498 0.096042 -0.603534 +vn -0.727866 0.093875 -0.679220 +vn -0.736473 0.178686 -0.652425 +vn -0.997589 0.060091 -0.034669 +vn -0.967223 -0.048006 -0.249336 +vn -0.927885 -0.052980 -0.368999 +vn -0.921873 0.024018 -0.386670 +vn -0.866024 0.146153 -0.478103 +vn -0.681967 0.330088 -0.652608 +vn -0.622974 0.439467 -0.647114 +vn -0.623493 0.452193 -0.637745 +vn -0.948363 0.316965 0.008881 +vn -0.944090 0.286996 -0.162053 +vn -0.916929 0.166753 -0.362529 +vn -0.874660 0.120029 -0.469558 +vn -0.753349 0.232978 -0.614917 +vn -0.582873 0.327372 -0.743645 +vn -0.598346 0.404431 -0.691641 +vn -0.619617 0.443129 -0.647816 +vn -0.814447 0.567125 -0.122532 +vn -0.773583 0.630360 -0.064699 +vn -0.819483 0.530015 -0.217872 +vn -0.756462 0.415632 -0.504929 +vn -0.637898 0.371838 -0.674367 +vn -0.536424 0.344981 -0.770196 +vn -0.594073 0.341075 -0.728477 +vn -0.695242 0.289285 -0.657949 +vn -0.703482 0.650014 -0.287301 +vn -0.731925 0.681356 0.003510 +vn -0.754814 0.646413 -0.111240 +vn -0.676046 0.571337 -0.465255 +vn -0.609180 0.475936 -0.634297 +vn -0.516831 0.396558 -0.758660 +vn -0.647877 0.356120 -0.673330 +vn -0.760308 0.275491 -0.588214 +vn -0.670400 0.662862 -0.333354 +vn -0.684255 0.729179 0.004852 +vn -0.688101 0.724265 -0.043947 +vn -0.721671 0.596088 -0.351878 +vn -0.686148 0.430921 -0.586047 +vn -0.604694 0.310495 -0.733390 +vn -0.764550 0.249153 -0.594409 +vn -0.806269 0.200079 -0.556627 +vn -0.993072 0.042879 -0.109134 +vn -0.992462 -0.036531 -0.116825 +vn -0.984283 -0.108737 -0.138981 +vn -0.950194 -0.247383 -0.189489 +vn -0.886746 -0.374981 -0.270241 +vn -0.828761 -0.499954 -0.251320 +vn -0.864284 -0.483108 -0.139866 +vn -0.938658 0.043977 -0.341990 +vn -0.949431 -0.016572 -0.313425 +vn -0.957976 -0.095218 -0.270516 +vn -0.917753 -0.291757 -0.269326 +vn -0.843593 -0.439161 -0.308939 +vn -0.861538 -0.404248 -0.307047 +vn -0.863186 -0.423750 -0.274361 +vn -0.908658 0.016449 -0.417127 +vn -0.886441 -0.009125 -0.462722 +vn -0.900143 -0.023286 -0.434919 +vn -0.902371 -0.252876 -0.348888 +vn -0.858058 -0.442763 -0.260079 +vn -0.883480 -0.400037 -0.243690 +vn -0.846339 -0.439924 -0.300211 +vn -0.949980 -0.030061 -0.310831 +vn -0.913755 -0.105686 -0.392224 +vn -0.882138 0.003540 -0.470962 +vn -0.878109 -0.135136 -0.458937 +vn -0.873867 -0.344462 -0.342967 +vn -0.899167 -0.373608 -0.227729 +vn -0.850124 -0.491836 -0.187964 +vn -0.854152 -0.028718 -0.519211 +vn -0.885952 -0.115482 -0.449141 +vn -0.932554 0.011048 -0.360759 +vn -0.945891 -0.059420 -0.318918 +vn -0.935575 -0.235481 -0.263039 +vn -0.920621 -0.330424 -0.207953 +vn -0.813410 -0.525956 -0.248360 +vn -0.706076 0.091708 -0.702139 +vn -0.826044 0.054048 -0.560961 +vn -0.873806 0.041780 -0.484420 +vn -0.852321 -0.066561 -0.518693 +vn -0.843257 -0.159246 -0.513321 +vn -0.808924 -0.318308 -0.494247 +vn -0.665487 -0.542131 -0.512986 +vn -0.759941 0.197882 -0.619098 +vn -0.773309 0.153081 -0.615223 +vn -0.702658 -0.074648 -0.707572 +vn -0.515519 -0.183233 -0.837031 +vn -0.438551 -0.086703 -0.894498 +vn -0.474654 -0.171545 -0.863247 +vn -0.446730 -0.440352 -0.778771 +vn -0.606037 0.127598 -0.785089 +vn -0.510514 0.105533 -0.853359 +vn -0.444166 -0.191839 -0.875118 +vn -0.389019 -0.298044 -0.871670 +vn -0.398541 -0.139348 -0.906491 +vn -0.340465 -0.073580 -0.937346 +vn -0.304758 -0.268899 -0.913663 +vn -0.260964 0.330149 -0.907132 +vn -0.224158 0.391003 -0.892666 +vn 0.003265 0.425581 -0.904904 +vn -0.002747 0.362957 -0.931791 +vn 0.074984 0.408429 -0.909665 +vn 0.123753 0.345378 -0.930235 +vn 0.193884 0.384625 -0.902463 +vn 0.225715 0.305460 -0.925047 +vn 0.449263 0.352428 -0.820917 +vn 0.497055 0.263375 -0.826746 +vn 0.716910 0.326456 -0.615986 +vn 0.724662 0.232032 -0.648854 +vn 0.778588 0.387860 -0.493271 +vn 0.777886 0.251076 -0.576006 +vn 0.640736 0.431684 -0.634877 +vn 0.760735 0.212775 -0.613178 +vn -0.190802 0.337321 -0.921812 +vn 0.011902 0.366161 -0.930448 +vn 0.111362 0.430464 -0.895688 +vn 0.203162 0.513108 -0.833888 +vn 0.391339 0.529313 -0.752739 +vn 0.683248 0.478805 -0.551225 +vn 0.780572 0.431074 -0.452589 +vn 0.605060 0.474899 -0.638997 +vn -0.183691 0.292611 -0.938414 +vn 0.048158 0.319315 -0.946410 +vn 0.252663 0.410810 -0.876003 +vn 0.265236 0.509384 -0.818598 +vn 0.391217 0.529130 -0.752922 +vn 0.666189 0.467208 -0.581256 +vn 0.795923 0.336894 -0.502945 +vn 0.655843 0.313822 -0.686514 +vn -0.183721 0.316233 -0.930692 +vn 0.040712 0.304025 -0.951781 +vn 0.326304 0.260475 -0.908628 +vn 0.344951 0.296731 -0.890469 +vn 0.457564 0.372326 -0.807428 +vn 0.641896 0.364635 -0.674520 +vn 0.757012 0.263192 -0.597980 +vn 0.642659 0.168035 -0.747459 +vn -0.164434 0.373241 -0.913022 +vn -0.032746 0.353404 -0.934874 +vn 0.247108 0.239875 -0.938810 +vn 0.434828 0.193548 -0.879421 +vn 0.520005 0.254860 -0.815241 +vn 0.599872 0.241646 -0.762719 +vn 0.689169 0.153111 -0.708213 +vn 0.571673 0.066744 -0.817743 +vn -0.097262 0.280160 -0.954985 +vn -0.066958 0.333750 -0.940245 +vn 0.144658 0.310495 -0.939482 +vn 0.430799 0.210456 -0.877529 +vn 0.532853 0.158300 -0.831233 +vn 0.557512 0.143803 -0.817591 +vn 0.616047 0.087741 -0.782769 +vn 0.481552 0.009339 -0.876339 +vn -0.028504 0.280984 -0.959258 +vn -0.016907 0.320322 -0.947142 +vn 0.069399 0.313486 -0.947020 +vn 0.338633 0.196722 -0.920103 +vn 0.539750 0.116489 -0.833705 +vn 0.560259 0.129643 -0.818079 +vn 0.561418 0.119846 -0.818781 +vn 0.414502 0.087985 -0.905759 +vn 0.018708 0.086825 -0.996033 +vn -0.255501 0.147893 -0.955412 +vn 0.049318 -0.281991 -0.958129 +vn -0.210822 -0.242439 -0.946959 +vn -0.039003 -0.430433 -0.901761 +vn -0.233406 -0.543626 -0.806177 +vn -0.180120 -0.360637 -0.915128 +vn -0.328349 -0.402081 -0.854671 +vn -0.161504 -0.354747 -0.920896 +vn -0.280190 -0.221473 -0.934019 +vn -0.062197 -0.404981 -0.912198 +vn -0.104007 -0.265145 -0.958556 +vn 0.033479 -0.377789 -0.925260 +vn 0.041871 -0.307962 -0.950468 +vn 0.203803 0.030854 -0.978515 +vn 0.227577 -0.285226 -0.931028 +vn 0.175695 -0.297403 -0.938414 +vn 0.112583 -0.322733 -0.939756 +vn 0.085421 -0.401471 -0.911863 +vn 0.072146 -0.445784 -0.892209 +vn 0.057527 -0.407147 -0.911527 +vn 0.256294 -0.000488 -0.966582 +vn 0.263588 -0.294809 -0.918455 +vn 0.311838 -0.278451 -0.908383 +vn 0.348430 -0.302866 -0.887020 +vn 0.311655 -0.341075 -0.886837 +vn 0.217322 -0.393078 -0.893429 +vn 0.138890 -0.368999 -0.918973 +vn 0.499130 0.032868 -0.865871 +vn 0.440687 -0.277505 -0.853664 +vn 0.421918 -0.320170 -0.848201 +vn 0.424177 -0.288888 -0.858241 +vn 0.405499 -0.285043 -0.868496 +vn 0.390515 -0.314310 -0.865230 +vn 0.364422 -0.303629 -0.880306 +vn 0.753655 0.058901 -0.654592 +vn 0.735954 -0.199561 -0.646901 +vn 0.686087 -0.270730 -0.675222 +vn 0.659017 -0.255318 -0.707450 +vn 0.651326 -0.249947 -0.716422 +vn 0.645589 -0.237373 -0.725822 +vn 0.607379 -0.206977 -0.766961 +vn 0.831202 -0.007874 -0.555864 +vn 0.872066 -0.211737 -0.441115 +vn 0.879757 -0.129276 -0.457472 +vn 0.826106 -0.175878 -0.535295 +vn 0.784295 -0.206854 -0.584857 +vn 0.766076 -0.155858 -0.623554 +vn 0.735923 -0.125340 -0.665334 +vn 0.848872 -0.134037 -0.511277 +vn 0.867946 -0.324168 -0.376263 +vn 0.926420 -0.071444 -0.369610 +vn 0.895108 -0.047273 -0.443312 +vn 0.829829 -0.140141 -0.540117 +vn 0.787042 -0.113285 -0.606342 +vn 0.785119 -0.113834 -0.608783 +vn -0.360027 0.157781 -0.919492 +vn -0.307352 0.301004 -0.902707 +vn -0.371319 0.120518 -0.920621 +vn -0.342235 0.288675 -0.894162 +vn -0.445204 0.103519 -0.889401 +vn -0.437574 0.290536 -0.850917 +vn -0.573473 0.072024 -0.816034 +vn -0.446822 0.216773 -0.867946 +vn -0.596820 -0.056215 -0.800378 +vn -0.427595 -0.000244 -0.903958 +vn -0.489975 -0.119510 -0.863491 +vn -0.443556 -0.192541 -0.875301 +vn -0.419568 -0.043550 -0.906644 +vn -0.553697 -0.156652 -0.817805 +vn -0.395978 -0.219123 -0.891720 +vn -0.447798 -0.277566 -0.849940 +vn -0.432600 -0.333934 -0.837428 +vn -0.541032 -0.245766 -0.804254 +vn -0.617725 -0.094180 -0.780694 +vn -0.478744 -0.032044 -0.877346 +vn -0.317881 0.021485 -0.947874 +vn -0.370128 -0.560015 -0.741172 +vn -0.444075 -0.520920 -0.728965 +vn -0.359569 -0.456557 -0.813776 +vn -0.339976 -0.312418 -0.886990 +vn -0.501480 -0.100711 -0.859279 +vn -0.492965 -0.041444 -0.869045 +vn -0.329539 -0.132115 -0.934843 +vn -0.332011 -0.388348 -0.859615 +vn -0.374279 -0.291086 -0.880398 +vn -0.294198 -0.203436 -0.933805 +vn -0.194861 -0.137455 -0.971129 +vn -0.373241 -0.059572 -0.925810 +vn -0.546190 -0.029786 -0.837092 +vn -0.492264 -0.179815 -0.851650 +vn -0.217811 -0.081393 -0.972564 +vn -0.258095 0.013947 -0.966002 +vn -0.271645 0.006104 -0.962340 +vn -0.231483 -0.075350 -0.969909 +vn -0.381268 -0.179785 -0.906796 +vn -0.571612 -0.222144 -0.789850 +vn -0.590686 -0.190893 -0.783959 +vn -0.078280 -0.116520 -0.990081 +vn -0.246590 -0.060518 -0.967223 +vn -0.343181 -0.072329 -0.936460 +vn -0.417493 -0.176458 -0.891354 +vn -0.486099 -0.310923 -0.816706 +vn -0.528214 -0.321787 -0.785760 +vn -0.506851 -0.184973 -0.841914 +vn -0.018860 -0.276955 -0.960662 +vn -0.261452 -0.241829 -0.934416 +vn -0.420972 -0.235054 -0.876064 +vn -0.578722 -0.282022 -0.765191 +vn -0.544939 -0.377911 -0.748466 +vn -0.416700 -0.363964 -0.832972 +vn -0.365917 -0.245186 -0.897732 +vn -0.274941 0.349284 -0.895749 +vn -0.222816 0.279733 -0.933836 +vn -0.192389 0.306558 -0.932188 +vn -0.254219 0.360698 -0.897336 +vn -0.270516 0.318918 -0.908353 +vn -0.239357 0.226783 -0.944060 +vn -0.267434 0.275826 -0.923215 +vn -0.320963 0.309030 -0.895230 +vn -0.294656 0.238624 -0.925291 +vn -0.353252 0.364940 -0.861385 +vn -0.446394 0.407697 -0.796533 +vn -0.410230 0.214118 -0.886471 +vn -0.342204 0.210242 -0.915769 +vn -0.375805 0.304270 -0.875301 +vn -0.430952 0.259133 -0.864345 +vn -0.424207 0.238411 -0.873592 +vn -0.422285 0.442885 -0.790857 +vn -0.397992 0.404004 -0.823603 +vn -0.307199 0.098788 -0.946471 +vn -0.174017 0.153081 -0.972747 +vn -0.137547 0.391217 -0.909940 +vn -0.380718 0.261025 -0.887051 +vn -0.382244 0.224982 -0.896237 +vn -0.315348 0.413312 -0.854213 +vn -0.257759 0.394574 -0.881924 +vn -0.238563 0.030641 -0.970611 +vn -0.225349 0.093844 -0.969726 +vn -0.229469 0.407697 -0.883785 +vn -0.239998 0.215918 -0.946440 +vn -0.228004 0.249336 -0.941160 +vn -0.272805 0.382916 -0.882565 +vn -0.270211 0.382244 -0.883663 +vn -0.292520 0.046327 -0.955107 +vn -0.401410 0.101291 -0.910245 +vn -0.476791 0.347209 -0.807489 +vn -0.377819 0.117435 -0.918393 +vn -0.329112 0.321512 -0.887845 +vn -0.346141 0.430036 -0.833796 +vn -0.383374 0.379192 -0.842128 +vn -0.454390 0.112888 -0.883602 +vn -0.557360 0.178228 -0.810877 +vn -0.586077 0.305673 -0.750359 +vn -0.639943 0.092593 -0.762780 +vn -0.585376 0.293130 -0.755882 +vn -0.508255 0.458113 -0.729209 +vn -0.544694 0.418836 -0.726524 +vn -0.642140 0.197821 -0.740593 +vn -0.692404 0.211829 -0.689688 +vn -0.684317 0.228736 -0.692343 +g Cube_Cube_Material +usemtl Material +s 1 +f 1/1/1 23/2/2 30/3/3 +f 1/1/1 30/3/3 2/4/4 +f 2/4/4 30/3/3 31/5/5 +f 2/4/4 31/5/5 3/6/6 +f 3/6/6 31/5/5 32/7/7 +f 3/6/6 32/7/7 4/8/8 +f 4/8/8 32/7/7 33/9/9 +f 4/8/8 33/9/9 5/10/10 +f 5/10/10 33/9/9 34/11/11 +f 5/10/10 34/11/11 6/12/12 +f 6/12/12 34/11/11 35/13/13 +f 6/12/12 35/13/13 7/14/14 +f 7/14/14 35/13/13 36/15/15 +f 7/14/14 36/15/15 8/16/16 +f 8/16/16 36/15/15 1357/17/17 +f 8/16/16 1357/17/17 1358/18/18 +f 23/2/2 24/19/19 37/20/20 +f 23/2/2 37/20/20 30/3/3 +f 30/3/3 37/20/20 38/21/21 +f 30/3/3 38/21/21 31/5/5 +f 31/5/5 38/21/21 39/22/22 +f 31/5/5 39/22/22 32/7/7 +f 32/7/7 39/22/22 40/23/23 +f 32/7/7 40/23/23 33/9/9 +f 33/9/9 40/23/23 41/24/24 +f 33/9/9 41/24/24 34/11/11 +f 34/11/11 41/24/24 42/25/25 +f 34/11/11 42/25/25 35/13/13 +f 35/13/13 42/25/25 43/26/26 +f 35/13/13 43/26/26 36/15/15 +f 36/15/15 43/26/26 1356/27/27 +f 36/15/15 1356/27/27 1357/17/17 +f 24/19/19 25/28/28 44/29/29 +f 24/19/19 44/29/29 37/20/20 +f 37/20/20 44/29/29 45/30/30 +f 37/20/20 45/30/30 38/21/21 +f 38/21/21 45/30/30 46/31/31 +f 38/21/21 46/31/31 39/22/22 +f 39/22/22 46/31/31 47/32/32 +f 39/22/22 47/32/32 40/23/23 +f 40/23/23 47/32/32 48/33/33 +f 40/23/23 48/33/33 41/24/24 +f 41/24/24 48/33/33 49/34/34 +f 41/24/24 49/34/34 42/25/25 +f 42/25/25 49/34/34 50/35/35 +f 42/25/25 50/35/35 43/26/26 +f 43/26/26 50/35/35 1355/36/36 +f 43/26/26 1355/36/36 1356/27/27 +f 25/28/28 26/37/37 51/38/38 +f 25/28/28 51/38/38 44/29/29 +f 44/29/29 51/38/38 52/39/39 +f 44/29/29 52/39/39 45/30/30 +f 45/30/30 52/39/39 53/40/40 +f 45/30/30 53/40/40 46/31/31 +f 46/31/31 53/40/40 54/41/41 +f 46/31/31 54/41/41 47/32/32 +f 47/32/32 54/41/41 55/42/42 +f 47/32/32 55/42/42 48/33/33 +f 48/33/33 55/42/42 56/43/43 +f 48/33/33 56/43/43 49/34/34 +f 49/34/34 56/43/43 57/44/44 +f 49/34/34 57/44/44 50/35/35 +f 50/35/35 57/44/44 1354/45/45 +f 50/35/35 1354/45/45 1355/36/36 +f 26/37/37 27/46/46 58/47/47 +f 26/37/37 58/47/47 51/38/38 +f 51/38/38 58/47/47 59/48/48 +f 51/38/38 59/48/48 52/39/39 +f 52/39/39 59/48/48 60/49/49 +f 52/39/39 60/49/49 53/40/40 +f 53/40/40 60/49/49 61/50/50 +f 53/40/40 61/50/50 54/41/41 +f 54/41/41 61/50/50 62/51/51 +f 54/41/41 62/51/51 55/42/42 +f 55/42/42 62/51/51 63/52/52 +f 55/42/42 63/52/52 56/43/43 +f 56/43/43 63/52/52 64/53/53 +f 56/43/43 64/53/53 57/44/44 +f 57/44/44 64/53/53 1353/54/54 +f 57/44/44 1353/54/54 1354/45/45 +f 27/46/46 28/55/55 65/56/56 +f 27/46/46 65/56/56 58/47/47 +f 58/47/47 65/56/56 66/57/57 +f 58/47/47 66/57/57 59/48/48 +f 59/48/48 66/57/57 67/58/58 +f 59/48/48 67/58/58 60/49/49 +f 60/49/49 67/58/58 68/59/59 +f 60/49/49 68/59/59 61/50/50 +f 61/50/50 68/59/59 69/60/60 +f 61/50/50 69/60/60 62/51/51 +f 62/51/51 69/60/60 70/61/61 +f 62/51/51 70/61/61 63/52/52 +f 63/52/52 70/61/61 71/62/62 +f 63/52/52 71/62/62 64/53/53 +f 64/53/53 71/62/62 1352/63/63 +f 64/53/53 1352/63/63 1353/54/54 +f 28/55/55 29/64/64 72/65/65 +f 28/55/55 72/65/65 65/56/56 +f 65/56/56 72/65/65 73/66/66 +f 65/56/56 73/66/66 66/57/57 +f 66/57/57 73/66/66 74/67/67 +f 66/57/57 74/67/67 67/58/58 +f 67/58/58 74/67/67 75/68/68 +f 67/58/58 75/68/68 68/59/59 +f 68/59/59 75/68/68 76/69/69 +f 68/59/59 76/69/69 69/60/60 +f 69/60/60 76/69/69 77/70/70 +f 69/60/60 77/70/70 70/61/61 +f 70/61/61 77/70/70 78/71/71 +f 70/61/61 78/71/71 71/62/62 +f 71/62/62 78/71/71 1351/72/72 +f 71/62/62 1351/72/72 1352/63/63 +f 29/64/64 1373/73/73 1372/74/74 +f 29/64/64 1372/74/74 72/65/65 +f 72/65/65 1372/74/74 1371/75/75 +f 72/65/65 1371/75/75 73/66/66 +f 73/66/66 1371/75/75 1370/76/76 +f 73/66/66 1370/76/76 74/67/67 +f 74/67/67 1370/76/76 1369/77/77 +f 74/67/67 1369/77/77 75/68/68 +f 75/68/68 1369/77/77 1368/78/78 +f 75/68/68 1368/78/78 76/69/69 +f 76/69/69 1368/78/78 1367/79/79 +f 76/69/69 1367/79/79 77/70/70 +f 77/70/70 1367/79/79 1366/80/80 +f 77/70/70 1366/80/80 78/71/71 +f 78/71/71 1366/80/80 1531/81/81 +f 78/71/71 1531/81/81 1351/72/72 +f 1/1/1 2/4/4 79/82/82 +f 1/1/1 79/82/82 9/83/83 +f 9/83/83 79/82/82 80/84/84 +f 9/83/83 80/84/84 10/85/85 +f 10/85/85 80/84/84 81/86/86 +f 10/85/85 81/86/86 11/87/87 +f 11/87/87 81/86/86 82/88/88 +f 11/87/87 82/88/88 12/89/89 +f 12/89/89 82/88/88 83/90/90 +f 12/89/89 83/90/90 13/91/91 +f 13/91/91 83/90/90 84/92/92 +f 13/91/91 84/92/92 14/93/93 +f 14/93/93 84/92/92 85/94/94 +f 14/93/93 85/94/94 15/95/95 +f 15/95/95 85/94/94 1402/96/96 +f 15/95/95 1402/96/96 1403/97/97 +f 2/4/4 3/6/6 86/98/98 +f 2/4/4 86/98/98 79/82/82 +f 79/82/82 86/98/98 87/99/99 +f 79/82/82 87/99/99 80/84/84 +f 80/84/84 87/99/99 88/100/100 +f 80/84/84 88/100/100 81/86/86 +f 81/86/86 88/100/100 89/101/101 +f 81/86/86 89/101/101 82/88/88 +f 82/88/88 89/101/101 90/102/102 +f 82/88/88 90/102/102 83/90/90 +f 83/90/90 90/102/102 91/103/103 +f 83/90/90 91/103/103 84/92/92 +f 84/92/92 91/103/103 92/104/104 +f 84/92/92 92/104/104 85/94/94 +f 85/94/94 92/104/104 1401/105/105 +f 85/94/94 1401/105/105 1402/96/96 +f 3/6/6 4/8/8 93/106/106 +f 3/6/6 93/106/106 86/98/98 +f 86/98/98 93/106/106 94/107/107 +f 86/98/98 94/107/107 87/99/99 +f 87/99/99 94/107/107 95/108/108 +f 87/99/99 95/108/108 88/100/100 +f 88/100/100 95/108/108 96/109/109 +f 88/100/100 96/109/109 89/101/101 +f 89/101/101 96/109/109 97/110/110 +f 89/101/101 97/110/110 90/102/102 +f 90/102/102 97/110/110 98/111/111 +f 90/102/102 98/111/111 91/103/103 +f 91/103/103 98/111/111 99/112/112 +f 91/103/103 99/112/112 92/104/104 +f 92/104/104 99/112/112 1400/113/113 +f 92/104/104 1400/113/113 1401/105/105 +f 4/8/8 5/10/10 100/114/114 +f 4/8/8 100/114/114 93/106/106 +f 93/106/106 100/114/114 101/115/115 +f 93/106/106 101/115/115 94/107/107 +f 94/107/107 101/115/115 102/116/116 +f 94/107/107 102/116/116 95/108/108 +f 95/108/108 102/116/116 103/117/117 +f 95/108/108 103/117/117 96/109/109 +f 96/109/109 103/117/117 104/118/118 +f 96/109/109 104/118/118 97/110/110 +f 97/110/110 104/118/118 105/119/119 +f 97/110/110 105/119/119 98/111/111 +f 98/111/111 105/119/119 106/120/120 +f 98/111/111 106/120/120 99/112/112 +f 99/112/112 106/120/120 1399/121/121 +f 99/112/112 1399/121/121 1400/113/113 +f 5/10/10 6/12/12 107/122/122 +f 5/10/10 107/122/122 100/114/114 +f 100/114/114 107/122/122 108/123/123 +f 100/114/114 108/123/123 101/115/115 +f 101/115/115 108/123/123 109/124/124 +f 101/115/115 109/124/124 102/116/116 +f 102/116/116 109/124/124 110/125/125 +f 102/116/116 110/125/125 103/117/117 +f 103/117/117 110/125/125 111/126/126 +f 103/117/117 111/126/126 104/118/118 +f 104/118/118 111/126/126 112/127/127 +f 104/118/118 112/127/127 105/119/119 +f 105/119/119 112/127/127 113/128/128 +f 105/119/119 113/128/128 106/120/120 +f 106/120/120 113/128/128 1398/129/129 +f 106/120/120 1398/129/129 1399/121/121 +f 6/12/12 7/14/14 114/130/130 +f 6/12/12 114/130/130 107/122/122 +f 107/122/122 114/130/130 115/131/131 +f 107/122/122 115/131/131 108/123/123 +f 108/123/123 115/131/131 116/132/132 +f 108/123/123 116/132/132 109/124/124 +f 109/124/124 116/132/132 117/133/133 +f 109/124/124 117/133/133 110/125/125 +f 110/125/125 117/133/133 118/134/134 +f 110/125/125 118/134/134 111/126/126 +f 111/126/126 118/134/134 119/135/135 +f 111/126/126 119/135/135 112/127/127 +f 112/127/127 119/135/135 120/136/136 +f 112/127/127 120/136/136 113/128/128 +f 113/128/128 120/136/136 1397/137/137 +f 113/128/128 1397/137/137 1398/129/129 +f 7/14/14 8/16/16 121/138/138 +f 7/14/14 121/138/138 114/130/130 +f 114/130/130 121/138/138 122/139/139 +f 114/130/130 122/139/139 115/131/131 +f 115/131/131 122/139/139 123/140/140 +f 115/131/131 123/140/140 116/132/132 +f 116/132/132 123/140/140 124/141/141 +f 116/132/132 124/141/141 117/133/133 +f 117/133/133 124/141/141 125/142/142 +f 117/133/133 125/142/142 118/134/134 +f 118/134/134 125/142/142 126/143/143 +f 118/134/134 126/143/143 119/135/135 +f 119/135/135 126/143/143 127/144/144 +f 119/135/135 127/144/144 120/136/136 +f 120/136/136 127/144/144 1396/145/145 +f 120/136/136 1396/145/145 1397/137/137 +f 8/16/16 1358/18/18 1359/146/146 +f 8/16/16 1359/146/146 121/138/138 +f 121/138/138 1359/146/146 1360/147/147 +f 121/138/138 1360/147/147 122/139/139 +f 122/139/139 1360/147/147 1361/148/148 +f 122/139/139 1361/148/148 123/140/140 +f 123/140/140 1361/148/148 1362/149/149 +f 123/140/140 1362/149/149 124/141/141 +f 124/141/141 1362/149/149 1363/150/150 +f 124/141/141 1363/150/150 125/142/142 +f 125/142/142 1363/150/150 1364/151/151 +f 125/142/142 1364/151/151 126/143/143 +f 126/143/143 1364/151/151 1365/152/152 +f 126/143/143 1365/152/152 127/144/144 +f 127/144/144 1365/152/152 1532/153/153 +f 127/144/144 1532/153/153 1396/145/145 +f 1/1/1 9/83/83 128/154/154 +f 1/1/1 128/154/154 16/155/155 +f 16/155/155 128/154/154 129/156/156 +f 16/155/155 129/156/156 17/157/157 +f 17/157/157 129/156/156 130/158/158 +f 17/157/157 130/158/158 18/159/159 +f 18/159/159 130/158/158 131/160/160 +f 18/159/159 131/160/160 19/161/161 +f 19/161/161 131/160/160 132/162/162 +f 19/161/161 132/162/162 20/163/163 +f 20/163/163 132/162/162 133/164/164 +f 20/163/163 133/164/164 21/165/165 +f 21/165/165 133/164/164 134/166/166 +f 21/165/165 134/166/166 22/167/167 +f 22/167/167 134/166/166 1432/168/168 +f 22/167/167 1432/168/168 1433/169/169 +f 9/83/83 10/85/85 135/170/170 +f 9/83/83 135/170/170 128/154/154 +f 128/154/154 135/170/170 136/171/171 +f 128/154/154 136/171/171 129/156/156 +f 129/156/156 136/171/171 137/172/172 +f 129/156/156 137/172/172 130/158/158 +f 130/158/158 137/172/172 138/173/173 +f 130/158/158 138/173/173 131/160/160 +f 131/160/160 138/173/173 139/174/174 +f 131/160/160 139/174/174 132/162/162 +f 132/162/162 139/174/174 140/175/175 +f 132/162/162 140/175/175 133/164/164 +f 133/164/164 140/175/175 141/176/176 +f 133/164/164 141/176/176 134/166/166 +f 134/166/166 141/176/176 1431/177/177 +f 134/166/166 1431/177/177 1432/168/168 +f 10/85/85 11/87/87 142/178/178 +f 10/85/85 142/178/178 135/170/170 +f 135/170/170 142/178/178 143/179/179 +f 135/170/170 143/179/179 136/171/171 +f 136/171/171 143/179/179 144/180/180 +f 136/171/171 144/180/180 137/172/172 +f 137/172/172 144/180/180 145/181/181 +f 137/172/172 145/181/181 138/173/173 +f 138/173/173 145/181/181 146/182/182 +f 138/173/173 146/182/182 139/174/174 +f 139/174/174 146/182/182 147/183/183 +f 139/174/174 147/183/183 140/175/175 +f 140/175/175 147/183/183 148/184/184 +f 140/175/175 148/184/184 141/176/176 +f 141/176/176 148/184/184 1430/185/185 +f 141/176/176 1430/185/185 1431/177/177 +f 11/87/87 12/89/89 149/186/186 +f 11/87/87 149/186/186 142/178/178 +f 142/178/178 149/186/186 150/187/187 +f 142/178/178 150/187/187 143/179/179 +f 143/179/179 150/187/187 151/188/188 +f 143/179/179 151/188/188 144/180/180 +f 144/180/180 151/188/188 152/189/189 +f 144/180/180 152/189/189 145/181/181 +f 145/181/181 152/189/189 153/190/190 +f 145/181/181 153/190/190 146/182/182 +f 146/182/182 153/190/190 154/191/191 +f 146/182/182 154/191/191 147/183/183 +f 147/183/183 154/191/191 155/192/192 +f 147/183/183 155/192/192 148/184/184 +f 148/184/184 155/192/192 1429/193/193 +f 148/184/184 1429/193/193 1430/185/185 +f 12/89/89 13/91/91 156/194/194 +f 12/89/89 156/194/194 149/186/186 +f 149/186/186 156/194/194 157/195/195 +f 149/186/186 157/195/195 150/187/187 +f 150/187/187 157/195/195 158/196/196 +f 150/187/187 158/196/196 151/188/188 +f 151/188/188 158/196/196 159/197/197 +f 151/188/188 159/197/197 152/189/189 +f 152/189/189 159/197/197 160/198/198 +f 152/189/189 160/198/198 153/190/190 +f 153/190/190 160/198/198 161/199/199 +f 153/190/190 161/199/199 154/191/191 +f 154/191/191 161/199/199 162/200/200 +f 154/191/191 162/200/200 155/192/192 +f 155/192/192 162/200/200 1428/201/201 +f 155/192/192 1428/201/201 1429/193/193 +f 13/91/91 14/93/93 163/202/202 +f 13/91/91 163/202/202 156/194/194 +f 156/194/194 163/202/202 164/203/203 +f 156/194/194 164/203/203 157/195/195 +f 157/195/195 164/203/203 165/204/204 +f 157/195/195 165/204/204 158/196/196 +f 158/196/196 165/204/204 166/205/205 +f 158/196/196 166/205/205 159/197/197 +f 159/197/197 166/205/205 167/206/206 +f 159/197/197 167/206/206 160/198/198 +f 160/198/198 167/206/206 168/207/207 +f 160/198/198 168/207/207 161/199/199 +f 161/199/199 168/207/207 169/208/208 +f 161/199/199 169/208/208 162/200/200 +f 162/200/200 169/208/208 1427/209/209 +f 162/200/200 1427/209/209 1428/201/201 +f 14/93/93 15/95/95 170/210/210 +f 14/93/93 170/210/210 163/202/202 +f 163/202/202 170/210/210 171/211/211 +f 163/202/202 171/211/211 164/203/203 +f 164/203/203 171/211/211 172/212/212 +f 164/203/203 172/212/212 165/204/204 +f 165/204/204 172/212/212 173/213/213 +f 165/204/204 173/213/213 166/205/205 +f 166/205/205 173/213/213 174/214/214 +f 166/205/205 174/214/214 167/206/206 +f 167/206/206 174/214/214 175/215/215 +f 167/206/206 175/215/215 168/207/207 +f 168/207/207 175/215/215 176/216/216 +f 168/207/207 176/216/216 169/208/208 +f 169/208/208 176/216/216 1426/217/217 +f 169/208/208 1426/217/217 1427/209/209 +f 15/95/95 1403/97/97 1404/218/218 +f 15/95/95 1404/218/218 170/210/210 +f 170/210/210 1404/218/218 1405/219/219 +f 170/210/210 1405/219/219 171/211/211 +f 171/211/211 1405/219/219 1406/220/220 +f 171/211/211 1406/220/220 172/212/212 +f 172/212/212 1406/220/220 1407/221/221 +f 172/212/212 1407/221/221 173/213/213 +f 173/213/213 1407/221/221 1408/222/222 +f 173/213/213 1408/222/222 174/214/214 +f 174/214/214 1408/222/222 1409/223/223 +f 174/214/214 1409/223/223 175/215/215 +f 175/215/215 1409/223/223 1410/224/224 +f 175/215/215 1410/224/224 176/216/216 +f 176/216/216 1410/224/224 1533/225/225 +f 176/216/216 1533/225/225 1426/217/217 +f 1/1/1 16/155/155 177/226/226 +f 1/1/1 177/226/226 23/2/2 +f 23/2/2 177/226/226 178/227/227 +f 23/2/2 178/227/227 24/19/19 +f 24/19/19 178/227/227 179/228/228 +f 24/19/19 179/228/228 25/28/28 +f 25/28/28 179/228/228 180/229/229 +f 25/28/28 180/229/229 26/37/37 +f 26/37/37 180/229/229 181/230/230 +f 26/37/37 181/230/230 27/46/46 +f 27/46/46 181/230/230 182/231/231 +f 27/46/46 182/231/231 28/55/55 +f 28/55/55 182/231/231 183/232/232 +f 28/55/55 183/232/232 29/64/64 +f 29/64/64 183/232/232 1374/233/233 +f 29/64/64 1374/233/233 1373/73/73 +f 16/155/155 17/157/157 184/234/234 +f 16/155/155 184/234/234 177/226/226 +f 177/226/226 184/234/234 185/235/235 +f 177/226/226 185/235/235 178/227/227 +f 178/227/227 185/235/235 186/236/236 +f 178/227/227 186/236/236 179/228/228 +f 179/228/228 186/236/236 187/237/237 +f 179/228/228 187/237/237 180/229/229 +f 180/229/229 187/237/237 188/238/238 +f 180/229/229 188/238/238 181/230/230 +f 181/230/230 188/238/238 189/239/239 +f 181/230/230 189/239/239 182/231/231 +f 182/231/231 189/239/239 190/240/240 +f 182/231/231 190/240/240 183/232/232 +f 183/232/232 190/240/240 1375/241/241 +f 183/232/232 1375/241/241 1374/233/233 +f 17/157/157 18/159/159 191/242/242 +f 17/157/157 191/242/242 184/234/234 +f 184/234/234 191/242/242 192/243/243 +f 184/234/234 192/243/243 185/235/235 +f 185/235/235 192/243/243 193/244/244 +f 185/235/235 193/244/244 186/236/236 +f 186/236/236 193/244/244 194/245/245 +f 186/236/236 194/245/245 187/237/237 +f 187/237/237 194/245/245 195/246/246 +f 187/237/237 195/246/246 188/238/238 +f 188/238/238 195/246/246 196/247/247 +f 188/238/238 196/247/247 189/239/239 +f 189/239/239 196/247/247 197/248/248 +f 189/239/239 197/248/248 190/240/240 +f 190/240/240 197/248/248 1376/249/249 +f 190/240/240 1376/249/249 1375/241/241 +f 18/159/159 19/161/161 198/250/250 +f 18/159/159 198/250/250 191/242/242 +f 191/242/242 198/250/250 199/251/251 +f 191/242/242 199/251/251 192/243/243 +f 192/243/243 199/251/251 200/252/252 +f 192/243/243 200/252/252 193/244/244 +f 193/244/244 200/252/252 201/253/253 +f 193/244/244 201/253/253 194/245/245 +f 194/245/245 201/253/253 202/254/254 +f 194/245/245 202/254/254 195/246/246 +f 195/246/246 202/254/254 203/255/255 +f 195/246/246 203/255/255 196/247/247 +f 196/247/247 203/255/255 204/256/256 +f 196/247/247 204/256/256 197/248/248 +f 197/248/248 204/256/256 1377/257/257 +f 197/248/248 1377/257/257 1376/249/249 +f 19/161/161 20/163/163 205/258/258 +f 19/161/161 205/258/258 198/250/250 +f 198/250/250 205/258/258 206/259/259 +f 198/250/250 206/259/259 199/251/251 +f 199/251/251 206/259/259 207/260/260 +f 199/251/251 207/260/260 200/252/252 +f 200/252/252 207/260/260 208/261/261 +f 200/252/252 208/261/261 201/253/253 +f 201/253/253 208/261/261 209/262/262 +f 201/253/253 209/262/262 202/254/254 +f 202/254/254 209/262/262 210/263/263 +f 202/254/254 210/263/263 203/255/255 +f 203/255/255 210/263/263 211/264/264 +f 203/255/255 211/264/264 204/256/256 +f 204/256/256 211/264/264 1378/265/265 +f 204/256/256 1378/265/265 1377/257/257 +f 20/163/163 21/165/165 212/266/266 +f 20/163/163 212/266/266 205/258/258 +f 205/258/258 212/266/266 213/267/267 +f 205/258/258 213/267/267 206/259/259 +f 206/259/259 213/267/267 214/268/268 +f 206/259/259 214/268/268 207/260/260 +f 207/260/260 214/268/268 215/269/269 +f 207/260/260 215/269/269 208/261/261 +f 208/261/261 215/269/269 216/270/270 +f 208/261/261 216/270/270 209/262/262 +f 209/262/262 216/270/270 217/271/271 +f 209/262/262 217/271/271 210/263/263 +f 210/263/263 217/271/271 218/272/272 +f 210/263/263 218/272/272 211/264/264 +f 211/264/264 218/272/272 1379/273/273 +f 211/264/264 1379/273/273 1378/265/265 +f 21/165/165 22/167/167 219/274/274 +f 21/165/165 219/274/274 212/266/266 +f 212/266/266 219/274/274 220/275/275 +f 212/266/266 220/275/275 213/267/267 +f 213/267/267 220/275/275 221/276/276 +f 213/267/267 221/276/276 214/268/268 +f 214/268/268 221/276/276 222/277/277 +f 214/268/268 222/277/277 215/269/269 +f 215/269/269 222/277/277 223/278/278 +f 215/269/269 223/278/278 216/270/270 +f 216/270/270 223/278/278 224/279/279 +f 216/270/270 224/279/279 217/271/271 +f 217/271/271 224/279/279 225/280/280 +f 217/271/271 225/280/280 218/272/272 +f 218/272/272 225/280/280 1380/281/281 +f 218/272/272 1380/281/281 1379/273/273 +f 22/167/167 1433/169/169 1434/282/282 +f 22/167/167 1434/282/282 219/274/274 +f 219/274/274 1434/282/282 1435/283/283 +f 219/274/274 1435/283/283 220/275/275 +f 220/275/275 1435/283/283 1436/284/284 +f 220/275/275 1436/284/284 221/276/276 +f 221/276/276 1436/284/284 1437/285/285 +f 221/276/276 1437/285/285 222/277/277 +f 222/277/277 1437/285/285 1438/286/286 +f 222/277/277 1438/286/286 223/278/278 +f 223/278/278 1438/286/286 1439/287/287 +f 223/278/278 1439/287/287 224/279/279 +f 224/279/279 1439/287/287 1440/288/288 +f 224/279/279 1440/288/288 225/280/280 +f 225/280/280 1440/288/288 1534/289/289 +f 225/280/280 1534/289/289 1380/281/281 +f 226/290/290 248/291/291 255/292/292 +f 226/290/290 255/292/292 227/293/293 +f 227/293/293 255/292/292 256/294/294 +f 227/293/293 256/294/294 228/295/295 +f 228/295/295 256/294/294 257/296/296 +f 228/295/295 257/296/296 229/297/297 +f 229/297/297 257/296/296 258/298/298 +f 229/297/297 258/298/298 230/299/299 +f 230/299/299 258/298/298 259/300/300 +f 230/299/299 259/300/300 231/301/301 +f 231/301/301 259/300/300 260/302/302 +f 231/301/301 260/302/302 232/303/303 +f 232/303/303 260/302/302 261/304/304 +f 232/303/303 261/304/304 233/305/305 +f 233/305/305 261/304/304 1492/306/306 +f 233/305/305 1492/306/306 1493/307/307 +f 248/291/291 249/308/308 262/309/309 +f 248/291/291 262/309/309 255/292/292 +f 255/292/292 262/309/309 263/310/310 +f 255/292/292 263/310/310 256/294/294 +f 256/294/294 263/310/310 264/311/311 +f 256/294/294 264/311/311 257/296/296 +f 257/296/296 264/311/311 265/312/312 +f 257/296/296 265/312/312 258/298/298 +f 258/298/298 265/312/312 266/313/313 +f 258/298/298 266/313/313 259/300/300 +f 259/300/300 266/313/313 267/314/314 +f 259/300/300 267/314/314 260/302/302 +f 260/302/302 267/314/314 268/315/315 +f 260/302/302 268/315/315 261/304/304 +f 261/304/304 268/315/315 1491/316/316 +f 261/304/304 1491/316/316 1492/306/306 +f 249/308/308 250/317/317 269/318/318 +f 249/308/308 269/318/318 262/309/309 +f 262/309/309 269/318/318 270/319/319 +f 262/309/309 270/319/319 263/310/310 +f 263/310/310 270/319/319 271/320/320 +f 263/310/310 271/320/320 264/311/311 +f 264/311/311 271/320/320 272/321/321 +f 264/311/311 272/321/321 265/312/312 +f 265/312/312 272/321/321 273/322/322 +f 265/312/312 273/322/322 266/313/313 +f 266/313/313 273/322/322 274/323/323 +f 266/313/313 274/323/323 267/314/314 +f 267/314/314 274/323/323 275/324/324 +f 267/314/314 275/324/324 268/315/315 +f 268/315/315 275/324/324 1490/325/325 +f 268/315/315 1490/325/325 1491/316/316 +f 250/317/317 251/326/326 276/327/327 +f 250/317/317 276/327/327 269/318/318 +f 269/318/318 276/327/327 277/328/328 +f 269/318/318 277/328/328 270/319/319 +f 270/319/319 277/328/328 278/329/329 +f 270/319/319 278/329/329 271/320/320 +f 271/320/320 278/329/329 279/330/330 +f 271/320/320 279/330/330 272/321/321 +f 272/321/321 279/330/330 280/331/331 +f 272/321/321 280/331/331 273/322/322 +f 273/322/322 280/331/331 281/332/332 +f 273/322/322 281/332/332 274/323/323 +f 274/323/323 281/332/332 282/333/333 +f 274/323/323 282/333/333 275/324/324 +f 275/324/324 282/333/333 1489/334/334 +f 275/324/324 1489/334/334 1490/325/325 +f 251/326/326 252/335/335 283/336/336 +f 251/326/326 283/336/336 276/327/327 +f 276/327/327 283/336/336 284/337/337 +f 276/327/327 284/337/337 277/328/328 +f 277/328/328 284/337/337 285/338/338 +f 277/328/328 285/338/338 278/329/329 +f 278/329/329 285/338/338 286/339/339 +f 278/329/329 286/339/339 279/330/330 +f 279/330/330 286/339/339 287/340/340 +f 279/330/330 287/340/340 280/331/331 +f 280/331/331 287/340/340 288/341/341 +f 280/331/331 288/341/341 281/332/332 +f 281/332/332 288/341/341 289/342/342 +f 281/332/332 289/342/342 282/333/333 +f 282/333/333 289/342/342 1488/343/343 +f 282/333/333 1488/343/343 1489/334/334 +f 252/335/335 253/344/344 290/345/345 +f 252/335/335 290/345/345 283/336/336 +f 283/336/336 290/345/345 291/346/346 +f 283/336/336 291/346/346 284/337/337 +f 284/337/337 291/346/346 292/347/347 +f 284/337/337 292/347/347 285/338/338 +f 285/338/338 292/347/347 293/348/348 +f 285/338/338 293/348/348 286/339/339 +f 286/339/339 293/348/348 294/349/349 +f 286/339/339 294/349/349 287/340/340 +f 287/340/340 294/349/349 295/350/350 +f 287/340/340 295/350/350 288/341/341 +f 288/341/341 295/350/350 296/351/351 +f 288/341/341 296/351/351 289/342/342 +f 289/342/342 296/351/351 1487/352/352 +f 289/342/342 1487/352/352 1488/343/343 +f 253/344/344 254/353/353 297/354/354 +f 253/344/344 297/354/354 290/345/345 +f 290/345/345 297/354/354 298/355/355 +f 290/345/345 298/355/355 291/346/346 +f 291/346/346 298/355/355 299/356/356 +f 291/346/346 299/356/356 292/347/347 +f 292/347/347 299/356/356 300/357/357 +f 292/347/347 300/357/357 293/348/348 +f 293/348/348 300/357/357 301/358/358 +f 293/348/348 301/358/358 294/349/349 +f 294/349/349 301/358/358 302/359/359 +f 294/349/349 302/359/359 295/350/350 +f 295/350/350 302/359/359 303/360/360 +f 295/350/350 303/360/360 296/351/351 +f 296/351/351 303/360/360 1486/361/361 +f 296/351/351 1486/361/361 1487/352/352 +f 254/353/353 1478/362/362 1477/363/363 +f 254/353/353 1477/363/363 297/354/354 +f 297/354/354 1477/363/363 1476/364/364 +f 297/354/354 1476/364/364 298/355/355 +f 298/355/355 1476/364/364 1475/365/365 +f 298/355/355 1475/365/365 299/356/356 +f 299/356/356 1475/365/365 1474/366/366 +f 299/356/356 1474/366/366 300/357/357 +f 300/357/357 1474/366/366 1473/367/367 +f 300/357/357 1473/367/367 301/358/358 +f 301/358/358 1473/367/367 1472/368/368 +f 301/358/358 1472/368/368 302/359/359 +f 302/359/359 1472/368/368 1471/369/369 +f 302/359/359 1471/369/369 303/360/360 +f 303/360/360 1471/369/369 1535/370/370 +f 303/360/360 1535/370/370 1486/361/361 +f 226/290/290 227/293/293 304/371/371 +f 226/290/290 304/371/371 234/372/372 +f 234/372/372 304/371/371 305/373/373 +f 234/372/372 305/373/373 235/374/374 +f 235/374/374 305/373/373 306/375/375 +f 235/374/374 306/375/375 236/376/376 +f 236/376/376 306/375/375 307/377/377 +f 236/376/376 307/377/377 237/378/378 +f 237/378/378 307/377/377 308/379/379 +f 237/378/378 308/379/379 238/380/380 +f 238/380/380 308/379/379 309/381/381 +f 238/380/380 309/381/381 239/382/382 +f 239/382/382 309/381/381 310/383/383 +f 239/382/382 310/383/383 240/384/384 +f 240/384/384 310/383/383 1524/385/385 +f 240/384/384 1524/385/385 1523/386/386 +f 227/293/293 228/295/295 311/387/387 +f 227/293/293 311/387/387 304/371/371 +f 304/371/371 311/387/387 312/388/388 +f 304/371/371 312/388/388 305/373/373 +f 305/373/373 312/388/388 313/389/389 +f 305/373/373 313/389/389 306/375/375 +f 306/375/375 313/389/389 314/390/390 +f 306/375/375 314/390/390 307/377/377 +f 307/377/377 314/390/390 315/391/391 +f 307/377/377 315/391/391 308/379/379 +f 308/379/379 315/391/391 316/392/392 +f 308/379/379 316/392/392 309/381/381 +f 309/381/381 316/392/392 317/393/393 +f 309/381/381 317/393/393 310/383/383 +f 310/383/383 317/393/393 1525/394/394 +f 310/383/383 1525/394/394 1524/385/385 +f 228/295/295 229/297/297 318/395/395 +f 228/295/295 318/395/395 311/387/387 +f 311/387/387 318/395/395 319/396/396 +f 311/387/387 319/396/396 312/388/388 +f 312/388/388 319/396/396 320/397/397 +f 312/388/388 320/397/397 313/389/389 +f 313/389/389 320/397/397 321/398/398 +f 313/389/389 321/398/398 314/390/390 +f 314/390/390 321/398/398 322/399/399 +f 314/390/390 322/399/399 315/391/391 +f 315/391/391 322/399/399 323/400/400 +f 315/391/391 323/400/400 316/392/392 +f 316/392/392 323/400/400 324/401/401 +f 316/392/392 324/401/401 317/393/393 +f 317/393/393 324/401/401 1526/402/402 +f 317/393/393 1526/402/402 1525/394/394 +f 229/297/297 230/299/299 325/403/403 +f 229/297/297 325/403/403 318/395/395 +f 318/395/395 325/403/403 326/404/404 +f 318/395/395 326/404/404 319/396/396 +f 319/396/396 326/404/404 327/405/405 +f 319/396/396 327/405/405 320/397/397 +f 320/397/397 327/405/405 328/406/406 +f 320/397/397 328/406/406 321/398/398 +f 321/398/398 328/406/406 329/407/407 +f 321/398/398 329/407/407 322/399/399 +f 322/399/399 329/407/407 330/408/408 +f 322/399/399 330/408/408 323/400/400 +f 323/400/400 330/408/408 331/409/409 +f 323/400/400 331/409/409 324/401/401 +f 324/401/401 331/409/409 1527/410/410 +f 324/401/401 1527/410/410 1526/402/402 +f 230/299/299 231/301/301 332/411/411 +f 230/299/299 332/411/411 325/403/403 +f 325/403/403 332/411/411 333/412/412 +f 325/403/403 333/412/412 326/404/404 +f 326/404/404 333/412/412 334/413/413 +f 326/404/404 334/413/413 327/405/405 +f 327/405/405 334/413/413 335/414/414 +f 327/405/405 335/414/414 328/406/406 +f 328/406/406 335/414/414 336/415/415 +f 328/406/406 336/415/415 329/407/407 +f 329/407/407 336/415/415 337/416/416 +f 329/407/407 337/416/416 330/408/408 +f 330/408/408 337/416/416 338/417/417 +f 330/408/408 338/417/417 331/409/409 +f 331/409/409 338/417/417 1528/418/418 +f 331/409/409 1528/418/418 1527/410/410 +f 231/301/301 232/303/303 339/419/419 +f 231/301/301 339/419/419 332/411/411 +f 332/411/411 339/419/419 340/420/420 +f 332/411/411 340/420/420 333/412/412 +f 333/412/412 340/420/420 341/421/421 +f 333/412/412 341/421/421 334/413/413 +f 334/413/413 341/421/421 342/422/422 +f 334/413/413 342/422/422 335/414/414 +f 335/414/414 342/422/422 343/423/423 +f 335/414/414 343/423/423 336/415/415 +f 336/415/415 343/423/423 344/424/424 +f 336/415/415 344/424/424 337/416/416 +f 337/416/416 344/424/424 345/425/425 +f 337/416/416 345/425/425 338/417/417 +f 338/417/417 345/425/425 1529/426/426 +f 338/417/417 1529/426/426 1528/418/418 +f 232/303/303 233/305/305 346/427/427 +f 232/303/303 346/427/427 339/419/419 +f 339/419/419 346/427/427 347/428/428 +f 339/419/419 347/428/428 340/420/420 +f 340/420/420 347/428/428 348/429/429 +f 340/420/420 348/429/429 341/421/421 +f 341/421/421 348/429/429 349/430/430 +f 341/421/421 349/430/430 342/422/422 +f 342/422/422 349/430/430 350/431/431 +f 342/422/422 350/431/431 343/423/423 +f 343/423/423 350/431/431 351/432/432 +f 343/423/423 351/432/432 344/424/424 +f 344/424/424 351/432/432 352/433/433 +f 344/424/424 352/433/433 345/425/425 +f 345/425/425 352/433/433 1530/434/434 +f 345/425/425 1530/434/434 1529/426/426 +f 233/305/305 1493/307/307 1494/435/435 +f 233/305/305 1494/435/435 346/427/427 +f 346/427/427 1494/435/435 1495/436/436 +f 346/427/427 1495/436/436 347/428/428 +f 347/428/428 1495/436/436 1496/437/437 +f 347/428/428 1496/437/437 348/429/429 +f 348/429/429 1496/437/437 1497/438/438 +f 348/429/429 1497/438/438 349/430/430 +f 349/430/430 1497/438/438 1498/439/439 +f 349/430/430 1498/439/439 350/431/431 +f 350/431/431 1498/439/439 1499/440/440 +f 350/431/431 1499/440/440 351/432/432 +f 351/432/432 1499/440/440 1500/441/441 +f 351/432/432 1500/441/441 352/433/433 +f 352/433/433 1500/441/441 1538/442/442 +f 352/433/433 1538/442/442 1530/434/434 +f 226/290/290 234/372/372 353/443/443 +f 226/290/290 353/443/443 241/444/444 +f 241/444/444 353/443/443 354/445/445 +f 241/444/444 354/445/445 242/446/446 +f 242/446/446 354/445/445 355/447/447 +f 242/446/446 355/447/447 243/448/448 +f 243/448/448 355/447/447 356/449/449 +f 243/448/448 356/449/449 244/450/450 +f 244/450/450 356/449/449 357/451/451 +f 244/450/450 357/451/451 245/452/452 +f 245/452/452 357/451/451 358/453/453 +f 245/452/452 358/453/453 246/454/454 +f 246/454/454 358/453/453 359/455/455 +f 246/454/454 359/455/455 247/456/456 +f 247/456/456 359/455/455 1509/457/457 +f 247/456/456 1509/457/457 1508/458/458 +f 234/372/372 235/374/374 360/459/459 +f 234/372/372 360/459/459 353/443/443 +f 353/443/443 360/459/459 361/460/460 +f 353/443/443 361/460/460 354/445/445 +f 354/445/445 361/460/460 362/461/461 +f 354/445/445 362/461/461 355/447/447 +f 355/447/447 362/461/461 363/462/462 +f 355/447/447 363/462/462 356/449/449 +f 356/449/449 363/462/462 364/463/463 +f 356/449/449 364/463/463 357/451/451 +f 357/451/451 364/463/463 365/464/464 +f 357/451/451 365/464/464 358/453/453 +f 358/453/453 365/464/464 366/465/465 +f 358/453/453 366/465/465 359/455/455 +f 359/455/455 366/465/465 1510/466/466 +f 359/455/455 1510/466/466 1509/457/457 +f 235/374/374 236/376/376 367/467/467 +f 235/374/374 367/467/467 360/459/459 +f 360/459/459 367/467/467 368/468/468 +f 360/459/459 368/468/468 361/460/460 +f 361/460/460 368/468/468 369/469/469 +f 361/460/460 369/469/469 362/461/461 +f 362/461/461 369/469/469 370/470/470 +f 362/461/461 370/470/470 363/462/462 +f 363/462/462 370/470/470 371/471/471 +f 363/462/462 371/471/471 364/463/463 +f 364/463/463 371/471/471 372/472/472 +f 364/463/463 372/472/472 365/464/464 +f 365/464/464 372/472/472 373/473/473 +f 365/464/464 373/473/473 366/465/465 +f 366/465/465 373/473/473 1511/474/474 +f 366/465/465 1511/474/474 1510/466/466 +f 236/376/376 237/378/378 374/475/475 +f 236/376/376 374/475/475 367/467/467 +f 367/467/467 374/475/475 375/476/476 +f 367/467/467 375/476/476 368/468/468 +f 368/468/468 375/476/476 376/477/477 +f 368/468/468 376/477/477 369/469/469 +f 369/469/469 376/477/477 377/478/478 +f 369/469/469 377/478/478 370/470/470 +f 370/470/470 377/478/478 378/479/479 +f 370/470/470 378/479/479 371/471/471 +f 371/471/471 378/479/479 379/480/480 +f 371/471/471 379/480/480 372/472/472 +f 372/472/472 379/480/480 380/481/481 +f 372/472/472 380/481/481 373/473/473 +f 373/473/473 380/481/481 1512/482/482 +f 373/473/473 1512/482/482 1511/474/474 +f 237/378/378 238/380/380 381/483/483 +f 237/378/378 381/483/483 374/475/475 +f 374/475/475 381/483/483 382/484/484 +f 374/475/475 382/484/484 375/476/476 +f 375/476/476 382/484/484 383/485/485 +f 375/476/476 383/485/485 376/477/477 +f 376/477/477 383/485/485 384/486/486 +f 376/477/477 384/486/486 377/478/478 +f 377/478/478 384/486/486 385/487/487 +f 377/478/478 385/487/487 378/479/479 +f 378/479/479 385/487/487 386/488/488 +f 378/479/479 386/488/488 379/480/480 +f 379/480/480 386/488/488 387/489/489 +f 379/480/480 387/489/489 380/481/481 +f 380/481/481 387/489/489 1513/490/490 +f 380/481/481 1513/490/490 1512/482/482 +f 238/380/380 239/382/382 388/491/491 +f 238/380/380 388/491/491 381/483/483 +f 381/483/483 388/491/491 389/492/492 +f 381/483/483 389/492/492 382/484/484 +f 382/484/484 389/492/492 390/493/493 +f 382/484/484 390/493/493 383/485/485 +f 383/485/485 390/493/493 391/494/494 +f 383/485/485 391/494/494 384/486/486 +f 384/486/486 391/494/494 392/495/495 +f 384/486/486 392/495/495 385/487/487 +f 385/487/487 392/495/495 393/496/496 +f 385/487/487 393/496/496 386/488/488 +f 386/488/488 393/496/496 394/497/497 +f 386/488/488 394/497/497 387/489/489 +f 387/489/489 394/497/497 1514/498/498 +f 387/489/489 1514/498/498 1513/490/490 +f 239/382/382 240/384/384 395/499/499 +f 239/382/382 395/499/499 388/491/491 +f 388/491/491 395/499/499 396/500/500 +f 388/491/491 396/500/500 389/492/492 +f 389/492/492 396/500/500 397/501/501 +f 389/492/492 397/501/501 390/493/493 +f 390/493/493 397/501/501 398/502/502 +f 390/493/493 398/502/502 391/494/494 +f 391/494/494 398/502/502 399/503/503 +f 391/494/494 399/503/503 392/495/495 +f 392/495/495 399/503/503 400/504/504 +f 392/495/495 400/504/504 393/496/496 +f 393/496/496 400/504/504 401/505/505 +f 393/496/496 401/505/505 394/497/497 +f 394/497/497 401/505/505 1515/506/506 +f 394/497/497 1515/506/506 1514/498/498 +f 240/384/384 1523/386/386 1522/507/507 +f 240/384/384 1522/507/507 395/499/499 +f 395/499/499 1522/507/507 1521/508/508 +f 395/499/499 1521/508/508 396/500/500 +f 396/500/500 1521/508/508 1520/509/509 +f 396/500/500 1520/509/509 397/501/501 +f 397/501/501 1520/509/509 1519/510/510 +f 397/501/501 1519/510/510 398/502/502 +f 398/502/502 1519/510/510 1518/511/511 +f 398/502/502 1518/511/511 399/503/503 +f 399/503/503 1518/511/511 1517/512/512 +f 399/503/503 1517/512/512 400/504/504 +f 400/504/504 1517/512/512 1516/513/513 +f 400/504/504 1516/513/513 401/505/505 +f 401/505/505 1516/513/513 1537/153/514 +f 401/505/505 1537/153/514 1515/506/506 +f 226/290/290 241/444/444 402/514/515 +f 226/290/290 402/514/515 248/291/291 +f 248/291/291 402/514/515 403/515/516 +f 248/291/291 403/515/516 249/308/308 +f 249/308/308 403/515/516 404/516/517 +f 249/308/308 404/516/517 250/317/317 +f 250/317/317 404/516/517 405/517/518 +f 250/317/317 405/517/518 251/326/326 +f 251/326/326 405/517/518 406/518/519 +f 251/326/326 406/518/519 252/335/335 +f 252/335/335 406/518/519 407/519/520 +f 252/335/335 407/519/520 253/344/344 +f 253/344/344 407/519/520 408/520/521 +f 253/344/344 408/520/521 254/353/353 +f 254/353/353 408/520/521 1479/521/522 +f 254/353/353 1479/521/522 1478/362/362 +f 241/444/444 242/446/446 409/522/523 +f 241/444/444 409/522/523 402/514/515 +f 402/514/515 409/522/523 410/523/524 +f 402/514/515 410/523/524 403/515/516 +f 403/515/516 410/523/524 411/524/525 +f 403/515/516 411/524/525 404/516/517 +f 404/516/517 411/524/525 412/525/526 +f 404/516/517 412/525/526 405/517/518 +f 405/517/518 412/525/526 413/526/527 +f 405/517/518 413/526/527 406/518/519 +f 406/518/519 413/526/527 414/527/528 +f 406/518/519 414/527/528 407/519/520 +f 407/519/520 414/527/528 415/528/529 +f 407/519/520 415/528/529 408/520/521 +f 408/520/521 415/528/529 1480/529/530 +f 408/520/521 1480/529/530 1479/521/522 +f 242/446/446 243/448/448 416/530/531 +f 242/446/446 416/530/531 409/522/523 +f 409/522/523 416/530/531 417/531/532 +f 409/522/523 417/531/532 410/523/524 +f 410/523/524 417/531/532 418/532/533 +f 410/523/524 418/532/533 411/524/525 +f 411/524/525 418/532/533 419/533/534 +f 411/524/525 419/533/534 412/525/526 +f 412/525/526 419/533/534 420/534/535 +f 412/525/526 420/534/535 413/526/527 +f 413/526/527 420/534/535 421/535/536 +f 413/526/527 421/535/536 414/527/528 +f 414/527/528 421/535/536 422/536/537 +f 414/527/528 422/536/537 415/528/529 +f 415/528/529 422/536/537 1481/537/538 +f 415/528/529 1481/537/538 1480/529/530 +f 243/448/448 244/450/450 423/538/539 +f 243/448/448 423/538/539 416/530/531 +f 416/530/531 423/538/539 424/539/540 +f 416/530/531 424/539/540 417/531/532 +f 417/531/532 424/539/540 425/540/541 +f 417/531/532 425/540/541 418/532/533 +f 418/532/533 425/540/541 426/541/542 +f 418/532/533 426/541/542 419/533/534 +f 419/533/534 426/541/542 427/542/543 +f 419/533/534 427/542/543 420/534/535 +f 420/534/535 427/542/543 428/543/544 +f 420/534/535 428/543/544 421/535/536 +f 421/535/536 428/543/544 429/544/545 +f 421/535/536 429/544/545 422/536/537 +f 422/536/537 429/544/545 1482/545/546 +f 422/536/537 1482/545/546 1481/537/538 +f 244/450/450 245/452/452 430/546/547 +f 244/450/450 430/546/547 423/538/539 +f 423/538/539 430/546/547 431/547/548 +f 423/538/539 431/547/548 424/539/540 +f 424/539/540 431/547/548 432/548/549 +f 424/539/540 432/548/549 425/540/541 +f 425/540/541 432/548/549 433/549/550 +f 425/540/541 433/549/550 426/541/542 +f 426/541/542 433/549/550 434/550/551 +f 426/541/542 434/550/551 427/542/543 +f 427/542/543 434/550/551 435/551/552 +f 427/542/543 435/551/552 428/543/544 +f 428/543/544 435/551/552 436/552/553 +f 428/543/544 436/552/553 429/544/545 +f 429/544/545 436/552/553 1483/553/554 +f 429/544/545 1483/553/554 1482/545/546 +f 245/452/452 246/454/454 437/554/555 +f 245/452/452 437/554/555 430/546/547 +f 430/546/547 437/554/555 438/555/556 +f 430/546/547 438/555/556 431/547/548 +f 431/547/548 438/555/556 439/556/557 +f 431/547/548 439/556/557 432/548/549 +f 432/548/549 439/556/557 440/557/558 +f 432/548/549 440/557/558 433/549/550 +f 433/549/550 440/557/558 441/558/559 +f 433/549/550 441/558/559 434/550/551 +f 434/550/551 441/558/559 442/559/560 +f 434/550/551 442/559/560 435/551/552 +f 435/551/552 442/559/560 443/560/561 +f 435/551/552 443/560/561 436/552/553 +f 436/552/553 443/560/561 1484/561/562 +f 436/552/553 1484/561/562 1483/553/554 +f 246/454/454 247/456/456 444/562/563 +f 246/454/454 444/562/563 437/554/555 +f 437/554/555 444/562/563 445/563/564 +f 437/554/555 445/563/564 438/555/556 +f 438/555/556 445/563/564 446/564/565 +f 438/555/556 446/564/565 439/556/557 +f 439/556/557 446/564/565 447/565/566 +f 439/556/557 447/565/566 440/557/558 +f 440/557/558 447/565/566 448/566/567 +f 440/557/558 448/566/567 441/558/559 +f 441/558/559 448/566/567 449/567/568 +f 441/558/559 449/567/568 442/559/560 +f 442/559/560 449/567/568 450/568/569 +f 442/559/560 450/568/569 443/560/561 +f 443/560/561 450/568/569 1485/569/570 +f 443/560/561 1485/569/570 1484/561/562 +f 247/456/456 1508/458/458 1507/570/571 +f 247/456/456 1507/570/571 444/562/563 +f 444/562/563 1507/570/571 1506/571/572 +f 444/562/563 1506/571/572 445/563/564 +f 445/563/564 1506/571/572 1505/572/573 +f 445/563/564 1505/572/573 446/564/565 +f 446/564/565 1505/572/573 1504/573/574 +f 446/564/565 1504/573/574 447/565/566 +f 447/565/566 1504/573/574 1503/574/575 +f 447/565/566 1503/574/575 448/566/567 +f 448/566/567 1503/574/575 1502/575/576 +f 448/566/567 1502/575/576 449/567/568 +f 449/567/568 1502/575/576 1501/576/577 +f 449/567/568 1501/576/577 450/568/569 +f 450/568/569 1501/576/577 1536/577/578 +f 450/568/569 1536/577/578 1485/569/570 +f 451/578/579 473/579/580 480/580/581 +f 451/578/579 480/580/581 452/581/582 +f 452/581/582 480/580/581 481/582/583 +f 452/581/582 481/582/583 453/583/584 +f 453/583/584 481/582/583 482/584/585 +f 453/583/584 482/584/585 454/585/586 +f 454/585/586 482/584/585 483/586/587 +f 454/585/586 483/586/587 455/587/588 +f 455/587/588 483/586/587 484/588/589 +f 455/587/588 484/588/589 456/589/590 +f 456/589/590 484/588/589 485/590/591 +f 456/589/590 485/590/591 457/591/592 +f 457/591/592 485/590/591 486/592/593 +f 457/591/592 486/592/593 458/593/594 +f 458/593/594 486/592/593 1387/594/595 +f 458/593/594 1387/594/595 1388/595/596 +f 473/579/580 474/596/597 487/597/598 +f 473/579/580 487/597/598 480/580/581 +f 480/580/581 487/597/598 488/598/599 +f 480/580/581 488/598/599 481/582/583 +f 481/582/583 488/598/599 489/599/600 +f 481/582/583 489/599/600 482/584/585 +f 482/584/585 489/599/600 490/600/601 +f 482/584/585 490/600/601 483/586/587 +f 483/586/587 490/600/601 491/601/602 +f 483/586/587 491/601/602 484/588/589 +f 484/588/589 491/601/602 492/602/603 +f 484/588/589 492/602/603 485/590/591 +f 485/590/591 492/602/603 493/603/604 +f 485/590/591 493/603/604 486/592/593 +f 486/592/593 493/603/604 1386/604/605 +f 486/592/593 1386/604/605 1387/594/595 +f 474/596/597 475/605/606 494/606/607 +f 474/596/597 494/606/607 487/597/598 +f 487/597/598 494/606/607 495/607/608 +f 487/597/598 495/607/608 488/598/599 +f 488/598/599 495/607/608 496/608/609 +f 488/598/599 496/608/609 489/599/600 +f 489/599/600 496/608/609 497/609/610 +f 489/599/600 497/609/610 490/600/601 +f 490/600/601 497/609/610 498/610/611 +f 490/600/601 498/610/611 491/601/602 +f 491/601/602 498/610/611 499/611/612 +f 491/601/602 499/611/612 492/602/603 +f 492/602/603 499/611/612 500/612/613 +f 492/602/603 500/612/613 493/603/604 +f 493/603/604 500/612/613 1385/613/614 +f 493/603/604 1385/613/614 1386/604/605 +f 475/605/606 476/614/615 501/615/616 +f 475/605/606 501/615/616 494/606/607 +f 494/606/607 501/615/616 502/616/617 +f 494/606/607 502/616/617 495/607/608 +f 495/607/608 502/616/617 503/617/618 +f 495/607/608 503/617/618 496/608/609 +f 496/608/609 503/617/618 504/618/619 +f 496/608/609 504/618/619 497/609/610 +f 497/609/610 504/618/619 505/619/620 +f 497/609/610 505/619/620 498/610/611 +f 498/610/611 505/619/620 506/620/621 +f 498/610/611 506/620/621 499/611/612 +f 499/611/612 506/620/621 507/621/622 +f 499/611/612 507/621/622 500/612/613 +f 500/612/613 507/621/622 1384/622/623 +f 500/612/613 1384/622/623 1385/613/614 +f 476/614/615 477/623/624 508/624/625 +f 476/614/615 508/624/625 501/615/616 +f 501/615/616 508/624/625 509/625/626 +f 501/615/616 509/625/626 502/616/617 +f 502/616/617 509/625/626 510/626/627 +f 502/616/617 510/626/627 503/617/618 +f 503/617/618 510/626/627 511/627/628 +f 503/617/618 511/627/628 504/618/619 +f 504/618/619 511/627/628 512/628/629 +f 504/618/619 512/628/629 505/619/620 +f 505/619/620 512/628/629 513/629/630 +f 505/619/620 513/629/630 506/620/621 +f 506/620/621 513/629/630 514/630/631 +f 506/620/621 514/630/631 507/621/622 +f 507/621/622 514/630/631 1383/631/632 +f 507/621/622 1383/631/632 1384/622/623 +f 477/623/624 478/632/633 515/633/634 +f 477/623/624 515/633/634 508/624/625 +f 508/624/625 515/633/634 516/634/635 +f 508/624/625 516/634/635 509/625/626 +f 509/625/626 516/634/635 517/635/636 +f 509/625/626 517/635/636 510/626/627 +f 510/626/627 517/635/636 518/636/637 +f 510/626/627 518/636/637 511/627/628 +f 511/627/628 518/636/637 519/637/638 +f 511/627/628 519/637/638 512/628/629 +f 512/628/629 519/637/638 520/638/639 +f 512/628/629 520/638/639 513/629/630 +f 513/629/630 520/638/639 521/639/640 +f 513/629/630 521/639/640 514/630/631 +f 514/630/631 521/639/640 1382/640/641 +f 514/630/631 1382/640/641 1383/631/632 +f 478/632/633 479/641/642 522/642/643 +f 478/632/633 522/642/643 515/633/634 +f 515/633/634 522/642/643 523/643/644 +f 515/633/634 523/643/644 516/634/635 +f 516/634/635 523/643/644 524/644/645 +f 516/634/635 524/644/645 517/635/636 +f 517/635/636 524/644/645 525/645/646 +f 517/635/636 525/645/646 518/636/637 +f 518/636/637 525/645/646 526/646/647 +f 518/636/637 526/646/647 519/637/638 +f 519/637/638 526/646/647 527/647/648 +f 519/637/638 527/647/648 520/638/639 +f 520/638/639 527/647/648 528/648/649 +f 520/638/639 528/648/649 521/639/640 +f 521/639/640 528/648/649 1381/649/650 +f 521/639/640 1381/649/650 1382/640/641 +f 479/641/642 1358/650/18 1357/651/17 +f 479/641/642 1357/651/17 522/642/643 +f 522/642/643 1357/651/17 1356/652/27 +f 522/642/643 1356/652/27 523/643/644 +f 523/643/644 1356/652/27 1355/653/36 +f 523/643/644 1355/653/36 524/644/645 +f 524/644/645 1355/653/36 1354/654/45 +f 524/644/645 1354/654/45 525/645/646 +f 525/645/646 1354/654/45 1353/655/54 +f 525/645/646 1353/655/54 526/646/647 +f 526/646/647 1353/655/54 1352/656/63 +f 526/646/647 1352/656/63 527/647/648 +f 527/647/648 1352/656/63 1351/657/72 +f 527/647/648 1351/657/72 528/648/649 +f 528/648/649 1351/657/72 1531/658/81 +f 528/648/649 1531/658/81 1381/649/650 +f 451/578/579 452/581/582 529/659/651 +f 451/578/579 529/659/651 459/660/652 +f 459/660/652 529/659/651 530/661/653 +f 459/660/652 530/661/653 460/662/654 +f 460/662/654 530/661/653 531/663/655 +f 460/662/654 531/663/655 461/664/656 +f 461/664/656 531/663/655 532/665/657 +f 461/664/656 532/665/657 462/666/658 +f 462/666/658 532/665/657 533/667/659 +f 462/666/658 533/667/659 463/668/660 +f 463/668/660 533/667/659 534/669/661 +f 463/668/660 534/669/661 464/670/662 +f 464/670/662 534/669/661 535/671/663 +f 464/670/662 535/671/663 465/672/664 +f 465/672/664 535/671/663 1477/673/363 +f 465/672/664 1477/673/363 1478/674/362 +f 452/581/582 453/583/584 536/675/665 +f 452/581/582 536/675/665 529/659/651 +f 529/659/651 536/675/665 537/676/666 +f 529/659/651 537/676/666 530/661/653 +f 530/661/653 537/676/666 538/677/667 +f 530/661/653 538/677/667 531/663/655 +f 531/663/655 538/677/667 539/678/668 +f 531/663/655 539/678/668 532/665/657 +f 532/665/657 539/678/668 540/679/669 +f 532/665/657 540/679/669 533/667/659 +f 533/667/659 540/679/669 541/680/670 +f 533/667/659 541/680/670 534/669/661 +f 534/669/661 541/680/670 542/681/671 +f 534/669/661 542/681/671 535/671/663 +f 535/671/663 542/681/671 1476/682/364 +f 535/671/663 1476/682/364 1477/673/363 +f 453/583/584 454/585/586 543/683/672 +f 453/583/584 543/683/672 536/675/665 +f 536/675/665 543/683/672 544/684/673 +f 536/675/665 544/684/673 537/676/666 +f 537/676/666 544/684/673 545/685/674 +f 537/676/666 545/685/674 538/677/667 +f 538/677/667 545/685/674 546/686/675 +f 538/677/667 546/686/675 539/678/668 +f 539/678/668 546/686/675 547/687/676 +f 539/678/668 547/687/676 540/679/669 +f 540/679/669 547/687/676 548/688/677 +f 540/679/669 548/688/677 541/680/670 +f 541/680/670 548/688/677 549/689/678 +f 541/680/670 549/689/678 542/681/671 +f 542/681/671 549/689/678 1475/690/365 +f 542/681/671 1475/690/365 1476/682/364 +f 454/585/586 455/587/588 550/691/679 +f 454/585/586 550/691/679 543/683/672 +f 543/683/672 550/691/679 551/692/680 +f 543/683/672 551/692/680 544/684/673 +f 544/684/673 551/692/680 552/693/681 +f 544/684/673 552/693/681 545/685/674 +f 545/685/674 552/693/681 553/694/682 +f 545/685/674 553/694/682 546/686/675 +f 546/686/675 553/694/682 554/695/683 +f 546/686/675 554/695/683 547/687/676 +f 547/687/676 554/695/683 555/696/684 +f 547/687/676 555/696/684 548/688/677 +f 548/688/677 555/696/684 556/697/685 +f 548/688/677 556/697/685 549/689/678 +f 549/689/678 556/697/685 1474/698/366 +f 549/689/678 1474/698/366 1475/690/365 +f 455/587/588 456/589/590 557/699/686 +f 455/587/588 557/699/686 550/691/679 +f 550/691/679 557/699/686 558/700/687 +f 550/691/679 558/700/687 551/692/680 +f 551/692/680 558/700/687 559/701/688 +f 551/692/680 559/701/688 552/693/681 +f 552/693/681 559/701/688 560/702/689 +f 552/693/681 560/702/689 553/694/682 +f 553/694/682 560/702/689 561/703/690 +f 553/694/682 561/703/690 554/695/683 +f 554/695/683 561/703/690 562/704/691 +f 554/695/683 562/704/691 555/696/684 +f 555/696/684 562/704/691 563/705/692 +f 555/696/684 563/705/692 556/697/685 +f 556/697/685 563/705/692 1473/706/367 +f 556/697/685 1473/706/367 1474/698/366 +f 456/589/590 457/591/592 564/707/693 +f 456/589/590 564/707/693 557/699/686 +f 557/699/686 564/707/693 565/708/694 +f 557/699/686 565/708/694 558/700/687 +f 558/700/687 565/708/694 566/709/695 +f 558/700/687 566/709/695 559/701/688 +f 559/701/688 566/709/695 567/710/696 +f 559/701/688 567/710/696 560/702/689 +f 560/702/689 567/710/696 568/711/697 +f 560/702/689 568/711/697 561/703/690 +f 561/703/690 568/711/697 569/712/698 +f 561/703/690 569/712/698 562/704/691 +f 562/704/691 569/712/698 570/713/699 +f 562/704/691 570/713/699 563/705/692 +f 563/705/692 570/713/699 1472/714/368 +f 563/705/692 1472/714/368 1473/706/367 +f 457/591/592 458/593/594 571/715/700 +f 457/591/592 571/715/700 564/707/693 +f 564/707/693 571/715/700 572/716/701 +f 564/707/693 572/716/701 565/708/694 +f 565/708/694 572/716/701 573/717/702 +f 565/708/694 573/717/702 566/709/695 +f 566/709/695 573/717/702 574/718/703 +f 566/709/695 574/718/703 567/710/696 +f 567/710/696 574/718/703 575/719/704 +f 567/710/696 575/719/704 568/711/697 +f 568/711/697 575/719/704 576/720/705 +f 568/711/697 576/720/705 569/712/698 +f 569/712/698 576/720/705 577/721/706 +f 569/712/698 577/721/706 570/713/699 +f 570/713/699 577/721/706 1471/722/369 +f 570/713/699 1471/722/369 1472/714/368 +f 458/593/594 1388/595/596 1389/723/707 +f 458/593/594 1389/723/707 571/715/700 +f 571/715/700 1389/723/707 1390/724/708 +f 571/715/700 1390/724/708 572/716/701 +f 572/716/701 1390/724/708 1391/725/709 +f 572/716/701 1391/725/709 573/717/702 +f 573/717/702 1391/725/709 1392/726/710 +f 573/717/702 1392/726/710 574/718/703 +f 574/718/703 1392/726/710 1393/727/711 +f 574/718/703 1393/727/711 575/719/704 +f 575/719/704 1393/727/711 1394/728/712 +f 575/719/704 1394/728/712 576/720/705 +f 576/720/705 1394/728/712 1395/729/713 +f 576/720/705 1395/729/713 577/721/706 +f 577/721/706 1395/729/713 1535/730/370 +f 577/721/706 1535/730/370 1471/722/369 +f 451/578/579 459/660/652 578/731/714 +f 451/578/579 578/731/714 466/732/715 +f 466/732/715 578/731/714 579/733/716 +f 466/732/715 579/733/716 467/734/717 +f 467/734/717 579/733/716 580/735/718 +f 467/734/717 580/735/718 468/736/719 +f 468/736/719 580/735/718 581/737/720 +f 468/736/719 581/737/720 469/738/721 +f 469/738/721 581/737/720 582/739/722 +f 469/738/721 582/739/722 470/740/723 +f 470/740/723 582/739/722 583/741/724 +f 470/740/723 583/741/724 471/742/725 +f 471/742/725 583/741/724 584/743/726 +f 471/742/725 584/743/726 472/744/727 +f 472/744/727 584/743/726 1419/745/728 +f 472/744/727 1419/745/728 1418/746/729 +f 459/660/652 460/662/654 585/747/730 +f 459/660/652 585/747/730 578/731/714 +f 578/731/714 585/747/730 586/748/731 +f 578/731/714 586/748/731 579/733/716 +f 579/733/716 586/748/731 587/749/732 +f 579/733/716 587/749/732 580/735/718 +f 580/735/718 587/749/732 588/750/733 +f 580/735/718 588/750/733 581/737/720 +f 581/737/720 588/750/733 589/751/734 +f 581/737/720 589/751/734 582/739/722 +f 582/739/722 589/751/734 590/752/735 +f 582/739/722 590/752/735 583/741/724 +f 583/741/724 590/752/735 591/753/736 +f 583/741/724 591/753/736 584/743/726 +f 584/743/726 591/753/736 1420/754/737 +f 584/743/726 1420/754/737 1419/745/728 +f 460/662/654 461/664/656 592/755/738 +f 460/662/654 592/755/738 585/747/730 +f 585/747/730 592/755/738 593/756/739 +f 585/747/730 593/756/739 586/748/731 +f 586/748/731 593/756/739 594/757/740 +f 586/748/731 594/757/740 587/749/732 +f 587/749/732 594/757/740 595/758/741 +f 587/749/732 595/758/741 588/750/733 +f 588/750/733 595/758/741 596/759/742 +f 588/750/733 596/759/742 589/751/734 +f 589/751/734 596/759/742 597/760/743 +f 589/751/734 597/760/743 590/752/735 +f 590/752/735 597/760/743 598/761/744 +f 590/752/735 598/761/744 591/753/736 +f 591/753/736 598/761/744 1421/762/745 +f 591/753/736 1421/762/745 1420/754/737 +f 461/664/656 462/666/658 599/763/746 +f 461/664/656 599/763/746 592/755/738 +f 592/755/738 599/763/746 600/764/747 +f 592/755/738 600/764/747 593/756/739 +f 593/756/739 600/764/747 601/765/748 +f 593/756/739 601/765/748 594/757/740 +f 594/757/740 601/765/748 602/766/749 +f 594/757/740 602/766/749 595/758/741 +f 595/758/741 602/766/749 603/767/750 +f 595/758/741 603/767/750 596/759/742 +f 596/759/742 603/767/750 604/768/751 +f 596/759/742 604/768/751 597/760/743 +f 597/760/743 604/768/751 605/769/752 +f 597/760/743 605/769/752 598/761/744 +f 598/761/744 605/769/752 1422/770/753 +f 598/761/744 1422/770/753 1421/762/745 +f 462/666/658 463/668/660 606/771/754 +f 462/666/658 606/771/754 599/763/746 +f 599/763/746 606/771/754 607/772/755 +f 599/763/746 607/772/755 600/764/747 +f 600/764/747 607/772/755 608/773/756 +f 600/764/747 608/773/756 601/765/748 +f 601/765/748 608/773/756 609/774/757 +f 601/765/748 609/774/757 602/766/749 +f 602/766/749 609/774/757 610/775/758 +f 602/766/749 610/775/758 603/767/750 +f 603/767/750 610/775/758 611/776/759 +f 603/767/750 611/776/759 604/768/751 +f 604/768/751 611/776/759 612/777/760 +f 604/768/751 612/777/760 605/769/752 +f 605/769/752 612/777/760 1423/778/761 +f 605/769/752 1423/778/761 1422/770/753 +f 463/668/660 464/670/662 613/779/762 +f 463/668/660 613/779/762 606/771/754 +f 606/771/754 613/779/762 614/780/763 +f 606/771/754 614/780/763 607/772/755 +f 607/772/755 614/780/763 615/781/764 +f 607/772/755 615/781/764 608/773/756 +f 608/773/756 615/781/764 616/782/765 +f 608/773/756 616/782/765 609/774/757 +f 609/774/757 616/782/765 617/783/766 +f 609/774/757 617/783/766 610/775/758 +f 610/775/758 617/783/766 618/784/767 +f 610/775/758 618/784/767 611/776/759 +f 611/776/759 618/784/767 619/785/768 +f 611/776/759 619/785/768 612/777/760 +f 612/777/760 619/785/768 1424/786/769 +f 612/777/760 1424/786/769 1423/778/761 +f 464/670/662 465/672/664 620/787/770 +f 464/670/662 620/787/770 613/779/762 +f 613/779/762 620/787/770 621/788/771 +f 613/779/762 621/788/771 614/780/763 +f 614/780/763 621/788/771 622/789/772 +f 614/780/763 622/789/772 615/781/764 +f 615/781/764 622/789/772 623/790/773 +f 615/781/764 623/790/773 616/782/765 +f 616/782/765 623/790/773 624/791/774 +f 616/782/765 624/791/774 617/783/766 +f 617/783/766 624/791/774 625/792/775 +f 617/783/766 625/792/775 618/784/767 +f 618/784/767 625/792/775 626/793/776 +f 618/784/767 626/793/776 619/785/768 +f 619/785/768 626/793/776 1425/794/777 +f 619/785/768 1425/794/777 1424/786/769 +f 465/672/664 1478/674/362 1479/795/522 +f 465/672/664 1479/795/522 620/787/770 +f 620/787/770 1479/795/522 1480/796/530 +f 620/787/770 1480/796/530 621/788/771 +f 621/788/771 1480/796/530 1481/797/538 +f 621/788/771 1481/797/538 622/789/772 +f 622/789/772 1481/797/538 1482/798/546 +f 622/789/772 1482/798/546 623/790/773 +f 623/790/773 1482/798/546 1483/799/554 +f 623/790/773 1483/799/554 624/791/774 +f 624/791/774 1483/799/554 1484/800/562 +f 624/791/774 1484/800/562 625/792/775 +f 625/792/775 1484/800/562 1485/801/570 +f 625/792/775 1485/801/570 626/793/776 +f 626/793/776 1485/801/570 1536/577/578 +f 626/793/776 1536/577/578 1425/794/777 +f 451/578/579 466/732/715 627/802/778 +f 451/578/579 627/802/778 473/579/580 +f 473/579/580 627/802/778 628/803/779 +f 473/579/580 628/803/779 474/596/597 +f 474/596/597 628/803/779 629/804/780 +f 474/596/597 629/804/780 475/605/606 +f 475/605/606 629/804/780 630/805/781 +f 475/605/606 630/805/781 476/614/615 +f 476/614/615 630/805/781 631/806/782 +f 476/614/615 631/806/782 477/623/624 +f 477/623/624 631/806/782 632/807/783 +f 477/623/624 632/807/783 478/632/633 +f 478/632/633 632/807/783 633/808/784 +f 478/632/633 633/808/784 479/641/642 +f 479/641/642 633/808/784 1359/809/146 +f 479/641/642 1359/809/146 1358/650/18 +f 466/732/715 467/734/717 634/810/785 +f 466/732/715 634/810/785 627/802/778 +f 627/802/778 634/810/785 635/811/786 +f 627/802/778 635/811/786 628/803/779 +f 628/803/779 635/811/786 636/812/787 +f 628/803/779 636/812/787 629/804/780 +f 629/804/780 636/812/787 637/813/788 +f 629/804/780 637/813/788 630/805/781 +f 630/805/781 637/813/788 638/814/789 +f 630/805/781 638/814/789 631/806/782 +f 631/806/782 638/814/789 639/815/790 +f 631/806/782 639/815/790 632/807/783 +f 632/807/783 639/815/790 640/816/791 +f 632/807/783 640/816/791 633/808/784 +f 633/808/784 640/816/791 1360/817/147 +f 633/808/784 1360/817/147 1359/809/146 +f 467/734/717 468/736/719 641/818/792 +f 467/734/717 641/818/792 634/810/785 +f 634/810/785 641/818/792 642/819/793 +f 634/810/785 642/819/793 635/811/786 +f 635/811/786 642/819/793 643/820/794 +f 635/811/786 643/820/794 636/812/787 +f 636/812/787 643/820/794 644/821/795 +f 636/812/787 644/821/795 637/813/788 +f 637/813/788 644/821/795 645/822/796 +f 637/813/788 645/822/796 638/814/789 +f 638/814/789 645/822/796 646/823/797 +f 638/814/789 646/823/797 639/815/790 +f 639/815/790 646/823/797 647/824/798 +f 639/815/790 647/824/798 640/816/791 +f 640/816/791 647/824/798 1361/825/148 +f 640/816/791 1361/825/148 1360/817/147 +f 468/736/719 469/738/721 648/826/799 +f 468/736/719 648/826/799 641/818/792 +f 641/818/792 648/826/799 649/827/800 +f 641/818/792 649/827/800 642/819/793 +f 642/819/793 649/827/800 650/828/801 +f 642/819/793 650/828/801 643/820/794 +f 643/820/794 650/828/801 651/829/802 +f 643/820/794 651/829/802 644/821/795 +f 644/821/795 651/829/802 652/830/803 +f 644/821/795 652/830/803 645/822/796 +f 645/822/796 652/830/803 653/831/804 +f 645/822/796 653/831/804 646/823/797 +f 646/823/797 653/831/804 654/832/805 +f 646/823/797 654/832/805 647/824/798 +f 647/824/798 654/832/805 1362/833/149 +f 647/824/798 1362/833/149 1361/825/148 +f 469/738/721 470/740/723 655/834/806 +f 469/738/721 655/834/806 648/826/799 +f 648/826/799 655/834/806 656/835/807 +f 648/826/799 656/835/807 649/827/800 +f 649/827/800 656/835/807 657/836/808 +f 649/827/800 657/836/808 650/828/801 +f 650/828/801 657/836/808 658/837/809 +f 650/828/801 658/837/809 651/829/802 +f 651/829/802 658/837/809 659/838/810 +f 651/829/802 659/838/810 652/830/803 +f 652/830/803 659/838/810 660/839/811 +f 652/830/803 660/839/811 653/831/804 +f 653/831/804 660/839/811 661/840/812 +f 653/831/804 661/840/812 654/832/805 +f 654/832/805 661/840/812 1363/841/150 +f 654/832/805 1363/841/150 1362/833/149 +f 470/740/723 471/742/725 662/842/813 +f 470/740/723 662/842/813 655/834/806 +f 655/834/806 662/842/813 663/843/814 +f 655/834/806 663/843/814 656/835/807 +f 656/835/807 663/843/814 664/844/815 +f 656/835/807 664/844/815 657/836/808 +f 657/836/808 664/844/815 665/845/816 +f 657/836/808 665/845/816 658/837/809 +f 658/837/809 665/845/816 666/846/817 +f 658/837/809 666/846/817 659/838/810 +f 659/838/810 666/846/817 667/847/818 +f 659/838/810 667/847/818 660/839/811 +f 660/839/811 667/847/818 668/848/819 +f 660/839/811 668/848/819 661/840/812 +f 661/840/812 668/848/819 1364/849/151 +f 661/840/812 1364/849/151 1363/841/150 +f 471/742/725 472/744/727 669/850/820 +f 471/742/725 669/850/820 662/842/813 +f 662/842/813 669/850/820 670/851/821 +f 662/842/813 670/851/821 663/843/814 +f 663/843/814 670/851/821 671/852/822 +f 663/843/814 671/852/822 664/844/815 +f 664/844/815 671/852/822 672/853/823 +f 664/844/815 672/853/823 665/845/816 +f 665/845/816 672/853/823 673/854/824 +f 665/845/816 673/854/824 666/846/817 +f 666/846/817 673/854/824 674/855/825 +f 666/846/817 674/855/825 667/847/818 +f 667/847/818 674/855/825 675/856/826 +f 667/847/818 675/856/826 668/848/819 +f 668/848/819 675/856/826 1365/857/152 +f 668/848/819 1365/857/152 1364/849/151 +f 472/744/727 1418/746/729 1417/858/827 +f 472/744/727 1417/858/827 669/850/820 +f 669/850/820 1417/858/827 1416/859/828 +f 669/850/820 1416/859/828 670/851/821 +f 670/851/821 1416/859/828 1415/860/829 +f 670/851/821 1415/860/829 671/852/822 +f 671/852/822 1415/860/829 1414/861/830 +f 671/852/822 1414/861/830 672/853/823 +f 672/853/823 1414/861/830 1413/862/831 +f 672/853/823 1413/862/831 673/854/824 +f 673/854/824 1413/862/831 1412/863/832 +f 673/854/824 1412/863/832 674/855/825 +f 674/855/825 1412/863/832 1411/864/833 +f 674/855/825 1411/864/833 675/856/826 +f 675/856/826 1411/864/833 1532/865/153 +f 675/856/826 1532/865/153 1365/857/152 +f 676/866/834 698/867/835 705/868/836 +f 676/866/834 705/868/836 677/869/837 +f 677/869/837 705/868/836 706/870/838 +f 677/869/837 706/870/838 678/871/839 +f 678/871/839 706/870/838 707/872/840 +f 678/871/839 707/872/840 679/873/841 +f 679/873/841 707/872/840 708/874/842 +f 679/873/841 708/874/842 680/875/843 +f 680/875/843 708/874/842 709/876/844 +f 680/875/843 709/876/844 681/877/845 +f 681/877/845 709/876/844 710/878/846 +f 681/877/845 710/878/846 682/879/847 +f 682/879/847 710/878/846 711/880/848 +f 682/879/847 711/880/848 683/881/849 +f 683/881/849 711/880/848 1417/882/827 +f 683/881/849 1417/882/827 1418/883/729 +f 698/867/835 699/884/850 712/885/851 +f 698/867/835 712/885/851 705/868/836 +f 705/868/836 712/885/851 713/886/852 +f 705/868/836 713/886/852 706/870/838 +f 706/870/838 713/886/852 714/887/853 +f 706/870/838 714/887/853 707/872/840 +f 707/872/840 714/887/853 715/888/854 +f 707/872/840 715/888/854 708/874/842 +f 708/874/842 715/888/854 716/889/855 +f 708/874/842 716/889/855 709/876/844 +f 709/876/844 716/889/855 717/890/856 +f 709/876/844 717/890/856 710/878/846 +f 710/878/846 717/890/856 718/891/857 +f 710/878/846 718/891/857 711/880/848 +f 711/880/848 718/891/857 1416/892/828 +f 711/880/848 1416/892/828 1417/882/827 +f 699/884/850 700/893/858 719/894/859 +f 699/884/850 719/894/859 712/885/851 +f 712/885/851 719/894/859 720/895/860 +f 712/885/851 720/895/860 713/886/852 +f 713/886/852 720/895/860 721/896/861 +f 713/886/852 721/896/861 714/887/853 +f 714/887/853 721/896/861 722/897/862 +f 714/887/853 722/897/862 715/888/854 +f 715/888/854 722/897/862 723/898/863 +f 715/888/854 723/898/863 716/889/855 +f 716/889/855 723/898/863 724/899/864 +f 716/889/855 724/899/864 717/890/856 +f 717/890/856 724/899/864 725/900/865 +f 717/890/856 725/900/865 718/891/857 +f 718/891/857 725/900/865 1415/901/829 +f 718/891/857 1415/901/829 1416/892/828 +f 700/893/858 701/902/866 726/903/867 +f 700/893/858 726/903/867 719/894/859 +f 719/894/859 726/903/867 727/904/868 +f 719/894/859 727/904/868 720/895/860 +f 720/895/860 727/904/868 728/905/869 +f 720/895/860 728/905/869 721/896/861 +f 721/896/861 728/905/869 729/906/870 +f 721/896/861 729/906/870 722/897/862 +f 722/897/862 729/906/870 730/907/871 +f 722/897/862 730/907/871 723/898/863 +f 723/898/863 730/907/871 731/908/872 +f 723/898/863 731/908/872 724/899/864 +f 724/899/864 731/908/872 732/909/873 +f 724/899/864 732/909/873 725/900/865 +f 725/900/865 732/909/873 1414/910/830 +f 725/900/865 1414/910/830 1415/901/829 +f 701/902/866 702/911/874 733/912/875 +f 701/902/866 733/912/875 726/903/867 +f 726/903/867 733/912/875 734/913/876 +f 726/903/867 734/913/876 727/904/868 +f 727/904/868 734/913/876 735/914/877 +f 727/904/868 735/914/877 728/905/869 +f 728/905/869 735/914/877 736/915/878 +f 728/905/869 736/915/878 729/906/870 +f 729/906/870 736/915/878 737/916/879 +f 729/906/870 737/916/879 730/907/871 +f 730/907/871 737/916/879 738/917/880 +f 730/907/871 738/917/880 731/908/872 +f 731/908/872 738/917/880 739/918/881 +f 731/908/872 739/918/881 732/909/873 +f 732/909/873 739/918/881 1413/919/831 +f 732/909/873 1413/919/831 1414/910/830 +f 702/911/874 703/920/882 740/921/883 +f 702/911/874 740/921/883 733/912/875 +f 733/912/875 740/921/883 741/922/884 +f 733/912/875 741/922/884 734/913/876 +f 734/913/876 741/922/884 742/923/885 +f 734/913/876 742/923/885 735/914/877 +f 735/914/877 742/923/885 743/924/886 +f 735/914/877 743/924/886 736/915/878 +f 736/915/878 743/924/886 744/925/887 +f 736/915/878 744/925/887 737/916/879 +f 737/916/879 744/925/887 745/926/888 +f 737/916/879 745/926/888 738/917/880 +f 738/917/880 745/926/888 746/927/889 +f 738/917/880 746/927/889 739/918/881 +f 739/918/881 746/927/889 1412/928/832 +f 739/918/881 1412/928/832 1413/919/831 +f 703/920/882 704/929/890 747/930/891 +f 703/920/882 747/930/891 740/921/883 +f 740/921/883 747/930/891 748/931/892 +f 740/921/883 748/931/892 741/922/884 +f 741/922/884 748/931/892 749/932/893 +f 741/922/884 749/932/893 742/923/885 +f 742/923/885 749/932/893 750/933/894 +f 742/923/885 750/933/894 743/924/886 +f 743/924/886 750/933/894 751/934/895 +f 743/924/886 751/934/895 744/925/887 +f 744/925/887 751/934/895 752/935/896 +f 744/925/887 752/935/896 745/926/888 +f 745/926/888 752/935/896 753/936/897 +f 745/926/888 753/936/897 746/927/889 +f 746/927/889 753/936/897 1411/937/833 +f 746/927/889 1411/937/833 1412/928/832 +f 704/929/890 1403/938/97 1402/939/96 +f 704/929/890 1402/939/96 747/930/891 +f 747/930/891 1402/939/96 1401/940/105 +f 747/930/891 1401/940/105 748/931/892 +f 748/931/892 1401/940/105 1400/941/113 +f 748/931/892 1400/941/113 749/932/893 +f 749/932/893 1400/941/113 1399/942/121 +f 749/932/893 1399/942/121 750/933/894 +f 750/933/894 1399/942/121 1398/943/129 +f 750/933/894 1398/943/129 751/934/895 +f 751/934/895 1398/943/129 1397/944/137 +f 751/934/895 1397/944/137 752/935/896 +f 752/935/896 1397/944/137 1396/945/145 +f 752/935/896 1396/945/145 753/936/897 +f 753/936/897 1396/945/145 1532/946/153 +f 753/936/897 1532/946/153 1411/937/833 +f 676/866/834 677/869/837 754/947/898 +f 676/866/834 754/947/898 684/948/899 +f 684/948/899 754/947/898 755/949/900 +f 684/948/899 755/949/900 685/950/901 +f 685/950/901 755/949/900 756/951/902 +f 685/950/901 756/951/902 686/952/903 +f 686/952/903 756/951/902 757/953/904 +f 686/952/903 757/953/904 687/954/905 +f 687/954/905 757/953/904 758/955/906 +f 687/954/905 758/955/906 688/956/907 +f 688/956/907 758/955/906 759/957/908 +f 688/956/907 759/957/908 689/958/909 +f 689/958/909 759/957/908 760/959/910 +f 689/958/909 760/959/910 690/960/911 +f 690/960/911 760/959/910 1507/961/571 +f 690/960/911 1507/961/571 1508/962/458 +f 677/869/837 678/871/839 761/963/912 +f 677/869/837 761/963/912 754/947/898 +f 754/947/898 761/963/912 762/964/913 +f 754/947/898 762/964/913 755/949/900 +f 755/949/900 762/964/913 763/965/914 +f 755/949/900 763/965/914 756/951/902 +f 756/951/902 763/965/914 764/966/915 +f 756/951/902 764/966/915 757/953/904 +f 757/953/904 764/966/915 765/967/916 +f 757/953/904 765/967/916 758/955/906 +f 758/955/906 765/967/916 766/968/917 +f 758/955/906 766/968/917 759/957/908 +f 759/957/908 766/968/917 767/969/918 +f 759/957/908 767/969/918 760/959/910 +f 760/959/910 767/969/918 1506/970/572 +f 760/959/910 1506/970/572 1507/961/571 +f 678/871/839 679/873/841 768/971/919 +f 678/871/839 768/971/919 761/963/912 +f 761/963/912 768/971/919 769/972/920 +f 761/963/912 769/972/920 762/964/913 +f 762/964/913 769/972/920 770/973/921 +f 762/964/913 770/973/921 763/965/914 +f 763/965/914 770/973/921 771/974/922 +f 763/965/914 771/974/922 764/966/915 +f 764/966/915 771/974/922 772/975/923 +f 764/966/915 772/975/923 765/967/916 +f 765/967/916 772/975/923 773/976/924 +f 765/967/916 773/976/924 766/968/917 +f 766/968/917 773/976/924 774/977/925 +f 766/968/917 774/977/925 767/969/918 +f 767/969/918 774/977/925 1505/978/573 +f 767/969/918 1505/978/573 1506/970/572 +f 679/873/841 680/875/843 775/979/926 +f 679/873/841 775/979/926 768/971/919 +f 768/971/919 775/979/926 776/980/927 +f 768/971/919 776/980/927 769/972/920 +f 769/972/920 776/980/927 777/981/928 +f 769/972/920 777/981/928 770/973/921 +f 770/973/921 777/981/928 778/982/929 +f 770/973/921 778/982/929 771/974/922 +f 771/974/922 778/982/929 779/983/930 +f 771/974/922 779/983/930 772/975/923 +f 772/975/923 779/983/930 780/984/931 +f 772/975/923 780/984/931 773/976/924 +f 773/976/924 780/984/931 781/985/932 +f 773/976/924 781/985/932 774/977/925 +f 774/977/925 781/985/932 1504/986/574 +f 774/977/925 1504/986/574 1505/978/573 +f 680/875/843 681/877/845 782/987/933 +f 680/875/843 782/987/933 775/979/926 +f 775/979/926 782/987/933 783/988/934 +f 775/979/926 783/988/934 776/980/927 +f 776/980/927 783/988/934 784/989/935 +f 776/980/927 784/989/935 777/981/928 +f 777/981/928 784/989/935 785/990/936 +f 777/981/928 785/990/936 778/982/929 +f 778/982/929 785/990/936 786/991/937 +f 778/982/929 786/991/937 779/983/930 +f 779/983/930 786/991/937 787/992/938 +f 779/983/930 787/992/938 780/984/931 +f 780/984/931 787/992/938 788/993/939 +f 780/984/931 788/993/939 781/985/932 +f 781/985/932 788/993/939 1503/994/575 +f 781/985/932 1503/994/575 1504/986/574 +f 681/877/845 682/879/847 789/995/940 +f 681/877/845 789/995/940 782/987/933 +f 782/987/933 789/995/940 790/996/941 +f 782/987/933 790/996/941 783/988/934 +f 783/988/934 790/996/941 791/997/942 +f 783/988/934 791/997/942 784/989/935 +f 784/989/935 791/997/942 792/998/943 +f 784/989/935 792/998/943 785/990/936 +f 785/990/936 792/998/943 793/999/944 +f 785/990/936 793/999/944 786/991/937 +f 786/991/937 793/999/944 794/1000/945 +f 786/991/937 794/1000/945 787/992/938 +f 787/992/938 794/1000/945 795/1001/946 +f 787/992/938 795/1001/946 788/993/939 +f 788/993/939 795/1001/946 1502/1002/576 +f 788/993/939 1502/1002/576 1503/994/575 +f 682/879/847 683/881/849 796/1003/947 +f 682/879/847 796/1003/947 789/995/940 +f 789/995/940 796/1003/947 797/1004/948 +f 789/995/940 797/1004/948 790/996/941 +f 790/996/941 797/1004/948 798/1005/949 +f 790/996/941 798/1005/949 791/997/942 +f 791/997/942 798/1005/949 799/1006/950 +f 791/997/942 799/1006/950 792/998/943 +f 792/998/943 799/1006/950 800/1007/951 +f 792/998/943 800/1007/951 793/999/944 +f 793/999/944 800/1007/951 801/1008/952 +f 793/999/944 801/1008/952 794/1000/945 +f 794/1000/945 801/1008/952 802/1009/953 +f 794/1000/945 802/1009/953 795/1001/946 +f 795/1001/946 802/1009/953 1501/1010/577 +f 795/1001/946 1501/1010/577 1502/1002/576 +f 683/881/849 1418/883/729 1419/1011/728 +f 683/881/849 1419/1011/728 796/1003/947 +f 796/1003/947 1419/1011/728 1420/1012/737 +f 796/1003/947 1420/1012/737 797/1004/948 +f 797/1004/948 1420/1012/737 1421/1013/745 +f 797/1004/948 1421/1013/745 798/1005/949 +f 798/1005/949 1421/1013/745 1422/1014/753 +f 798/1005/949 1422/1014/753 799/1006/950 +f 799/1006/950 1422/1014/753 1423/1015/761 +f 799/1006/950 1423/1015/761 800/1007/951 +f 800/1007/951 1423/1015/761 1424/1016/769 +f 800/1007/951 1424/1016/769 801/1008/952 +f 801/1008/952 1424/1016/769 1425/1017/777 +f 801/1008/952 1425/1017/777 802/1009/953 +f 802/1009/953 1425/1017/777 1536/1018/578 +f 802/1009/953 1536/1018/578 1501/1010/577 +f 676/866/834 684/948/899 803/1019/954 +f 676/866/834 803/1019/954 691/1020/955 +f 691/1020/955 803/1019/954 804/1021/956 +f 691/1020/955 804/1021/956 692/1022/957 +f 692/1022/957 804/1021/956 805/1023/958 +f 692/1022/957 805/1023/958 693/1024/959 +f 693/1024/959 805/1023/958 806/1025/960 +f 693/1024/959 806/1025/960 694/1026/961 +f 694/1026/961 806/1025/960 807/1027/962 +f 694/1026/961 807/1027/962 695/1028/963 +f 695/1028/963 807/1027/962 808/1029/964 +f 695/1028/963 808/1029/964 696/1030/965 +f 696/1030/965 808/1029/964 809/1031/966 +f 696/1030/965 809/1031/966 697/1032/967 +f 697/1032/967 809/1031/966 1449/1033/968 +f 697/1032/967 1449/1033/968 1448/1034/969 +f 684/948/899 685/950/901 810/1035/970 +f 684/948/899 810/1035/970 803/1019/954 +f 803/1019/954 810/1035/970 811/1036/971 +f 803/1019/954 811/1036/971 804/1021/956 +f 804/1021/956 811/1036/971 812/1037/972 +f 804/1021/956 812/1037/972 805/1023/958 +f 805/1023/958 812/1037/972 813/1038/973 +f 805/1023/958 813/1038/973 806/1025/960 +f 806/1025/960 813/1038/973 814/1039/974 +f 806/1025/960 814/1039/974 807/1027/962 +f 807/1027/962 814/1039/974 815/1040/975 +f 807/1027/962 815/1040/975 808/1029/964 +f 808/1029/964 815/1040/975 816/1041/976 +f 808/1029/964 816/1041/976 809/1031/966 +f 809/1031/966 816/1041/976 1450/1042/977 +f 809/1031/966 1450/1042/977 1449/1033/968 +f 685/950/901 686/952/903 817/1043/978 +f 685/950/901 817/1043/978 810/1035/970 +f 810/1035/970 817/1043/978 818/1044/979 +f 810/1035/970 818/1044/979 811/1036/971 +f 811/1036/971 818/1044/979 819/1045/980 +f 811/1036/971 819/1045/980 812/1037/972 +f 812/1037/972 819/1045/980 820/1046/981 +f 812/1037/972 820/1046/981 813/1038/973 +f 813/1038/973 820/1046/981 821/1047/982 +f 813/1038/973 821/1047/982 814/1039/974 +f 814/1039/974 821/1047/982 822/1048/983 +f 814/1039/974 822/1048/983 815/1040/975 +f 815/1040/975 822/1048/983 823/1049/984 +f 815/1040/975 823/1049/984 816/1041/976 +f 816/1041/976 823/1049/984 1451/1050/985 +f 816/1041/976 1451/1050/985 1450/1042/977 +f 686/952/903 687/954/905 824/1051/986 +f 686/952/903 824/1051/986 817/1043/978 +f 817/1043/978 824/1051/986 825/1052/987 +f 817/1043/978 825/1052/987 818/1044/979 +f 818/1044/979 825/1052/987 826/1053/988 +f 818/1044/979 826/1053/988 819/1045/980 +f 819/1045/980 826/1053/988 827/1054/989 +f 819/1045/980 827/1054/989 820/1046/981 +f 820/1046/981 827/1054/989 828/1055/990 +f 820/1046/981 828/1055/990 821/1047/982 +f 821/1047/982 828/1055/990 829/1056/991 +f 821/1047/982 829/1056/991 822/1048/983 +f 822/1048/983 829/1056/991 830/1057/992 +f 822/1048/983 830/1057/992 823/1049/984 +f 823/1049/984 830/1057/992 1452/1058/993 +f 823/1049/984 1452/1058/993 1451/1050/985 +f 687/954/905 688/956/907 831/1059/994 +f 687/954/905 831/1059/994 824/1051/986 +f 824/1051/986 831/1059/994 832/1060/995 +f 824/1051/986 832/1060/995 825/1052/987 +f 825/1052/987 832/1060/995 833/1061/996 +f 825/1052/987 833/1061/996 826/1053/988 +f 826/1053/988 833/1061/996 834/1062/997 +f 826/1053/988 834/1062/997 827/1054/989 +f 827/1054/989 834/1062/997 835/1063/998 +f 827/1054/989 835/1063/998 828/1055/990 +f 828/1055/990 835/1063/998 836/1064/999 +f 828/1055/990 836/1064/999 829/1056/991 +f 829/1056/991 836/1064/999 837/1065/1000 +f 829/1056/991 837/1065/1000 830/1057/992 +f 830/1057/992 837/1065/1000 1453/1066/1001 +f 830/1057/992 1453/1066/1001 1452/1058/993 +f 688/956/907 689/958/909 838/1067/1002 +f 688/956/907 838/1067/1002 831/1059/994 +f 831/1059/994 838/1067/1002 839/1068/1003 +f 831/1059/994 839/1068/1003 832/1060/995 +f 832/1060/995 839/1068/1003 840/1069/1004 +f 832/1060/995 840/1069/1004 833/1061/996 +f 833/1061/996 840/1069/1004 841/1070/1005 +f 833/1061/996 841/1070/1005 834/1062/997 +f 834/1062/997 841/1070/1005 842/1071/1006 +f 834/1062/997 842/1071/1006 835/1063/998 +f 835/1063/998 842/1071/1006 843/1072/1007 +f 835/1063/998 843/1072/1007 836/1064/999 +f 836/1064/999 843/1072/1007 844/1073/1008 +f 836/1064/999 844/1073/1008 837/1065/1000 +f 837/1065/1000 844/1073/1008 1454/1074/1009 +f 837/1065/1000 1454/1074/1009 1453/1066/1001 +f 689/958/909 690/960/911 845/1075/1010 +f 689/958/909 845/1075/1010 838/1067/1002 +f 838/1067/1002 845/1075/1010 846/1076/1011 +f 838/1067/1002 846/1076/1011 839/1068/1003 +f 839/1068/1003 846/1076/1011 847/1077/1012 +f 839/1068/1003 847/1077/1012 840/1069/1004 +f 840/1069/1004 847/1077/1012 848/1078/1013 +f 840/1069/1004 848/1078/1013 841/1070/1005 +f 841/1070/1005 848/1078/1013 849/1079/1014 +f 841/1070/1005 849/1079/1014 842/1071/1006 +f 842/1071/1006 849/1079/1014 850/1080/1015 +f 842/1071/1006 850/1080/1015 843/1072/1007 +f 843/1072/1007 850/1080/1015 851/1081/1016 +f 843/1072/1007 851/1081/1016 844/1073/1008 +f 844/1073/1008 851/1081/1016 1455/1082/1017 +f 844/1073/1008 1455/1082/1017 1454/1074/1009 +f 690/960/911 1508/962/458 1509/1083/457 +f 690/960/911 1509/1083/457 845/1075/1010 +f 845/1075/1010 1509/1083/457 1510/1084/466 +f 845/1075/1010 1510/1084/466 846/1076/1011 +f 846/1076/1011 1510/1084/466 1511/1085/474 +f 846/1076/1011 1511/1085/474 847/1077/1012 +f 847/1077/1012 1511/1085/474 1512/1086/482 +f 847/1077/1012 1512/1086/482 848/1078/1013 +f 848/1078/1013 1512/1086/482 1513/1087/490 +f 848/1078/1013 1513/1087/490 849/1079/1014 +f 849/1079/1014 1513/1087/490 1514/1088/498 +f 849/1079/1014 1514/1088/498 850/1080/1015 +f 850/1080/1015 1514/1088/498 1515/1089/506 +f 850/1080/1015 1515/1089/506 851/1081/1016 +f 851/1081/1016 1515/1089/506 1537/1090/514 +f 851/1081/1016 1537/1090/514 1455/1082/1017 +f 676/866/834 691/1020/955 852/1091/1018 +f 676/866/834 852/1091/1018 698/867/835 +f 698/867/835 852/1091/1018 853/1092/1019 +f 698/867/835 853/1092/1019 699/884/850 +f 699/884/850 853/1092/1019 854/1093/1020 +f 699/884/850 854/1093/1020 700/893/858 +f 700/893/858 854/1093/1020 855/1094/1021 +f 700/893/858 855/1094/1021 701/902/866 +f 701/902/866 855/1094/1021 856/1095/1022 +f 701/902/866 856/1095/1022 702/911/874 +f 702/911/874 856/1095/1022 857/1096/1023 +f 702/911/874 857/1096/1023 703/920/882 +f 703/920/882 857/1096/1023 858/1097/1024 +f 703/920/882 858/1097/1024 704/929/890 +f 704/929/890 858/1097/1024 1404/1098/218 +f 704/929/890 1404/1098/218 1403/938/97 +f 691/1020/955 692/1022/957 859/1099/1025 +f 691/1020/955 859/1099/1025 852/1091/1018 +f 852/1091/1018 859/1099/1025 860/1100/1026 +f 852/1091/1018 860/1100/1026 853/1092/1019 +f 853/1092/1019 860/1100/1026 861/1101/1027 +f 853/1092/1019 861/1101/1027 854/1093/1020 +f 854/1093/1020 861/1101/1027 862/1102/1028 +f 854/1093/1020 862/1102/1028 855/1094/1021 +f 855/1094/1021 862/1102/1028 863/1103/1029 +f 855/1094/1021 863/1103/1029 856/1095/1022 +f 856/1095/1022 863/1103/1029 864/1104/1030 +f 856/1095/1022 864/1104/1030 857/1096/1023 +f 857/1096/1023 864/1104/1030 865/1105/1031 +f 857/1096/1023 865/1105/1031 858/1097/1024 +f 858/1097/1024 865/1105/1031 1405/1106/219 +f 858/1097/1024 1405/1106/219 1404/1098/218 +f 692/1022/957 693/1024/959 866/1107/1032 +f 692/1022/957 866/1107/1032 859/1099/1025 +f 859/1099/1025 866/1107/1032 867/1108/1033 +f 859/1099/1025 867/1108/1033 860/1100/1026 +f 860/1100/1026 867/1108/1033 868/1109/1034 +f 860/1100/1026 868/1109/1034 861/1101/1027 +f 861/1101/1027 868/1109/1034 869/1110/1035 +f 861/1101/1027 869/1110/1035 862/1102/1028 +f 862/1102/1028 869/1110/1035 870/1111/1036 +f 862/1102/1028 870/1111/1036 863/1103/1029 +f 863/1103/1029 870/1111/1036 871/1112/1037 +f 863/1103/1029 871/1112/1037 864/1104/1030 +f 864/1104/1030 871/1112/1037 872/1113/1038 +f 864/1104/1030 872/1113/1038 865/1105/1031 +f 865/1105/1031 872/1113/1038 1406/1114/220 +f 865/1105/1031 1406/1114/220 1405/1106/219 +f 693/1024/959 694/1026/961 873/1115/1039 +f 693/1024/959 873/1115/1039 866/1107/1032 +f 866/1107/1032 873/1115/1039 874/1116/1040 +f 866/1107/1032 874/1116/1040 867/1108/1033 +f 867/1108/1033 874/1116/1040 875/1117/1041 +f 867/1108/1033 875/1117/1041 868/1109/1034 +f 868/1109/1034 875/1117/1041 876/1118/1042 +f 868/1109/1034 876/1118/1042 869/1110/1035 +f 869/1110/1035 876/1118/1042 877/1119/1043 +f 869/1110/1035 877/1119/1043 870/1111/1036 +f 870/1111/1036 877/1119/1043 878/1120/1044 +f 870/1111/1036 878/1120/1044 871/1112/1037 +f 871/1112/1037 878/1120/1044 879/1121/1045 +f 871/1112/1037 879/1121/1045 872/1113/1038 +f 872/1113/1038 879/1121/1045 1407/1122/221 +f 872/1113/1038 1407/1122/221 1406/1114/220 +f 694/1026/961 695/1028/963 880/1123/1046 +f 694/1026/961 880/1123/1046 873/1115/1039 +f 873/1115/1039 880/1123/1046 881/1124/1047 +f 873/1115/1039 881/1124/1047 874/1116/1040 +f 874/1116/1040 881/1124/1047 882/1125/1048 +f 874/1116/1040 882/1125/1048 875/1117/1041 +f 875/1117/1041 882/1125/1048 883/1126/1049 +f 875/1117/1041 883/1126/1049 876/1118/1042 +f 876/1118/1042 883/1126/1049 884/1127/1050 +f 876/1118/1042 884/1127/1050 877/1119/1043 +f 877/1119/1043 884/1127/1050 885/1128/1051 +f 877/1119/1043 885/1128/1051 878/1120/1044 +f 878/1120/1044 885/1128/1051 886/1129/1052 +f 878/1120/1044 886/1129/1052 879/1121/1045 +f 879/1121/1045 886/1129/1052 1408/1130/222 +f 879/1121/1045 1408/1130/222 1407/1122/221 +f 695/1028/963 696/1030/965 887/1131/1053 +f 695/1028/963 887/1131/1053 880/1123/1046 +f 880/1123/1046 887/1131/1053 888/1132/1054 +f 880/1123/1046 888/1132/1054 881/1124/1047 +f 881/1124/1047 888/1132/1054 889/1133/1055 +f 881/1124/1047 889/1133/1055 882/1125/1048 +f 882/1125/1048 889/1133/1055 890/1134/1056 +f 882/1125/1048 890/1134/1056 883/1126/1049 +f 883/1126/1049 890/1134/1056 891/1135/1057 +f 883/1126/1049 891/1135/1057 884/1127/1050 +f 884/1127/1050 891/1135/1057 892/1136/1058 +f 884/1127/1050 892/1136/1058 885/1128/1051 +f 885/1128/1051 892/1136/1058 893/1137/1059 +f 885/1128/1051 893/1137/1059 886/1129/1052 +f 886/1129/1052 893/1137/1059 1409/1138/223 +f 886/1129/1052 1409/1138/223 1408/1130/222 +f 696/1030/965 697/1032/967 894/1139/1060 +f 696/1030/965 894/1139/1060 887/1131/1053 +f 887/1131/1053 894/1139/1060 895/1140/1061 +f 887/1131/1053 895/1140/1061 888/1132/1054 +f 888/1132/1054 895/1140/1061 896/1141/1062 +f 888/1132/1054 896/1141/1062 889/1133/1055 +f 889/1133/1055 896/1141/1062 897/1142/1063 +f 889/1133/1055 897/1142/1063 890/1134/1056 +f 890/1134/1056 897/1142/1063 898/1143/1064 +f 890/1134/1056 898/1143/1064 891/1135/1057 +f 891/1135/1057 898/1143/1064 899/1144/1065 +f 891/1135/1057 899/1144/1065 892/1136/1058 +f 892/1136/1058 899/1144/1065 900/1145/1066 +f 892/1136/1058 900/1145/1066 893/1137/1059 +f 893/1137/1059 900/1145/1066 1410/1146/224 +f 893/1137/1059 1410/1146/224 1409/1138/223 +f 697/1032/967 1448/1034/969 1447/1147/1067 +f 697/1032/967 1447/1147/1067 894/1139/1060 +f 894/1139/1060 1447/1147/1067 1446/1148/1068 +f 894/1139/1060 1446/1148/1068 895/1140/1061 +f 895/1140/1061 1446/1148/1068 1445/1149/1069 +f 895/1140/1061 1445/1149/1069 896/1141/1062 +f 896/1141/1062 1445/1149/1069 1444/1150/1070 +f 896/1141/1062 1444/1150/1070 897/1142/1063 +f 897/1142/1063 1444/1150/1070 1443/1151/1071 +f 897/1142/1063 1443/1151/1071 898/1143/1064 +f 898/1143/1064 1443/1151/1071 1442/1152/1072 +f 898/1143/1064 1442/1152/1072 899/1144/1065 +f 899/1144/1065 1442/1152/1072 1441/1153/1073 +f 899/1144/1065 1441/1153/1073 900/1145/1066 +f 900/1145/1066 1441/1153/1073 1533/1154/225 +f 900/1145/1066 1533/1154/225 1410/1146/224 +f 901/1155/1074 923/1156/1075 930/1157/1076 +f 901/1155/1074 930/1157/1076 902/1158/1077 +f 902/1158/1077 930/1157/1076 931/1159/1078 +f 902/1158/1077 931/1159/1078 903/1160/1079 +f 903/1160/1079 931/1159/1078 932/1161/1080 +f 903/1160/1079 932/1161/1080 904/1162/1081 +f 904/1162/1081 932/1161/1080 933/1163/1082 +f 904/1162/1081 933/1163/1082 905/1164/1083 +f 905/1164/1083 933/1163/1082 934/1165/1084 +f 905/1164/1083 934/1165/1084 906/1166/1085 +f 906/1166/1085 934/1165/1084 935/1167/1086 +f 906/1166/1085 935/1167/1086 907/1168/1087 +f 907/1168/1087 935/1167/1086 936/1169/1088 +f 907/1168/1087 936/1169/1088 908/1170/1089 +f 908/1170/1089 936/1169/1088 1447/1171/1067 +f 908/1170/1089 1447/1171/1067 1448/1172/969 +f 923/1156/1075 924/1173/1090 937/1174/1091 +f 923/1156/1075 937/1174/1091 930/1157/1076 +f 930/1157/1076 937/1174/1091 938/1175/1092 +f 930/1157/1076 938/1175/1092 931/1159/1078 +f 931/1159/1078 938/1175/1092 939/1176/1093 +f 931/1159/1078 939/1176/1093 932/1161/1080 +f 932/1161/1080 939/1176/1093 940/1177/1094 +f 932/1161/1080 940/1177/1094 933/1163/1082 +f 933/1163/1082 940/1177/1094 941/1178/1095 +f 933/1163/1082 941/1178/1095 934/1165/1084 +f 934/1165/1084 941/1178/1095 942/1179/1096 +f 934/1165/1084 942/1179/1096 935/1167/1086 +f 935/1167/1086 942/1179/1096 943/1180/1097 +f 935/1167/1086 943/1180/1097 936/1169/1088 +f 936/1169/1088 943/1180/1097 1446/1181/1068 +f 936/1169/1088 1446/1181/1068 1447/1171/1067 +f 924/1173/1090 925/1182/1098 944/1183/1099 +f 924/1173/1090 944/1183/1099 937/1174/1091 +f 937/1174/1091 944/1183/1099 945/1184/1100 +f 937/1174/1091 945/1184/1100 938/1175/1092 +f 938/1175/1092 945/1184/1100 946/1185/1101 +f 938/1175/1092 946/1185/1101 939/1176/1093 +f 939/1176/1093 946/1185/1101 947/1186/1102 +f 939/1176/1093 947/1186/1102 940/1177/1094 +f 940/1177/1094 947/1186/1102 948/1187/1103 +f 940/1177/1094 948/1187/1103 941/1178/1095 +f 941/1178/1095 948/1187/1103 949/1188/1104 +f 941/1178/1095 949/1188/1104 942/1179/1096 +f 942/1179/1096 949/1188/1104 950/1189/1105 +f 942/1179/1096 950/1189/1105 943/1180/1097 +f 943/1180/1097 950/1189/1105 1445/1190/1069 +f 943/1180/1097 1445/1190/1069 1446/1181/1068 +f 925/1182/1098 926/1191/1106 951/1192/1107 +f 925/1182/1098 951/1192/1107 944/1183/1099 +f 944/1183/1099 951/1192/1107 952/1193/1108 +f 944/1183/1099 952/1193/1108 945/1184/1100 +f 945/1184/1100 952/1193/1108 953/1194/1109 +f 945/1184/1100 953/1194/1109 946/1185/1101 +f 946/1185/1101 953/1194/1109 954/1195/1110 +f 946/1185/1101 954/1195/1110 947/1186/1102 +f 947/1186/1102 954/1195/1110 955/1196/1111 +f 947/1186/1102 955/1196/1111 948/1187/1103 +f 948/1187/1103 955/1196/1111 956/1197/1112 +f 948/1187/1103 956/1197/1112 949/1188/1104 +f 949/1188/1104 956/1197/1112 957/1198/1113 +f 949/1188/1104 957/1198/1113 950/1189/1105 +f 950/1189/1105 957/1198/1113 1444/1199/1070 +f 950/1189/1105 1444/1199/1070 1445/1190/1069 +f 926/1191/1106 927/1200/1114 958/1201/1115 +f 926/1191/1106 958/1201/1115 951/1192/1107 +f 951/1192/1107 958/1201/1115 959/1202/1116 +f 951/1192/1107 959/1202/1116 952/1193/1108 +f 952/1193/1108 959/1202/1116 960/1203/1117 +f 952/1193/1108 960/1203/1117 953/1194/1109 +f 953/1194/1109 960/1203/1117 961/1204/1118 +f 953/1194/1109 961/1204/1118 954/1195/1110 +f 954/1195/1110 961/1204/1118 962/1205/1119 +f 954/1195/1110 962/1205/1119 955/1196/1111 +f 955/1196/1111 962/1205/1119 963/1206/1120 +f 955/1196/1111 963/1206/1120 956/1197/1112 +f 956/1197/1112 963/1206/1120 964/1207/1121 +f 956/1197/1112 964/1207/1121 957/1198/1113 +f 957/1198/1113 964/1207/1121 1443/1208/1071 +f 957/1198/1113 1443/1208/1071 1444/1199/1070 +f 927/1200/1114 928/1209/1122 965/1210/1123 +f 927/1200/1114 965/1210/1123 958/1201/1115 +f 958/1201/1115 965/1210/1123 966/1211/1124 +f 958/1201/1115 966/1211/1124 959/1202/1116 +f 959/1202/1116 966/1211/1124 967/1212/1125 +f 959/1202/1116 967/1212/1125 960/1203/1117 +f 960/1203/1117 967/1212/1125 968/1213/1126 +f 960/1203/1117 968/1213/1126 961/1204/1118 +f 961/1204/1118 968/1213/1126 969/1214/1127 +f 961/1204/1118 969/1214/1127 962/1205/1119 +f 962/1205/1119 969/1214/1127 970/1215/1128 +f 962/1205/1119 970/1215/1128 963/1206/1120 +f 963/1206/1120 970/1215/1128 971/1216/1129 +f 963/1206/1120 971/1216/1129 964/1207/1121 +f 964/1207/1121 971/1216/1129 1442/1217/1072 +f 964/1207/1121 1442/1217/1072 1443/1208/1071 +f 928/1209/1122 929/1218/1130 972/1219/1131 +f 928/1209/1122 972/1219/1131 965/1210/1123 +f 965/1210/1123 972/1219/1131 973/1220/1132 +f 965/1210/1123 973/1220/1132 966/1211/1124 +f 966/1211/1124 973/1220/1132 974/1221/1133 +f 966/1211/1124 974/1221/1133 967/1212/1125 +f 967/1212/1125 974/1221/1133 975/1222/1134 +f 967/1212/1125 975/1222/1134 968/1213/1126 +f 968/1213/1126 975/1222/1134 976/1223/1135 +f 968/1213/1126 976/1223/1135 969/1214/1127 +f 969/1214/1127 976/1223/1135 977/1224/1136 +f 969/1214/1127 977/1224/1136 970/1215/1128 +f 970/1215/1128 977/1224/1136 978/1225/1137 +f 970/1215/1128 978/1225/1137 971/1216/1129 +f 971/1216/1129 978/1225/1137 1441/1226/1073 +f 971/1216/1129 1441/1226/1073 1442/1217/1072 +f 929/1218/1130 1433/1227/169 1432/1228/168 +f 929/1218/1130 1432/1228/168 972/1219/1131 +f 972/1219/1131 1432/1228/168 1431/1229/177 +f 972/1219/1131 1431/1229/177 973/1220/1132 +f 973/1220/1132 1431/1229/177 1430/1230/185 +f 973/1220/1132 1430/1230/185 974/1221/1133 +f 974/1221/1133 1430/1230/185 1429/1231/193 +f 974/1221/1133 1429/1231/193 975/1222/1134 +f 975/1222/1134 1429/1231/193 1428/1232/201 +f 975/1222/1134 1428/1232/201 976/1223/1135 +f 976/1223/1135 1428/1232/201 1427/1233/209 +f 976/1223/1135 1427/1233/209 977/1224/1136 +f 977/1224/1136 1427/1233/209 1426/1234/217 +f 977/1224/1136 1426/1234/217 978/1225/1137 +f 978/1225/1137 1426/1234/217 1533/1235/225 +f 978/1225/1137 1533/1235/225 1441/1226/1073 +f 901/1155/1074 902/1158/1077 979/1236/1138 +f 901/1155/1074 979/1236/1138 909/1237/1139 +f 909/1237/1139 979/1236/1138 980/1238/1140 +f 909/1237/1139 980/1238/1140 910/1239/1141 +f 910/1239/1141 980/1238/1140 981/1240/1142 +f 910/1239/1141 981/1240/1142 911/1241/1143 +f 911/1241/1143 981/1240/1142 982/1242/1144 +f 911/1241/1143 982/1242/1144 912/1243/1145 +f 912/1243/1145 982/1242/1144 983/1244/1146 +f 912/1243/1145 983/1244/1146 913/1245/1147 +f 913/1245/1147 983/1244/1146 984/1246/1148 +f 913/1245/1147 984/1246/1148 914/1247/1149 +f 914/1247/1149 984/1246/1148 985/1248/1150 +f 914/1247/1149 985/1248/1150 915/1249/1151 +f 915/1249/1151 985/1248/1150 1522/1250/507 +f 915/1249/1151 1522/1250/507 1523/1251/386 +f 902/1158/1077 903/1160/1079 986/1252/1152 +f 902/1158/1077 986/1252/1152 979/1236/1138 +f 979/1236/1138 986/1252/1152 987/1253/1153 +f 979/1236/1138 987/1253/1153 980/1238/1140 +f 980/1238/1140 987/1253/1153 988/1254/1154 +f 980/1238/1140 988/1254/1154 981/1240/1142 +f 981/1240/1142 988/1254/1154 989/1255/1155 +f 981/1240/1142 989/1255/1155 982/1242/1144 +f 982/1242/1144 989/1255/1155 990/1256/1156 +f 982/1242/1144 990/1256/1156 983/1244/1146 +f 983/1244/1146 990/1256/1156 991/1257/1157 +f 983/1244/1146 991/1257/1157 984/1246/1148 +f 984/1246/1148 991/1257/1157 992/1258/1158 +f 984/1246/1148 992/1258/1158 985/1248/1150 +f 985/1248/1150 992/1258/1158 1521/1259/508 +f 985/1248/1150 1521/1259/508 1522/1250/507 +f 903/1160/1079 904/1162/1081 993/1260/1159 +f 903/1160/1079 993/1260/1159 986/1252/1152 +f 986/1252/1152 993/1260/1159 994/1261/1160 +f 986/1252/1152 994/1261/1160 987/1253/1153 +f 987/1253/1153 994/1261/1160 995/1262/1161 +f 987/1253/1153 995/1262/1161 988/1254/1154 +f 988/1254/1154 995/1262/1161 996/1263/1162 +f 988/1254/1154 996/1263/1162 989/1255/1155 +f 989/1255/1155 996/1263/1162 997/1264/1163 +f 989/1255/1155 997/1264/1163 990/1256/1156 +f 990/1256/1156 997/1264/1163 998/1265/1164 +f 990/1256/1156 998/1265/1164 991/1257/1157 +f 991/1257/1157 998/1265/1164 999/1266/1165 +f 991/1257/1157 999/1266/1165 992/1258/1158 +f 992/1258/1158 999/1266/1165 1520/1267/509 +f 992/1258/1158 1520/1267/509 1521/1259/508 +f 904/1162/1081 905/1164/1083 1000/1268/1166 +f 904/1162/1081 1000/1268/1166 993/1260/1159 +f 993/1260/1159 1000/1268/1166 1001/1269/1167 +f 993/1260/1159 1001/1269/1167 994/1261/1160 +f 994/1261/1160 1001/1269/1167 1002/1270/1168 +f 994/1261/1160 1002/1270/1168 995/1262/1161 +f 995/1262/1161 1002/1270/1168 1003/1271/1169 +f 995/1262/1161 1003/1271/1169 996/1263/1162 +f 996/1263/1162 1003/1271/1169 1004/1272/1170 +f 996/1263/1162 1004/1272/1170 997/1264/1163 +f 997/1264/1163 1004/1272/1170 1005/1273/1171 +f 997/1264/1163 1005/1273/1171 998/1265/1164 +f 998/1265/1164 1005/1273/1171 1006/1274/1172 +f 998/1265/1164 1006/1274/1172 999/1266/1165 +f 999/1266/1165 1006/1274/1172 1519/1275/510 +f 999/1266/1165 1519/1275/510 1520/1267/509 +f 905/1164/1083 906/1166/1085 1007/1276/1173 +f 905/1164/1083 1007/1276/1173 1000/1268/1166 +f 1000/1268/1166 1007/1276/1173 1008/1277/1174 +f 1000/1268/1166 1008/1277/1174 1001/1269/1167 +f 1001/1269/1167 1008/1277/1174 1009/1278/1175 +f 1001/1269/1167 1009/1278/1175 1002/1270/1168 +f 1002/1270/1168 1009/1278/1175 1010/1279/1176 +f 1002/1270/1168 1010/1279/1176 1003/1271/1169 +f 1003/1271/1169 1010/1279/1176 1011/1280/1177 +f 1003/1271/1169 1011/1280/1177 1004/1272/1170 +f 1004/1272/1170 1011/1280/1177 1012/1281/1178 +f 1004/1272/1170 1012/1281/1178 1005/1273/1171 +f 1005/1273/1171 1012/1281/1178 1013/1282/1179 +f 1005/1273/1171 1013/1282/1179 1006/1274/1172 +f 1006/1274/1172 1013/1282/1179 1518/1283/511 +f 1006/1274/1172 1518/1283/511 1519/1275/510 +f 906/1166/1085 907/1168/1087 1014/1284/1180 +f 906/1166/1085 1014/1284/1180 1007/1276/1173 +f 1007/1276/1173 1014/1284/1180 1015/1285/1181 +f 1007/1276/1173 1015/1285/1181 1008/1277/1174 +f 1008/1277/1174 1015/1285/1181 1016/1286/1182 +f 1008/1277/1174 1016/1286/1182 1009/1278/1175 +f 1009/1278/1175 1016/1286/1182 1017/1287/1183 +f 1009/1278/1175 1017/1287/1183 1010/1279/1176 +f 1010/1279/1176 1017/1287/1183 1018/1288/1184 +f 1010/1279/1176 1018/1288/1184 1011/1280/1177 +f 1011/1280/1177 1018/1288/1184 1019/1289/1185 +f 1011/1280/1177 1019/1289/1185 1012/1281/1178 +f 1012/1281/1178 1019/1289/1185 1020/1290/1186 +f 1012/1281/1178 1020/1290/1186 1013/1282/1179 +f 1013/1282/1179 1020/1290/1186 1517/1291/512 +f 1013/1282/1179 1517/1291/512 1518/1283/511 +f 907/1168/1087 908/1170/1089 1021/1292/1187 +f 907/1168/1087 1021/1292/1187 1014/1284/1180 +f 1014/1284/1180 1021/1292/1187 1022/1293/1188 +f 1014/1284/1180 1022/1293/1188 1015/1285/1181 +f 1015/1285/1181 1022/1293/1188 1023/1294/1189 +f 1015/1285/1181 1023/1294/1189 1016/1286/1182 +f 1016/1286/1182 1023/1294/1189 1024/1295/1190 +f 1016/1286/1182 1024/1295/1190 1017/1287/1183 +f 1017/1287/1183 1024/1295/1190 1025/1296/1191 +f 1017/1287/1183 1025/1296/1191 1018/1288/1184 +f 1018/1288/1184 1025/1296/1191 1026/1297/1192 +f 1018/1288/1184 1026/1297/1192 1019/1289/1185 +f 1019/1289/1185 1026/1297/1192 1027/1298/1193 +f 1019/1289/1185 1027/1298/1193 1020/1290/1186 +f 1020/1290/1186 1027/1298/1193 1516/1299/513 +f 1020/1290/1186 1516/1299/513 1517/1291/512 +f 908/1170/1089 1448/1172/969 1449/1300/968 +f 908/1170/1089 1449/1300/968 1021/1292/1187 +f 1021/1292/1187 1449/1300/968 1450/1301/977 +f 1021/1292/1187 1450/1301/977 1022/1293/1188 +f 1022/1293/1188 1450/1301/977 1451/1302/985 +f 1022/1293/1188 1451/1302/985 1023/1294/1189 +f 1023/1294/1189 1451/1302/985 1452/1303/993 +f 1023/1294/1189 1452/1303/993 1024/1295/1190 +f 1024/1295/1190 1452/1303/993 1453/1304/1001 +f 1024/1295/1190 1453/1304/1001 1025/1296/1191 +f 1025/1296/1191 1453/1304/1001 1454/1305/1009 +f 1025/1296/1191 1454/1305/1009 1026/1297/1192 +f 1026/1297/1192 1454/1305/1009 1455/1306/1017 +f 1026/1297/1192 1455/1306/1017 1027/1298/1193 +f 1027/1298/1193 1455/1306/1017 1537/1307/514 +f 1027/1298/1193 1537/1307/514 1516/1299/513 +f 901/1155/1074 909/1237/1139 1028/1308/1194 +f 901/1155/1074 1028/1308/1194 916/1309/1195 +f 916/1309/1195 1028/1308/1194 1029/1310/1196 +f 916/1309/1195 1029/1310/1196 917/1311/1197 +f 917/1311/1197 1029/1310/1196 1030/1312/1198 +f 917/1311/1197 1030/1312/1198 918/1313/1199 +f 918/1313/1199 1030/1312/1198 1031/1314/1200 +f 918/1313/1199 1031/1314/1200 919/1315/1201 +f 919/1315/1201 1031/1314/1200 1032/1316/1202 +f 919/1315/1201 1032/1316/1202 920/1317/1203 +f 920/1317/1203 1032/1316/1202 1033/1318/1204 +f 920/1317/1203 1033/1318/1204 921/1319/1205 +f 921/1319/1205 1033/1318/1204 1034/1320/1206 +f 921/1319/1205 1034/1320/1206 922/1321/1207 +f 922/1321/1207 1034/1320/1206 1464/1322/1208 +f 922/1321/1207 1464/1322/1208 1463/1323/1209 +f 909/1237/1139 910/1239/1141 1035/1324/1210 +f 909/1237/1139 1035/1324/1210 1028/1308/1194 +f 1028/1308/1194 1035/1324/1210 1036/1325/1211 +f 1028/1308/1194 1036/1325/1211 1029/1310/1196 +f 1029/1310/1196 1036/1325/1211 1037/1326/1212 +f 1029/1310/1196 1037/1326/1212 1030/1312/1198 +f 1030/1312/1198 1037/1326/1212 1038/1327/1213 +f 1030/1312/1198 1038/1327/1213 1031/1314/1200 +f 1031/1314/1200 1038/1327/1213 1039/1328/1214 +f 1031/1314/1200 1039/1328/1214 1032/1316/1202 +f 1032/1316/1202 1039/1328/1214 1040/1329/1215 +f 1032/1316/1202 1040/1329/1215 1033/1318/1204 +f 1033/1318/1204 1040/1329/1215 1041/1330/1216 +f 1033/1318/1204 1041/1330/1216 1034/1320/1206 +f 1034/1320/1206 1041/1330/1216 1465/1331/1217 +f 1034/1320/1206 1465/1331/1217 1464/1322/1208 +f 910/1239/1141 911/1241/1143 1042/1332/1218 +f 910/1239/1141 1042/1332/1218 1035/1324/1210 +f 1035/1324/1210 1042/1332/1218 1043/1333/1219 +f 1035/1324/1210 1043/1333/1219 1036/1325/1211 +f 1036/1325/1211 1043/1333/1219 1044/1334/1220 +f 1036/1325/1211 1044/1334/1220 1037/1326/1212 +f 1037/1326/1212 1044/1334/1220 1045/1335/1221 +f 1037/1326/1212 1045/1335/1221 1038/1327/1213 +f 1038/1327/1213 1045/1335/1221 1046/1336/1222 +f 1038/1327/1213 1046/1336/1222 1039/1328/1214 +f 1039/1328/1214 1046/1336/1222 1047/1337/1223 +f 1039/1328/1214 1047/1337/1223 1040/1329/1215 +f 1040/1329/1215 1047/1337/1223 1048/1338/1224 +f 1040/1329/1215 1048/1338/1224 1041/1330/1216 +f 1041/1330/1216 1048/1338/1224 1466/1339/1225 +f 1041/1330/1216 1466/1339/1225 1465/1331/1217 +f 911/1241/1143 912/1243/1145 1049/1340/1226 +f 911/1241/1143 1049/1340/1226 1042/1332/1218 +f 1042/1332/1218 1049/1340/1226 1050/1341/1227 +f 1042/1332/1218 1050/1341/1227 1043/1333/1219 +f 1043/1333/1219 1050/1341/1227 1051/1342/1228 +f 1043/1333/1219 1051/1342/1228 1044/1334/1220 +f 1044/1334/1220 1051/1342/1228 1052/1343/1229 +f 1044/1334/1220 1052/1343/1229 1045/1335/1221 +f 1045/1335/1221 1052/1343/1229 1053/1344/1230 +f 1045/1335/1221 1053/1344/1230 1046/1336/1222 +f 1046/1336/1222 1053/1344/1230 1054/1345/1231 +f 1046/1336/1222 1054/1345/1231 1047/1337/1223 +f 1047/1337/1223 1054/1345/1231 1055/1346/1232 +f 1047/1337/1223 1055/1346/1232 1048/1338/1224 +f 1048/1338/1224 1055/1346/1232 1467/1347/1233 +f 1048/1338/1224 1467/1347/1233 1466/1339/1225 +f 912/1243/1145 913/1245/1147 1056/1348/1234 +f 912/1243/1145 1056/1348/1234 1049/1340/1226 +f 1049/1340/1226 1056/1348/1234 1057/1349/1235 +f 1049/1340/1226 1057/1349/1235 1050/1341/1227 +f 1050/1341/1227 1057/1349/1235 1058/1350/1236 +f 1050/1341/1227 1058/1350/1236 1051/1342/1228 +f 1051/1342/1228 1058/1350/1236 1059/1351/1237 +f 1051/1342/1228 1059/1351/1237 1052/1343/1229 +f 1052/1343/1229 1059/1351/1237 1060/1352/1238 +f 1052/1343/1229 1060/1352/1238 1053/1344/1230 +f 1053/1344/1230 1060/1352/1238 1061/1353/1239 +f 1053/1344/1230 1061/1353/1239 1054/1345/1231 +f 1054/1345/1231 1061/1353/1239 1062/1354/1240 +f 1054/1345/1231 1062/1354/1240 1055/1346/1232 +f 1055/1346/1232 1062/1354/1240 1468/1355/1241 +f 1055/1346/1232 1468/1355/1241 1467/1347/1233 +f 913/1245/1147 914/1247/1149 1063/1356/1242 +f 913/1245/1147 1063/1356/1242 1056/1348/1234 +f 1056/1348/1234 1063/1356/1242 1064/1357/1243 +f 1056/1348/1234 1064/1357/1243 1057/1349/1235 +f 1057/1349/1235 1064/1357/1243 1065/1358/1244 +f 1057/1349/1235 1065/1358/1244 1058/1350/1236 +f 1058/1350/1236 1065/1358/1244 1066/1359/1245 +f 1058/1350/1236 1066/1359/1245 1059/1351/1237 +f 1059/1351/1237 1066/1359/1245 1067/1360/1246 +f 1059/1351/1237 1067/1360/1246 1060/1352/1238 +f 1060/1352/1238 1067/1360/1246 1068/1361/1247 +f 1060/1352/1238 1068/1361/1247 1061/1353/1239 +f 1061/1353/1239 1068/1361/1247 1069/1362/1248 +f 1061/1353/1239 1069/1362/1248 1062/1354/1240 +f 1062/1354/1240 1069/1362/1248 1469/1363/1249 +f 1062/1354/1240 1469/1363/1249 1468/1355/1241 +f 914/1247/1149 915/1249/1151 1070/1364/1250 +f 914/1247/1149 1070/1364/1250 1063/1356/1242 +f 1063/1356/1242 1070/1364/1250 1071/1365/1251 +f 1063/1356/1242 1071/1365/1251 1064/1357/1243 +f 1064/1357/1243 1071/1365/1251 1072/1366/1252 +f 1064/1357/1243 1072/1366/1252 1065/1358/1244 +f 1065/1358/1244 1072/1366/1252 1073/1367/1253 +f 1065/1358/1244 1073/1367/1253 1066/1359/1245 +f 1066/1359/1245 1073/1367/1253 1074/1368/1254 +f 1066/1359/1245 1074/1368/1254 1067/1360/1246 +f 1067/1360/1246 1074/1368/1254 1075/1369/1255 +f 1067/1360/1246 1075/1369/1255 1068/1361/1247 +f 1068/1361/1247 1075/1369/1255 1076/1370/1256 +f 1068/1361/1247 1076/1370/1256 1069/1362/1248 +f 1069/1362/1248 1076/1370/1256 1470/1371/1257 +f 1069/1362/1248 1470/1371/1257 1469/1363/1249 +f 915/1249/1151 1523/1251/386 1524/1372/385 +f 915/1249/1151 1524/1372/385 1070/1364/1250 +f 1070/1364/1250 1524/1372/385 1525/1373/394 +f 1070/1364/1250 1525/1373/394 1071/1365/1251 +f 1071/1365/1251 1525/1373/394 1526/1374/402 +f 1071/1365/1251 1526/1374/402 1072/1366/1252 +f 1072/1366/1252 1526/1374/402 1527/1375/410 +f 1072/1366/1252 1527/1375/410 1073/1367/1253 +f 1073/1367/1253 1527/1375/410 1528/1376/418 +f 1073/1367/1253 1528/1376/418 1074/1368/1254 +f 1074/1368/1254 1528/1376/418 1529/1377/426 +f 1074/1368/1254 1529/1377/426 1075/1369/1255 +f 1075/1369/1255 1529/1377/426 1530/1378/434 +f 1075/1369/1255 1530/1378/434 1076/1370/1256 +f 1076/1370/1256 1530/1378/434 1538/1379/442 +f 1076/1370/1256 1538/1379/442 1470/1371/1257 +f 901/1155/1074 916/1309/1195 1077/1380/1258 +f 901/1155/1074 1077/1380/1258 923/1156/1075 +f 923/1156/1075 1077/1380/1258 1078/1381/1259 +f 923/1156/1075 1078/1381/1259 924/1173/1090 +f 924/1173/1090 1078/1381/1259 1079/1382/1260 +f 924/1173/1090 1079/1382/1260 925/1182/1098 +f 925/1182/1098 1079/1382/1260 1080/1383/1261 +f 925/1182/1098 1080/1383/1261 926/1191/1106 +f 926/1191/1106 1080/1383/1261 1081/1384/1262 +f 926/1191/1106 1081/1384/1262 927/1200/1114 +f 927/1200/1114 1081/1384/1262 1082/1385/1263 +f 927/1200/1114 1082/1385/1263 928/1209/1122 +f 928/1209/1122 1082/1385/1263 1083/1386/1264 +f 928/1209/1122 1083/1386/1264 929/1218/1130 +f 929/1218/1130 1083/1386/1264 1434/1387/282 +f 929/1218/1130 1434/1387/282 1433/1227/169 +f 916/1309/1195 917/1311/1197 1084/1388/1265 +f 916/1309/1195 1084/1388/1265 1077/1380/1258 +f 1077/1380/1258 1084/1388/1265 1085/1389/1266 +f 1077/1380/1258 1085/1389/1266 1078/1381/1259 +f 1078/1381/1259 1085/1389/1266 1086/1390/1267 +f 1078/1381/1259 1086/1390/1267 1079/1382/1260 +f 1079/1382/1260 1086/1390/1267 1087/1391/1268 +f 1079/1382/1260 1087/1391/1268 1080/1383/1261 +f 1080/1383/1261 1087/1391/1268 1088/1392/1269 +f 1080/1383/1261 1088/1392/1269 1081/1384/1262 +f 1081/1384/1262 1088/1392/1269 1089/1393/1270 +f 1081/1384/1262 1089/1393/1270 1082/1385/1263 +f 1082/1385/1263 1089/1393/1270 1090/1394/1271 +f 1082/1385/1263 1090/1394/1271 1083/1386/1264 +f 1083/1386/1264 1090/1394/1271 1435/1395/283 +f 1083/1386/1264 1435/1395/283 1434/1387/282 +f 917/1311/1197 918/1313/1199 1091/1396/1272 +f 917/1311/1197 1091/1396/1272 1084/1388/1265 +f 1084/1388/1265 1091/1396/1272 1092/1397/1273 +f 1084/1388/1265 1092/1397/1273 1085/1389/1266 +f 1085/1389/1266 1092/1397/1273 1093/1398/1274 +f 1085/1389/1266 1093/1398/1274 1086/1390/1267 +f 1086/1390/1267 1093/1398/1274 1094/1399/1275 +f 1086/1390/1267 1094/1399/1275 1087/1391/1268 +f 1087/1391/1268 1094/1399/1275 1095/1400/1276 +f 1087/1391/1268 1095/1400/1276 1088/1392/1269 +f 1088/1392/1269 1095/1400/1276 1096/1401/1277 +f 1088/1392/1269 1096/1401/1277 1089/1393/1270 +f 1089/1393/1270 1096/1401/1277 1097/1402/1278 +f 1089/1393/1270 1097/1402/1278 1090/1394/1271 +f 1090/1394/1271 1097/1402/1278 1436/1403/284 +f 1090/1394/1271 1436/1403/284 1435/1395/283 +f 918/1313/1199 919/1315/1201 1098/1404/1279 +f 918/1313/1199 1098/1404/1279 1091/1396/1272 +f 1091/1396/1272 1098/1404/1279 1099/1405/1280 +f 1091/1396/1272 1099/1405/1280 1092/1397/1273 +f 1092/1397/1273 1099/1405/1280 1100/1406/1281 +f 1092/1397/1273 1100/1406/1281 1093/1398/1274 +f 1093/1398/1274 1100/1406/1281 1101/1407/1282 +f 1093/1398/1274 1101/1407/1282 1094/1399/1275 +f 1094/1399/1275 1101/1407/1282 1102/1408/1283 +f 1094/1399/1275 1102/1408/1283 1095/1400/1276 +f 1095/1400/1276 1102/1408/1283 1103/1409/1284 +f 1095/1400/1276 1103/1409/1284 1096/1401/1277 +f 1096/1401/1277 1103/1409/1284 1104/1410/1285 +f 1096/1401/1277 1104/1410/1285 1097/1402/1278 +f 1097/1402/1278 1104/1410/1285 1437/1411/285 +f 1097/1402/1278 1437/1411/285 1436/1403/284 +f 919/1315/1201 920/1317/1203 1105/1412/1286 +f 919/1315/1201 1105/1412/1286 1098/1404/1279 +f 1098/1404/1279 1105/1412/1286 1106/1413/1287 +f 1098/1404/1279 1106/1413/1287 1099/1405/1280 +f 1099/1405/1280 1106/1413/1287 1107/1414/1288 +f 1099/1405/1280 1107/1414/1288 1100/1406/1281 +f 1100/1406/1281 1107/1414/1288 1108/1415/1289 +f 1100/1406/1281 1108/1415/1289 1101/1407/1282 +f 1101/1407/1282 1108/1415/1289 1109/1416/1290 +f 1101/1407/1282 1109/1416/1290 1102/1408/1283 +f 1102/1408/1283 1109/1416/1290 1110/1417/1291 +f 1102/1408/1283 1110/1417/1291 1103/1409/1284 +f 1103/1409/1284 1110/1417/1291 1111/1418/1292 +f 1103/1409/1284 1111/1418/1292 1104/1410/1285 +f 1104/1410/1285 1111/1418/1292 1438/1419/286 +f 1104/1410/1285 1438/1419/286 1437/1411/285 +f 920/1317/1203 921/1319/1205 1112/1420/1293 +f 920/1317/1203 1112/1420/1293 1105/1412/1286 +f 1105/1412/1286 1112/1420/1293 1113/1421/1294 +f 1105/1412/1286 1113/1421/1294 1106/1413/1287 +f 1106/1413/1287 1113/1421/1294 1114/1422/1295 +f 1106/1413/1287 1114/1422/1295 1107/1414/1288 +f 1107/1414/1288 1114/1422/1295 1115/1423/1296 +f 1107/1414/1288 1115/1423/1296 1108/1415/1289 +f 1108/1415/1289 1115/1423/1296 1116/1424/1297 +f 1108/1415/1289 1116/1424/1297 1109/1416/1290 +f 1109/1416/1290 1116/1424/1297 1117/1425/1298 +f 1109/1416/1290 1117/1425/1298 1110/1417/1291 +f 1110/1417/1291 1117/1425/1298 1118/1426/1299 +f 1110/1417/1291 1118/1426/1299 1111/1418/1292 +f 1111/1418/1292 1118/1426/1299 1439/1427/287 +f 1111/1418/1292 1439/1427/287 1438/1419/286 +f 921/1319/1205 922/1321/1207 1119/1428/1300 +f 921/1319/1205 1119/1428/1300 1112/1420/1293 +f 1112/1420/1293 1119/1428/1300 1120/1429/1301 +f 1112/1420/1293 1120/1429/1301 1113/1421/1294 +f 1113/1421/1294 1120/1429/1301 1121/1430/1302 +f 1113/1421/1294 1121/1430/1302 1114/1422/1295 +f 1114/1422/1295 1121/1430/1302 1122/1431/1303 +f 1114/1422/1295 1122/1431/1303 1115/1423/1296 +f 1115/1423/1296 1122/1431/1303 1123/1432/1304 +f 1115/1423/1296 1123/1432/1304 1116/1424/1297 +f 1116/1424/1297 1123/1432/1304 1124/1433/1305 +f 1116/1424/1297 1124/1433/1305 1117/1425/1298 +f 1117/1425/1298 1124/1433/1305 1125/1434/1306 +f 1117/1425/1298 1125/1434/1306 1118/1426/1299 +f 1118/1426/1299 1125/1434/1306 1440/1435/288 +f 1118/1426/1299 1440/1435/288 1439/1427/287 +f 922/1321/1207 1463/1323/1209 1462/1436/1307 +f 922/1321/1207 1462/1436/1307 1119/1428/1300 +f 1119/1428/1300 1462/1436/1307 1461/1437/1308 +f 1119/1428/1300 1461/1437/1308 1120/1429/1301 +f 1120/1429/1301 1461/1437/1308 1460/1438/1309 +f 1120/1429/1301 1460/1438/1309 1121/1430/1302 +f 1121/1430/1302 1460/1438/1309 1459/1439/1310 +f 1121/1430/1302 1459/1439/1310 1122/1431/1303 +f 1122/1431/1303 1459/1439/1310 1458/1440/1311 +f 1122/1431/1303 1458/1440/1311 1123/1432/1304 +f 1123/1432/1304 1458/1440/1311 1457/1441/1312 +f 1123/1432/1304 1457/1441/1312 1124/1433/1305 +f 1124/1433/1305 1457/1441/1312 1456/1442/1313 +f 1124/1433/1305 1456/1442/1313 1125/1434/1306 +f 1125/1434/1306 1456/1442/1313 1534/1443/289 +f 1125/1434/1306 1534/1443/289 1440/1435/288 +f 1126/1444/1314 1148/1445/1315 1155/1446/1316 +f 1126/1444/1314 1155/1446/1316 1127/1447/1317 +f 1127/1447/1317 1155/1446/1316 1156/1448/1318 +f 1127/1447/1317 1156/1448/1318 1128/1449/1319 +f 1128/1449/1319 1156/1448/1318 1157/1450/1320 +f 1128/1449/1319 1157/1450/1320 1129/1451/1321 +f 1129/1451/1321 1157/1450/1320 1158/1452/1322 +f 1129/1451/1321 1158/1452/1322 1130/1453/1323 +f 1130/1453/1323 1158/1452/1322 1159/1454/1324 +f 1130/1453/1323 1159/1454/1324 1131/1455/1325 +f 1131/1455/1325 1159/1454/1324 1160/1456/1326 +f 1131/1455/1325 1160/1456/1326 1132/1457/1327 +f 1132/1457/1327 1160/1456/1326 1161/1458/1328 +f 1132/1457/1327 1161/1458/1328 1133/1459/1329 +f 1133/1459/1329 1161/1458/1328 1389/1460/707 +f 1133/1459/1329 1389/1460/707 1388/1461/596 +f 1148/1445/1315 1149/1462/1330 1162/1463/1331 +f 1148/1445/1315 1162/1463/1331 1155/1446/1316 +f 1155/1446/1316 1162/1463/1331 1163/1464/1332 +f 1155/1446/1316 1163/1464/1332 1156/1448/1318 +f 1156/1448/1318 1163/1464/1332 1164/1465/1333 +f 1156/1448/1318 1164/1465/1333 1157/1450/1320 +f 1157/1450/1320 1164/1465/1333 1165/1466/1334 +f 1157/1450/1320 1165/1466/1334 1158/1452/1322 +f 1158/1452/1322 1165/1466/1334 1166/1467/1335 +f 1158/1452/1322 1166/1467/1335 1159/1454/1324 +f 1159/1454/1324 1166/1467/1335 1167/1468/1336 +f 1159/1454/1324 1167/1468/1336 1160/1456/1326 +f 1160/1456/1326 1167/1468/1336 1168/1469/1337 +f 1160/1456/1326 1168/1469/1337 1161/1458/1328 +f 1161/1458/1328 1168/1469/1337 1390/1470/708 +f 1161/1458/1328 1390/1470/708 1389/1460/707 +f 1149/1462/1330 1150/1471/1338 1169/1472/1339 +f 1149/1462/1330 1169/1472/1339 1162/1463/1331 +f 1162/1463/1331 1169/1472/1339 1170/1473/1340 +f 1162/1463/1331 1170/1473/1340 1163/1464/1332 +f 1163/1464/1332 1170/1473/1340 1171/1474/1341 +f 1163/1464/1332 1171/1474/1341 1164/1465/1333 +f 1164/1465/1333 1171/1474/1341 1172/1475/1342 +f 1164/1465/1333 1172/1475/1342 1165/1466/1334 +f 1165/1466/1334 1172/1475/1342 1173/1476/1343 +f 1165/1466/1334 1173/1476/1343 1166/1467/1335 +f 1166/1467/1335 1173/1476/1343 1174/1477/1344 +f 1166/1467/1335 1174/1477/1344 1167/1468/1336 +f 1167/1468/1336 1174/1477/1344 1175/1478/1345 +f 1167/1468/1336 1175/1478/1345 1168/1469/1337 +f 1168/1469/1337 1175/1478/1345 1391/1479/709 +f 1168/1469/1337 1391/1479/709 1390/1470/708 +f 1150/1471/1338 1151/1480/1346 1176/1481/1347 +f 1150/1471/1338 1176/1481/1347 1169/1472/1339 +f 1169/1472/1339 1176/1481/1347 1177/1482/1348 +f 1169/1472/1339 1177/1482/1348 1170/1473/1340 +f 1170/1473/1340 1177/1482/1348 1178/1483/1349 +f 1170/1473/1340 1178/1483/1349 1171/1474/1341 +f 1171/1474/1341 1178/1483/1349 1179/1484/1350 +f 1171/1474/1341 1179/1484/1350 1172/1475/1342 +f 1172/1475/1342 1179/1484/1350 1180/1485/1351 +f 1172/1475/1342 1180/1485/1351 1173/1476/1343 +f 1173/1476/1343 1180/1485/1351 1181/1486/1352 +f 1173/1476/1343 1181/1486/1352 1174/1477/1344 +f 1174/1477/1344 1181/1486/1352 1182/1487/1353 +f 1174/1477/1344 1182/1487/1353 1175/1478/1345 +f 1175/1478/1345 1182/1487/1353 1392/1488/710 +f 1175/1478/1345 1392/1488/710 1391/1479/709 +f 1151/1480/1346 1152/1489/1354 1183/1490/1355 +f 1151/1480/1346 1183/1490/1355 1176/1481/1347 +f 1176/1481/1347 1183/1490/1355 1184/1491/1356 +f 1176/1481/1347 1184/1491/1356 1177/1482/1348 +f 1177/1482/1348 1184/1491/1356 1185/1492/1357 +f 1177/1482/1348 1185/1492/1357 1178/1483/1349 +f 1178/1483/1349 1185/1492/1357 1186/1493/1358 +f 1178/1483/1349 1186/1493/1358 1179/1484/1350 +f 1179/1484/1350 1186/1493/1358 1187/1494/1359 +f 1179/1484/1350 1187/1494/1359 1180/1485/1351 +f 1180/1485/1351 1187/1494/1359 1188/1495/1360 +f 1180/1485/1351 1188/1495/1360 1181/1486/1352 +f 1181/1486/1352 1188/1495/1360 1189/1496/1361 +f 1181/1486/1352 1189/1496/1361 1182/1487/1353 +f 1182/1487/1353 1189/1496/1361 1393/1497/711 +f 1182/1487/1353 1393/1497/711 1392/1488/710 +f 1152/1489/1354 1153/1498/1362 1190/1499/1363 +f 1152/1489/1354 1190/1499/1363 1183/1490/1355 +f 1183/1490/1355 1190/1499/1363 1191/1500/1364 +f 1183/1490/1355 1191/1500/1364 1184/1491/1356 +f 1184/1491/1356 1191/1500/1364 1192/1501/1365 +f 1184/1491/1356 1192/1501/1365 1185/1492/1357 +f 1185/1492/1357 1192/1501/1365 1193/1502/1366 +f 1185/1492/1357 1193/1502/1366 1186/1493/1358 +f 1186/1493/1358 1193/1502/1366 1194/1503/1367 +f 1186/1493/1358 1194/1503/1367 1187/1494/1359 +f 1187/1494/1359 1194/1503/1367 1195/1504/1368 +f 1187/1494/1359 1195/1504/1368 1188/1495/1360 +f 1188/1495/1360 1195/1504/1368 1196/1505/1369 +f 1188/1495/1360 1196/1505/1369 1189/1496/1361 +f 1189/1496/1361 1196/1505/1369 1394/1506/712 +f 1189/1496/1361 1394/1506/712 1393/1497/711 +f 1153/1498/1362 1154/1507/1370 1197/1508/1371 +f 1153/1498/1362 1197/1508/1371 1190/1499/1363 +f 1190/1499/1363 1197/1508/1371 1198/1509/1372 +f 1190/1499/1363 1198/1509/1372 1191/1500/1364 +f 1191/1500/1364 1198/1509/1372 1199/1510/1373 +f 1191/1500/1364 1199/1510/1373 1192/1501/1365 +f 1192/1501/1365 1199/1510/1373 1200/1511/1374 +f 1192/1501/1365 1200/1511/1374 1193/1502/1366 +f 1193/1502/1366 1200/1511/1374 1201/1512/1375 +f 1193/1502/1366 1201/1512/1375 1194/1503/1367 +f 1194/1503/1367 1201/1512/1375 1202/1513/1376 +f 1194/1503/1367 1202/1513/1376 1195/1504/1368 +f 1195/1504/1368 1202/1513/1376 1203/1514/1377 +f 1195/1504/1368 1203/1514/1377 1196/1505/1369 +f 1196/1505/1369 1203/1514/1377 1395/1515/713 +f 1196/1505/1369 1395/1515/713 1394/1506/712 +f 1154/1507/1370 1493/1516/307 1492/1517/306 +f 1154/1507/1370 1492/1517/306 1197/1508/1371 +f 1197/1508/1371 1492/1517/306 1491/1518/316 +f 1197/1508/1371 1491/1518/316 1198/1509/1372 +f 1198/1509/1372 1491/1518/316 1490/1519/325 +f 1198/1509/1372 1490/1519/325 1199/1510/1373 +f 1199/1510/1373 1490/1519/325 1489/1520/334 +f 1199/1510/1373 1489/1520/334 1200/1511/1374 +f 1200/1511/1374 1489/1520/334 1488/1521/343 +f 1200/1511/1374 1488/1521/343 1201/1512/1375 +f 1201/1512/1375 1488/1521/343 1487/1522/352 +f 1201/1512/1375 1487/1522/352 1202/1513/1376 +f 1202/1513/1376 1487/1522/352 1486/1523/361 +f 1202/1513/1376 1486/1523/361 1203/1514/1377 +f 1203/1514/1377 1486/1523/361 1535/1524/370 +f 1203/1514/1377 1535/1524/370 1395/1515/713 +f 1126/1444/1314 1127/1447/1317 1204/1525/1378 +f 1126/1444/1314 1204/1525/1378 1134/1526/1379 +f 1134/1526/1379 1204/1525/1378 1205/1527/1380 +f 1134/1526/1379 1205/1527/1380 1135/1528/1381 +f 1135/1528/1381 1205/1527/1380 1206/1529/1382 +f 1135/1528/1381 1206/1529/1382 1136/1530/1383 +f 1136/1530/1383 1206/1529/1382 1207/1531/1384 +f 1136/1530/1383 1207/1531/1384 1137/1532/1385 +f 1137/1532/1385 1207/1531/1384 1208/1533/1386 +f 1137/1532/1385 1208/1533/1386 1138/1534/1387 +f 1138/1534/1387 1208/1533/1386 1209/1535/1388 +f 1138/1534/1387 1209/1535/1388 1139/1536/1389 +f 1139/1536/1389 1209/1535/1388 1210/1537/1390 +f 1139/1536/1389 1210/1537/1390 1140/1538/1391 +f 1140/1538/1391 1210/1537/1390 1372/1539/74 +f 1140/1538/1391 1372/1539/74 1373/1540/73 +f 1127/1447/1317 1128/1449/1319 1211/1541/1392 +f 1127/1447/1317 1211/1541/1392 1204/1525/1378 +f 1204/1525/1378 1211/1541/1392 1212/1542/1393 +f 1204/1525/1378 1212/1542/1393 1205/1527/1380 +f 1205/1527/1380 1212/1542/1393 1213/1543/1394 +f 1205/1527/1380 1213/1543/1394 1206/1529/1382 +f 1206/1529/1382 1213/1543/1394 1214/1544/1395 +f 1206/1529/1382 1214/1544/1395 1207/1531/1384 +f 1207/1531/1384 1214/1544/1395 1215/1545/1396 +f 1207/1531/1384 1215/1545/1396 1208/1533/1386 +f 1208/1533/1386 1215/1545/1396 1216/1546/1397 +f 1208/1533/1386 1216/1546/1397 1209/1535/1388 +f 1209/1535/1388 1216/1546/1397 1217/1547/1398 +f 1209/1535/1388 1217/1547/1398 1210/1537/1390 +f 1210/1537/1390 1217/1547/1398 1371/1548/75 +f 1210/1537/1390 1371/1548/75 1372/1539/74 +f 1128/1449/1319 1129/1451/1321 1218/1549/1399 +f 1128/1449/1319 1218/1549/1399 1211/1541/1392 +f 1211/1541/1392 1218/1549/1399 1219/1550/1400 +f 1211/1541/1392 1219/1550/1400 1212/1542/1393 +f 1212/1542/1393 1219/1550/1400 1220/1551/1401 +f 1212/1542/1393 1220/1551/1401 1213/1543/1394 +f 1213/1543/1394 1220/1551/1401 1221/1552/1402 +f 1213/1543/1394 1221/1552/1402 1214/1544/1395 +f 1214/1544/1395 1221/1552/1402 1222/1553/1403 +f 1214/1544/1395 1222/1553/1403 1215/1545/1396 +f 1215/1545/1396 1222/1553/1403 1223/1554/1404 +f 1215/1545/1396 1223/1554/1404 1216/1546/1397 +f 1216/1546/1397 1223/1554/1404 1224/1555/1405 +f 1216/1546/1397 1224/1555/1405 1217/1547/1398 +f 1217/1547/1398 1224/1555/1405 1370/1556/76 +f 1217/1547/1398 1370/1556/76 1371/1548/75 +f 1129/1451/1321 1130/1453/1323 1225/1557/1406 +f 1129/1451/1321 1225/1557/1406 1218/1549/1399 +f 1218/1549/1399 1225/1557/1406 1226/1558/1407 +f 1218/1549/1399 1226/1558/1407 1219/1550/1400 +f 1219/1550/1400 1226/1558/1407 1227/1559/1408 +f 1219/1550/1400 1227/1559/1408 1220/1551/1401 +f 1220/1551/1401 1227/1559/1408 1228/1560/1409 +f 1220/1551/1401 1228/1560/1409 1221/1552/1402 +f 1221/1552/1402 1228/1560/1409 1229/1561/1410 +f 1221/1552/1402 1229/1561/1410 1222/1553/1403 +f 1222/1553/1403 1229/1561/1410 1230/1562/1411 +f 1222/1553/1403 1230/1562/1411 1223/1554/1404 +f 1223/1554/1404 1230/1562/1411 1231/1563/1412 +f 1223/1554/1404 1231/1563/1412 1224/1555/1405 +f 1224/1555/1405 1231/1563/1412 1369/1564/77 +f 1224/1555/1405 1369/1564/77 1370/1556/76 +f 1130/1453/1323 1131/1455/1325 1232/1565/1413 +f 1130/1453/1323 1232/1565/1413 1225/1557/1406 +f 1225/1557/1406 1232/1565/1413 1233/1566/1414 +f 1225/1557/1406 1233/1566/1414 1226/1558/1407 +f 1226/1558/1407 1233/1566/1414 1234/1567/1415 +f 1226/1558/1407 1234/1567/1415 1227/1559/1408 +f 1227/1559/1408 1234/1567/1415 1235/1568/1416 +f 1227/1559/1408 1235/1568/1416 1228/1560/1409 +f 1228/1560/1409 1235/1568/1416 1236/1569/1417 +f 1228/1560/1409 1236/1569/1417 1229/1561/1410 +f 1229/1561/1410 1236/1569/1417 1237/1570/1418 +f 1229/1561/1410 1237/1570/1418 1230/1562/1411 +f 1230/1562/1411 1237/1570/1418 1238/1571/1419 +f 1230/1562/1411 1238/1571/1419 1231/1563/1412 +f 1231/1563/1412 1238/1571/1419 1368/1572/78 +f 1231/1563/1412 1368/1572/78 1369/1564/77 +f 1131/1455/1325 1132/1457/1327 1239/1573/1420 +f 1131/1455/1325 1239/1573/1420 1232/1565/1413 +f 1232/1565/1413 1239/1573/1420 1240/1574/1421 +f 1232/1565/1413 1240/1574/1421 1233/1566/1414 +f 1233/1566/1414 1240/1574/1421 1241/1575/1422 +f 1233/1566/1414 1241/1575/1422 1234/1567/1415 +f 1234/1567/1415 1241/1575/1422 1242/1576/1423 +f 1234/1567/1415 1242/1576/1423 1235/1568/1416 +f 1235/1568/1416 1242/1576/1423 1243/1577/1424 +f 1235/1568/1416 1243/1577/1424 1236/1569/1417 +f 1236/1569/1417 1243/1577/1424 1244/1578/1425 +f 1236/1569/1417 1244/1578/1425 1237/1570/1418 +f 1237/1570/1418 1244/1578/1425 1245/1579/1426 +f 1237/1570/1418 1245/1579/1426 1238/1571/1419 +f 1238/1571/1419 1245/1579/1426 1367/1580/79 +f 1238/1571/1419 1367/1580/79 1368/1572/78 +f 1132/1457/1327 1133/1459/1329 1246/1581/1427 +f 1132/1457/1327 1246/1581/1427 1239/1573/1420 +f 1239/1573/1420 1246/1581/1427 1247/1582/1428 +f 1239/1573/1420 1247/1582/1428 1240/1574/1421 +f 1240/1574/1421 1247/1582/1428 1248/1583/1429 +f 1240/1574/1421 1248/1583/1429 1241/1575/1422 +f 1241/1575/1422 1248/1583/1429 1249/1584/1430 +f 1241/1575/1422 1249/1584/1430 1242/1576/1423 +f 1242/1576/1423 1249/1584/1430 1250/1585/1431 +f 1242/1576/1423 1250/1585/1431 1243/1577/1424 +f 1243/1577/1424 1250/1585/1431 1251/1586/1432 +f 1243/1577/1424 1251/1586/1432 1244/1578/1425 +f 1244/1578/1425 1251/1586/1432 1252/1587/1433 +f 1244/1578/1425 1252/1587/1433 1245/1579/1426 +f 1245/1579/1426 1252/1587/1433 1366/1588/80 +f 1245/1579/1426 1366/1588/80 1367/1580/79 +f 1133/1459/1329 1388/1461/596 1387/1589/595 +f 1133/1459/1329 1387/1589/595 1246/1581/1427 +f 1246/1581/1427 1387/1589/595 1386/1590/605 +f 1246/1581/1427 1386/1590/605 1247/1582/1428 +f 1247/1582/1428 1386/1590/605 1385/1591/614 +f 1247/1582/1428 1385/1591/614 1248/1583/1429 +f 1248/1583/1429 1385/1591/614 1384/1592/623 +f 1248/1583/1429 1384/1592/623 1249/1584/1430 +f 1249/1584/1430 1384/1592/623 1383/1593/632 +f 1249/1584/1430 1383/1593/632 1250/1585/1431 +f 1250/1585/1431 1383/1593/632 1382/1594/641 +f 1250/1585/1431 1382/1594/641 1251/1586/1432 +f 1251/1586/1432 1382/1594/641 1381/1595/650 +f 1251/1586/1432 1381/1595/650 1252/1587/1433 +f 1252/1587/1433 1381/1595/650 1531/1596/81 +f 1252/1587/1433 1531/1596/81 1366/1588/80 +f 1126/1444/1314 1134/1526/1379 1253/1597/1434 +f 1126/1444/1314 1253/1597/1434 1141/1598/1435 +f 1141/1598/1435 1253/1597/1434 1254/1599/1436 +f 1141/1598/1435 1254/1599/1436 1142/1600/1437 +f 1142/1600/1437 1254/1599/1436 1255/1601/1438 +f 1142/1600/1437 1255/1601/1438 1143/1602/1439 +f 1143/1602/1439 1255/1601/1438 1256/1603/1440 +f 1143/1602/1439 1256/1603/1440 1144/1604/1441 +f 1144/1604/1441 1256/1603/1440 1257/1605/1442 +f 1144/1604/1441 1257/1605/1442 1145/1606/1443 +f 1145/1606/1443 1257/1605/1442 1258/1607/1444 +f 1145/1606/1443 1258/1607/1444 1146/1608/1445 +f 1146/1608/1445 1258/1607/1444 1259/1609/1446 +f 1146/1608/1445 1259/1609/1446 1147/1610/1447 +f 1147/1610/1447 1259/1609/1446 1462/1611/1307 +f 1147/1610/1447 1462/1611/1307 1463/1612/1209 +f 1134/1526/1379 1135/1528/1381 1260/1613/1448 +f 1134/1526/1379 1260/1613/1448 1253/1597/1434 +f 1253/1597/1434 1260/1613/1448 1261/1614/1449 +f 1253/1597/1434 1261/1614/1449 1254/1599/1436 +f 1254/1599/1436 1261/1614/1449 1262/1615/1450 +f 1254/1599/1436 1262/1615/1450 1255/1601/1438 +f 1255/1601/1438 1262/1615/1450 1263/1616/1451 +f 1255/1601/1438 1263/1616/1451 1256/1603/1440 +f 1256/1603/1440 1263/1616/1451 1264/1617/1452 +f 1256/1603/1440 1264/1617/1452 1257/1605/1442 +f 1257/1605/1442 1264/1617/1452 1265/1618/1453 +f 1257/1605/1442 1265/1618/1453 1258/1607/1444 +f 1258/1607/1444 1265/1618/1453 1266/1619/1454 +f 1258/1607/1444 1266/1619/1454 1259/1609/1446 +f 1259/1609/1446 1266/1619/1454 1461/1620/1308 +f 1259/1609/1446 1461/1620/1308 1462/1611/1307 +f 1135/1528/1381 1136/1530/1383 1267/1621/1455 +f 1135/1528/1381 1267/1621/1455 1260/1613/1448 +f 1260/1613/1448 1267/1621/1455 1268/1622/1456 +f 1260/1613/1448 1268/1622/1456 1261/1614/1449 +f 1261/1614/1449 1268/1622/1456 1269/1623/1457 +f 1261/1614/1449 1269/1623/1457 1262/1615/1450 +f 1262/1615/1450 1269/1623/1457 1270/1624/1458 +f 1262/1615/1450 1270/1624/1458 1263/1616/1451 +f 1263/1616/1451 1270/1624/1458 1271/1625/1459 +f 1263/1616/1451 1271/1625/1459 1264/1617/1452 +f 1264/1617/1452 1271/1625/1459 1272/1626/1460 +f 1264/1617/1452 1272/1626/1460 1265/1618/1453 +f 1265/1618/1453 1272/1626/1460 1273/1627/1461 +f 1265/1618/1453 1273/1627/1461 1266/1619/1454 +f 1266/1619/1454 1273/1627/1461 1460/1628/1309 +f 1266/1619/1454 1460/1628/1309 1461/1620/1308 +f 1136/1530/1383 1137/1532/1385 1274/1629/1462 +f 1136/1530/1383 1274/1629/1462 1267/1621/1455 +f 1267/1621/1455 1274/1629/1462 1275/1630/1463 +f 1267/1621/1455 1275/1630/1463 1268/1622/1456 +f 1268/1622/1456 1275/1630/1463 1276/1631/1464 +f 1268/1622/1456 1276/1631/1464 1269/1623/1457 +f 1269/1623/1457 1276/1631/1464 1277/1632/1465 +f 1269/1623/1457 1277/1632/1465 1270/1624/1458 +f 1270/1624/1458 1277/1632/1465 1278/1633/1466 +f 1270/1624/1458 1278/1633/1466 1271/1625/1459 +f 1271/1625/1459 1278/1633/1466 1279/1634/1467 +f 1271/1625/1459 1279/1634/1467 1272/1626/1460 +f 1272/1626/1460 1279/1634/1467 1280/1635/1468 +f 1272/1626/1460 1280/1635/1468 1273/1627/1461 +f 1273/1627/1461 1280/1635/1468 1459/1636/1310 +f 1273/1627/1461 1459/1636/1310 1460/1628/1309 +f 1137/1532/1385 1138/1534/1387 1281/1637/1469 +f 1137/1532/1385 1281/1637/1469 1274/1629/1462 +f 1274/1629/1462 1281/1637/1469 1282/1638/1470 +f 1274/1629/1462 1282/1638/1470 1275/1630/1463 +f 1275/1630/1463 1282/1638/1470 1283/1639/1471 +f 1275/1630/1463 1283/1639/1471 1276/1631/1464 +f 1276/1631/1464 1283/1639/1471 1284/1640/1472 +f 1276/1631/1464 1284/1640/1472 1277/1632/1465 +f 1277/1632/1465 1284/1640/1472 1285/1641/1473 +f 1277/1632/1465 1285/1641/1473 1278/1633/1466 +f 1278/1633/1466 1285/1641/1473 1286/1642/1474 +f 1278/1633/1466 1286/1642/1474 1279/1634/1467 +f 1279/1634/1467 1286/1642/1474 1287/1643/1475 +f 1279/1634/1467 1287/1643/1475 1280/1635/1468 +f 1280/1635/1468 1287/1643/1475 1458/1644/1311 +f 1280/1635/1468 1458/1644/1311 1459/1636/1310 +f 1138/1534/1387 1139/1536/1389 1288/1645/1476 +f 1138/1534/1387 1288/1645/1476 1281/1637/1469 +f 1281/1637/1469 1288/1645/1476 1289/1646/1477 +f 1281/1637/1469 1289/1646/1477 1282/1638/1470 +f 1282/1638/1470 1289/1646/1477 1290/1647/1478 +f 1282/1638/1470 1290/1647/1478 1283/1639/1471 +f 1283/1639/1471 1290/1647/1478 1291/1648/1479 +f 1283/1639/1471 1291/1648/1479 1284/1640/1472 +f 1284/1640/1472 1291/1648/1479 1292/1649/1480 +f 1284/1640/1472 1292/1649/1480 1285/1641/1473 +f 1285/1641/1473 1292/1649/1480 1293/1650/1481 +f 1285/1641/1473 1293/1650/1481 1286/1642/1474 +f 1286/1642/1474 1293/1650/1481 1294/1651/1482 +f 1286/1642/1474 1294/1651/1482 1287/1643/1475 +f 1287/1643/1475 1294/1651/1482 1457/1652/1312 +f 1287/1643/1475 1457/1652/1312 1458/1644/1311 +f 1139/1536/1389 1140/1538/1391 1295/1653/1483 +f 1139/1536/1389 1295/1653/1483 1288/1645/1476 +f 1288/1645/1476 1295/1653/1483 1296/1654/1484 +f 1288/1645/1476 1296/1654/1484 1289/1646/1477 +f 1289/1646/1477 1296/1654/1484 1297/1655/1485 +f 1289/1646/1477 1297/1655/1485 1290/1647/1478 +f 1290/1647/1478 1297/1655/1485 1298/1656/1486 +f 1290/1647/1478 1298/1656/1486 1291/1648/1479 +f 1291/1648/1479 1298/1656/1486 1299/1657/1487 +f 1291/1648/1479 1299/1657/1487 1292/1649/1480 +f 1292/1649/1480 1299/1657/1487 1300/1658/1488 +f 1292/1649/1480 1300/1658/1488 1293/1650/1481 +f 1293/1650/1481 1300/1658/1488 1301/1659/1489 +f 1293/1650/1481 1301/1659/1489 1294/1651/1482 +f 1294/1651/1482 1301/1659/1489 1456/1660/1313 +f 1294/1651/1482 1456/1660/1313 1457/1652/1312 +f 1140/1538/1391 1373/1540/73 1374/1661/233 +f 1140/1538/1391 1374/1661/233 1295/1653/1483 +f 1295/1653/1483 1374/1661/233 1375/1662/241 +f 1295/1653/1483 1375/1662/241 1296/1654/1484 +f 1296/1654/1484 1375/1662/241 1376/1663/249 +f 1296/1654/1484 1376/1663/249 1297/1655/1485 +f 1297/1655/1485 1376/1663/249 1377/1664/257 +f 1297/1655/1485 1377/1664/257 1298/1656/1486 +f 1298/1656/1486 1377/1664/257 1378/1665/265 +f 1298/1656/1486 1378/1665/265 1299/1657/1487 +f 1299/1657/1487 1378/1665/265 1379/1666/273 +f 1299/1657/1487 1379/1666/273 1300/1658/1488 +f 1300/1658/1488 1379/1666/273 1380/1667/281 +f 1300/1658/1488 1380/1667/281 1301/1659/1489 +f 1301/1659/1489 1380/1667/281 1534/1668/289 +f 1301/1659/1489 1534/1668/289 1456/1660/1313 +f 1126/1444/1314 1141/1598/1435 1302/1669/1490 +f 1126/1444/1314 1302/1669/1490 1148/1445/1315 +f 1148/1445/1315 1302/1669/1490 1303/1670/1491 +f 1148/1445/1315 1303/1670/1491 1149/1462/1330 +f 1149/1462/1330 1303/1670/1491 1304/1671/1492 +f 1149/1462/1330 1304/1671/1492 1150/1471/1338 +f 1150/1471/1338 1304/1671/1492 1305/1672/1493 +f 1150/1471/1338 1305/1672/1493 1151/1480/1346 +f 1151/1480/1346 1305/1672/1493 1306/1673/1494 +f 1151/1480/1346 1306/1673/1494 1152/1489/1354 +f 1152/1489/1354 1306/1673/1494 1307/1674/1495 +f 1152/1489/1354 1307/1674/1495 1153/1498/1362 +f 1153/1498/1362 1307/1674/1495 1308/1675/1496 +f 1153/1498/1362 1308/1675/1496 1154/1507/1370 +f 1154/1507/1370 1308/1675/1496 1494/1676/435 +f 1154/1507/1370 1494/1676/435 1493/1516/307 +f 1141/1598/1435 1142/1600/1437 1309/1677/1497 +f 1141/1598/1435 1309/1677/1497 1302/1669/1490 +f 1302/1669/1490 1309/1677/1497 1310/1678/1498 +f 1302/1669/1490 1310/1678/1498 1303/1670/1491 +f 1303/1670/1491 1310/1678/1498 1311/1679/1499 +f 1303/1670/1491 1311/1679/1499 1304/1671/1492 +f 1304/1671/1492 1311/1679/1499 1312/1680/1500 +f 1304/1671/1492 1312/1680/1500 1305/1672/1493 +f 1305/1672/1493 1312/1680/1500 1313/1681/1501 +f 1305/1672/1493 1313/1681/1501 1306/1673/1494 +f 1306/1673/1494 1313/1681/1501 1314/1682/1502 +f 1306/1673/1494 1314/1682/1502 1307/1674/1495 +f 1307/1674/1495 1314/1682/1502 1315/1683/1503 +f 1307/1674/1495 1315/1683/1503 1308/1675/1496 +f 1308/1675/1496 1315/1683/1503 1495/1684/436 +f 1308/1675/1496 1495/1684/436 1494/1676/435 +f 1142/1600/1437 1143/1602/1439 1316/1685/1504 +f 1142/1600/1437 1316/1685/1504 1309/1677/1497 +f 1309/1677/1497 1316/1685/1504 1317/1686/1505 +f 1309/1677/1497 1317/1686/1505 1310/1678/1498 +f 1310/1678/1498 1317/1686/1505 1318/1687/1506 +f 1310/1678/1498 1318/1687/1506 1311/1679/1499 +f 1311/1679/1499 1318/1687/1506 1319/1688/1507 +f 1311/1679/1499 1319/1688/1507 1312/1680/1500 +f 1312/1680/1500 1319/1688/1507 1320/1689/1508 +f 1312/1680/1500 1320/1689/1508 1313/1681/1501 +f 1313/1681/1501 1320/1689/1508 1321/1690/1509 +f 1313/1681/1501 1321/1690/1509 1314/1682/1502 +f 1314/1682/1502 1321/1690/1509 1322/1691/1510 +f 1314/1682/1502 1322/1691/1510 1315/1683/1503 +f 1315/1683/1503 1322/1691/1510 1496/1692/437 +f 1315/1683/1503 1496/1692/437 1495/1684/436 +f 1143/1602/1439 1144/1604/1441 1323/1693/1511 +f 1143/1602/1439 1323/1693/1511 1316/1685/1504 +f 1316/1685/1504 1323/1693/1511 1324/1694/1512 +f 1316/1685/1504 1324/1694/1512 1317/1686/1505 +f 1317/1686/1505 1324/1694/1512 1325/1695/1513 +f 1317/1686/1505 1325/1695/1513 1318/1687/1506 +f 1318/1687/1506 1325/1695/1513 1326/1696/1514 +f 1318/1687/1506 1326/1696/1514 1319/1688/1507 +f 1319/1688/1507 1326/1696/1514 1327/1697/1515 +f 1319/1688/1507 1327/1697/1515 1320/1689/1508 +f 1320/1689/1508 1327/1697/1515 1328/1698/1516 +f 1320/1689/1508 1328/1698/1516 1321/1690/1509 +f 1321/1690/1509 1328/1698/1516 1329/1699/1517 +f 1321/1690/1509 1329/1699/1517 1322/1691/1510 +f 1322/1691/1510 1329/1699/1517 1497/1700/438 +f 1322/1691/1510 1497/1700/438 1496/1692/437 +f 1144/1604/1441 1145/1606/1443 1330/1701/1518 +f 1144/1604/1441 1330/1701/1518 1323/1693/1511 +f 1323/1693/1511 1330/1701/1518 1331/1702/1519 +f 1323/1693/1511 1331/1702/1519 1324/1694/1512 +f 1324/1694/1512 1331/1702/1519 1332/1703/1520 +f 1324/1694/1512 1332/1703/1520 1325/1695/1513 +f 1325/1695/1513 1332/1703/1520 1333/1704/1521 +f 1325/1695/1513 1333/1704/1521 1326/1696/1514 +f 1326/1696/1514 1333/1704/1521 1334/1705/1522 +f 1326/1696/1514 1334/1705/1522 1327/1697/1515 +f 1327/1697/1515 1334/1705/1522 1335/1706/1523 +f 1327/1697/1515 1335/1706/1523 1328/1698/1516 +f 1328/1698/1516 1335/1706/1523 1336/1707/1524 +f 1328/1698/1516 1336/1707/1524 1329/1699/1517 +f 1329/1699/1517 1336/1707/1524 1498/1708/439 +f 1329/1699/1517 1498/1708/439 1497/1700/438 +f 1145/1606/1443 1146/1608/1445 1337/1709/1525 +f 1145/1606/1443 1337/1709/1525 1330/1701/1518 +f 1330/1701/1518 1337/1709/1525 1338/1710/1526 +f 1330/1701/1518 1338/1710/1526 1331/1702/1519 +f 1331/1702/1519 1338/1710/1526 1339/1711/1527 +f 1331/1702/1519 1339/1711/1527 1332/1703/1520 +f 1332/1703/1520 1339/1711/1527 1340/1712/1528 +f 1332/1703/1520 1340/1712/1528 1333/1704/1521 +f 1333/1704/1521 1340/1712/1528 1341/1713/1529 +f 1333/1704/1521 1341/1713/1529 1334/1705/1522 +f 1334/1705/1522 1341/1713/1529 1342/1714/1530 +f 1334/1705/1522 1342/1714/1530 1335/1706/1523 +f 1335/1706/1523 1342/1714/1530 1343/1715/1531 +f 1335/1706/1523 1343/1715/1531 1336/1707/1524 +f 1336/1707/1524 1343/1715/1531 1499/1716/440 +f 1336/1707/1524 1499/1716/440 1498/1708/439 +f 1146/1608/1445 1147/1610/1447 1344/1717/1532 +f 1146/1608/1445 1344/1717/1532 1337/1709/1525 +f 1337/1709/1525 1344/1717/1532 1345/1718/1533 +f 1337/1709/1525 1345/1718/1533 1338/1710/1526 +f 1338/1710/1526 1345/1718/1533 1346/1719/1534 +f 1338/1710/1526 1346/1719/1534 1339/1711/1527 +f 1339/1711/1527 1346/1719/1534 1347/1720/1535 +f 1339/1711/1527 1347/1720/1535 1340/1712/1528 +f 1340/1712/1528 1347/1720/1535 1348/1721/1536 +f 1340/1712/1528 1348/1721/1536 1341/1713/1529 +f 1341/1713/1529 1348/1721/1536 1349/1722/1537 +f 1341/1713/1529 1349/1722/1537 1342/1714/1530 +f 1342/1714/1530 1349/1722/1537 1350/1723/1538 +f 1342/1714/1530 1350/1723/1538 1343/1715/1531 +f 1343/1715/1531 1350/1723/1538 1500/1724/441 +f 1343/1715/1531 1500/1724/441 1499/1716/440 +f 1147/1610/1447 1463/1612/1209 1464/1725/1208 +f 1147/1610/1447 1464/1725/1208 1344/1717/1532 +f 1344/1717/1532 1464/1725/1208 1465/1726/1217 +f 1344/1717/1532 1465/1726/1217 1345/1718/1533 +f 1345/1718/1533 1465/1726/1217 1466/1727/1225 +f 1345/1718/1533 1466/1727/1225 1346/1719/1534 +f 1346/1719/1534 1466/1727/1225 1467/1728/1233 +f 1346/1719/1534 1467/1728/1233 1347/1720/1535 +f 1347/1720/1535 1467/1728/1233 1468/1729/1241 +f 1347/1720/1535 1468/1729/1241 1348/1721/1536 +f 1348/1721/1536 1468/1729/1241 1469/1730/1249 +f 1348/1721/1536 1469/1730/1249 1349/1722/1537 +f 1349/1722/1537 1469/1730/1249 1470/1731/1257 +f 1349/1722/1537 1470/1731/1257 1350/1723/1538 +f 1350/1723/1538 1470/1731/1257 1538/1732/442 +f 1350/1723/1538 1538/1732/442 1500/1724/441 diff --git a/res/models/asteroids/black.jpg b/res/models/asteroids/black.jpg new file mode 100644 index 0000000..9038737 Binary files /dev/null and b/res/models/asteroids/black.jpg differ diff --git a/res/models/asteroids/brown.jpg b/res/models/asteroids/brown.jpg new file mode 100644 index 0000000..fa4e541 Binary files /dev/null and b/res/models/asteroids/brown.jpg differ diff --git a/res/models/asteroids/limestone.jpg b/res/models/asteroids/limestone.jpg new file mode 100644 index 0000000..1c4ff92 Binary files /dev/null and b/res/models/asteroids/limestone.jpg differ diff --git a/res/models/asteroids/moon.jpg b/res/models/asteroids/moon.jpg new file mode 100644 index 0000000..3a45191 Binary files /dev/null and b/res/models/asteroids/moon.jpg differ diff --git a/res/models/asteroids/moon_big.jpg b/res/models/asteroids/moon_big.jpg new file mode 100644 index 0000000..8dcbc90 Binary files /dev/null and b/res/models/asteroids/moon_big.jpg differ diff --git a/res/models/asteroids/red.jpg b/res/models/asteroids/red.jpg new file mode 100644 index 0000000..6a8829e Binary files /dev/null and b/res/models/asteroids/red.jpg differ diff --git a/res/models/asteroids/shard01.mtl b/res/models/asteroids/shard01.mtl new file mode 100644 index 0000000..68c3da6 --- /dev/null +++ b/res/models/asteroids/shard01.mtl @@ -0,0 +1,14 @@ +# Blender MTL File: 'asteroid.blend' +# Material Count: 1 +newmtl Material +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 1 +map_Kd limestone.jpg +map_Bump limestone.jpg + + diff --git a/res/models/asteroids/shard01.obj b/res/models/asteroids/shard01.obj new file mode 100644 index 0000000..a23d9f3 --- /dev/null +++ b/res/models/asteroids/shard01.obj @@ -0,0 +1,2031 @@ +# Blender v2.63 (sub 0) OBJ File: 'asteroid.blend' +# www.blender.org +mtllib shard01.mtl +o Cube +v 0.001883 -0.304788 -0.000000 +v 0.085701 -0.306295 -0.000000 +v 0.180010 -0.328036 -0.000000 +v 0.290116 -0.343478 0.000000 +v 0.001883 -0.337690 0.174244 +v 0.001883 -0.340600 0.345438 +v 0.001883 -0.236551 0.481482 +v -0.079935 -0.293818 -0.000000 +v -0.142671 -0.229576 -0.000000 +v -0.188345 -0.172614 -0.000000 +v 0.001883 -0.327670 -0.173448 +v 0.001883 -0.290843 -0.337020 +v 0.001883 -0.247585 -0.484633 +v 0.095157 -0.366590 -0.174136 +v 0.186832 -0.349440 -0.168604 +v 0.291978 -0.347639 -0.166181 +v 0.092656 -0.345968 -0.341609 +v 0.204377 -0.393925 -0.341374 +v 0.306336 -0.370323 -0.330678 +v 0.086196 -0.289681 -0.489777 +v 0.190185 -0.334966 -0.488033 +v 0.275042 -0.308596 -0.463477 +v 0.095609 -0.369342 0.174360 +v 0.089556 -0.328369 0.338585 +v 0.082860 -0.272839 0.484931 +v 0.191438 -0.362733 0.169763 +v 0.177245 -0.319126 0.327930 +v 0.168024 -0.279150 0.471574 +v 0.288617 -0.341830 0.165612 +v 0.252497 -0.279627 0.312857 +v 0.253156 -0.273874 0.452627 +v -0.080544 -0.300605 0.168764 +v -0.142296 -0.231758 0.158345 +v -0.180076 -0.160697 0.147878 +v -0.078220 -0.285385 0.331199 +v -0.135228 -0.213674 0.308976 +v -0.162846 -0.134948 0.284428 +v -0.069983 -0.226828 0.471689 +v -0.133935 -0.202774 0.449052 +v -0.171526 -0.150344 0.414027 +v -0.074612 -0.264522 -0.165826 +v -0.073325 -0.257593 -0.326424 +v -0.071580 -0.234895 -0.474011 +v -0.150711 -0.256048 -0.160463 +v -0.128470 -0.195042 -0.305627 +v -0.137368 -0.211419 -0.451601 +v -0.210523 -0.213332 -0.153032 +v -0.190645 -0.181777 -0.293630 +v -0.176545 -0.158307 -0.416515 +v 0.001883 0.447263 0.000000 +v 0.001883 0.420426 -0.170356 +v 0.001883 0.472907 -0.345547 +v 0.001883 0.413826 -0.494506 +v -0.086212 0.464620 0.000000 +v -0.169258 0.439216 0.000000 +v -0.223518 0.365603 -0.000000 +v 0.001883 0.391730 0.168077 +v 0.001883 0.307472 0.317557 +v 0.001883 0.250257 0.447798 +v 0.079068 0.396602 0.000000 +v 0.161859 0.406472 0.000000 +v 0.221323 0.355212 0.000000 +v 0.079911 0.405513 -0.166585 +v 0.085037 0.434377 -0.334176 +v 0.083081 0.405618 -0.485251 +v 0.158089 0.398141 -0.161371 +v 0.147600 0.369066 -0.313240 +v 0.159558 0.389492 -0.465285 +v 0.234699 0.380285 -0.156486 +v 0.210462 0.340483 -0.298943 +v 0.231051 0.370472 -0.441668 +v -0.082708 0.445435 -0.169835 +v -0.158166 0.409232 -0.162338 +v -0.206871 0.338687 -0.152413 +v -0.086250 0.462647 -0.339034 +v -0.173915 0.451995 -0.328146 +v -0.248867 0.411523 -0.312902 +v -0.080144 0.409806 -0.486456 +v -0.162204 0.405643 -0.470048 +v -0.242912 0.395264 -0.449415 +v -0.078134 0.417607 0.167570 +v -0.062075 0.325389 0.315449 +v -0.047986 0.247422 0.439724 +v -0.152305 0.392316 0.160864 +v -0.120844 0.305687 0.301849 +v -0.092061 0.228971 0.417951 +v -0.210019 0.344129 0.152946 +v -0.183909 0.302096 0.291400 +v -0.140071 0.232108 0.398433 +v 0.071320 0.353251 0.162330 +v 0.134743 0.330754 0.155497 +v 0.197591 0.316133 0.150206 +v 0.061222 0.299167 0.310944 +v 0.115951 0.281818 0.297559 +v 0.186644 0.300360 0.291059 +v 0.053801 0.257774 0.442704 +v 0.099924 0.239291 0.420994 +v 0.132217 0.213674 0.392674 +v 0.520738 0.065834 0.000000 +v 0.507882 0.065834 -0.180457 +v 0.493502 0.065834 -0.356124 +v 0.481869 0.065834 -0.527278 +v 0.474844 0.155698 0.000000 +v 0.402177 0.223258 0.000000 +v 0.349920 0.283428 0.000000 +v 0.454577 0.065834 0.175862 +v 0.364704 0.065834 0.332490 +v 0.369580 0.065834 0.492508 +v 0.538734 -0.036069 0.000000 +v 0.516112 -0.137207 0.000000 +v 0.463993 -0.228528 0.000000 +v 0.484950 -0.026253 -0.176215 +v 0.467287 -0.025288 -0.346843 +v 0.456136 -0.030193 -0.512895 +v 0.467220 -0.118155 -0.170948 +v 0.428801 -0.106057 -0.331302 +v 0.437811 -0.121532 -0.493323 +v 0.435496 -0.210089 -0.166177 +v 0.411272 -0.197566 -0.321598 +v 0.406517 -0.205475 -0.468063 +v 0.476058 0.156203 -0.175430 +v 0.373927 0.211869 -0.162129 +v 0.320968 0.264020 -0.154023 +v 0.487918 0.161223 -0.350688 +v 0.445120 0.244676 -0.334482 +v 0.359736 0.293325 -0.310623 +v 0.456910 0.162040 -0.513136 +v 0.386697 0.229373 -0.476983 +v 0.354961 0.298986 -0.450603 +v 0.414011 0.144222 0.169952 +v 0.315877 0.125633 0.318625 +v 0.341907 0.135300 0.477253 +v 0.359378 0.205950 0.160755 +v 0.301614 0.183549 0.306514 +v 0.288621 0.183654 0.445630 +v 0.310752 0.257086 0.152940 +v 0.267254 0.228888 0.290928 +v 0.224108 0.202142 0.406291 +v 0.493616 -0.027926 0.176981 +v 0.512781 -0.136689 0.175255 +v 0.456982 -0.224673 0.168458 +v 0.387282 -0.008737 0.331932 +v 0.382362 -0.086276 0.322251 +v 0.374701 -0.172085 0.313810 +v 0.376561 -0.011691 0.488066 +v 0.362771 -0.086552 0.469334 +v 0.364615 -0.174464 0.453873 +v 0.001883 0.065834 0.811092 +v 0.057018 0.065834 0.748299 +v 0.106506 0.065834 0.707113 +v 0.193118 0.065834 0.678804 +v 0.001883 0.113467 0.752498 +v 0.001883 0.100553 0.641944 +v 0.001882 0.117237 0.591573 +v -0.079379 0.065834 0.823957 +v -0.167335 0.065834 0.795014 +v -0.243561 0.065834 0.722632 +v 0.001883 -0.011994 0.833424 +v 0.001883 -0.088728 0.792716 +v 0.001883 -0.186440 0.741558 +v 0.064171 0.011802 0.760534 +v 0.122219 0.015392 0.719825 +v 0.199801 0.008784 0.675453 +v 0.070530 -0.059661 0.746436 +v 0.147793 -0.066802 0.722990 +v 0.214651 -0.062602 0.660922 +v 0.081177 -0.157943 0.710667 +v 0.157330 -0.151334 0.677682 +v 0.245557 -0.163504 0.639373 +v 0.043133 0.097131 0.701105 +v 0.035535 0.116859 0.654343 +v 0.037957 0.153105 0.609737 +v 0.090599 0.098895 0.677521 +v 0.073197 0.117745 0.627984 +v 0.083191 0.163110 0.591627 +v 0.162480 0.109041 0.645575 +v 0.139040 0.139456 0.602155 +v 0.128211 0.168053 0.553795 +v -0.058354 0.117648 0.754739 +v -0.145849 0.131332 0.756476 +v -0.227241 0.134457 0.700435 +v -0.038682 0.131569 0.672534 +v -0.108405 0.159919 0.677620 +v -0.189357 0.178661 0.644189 +v -0.029728 0.139006 0.599312 +v -0.087600 0.176330 0.601116 +v -0.156915 0.203226 0.577474 +v -0.094192 -0.024707 0.855974 +v -0.087602 -0.104000 0.801269 +v -0.090761 -0.200104 0.741840 +v -0.200225 -0.029553 0.829225 +v -0.180084 -0.105819 0.768910 +v -0.176783 -0.188880 0.704632 +v -0.274082 -0.020163 0.737934 +v -0.263274 -0.100580 0.701639 +v -0.235909 -0.157132 0.635083 +v -0.320358 0.065834 -0.000000 +v -0.245928 0.065834 0.158201 +v -0.293804 0.065834 0.320170 +v -0.302839 0.065834 0.473008 +v -0.326932 0.128539 -0.000000 +v -0.315256 0.189965 -0.000000 +v -0.302787 0.254242 -0.000000 +v -0.331566 0.065834 -0.165583 +v -0.370975 0.065834 -0.334331 +v -0.356366 0.065834 -0.489583 +v -0.280538 0.011870 -0.000000 +v -0.251791 -0.032888 -0.000000 +v -0.239203 -0.079785 -0.000000 +v -0.238159 0.020673 0.154758 +v -0.241636 0.020613 0.305490 +v -0.277376 0.010496 0.458292 +v -0.240521 -0.027462 0.149875 +v -0.215975 -0.017007 0.290557 +v -0.228186 -0.025571 0.427513 +v -0.202891 -0.054764 0.141893 +v -0.198291 -0.051795 0.277042 +v -0.195167 -0.051843 0.397765 +v -0.267744 0.116706 0.157370 +v -0.309522 0.187200 0.156397 +v -0.284923 0.242111 0.150598 +v -0.320245 0.127315 0.320140 +v -0.343234 0.202881 0.315359 +v -0.310337 0.261530 0.300904 +v -0.330925 0.133622 0.475001 +v -0.326073 0.202868 0.458806 +v -0.261604 0.232679 0.420264 +v -0.341230 0.130896 -0.163859 +v -0.385271 0.140767 -0.332259 +v -0.384114 0.145989 -0.491597 +v -0.339198 0.199273 -0.159203 +v -0.379456 0.218310 -0.322419 +v -0.387211 0.231368 -0.478351 +v -0.308921 0.258400 -0.153145 +v -0.332672 0.277092 -0.305661 +v -0.362184 0.307119 -0.454325 +v -0.345444 -0.000042 -0.164231 +v -0.327035 -0.062657 -0.158053 +v -0.299577 -0.120390 -0.152153 +v -0.369200 -0.005776 -0.329264 +v -0.344080 -0.071574 -0.315524 +v -0.279084 -0.108087 -0.294249 +v -0.331280 -0.002038 -0.475112 +v -0.281795 -0.050560 -0.444651 +v -0.257965 -0.098319 -0.419031 +v 0.001883 0.065834 -0.835272 +v 0.091850 0.065834 -0.849170 +v 0.192922 0.065834 -0.824709 +v 0.298609 0.065834 -0.764095 +v 0.001883 -0.020291 -0.855662 +v 0.001883 -0.128548 -0.842813 +v 0.001883 -0.242751 -0.783604 +v -0.079314 0.065834 -0.823771 +v -0.149439 0.065834 -0.770661 +v -0.241046 0.065834 -0.720599 +v 0.001883 0.135153 -0.810622 +v 0.001883 0.228283 -0.802640 +v 0.001883 0.310714 -0.736037 +v 0.082126 0.139267 -0.811251 +v 0.174837 0.145196 -0.790220 +v 0.298389 0.159449 -0.754379 +v 0.089803 0.232339 -0.797153 +v 0.176044 0.229040 -0.758969 +v 0.287101 0.246790 -0.717232 +v 0.086514 0.306464 -0.723128 +v 0.176436 0.313898 -0.699858 +v 0.259570 0.310352 -0.649592 +v 0.101582 -0.028624 -0.866213 +v 0.106942 -0.137142 -0.842255 +v 0.105904 -0.236037 -0.768408 +v 0.208564 -0.032066 -0.835343 +v 0.194769 -0.117636 -0.782817 +v 0.197619 -0.216484 -0.724445 +v 0.281899 -0.021666 -0.741178 +v 0.272195 -0.104317 -0.705646 +v 0.263294 -0.182718 -0.652308 +v -0.089369 -0.019496 -0.842352 +v -0.160321 -0.007620 -0.775839 +v -0.243161 -0.008695 -0.713181 +v -0.093570 -0.116700 -0.816975 +v -0.170972 -0.095960 -0.757306 +v -0.218910 -0.068419 -0.667159 +v -0.093063 -0.207375 -0.747216 +v -0.153920 -0.151908 -0.678094 +v -0.209204 -0.128203 -0.615608 +v -0.085712 0.147211 -0.832019 +v -0.084389 0.228831 -0.792815 +v -0.076697 0.287354 -0.708999 +v -0.159027 0.138576 -0.774107 +v -0.155196 0.210555 -0.737214 +v -0.157048 0.288635 -0.681725 +v -0.237306 0.138191 -0.708493 +v -0.243865 0.218177 -0.686554 +v -0.231478 0.283999 -0.631852 +v 0.353563 -0.272108 -0.452877 +v 0.369366 -0.286012 -0.318186 +v 0.381378 -0.296799 -0.164352 +v 0.383630 -0.298368 0.000000 +v 0.377506 -0.292606 0.163857 +v 0.320729 -0.233335 0.305930 +v 0.318322 -0.233913 0.439284 +v 0.267146 -0.260562 -0.577162 +v 0.193210 -0.292223 -0.623193 +v 0.098231 -0.294974 -0.646412 +v 0.001883 -0.266818 -0.641953 +v -0.076284 -0.219165 -0.611350 +v -0.147896 -0.203972 -0.582541 +v -0.188968 -0.157000 -0.529733 +v 0.331311 -0.178260 -0.571405 +v 0.352764 -0.105360 -0.612061 +v 0.377328 -0.025585 -0.645253 +v 0.389732 0.065834 -0.659662 +v 0.368057 0.154644 -0.640607 +v 0.340841 0.230441 -0.606110 +v 0.305830 0.288424 -0.558757 +v 0.251464 -0.238737 0.567167 +v 0.154076 -0.209101 0.584904 +v 0.079478 -0.216783 0.610248 +v 0.001883 -0.246826 0.632693 +v -0.078862 -0.229913 0.616321 +v -0.154517 -0.218034 0.589019 +v -0.202712 -0.176127 0.538492 +v 0.315403 -0.164836 0.563509 +v 0.320243 -0.087394 0.595830 +v 0.335608 -0.013849 0.624348 +v 0.321407 0.065834 0.625373 +v 0.270053 0.127075 0.591499 +v 0.233712 0.171255 0.552644 +v 0.182341 0.184213 0.497459 +v -0.181635 -0.089849 0.388016 +v -0.178401 -0.083263 0.271014 +v -0.186580 -0.089965 0.139882 +v -0.213376 -0.118131 -0.000000 +v -0.261330 -0.170898 -0.149458 +v -0.230396 -0.139577 -0.284117 +v -0.213649 -0.124547 -0.400364 +v -0.230218 -0.096126 0.523093 +v -0.268526 -0.060902 0.571898 +v -0.281329 0.000361 0.599035 +v -0.298124 0.065834 0.615577 +v -0.294073 0.134891 0.605421 +v -0.249986 0.182326 0.562645 +v -0.207099 0.208284 0.511617 +v -0.245499 -0.109022 -0.530679 +v -0.262129 -0.057368 -0.568706 +v -0.270331 0.003455 -0.593525 +v -0.293968 0.065834 -0.613492 +v -0.334714 0.146324 -0.625787 +v -0.352899 0.239183 -0.614008 +v -0.326944 0.309420 -0.571107 +v 0.297882 0.343426 -0.431400 +v 0.290600 0.332371 -0.298338 +v 0.287678 0.327016 -0.152350 +v 0.284230 0.322427 0.000000 +v 0.269245 0.307058 0.149989 +v 0.226830 0.263303 0.282269 +v 0.165606 0.200062 0.380382 +v 0.242722 0.358237 -0.561594 +v 0.162731 0.359151 -0.593371 +v 0.081532 0.357011 -0.614208 +v 0.001883 0.353838 -0.621273 +v -0.075831 0.348945 -0.610477 +v -0.157567 0.356181 -0.592004 +v -0.230010 0.345786 -0.555892 +v 0.117683 0.184215 0.481896 +v 0.080281 0.184025 0.512702 +v 0.045480 0.206686 0.544682 +v 0.001883 0.196030 0.548181 +v -0.039181 0.196118 0.539794 +v -0.083169 0.198155 0.519210 +v -0.128564 0.204599 0.491231 +v -0.202276 0.243886 0.395977 +v -0.237792 0.279255 0.285980 +v -0.255042 0.295756 0.148652 +v -0.260999 0.301354 -0.000000 +v -0.253907 0.294528 -0.148507 +v -0.306542 0.353715 -0.303304 +v -0.320786 0.372331 -0.441687 +v 0.324598 -0.243855 -0.538837 +v 0.299805 -0.216965 0.526583 +v -0.203530 -0.116626 0.480859 +v -0.216077 -0.130235 -0.487061 +v 0.288574 0.336450 -0.521032 +v 0.141114 0.176512 0.448149 +v -0.169188 0.211046 0.463886 +v -0.283617 0.335157 -0.520443 +vt 0.500000 0.500000 +vt 0.499873 0.458461 +vt 0.541412 0.458333 +vt 0.541539 0.499873 +vt 0.582951 0.458206 +vt 0.583079 0.499745 +vt 0.624490 0.458079 +vt 0.624618 0.499618 +vt 0.666030 0.457951 +vt 0.666157 0.499490 +vt 0.499745 0.416922 +vt 0.541284 0.416794 +vt 0.582824 0.416667 +vt 0.624363 0.416539 +vt 0.665902 0.416412 +vt 0.499618 0.375382 +vt 0.541157 0.375255 +vt 0.582696 0.375128 +vt 0.624235 0.375000 +vt 0.665775 0.374873 +vt 0.499490 0.333843 +vt 0.541030 0.333716 +vt 0.582569 0.333588 +vt 0.624108 0.333461 +vt 0.665647 0.333333 +vt 0.541667 0.541412 +vt 0.500127 0.541539 +vt 0.541794 0.582951 +vt 0.500255 0.583079 +vt 0.541922 0.624490 +vt 0.500382 0.624618 +vt 0.542049 0.666030 +vt 0.500510 0.666157 +vt 0.583206 0.541285 +vt 0.583333 0.582824 +vt 0.583461 0.624363 +vt 0.583588 0.665902 +vt 0.624745 0.541157 +vt 0.624873 0.582696 +vt 0.625000 0.624236 +vt 0.625127 0.665775 +vt 0.666284 0.541030 +vt 0.666412 0.582569 +vt 0.666539 0.624108 +vt 0.666667 0.665647 +vt 0.458588 0.541667 +vt 0.458461 0.500128 +vt 0.417049 0.541794 +vt 0.416922 0.500255 +vt 0.375510 0.541922 +vt 0.375382 0.500382 +vt 0.333971 0.542049 +vt 0.333843 0.500510 +vt 0.458716 0.583206 +vt 0.417176 0.583333 +vt 0.375637 0.583461 +vt 0.334098 0.583588 +vt 0.458843 0.624745 +vt 0.417304 0.624873 +vt 0.375765 0.625000 +vt 0.334225 0.625128 +vt 0.458971 0.666285 +vt 0.417431 0.666412 +vt 0.375892 0.666539 +vt 0.334353 0.666667 +vt 0.458333 0.458588 +vt 0.458206 0.417049 +vt 0.458079 0.375510 +vt 0.457951 0.333971 +vt 0.416794 0.458716 +vt 0.416667 0.417177 +vt 0.416539 0.375637 +vt 0.416412 0.334098 +vt 0.375255 0.458843 +vt 0.375127 0.417304 +vt 0.375000 0.375765 +vt 0.374873 0.334226 +vt 0.333716 0.458971 +vt 0.333588 0.417431 +vt 0.333461 0.375892 +vt 0.333333 0.334353 +vt 0.833333 0.500000 +vt 0.833461 0.458461 +vt 0.875000 0.458588 +vt 0.874873 0.500127 +vt 0.916539 0.458716 +vt 0.916412 0.500255 +vt 0.958078 0.458843 +vt 0.957951 0.500382 +vt 0.999618 0.458971 +vt 0.999490 0.500510 +vt 0.833588 0.416922 +vt 0.875127 0.417049 +vt 0.916667 0.417176 +vt 0.958206 0.417304 +vt 0.999745 0.417431 +vt 0.833716 0.375382 +vt 0.875255 0.375510 +vt 0.916794 0.375637 +vt 0.958333 0.375765 +vt 0.999873 0.375892 +vt 0.833843 0.333843 +vt 0.875382 0.333971 +vt 0.916921 0.334098 +vt 0.958461 0.334225 +vt 1.000000 0.334353 +vt 0.874745 0.541667 +vt 0.833206 0.541539 +vt 0.874618 0.583206 +vt 0.833078 0.583079 +vt 0.874490 0.624745 +vt 0.832951 0.624618 +vt 0.874363 0.666284 +vt 0.832824 0.666157 +vt 0.916284 0.541794 +vt 0.916157 0.583333 +vt 0.916029 0.624873 +vt 0.915902 0.666412 +vt 0.957824 0.541922 +vt 0.957696 0.583461 +vt 0.957569 0.625000 +vt 0.957441 0.666539 +vt 0.999363 0.542049 +vt 0.999235 0.583588 +vt 0.999108 0.625127 +vt 0.998980 0.666667 +vt 0.791667 0.541412 +vt 0.791794 0.499873 +vt 0.750127 0.541284 +vt 0.750255 0.499745 +vt 0.708588 0.541157 +vt 0.708716 0.499618 +vt 0.667049 0.541030 +vt 0.667176 0.499490 +vt 0.791539 0.582951 +vt 0.750000 0.582824 +vt 0.708461 0.582696 +vt 0.666922 0.582569 +vt 0.791412 0.624490 +vt 0.749873 0.624363 +vt 0.708333 0.624235 +vt 0.666794 0.624108 +vt 0.791284 0.666030 +vt 0.749745 0.665902 +vt 0.708206 0.665775 +vt 0.791921 0.458333 +vt 0.792049 0.416794 +vt 0.792176 0.375255 +vt 0.792304 0.333716 +vt 0.750382 0.458206 +vt 0.750510 0.416667 +vt 0.750637 0.375128 +vt 0.750765 0.333588 +vt 0.708843 0.458079 +vt 0.708970 0.416539 +vt 0.709098 0.375000 +vt 0.709225 0.333461 +vt 0.667304 0.457951 +vt 0.667431 0.416412 +vt 0.667559 0.374873 +vt 0.667686 0.333333 +vt 0.833333 0.166667 +vt 0.833206 0.125127 +vt 0.874745 0.125000 +vt 0.874873 0.166539 +vt 0.916284 0.124873 +vt 0.916412 0.166412 +vt 0.957824 0.124745 +vt 0.957951 0.166284 +vt 0.999363 0.124618 +vt 0.999490 0.166157 +vt 0.833079 0.083588 +vt 0.874618 0.083461 +vt 0.916157 0.083333 +vt 0.957696 0.083206 +vt 0.999235 0.083078 +vt 0.832951 0.042049 +vt 0.874490 0.041922 +vt 0.916030 0.041794 +vt 0.957569 0.041667 +vt 0.999108 0.041539 +vt 0.832824 0.000510 +vt 0.874363 0.000382 +vt 0.915902 0.000255 +vt 0.957441 0.000127 +vt 0.998981 0.000000 +vt 0.875000 0.208078 +vt 0.833461 0.208206 +vt 0.875127 0.249618 +vt 0.833588 0.249745 +vt 0.875255 0.291157 +vt 0.833716 0.291284 +vt 0.875382 0.332696 +vt 0.833843 0.332824 +vt 0.916539 0.207951 +vt 0.916667 0.249490 +vt 0.916794 0.291030 +vt 0.916921 0.332569 +vt 0.958078 0.207824 +vt 0.958206 0.249363 +vt 0.958333 0.290902 +vt 0.958461 0.332441 +vt 0.999618 0.207696 +vt 0.999745 0.249235 +vt 0.999873 0.290775 +vt 1.000000 0.332314 +vt 0.791922 0.208333 +vt 0.791794 0.166794 +vt 0.750382 0.208461 +vt 0.750255 0.166922 +vt 0.708843 0.208588 +vt 0.708716 0.167049 +vt 0.667304 0.208716 +vt 0.667176 0.167176 +vt 0.792049 0.249873 +vt 0.750510 0.250000 +vt 0.708970 0.250128 +vt 0.667431 0.250255 +vt 0.792176 0.291412 +vt 0.750637 0.291539 +vt 0.709098 0.291667 +vt 0.667559 0.291794 +vt 0.792304 0.332951 +vt 0.750765 0.333079 +vt 0.709225 0.333206 +vt 0.791667 0.125255 +vt 0.791539 0.083716 +vt 0.791412 0.042176 +vt 0.791284 0.000637 +vt 0.750127 0.125382 +vt 0.750000 0.083843 +vt 0.749873 0.042304 +vt 0.749745 0.000765 +vt 0.708588 0.125510 +vt 0.708461 0.083971 +vt 0.708333 0.042431 +vt 0.708206 0.000892 +vt 0.667049 0.125637 +vt 0.666922 0.084098 +vt 0.666794 0.042559 +vt 0.666667 0.001019 +vt 0.500000 0.166667 +vt 0.500127 0.208206 +vt 0.458588 0.208333 +vt 0.458461 0.166794 +vt 0.417049 0.208461 +vt 0.416922 0.166922 +vt 0.375510 0.208588 +vt 0.375382 0.167049 +vt 0.333971 0.208716 +vt 0.333843 0.167176 +vt 0.500255 0.249745 +vt 0.458716 0.249873 +vt 0.417176 0.250000 +vt 0.375637 0.250128 +vt 0.334098 0.250255 +vt 0.500382 0.291284 +vt 0.458843 0.291412 +vt 0.417304 0.291539 +vt 0.375765 0.291667 +vt 0.334225 0.291794 +vt 0.500510 0.332824 +vt 0.458971 0.332951 +vt 0.417431 0.333079 +vt 0.375892 0.333206 +vt 0.334353 0.333333 +vt 0.458333 0.125255 +vt 0.499873 0.125127 +vt 0.458206 0.083716 +vt 0.499745 0.083588 +vt 0.458079 0.042176 +vt 0.499618 0.042049 +vt 0.457951 0.000637 +vt 0.499490 0.000510 +vt 0.416794 0.125382 +vt 0.416667 0.083843 +vt 0.416539 0.042304 +vt 0.416412 0.000765 +vt 0.375255 0.125510 +vt 0.375127 0.083971 +vt 0.375000 0.042431 +vt 0.374873 0.000892 +vt 0.333716 0.125637 +vt 0.333588 0.084098 +vt 0.333461 0.042559 +vt 0.333333 0.001020 +vt 0.541412 0.125000 +vt 0.541539 0.166539 +vt 0.582951 0.124873 +vt 0.583079 0.166412 +vt 0.624490 0.124745 +vt 0.624618 0.166284 +vt 0.666030 0.124618 +vt 0.666157 0.166157 +vt 0.541284 0.083461 +vt 0.582824 0.083333 +vt 0.624363 0.083206 +vt 0.665902 0.083078 +vt 0.541157 0.041922 +vt 0.582696 0.041794 +vt 0.624235 0.041667 +vt 0.665775 0.041539 +vt 0.541030 0.000382 +vt 0.582569 0.000255 +vt 0.624108 0.000127 +vt 0.665647 0.000000 +vt 0.541667 0.208079 +vt 0.541794 0.249618 +vt 0.541922 0.291157 +vt 0.542049 0.332696 +vt 0.583206 0.207951 +vt 0.583333 0.249490 +vt 0.583461 0.291030 +vt 0.583588 0.332569 +vt 0.624745 0.207824 +vt 0.624873 0.249363 +vt 0.625000 0.290902 +vt 0.625127 0.332441 +vt 0.666284 0.207696 +vt 0.666412 0.249235 +vt 0.666539 0.290775 +vt 0.666667 0.332314 +vt 0.166667 0.500000 +vt 0.166539 0.458461 +vt 0.208078 0.458333 +vt 0.208206 0.499873 +vt 0.249618 0.458206 +vt 0.249745 0.499745 +vt 0.291157 0.458079 +vt 0.291284 0.499618 +vt 0.332696 0.457951 +vt 0.332824 0.499490 +vt 0.166412 0.416922 +vt 0.207951 0.416794 +vt 0.249490 0.416667 +vt 0.291030 0.416539 +vt 0.332569 0.416412 +vt 0.166284 0.375382 +vt 0.207824 0.375255 +vt 0.249363 0.375128 +vt 0.290902 0.375000 +vt 0.332441 0.374873 +vt 0.166157 0.333843 +vt 0.207696 0.333716 +vt 0.249235 0.333588 +vt 0.290775 0.333461 +vt 0.332314 0.333333 +vt 0.208333 0.541412 +vt 0.166794 0.541539 +vt 0.208461 0.582951 +vt 0.166922 0.583079 +vt 0.208588 0.624490 +vt 0.167049 0.624618 +vt 0.208716 0.666030 +vt 0.167176 0.666157 +vt 0.249873 0.541285 +vt 0.250000 0.582824 +vt 0.250127 0.624363 +vt 0.250255 0.665902 +vt 0.291412 0.541157 +vt 0.291539 0.582696 +vt 0.291667 0.624236 +vt 0.291794 0.665775 +vt 0.332951 0.541030 +vt 0.333079 0.582569 +vt 0.333206 0.624108 +vt 0.333333 0.665647 +vt 0.125255 0.541667 +vt 0.125127 0.500128 +vt 0.083716 0.541794 +vt 0.083588 0.500255 +vt 0.042176 0.541922 +vt 0.042049 0.500382 +vt 0.000637 0.542049 +vt 0.000510 0.500510 +vt 0.125382 0.583206 +vt 0.083843 0.583333 +vt 0.042304 0.583461 +vt 0.000765 0.583588 +vt 0.125510 0.624745 +vt 0.083971 0.624873 +vt 0.042431 0.625000 +vt 0.000892 0.625128 +vt 0.125637 0.666285 +vt 0.084098 0.666412 +vt 0.042559 0.666539 +vt 0.001020 0.666667 +vt 0.125000 0.458588 +vt 0.124873 0.417049 +vt 0.124745 0.375510 +vt 0.124618 0.333971 +vt 0.083461 0.458716 +vt 0.083333 0.417177 +vt 0.083206 0.375637 +vt 0.083078 0.334098 +vt 0.041922 0.458843 +vt 0.041794 0.417304 +vt 0.041667 0.375765 +vt 0.041539 0.334226 +vt 0.000382 0.458971 +vt 0.000255 0.417431 +vt 0.000127 0.375892 +vt 0.000000 0.334353 +vt 0.166667 0.166667 +vt 0.166539 0.125128 +vt 0.208079 0.125000 +vt 0.208206 0.166539 +vt 0.249618 0.124873 +vt 0.249745 0.166412 +vt 0.291157 0.124745 +vt 0.291284 0.166284 +vt 0.332696 0.124618 +vt 0.332824 0.166157 +vt 0.166412 0.083588 +vt 0.207951 0.083461 +vt 0.249490 0.083333 +vt 0.291030 0.083206 +vt 0.332569 0.083078 +vt 0.166284 0.042049 +vt 0.207824 0.041922 +vt 0.249363 0.041794 +vt 0.290902 0.041667 +vt 0.332441 0.041539 +vt 0.166157 0.000510 +vt 0.207696 0.000382 +vt 0.249235 0.000255 +vt 0.290775 0.000127 +vt 0.332314 0.000000 +vt 0.208333 0.208079 +vt 0.166794 0.208206 +vt 0.208461 0.249618 +vt 0.166922 0.249745 +vt 0.208588 0.291157 +vt 0.167049 0.291284 +vt 0.208716 0.332696 +vt 0.167176 0.332824 +vt 0.249873 0.207951 +vt 0.250000 0.249490 +vt 0.250127 0.291030 +vt 0.250255 0.332569 +vt 0.291412 0.207824 +vt 0.291539 0.249363 +vt 0.291667 0.290902 +vt 0.291794 0.332441 +vt 0.332951 0.207696 +vt 0.333079 0.249235 +vt 0.333206 0.290775 +vt 0.333333 0.332314 +vt 0.125255 0.208333 +vt 0.125128 0.166794 +vt 0.083716 0.208461 +vt 0.083588 0.166922 +vt 0.042176 0.208588 +vt 0.042049 0.167049 +vt 0.000637 0.208716 +vt 0.000510 0.167177 +vt 0.125382 0.249873 +vt 0.083843 0.250000 +vt 0.042304 0.250128 +vt 0.000765 0.250255 +vt 0.125510 0.291412 +vt 0.083971 0.291539 +vt 0.042431 0.291667 +vt 0.000892 0.291794 +vt 0.125637 0.332951 +vt 0.084098 0.333079 +vt 0.042559 0.333206 +vt 0.001020 0.333333 +vt 0.125000 0.125255 +vt 0.124873 0.083716 +vt 0.124745 0.042176 +vt 0.124618 0.000637 +vt 0.083461 0.125382 +vt 0.083333 0.083843 +vt 0.083206 0.042304 +vt 0.083078 0.000765 +vt 0.041922 0.125510 +vt 0.041794 0.083971 +vt 0.041667 0.042431 +vt 0.041539 0.000892 +vt 0.000382 0.125637 +vt 0.000255 0.084098 +vt 0.000127 0.042559 +vt 0.000000 0.001020 +vn -0.279519 -0.959136 -0.043428 +vn -0.414228 -0.910031 -0.014954 +vn -0.217475 -0.971862 0.090091 +vn -0.135411 -0.990600 -0.018433 +vn -0.036653 -0.988952 0.143590 +vn -0.040498 -0.999023 -0.017029 +vn 0.304758 -0.948607 0.084933 +vn 0.228553 -0.973510 0.003601 +vn 0.702445 -0.709708 -0.053377 +vn 0.591601 -0.806177 -0.006409 +vn -0.449965 -0.872768 -0.189123 +vn -0.371563 -0.911740 -0.175054 +vn -0.006531 -0.991150 -0.132420 +vn 0.452559 -0.883572 -0.120182 +vn 0.770501 -0.626087 -0.119480 +vn -0.384381 -0.917905 -0.098239 +vn -0.361278 -0.918363 -0.161321 +vn 0.037782 -0.947539 -0.317362 +vn 0.457167 -0.809748 -0.367748 +vn 0.692953 -0.647298 -0.317423 +vn -0.326304 -0.941465 -0.084323 +vn -0.077334 -0.967101 -0.242317 +vn 0.312906 -0.869137 -0.382946 +vn 0.572436 -0.678213 -0.460768 +vn 0.603870 -0.616077 -0.505661 +vn -0.060823 -0.997589 -0.033021 +vn -0.270608 -0.960997 -0.056612 +vn -0.014039 -0.955718 0.293893 +vn -0.283731 -0.914701 0.287698 +vn 0.011841 -0.926084 0.377056 +vn -0.186529 -0.946348 0.263802 +vn 0.209357 -0.893002 0.398328 +vn 0.069247 -0.963744 0.257607 +vn 0.105472 -0.992218 0.066012 +vn 0.202826 -0.940947 0.271035 +vn 0.095431 -0.932066 0.349437 +vn 0.093814 -0.850887 0.516861 +vn 0.340709 -0.920103 0.193060 +vn 0.427198 -0.866451 0.258278 +vn 0.360576 -0.906644 0.218940 +vn 0.309122 -0.801935 0.511155 +vn 0.559648 -0.784143 0.268075 +vn 0.607166 -0.741050 0.286599 +vn 0.668416 -0.729331 0.145787 +vn 0.659902 -0.652150 0.373058 +vn -0.582171 -0.813044 -0.001526 +vn -0.484664 -0.873714 -0.040773 +vn -0.823206 -0.564379 0.061403 +vn -0.690848 -0.720176 0.063509 +vn -0.935728 -0.335246 0.109409 +vn -0.820917 -0.535264 0.198798 +vn -0.923826 -0.349254 0.156590 +vn -0.834864 -0.457930 0.305368 +vn -0.590625 -0.779717 0.207831 +vn -0.826075 -0.555986 0.091708 +vn -0.952544 -0.302103 0.036409 +vn -0.942259 -0.333262 0.032014 +vn -0.367443 -0.919553 0.139256 +vn -0.619404 -0.783898 -0.042634 +vn -0.887997 -0.429640 -0.163701 +vn -0.933226 -0.324778 -0.153478 +vn -0.166021 -0.979430 0.114444 +vn -0.408124 -0.912900 -0.004120 +vn -0.762535 -0.611286 -0.211768 +vn -0.899167 -0.312540 -0.306223 +vn -0.484939 -0.869381 -0.094729 +vn -0.493912 -0.859432 -0.131779 +vn -0.380047 -0.922086 -0.072665 +vn -0.431135 -0.898953 -0.077120 +vn -0.526597 -0.845119 -0.091830 +vn -0.524796 -0.838282 -0.147740 +vn -0.582781 -0.812586 -0.005707 +vn -0.575243 -0.810053 -0.113468 +vn -0.665242 -0.746513 -0.010376 +vn -0.603534 -0.764367 -0.226814 +vn -0.663869 -0.747398 -0.024934 +vn -0.705527 -0.708060 -0.028565 +vn -0.743034 -0.664693 0.077578 +vn -0.639088 -0.735557 -0.224708 +vn -0.614490 -0.783685 -0.090457 +vn -0.618183 -0.785455 0.030061 +vn 0.344859 0.934294 0.090274 +vn 0.257759 0.953825 0.154088 +vn 0.292581 0.955321 0.041475 +vn 0.257942 0.963927 0.065432 +vn 0.391919 0.919950 -0.006745 +vn 0.141240 0.987548 -0.069155 +vn 0.254311 0.933470 -0.252785 +vn 0.036653 0.928526 -0.369427 +vn 0.079165 0.924955 -0.371685 +vn -0.063478 0.908933 -0.412030 +vn 0.256142 0.946013 0.198462 +vn 0.308023 0.949767 -0.055055 +vn 0.397382 0.917600 -0.005921 +vn 0.297128 0.952025 -0.072756 +vn 0.158361 0.933836 -0.320719 +vn 0.451888 0.870724 0.193915 +vn 0.456587 0.888058 -0.053163 +vn 0.321268 0.946684 -0.023286 +vn 0.285348 0.957549 0.040712 +vn 0.410504 0.877438 -0.248024 +vn 0.569506 0.814264 0.112186 +vn 0.621387 0.783319 0.016114 +vn 0.493271 0.866970 0.070650 +vn 0.476150 0.879269 -0.012360 +vn 0.602496 0.771569 -0.204077 +vn -0.072146 0.996887 0.030885 +vn -0.056948 0.995727 0.072512 +vn -0.540452 0.838649 0.067446 +vn -0.576525 0.815851 0.044252 +vn -0.729820 0.670888 0.131291 +vn -0.791223 0.611469 0.004273 +vn -0.726646 0.668996 0.156133 +vn -0.769951 0.637867 0.016053 +vn -0.101108 0.991455 -0.082278 +vn -0.344615 0.938688 -0.008484 +vn -0.534349 0.829402 0.162847 +vn -0.721305 0.637745 0.270119 +vn -0.101749 0.918058 -0.383129 +vn -0.204260 0.914701 -0.348613 +vn -0.381298 0.882626 -0.274850 +vn -0.649037 0.751061 -0.120762 +vn -0.137181 0.874294 -0.465560 +vn -0.220008 0.841060 -0.494125 +vn -0.303507 0.824641 -0.477309 +vn -0.396222 0.805963 -0.439741 +vn -0.046968 0.910855 0.410016 +vn 0.340465 0.867580 0.362438 +vn -0.118229 0.838527 0.531816 +vn 0.173956 0.885983 0.429823 +vn -0.202643 0.860347 0.467666 +vn -0.037538 0.897580 0.439222 +vn 0.023896 0.841914 0.539018 +vn -0.147465 0.755425 0.638417 +vn -0.458113 0.805658 0.375530 +vn -0.327433 0.778344 0.535630 +vn -0.255257 0.858699 0.444349 +vn -0.008545 0.944578 0.328074 +vn -0.647511 0.716330 0.259896 +vn -0.328349 0.833552 0.444197 +vn -0.067965 0.892788 0.445265 +vn 0.053316 0.976897 0.206793 +vn -0.709189 0.696310 0.110385 +vn -0.381024 0.890011 0.250252 +vn -0.035340 0.931516 0.361888 +vn 0.072665 0.965148 0.251381 +vn 0.332377 0.877377 0.345988 +vn 0.214362 0.919370 0.329753 +vn 0.297189 0.912992 0.279427 +vn 0.493515 0.826807 0.269845 +vn 0.299844 0.883785 0.359142 +vn 0.263009 0.887387 0.378582 +vn 0.299051 0.846767 0.439894 +vn 0.446883 0.772240 0.451521 +vn 0.267495 0.868160 0.417982 +vn 0.492325 0.760094 0.424085 +vn 0.481674 0.710318 0.513260 +vn 0.291971 0.821131 0.490371 +vn 0.115177 0.831446 0.543504 +vn 0.419385 0.826075 0.376415 +vn 0.323222 0.902646 0.284066 +vn 0.193152 0.944792 0.264595 +vn 0.956267 0.275399 0.098239 +vn 0.999847 0.002350 -0.015992 +vn 0.960631 -0.206763 -0.185461 +vn 0.993957 0.075900 -0.079073 +vn 0.953093 -0.293435 -0.073763 +vn 0.996368 -0.044679 -0.072390 +vn 0.903989 -0.308878 -0.295572 +vn 0.938353 -0.013489 -0.345347 +vn 0.741234 -0.316630 -0.591845 +vn 0.798700 -0.005280 -0.601672 +vn 0.950285 -0.296823 -0.093905 +vn 0.925535 -0.299142 -0.232093 +vn 0.952147 -0.293802 -0.084048 +vn 0.882962 -0.373730 -0.284036 +vn 0.699728 -0.426984 -0.572741 +vn 0.801477 -0.593860 -0.070132 +vn 0.870785 -0.458022 -0.178625 +vn 0.916990 -0.385846 -0.100955 +vn 0.846217 -0.453047 -0.280404 +vn 0.668142 -0.476089 -0.571734 +vn 0.834681 0.549058 0.042634 +vn 0.786431 0.604572 0.126286 +vn 0.659108 0.747429 0.082949 +vn 0.679891 0.729606 0.073428 +vn 0.701682 0.710776 0.049196 +vn 0.702750 0.709586 0.050752 +vn 0.897641 0.438337 -0.045625 +vn 0.702689 0.710868 0.028748 +vn 0.639699 0.759331 0.118992 +vn 0.832545 0.440748 -0.335551 +vn 0.711570 0.643483 -0.282052 +vn 0.670309 0.719932 -0.179785 +vn 0.786706 0.373882 -0.491195 +vn 0.749992 0.566820 -0.340831 +vn 0.725791 0.625111 -0.287057 +vn 0.744560 0.547410 0.382031 +vn 0.831660 0.385876 0.399213 +vn 0.824488 0.531663 0.193640 +vn 0.886258 0.406171 0.222510 +vn 0.767083 0.621052 0.160710 +vn 0.918546 0.355144 0.173467 +vn 0.424726 0.721824 0.546373 +vn 0.659017 0.350597 0.665395 +vn 0.698477 0.628498 0.342112 +vn 0.694845 0.670461 0.260018 +vn 0.535569 0.826991 0.170904 +vn 0.216254 0.882382 0.417829 +vn 0.658773 0.686850 0.306955 +vn 0.494247 0.791589 0.359264 +vn 0.138157 0.956847 0.255562 +vn -0.018403 0.978271 0.206458 +vn 0.905911 0.141575 0.399030 +vn 0.904202 -0.231849 0.358623 +vn 0.743278 -0.589190 0.316813 +vn 0.941618 0.105533 0.319681 +vn 0.917936 -0.108768 0.381451 +vn 0.817469 -0.445021 0.365551 +vn 0.981750 -0.029695 0.187811 +vn 0.965484 -0.145146 0.216163 +vn 0.908933 -0.358440 0.212836 +vn 0.729911 -0.109745 0.674612 +vn 0.754875 -0.217566 0.618702 +vn 0.777856 -0.340129 0.528398 +vn 0.418622 0.511979 0.750053 +vn 0.463118 -0.067171 0.883724 +vn 0.634938 0.090976 0.767144 +vn 0.600482 0.516098 0.610736 +vn 0.493881 0.147526 0.856899 +vn 0.399365 0.533006 0.745903 +vn 0.453597 0.024201 0.890866 +vn 0.336283 0.406812 0.849330 +vn 0.408948 -0.399365 0.820490 +vn 0.520188 -0.206671 0.828639 +vn 0.473403 -0.118137 0.872860 +vn 0.511460 -0.146977 0.846614 +vn 0.274361 -0.684500 0.675375 +vn 0.419691 -0.583605 0.695120 +vn 0.336711 -0.557543 0.758782 +vn 0.438124 -0.466048 0.768639 +vn 0.264351 0.909085 0.321879 +vn 0.352611 0.868038 0.349498 +vn -0.066378 0.933775 0.351573 +vn 0.091128 0.970702 0.222266 +vn -0.130375 0.749901 0.648518 +vn -0.063967 0.812006 0.580096 +vn 0.184606 0.839564 0.510910 +vn 0.168554 0.810389 0.561083 +vn 0.271310 0.800043 0.535051 +vn 0.152257 0.764397 0.626453 +vn 0.084994 0.829890 0.551378 +vn 0.067873 0.937315 0.341746 +vn 0.164220 0.870846 0.463271 +vn -0.015412 0.535295 0.844508 +vn -0.156072 0.777276 0.609455 +vn -0.398358 0.499313 0.769402 +vn -0.542283 0.640828 0.543352 +vn -0.777764 0.316813 0.542833 +vn -0.841121 0.381390 0.383404 +vn -0.968291 -0.021424 0.248878 +vn 0.409589 0.893948 0.181768 +vn 0.188086 0.921964 0.338450 +vn -0.181402 0.916074 0.357555 +vn -0.449019 0.822077 0.350047 +vn 0.410749 0.792108 0.451430 +vn 0.273782 0.910367 0.310190 +vn 0.020936 0.974670 0.222571 +vn -0.080203 0.968535 0.235511 +vn -0.044160 -0.124973 0.991150 +vn -0.043214 -0.549608 0.834284 +vn -0.137242 -0.778985 0.611774 +vn -0.517380 -0.102817 0.849513 +vn -0.458113 -0.567370 0.684225 +vn -0.461287 -0.778954 0.424696 +vn -0.892087 -0.062899 0.447401 +vn -0.844874 -0.453566 0.283547 +vn -0.781762 -0.622333 0.038545 +vn -0.977233 -0.211188 0.019257 +vn -0.911008 -0.376232 -0.168737 +vn -0.864009 -0.405469 -0.298441 +vn -0.937925 -0.238258 0.251991 +vn -0.899991 -0.320231 0.295694 +vn -0.915952 -0.383404 0.118320 +vn -0.907285 -0.414380 0.071169 +vn -0.837886 -0.535691 -0.104434 +vn -0.868313 -0.472579 -0.150578 +vn -0.858852 -0.493606 -0.136570 +vn -0.932493 -0.361034 -0.007447 +vn -0.873165 -0.379070 0.306284 +vn -0.874966 -0.462233 0.143895 +vn -0.834895 -0.550371 -0.002350 +vn -0.802301 -0.552080 -0.226875 +vn -0.815577 -0.467025 0.341563 +vn -0.816706 -0.554674 0.159032 +vn -0.826716 -0.561571 0.033937 +vn -0.858608 -0.483444 -0.170324 +vn -0.947050 -0.319590 0.030152 +vn -0.975097 -0.116581 0.188635 +vn -0.998779 0.011109 -0.047700 +vn -0.983337 0.128849 0.128178 +vn -0.839259 0.543565 -0.011353 +vn -0.860622 0.504044 0.072207 +vn -0.936644 -0.328379 -0.121799 +vn -0.975066 0.219581 -0.031434 +vn -0.610889 0.788873 0.066805 +vn -0.986999 -0.011902 0.160253 +vn -0.768120 0.575488 0.280618 +vn -0.228736 0.925565 0.301614 +vn -0.984039 -0.045228 0.172033 +vn -0.977996 -0.102969 0.181341 +vn -0.989105 -0.098453 0.109409 +vn -0.988495 -0.144322 0.044954 +vn -0.966277 -0.180181 -0.183782 +vn -0.906980 -0.329508 -0.262215 +vn -0.816614 -0.142705 -0.559221 +vn -0.850124 -0.298563 -0.433699 +vn -0.952605 0.243690 0.181982 +vn -0.954650 0.243629 0.170995 +vn -0.974517 0.202704 -0.095798 +vn -0.763604 0.293161 -0.575243 +vn -0.825220 0.537828 0.172399 +vn -0.849055 0.472335 0.236549 +vn -0.848384 0.527512 -0.043580 +vn -0.570147 0.677511 -0.464614 +vn -0.952483 -0.189215 0.238624 +vn -0.865963 -0.435255 0.246162 +vn -0.785852 -0.596454 0.163244 +vn -0.959868 -0.274911 -0.055361 +vn -0.787896 -0.604114 -0.119205 +vn -0.613727 -0.771508 -0.167455 +vn -0.846919 -0.443159 -0.293771 +vn -0.780114 -0.580035 -0.234321 +vn -0.637776 -0.758354 -0.134465 +vn -0.865322 -0.388623 -0.316416 +vn -0.854488 -0.460311 -0.240669 +vn -0.785974 -0.609180 -0.105380 +vn -0.070894 0.236610 -0.968993 +vn 0.019654 0.223182 -0.974548 +vn 0.100772 0.302561 -0.947783 +vn 0.061129 0.305490 -0.950194 +vn 0.277688 0.326395 -0.903500 +vn 0.375072 0.213721 -0.902005 +vn 0.580889 0.317423 -0.749504 +vn 0.650563 0.042116 -0.758232 +vn -0.013428 0.454237 -0.890744 +vn 0.171514 0.422864 -0.889798 +vn 0.271462 0.473434 -0.837916 +vn 0.564989 0.539476 -0.624287 +vn -0.091403 0.810694 -0.578234 +vn 0.116398 0.797327 -0.592181 +vn 0.203681 0.787805 -0.581225 +vn 0.500443 0.751640 -0.429579 +vn 0.130284 -0.040193 -0.990631 +vn -0.135563 0.024323 -0.990448 +vn 0.238136 -0.400342 -0.884854 +vn -0.153478 -0.350017 -0.924070 +vn 0.205664 -0.743339 -0.636494 +vn -0.224525 -0.782495 -0.580737 +vn 0.534410 -0.167455 -0.828455 +vn 0.598468 -0.410779 -0.687796 +vn 0.553819 -0.591083 -0.586383 +vn 0.695578 -0.279946 -0.661611 +vn 0.695486 -0.413892 -0.587329 +vn 0.682913 -0.480789 -0.549944 +vn -0.421155 0.025056 -0.906613 +vn -0.340861 0.111820 -0.933409 +vn -0.653645 -0.042604 -0.755577 +vn -0.589373 0.034059 -0.807123 +vn -0.812159 -0.225440 -0.538072 +vn -0.723960 -0.081027 -0.685049 +vn -0.510025 -0.347148 -0.786950 +vn -0.737236 -0.388256 -0.552904 +vn -0.824458 -0.435865 -0.360912 +vn -0.555712 -0.722739 -0.410810 +vn -0.695608 -0.656880 -0.290902 +vn -0.771447 -0.589007 -0.240638 +vn -0.290201 0.167669 -0.942137 +vn -0.319254 0.524400 -0.789331 +vn -0.274789 0.771142 -0.574297 +vn -0.595599 0.142216 -0.790551 +vn -0.509690 0.474593 -0.717582 +vn -0.332377 0.702597 -0.629139 +vn -0.634877 0.056185 -0.770531 +vn -0.497513 0.379009 -0.780236 +vn -0.362133 0.679647 -0.637867 +g Cube_Cube_Material +usemtl Material +s 1 +f 1/1/1 11/2/2 14/3/3 +f 1/1/1 14/3/3 2/4/4 +f 2/4/4 14/3/3 15/5/5 +f 2/4/4 15/5/5 3/6/6 +f 3/6/6 15/5/5 16/7/7 +f 3/6/6 16/7/7 4/8/8 +f 4/8/8 16/7/7 297/9/9 +f 4/8/8 297/9/9 298/10/10 +f 11/2/2 12/11/11 17/12/12 +f 11/2/2 17/12/12 14/3/3 +f 14/3/3 17/12/12 18/13/13 +f 14/3/3 18/13/13 15/5/5 +f 15/5/5 18/13/13 19/14/14 +f 15/5/5 19/14/14 16/7/7 +f 16/7/7 19/14/14 296/15/15 +f 16/7/7 296/15/15 297/9/9 +f 12/11/11 13/16/16 20/17/17 +f 12/11/11 20/17/17 17/12/12 +f 17/12/12 20/17/17 21/18/18 +f 17/12/12 21/18/18 18/13/13 +f 18/13/13 21/18/18 22/19/19 +f 18/13/13 22/19/19 19/14/14 +f 19/14/14 22/19/19 295/20/20 +f 19/14/14 295/20/20 296/15/15 +f 13/16/16 305/21/21 304/22/22 +f 13/16/16 304/22/22 20/17/17 +f 20/17/17 304/22/22 303/23/23 +f 20/17/17 303/23/23 21/18/18 +f 21/18/18 303/23/23 302/24/24 +f 21/18/18 302/24/24 22/19/19 +f 22/19/19 302/24/24 379/25/25 +f 22/19/19 379/25/25 295/20/20 +f 1/1/1 2/4/4 23/26/26 +f 1/1/1 23/26/26 5/27/27 +f 5/27/27 23/26/26 24/28/28 +f 5/27/27 24/28/28 6/29/29 +f 6/29/29 24/28/28 25/30/30 +f 6/29/29 25/30/30 7/31/31 +f 7/31/31 25/30/30 318/32/32 +f 7/31/31 318/32/32 319/33/33 +f 2/4/4 3/6/6 26/34/34 +f 2/4/4 26/34/34 23/26/26 +f 23/26/26 26/34/34 27/35/35 +f 23/26/26 27/35/35 24/28/28 +f 24/28/28 27/35/35 28/36/36 +f 24/28/28 28/36/36 25/30/30 +f 25/30/30 28/36/36 317/37/37 +f 25/30/30 317/37/37 318/32/32 +f 3/6/6 4/8/8 29/38/38 +f 3/6/6 29/38/38 26/34/34 +f 26/34/34 29/38/38 30/39/39 +f 26/34/34 30/39/39 27/35/35 +f 27/35/35 30/39/39 31/40/40 +f 27/35/35 31/40/40 28/36/36 +f 28/36/36 31/40/40 316/41/41 +f 28/36/36 316/41/41 317/37/37 +f 4/8/8 298/10/10 299/42/42 +f 4/8/8 299/42/42 29/38/38 +f 29/38/38 299/42/42 300/43/43 +f 29/38/38 300/43/43 30/39/39 +f 30/39/39 300/43/43 301/44/44 +f 30/39/39 301/44/44 31/40/40 +f 31/40/40 301/44/44 380/45/45 +f 31/40/40 380/45/45 316/41/41 +f 1/1/1 5/27/27 32/46/46 +f 1/1/1 32/46/46 8/47/47 +f 8/47/47 32/46/46 33/48/48 +f 8/47/47 33/48/48 9/49/49 +f 9/49/49 33/48/48 34/50/50 +f 9/49/49 34/50/50 10/51/51 +f 10/51/51 34/50/50 332/52/52 +f 10/51/51 332/52/52 333/53/53 +f 5/27/27 6/29/29 35/54/54 +f 5/27/27 35/54/54 32/46/46 +f 32/46/46 35/54/54 36/55/55 +f 32/46/46 36/55/55 33/48/48 +f 33/48/48 36/55/55 37/56/56 +f 33/48/48 37/56/56 34/50/50 +f 34/50/50 37/56/56 331/57/57 +f 34/50/50 331/57/57 332/52/52 +f 6/29/29 7/31/31 38/58/58 +f 6/29/29 38/58/58 35/54/54 +f 35/54/54 38/58/58 39/59/59 +f 35/54/54 39/59/59 36/55/55 +f 36/55/55 39/59/59 40/60/60 +f 36/55/55 40/60/60 37/56/56 +f 37/56/56 40/60/60 330/61/61 +f 37/56/56 330/61/61 331/57/57 +f 7/31/31 319/33/33 320/62/62 +f 7/31/31 320/62/62 38/58/58 +f 38/58/58 320/62/62 321/63/63 +f 38/58/58 321/63/63 39/59/59 +f 39/59/59 321/63/63 322/64/64 +f 39/59/59 322/64/64 40/60/60 +f 40/60/60 322/64/64 381/65/65 +f 40/60/60 381/65/65 330/61/61 +f 1/1/1 8/47/47 41/66/66 +f 1/1/1 41/66/66 11/2/2 +f 11/2/2 41/66/66 42/67/67 +f 11/2/2 42/67/67 12/11/11 +f 12/11/11 42/67/67 43/68/68 +f 12/11/11 43/68/68 13/16/16 +f 13/16/16 43/68/68 306/69/69 +f 13/16/16 306/69/69 305/21/21 +f 8/47/47 9/49/49 44/70/70 +f 8/47/47 44/70/70 41/66/66 +f 41/66/66 44/70/70 45/71/71 +f 41/66/66 45/71/71 42/67/67 +f 42/67/67 45/71/71 46/72/72 +f 42/67/67 46/72/72 43/68/68 +f 43/68/68 46/72/72 307/73/73 +f 43/68/68 307/73/73 306/69/69 +f 9/49/49 10/51/51 47/74/74 +f 9/49/49 47/74/74 44/70/70 +f 44/70/70 47/74/74 48/75/75 +f 44/70/70 48/75/75 45/71/71 +f 45/71/71 48/75/75 49/76/76 +f 45/71/71 49/76/76 46/72/72 +f 46/72/72 49/76/76 308/77/77 +f 46/72/72 308/77/77 307/73/73 +f 10/51/51 333/53/53 334/78/78 +f 10/51/51 334/78/78 47/74/74 +f 47/74/74 334/78/78 335/79/79 +f 47/74/74 335/79/79 48/75/75 +f 48/75/75 335/79/79 336/80/80 +f 48/75/75 336/80/80 49/76/76 +f 49/76/76 336/80/80 382/81/81 +f 49/76/76 382/81/81 308/77/77 +f 50/82/82 60/83/83 63/84/84 +f 50/82/82 63/84/84 51/85/85 +f 51/85/85 63/84/84 64/86/86 +f 51/85/85 64/86/86 52/87/87 +f 52/87/87 64/86/86 65/88/88 +f 52/87/87 65/88/88 53/89/89 +f 53/89/89 65/88/88 360/90/90 +f 53/89/89 360/90/90 361/91/91 +f 60/83/83 61/92/92 66/93/93 +f 60/83/83 66/93/93 63/84/84 +f 63/84/84 66/93/93 67/94/94 +f 63/84/84 67/94/94 64/86/86 +f 64/86/86 67/94/94 68/95/95 +f 64/86/86 68/95/95 65/88/88 +f 65/88/88 68/95/95 359/96/96 +f 65/88/88 359/96/96 360/90/90 +f 61/92/92 62/97/97 69/98/98 +f 61/92/92 69/98/98 66/93/93 +f 66/93/93 69/98/98 70/99/99 +f 66/93/93 70/99/99 67/94/94 +f 67/94/94 70/99/99 71/100/100 +f 67/94/94 71/100/100 68/95/95 +f 68/95/95 71/100/100 358/101/101 +f 68/95/95 358/101/101 359/96/96 +f 62/97/97 354/102/102 353/103/103 +f 62/97/97 353/103/103 69/98/98 +f 69/98/98 353/103/103 352/104/104 +f 69/98/98 352/104/104 70/99/99 +f 70/99/99 352/104/104 351/105/105 +f 70/99/99 351/105/105 71/100/100 +f 71/100/100 351/105/105 383/106/106 +f 71/100/100 383/106/106 358/101/101 +f 50/82/82 51/85/85 72/107/107 +f 50/82/82 72/107/107 54/108/108 +f 54/108/108 72/107/107 73/109/109 +f 54/108/108 73/109/109 55/110/110 +f 55/110/110 73/109/109 74/111/111 +f 55/110/110 74/111/111 56/112/112 +f 56/112/112 74/111/111 376/113/113 +f 56/112/112 376/113/113 375/114/114 +f 51/85/85 52/87/87 75/115/115 +f 51/85/85 75/115/115 72/107/107 +f 72/107/107 75/115/115 76/116/116 +f 72/107/107 76/116/116 73/109/109 +f 73/109/109 76/116/116 77/117/117 +f 73/109/109 77/117/117 74/111/111 +f 74/111/111 77/117/117 377/118/118 +f 74/111/111 377/118/118 376/113/113 +f 52/87/87 53/89/89 78/119/119 +f 52/87/87 78/119/119 75/115/115 +f 75/115/115 78/119/119 79/120/120 +f 75/115/115 79/120/120 76/116/116 +f 76/116/116 79/120/120 80/121/121 +f 76/116/116 80/121/121 77/117/117 +f 77/117/117 80/121/121 378/122/122 +f 77/117/117 378/122/122 377/118/118 +f 53/89/89 361/91/91 362/123/123 +f 53/89/89 362/123/123 78/119/119 +f 78/119/119 362/123/123 363/124/124 +f 78/119/119 363/124/124 79/120/120 +f 79/120/120 363/124/124 364/125/125 +f 79/120/120 364/125/125 80/121/121 +f 80/121/121 364/125/125 386/126/126 +f 80/121/121 386/126/126 378/122/122 +f 50/82/82 54/108/108 81/127/127 +f 50/82/82 81/127/127 57/128/128 +f 57/128/128 81/127/127 82/129/129 +f 57/128/128 82/129/129 58/130/130 +f 58/130/130 82/129/129 83/131/131 +f 58/130/130 83/131/131 59/132/132 +f 59/132/132 83/131/131 369/133/133 +f 59/132/132 369/133/133 368/134/134 +f 54/108/108 55/110/110 84/135/135 +f 54/108/108 84/135/135 81/127/127 +f 81/127/127 84/135/135 85/136/136 +f 81/127/127 85/136/136 82/129/129 +f 82/129/129 85/136/136 86/137/137 +f 82/129/129 86/137/137 83/131/131 +f 83/131/131 86/137/137 370/138/138 +f 83/131/131 370/138/138 369/133/133 +f 55/110/110 56/112/112 87/139/139 +f 55/110/110 87/139/139 84/135/135 +f 84/135/135 87/139/139 88/140/140 +f 84/135/135 88/140/140 85/136/136 +f 85/136/136 88/140/140 89/141/141 +f 85/136/136 89/141/141 86/137/137 +f 86/137/137 89/141/141 371/142/142 +f 86/137/137 371/142/142 370/138/138 +f 56/112/112 375/114/114 374/143/143 +f 56/112/112 374/143/143 87/139/139 +f 87/139/139 374/143/143 373/144/144 +f 87/139/139 373/144/144 88/140/140 +f 88/140/140 373/144/144 372/145/145 +f 88/140/140 372/145/145 89/141/141 +f 89/141/141 372/145/145 385/45/146 +f 89/141/141 385/45/146 371/142/142 +f 50/82/82 57/128/128 90/146/147 +f 50/82/82 90/146/147 60/83/83 +f 60/83/83 90/146/147 91/147/148 +f 60/83/83 91/147/148 61/92/92 +f 61/92/92 91/147/148 92/148/149 +f 61/92/92 92/148/149 62/97/97 +f 62/97/97 92/148/149 355/149/150 +f 62/97/97 355/149/150 354/102/102 +f 57/128/128 58/130/130 93/150/151 +f 57/128/128 93/150/151 90/146/147 +f 90/146/147 93/150/151 94/151/152 +f 90/146/147 94/151/152 91/147/148 +f 91/147/148 94/151/152 95/152/153 +f 91/147/148 95/152/153 92/148/149 +f 92/148/149 95/152/153 356/153/154 +f 92/148/149 356/153/154 355/149/150 +f 58/130/130 59/132/132 96/154/155 +f 58/130/130 96/154/155 93/150/151 +f 93/150/151 96/154/155 97/155/156 +f 93/150/151 97/155/156 94/151/152 +f 94/151/152 97/155/156 98/156/157 +f 94/151/152 98/156/157 95/152/153 +f 95/152/153 98/156/157 357/157/158 +f 95/152/153 357/157/158 356/153/154 +f 59/132/132 368/134/134 367/158/159 +f 59/132/132 367/158/159 96/154/155 +f 96/154/155 367/158/159 366/159/160 +f 96/154/155 366/159/160 97/155/156 +f 97/155/156 366/159/160 365/160/161 +f 97/155/156 365/160/161 98/156/157 +f 98/156/157 365/160/161 384/161/162 +f 98/156/157 384/161/162 357/157/158 +f 99/162/163 109/163/164 112/164/165 +f 99/162/163 112/164/165 100/165/166 +f 100/165/166 112/164/165 113/166/167 +f 100/165/166 113/166/167 101/167/168 +f 101/167/168 113/166/167 114/168/169 +f 101/167/168 114/168/169 102/169/170 +f 102/169/170 114/168/169 311/170/171 +f 102/169/170 311/170/171 312/171/172 +f 109/163/164 110/172/173 115/173/174 +f 109/163/164 115/173/174 112/164/165 +f 112/164/165 115/173/174 116/174/175 +f 112/164/165 116/174/175 113/166/167 +f 113/166/167 116/174/175 117/175/176 +f 113/166/167 117/175/176 114/168/169 +f 114/168/169 117/175/176 310/176/177 +f 114/168/169 310/176/177 311/170/171 +f 110/172/173 111/177/178 118/178/179 +f 110/172/173 118/178/179 115/173/174 +f 115/173/174 118/178/179 119/179/180 +f 115/173/174 119/179/180 116/174/175 +f 116/174/175 119/179/180 120/180/181 +f 116/174/175 120/180/181 117/175/176 +f 117/175/176 120/180/181 309/181/182 +f 117/175/176 309/181/182 310/176/177 +f 111/177/178 298/182/10 297/183/9 +f 111/177/178 297/183/9 118/178/179 +f 118/178/179 297/183/9 296/184/15 +f 118/178/179 296/184/15 119/179/180 +f 119/179/180 296/184/15 295/185/20 +f 119/179/180 295/185/20 120/180/181 +f 120/180/181 295/185/20 379/186/25 +f 120/180/181 379/186/25 309/181/182 +f 99/162/163 100/165/166 121/187/183 +f 99/162/163 121/187/183 103/188/184 +f 103/188/184 121/187/183 122/189/185 +f 103/188/184 122/189/185 104/190/186 +f 104/190/186 122/189/185 123/191/187 +f 104/190/186 123/191/187 105/192/188 +f 105/192/188 123/191/187 353/193/103 +f 105/192/188 353/193/103 354/194/102 +f 100/165/166 101/167/168 124/195/189 +f 100/165/166 124/195/189 121/187/183 +f 121/187/183 124/195/189 125/196/190 +f 121/187/183 125/196/190 122/189/185 +f 122/189/185 125/196/190 126/197/191 +f 122/189/185 126/197/191 123/191/187 +f 123/191/187 126/197/191 352/198/104 +f 123/191/187 352/198/104 353/193/103 +f 101/167/168 102/169/170 127/199/192 +f 101/167/168 127/199/192 124/195/189 +f 124/195/189 127/199/192 128/200/193 +f 124/195/189 128/200/193 125/196/190 +f 125/196/190 128/200/193 129/201/194 +f 125/196/190 129/201/194 126/197/191 +f 126/197/191 129/201/194 351/202/105 +f 126/197/191 351/202/105 352/198/104 +f 102/169/170 312/171/172 313/203/195 +f 102/169/170 313/203/195 127/199/192 +f 127/199/192 313/203/195 314/204/196 +f 127/199/192 314/204/196 128/200/193 +f 128/200/193 314/204/196 315/205/197 +f 128/200/193 315/205/197 129/201/194 +f 129/201/194 315/205/197 383/206/106 +f 129/201/194 383/206/106 351/202/105 +f 99/162/163 103/188/184 130/207/198 +f 99/162/163 130/207/198 106/208/199 +f 106/208/199 130/207/198 131/209/200 +f 106/208/199 131/209/200 107/210/201 +f 107/210/201 131/209/200 132/211/202 +f 107/210/201 132/211/202 108/212/203 +f 108/212/203 132/211/202 327/213/204 +f 108/212/203 327/213/204 326/214/205 +f 103/188/184 104/190/186 133/215/206 +f 103/188/184 133/215/206 130/207/198 +f 130/207/198 133/215/206 134/216/207 +f 130/207/198 134/216/207 131/209/200 +f 131/209/200 134/216/207 135/217/208 +f 131/209/200 135/217/208 132/211/202 +f 132/211/202 135/217/208 328/218/209 +f 132/211/202 328/218/209 327/213/204 +f 104/190/186 105/192/188 136/219/210 +f 104/190/186 136/219/210 133/215/206 +f 133/215/206 136/219/210 137/220/211 +f 133/215/206 137/220/211 134/216/207 +f 134/216/207 137/220/211 138/221/212 +f 134/216/207 138/221/212 135/217/208 +f 135/217/208 138/221/212 329/222/213 +f 135/217/208 329/222/213 328/218/209 +f 105/192/188 354/194/102 355/223/150 +f 105/192/188 355/223/150 136/219/210 +f 136/219/210 355/223/150 356/224/154 +f 136/219/210 356/224/154 137/220/211 +f 137/220/211 356/224/154 357/225/158 +f 137/220/211 357/225/158 138/221/212 +f 138/221/212 357/225/158 384/161/162 +f 138/221/212 384/161/162 329/222/213 +f 99/162/163 106/208/199 139/226/214 +f 99/162/163 139/226/214 109/163/164 +f 109/163/164 139/226/214 140/227/215 +f 109/163/164 140/227/215 110/172/173 +f 110/172/173 140/227/215 141/228/216 +f 110/172/173 141/228/216 111/177/178 +f 111/177/178 141/228/216 299/229/42 +f 111/177/178 299/229/42 298/182/10 +f 106/208/199 107/210/201 142/230/217 +f 106/208/199 142/230/217 139/226/214 +f 139/226/214 142/230/217 143/231/218 +f 139/226/214 143/231/218 140/227/215 +f 140/227/215 143/231/218 144/232/219 +f 140/227/215 144/232/219 141/228/216 +f 141/228/216 144/232/219 300/233/43 +f 141/228/216 300/233/43 299/229/42 +f 107/210/201 108/212/203 145/234/220 +f 107/210/201 145/234/220 142/230/217 +f 142/230/217 145/234/220 146/235/221 +f 142/230/217 146/235/221 143/231/218 +f 143/231/218 146/235/221 147/236/222 +f 143/231/218 147/236/222 144/232/219 +f 144/232/219 147/236/222 301/237/44 +f 144/232/219 301/237/44 300/233/43 +f 108/212/203 326/214/205 325/238/223 +f 108/212/203 325/238/223 145/234/220 +f 145/234/220 325/238/223 324/239/224 +f 145/234/220 324/239/224 146/235/221 +f 146/235/221 324/239/224 323/240/225 +f 146/235/221 323/240/225 147/236/222 +f 147/236/222 323/240/225 380/241/45 +f 147/236/222 380/241/45 301/237/44 +f 148/242/226 158/243/227 161/244/228 +f 148/242/226 161/244/228 149/245/229 +f 149/245/229 161/244/228 162/246/230 +f 149/245/229 162/246/230 150/247/231 +f 150/247/231 162/246/230 163/248/232 +f 150/247/231 163/248/232 151/249/233 +f 151/249/233 163/248/232 325/250/223 +f 151/249/233 325/250/223 326/251/205 +f 158/243/227 159/252/234 164/253/235 +f 158/243/227 164/253/235 161/244/228 +f 161/244/228 164/253/235 165/254/236 +f 161/244/228 165/254/236 162/246/230 +f 162/246/230 165/254/236 166/255/237 +f 162/246/230 166/255/237 163/248/232 +f 163/248/232 166/255/237 324/256/224 +f 163/248/232 324/256/224 325/250/223 +f 159/252/234 160/257/238 167/258/239 +f 159/252/234 167/258/239 164/253/235 +f 164/253/235 167/258/239 168/259/240 +f 164/253/235 168/259/240 165/254/236 +f 165/254/236 168/259/240 169/260/241 +f 165/254/236 169/260/241 166/255/237 +f 166/255/237 169/260/241 323/261/225 +f 166/255/237 323/261/225 324/256/224 +f 160/257/238 319/262/33 318/263/32 +f 160/257/238 318/263/32 167/258/239 +f 167/258/239 318/263/32 317/264/37 +f 167/258/239 317/264/37 168/259/240 +f 168/259/240 317/264/37 316/265/41 +f 168/259/240 316/265/41 169/260/241 +f 169/260/241 316/265/41 380/266/45 +f 169/260/241 380/266/45 323/261/225 +f 148/242/226 149/245/229 170/267/242 +f 148/242/226 170/267/242 152/268/243 +f 152/268/243 170/267/242 171/269/244 +f 152/268/243 171/269/244 153/270/245 +f 153/270/245 171/269/244 172/271/246 +f 153/270/245 172/271/246 154/272/247 +f 154/272/247 172/271/246 367/273/159 +f 154/272/247 367/273/159 368/274/134 +f 149/245/229 150/247/231 173/275/248 +f 149/245/229 173/275/248 170/267/242 +f 170/267/242 173/275/248 174/276/249 +f 170/267/242 174/276/249 171/269/244 +f 171/269/244 174/276/249 175/277/250 +f 171/269/244 175/277/250 172/271/246 +f 172/271/246 175/277/250 366/278/160 +f 172/271/246 366/278/160 367/273/159 +f 150/247/231 151/249/233 176/279/251 +f 150/247/231 176/279/251 173/275/248 +f 173/275/248 176/279/251 177/280/252 +f 173/275/248 177/280/252 174/276/249 +f 174/276/249 177/280/252 178/281/253 +f 174/276/249 178/281/253 175/277/250 +f 175/277/250 178/281/253 365/282/161 +f 175/277/250 365/282/161 366/278/160 +f 151/249/233 326/251/205 327/283/204 +f 151/249/233 327/283/204 176/279/251 +f 176/279/251 327/283/204 328/284/209 +f 176/279/251 328/284/209 177/280/252 +f 177/280/252 328/284/209 329/285/213 +f 177/280/252 329/285/213 178/281/253 +f 178/281/253 329/285/213 384/286/162 +f 178/281/253 384/286/162 365/282/161 +f 148/242/226 152/268/243 179/287/254 +f 148/242/226 179/287/254 155/288/255 +f 155/288/255 179/287/254 180/289/256 +f 155/288/255 180/289/256 156/290/257 +f 156/290/257 180/289/256 181/291/258 +f 156/290/257 181/291/258 157/292/259 +f 157/292/259 181/291/258 341/293/260 +f 157/292/259 341/293/260 340/294/261 +f 152/268/243 153/270/245 182/295/262 +f 152/268/243 182/295/262 179/287/254 +f 179/287/254 182/295/262 183/296/263 +f 179/287/254 183/296/263 180/289/256 +f 180/289/256 183/296/263 184/297/264 +f 180/289/256 184/297/264 181/291/258 +f 181/291/258 184/297/264 342/298/265 +f 181/291/258 342/298/265 341/293/260 +f 153/270/245 154/272/247 185/299/266 +f 153/270/245 185/299/266 182/295/262 +f 182/295/262 185/299/266 186/300/267 +f 182/295/262 186/300/267 183/296/263 +f 183/296/263 186/300/267 187/301/268 +f 183/296/263 187/301/268 184/297/264 +f 184/297/264 187/301/268 343/302/269 +f 184/297/264 343/302/269 342/298/265 +f 154/272/247 368/274/134 369/303/133 +f 154/272/247 369/303/133 185/299/266 +f 185/299/266 369/303/133 370/304/138 +f 185/299/266 370/304/138 186/300/267 +f 186/300/267 370/304/138 371/305/142 +f 186/300/267 371/305/142 187/301/268 +f 187/301/268 371/305/142 385/306/146 +f 187/301/268 385/306/146 343/302/269 +f 148/242/226 155/288/255 188/307/270 +f 148/242/226 188/307/270 158/243/227 +f 158/243/227 188/307/270 189/308/271 +f 158/243/227 189/308/271 159/252/234 +f 159/252/234 189/308/271 190/309/272 +f 159/252/234 190/309/272 160/257/238 +f 160/257/238 190/309/272 320/310/62 +f 160/257/238 320/310/62 319/262/33 +f 155/288/255 156/290/257 191/311/273 +f 155/288/255 191/311/273 188/307/270 +f 188/307/270 191/311/273 192/312/274 +f 188/307/270 192/312/274 189/308/271 +f 189/308/271 192/312/274 193/313/275 +f 189/308/271 193/313/275 190/309/272 +f 190/309/272 193/313/275 321/314/63 +f 190/309/272 321/314/63 320/310/62 +f 156/290/257 157/292/259 194/315/276 +f 156/290/257 194/315/276 191/311/273 +f 191/311/273 194/315/276 195/316/277 +f 191/311/273 195/316/277 192/312/274 +f 192/312/274 195/316/277 196/317/278 +f 192/312/274 196/317/278 193/313/275 +f 193/313/275 196/317/278 322/318/64 +f 193/313/275 322/318/64 321/314/63 +f 157/292/259 340/294/261 339/319/279 +f 157/292/259 339/319/279 194/315/276 +f 194/315/276 339/319/279 338/320/280 +f 194/315/276 338/320/280 195/316/277 +f 195/316/277 338/320/280 337/321/281 +f 195/316/277 337/321/281 196/317/278 +f 196/317/278 337/321/281 381/322/65 +f 196/317/278 381/322/65 322/318/64 +f 197/323/282 207/324/283 210/325/284 +f 197/323/282 210/325/284 198/326/285 +f 198/326/285 210/325/284 211/327/286 +f 198/326/285 211/327/286 199/328/287 +f 199/328/287 211/327/286 212/329/288 +f 199/328/287 212/329/288 200/330/289 +f 200/330/289 212/329/288 339/331/279 +f 200/330/289 339/331/279 340/332/261 +f 207/324/283 208/333/290 213/334/291 +f 207/324/283 213/334/291 210/325/284 +f 210/325/284 213/334/291 214/335/292 +f 210/325/284 214/335/292 211/327/286 +f 211/327/286 214/335/292 215/336/293 +f 211/327/286 215/336/293 212/329/288 +f 212/329/288 215/336/293 338/337/280 +f 212/329/288 338/337/280 339/331/279 +f 208/333/290 209/338/294 216/339/295 +f 208/333/290 216/339/295 213/334/291 +f 213/334/291 216/339/295 217/340/296 +f 213/334/291 217/340/296 214/335/292 +f 214/335/292 217/340/296 218/341/297 +f 214/335/292 218/341/297 215/336/293 +f 215/336/293 218/341/297 337/342/281 +f 215/336/293 337/342/281 338/337/280 +f 209/338/294 333/343/53 332/344/52 +f 209/338/294 332/344/52 216/339/295 +f 216/339/295 332/344/52 331/345/57 +f 216/339/295 331/345/57 217/340/296 +f 217/340/296 331/345/57 330/346/61 +f 217/340/296 330/346/61 218/341/297 +f 218/341/297 330/346/61 381/347/65 +f 218/341/297 381/347/65 337/342/281 +f 197/323/282 198/326/285 219/348/298 +f 197/323/282 219/348/298 201/349/299 +f 201/349/299 219/348/298 220/350/300 +f 201/349/299 220/350/300 202/351/301 +f 202/351/301 220/350/300 221/352/302 +f 202/351/301 221/352/302 203/353/303 +f 203/353/303 221/352/302 374/354/143 +f 203/353/303 374/354/143 375/355/114 +f 198/326/285 199/328/287 222/356/304 +f 198/326/285 222/356/304 219/348/298 +f 219/348/298 222/356/304 223/357/305 +f 219/348/298 223/357/305 220/350/300 +f 220/350/300 223/357/305 224/358/306 +f 220/350/300 224/358/306 221/352/302 +f 221/352/302 224/358/306 373/359/144 +f 221/352/302 373/359/144 374/354/143 +f 199/328/287 200/330/289 225/360/307 +f 199/328/287 225/360/307 222/356/304 +f 222/356/304 225/360/307 226/361/308 +f 222/356/304 226/361/308 223/357/305 +f 223/357/305 226/361/308 227/362/309 +f 223/357/305 227/362/309 224/358/306 +f 224/358/306 227/362/309 372/363/145 +f 224/358/306 372/363/145 373/359/144 +f 200/330/289 340/332/261 341/364/260 +f 200/330/289 341/364/260 225/360/307 +f 225/360/307 341/364/260 342/365/265 +f 225/360/307 342/365/265 226/361/308 +f 226/361/308 342/365/265 343/366/269 +f 226/361/308 343/366/269 227/362/309 +f 227/362/309 343/366/269 385/367/146 +f 227/362/309 385/367/146 372/363/145 +f 197/323/282 201/349/299 228/368/310 +f 197/323/282 228/368/310 204/369/311 +f 204/369/311 228/368/310 229/370/312 +f 204/369/311 229/370/312 205/371/313 +f 205/371/313 229/370/312 230/372/314 +f 205/371/313 230/372/314 206/373/315 +f 206/373/315 230/372/314 348/374/316 +f 206/373/315 348/374/316 347/375/317 +f 201/349/299 202/351/301 231/376/318 +f 201/349/299 231/376/318 228/368/310 +f 228/368/310 231/376/318 232/377/319 +f 228/368/310 232/377/319 229/370/312 +f 229/370/312 232/377/319 233/378/320 +f 229/370/312 233/378/320 230/372/314 +f 230/372/314 233/378/320 349/379/321 +f 230/372/314 349/379/321 348/374/316 +f 202/351/301 203/353/303 234/380/322 +f 202/351/301 234/380/322 231/376/318 +f 231/376/318 234/380/322 235/381/323 +f 231/376/318 235/381/323 232/377/319 +f 232/377/319 235/381/323 236/382/324 +f 232/377/319 236/382/324 233/378/320 +f 233/378/320 236/382/324 350/383/325 +f 233/378/320 350/383/325 349/379/321 +f 203/353/303 375/355/114 376/384/113 +f 203/353/303 376/384/113 234/380/322 +f 234/380/322 376/384/113 377/385/118 +f 234/380/322 377/385/118 235/381/323 +f 235/381/323 377/385/118 378/386/122 +f 235/381/323 378/386/122 236/382/324 +f 236/382/324 378/386/122 386/387/126 +f 236/382/324 386/387/126 350/383/325 +f 197/323/282 204/369/311 237/388/326 +f 197/323/282 237/388/326 207/324/283 +f 207/324/283 237/388/326 238/389/327 +f 207/324/283 238/389/327 208/333/290 +f 208/333/290 238/389/327 239/390/328 +f 208/333/290 239/390/328 209/338/294 +f 209/338/294 239/390/328 334/391/78 +f 209/338/294 334/391/78 333/343/53 +f 204/369/311 205/371/313 240/392/329 +f 204/369/311 240/392/329 237/388/326 +f 237/388/326 240/392/329 241/393/330 +f 237/388/326 241/393/330 238/389/327 +f 238/389/327 241/393/330 242/394/331 +f 238/389/327 242/394/331 239/390/328 +f 239/390/328 242/394/331 335/395/79 +f 239/390/328 335/395/79 334/391/78 +f 205/371/313 206/373/315 243/396/332 +f 205/371/313 243/396/332 240/392/329 +f 240/392/329 243/396/332 244/397/333 +f 240/392/329 244/397/333 241/393/330 +f 241/393/330 244/397/333 245/398/334 +f 241/393/330 245/398/334 242/394/331 +f 242/394/331 245/398/334 336/399/80 +f 242/394/331 336/399/80 335/395/79 +f 206/373/315 347/375/317 346/400/335 +f 206/373/315 346/400/335 243/396/332 +f 243/396/332 346/400/335 345/401/336 +f 243/396/332 345/401/336 244/397/333 +f 244/397/333 345/401/336 344/402/337 +f 244/397/333 344/402/337 245/398/334 +f 245/398/334 344/402/337 382/403/81 +f 245/398/334 382/403/81 336/399/80 +f 246/404/338 256/405/339 259/406/340 +f 246/404/338 259/406/340 247/407/341 +f 247/407/341 259/406/340 260/408/342 +f 247/407/341 260/408/342 248/409/343 +f 248/409/343 260/408/342 261/410/344 +f 248/409/343 261/410/344 249/411/345 +f 249/411/345 261/410/344 313/412/195 +f 249/411/345 313/412/195 312/413/172 +f 256/405/339 257/414/346 262/415/347 +f 256/405/339 262/415/347 259/406/340 +f 259/406/340 262/415/347 263/416/348 +f 259/406/340 263/416/348 260/408/342 +f 260/408/342 263/416/348 264/417/349 +f 260/408/342 264/417/349 261/410/344 +f 261/410/344 264/417/349 314/418/196 +f 261/410/344 314/418/196 313/412/195 +f 257/414/346 258/419/350 265/420/351 +f 257/414/346 265/420/351 262/415/347 +f 262/415/347 265/420/351 266/421/352 +f 262/415/347 266/421/352 263/416/348 +f 263/416/348 266/421/352 267/422/353 +f 263/416/348 267/422/353 264/417/349 +f 264/417/349 267/422/353 315/423/197 +f 264/417/349 315/423/197 314/418/196 +f 258/419/350 361/424/91 360/425/90 +f 258/419/350 360/425/90 265/420/351 +f 265/420/351 360/425/90 359/426/96 +f 265/420/351 359/426/96 266/421/352 +f 266/421/352 359/426/96 358/427/101 +f 266/421/352 358/427/101 267/422/353 +f 267/422/353 358/427/101 383/428/106 +f 267/422/353 383/428/106 315/423/197 +f 246/404/338 247/407/341 268/429/354 +f 246/404/338 268/429/354 250/430/355 +f 250/430/355 268/429/354 269/431/356 +f 250/430/355 269/431/356 251/432/357 +f 251/432/357 269/431/356 270/433/358 +f 251/432/357 270/433/358 252/434/359 +f 252/434/359 270/433/358 304/435/22 +f 252/434/359 304/435/22 305/436/21 +f 247/407/341 248/409/343 271/437/360 +f 247/407/341 271/437/360 268/429/354 +f 268/429/354 271/437/360 272/438/361 +f 268/429/354 272/438/361 269/431/356 +f 269/431/356 272/438/361 273/439/362 +f 269/431/356 273/439/362 270/433/358 +f 270/433/358 273/439/362 303/440/23 +f 270/433/358 303/440/23 304/435/22 +f 248/409/343 249/411/345 274/441/363 +f 248/409/343 274/441/363 271/437/360 +f 271/437/360 274/441/363 275/442/364 +f 271/437/360 275/442/364 272/438/361 +f 272/438/361 275/442/364 276/443/365 +f 272/438/361 276/443/365 273/439/362 +f 273/439/362 276/443/365 302/444/24 +f 273/439/362 302/444/24 303/440/23 +f 249/411/345 312/413/172 311/445/171 +f 249/411/345 311/445/171 274/441/363 +f 274/441/363 311/445/171 310/446/177 +f 274/441/363 310/446/177 275/442/364 +f 275/442/364 310/446/177 309/447/182 +f 275/442/364 309/447/182 276/443/365 +f 276/443/365 309/447/182 379/448/25 +f 276/443/365 379/448/25 302/444/24 +f 246/404/338 250/430/355 277/449/366 +f 246/404/338 277/449/366 253/450/367 +f 253/450/367 277/449/366 278/451/368 +f 253/450/367 278/451/368 254/452/369 +f 254/452/369 278/451/368 279/453/370 +f 254/452/369 279/453/370 255/454/371 +f 255/454/371 279/453/370 346/455/335 +f 255/454/371 346/455/335 347/456/317 +f 250/430/355 251/432/357 280/457/372 +f 250/430/355 280/457/372 277/449/366 +f 277/449/366 280/457/372 281/458/373 +f 277/449/366 281/458/373 278/451/368 +f 278/451/368 281/458/373 282/459/374 +f 278/451/368 282/459/374 279/453/370 +f 279/453/370 282/459/374 345/460/336 +f 279/453/370 345/460/336 346/455/335 +f 251/432/357 252/434/359 283/461/375 +f 251/432/357 283/461/375 280/457/372 +f 280/457/372 283/461/375 284/462/376 +f 280/457/372 284/462/376 281/458/373 +f 281/458/373 284/462/376 285/463/377 +f 281/458/373 285/463/377 282/459/374 +f 282/459/374 285/463/377 344/464/337 +f 282/459/374 344/464/337 345/460/336 +f 252/434/359 305/436/21 306/465/69 +f 252/434/359 306/465/69 283/461/375 +f 283/461/375 306/465/69 307/466/73 +f 283/461/375 307/466/73 284/462/376 +f 284/462/376 307/466/73 308/467/77 +f 284/462/376 308/467/77 285/463/377 +f 285/463/377 308/467/77 382/468/81 +f 285/463/377 382/468/81 344/464/337 +f 246/404/338 253/450/367 286/469/378 +f 246/404/338 286/469/378 256/405/339 +f 256/405/339 286/469/378 287/470/379 +f 256/405/339 287/470/379 257/414/346 +f 257/414/346 287/470/379 288/471/380 +f 257/414/346 288/471/380 258/419/350 +f 258/419/350 288/471/380 362/472/123 +f 258/419/350 362/472/123 361/424/91 +f 253/450/367 254/452/369 289/473/381 +f 253/450/367 289/473/381 286/469/378 +f 286/469/378 289/473/381 290/474/382 +f 286/469/378 290/474/382 287/470/379 +f 287/470/379 290/474/382 291/475/383 +f 287/470/379 291/475/383 288/471/380 +f 288/471/380 291/475/383 363/476/124 +f 288/471/380 363/476/124 362/472/123 +f 254/452/369 255/454/371 292/477/384 +f 254/452/369 292/477/384 289/473/381 +f 289/473/381 292/477/384 293/478/385 +f 289/473/381 293/478/385 290/474/382 +f 290/474/382 293/478/385 294/479/386 +f 290/474/382 294/479/386 291/475/383 +f 291/475/383 294/479/386 364/480/125 +f 291/475/383 364/480/125 363/476/124 +f 255/454/371 347/456/317 348/481/316 +f 255/454/371 348/481/316 292/477/384 +f 292/477/384 348/481/316 349/482/321 +f 292/477/384 349/482/321 293/478/385 +f 293/478/385 349/482/321 350/483/325 +f 293/478/385 350/483/325 294/479/386 +f 294/479/386 350/483/325 386/484/126 +f 294/479/386 386/484/126 364/480/125 diff --git a/res/models/asteroids/shard02.mtl b/res/models/asteroids/shard02.mtl new file mode 100644 index 0000000..68c3da6 --- /dev/null +++ b/res/models/asteroids/shard02.mtl @@ -0,0 +1,14 @@ +# Blender MTL File: 'asteroid.blend' +# Material Count: 1 +newmtl Material +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 1 +map_Kd limestone.jpg +map_Bump limestone.jpg + + diff --git a/res/models/asteroids/shard02.obj b/res/models/asteroids/shard02.obj new file mode 100644 index 0000000..ff51fcd --- /dev/null +++ b/res/models/asteroids/shard02.obj @@ -0,0 +1,2031 @@ +# Blender v2.63 (sub 0) OBJ File: 'asteroid.blend' +# www.blender.org +mtllib shard02.mtl +o Cube +v 0.001883 -0.439893 -0.000000 +v 0.109845 -0.456830 -0.000000 +v 0.216013 -0.433622 -0.000000 +v 0.297150 -0.355743 0.000000 +v 0.001883 -0.433651 0.181867 +v 0.001883 -0.384256 0.352825 +v 0.001883 -0.313646 0.503497 +v -0.102555 -0.434854 -0.000000 +v -0.213762 -0.438064 -0.000000 +v -0.310889 -0.386261 -0.000000 +v 0.001883 -0.480823 -0.185615 +v 0.001883 -0.362316 -0.349113 +v 0.001883 -0.263706 -0.489236 +v 0.109491 -0.453787 -0.181236 +v 0.214265 -0.428623 -0.175508 +v 0.273450 -0.315609 -0.163045 +v 0.093271 -0.349462 -0.342210 +v 0.169963 -0.299050 -0.324322 +v 0.230685 -0.242884 -0.305637 +v 0.082357 -0.270296 -0.484199 +v 0.166150 -0.274430 -0.470182 +v 0.223361 -0.226604 -0.437856 +v 0.101876 -0.407466 0.177464 +v 0.093643 -0.351573 0.342572 +v 0.088890 -0.303285 0.493692 +v 0.202736 -0.395346 0.172606 +v 0.190606 -0.355961 0.334550 +v 0.179623 -0.308364 0.480189 +v 0.307039 -0.373676 0.168730 +v 0.286572 -0.337029 0.324136 +v 0.272536 -0.304621 0.462235 +v -0.103115 -0.437912 0.179943 +v -0.207849 -0.420973 0.174840 +v -0.310661 -0.386448 0.169980 +v -0.099005 -0.403393 0.351476 +v -0.183351 -0.346339 0.332821 +v -0.261103 -0.300469 0.316952 +v -0.088512 -0.320392 0.498616 +v -0.172094 -0.298885 0.477393 +v -0.232732 -0.247446 0.444368 +v -0.107793 -0.466364 -0.182260 +v -0.089063 -0.346950 -0.341778 +v -0.074539 -0.249837 -0.478311 +v -0.199375 -0.396515 -0.172708 +v -0.154445 -0.266652 -0.318498 +v -0.145398 -0.231645 -0.457566 +v -0.286589 -0.344833 -0.165906 +v -0.220704 -0.232413 -0.303580 +v -0.202972 -0.200232 -0.429616 +v 0.001883 0.403774 0.000000 +v 0.001883 0.470360 -0.174323 +v 0.001883 0.409812 -0.334872 +v 0.001883 0.392914 -0.488534 +v -0.074441 0.391234 0.000000 +v -0.134230 0.336487 0.000000 +v -0.194120 0.314349 -0.000000 +v 0.001883 0.332179 0.163346 +v 0.001883 0.342843 0.323541 +v 0.001883 0.370287 0.482073 +v 0.083436 0.423840 0.000000 +v 0.162743 0.409064 0.000000 +v 0.228441 0.367621 0.000000 +v 0.089520 0.463967 -0.171344 +v 0.083643 0.426462 -0.332816 +v 0.078154 0.380741 -0.478091 +v 0.168000 0.426749 -0.163865 +v 0.163834 0.413822 -0.321285 +v 0.148784 0.362355 -0.457283 +v 0.253854 0.413400 -0.159728 +v 0.242600 0.394622 -0.309581 +v 0.195215 0.313618 -0.423903 +v -0.077827 0.415741 -0.167418 +v -0.145355 0.372254 -0.159115 +v -0.193458 0.315498 -0.150143 +v -0.077397 0.412382 -0.330397 +v -0.148919 0.383084 -0.315760 +v -0.212147 0.349665 -0.300747 +v -0.069977 0.358467 -0.471681 +v -0.131894 0.329300 -0.447536 +v -0.186655 0.306012 -0.421527 +v -0.058562 0.298547 0.157876 +v -0.063998 0.336307 0.317325 +v -0.071271 0.365000 0.473562 +v -0.116887 0.290082 0.151951 +v -0.119550 0.302119 0.301208 +v -0.137798 0.344169 0.451921 +v -0.177234 0.287451 0.147397 +v -0.185331 0.304492 0.291871 +v -0.192951 0.316001 0.424648 +v 0.074882 0.374924 0.164095 +v 0.147449 0.367431 0.158694 +v 0.203992 0.327199 0.151289 +v 0.071707 0.358695 0.321172 +v 0.149368 0.373942 0.314117 +v 0.218554 0.354115 0.301622 +v 0.075106 0.365352 0.473663 +v 0.154552 0.376884 0.461568 +v 0.227638 0.365057 0.439977 +v 0.445320 0.065834 0.000000 +v 0.326415 0.065834 -0.164814 +v 0.283782 0.065834 -0.317640 +v 0.252778 0.065834 -0.456340 +v 0.470875 0.154950 0.000000 +v 0.434671 0.236268 0.000000 +v 0.361181 0.291006 0.000000 +v 0.545654 0.065834 0.183713 +v 0.550891 0.065834 0.366656 +v 0.518193 0.065834 0.538526 +v 0.400170 -0.009961 0.000000 +v 0.361135 -0.075158 0.000000 +v 0.373013 -0.167301 0.000000 +v 0.322417 0.005131 -0.161865 +v 0.284583 0.012508 -0.312792 +v 0.273564 0.012258 -0.455928 +v 0.284883 -0.043978 -0.153712 +v 0.260378 -0.034317 -0.298477 +v 0.273876 -0.045114 -0.440916 +v 0.275722 -0.101643 -0.149222 +v 0.250205 -0.085342 -0.287296 +v 0.282203 -0.113471 -0.425964 +v 0.328396 0.127691 -0.162392 +v 0.360267 0.206312 -0.160838 +v 0.348085 0.282426 -0.156901 +v 0.279642 0.118137 -0.311871 +v 0.303774 0.184469 -0.306935 +v 0.295146 0.248322 -0.296867 +v 0.246653 0.113153 -0.447531 +v 0.263166 0.171788 -0.437492 +v 0.244634 0.217333 -0.413241 +v 0.535823 0.167743 0.180708 +v 0.569419 0.178083 0.365878 +v 0.505016 0.173225 0.528147 +v 0.468118 0.250187 0.171033 +v 0.517412 0.275469 0.348572 +v 0.480552 0.273124 0.506987 +v 0.359182 0.289959 0.158079 +v 0.416975 0.333206 0.322813 +v 0.409644 0.339456 0.469122 +v 0.524743 -0.033937 0.179729 +v 0.467682 -0.118343 0.170992 +v 0.433774 -0.208920 0.165995 +v 0.520584 -0.036313 0.356776 +v 0.475503 -0.125951 0.340405 +v 0.427195 -0.208660 0.324990 +v 0.498882 -0.040132 0.526233 +v 0.454490 -0.129307 0.498655 +v 0.400988 -0.201383 0.466191 +v 0.001883 0.065834 0.842140 +v 0.100107 0.065834 0.873082 +v 0.201631 0.065834 0.836561 +v 0.269193 0.065834 0.740312 +v 0.001883 0.152600 0.857382 +v 0.001883 0.237508 0.814245 +v 0.001882 0.293539 0.723213 +v -0.076842 0.065834 0.816613 +v -0.156694 0.065834 0.780533 +v -0.210853 0.065834 0.696187 +v 0.001883 -0.015036 0.841577 +v 0.001883 -0.067296 0.765753 +v 0.001883 -0.155304 0.718309 +v 0.089499 -0.015567 0.832080 +v 0.192477 -0.023225 0.813822 +v 0.271776 -0.017912 0.733074 +v 0.090777 -0.102744 0.799715 +v 0.178130 -0.099630 0.761626 +v 0.269247 -0.102180 0.703355 +v 0.084445 -0.168263 0.718297 +v 0.171993 -0.175045 0.694701 +v 0.262841 -0.182228 0.651978 +v 0.108068 0.167300 0.884534 +v 0.103970 0.262485 0.834433 +v 0.089495 0.315881 0.730091 +v 0.214998 0.167270 0.843952 +v 0.200581 0.255593 0.790219 +v 0.183229 0.324883 0.707744 +v 0.270744 0.149196 0.732248 +v 0.279889 0.241562 0.711627 +v 0.260522 0.311382 0.650287 +v -0.077007 0.137804 0.807429 +v -0.162922 0.140716 0.779318 +v -0.232975 0.136584 0.705025 +v -0.080414 0.220371 0.782353 +v -0.162667 0.218639 0.746728 +v -0.231611 0.209293 0.677030 +v -0.075239 0.282747 0.705592 +v -0.150490 0.278029 0.674113 +v -0.202580 0.252694 0.610776 +v -0.074060 -0.002952 0.799103 +v -0.065363 -0.056677 0.742746 +v -0.071602 -0.139594 0.697100 +v -0.141304 0.002833 0.750396 +v -0.118042 -0.038681 0.689894 +v -0.137157 -0.124801 0.658637 +v -0.189373 0.011255 0.670118 +v -0.184391 -0.043395 0.640330 +v -0.186986 -0.104134 0.599404 +v -0.444482 0.065834 -0.000000 +v -0.483714 0.065834 0.178698 +v -0.501617 0.065834 0.358305 +v -0.419961 0.065834 0.509274 +v -0.426638 0.147325 -0.000000 +v -0.375765 0.214191 -0.000000 +v -0.313987 0.261780 -0.000000 +v -0.363201 0.065834 -0.168310 +v -0.327656 0.065834 -0.326382 +v -0.326504 0.065834 -0.480336 +v -0.466781 -0.023221 -0.000000 +v -0.455945 -0.114626 -0.000000 +v -0.448641 -0.220730 -0.000000 +v -0.503931 -0.030645 0.178224 +v -0.478561 -0.028399 0.349646 +v -0.379346 -0.013214 0.490109 +v -0.526065 -0.143625 0.176866 +v -0.448708 -0.116141 0.335916 +v -0.352680 -0.083603 0.467312 +v -0.479989 -0.242845 0.171298 +v -0.407952 -0.197876 0.321693 +v -0.324395 -0.147484 0.441528 +v -0.456308 0.153117 0.174019 +v -0.418076 0.231361 0.166659 +v -0.347835 0.284812 0.157274 +v -0.507388 0.166029 0.355018 +v -0.436018 0.242403 0.333442 +v -0.347962 0.287745 0.308917 +v -0.396530 0.148876 0.495471 +v -0.344952 0.211668 0.464841 +v -0.297002 0.258877 0.432251 +v -0.339007 0.130467 -0.163662 +v -0.302933 0.123734 -0.316914 +v -0.314098 0.129710 -0.469751 +v -0.349173 0.203331 -0.160146 +v -0.295910 0.182723 -0.306136 +v -0.257047 0.170691 -0.436740 +v -0.309882 0.259052 -0.153247 +v -0.270622 0.233859 -0.292447 +v -0.253379 0.226593 -0.417479 +v -0.407537 -0.012032 -0.169713 +v -0.408462 -0.095783 -0.165750 +v -0.382139 -0.176429 -0.160915 +v -0.327650 0.002820 -0.321521 +v -0.329048 -0.065171 -0.312595 +v -0.306866 -0.127445 -0.300166 +v -0.294715 0.006464 -0.463703 +v -0.305388 -0.061558 -0.452194 +v -0.265782 -0.104105 -0.421679 +v 0.001883 0.065834 -0.825043 +v 0.082761 0.065834 -0.822847 +v 0.174257 0.065834 -0.799309 +v 0.250304 0.065834 -0.725039 +v 0.001883 -0.018645 -0.851250 +v 0.001883 -0.122517 -0.835226 +v 0.001883 -0.184502 -0.740111 +v -0.074540 0.065834 -0.809946 +v -0.142913 0.065834 -0.761780 +v -0.163899 0.065834 -0.658225 +v 0.001883 0.137330 -0.816456 +v 0.001883 0.183613 -0.746440 +v 0.001883 0.242196 -0.684876 +v 0.080518 0.137529 -0.806709 +v 0.143605 0.128029 -0.748436 +v 0.209341 0.126421 -0.683090 +v 0.070072 0.190351 -0.745228 +v 0.114287 0.162210 -0.680316 +v 0.184983 0.172761 -0.637863 +v 0.063279 0.233081 -0.668870 +v 0.113847 0.212684 -0.627210 +v 0.166929 0.209995 -0.582031 +v 0.095467 -0.022016 -0.848938 +v 0.097431 -0.116904 -0.817226 +v 0.091712 -0.191214 -0.735267 +v 0.189802 -0.021754 -0.810242 +v 0.187906 -0.110209 -0.774077 +v 0.171243 -0.173832 -0.693831 +v 0.276087 -0.019511 -0.736525 +v 0.284206 -0.113024 -0.714981 +v 0.246046 -0.164034 -0.639729 +v -0.082493 -0.012066 -0.822927 +v -0.159653 -0.007253 -0.774945 +v -0.175121 0.016541 -0.658710 +v -0.086396 -0.101435 -0.798097 +v -0.162661 -0.086965 -0.746720 +v -0.197547 -0.052932 -0.650555 +v -0.086389 -0.186295 -0.731630 +v -0.153368 -0.151016 -0.677454 +v -0.200008 -0.118242 -0.608902 +v -0.072862 0.133326 -0.795721 +v -0.057051 0.170658 -0.720874 +v -0.059850 0.234144 -0.669656 +v -0.131662 0.123535 -0.737496 +v -0.127271 0.180336 -0.701648 +v -0.108697 0.210445 -0.625603 +v -0.161218 0.109970 -0.647580 +v -0.160169 0.157503 -0.621504 +v -0.137860 0.182584 -0.563578 +v 0.250740 -0.160665 -0.413218 +v 0.253368 -0.160378 -0.288956 +v 0.282221 -0.189440 -0.151651 +v 0.354413 -0.266739 0.000000 +v 0.387731 -0.303677 0.165166 +v 0.379664 -0.297165 0.320781 +v 0.352589 -0.271053 0.452501 +v 0.241043 -0.224234 -0.560524 +v 0.175119 -0.253796 -0.605492 +v 0.088349 -0.253769 -0.627355 +v 0.001883 -0.225916 -0.623008 +v -0.073292 -0.206689 -0.605580 +v -0.128085 -0.161894 -0.563158 +v -0.178939 -0.143041 -0.523340 +v 0.279860 -0.134841 -0.545865 +v 0.312121 -0.082907 -0.591777 +v 0.321440 -0.009863 -0.617248 +v 0.326342 0.065834 -0.627849 +v 0.277081 0.129052 -0.595020 +v 0.239802 0.174620 -0.555683 +v 0.219729 0.215764 -0.516017 +v 0.241157 -0.224392 0.560597 +v 0.161118 -0.224059 0.591794 +v 0.087570 -0.250522 0.625853 +v 0.001883 -0.215352 0.618115 +v -0.073311 -0.206769 0.605617 +v -0.145059 -0.197946 0.579765 +v -0.206598 -0.181535 0.540969 +v 0.343216 -0.188306 0.577315 +v 0.374339 -0.117280 0.622829 +v 0.392958 -0.029982 0.653085 +v 0.374333 0.065834 0.651934 +v 0.384052 0.159144 0.648622 +v 0.378845 0.251437 0.625078 +v 0.363360 0.336974 0.587315 +v -0.276183 -0.192322 0.424483 +v -0.345010 -0.263711 0.312997 +v -0.408496 -0.330236 0.168308 +v -0.375547 -0.293694 -0.000000 +v -0.352701 -0.269826 -0.161162 +v -0.286561 -0.200407 -0.298269 +v -0.244176 -0.157632 -0.412139 +v -0.255182 -0.117193 0.535485 +v -0.262681 -0.057673 0.568981 +v -0.301216 -0.005233 0.609001 +v -0.312301 0.065834 0.622692 +v -0.311085 0.139677 0.613946 +v -0.272036 0.194509 0.573650 +v -0.239894 0.235959 0.527896 +v -0.242554 -0.106537 -0.529217 +v -0.243823 -0.047255 -0.559570 +v -0.233997 0.013676 -0.575318 +v -0.209569 0.065834 -0.571135 +v -0.214079 0.112388 -0.565337 +v -0.212924 0.161851 -0.544148 +v -0.181405 0.186601 -0.498863 +v 0.219300 0.258257 -0.401091 +v 0.288871 0.330499 -0.297902 +v 0.316044 0.357728 -0.155983 +v 0.296098 0.335275 0.000000 +v 0.282572 0.321487 0.151697 +v 0.299528 0.342040 0.300588 +v 0.322959 0.370606 0.441073 +v 0.182895 0.274973 -0.523461 +v 0.130018 0.289667 -0.561364 +v 0.069861 0.308345 -0.591699 +v 0.001883 0.294377 -0.593732 +v -0.060396 0.284581 -0.580708 +v -0.109600 0.254297 -0.545072 +v -0.151475 0.236486 -0.505835 +v 0.252882 0.372377 0.568070 +v 0.165749 0.365563 0.596325 +v 0.078155 0.342932 0.607696 +v 0.001883 0.340046 0.614885 +v -0.066825 0.311387 0.593106 +v -0.129606 0.296791 0.564646 +v -0.185040 0.283199 0.527228 +v -0.239677 0.284423 0.410403 +v -0.252499 0.295183 0.289686 +v -0.262514 0.303847 0.149609 +v -0.252690 0.292359 -0.000000 +v -0.241132 0.280696 -0.146870 +v -0.253371 0.296127 -0.289906 +v -0.228491 0.272300 -0.406089 +v 0.266431 -0.180766 -0.510088 +v 0.319511 -0.238337 0.536323 +v -0.256937 -0.174552 0.507256 +v -0.226838 -0.141907 -0.492380 +v 0.211478 0.252830 -0.482927 +v 0.312214 0.362091 0.532717 +v -0.219315 0.265415 0.488662 +v -0.183004 0.226032 -0.470715 +vt 0.500000 0.500000 +vt 0.499873 0.458461 +vt 0.541412 0.458333 +vt 0.541539 0.499873 +vt 0.582951 0.458206 +vt 0.583079 0.499745 +vt 0.624490 0.458079 +vt 0.624618 0.499618 +vt 0.666030 0.457951 +vt 0.666157 0.499490 +vt 0.499745 0.416922 +vt 0.541284 0.416794 +vt 0.582824 0.416667 +vt 0.624363 0.416539 +vt 0.665902 0.416412 +vt 0.499618 0.375382 +vt 0.541157 0.375255 +vt 0.582696 0.375128 +vt 0.624235 0.375000 +vt 0.665775 0.374873 +vt 0.499490 0.333843 +vt 0.541030 0.333716 +vt 0.582569 0.333588 +vt 0.624108 0.333461 +vt 0.665647 0.333333 +vt 0.541667 0.541412 +vt 0.500127 0.541539 +vt 0.541794 0.582951 +vt 0.500255 0.583079 +vt 0.541922 0.624490 +vt 0.500382 0.624618 +vt 0.542049 0.666030 +vt 0.500510 0.666157 +vt 0.583206 0.541285 +vt 0.583333 0.582824 +vt 0.583461 0.624363 +vt 0.583588 0.665902 +vt 0.624745 0.541157 +vt 0.624873 0.582696 +vt 0.625000 0.624236 +vt 0.625127 0.665775 +vt 0.666284 0.541030 +vt 0.666412 0.582569 +vt 0.666539 0.624108 +vt 0.666667 0.665647 +vt 0.458588 0.541667 +vt 0.458461 0.500128 +vt 0.417049 0.541794 +vt 0.416922 0.500255 +vt 0.375510 0.541922 +vt 0.375382 0.500382 +vt 0.333971 0.542049 +vt 0.333843 0.500510 +vt 0.458716 0.583206 +vt 0.417176 0.583333 +vt 0.375637 0.583461 +vt 0.334098 0.583588 +vt 0.458843 0.624745 +vt 0.417304 0.624873 +vt 0.375765 0.625000 +vt 0.334225 0.625128 +vt 0.458971 0.666285 +vt 0.417431 0.666412 +vt 0.375892 0.666539 +vt 0.334353 0.666667 +vt 0.458333 0.458588 +vt 0.458206 0.417049 +vt 0.458079 0.375510 +vt 0.457951 0.333971 +vt 0.416794 0.458716 +vt 0.416667 0.417177 +vt 0.416539 0.375637 +vt 0.416412 0.334098 +vt 0.375255 0.458843 +vt 0.375127 0.417304 +vt 0.375000 0.375765 +vt 0.374873 0.334226 +vt 0.333716 0.458971 +vt 0.333588 0.417431 +vt 0.333461 0.375892 +vt 0.333333 0.334353 +vt 0.833333 0.500000 +vt 0.833461 0.458461 +vt 0.875000 0.458588 +vt 0.874873 0.500127 +vt 0.916539 0.458716 +vt 0.916412 0.500255 +vt 0.958078 0.458843 +vt 0.957951 0.500382 +vt 0.999618 0.458971 +vt 0.999490 0.500510 +vt 0.833588 0.416922 +vt 0.875127 0.417049 +vt 0.916667 0.417176 +vt 0.958206 0.417304 +vt 0.999745 0.417431 +vt 0.833716 0.375382 +vt 0.875255 0.375510 +vt 0.916794 0.375637 +vt 0.958333 0.375765 +vt 0.999873 0.375892 +vt 0.833843 0.333843 +vt 0.875382 0.333971 +vt 0.916921 0.334098 +vt 0.958461 0.334225 +vt 1.000000 0.334353 +vt 0.874745 0.541667 +vt 0.833206 0.541539 +vt 0.874618 0.583206 +vt 0.833078 0.583079 +vt 0.874490 0.624745 +vt 0.832951 0.624618 +vt 0.874363 0.666284 +vt 0.832824 0.666157 +vt 0.916284 0.541794 +vt 0.916157 0.583333 +vt 0.916029 0.624873 +vt 0.915902 0.666412 +vt 0.957824 0.541922 +vt 0.957696 0.583461 +vt 0.957569 0.625000 +vt 0.957441 0.666539 +vt 0.999363 0.542049 +vt 0.999235 0.583588 +vt 0.999108 0.625127 +vt 0.998980 0.666667 +vt 0.791667 0.541412 +vt 0.791794 0.499873 +vt 0.750127 0.541284 +vt 0.750255 0.499745 +vt 0.708588 0.541157 +vt 0.708716 0.499618 +vt 0.667049 0.541030 +vt 0.667176 0.499490 +vt 0.791539 0.582951 +vt 0.750000 0.582824 +vt 0.708461 0.582696 +vt 0.666922 0.582569 +vt 0.791412 0.624490 +vt 0.749873 0.624363 +vt 0.708333 0.624235 +vt 0.666794 0.624108 +vt 0.791284 0.666030 +vt 0.749745 0.665902 +vt 0.708206 0.665775 +vt 0.791921 0.458333 +vt 0.792049 0.416794 +vt 0.792176 0.375255 +vt 0.792304 0.333716 +vt 0.750382 0.458206 +vt 0.750510 0.416667 +vt 0.750637 0.375128 +vt 0.750765 0.333588 +vt 0.708843 0.458079 +vt 0.708970 0.416539 +vt 0.709098 0.375000 +vt 0.709225 0.333461 +vt 0.667304 0.457951 +vt 0.667431 0.416412 +vt 0.667559 0.374873 +vt 0.667686 0.333333 +vt 0.833333 0.166667 +vt 0.833206 0.125127 +vt 0.874745 0.125000 +vt 0.874873 0.166539 +vt 0.916284 0.124873 +vt 0.916412 0.166412 +vt 0.957824 0.124745 +vt 0.957951 0.166284 +vt 0.999363 0.124618 +vt 0.999490 0.166157 +vt 0.833079 0.083588 +vt 0.874618 0.083461 +vt 0.916157 0.083333 +vt 0.957696 0.083206 +vt 0.999235 0.083078 +vt 0.832951 0.042049 +vt 0.874490 0.041922 +vt 0.916030 0.041794 +vt 0.957569 0.041667 +vt 0.999108 0.041539 +vt 0.832824 0.000510 +vt 0.874363 0.000382 +vt 0.915902 0.000255 +vt 0.957441 0.000127 +vt 0.998981 0.000000 +vt 0.875000 0.208078 +vt 0.833461 0.208206 +vt 0.875127 0.249618 +vt 0.833588 0.249745 +vt 0.875255 0.291157 +vt 0.833716 0.291284 +vt 0.875382 0.332696 +vt 0.833843 0.332824 +vt 0.916539 0.207951 +vt 0.916667 0.249490 +vt 0.916794 0.291030 +vt 0.916921 0.332569 +vt 0.958078 0.207824 +vt 0.958206 0.249363 +vt 0.958333 0.290902 +vt 0.958461 0.332441 +vt 0.999618 0.207696 +vt 0.999745 0.249235 +vt 0.999873 0.290775 +vt 1.000000 0.332314 +vt 0.791922 0.208333 +vt 0.791794 0.166794 +vt 0.750382 0.208461 +vt 0.750255 0.166922 +vt 0.708843 0.208588 +vt 0.708716 0.167049 +vt 0.667304 0.208716 +vt 0.667176 0.167176 +vt 0.792049 0.249873 +vt 0.750510 0.250000 +vt 0.708970 0.250128 +vt 0.667431 0.250255 +vt 0.792176 0.291412 +vt 0.750637 0.291539 +vt 0.709098 0.291667 +vt 0.667559 0.291794 +vt 0.792304 0.332951 +vt 0.750765 0.333079 +vt 0.709225 0.333206 +vt 0.791667 0.125255 +vt 0.791539 0.083716 +vt 0.791412 0.042176 +vt 0.791284 0.000637 +vt 0.750127 0.125382 +vt 0.750000 0.083843 +vt 0.749873 0.042304 +vt 0.749745 0.000765 +vt 0.708588 0.125510 +vt 0.708461 0.083971 +vt 0.708333 0.042431 +vt 0.708206 0.000892 +vt 0.667049 0.125637 +vt 0.666922 0.084098 +vt 0.666794 0.042559 +vt 0.666667 0.001019 +vt 0.500000 0.166667 +vt 0.500127 0.208206 +vt 0.458588 0.208333 +vt 0.458461 0.166794 +vt 0.417049 0.208461 +vt 0.416922 0.166922 +vt 0.375510 0.208588 +vt 0.375382 0.167049 +vt 0.333971 0.208716 +vt 0.333843 0.167176 +vt 0.500255 0.249745 +vt 0.458716 0.249873 +vt 0.417176 0.250000 +vt 0.375637 0.250128 +vt 0.334098 0.250255 +vt 0.500382 0.291284 +vt 0.458843 0.291412 +vt 0.417304 0.291539 +vt 0.375765 0.291667 +vt 0.334225 0.291794 +vt 0.500510 0.332824 +vt 0.458971 0.332951 +vt 0.417431 0.333079 +vt 0.375892 0.333206 +vt 0.334353 0.333333 +vt 0.458333 0.125255 +vt 0.499873 0.125127 +vt 0.458206 0.083716 +vt 0.499745 0.083588 +vt 0.458079 0.042176 +vt 0.499618 0.042049 +vt 0.457951 0.000637 +vt 0.499490 0.000510 +vt 0.416794 0.125382 +vt 0.416667 0.083843 +vt 0.416539 0.042304 +vt 0.416412 0.000765 +vt 0.375255 0.125510 +vt 0.375127 0.083971 +vt 0.375000 0.042431 +vt 0.374873 0.000892 +vt 0.333716 0.125637 +vt 0.333588 0.084098 +vt 0.333461 0.042559 +vt 0.333333 0.001020 +vt 0.541412 0.125000 +vt 0.541539 0.166539 +vt 0.582951 0.124873 +vt 0.583079 0.166412 +vt 0.624490 0.124745 +vt 0.624618 0.166284 +vt 0.666030 0.124618 +vt 0.666157 0.166157 +vt 0.541284 0.083461 +vt 0.582824 0.083333 +vt 0.624363 0.083206 +vt 0.665902 0.083078 +vt 0.541157 0.041922 +vt 0.582696 0.041794 +vt 0.624235 0.041667 +vt 0.665775 0.041539 +vt 0.541030 0.000382 +vt 0.582569 0.000255 +vt 0.624108 0.000127 +vt 0.665647 0.000000 +vt 0.541667 0.208079 +vt 0.541794 0.249618 +vt 0.541922 0.291157 +vt 0.542049 0.332696 +vt 0.583206 0.207951 +vt 0.583333 0.249490 +vt 0.583461 0.291030 +vt 0.583588 0.332569 +vt 0.624745 0.207824 +vt 0.624873 0.249363 +vt 0.625000 0.290902 +vt 0.625127 0.332441 +vt 0.666284 0.207696 +vt 0.666412 0.249235 +vt 0.666539 0.290775 +vt 0.666667 0.332314 +vt 0.166667 0.500000 +vt 0.166539 0.458461 +vt 0.208078 0.458333 +vt 0.208206 0.499873 +vt 0.249618 0.458206 +vt 0.249745 0.499745 +vt 0.291157 0.458079 +vt 0.291284 0.499618 +vt 0.332696 0.457951 +vt 0.332824 0.499490 +vt 0.166412 0.416922 +vt 0.207951 0.416794 +vt 0.249490 0.416667 +vt 0.291030 0.416539 +vt 0.332569 0.416412 +vt 0.166284 0.375382 +vt 0.207824 0.375255 +vt 0.249363 0.375128 +vt 0.290902 0.375000 +vt 0.332441 0.374873 +vt 0.166157 0.333843 +vt 0.207696 0.333716 +vt 0.249235 0.333588 +vt 0.290775 0.333461 +vt 0.332314 0.333333 +vt 0.208333 0.541412 +vt 0.166794 0.541539 +vt 0.208461 0.582951 +vt 0.166922 0.583079 +vt 0.208588 0.624490 +vt 0.167049 0.624618 +vt 0.208716 0.666030 +vt 0.167176 0.666157 +vt 0.249873 0.541285 +vt 0.250000 0.582824 +vt 0.250127 0.624363 +vt 0.250255 0.665902 +vt 0.291412 0.541157 +vt 0.291539 0.582696 +vt 0.291667 0.624236 +vt 0.291794 0.665775 +vt 0.332951 0.541030 +vt 0.333079 0.582569 +vt 0.333206 0.624108 +vt 0.333333 0.665647 +vt 0.125255 0.541667 +vt 0.125127 0.500128 +vt 0.083716 0.541794 +vt 0.083588 0.500255 +vt 0.042176 0.541922 +vt 0.042049 0.500382 +vt 0.000637 0.542049 +vt 0.000510 0.500510 +vt 0.125382 0.583206 +vt 0.083843 0.583333 +vt 0.042304 0.583461 +vt 0.000765 0.583588 +vt 0.125510 0.624745 +vt 0.083971 0.624873 +vt 0.042431 0.625000 +vt 0.000892 0.625128 +vt 0.125637 0.666285 +vt 0.084098 0.666412 +vt 0.042559 0.666539 +vt 0.001020 0.666667 +vt 0.125000 0.458588 +vt 0.124873 0.417049 +vt 0.124745 0.375510 +vt 0.124618 0.333971 +vt 0.083461 0.458716 +vt 0.083333 0.417177 +vt 0.083206 0.375637 +vt 0.083078 0.334098 +vt 0.041922 0.458843 +vt 0.041794 0.417304 +vt 0.041667 0.375765 +vt 0.041539 0.334226 +vt 0.000382 0.458971 +vt 0.000255 0.417431 +vt 0.000127 0.375892 +vt 0.000000 0.334353 +vt 0.166667 0.166667 +vt 0.166539 0.125128 +vt 0.208079 0.125000 +vt 0.208206 0.166539 +vt 0.249618 0.124873 +vt 0.249745 0.166412 +vt 0.291157 0.124745 +vt 0.291284 0.166284 +vt 0.332696 0.124618 +vt 0.332824 0.166157 +vt 0.166412 0.083588 +vt 0.207951 0.083461 +vt 0.249490 0.083333 +vt 0.291030 0.083206 +vt 0.332569 0.083078 +vt 0.166284 0.042049 +vt 0.207824 0.041922 +vt 0.249363 0.041794 +vt 0.290902 0.041667 +vt 0.332441 0.041539 +vt 0.166157 0.000510 +vt 0.207696 0.000382 +vt 0.249235 0.000255 +vt 0.290775 0.000127 +vt 0.332314 0.000000 +vt 0.208333 0.208079 +vt 0.166794 0.208206 +vt 0.208461 0.249618 +vt 0.166922 0.249745 +vt 0.208588 0.291157 +vt 0.167049 0.291284 +vt 0.208716 0.332696 +vt 0.167176 0.332824 +vt 0.249873 0.207951 +vt 0.250000 0.249490 +vt 0.250127 0.291030 +vt 0.250255 0.332569 +vt 0.291412 0.207824 +vt 0.291539 0.249363 +vt 0.291667 0.290902 +vt 0.291794 0.332441 +vt 0.332951 0.207696 +vt 0.333079 0.249235 +vt 0.333206 0.290775 +vt 0.333333 0.332314 +vt 0.125255 0.208333 +vt 0.125128 0.166794 +vt 0.083716 0.208461 +vt 0.083588 0.166922 +vt 0.042176 0.208588 +vt 0.042049 0.167049 +vt 0.000637 0.208716 +vt 0.000510 0.167177 +vt 0.125382 0.249873 +vt 0.083843 0.250000 +vt 0.042304 0.250128 +vt 0.000765 0.250255 +vt 0.125510 0.291412 +vt 0.083971 0.291539 +vt 0.042431 0.291667 +vt 0.000892 0.291794 +vt 0.125637 0.332951 +vt 0.084098 0.333079 +vt 0.042559 0.333206 +vt 0.001020 0.333333 +vt 0.125000 0.125255 +vt 0.124873 0.083716 +vt 0.124745 0.042176 +vt 0.124618 0.000637 +vt 0.083461 0.125382 +vt 0.083333 0.083843 +vt 0.083206 0.042304 +vt 0.083078 0.000765 +vt 0.041922 0.125510 +vt 0.041794 0.083971 +vt 0.041667 0.042431 +vt 0.041539 0.000892 +vt 0.000382 0.125637 +vt 0.000255 0.084098 +vt 0.000127 0.042559 +vt 0.000000 0.001020 +vn 0.000122 -0.993316 0.115390 +vn -0.001648 -0.972533 -0.232734 +vn 0.221931 -0.930387 -0.291665 +vn 0.122959 -0.985015 0.120762 +vn 0.564318 -0.756859 -0.329661 +vn 0.441237 -0.896603 0.037477 +vn 0.863979 -0.364727 -0.347026 +vn 0.762108 -0.625355 -0.167547 +vn 0.931486 -0.081576 -0.354472 +vn 0.875423 -0.329783 -0.353313 +vn -0.022034 -0.819269 -0.572954 +vn 0.244270 -0.819147 -0.518906 +vn 0.568865 -0.709983 -0.415052 +vn 0.882229 -0.389141 -0.264931 +vn 0.985778 -0.131626 -0.104221 +vn -0.155461 -0.903531 -0.399243 +vn 0.040742 -0.949889 -0.309824 +vn 0.400983 -0.901364 -0.163335 +vn 0.783715 -0.621052 -0.007599 +vn 0.937956 -0.337107 0.080935 +vn -0.189886 -0.939451 -0.285134 +vn -0.006012 -0.935423 -0.353374 +vn 0.355571 -0.867580 -0.347636 +vn 0.740898 -0.649373 -0.171300 +vn 0.898129 -0.435865 0.057588 +vn 0.142827 -0.958647 0.246071 +vn 0.113865 -0.977935 0.175054 +vn 0.150884 -0.937681 0.312998 +vn 0.192572 -0.920560 0.339732 +vn 0.108798 -0.896634 0.429121 +vn 0.037599 -0.852718 0.520981 +vn 0.048128 -0.839320 0.541490 +vn -0.180883 -0.791589 0.583636 +vn 0.229194 -0.949553 0.213965 +vn 0.103000 -0.954253 0.280587 +vn 0.140965 -0.885098 0.443464 +vn 0.215827 -0.837184 0.502487 +vn 0.510147 -0.857326 0.068453 +vn 0.326182 -0.914487 0.239265 +vn 0.242225 -0.870235 0.428938 +vn 0.190588 -0.820551 0.538835 +vn 0.803491 -0.589801 -0.080691 +vn 0.691549 -0.700430 0.176305 +vn 0.565600 -0.736564 0.370830 +vn 0.392834 -0.755394 0.524400 +vn -0.091250 -0.983459 0.156377 +vn -0.117008 -0.991668 0.053468 +vn -0.316813 -0.918699 0.235725 +vn -0.320963 -0.945677 -0.051515 +vn -0.491806 -0.835566 0.244789 +vn -0.590503 -0.793420 -0.147496 +vn -0.658345 -0.733787 0.167547 +vn -0.747063 -0.619861 -0.239998 +vn -0.162633 -0.918455 0.360454 +vn -0.471419 -0.790033 0.391858 +vn -0.493759 -0.715903 0.493576 +vn -0.511399 -0.651357 0.560472 +vn -0.193518 -0.788812 0.583331 +vn -0.523026 -0.677175 0.517533 +vn -0.619526 -0.620685 0.480483 +vn -0.586108 -0.601856 0.542405 +vn -0.268807 -0.720969 0.638691 +vn -0.513993 -0.568468 0.642354 +vn -0.631092 -0.467605 0.618885 +vn -0.658376 -0.529069 0.535295 +vn -0.312510 -0.911740 -0.266457 +vn -0.414563 -0.721732 -0.554277 +vn -0.418775 -0.802393 -0.425184 +vn -0.392682 -0.892361 -0.222388 +vn -0.494247 -0.767876 -0.407483 +vn -0.559343 -0.680258 -0.473647 +vn -0.587024 -0.703391 -0.400739 +vn -0.565050 -0.791864 -0.231635 +vn -0.572954 -0.680960 -0.456038 +vn -0.521897 -0.687979 -0.504227 +vn -0.570025 -0.726737 -0.383251 +vn -0.547197 -0.765038 -0.339488 +vn -0.745506 -0.505478 -0.434339 +vn -0.715201 -0.474502 -0.513108 +vn -0.742027 -0.559832 -0.368725 +vn -0.675008 -0.664296 -0.320994 +vn -0.286874 0.901028 0.325297 +vn 0.008393 0.962188 0.272164 +vn 0.123569 0.992309 0.002838 +vn -0.205695 0.978576 0.006348 +vn 0.127750 0.958342 -0.255379 +vn -0.153539 0.961150 -0.229347 +vn 0.185034 0.879818 -0.437757 +vn -0.142735 0.890011 -0.432966 +vn 0.290445 0.724235 -0.625355 +vn -0.128544 0.802393 -0.582751 +vn 0.334147 0.912198 0.237098 +vn 0.289285 0.956694 0.031465 +vn 0.349498 0.892026 -0.286508 +vn 0.480880 0.753105 -0.448927 +vn 0.564348 0.580554 -0.586871 +vn 0.418195 0.876522 0.238258 +vn 0.480605 0.876156 0.036256 +vn 0.592730 0.719169 -0.362529 +vn 0.737297 0.507126 -0.446272 +vn 0.730155 0.490921 -0.475234 +vn 0.522813 0.839930 0.145360 +vn 0.784509 0.618091 -0.049257 +vn 0.832789 0.369274 -0.412336 +vn 0.836879 0.350932 -0.420057 +vn 0.854396 0.445540 -0.267312 +vn -0.441633 0.894589 0.067965 +vn -0.437239 0.842524 0.314524 +vn -0.564226 0.816462 0.122471 +vn -0.463820 0.851070 0.245918 +vn -0.589099 0.801050 0.105899 +vn -0.333018 0.938139 0.094668 +vn -0.557360 0.830226 -0.004059 +vn -0.303446 0.951353 -0.053194 +vn -0.373974 0.905789 -0.199103 +vn -0.518479 0.841823 -0.149846 +vn -0.657338 0.748466 -0.087436 +vn -0.769768 0.631214 -0.094790 +vn -0.427625 0.788446 -0.442061 +vn -0.556169 0.679312 -0.478683 +vn -0.636555 0.591052 -0.495346 +vn -0.756432 0.477432 -0.447005 +vn -0.480667 0.720023 -0.500504 +vn -0.697043 0.544664 -0.466262 +vn -0.714042 0.430891 -0.551744 +vn -0.632923 0.415082 -0.653493 +vn -0.355541 0.924772 0.135563 +vn -0.339915 0.927213 0.157231 +vn -0.256630 0.948576 -0.185186 +vn -0.202033 0.973479 -0.107212 +vn -0.276742 0.956542 0.091525 +vn -0.104221 0.992065 0.069857 +vn -0.292093 0.913541 0.283029 +vn -0.183355 0.942442 0.279550 +vn -0.255287 0.960356 0.111850 +vn -0.204016 0.963561 -0.172918 +vn -0.378674 0.921964 0.080966 +vn -0.388714 0.884243 0.258736 +vn -0.054018 0.997101 0.053316 +vn -0.106540 0.991058 -0.080111 +vn -0.411206 0.906766 0.093112 +vn -0.557695 0.795038 0.238411 +vn -0.122959 0.991913 -0.030610 +vn -0.142186 0.988739 0.046571 +vn -0.352550 0.913511 0.202918 +vn -0.529710 0.794488 0.296915 +vn -0.172002 0.970855 0.166875 +vn 0.278756 0.952696 0.120975 +vn 0.346721 0.936247 0.056459 +vn 0.269356 0.962462 -0.032319 +vn -0.177618 0.983795 -0.023682 +vn 0.095859 0.994476 -0.042238 +vn 0.197028 0.972320 -0.125492 +vn 0.148717 0.972716 -0.177923 +vn -0.103580 0.993469 0.047456 +vn -0.037049 0.999176 0.015290 +vn 0.083254 0.995178 -0.051546 +vn 0.155065 0.986908 -0.044130 +vn -0.098086 0.967223 0.234199 +vn 0.004517 0.972625 0.232307 +vn 0.136082 0.960356 0.243171 +vn 0.182928 0.965148 0.187078 +vn 0.829798 -0.202918 -0.519822 +vn 0.769707 -0.387188 -0.507523 +vn 0.851985 -0.375744 -0.364483 +vn 0.899991 -0.111087 -0.421461 +vn 0.976135 -0.158849 -0.147893 +vn 0.969848 0.084140 -0.228645 +vn 0.989929 0.047700 0.133091 +vn 0.973235 0.214484 0.082308 +vn 0.996979 0.047212 -0.061586 +vn 0.920286 0.361553 -0.149419 +vn 0.823176 -0.266671 -0.501236 +vn 0.878445 -0.337748 -0.337931 +vn 0.964232 -0.259407 -0.054140 +vn 0.985961 -0.081790 0.145390 +vn 0.970733 -0.239723 0.014008 +vn 0.883847 -0.110111 -0.454604 +vn 0.935850 -0.038179 -0.350291 +vn 0.995544 -0.087954 -0.033815 +vn 0.973846 -0.174963 0.144749 +vn 0.937132 -0.348857 0.005585 +vn 0.887997 -0.121799 -0.443373 +vn 0.877682 0.097232 -0.469253 +vn 0.903012 0.112369 -0.414624 +vn 0.782800 0.533128 -0.320872 +vn 0.880154 0.409955 -0.239143 +vn 0.649281 0.757500 -0.067507 +vn 0.957884 -0.109409 -0.265450 +vn 0.940977 -0.028535 -0.337199 +vn 0.876766 0.240486 -0.416425 +vn 0.993316 0.109989 -0.034364 +vn 0.962828 0.182684 -0.198950 +vn 0.859035 0.393292 -0.327586 +vn 0.811029 0.568621 -0.137333 +vn 0.779870 0.573046 -0.251717 +vn 0.775903 0.530900 -0.340678 +vn 0.935453 0.231391 -0.267129 +vn 0.951720 -0.168371 -0.256539 +vn 0.972137 0.224586 0.067019 +vn 0.987091 -0.135807 0.084628 +vn 0.832942 0.181341 0.522752 +vn 0.861782 -0.060579 0.503616 +vn 0.644429 0.126133 0.754143 +vn 0.640065 0.019868 0.768029 +vn 0.660787 0.710074 -0.243110 +vn 0.740104 0.671163 -0.041566 +vn 0.742729 0.539140 0.397076 +vn 0.604663 0.403790 0.686514 +vn 0.399640 0.905637 -0.141545 +vn 0.383160 0.909024 -0.163823 +vn 0.469741 0.871029 0.143590 +vn 0.440474 0.759789 0.478195 +vn 0.882931 -0.381970 -0.272958 +vn 0.878628 -0.382580 -0.285653 +vn 0.923765 -0.330119 -0.194006 +vn 0.928678 -0.366222 0.058351 +vn 0.865841 -0.497696 0.050966 +vn 0.863155 -0.495468 0.097079 +vn 0.857387 -0.309488 0.411206 +vn 0.781396 -0.536424 0.318766 +vn 0.747765 -0.588305 0.307688 +vn 0.643880 -0.198248 0.738975 +vn 0.602283 -0.491562 0.628925 +vn 0.505203 -0.681570 0.529313 +vn -0.307596 -0.129765 0.942595 +vn -0.287454 -0.430555 0.855556 +vn 0.025636 -0.428663 0.903073 +vn 0.049287 -0.217689 0.974761 +vn 0.471297 -0.355235 0.807245 +vn 0.573870 -0.184057 0.797967 +vn 0.630634 -0.212836 0.746269 +vn 0.725425 -0.041780 0.687002 +vn -0.322153 -0.605823 0.727439 +vn -0.012818 -0.610828 0.791620 +vn 0.363109 -0.556017 0.747612 +vn 0.488784 -0.471938 0.733726 +vn -0.297250 -0.665059 0.685049 +vn -0.024934 -0.755211 0.654958 +vn 0.270974 -0.750938 0.602161 +vn 0.324656 -0.735130 0.595111 +vn 0.052065 0.189337 0.980499 +vn -0.367565 0.151830 0.917508 +vn 0.003449 0.684713 0.728782 +vn -0.348216 0.610828 0.711051 +vn -0.087161 0.904599 0.417219 +vn -0.264931 0.868954 0.417920 +vn 0.624683 0.155309 0.765221 +vn 0.503281 0.589587 0.631703 +vn 0.232643 0.860683 0.452834 +vn 0.744438 0.087619 0.661885 +vn 0.628681 0.417371 0.656148 +vn 0.376354 0.746605 0.548509 +vn -0.408734 0.158269 0.898801 +vn -0.423841 -0.114322 0.898465 +vn -0.564867 0.117374 0.816767 +vn -0.614917 -0.236030 0.752403 +vn -0.754875 0.109165 0.646687 +vn -0.692251 -0.294748 0.658681 +vn -0.728324 0.335429 0.597491 +vn -0.677999 -0.168767 0.715384 +vn -0.367412 0.556078 0.745476 +vn -0.506149 0.538499 0.673635 +vn -0.708060 0.558916 0.431501 +vn -0.628956 0.684896 0.367840 +vn -0.289315 0.859157 0.421979 +vn -0.398907 0.854183 0.333476 +vn -0.589282 0.783013 0.199011 +vn -0.546831 0.785943 0.288461 +vn -0.464858 -0.501511 0.729606 +vn -0.484298 -0.570849 0.662984 +vn -0.428724 -0.561235 0.707938 +vn -0.609394 -0.556291 0.564928 +vn -0.624500 -0.485855 0.611469 +vn -0.600604 -0.426649 0.676168 +vn -0.572741 -0.536180 0.620045 +vn -0.562761 -0.484390 0.669790 +vn -0.626545 -0.390667 0.674367 +vn -0.558977 -0.491287 0.667959 +vn -0.539811 -0.538377 0.647084 +vn -0.604480 -0.451186 0.656484 +vn -0.914518 0.273629 -0.297891 +vn -0.947935 0.138676 -0.286630 +vn -0.997986 0.048891 -0.039766 +vn -0.980071 0.139134 -0.141545 +vn -0.904080 -0.219123 0.366863 +vn -0.968047 -0.037660 0.247780 +vn -0.704856 -0.438337 0.557665 +vn -0.800592 -0.103397 0.590197 +vn -0.943907 -0.100040 -0.314646 +vn -0.979583 -0.192846 0.056459 +vn -0.796564 -0.337931 0.501236 +vn -0.643941 -0.479720 0.595965 +vn -0.860714 -0.401166 -0.313334 +vn -0.845546 -0.522080 0.111515 +vn -0.639393 -0.528611 0.558306 +vn -0.606647 -0.526566 0.595508 +vn -0.911374 0.359050 -0.201117 +vn -0.895718 0.329081 -0.298929 +vn -0.714896 0.676229 -0.177740 +vn -0.782769 0.577502 -0.231819 +vn -0.415967 0.902524 -0.111393 +vn -0.506821 0.850642 -0.139653 +vn -0.897488 0.395306 0.195410 +vn -0.632099 0.755699 0.171270 +vn -0.336467 0.931089 0.140782 +vn -0.694876 0.445051 0.564806 +vn -0.482192 0.745994 0.459243 +vn -0.335521 0.871944 0.356456 +vn -0.917508 0.227577 -0.326121 +vn -0.886624 0.316538 -0.337107 +vn -0.930357 0.337626 -0.142918 +vn -0.973296 0.170934 -0.153050 +vn -0.825709 0.437971 -0.355419 +vn -0.906613 0.023530 -0.421247 +vn -0.745811 0.279946 -0.604450 +vn -0.788141 0.120090 -0.603626 +vn -0.870876 0.403363 -0.280709 +vn -0.907407 0.339518 -0.247536 +vn -0.730247 0.588946 -0.346171 +vn -0.559404 0.692831 -0.455000 +vn -0.655416 0.740013 -0.150853 +vn -0.836451 0.498886 -0.226753 +vn -0.781732 0.454543 -0.426893 +vn -0.600116 0.607471 -0.520371 +vn -0.916379 0.137791 -0.375805 +vn -0.896207 -0.154210 -0.415937 +vn -0.846065 -0.306803 -0.435896 +vn -0.959777 0.023865 -0.279672 +vn -0.896237 -0.229438 -0.379559 +vn -0.823176 -0.364544 -0.435224 +vn -0.921415 -0.081271 -0.379925 +vn -0.910581 -0.253639 -0.326273 +vn -0.825831 -0.480789 -0.294656 +vn -0.829676 0.076205 -0.552995 +vn -0.877529 -0.128178 -0.462050 +vn -0.741997 -0.581195 -0.334117 +vn -0.094943 0.218757 -0.971129 +vn -0.110599 0.527299 -0.842433 +vn 0.289529 0.589373 -0.754173 +vn 0.210944 0.305918 -0.928373 +vn 0.493362 0.701437 -0.514328 +vn 0.489273 0.419507 -0.764580 +vn 0.478195 0.746452 -0.462661 +vn 0.680532 0.452925 -0.575884 +vn -0.131962 0.794824 -0.592273 +vn 0.359935 0.789117 -0.497665 +vn 0.520096 0.739280 -0.427686 +vn 0.425916 0.775903 -0.465316 +vn -0.111454 0.784539 -0.609943 +vn 0.393750 0.718650 -0.573107 +vn 0.551714 0.608142 -0.570727 +vn 0.553667 0.621815 -0.553850 +vn 0.220466 -0.006409 -0.975372 +vn -0.124943 0.026460 -0.991791 +vn 0.249214 -0.541032 -0.803217 +vn -0.112491 -0.513443 -0.850673 +vn 0.145421 -0.820948 -0.552110 +vn -0.124088 -0.857570 -0.499100 +vn 0.504624 -0.016907 -0.863155 +vn 0.454024 -0.532090 -0.714621 +vn 0.381848 -0.753288 -0.535447 +vn 0.790887 0.001190 -0.611896 +vn 0.737205 -0.483840 -0.471541 +vn 0.670736 -0.661428 -0.335521 +vn -0.434828 0.016175 -0.900327 +vn -0.411756 0.232459 -0.881130 +vn -0.798547 0.072390 -0.597522 +vn -0.803034 0.258705 -0.536790 +vn -0.910916 0.202673 -0.359325 +vn -0.913144 0.213538 -0.347148 +vn -0.457564 -0.435926 -0.774957 +vn -0.799066 -0.275643 -0.534318 +vn -0.920072 -0.074801 -0.384503 +vn -0.406201 -0.810877 -0.421247 +vn -0.707236 -0.659047 -0.255806 +vn -0.759484 -0.589404 -0.275185 +vn -0.399945 0.534349 -0.744621 +vn -0.332713 0.749718 -0.572008 +vn -0.388043 0.751152 -0.533982 +vn -0.755821 0.419263 -0.502914 +vn -0.647511 0.631397 -0.426649 +vn -0.667501 0.676809 -0.310373 +vn -0.902249 0.190863 -0.386578 +vn -0.782006 0.539048 -0.312845 +vn -0.654714 0.682089 -0.325663 +g Cube_Cube_Material +usemtl Material +s 1 +f 1/1/1 11/2/2 14/3/3 +f 1/1/1 14/3/3 2/4/4 +f 2/4/4 14/3/3 15/5/5 +f 2/4/4 15/5/5 3/6/6 +f 3/6/6 15/5/5 16/7/7 +f 3/6/6 16/7/7 4/8/8 +f 4/8/8 16/7/7 297/9/9 +f 4/8/8 297/9/9 298/10/10 +f 11/2/2 12/11/11 17/12/12 +f 11/2/2 17/12/12 14/3/3 +f 14/3/3 17/12/12 18/13/13 +f 14/3/3 18/13/13 15/5/5 +f 15/5/5 18/13/13 19/14/14 +f 15/5/5 19/14/14 16/7/7 +f 16/7/7 19/14/14 296/15/15 +f 16/7/7 296/15/15 297/9/9 +f 12/11/11 13/16/16 20/17/17 +f 12/11/11 20/17/17 17/12/12 +f 17/12/12 20/17/17 21/18/18 +f 17/12/12 21/18/18 18/13/13 +f 18/13/13 21/18/18 22/19/19 +f 18/13/13 22/19/19 19/14/14 +f 19/14/14 22/19/19 295/20/20 +f 19/14/14 295/20/20 296/15/15 +f 13/16/16 305/21/21 304/22/22 +f 13/16/16 304/22/22 20/17/17 +f 20/17/17 304/22/22 303/23/23 +f 20/17/17 303/23/23 21/18/18 +f 21/18/18 303/23/23 302/24/24 +f 21/18/18 302/24/24 22/19/19 +f 22/19/19 302/24/24 379/25/25 +f 22/19/19 379/25/25 295/20/20 +f 1/1/1 2/4/4 23/26/26 +f 1/1/1 23/26/26 5/27/27 +f 5/27/27 23/26/26 24/28/28 +f 5/27/27 24/28/28 6/29/29 +f 6/29/29 24/28/28 25/30/30 +f 6/29/29 25/30/30 7/31/31 +f 7/31/31 25/30/30 318/32/32 +f 7/31/31 318/32/32 319/33/33 +f 2/4/4 3/6/6 26/34/34 +f 2/4/4 26/34/34 23/26/26 +f 23/26/26 26/34/34 27/35/35 +f 23/26/26 27/35/35 24/28/28 +f 24/28/28 27/35/35 28/36/36 +f 24/28/28 28/36/36 25/30/30 +f 25/30/30 28/36/36 317/37/37 +f 25/30/30 317/37/37 318/32/32 +f 3/6/6 4/8/8 29/38/38 +f 3/6/6 29/38/38 26/34/34 +f 26/34/34 29/38/38 30/39/39 +f 26/34/34 30/39/39 27/35/35 +f 27/35/35 30/39/39 31/40/40 +f 27/35/35 31/40/40 28/36/36 +f 28/36/36 31/40/40 316/41/41 +f 28/36/36 316/41/41 317/37/37 +f 4/8/8 298/10/10 299/42/42 +f 4/8/8 299/42/42 29/38/38 +f 29/38/38 299/42/42 300/43/43 +f 29/38/38 300/43/43 30/39/39 +f 30/39/39 300/43/43 301/44/44 +f 30/39/39 301/44/44 31/40/40 +f 31/40/40 301/44/44 380/45/45 +f 31/40/40 380/45/45 316/41/41 +f 1/1/1 5/27/27 32/46/46 +f 1/1/1 32/46/46 8/47/47 +f 8/47/47 32/46/46 33/48/48 +f 8/47/47 33/48/48 9/49/49 +f 9/49/49 33/48/48 34/50/50 +f 9/49/49 34/50/50 10/51/51 +f 10/51/51 34/50/50 332/52/52 +f 10/51/51 332/52/52 333/53/53 +f 5/27/27 6/29/29 35/54/54 +f 5/27/27 35/54/54 32/46/46 +f 32/46/46 35/54/54 36/55/55 +f 32/46/46 36/55/55 33/48/48 +f 33/48/48 36/55/55 37/56/56 +f 33/48/48 37/56/56 34/50/50 +f 34/50/50 37/56/56 331/57/57 +f 34/50/50 331/57/57 332/52/52 +f 6/29/29 7/31/31 38/58/58 +f 6/29/29 38/58/58 35/54/54 +f 35/54/54 38/58/58 39/59/59 +f 35/54/54 39/59/59 36/55/55 +f 36/55/55 39/59/59 40/60/60 +f 36/55/55 40/60/60 37/56/56 +f 37/56/56 40/60/60 330/61/61 +f 37/56/56 330/61/61 331/57/57 +f 7/31/31 319/33/33 320/62/62 +f 7/31/31 320/62/62 38/58/58 +f 38/58/58 320/62/62 321/63/63 +f 38/58/58 321/63/63 39/59/59 +f 39/59/59 321/63/63 322/64/64 +f 39/59/59 322/64/64 40/60/60 +f 40/60/60 322/64/64 381/65/65 +f 40/60/60 381/65/65 330/61/61 +f 1/1/1 8/47/47 41/66/66 +f 1/1/1 41/66/66 11/2/2 +f 11/2/2 41/66/66 42/67/67 +f 11/2/2 42/67/67 12/11/11 +f 12/11/11 42/67/67 43/68/68 +f 12/11/11 43/68/68 13/16/16 +f 13/16/16 43/68/68 306/69/69 +f 13/16/16 306/69/69 305/21/21 +f 8/47/47 9/49/49 44/70/70 +f 8/47/47 44/70/70 41/66/66 +f 41/66/66 44/70/70 45/71/71 +f 41/66/66 45/71/71 42/67/67 +f 42/67/67 45/71/71 46/72/72 +f 42/67/67 46/72/72 43/68/68 +f 43/68/68 46/72/72 307/73/73 +f 43/68/68 307/73/73 306/69/69 +f 9/49/49 10/51/51 47/74/74 +f 9/49/49 47/74/74 44/70/70 +f 44/70/70 47/74/74 48/75/75 +f 44/70/70 48/75/75 45/71/71 +f 45/71/71 48/75/75 49/76/76 +f 45/71/71 49/76/76 46/72/72 +f 46/72/72 49/76/76 308/77/77 +f 46/72/72 308/77/77 307/73/73 +f 10/51/51 333/53/53 334/78/78 +f 10/51/51 334/78/78 47/74/74 +f 47/74/74 334/78/78 335/79/79 +f 47/74/74 335/79/79 48/75/75 +f 48/75/75 335/79/79 336/80/80 +f 48/75/75 336/80/80 49/76/76 +f 49/76/76 336/80/80 382/81/81 +f 49/76/76 382/81/81 308/77/77 +f 50/82/82 60/83/83 63/84/84 +f 50/82/82 63/84/84 51/85/85 +f 51/85/85 63/84/84 64/86/86 +f 51/85/85 64/86/86 52/87/87 +f 52/87/87 64/86/86 65/88/88 +f 52/87/87 65/88/88 53/89/89 +f 53/89/89 65/88/88 360/90/90 +f 53/89/89 360/90/90 361/91/91 +f 60/83/83 61/92/92 66/93/93 +f 60/83/83 66/93/93 63/84/84 +f 63/84/84 66/93/93 67/94/94 +f 63/84/84 67/94/94 64/86/86 +f 64/86/86 67/94/94 68/95/95 +f 64/86/86 68/95/95 65/88/88 +f 65/88/88 68/95/95 359/96/96 +f 65/88/88 359/96/96 360/90/90 +f 61/92/92 62/97/97 69/98/98 +f 61/92/92 69/98/98 66/93/93 +f 66/93/93 69/98/98 70/99/99 +f 66/93/93 70/99/99 67/94/94 +f 67/94/94 70/99/99 71/100/100 +f 67/94/94 71/100/100 68/95/95 +f 68/95/95 71/100/100 358/101/101 +f 68/95/95 358/101/101 359/96/96 +f 62/97/97 354/102/102 353/103/103 +f 62/97/97 353/103/103 69/98/98 +f 69/98/98 353/103/103 352/104/104 +f 69/98/98 352/104/104 70/99/99 +f 70/99/99 352/104/104 351/105/105 +f 70/99/99 351/105/105 71/100/100 +f 71/100/100 351/105/105 383/106/106 +f 71/100/100 383/106/106 358/101/101 +f 50/82/82 51/85/85 72/107/107 +f 50/82/82 72/107/107 54/108/108 +f 54/108/108 72/107/107 73/109/109 +f 54/108/108 73/109/109 55/110/110 +f 55/110/110 73/109/109 74/111/111 +f 55/110/110 74/111/111 56/112/112 +f 56/112/112 74/111/111 376/113/113 +f 56/112/112 376/113/113 375/114/114 +f 51/85/85 52/87/87 75/115/115 +f 51/85/85 75/115/115 72/107/107 +f 72/107/107 75/115/115 76/116/116 +f 72/107/107 76/116/116 73/109/109 +f 73/109/109 76/116/116 77/117/117 +f 73/109/109 77/117/117 74/111/111 +f 74/111/111 77/117/117 377/118/118 +f 74/111/111 377/118/118 376/113/113 +f 52/87/87 53/89/89 78/119/119 +f 52/87/87 78/119/119 75/115/115 +f 75/115/115 78/119/119 79/120/120 +f 75/115/115 79/120/120 76/116/116 +f 76/116/116 79/120/120 80/121/121 +f 76/116/116 80/121/121 77/117/117 +f 77/117/117 80/121/121 378/122/122 +f 77/117/117 378/122/122 377/118/118 +f 53/89/89 361/91/91 362/123/123 +f 53/89/89 362/123/123 78/119/119 +f 78/119/119 362/123/123 363/124/124 +f 78/119/119 363/124/124 79/120/120 +f 79/120/120 363/124/124 364/125/125 +f 79/120/120 364/125/125 80/121/121 +f 80/121/121 364/125/125 386/126/126 +f 80/121/121 386/126/126 378/122/122 +f 50/82/82 54/108/108 81/127/127 +f 50/82/82 81/127/127 57/128/128 +f 57/128/128 81/127/127 82/129/129 +f 57/128/128 82/129/129 58/130/130 +f 58/130/130 82/129/129 83/131/131 +f 58/130/130 83/131/131 59/132/132 +f 59/132/132 83/131/131 369/133/133 +f 59/132/132 369/133/133 368/134/134 +f 54/108/108 55/110/110 84/135/135 +f 54/108/108 84/135/135 81/127/127 +f 81/127/127 84/135/135 85/136/136 +f 81/127/127 85/136/136 82/129/129 +f 82/129/129 85/136/136 86/137/137 +f 82/129/129 86/137/137 83/131/131 +f 83/131/131 86/137/137 370/138/138 +f 83/131/131 370/138/138 369/133/133 +f 55/110/110 56/112/112 87/139/139 +f 55/110/110 87/139/139 84/135/135 +f 84/135/135 87/139/139 88/140/140 +f 84/135/135 88/140/140 85/136/136 +f 85/136/136 88/140/140 89/141/141 +f 85/136/136 89/141/141 86/137/137 +f 86/137/137 89/141/141 371/142/142 +f 86/137/137 371/142/142 370/138/138 +f 56/112/112 375/114/114 374/143/143 +f 56/112/112 374/143/143 87/139/139 +f 87/139/139 374/143/143 373/144/144 +f 87/139/139 373/144/144 88/140/140 +f 88/140/140 373/144/144 372/145/145 +f 88/140/140 372/145/145 89/141/141 +f 89/141/141 372/145/145 385/45/146 +f 89/141/141 385/45/146 371/142/142 +f 50/82/82 57/128/128 90/146/147 +f 50/82/82 90/146/147 60/83/83 +f 60/83/83 90/146/147 91/147/148 +f 60/83/83 91/147/148 61/92/92 +f 61/92/92 91/147/148 92/148/149 +f 61/92/92 92/148/149 62/97/97 +f 62/97/97 92/148/149 355/149/150 +f 62/97/97 355/149/150 354/102/102 +f 57/128/128 58/130/130 93/150/151 +f 57/128/128 93/150/151 90/146/147 +f 90/146/147 93/150/151 94/151/152 +f 90/146/147 94/151/152 91/147/148 +f 91/147/148 94/151/152 95/152/153 +f 91/147/148 95/152/153 92/148/149 +f 92/148/149 95/152/153 356/153/154 +f 92/148/149 356/153/154 355/149/150 +f 58/130/130 59/132/132 96/154/155 +f 58/130/130 96/154/155 93/150/151 +f 93/150/151 96/154/155 97/155/156 +f 93/150/151 97/155/156 94/151/152 +f 94/151/152 97/155/156 98/156/157 +f 94/151/152 98/156/157 95/152/153 +f 95/152/153 98/156/157 357/157/158 +f 95/152/153 357/157/158 356/153/154 +f 59/132/132 368/134/134 367/158/159 +f 59/132/132 367/158/159 96/154/155 +f 96/154/155 367/158/159 366/159/160 +f 96/154/155 366/159/160 97/155/156 +f 97/155/156 366/159/160 365/160/161 +f 97/155/156 365/160/161 98/156/157 +f 98/156/157 365/160/161 384/161/162 +f 98/156/157 384/161/162 357/157/158 +f 99/162/163 109/163/164 112/164/165 +f 99/162/163 112/164/165 100/165/166 +f 100/165/166 112/164/165 113/166/167 +f 100/165/166 113/166/167 101/167/168 +f 101/167/168 113/166/167 114/168/169 +f 101/167/168 114/168/169 102/169/170 +f 102/169/170 114/168/169 311/170/171 +f 102/169/170 311/170/171 312/171/172 +f 109/163/164 110/172/173 115/173/174 +f 109/163/164 115/173/174 112/164/165 +f 112/164/165 115/173/174 116/174/175 +f 112/164/165 116/174/175 113/166/167 +f 113/166/167 116/174/175 117/175/176 +f 113/166/167 117/175/176 114/168/169 +f 114/168/169 117/175/176 310/176/177 +f 114/168/169 310/176/177 311/170/171 +f 110/172/173 111/177/178 118/178/179 +f 110/172/173 118/178/179 115/173/174 +f 115/173/174 118/178/179 119/179/180 +f 115/173/174 119/179/180 116/174/175 +f 116/174/175 119/179/180 120/180/181 +f 116/174/175 120/180/181 117/175/176 +f 117/175/176 120/180/181 309/181/182 +f 117/175/176 309/181/182 310/176/177 +f 111/177/178 298/182/10 297/183/9 +f 111/177/178 297/183/9 118/178/179 +f 118/178/179 297/183/9 296/184/15 +f 118/178/179 296/184/15 119/179/180 +f 119/179/180 296/184/15 295/185/20 +f 119/179/180 295/185/20 120/180/181 +f 120/180/181 295/185/20 379/186/25 +f 120/180/181 379/186/25 309/181/182 +f 99/162/163 100/165/166 121/187/183 +f 99/162/163 121/187/183 103/188/184 +f 103/188/184 121/187/183 122/189/185 +f 103/188/184 122/189/185 104/190/186 +f 104/190/186 122/189/185 123/191/187 +f 104/190/186 123/191/187 105/192/188 +f 105/192/188 123/191/187 353/193/103 +f 105/192/188 353/193/103 354/194/102 +f 100/165/166 101/167/168 124/195/189 +f 100/165/166 124/195/189 121/187/183 +f 121/187/183 124/195/189 125/196/190 +f 121/187/183 125/196/190 122/189/185 +f 122/189/185 125/196/190 126/197/191 +f 122/189/185 126/197/191 123/191/187 +f 123/191/187 126/197/191 352/198/104 +f 123/191/187 352/198/104 353/193/103 +f 101/167/168 102/169/170 127/199/192 +f 101/167/168 127/199/192 124/195/189 +f 124/195/189 127/199/192 128/200/193 +f 124/195/189 128/200/193 125/196/190 +f 125/196/190 128/200/193 129/201/194 +f 125/196/190 129/201/194 126/197/191 +f 126/197/191 129/201/194 351/202/105 +f 126/197/191 351/202/105 352/198/104 +f 102/169/170 312/171/172 313/203/195 +f 102/169/170 313/203/195 127/199/192 +f 127/199/192 313/203/195 314/204/196 +f 127/199/192 314/204/196 128/200/193 +f 128/200/193 314/204/196 315/205/197 +f 128/200/193 315/205/197 129/201/194 +f 129/201/194 315/205/197 383/206/106 +f 129/201/194 383/206/106 351/202/105 +f 99/162/163 103/188/184 130/207/198 +f 99/162/163 130/207/198 106/208/199 +f 106/208/199 130/207/198 131/209/200 +f 106/208/199 131/209/200 107/210/201 +f 107/210/201 131/209/200 132/211/202 +f 107/210/201 132/211/202 108/212/203 +f 108/212/203 132/211/202 327/213/204 +f 108/212/203 327/213/204 326/214/205 +f 103/188/184 104/190/186 133/215/206 +f 103/188/184 133/215/206 130/207/198 +f 130/207/198 133/215/206 134/216/207 +f 130/207/198 134/216/207 131/209/200 +f 131/209/200 134/216/207 135/217/208 +f 131/209/200 135/217/208 132/211/202 +f 132/211/202 135/217/208 328/218/209 +f 132/211/202 328/218/209 327/213/204 +f 104/190/186 105/192/188 136/219/210 +f 104/190/186 136/219/210 133/215/206 +f 133/215/206 136/219/210 137/220/211 +f 133/215/206 137/220/211 134/216/207 +f 134/216/207 137/220/211 138/221/212 +f 134/216/207 138/221/212 135/217/208 +f 135/217/208 138/221/212 329/222/213 +f 135/217/208 329/222/213 328/218/209 +f 105/192/188 354/194/102 355/223/150 +f 105/192/188 355/223/150 136/219/210 +f 136/219/210 355/223/150 356/224/154 +f 136/219/210 356/224/154 137/220/211 +f 137/220/211 356/224/154 357/225/158 +f 137/220/211 357/225/158 138/221/212 +f 138/221/212 357/225/158 384/161/162 +f 138/221/212 384/161/162 329/222/213 +f 99/162/163 106/208/199 139/226/214 +f 99/162/163 139/226/214 109/163/164 +f 109/163/164 139/226/214 140/227/215 +f 109/163/164 140/227/215 110/172/173 +f 110/172/173 140/227/215 141/228/216 +f 110/172/173 141/228/216 111/177/178 +f 111/177/178 141/228/216 299/229/42 +f 111/177/178 299/229/42 298/182/10 +f 106/208/199 107/210/201 142/230/217 +f 106/208/199 142/230/217 139/226/214 +f 139/226/214 142/230/217 143/231/218 +f 139/226/214 143/231/218 140/227/215 +f 140/227/215 143/231/218 144/232/219 +f 140/227/215 144/232/219 141/228/216 +f 141/228/216 144/232/219 300/233/43 +f 141/228/216 300/233/43 299/229/42 +f 107/210/201 108/212/203 145/234/220 +f 107/210/201 145/234/220 142/230/217 +f 142/230/217 145/234/220 146/235/221 +f 142/230/217 146/235/221 143/231/218 +f 143/231/218 146/235/221 147/236/222 +f 143/231/218 147/236/222 144/232/219 +f 144/232/219 147/236/222 301/237/44 +f 144/232/219 301/237/44 300/233/43 +f 108/212/203 326/214/205 325/238/223 +f 108/212/203 325/238/223 145/234/220 +f 145/234/220 325/238/223 324/239/224 +f 145/234/220 324/239/224 146/235/221 +f 146/235/221 324/239/224 323/240/225 +f 146/235/221 323/240/225 147/236/222 +f 147/236/222 323/240/225 380/241/45 +f 147/236/222 380/241/45 301/237/44 +f 148/242/226 158/243/227 161/244/228 +f 148/242/226 161/244/228 149/245/229 +f 149/245/229 161/244/228 162/246/230 +f 149/245/229 162/246/230 150/247/231 +f 150/247/231 162/246/230 163/248/232 +f 150/247/231 163/248/232 151/249/233 +f 151/249/233 163/248/232 325/250/223 +f 151/249/233 325/250/223 326/251/205 +f 158/243/227 159/252/234 164/253/235 +f 158/243/227 164/253/235 161/244/228 +f 161/244/228 164/253/235 165/254/236 +f 161/244/228 165/254/236 162/246/230 +f 162/246/230 165/254/236 166/255/237 +f 162/246/230 166/255/237 163/248/232 +f 163/248/232 166/255/237 324/256/224 +f 163/248/232 324/256/224 325/250/223 +f 159/252/234 160/257/238 167/258/239 +f 159/252/234 167/258/239 164/253/235 +f 164/253/235 167/258/239 168/259/240 +f 164/253/235 168/259/240 165/254/236 +f 165/254/236 168/259/240 169/260/241 +f 165/254/236 169/260/241 166/255/237 +f 166/255/237 169/260/241 323/261/225 +f 166/255/237 323/261/225 324/256/224 +f 160/257/238 319/262/33 318/263/32 +f 160/257/238 318/263/32 167/258/239 +f 167/258/239 318/263/32 317/264/37 +f 167/258/239 317/264/37 168/259/240 +f 168/259/240 317/264/37 316/265/41 +f 168/259/240 316/265/41 169/260/241 +f 169/260/241 316/265/41 380/266/45 +f 169/260/241 380/266/45 323/261/225 +f 148/242/226 149/245/229 170/267/242 +f 148/242/226 170/267/242 152/268/243 +f 152/268/243 170/267/242 171/269/244 +f 152/268/243 171/269/244 153/270/245 +f 153/270/245 171/269/244 172/271/246 +f 153/270/245 172/271/246 154/272/247 +f 154/272/247 172/271/246 367/273/159 +f 154/272/247 367/273/159 368/274/134 +f 149/245/229 150/247/231 173/275/248 +f 149/245/229 173/275/248 170/267/242 +f 170/267/242 173/275/248 174/276/249 +f 170/267/242 174/276/249 171/269/244 +f 171/269/244 174/276/249 175/277/250 +f 171/269/244 175/277/250 172/271/246 +f 172/271/246 175/277/250 366/278/160 +f 172/271/246 366/278/160 367/273/159 +f 150/247/231 151/249/233 176/279/251 +f 150/247/231 176/279/251 173/275/248 +f 173/275/248 176/279/251 177/280/252 +f 173/275/248 177/280/252 174/276/249 +f 174/276/249 177/280/252 178/281/253 +f 174/276/249 178/281/253 175/277/250 +f 175/277/250 178/281/253 365/282/161 +f 175/277/250 365/282/161 366/278/160 +f 151/249/233 326/251/205 327/283/204 +f 151/249/233 327/283/204 176/279/251 +f 176/279/251 327/283/204 328/284/209 +f 176/279/251 328/284/209 177/280/252 +f 177/280/252 328/284/209 329/285/213 +f 177/280/252 329/285/213 178/281/253 +f 178/281/253 329/285/213 384/286/162 +f 178/281/253 384/286/162 365/282/161 +f 148/242/226 152/268/243 179/287/254 +f 148/242/226 179/287/254 155/288/255 +f 155/288/255 179/287/254 180/289/256 +f 155/288/255 180/289/256 156/290/257 +f 156/290/257 180/289/256 181/291/258 +f 156/290/257 181/291/258 157/292/259 +f 157/292/259 181/291/258 341/293/260 +f 157/292/259 341/293/260 340/294/261 +f 152/268/243 153/270/245 182/295/262 +f 152/268/243 182/295/262 179/287/254 +f 179/287/254 182/295/262 183/296/263 +f 179/287/254 183/296/263 180/289/256 +f 180/289/256 183/296/263 184/297/264 +f 180/289/256 184/297/264 181/291/258 +f 181/291/258 184/297/264 342/298/265 +f 181/291/258 342/298/265 341/293/260 +f 153/270/245 154/272/247 185/299/266 +f 153/270/245 185/299/266 182/295/262 +f 182/295/262 185/299/266 186/300/267 +f 182/295/262 186/300/267 183/296/263 +f 183/296/263 186/300/267 187/301/268 +f 183/296/263 187/301/268 184/297/264 +f 184/297/264 187/301/268 343/302/269 +f 184/297/264 343/302/269 342/298/265 +f 154/272/247 368/274/134 369/303/133 +f 154/272/247 369/303/133 185/299/266 +f 185/299/266 369/303/133 370/304/138 +f 185/299/266 370/304/138 186/300/267 +f 186/300/267 370/304/138 371/305/142 +f 186/300/267 371/305/142 187/301/268 +f 187/301/268 371/305/142 385/306/146 +f 187/301/268 385/306/146 343/302/269 +f 148/242/226 155/288/255 188/307/270 +f 148/242/226 188/307/270 158/243/227 +f 158/243/227 188/307/270 189/308/271 +f 158/243/227 189/308/271 159/252/234 +f 159/252/234 189/308/271 190/309/272 +f 159/252/234 190/309/272 160/257/238 +f 160/257/238 190/309/272 320/310/62 +f 160/257/238 320/310/62 319/262/33 +f 155/288/255 156/290/257 191/311/273 +f 155/288/255 191/311/273 188/307/270 +f 188/307/270 191/311/273 192/312/274 +f 188/307/270 192/312/274 189/308/271 +f 189/308/271 192/312/274 193/313/275 +f 189/308/271 193/313/275 190/309/272 +f 190/309/272 193/313/275 321/314/63 +f 190/309/272 321/314/63 320/310/62 +f 156/290/257 157/292/259 194/315/276 +f 156/290/257 194/315/276 191/311/273 +f 191/311/273 194/315/276 195/316/277 +f 191/311/273 195/316/277 192/312/274 +f 192/312/274 195/316/277 196/317/278 +f 192/312/274 196/317/278 193/313/275 +f 193/313/275 196/317/278 322/318/64 +f 193/313/275 322/318/64 321/314/63 +f 157/292/259 340/294/261 339/319/279 +f 157/292/259 339/319/279 194/315/276 +f 194/315/276 339/319/279 338/320/280 +f 194/315/276 338/320/280 195/316/277 +f 195/316/277 338/320/280 337/321/281 +f 195/316/277 337/321/281 196/317/278 +f 196/317/278 337/321/281 381/322/65 +f 196/317/278 381/322/65 322/318/64 +f 197/323/282 207/324/283 210/325/284 +f 197/323/282 210/325/284 198/326/285 +f 198/326/285 210/325/284 211/327/286 +f 198/326/285 211/327/286 199/328/287 +f 199/328/287 211/327/286 212/329/288 +f 199/328/287 212/329/288 200/330/289 +f 200/330/289 212/329/288 339/331/279 +f 200/330/289 339/331/279 340/332/261 +f 207/324/283 208/333/290 213/334/291 +f 207/324/283 213/334/291 210/325/284 +f 210/325/284 213/334/291 214/335/292 +f 210/325/284 214/335/292 211/327/286 +f 211/327/286 214/335/292 215/336/293 +f 211/327/286 215/336/293 212/329/288 +f 212/329/288 215/336/293 338/337/280 +f 212/329/288 338/337/280 339/331/279 +f 208/333/290 209/338/294 216/339/295 +f 208/333/290 216/339/295 213/334/291 +f 213/334/291 216/339/295 217/340/296 +f 213/334/291 217/340/296 214/335/292 +f 214/335/292 217/340/296 218/341/297 +f 214/335/292 218/341/297 215/336/293 +f 215/336/293 218/341/297 337/342/281 +f 215/336/293 337/342/281 338/337/280 +f 209/338/294 333/343/53 332/344/52 +f 209/338/294 332/344/52 216/339/295 +f 216/339/295 332/344/52 331/345/57 +f 216/339/295 331/345/57 217/340/296 +f 217/340/296 331/345/57 330/346/61 +f 217/340/296 330/346/61 218/341/297 +f 218/341/297 330/346/61 381/347/65 +f 218/341/297 381/347/65 337/342/281 +f 197/323/282 198/326/285 219/348/298 +f 197/323/282 219/348/298 201/349/299 +f 201/349/299 219/348/298 220/350/300 +f 201/349/299 220/350/300 202/351/301 +f 202/351/301 220/350/300 221/352/302 +f 202/351/301 221/352/302 203/353/303 +f 203/353/303 221/352/302 374/354/143 +f 203/353/303 374/354/143 375/355/114 +f 198/326/285 199/328/287 222/356/304 +f 198/326/285 222/356/304 219/348/298 +f 219/348/298 222/356/304 223/357/305 +f 219/348/298 223/357/305 220/350/300 +f 220/350/300 223/357/305 224/358/306 +f 220/350/300 224/358/306 221/352/302 +f 221/352/302 224/358/306 373/359/144 +f 221/352/302 373/359/144 374/354/143 +f 199/328/287 200/330/289 225/360/307 +f 199/328/287 225/360/307 222/356/304 +f 222/356/304 225/360/307 226/361/308 +f 222/356/304 226/361/308 223/357/305 +f 223/357/305 226/361/308 227/362/309 +f 223/357/305 227/362/309 224/358/306 +f 224/358/306 227/362/309 372/363/145 +f 224/358/306 372/363/145 373/359/144 +f 200/330/289 340/332/261 341/364/260 +f 200/330/289 341/364/260 225/360/307 +f 225/360/307 341/364/260 342/365/265 +f 225/360/307 342/365/265 226/361/308 +f 226/361/308 342/365/265 343/366/269 +f 226/361/308 343/366/269 227/362/309 +f 227/362/309 343/366/269 385/367/146 +f 227/362/309 385/367/146 372/363/145 +f 197/323/282 201/349/299 228/368/310 +f 197/323/282 228/368/310 204/369/311 +f 204/369/311 228/368/310 229/370/312 +f 204/369/311 229/370/312 205/371/313 +f 205/371/313 229/370/312 230/372/314 +f 205/371/313 230/372/314 206/373/315 +f 206/373/315 230/372/314 348/374/316 +f 206/373/315 348/374/316 347/375/317 +f 201/349/299 202/351/301 231/376/318 +f 201/349/299 231/376/318 228/368/310 +f 228/368/310 231/376/318 232/377/319 +f 228/368/310 232/377/319 229/370/312 +f 229/370/312 232/377/319 233/378/320 +f 229/370/312 233/378/320 230/372/314 +f 230/372/314 233/378/320 349/379/321 +f 230/372/314 349/379/321 348/374/316 +f 202/351/301 203/353/303 234/380/322 +f 202/351/301 234/380/322 231/376/318 +f 231/376/318 234/380/322 235/381/323 +f 231/376/318 235/381/323 232/377/319 +f 232/377/319 235/381/323 236/382/324 +f 232/377/319 236/382/324 233/378/320 +f 233/378/320 236/382/324 350/383/325 +f 233/378/320 350/383/325 349/379/321 +f 203/353/303 375/355/114 376/384/113 +f 203/353/303 376/384/113 234/380/322 +f 234/380/322 376/384/113 377/385/118 +f 234/380/322 377/385/118 235/381/323 +f 235/381/323 377/385/118 378/386/122 +f 235/381/323 378/386/122 236/382/324 +f 236/382/324 378/386/122 386/387/126 +f 236/382/324 386/387/126 350/383/325 +f 197/323/282 204/369/311 237/388/326 +f 197/323/282 237/388/326 207/324/283 +f 207/324/283 237/388/326 238/389/327 +f 207/324/283 238/389/327 208/333/290 +f 208/333/290 238/389/327 239/390/328 +f 208/333/290 239/390/328 209/338/294 +f 209/338/294 239/390/328 334/391/78 +f 209/338/294 334/391/78 333/343/53 +f 204/369/311 205/371/313 240/392/329 +f 204/369/311 240/392/329 237/388/326 +f 237/388/326 240/392/329 241/393/330 +f 237/388/326 241/393/330 238/389/327 +f 238/389/327 241/393/330 242/394/331 +f 238/389/327 242/394/331 239/390/328 +f 239/390/328 242/394/331 335/395/79 +f 239/390/328 335/395/79 334/391/78 +f 205/371/313 206/373/315 243/396/332 +f 205/371/313 243/396/332 240/392/329 +f 240/392/329 243/396/332 244/397/333 +f 240/392/329 244/397/333 241/393/330 +f 241/393/330 244/397/333 245/398/334 +f 241/393/330 245/398/334 242/394/331 +f 242/394/331 245/398/334 336/399/80 +f 242/394/331 336/399/80 335/395/79 +f 206/373/315 347/375/317 346/400/335 +f 206/373/315 346/400/335 243/396/332 +f 243/396/332 346/400/335 345/401/336 +f 243/396/332 345/401/336 244/397/333 +f 244/397/333 345/401/336 344/402/337 +f 244/397/333 344/402/337 245/398/334 +f 245/398/334 344/402/337 382/403/81 +f 245/398/334 382/403/81 336/399/80 +f 246/404/338 256/405/339 259/406/340 +f 246/404/338 259/406/340 247/407/341 +f 247/407/341 259/406/340 260/408/342 +f 247/407/341 260/408/342 248/409/343 +f 248/409/343 260/408/342 261/410/344 +f 248/409/343 261/410/344 249/411/345 +f 249/411/345 261/410/344 313/412/195 +f 249/411/345 313/412/195 312/413/172 +f 256/405/339 257/414/346 262/415/347 +f 256/405/339 262/415/347 259/406/340 +f 259/406/340 262/415/347 263/416/348 +f 259/406/340 263/416/348 260/408/342 +f 260/408/342 263/416/348 264/417/349 +f 260/408/342 264/417/349 261/410/344 +f 261/410/344 264/417/349 314/418/196 +f 261/410/344 314/418/196 313/412/195 +f 257/414/346 258/419/350 265/420/351 +f 257/414/346 265/420/351 262/415/347 +f 262/415/347 265/420/351 266/421/352 +f 262/415/347 266/421/352 263/416/348 +f 263/416/348 266/421/352 267/422/353 +f 263/416/348 267/422/353 264/417/349 +f 264/417/349 267/422/353 315/423/197 +f 264/417/349 315/423/197 314/418/196 +f 258/419/350 361/424/91 360/425/90 +f 258/419/350 360/425/90 265/420/351 +f 265/420/351 360/425/90 359/426/96 +f 265/420/351 359/426/96 266/421/352 +f 266/421/352 359/426/96 358/427/101 +f 266/421/352 358/427/101 267/422/353 +f 267/422/353 358/427/101 383/428/106 +f 267/422/353 383/428/106 315/423/197 +f 246/404/338 247/407/341 268/429/354 +f 246/404/338 268/429/354 250/430/355 +f 250/430/355 268/429/354 269/431/356 +f 250/430/355 269/431/356 251/432/357 +f 251/432/357 269/431/356 270/433/358 +f 251/432/357 270/433/358 252/434/359 +f 252/434/359 270/433/358 304/435/22 +f 252/434/359 304/435/22 305/436/21 +f 247/407/341 248/409/343 271/437/360 +f 247/407/341 271/437/360 268/429/354 +f 268/429/354 271/437/360 272/438/361 +f 268/429/354 272/438/361 269/431/356 +f 269/431/356 272/438/361 273/439/362 +f 269/431/356 273/439/362 270/433/358 +f 270/433/358 273/439/362 303/440/23 +f 270/433/358 303/440/23 304/435/22 +f 248/409/343 249/411/345 274/441/363 +f 248/409/343 274/441/363 271/437/360 +f 271/437/360 274/441/363 275/442/364 +f 271/437/360 275/442/364 272/438/361 +f 272/438/361 275/442/364 276/443/365 +f 272/438/361 276/443/365 273/439/362 +f 273/439/362 276/443/365 302/444/24 +f 273/439/362 302/444/24 303/440/23 +f 249/411/345 312/413/172 311/445/171 +f 249/411/345 311/445/171 274/441/363 +f 274/441/363 311/445/171 310/446/177 +f 274/441/363 310/446/177 275/442/364 +f 275/442/364 310/446/177 309/447/182 +f 275/442/364 309/447/182 276/443/365 +f 276/443/365 309/447/182 379/448/25 +f 276/443/365 379/448/25 302/444/24 +f 246/404/338 250/430/355 277/449/366 +f 246/404/338 277/449/366 253/450/367 +f 253/450/367 277/449/366 278/451/368 +f 253/450/367 278/451/368 254/452/369 +f 254/452/369 278/451/368 279/453/370 +f 254/452/369 279/453/370 255/454/371 +f 255/454/371 279/453/370 346/455/335 +f 255/454/371 346/455/335 347/456/317 +f 250/430/355 251/432/357 280/457/372 +f 250/430/355 280/457/372 277/449/366 +f 277/449/366 280/457/372 281/458/373 +f 277/449/366 281/458/373 278/451/368 +f 278/451/368 281/458/373 282/459/374 +f 278/451/368 282/459/374 279/453/370 +f 279/453/370 282/459/374 345/460/336 +f 279/453/370 345/460/336 346/455/335 +f 251/432/357 252/434/359 283/461/375 +f 251/432/357 283/461/375 280/457/372 +f 280/457/372 283/461/375 284/462/376 +f 280/457/372 284/462/376 281/458/373 +f 281/458/373 284/462/376 285/463/377 +f 281/458/373 285/463/377 282/459/374 +f 282/459/374 285/463/377 344/464/337 +f 282/459/374 344/464/337 345/460/336 +f 252/434/359 305/436/21 306/465/69 +f 252/434/359 306/465/69 283/461/375 +f 283/461/375 306/465/69 307/466/73 +f 283/461/375 307/466/73 284/462/376 +f 284/462/376 307/466/73 308/467/77 +f 284/462/376 308/467/77 285/463/377 +f 285/463/377 308/467/77 382/468/81 +f 285/463/377 382/468/81 344/464/337 +f 246/404/338 253/450/367 286/469/378 +f 246/404/338 286/469/378 256/405/339 +f 256/405/339 286/469/378 287/470/379 +f 256/405/339 287/470/379 257/414/346 +f 257/414/346 287/470/379 288/471/380 +f 257/414/346 288/471/380 258/419/350 +f 258/419/350 288/471/380 362/472/123 +f 258/419/350 362/472/123 361/424/91 +f 253/450/367 254/452/369 289/473/381 +f 253/450/367 289/473/381 286/469/378 +f 286/469/378 289/473/381 290/474/382 +f 286/469/378 290/474/382 287/470/379 +f 287/470/379 290/474/382 291/475/383 +f 287/470/379 291/475/383 288/471/380 +f 288/471/380 291/475/383 363/476/124 +f 288/471/380 363/476/124 362/472/123 +f 254/452/369 255/454/371 292/477/384 +f 254/452/369 292/477/384 289/473/381 +f 289/473/381 292/477/384 293/478/385 +f 289/473/381 293/478/385 290/474/382 +f 290/474/382 293/478/385 294/479/386 +f 290/474/382 294/479/386 291/475/383 +f 291/475/383 294/479/386 364/480/125 +f 291/475/383 364/480/125 363/476/124 +f 255/454/371 347/456/317 348/481/316 +f 255/454/371 348/481/316 292/477/384 +f 292/477/384 348/481/316 349/482/321 +f 292/477/384 349/482/321 293/478/385 +f 293/478/385 349/482/321 350/483/325 +f 293/478/385 350/483/325 294/479/386 +f 294/479/386 350/483/325 386/484/126 +f 294/479/386 386/484/126 364/480/125 diff --git a/res/models/playership/body/bb_arrow.mtl b/res/models/playership/body/bb_arrow.mtl new file mode 100644 index 0000000..03d0ede --- /dev/null +++ b/res/models/playership/body/bb_arrow.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bb_arrow +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bb_arrow.png + diff --git a/res/models/playership/body/bb_arrow.obj b/res/models/playership/body/bb_arrow.obj new file mode 100644 index 0000000..93fc434 --- /dev/null +++ b/res/models/playership/body/bb_arrow.obj @@ -0,0 +1,42 @@ +# Exported from Wings 3D 1.4.1 +mtllib bb_arrow.mtl +o bb_arrow +#6 vertices, 5 faces +v -8.1640424e-17 -1.00000000 0.0000000e+0 +v -8.1640424e-17 1.00000000 0.0000000e+0 +v 1.00000000 -1.00000000 1.00000000 +v -1.00000000 -1.00000000 1.00000000 +v 1.00000000 1.00000000 1.00000000 +v -1.00000000 1.00000000 1.00000000 +vt 0.0000000e+0 1.1102230e-16 +vt 0.0000000e+0 0.41421356 +vt 0.0000000e+0 0.62132034 +vt 2.7755576e-17 0.41421356 +vt 0.20710678 0.62132034 +vt 0.20710678 0.82842712 +vt 0.41421356 0.0000000e+0 +vt 0.41421356 0.41421356 +vt 0.41421356 0.41421356 +vt 0.41421356 0.62132034 +vt 0.41421356 0.41421356 +vt 0.41421356 0.0000000e+0 +vt 0.70710678 0.41421356 +vt 0.70710678 1.3877788e-16 +vt 0.70710678 0.0000000e+0 +vt 0.70710678 0.41421356 +vt 1.00000000 8.3266727e-17 +vt 1.00000000 0.41421356 +vn -6.4098756e-17 -0.57735027 -0.81649658 +vn -6.4098756e-17 0.57735027 -0.81649658 +vn 0.56151667 -0.79410449 0.23258782 +vn -0.56151667 -0.79410449 0.23258782 +vn 0.56151667 0.79410449 0.23258782 +vn -0.56151667 0.79410449 0.23258782 +g bb_arrow_bb_arrow +usemtl bb_arrow +s 1 +f 1/6/1 3/3/3 4/10/4 +f 3/12/3 1/14/1 2/13/2 5/8/5 +f 5/11/5 2/5/2 6/2/6 +f 5/9/5 6/4/6 4/1/4 3/7/3 +f 6/18/6 2/16/2 1/15/1 4/17/4 diff --git a/res/models/playership/body/bb_arrow.png b/res/models/playership/body/bb_arrow.png new file mode 100644 index 0000000..fbcb085 Binary files /dev/null and b/res/models/playership/body/bb_arrow.png differ diff --git a/res/models/playership/body/bb_cube.mtl b/res/models/playership/body/bb_cube.mtl new file mode 100644 index 0000000..3f099b5 --- /dev/null +++ b/res/models/playership/body/bb_cube.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bb_cube +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bb_cube.png + diff --git a/res/models/playership/body/bb_cube.obj b/res/models/playership/body/bb_cube.obj new file mode 100644 index 0000000..e82006b --- /dev/null +++ b/res/models/playership/body/bb_cube.obj @@ -0,0 +1,51 @@ +# Exported from Wings 3D 1.4.1 +mtllib bb_cube.mtl +o bb_cube +#8 vertices, 6 faces +v -1.00000000 -1.00000000 1.00000000 +v -1.00000000 1.00000000 1.00000000 +v 1.00000000 1.00000000 1.00000000 +v 1.00000000 -1.00000000 1.00000000 +v -1.00000000 -1.00000000 -1.00000000 +v -1.00000000 1.00000000 -1.00000000 +v 1.00000000 1.00000000 -1.00000000 +v 1.00000000 -1.00000000 -1.00000000 +vt 0.0000000e+0 0.33333333 +vt 0.0000000e+0 0.66666667 +vt 2.7755576e-17 0.33333333 +vt 5.5511151e-17 0.0000000e+0 +vt 0.33333333 0.33333333 +vt 0.33333333 0.66666667 +vt 0.33333333 2.7755576e-17 +vt 0.33333333 5.5511151e-17 +vt 0.33333333 0.33333333 +vt 0.33333333 0.33333333 +vt 0.33333333 0.33333333 +vt 0.33333333 0.66666667 +vt 0.66666667 0.0000000e+0 +vt 0.66666667 0.33333333 +vt 0.66666667 0.33333333 +vt 0.66666667 0.66666667 +vt 0.66666667 0.66666667 +vt 0.66666667 0.33333333 +vt 1.00000000 0.0000000e+0 +vt 1.00000000 0.33333333 +vt 1.00000000 0.33333333 +vt 1.00000000 0.66666667 +vn -0.57735027 -0.57735027 0.57735027 +vn -0.57735027 0.57735027 0.57735027 +vn 0.57735027 0.57735027 0.57735027 +vn 0.57735027 -0.57735027 0.57735027 +vn -0.57735027 -0.57735027 -0.57735027 +vn -0.57735027 0.57735027 -0.57735027 +vn 0.57735027 0.57735027 -0.57735027 +vn 0.57735027 -0.57735027 -0.57735027 +g bb_cube_bb_cube +usemtl bb_cube +s 1 +f 1/7/1 4/13/4 3/18/3 2/9/2 +f 1/15/1 5/17/5 8/12/8 4/10/4 +f 2/22/2 6/16/6 5/15/5 1/21/1 +f 3/11/3 7/6/7 6/2/6 2/3/2 +f 4/4/4 8/8/8 7/5/7 3/1/3 +f 6/20/6 7/14/7 8/13/8 5/19/5 diff --git a/res/models/playership/body/bb_cube.png b/res/models/playership/body/bb_cube.png new file mode 100644 index 0000000..1d92f56 Binary files /dev/null and b/res/models/playership/body/bb_cube.png differ diff --git a/res/models/playership/body/bb_point.mtl b/res/models/playership/body/bb_point.mtl new file mode 100644 index 0000000..0945b16 --- /dev/null +++ b/res/models/playership/body/bb_point.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bb_point +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bb_point.png + diff --git a/res/models/playership/body/bb_point.obj b/res/models/playership/body/bb_point.obj new file mode 100644 index 0000000..2bb2cb4 --- /dev/null +++ b/res/models/playership/body/bb_point.obj @@ -0,0 +1,38 @@ +# Exported from Wings 3D 1.4.1 +mtllib bb_point.mtl +o bb_point +#5 vertices, 5 faces +v -8.1640424e-17 0.0000000e+0 0.0000000e+0 +v 1.00000000 -1.00000000 1.00000000 +v -1.00000000 -1.00000000 1.00000000 +v 1.00000000 1.00000000 1.00000000 +v -1.00000000 1.00000000 1.00000000 +vt 0.33142342 0.61702214 +vt 0.33143888 0.61705421 +vt 0.33144057 0.61704314 +vt 0.33144483 0.61704469 +vt 0.33170046 0.18545508 +vt 0.33170046 0.51682593 +vt 0.49710884 0.85133672 +vt 0.49712430 0.85136879 +vt 0.49712599 0.85135771 +vt 0.49713025 0.85135927 +vt 0.66279427 0.61702214 +vt 0.66280973 0.61705421 +vt 0.66281142 0.61704314 +vt 0.66281568 0.61704469 +vt 0.66307131 0.18545508 +vt 0.66307131 0.51682593 +vn -7.8504623e-17 0.0000000e+0 -1.00000000 +vn 0.65328148 -0.65328148 -0.38268343 +vn -0.65328148 -0.65328148 -0.38268343 +vn 0.65328148 0.65328148 -0.38268343 +vn -0.65328148 0.65328148 -0.38268343 +g bb_point_bb_point +usemtl bb_point +s 1 +f 1/10/1 2/4/2 3/14/3 +f 2/11/2 1/7/1 4/1/4 +f 4/13/4 1/9/1 5/3/5 +f 4/16/4 5/6/5 3/5/3 2/15/2 +f 5/12/5 1/8/1 3/2/3 diff --git a/res/models/playership/body/bb_point.png b/res/models/playership/body/bb_point.png new file mode 100644 index 0000000..cff38ac Binary files /dev/null and b/res/models/playership/body/bb_point.png differ diff --git a/res/models/playership/body/bb_triangle.mtl b/res/models/playership/body/bb_triangle.mtl new file mode 100644 index 0000000..4c4d8ae --- /dev/null +++ b/res/models/playership/body/bb_triangle.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bb_triangle +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bb_triangle.png + diff --git a/res/models/playership/body/bb_triangle.obj b/res/models/playership/body/bb_triangle.obj new file mode 100644 index 0000000..44a02fd --- /dev/null +++ b/res/models/playership/body/bb_triangle.obj @@ -0,0 +1,42 @@ +# Exported from Wings 3D 1.4.1 +mtllib bb_triangle.mtl +o bb_triangle +#6 vertices, 5 faces +v -1.00000000 1.00000000 -1.00000000 +v -1.00000000 -1.00000000 -1.00000000 +v 1.00000000 -1.00000000 1.00000000 +v 1.00000000 1.00000000 1.00000000 +v -1.00000000 1.00000000 1.00000000 +v -1.00000000 -1.00000000 1.00000000 +vt 5.0844444e-2 0.43444444 +vt 5.0844444e-2 0.10111111 +vt 0.16120000 0.63200000 +vt 0.16120000 0.96533333 +vt 0.49453333 0.63200000 +vt 0.49453333 0.96533333 +vt 0.49501111 0.63190000 +vt 0.49501111 0.96523333 +vt 0.52224897 0.10111111 +vt 0.52224897 0.43444444 +vt 0.59606008 0.10183333 +vt 0.59607040 0.10175757 +vt 0.82834444 0.63190000 +vt 0.82834444 0.96523333 +vt 0.92939341 0.10183333 +vt 0.92939341 0.43516667 +vt 0.92940373 0.10175757 +vt 0.92940373 0.43509090 +vn -0.23258782 0.79410449 -0.56151667 +vn -0.23258782 -0.79410449 -0.56151667 +vn 0.56151667 -0.79410449 0.23258782 +vn 0.56151667 0.79410449 0.23258782 +vn -0.57735027 0.57735027 0.57735027 +vn -0.57735027 -0.57735027 0.57735027 +g bb_triangle_bb_triangle +usemtl bb_triangle +s 1 +f 1/10/1 4/1/4 3/2/3 2/9/2 +f 2/16/2 3/11/3 6/15/6 +f 2/7/2 6/13/6 5/14/5 1/8/1 +f 4/6/4 5/4/5 6/3/6 3/5/3 +f 5/17/5 4/18/4 1/12/1 diff --git a/res/models/playership/body/bb_triangle.png b/res/models/playership/body/bb_triangle.png new file mode 100644 index 0000000..5d3c771 Binary files /dev/null and b/res/models/playership/body/bb_triangle.png differ diff --git a/res/models/playership/body/bs_corner1.mtl b/res/models/playership/body/bs_corner1.mtl new file mode 100644 index 0000000..757e6dc --- /dev/null +++ b/res/models/playership/body/bs_corner1.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner1 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner1.png + diff --git a/res/models/playership/body/bs_corner1.obj b/res/models/playership/body/bs_corner1.obj new file mode 100644 index 0000000..4a38c2c --- /dev/null +++ b/res/models/playership/body/bs_corner1.obj @@ -0,0 +1,71 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner1.mtl +o bs_corner1 +#12 vertices, 8 faces +v -1.00000000 -1.00000000 1.00000000 +v 1.00000000 -1.00000000 1.00000000 +v -1.00000000 1.00000000 1.00000000 +v 1.00000000 1.00000000 1.00000000 +v 1.00000000 -1.00000000 4.9960036e-16 +v 1.00000000 1.00000000 4.9960036e-16 +v -1.00000000 -1.00000000 -1.00000000 +v 5.7191665e-18 -1.00000000 -1.00000000 +v 1.00000000 -0.50000000 -1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v -1.00000000 1.00000000 -1.00000000 +v 5.7191665e-18 1.00000000 -1.00000000 +vt 0.15243739 0.66817615 +vt 0.15266350 0.66925187 +vt 0.15300631 0.66933739 +vt 0.15325125 0.83492622 +vt 0.15330782 0.83484069 +vt 0.15332631 1.00037407 +vt 0.15354675 0.33635230 +vt 0.15359762 4.3277765e-3 +vt 0.15359762 0.33615163 +vt 0.15375419 1.00051033 +vt 0.31948565 1.00051504 +vt 0.31950955 4.3277765e-3 +vt 0.31950955 0.33615163 +vt 0.31954222 1.00042952 +vt 0.48495302 0.66925187 +vt 0.48507573 1.00051504 +vt 0.48513230 1.00042952 +vt 0.48514395 0.66933739 +vt 0.48525463 0.33645388 +vt 0.48525463 0.66827773 +vt 0.48537060 0.33635230 +vt 0.48537060 0.66817615 +vt 0.48542147 8.7283739e-2 +vt 0.48542147 0.25319566 +vt 0.48565953 8.7482105e-2 +vt 0.48565953 0.25339403 +vt 0.65157146 4.5261426e-3 +vt 0.65157146 0.33634999 +vt 0.81596911 0.66827773 +vt 0.81707848 0.33645388 +vt 0.81748338 4.5261426e-3 +vt 0.81748338 0.33634999 +vn -0.57735027 -0.57735027 0.57735027 +vn 0.57735027 -0.57735027 0.57735027 +vn -0.57735027 0.57735027 0.57735027 +vn 0.57735027 0.57735027 0.57735027 +vn 0.60325553 -0.77813807 -0.17488254 +vn 0.60325553 0.77813807 -0.17488254 +vn -0.57735027 -0.57735027 -0.57735027 +vn 0.17488254 -0.77813807 -0.60325553 +vn 0.65425704 -0.37933555 -0.65425704 +vn 0.65425704 0.37933555 -0.65425704 +vn -0.57735027 0.57735027 -0.57735027 +vn 0.17488254 0.77813807 -0.60325553 +g bs_corner1_bs_corner1 +usemtl bs_corner1 +s 1 +f 1/18/1 7/16/7 8/11/8 5/4/5 2/3/2 +f 2/21/2 4/22/4 3/1/3 1/7/1 +f 2/8/2 5/12/5 9/23/9 10/24/10 6/13/6 4/9/4 +f 3/29/3 11/20/11 7/19/7 1/30/1 +f 4/2/4 6/5/6 12/14/12 11/17/11 3/15/3 +f 5/4/5 8/11/8 9/10/9 +f 7/31/7 11/32/11 12/28/12 10/26/10 9/25/9 8/27/8 +f 12/14/12 6/5/6 10/6/10 diff --git a/res/models/playership/body/bs_corner1.png b/res/models/playership/body/bs_corner1.png new file mode 100644 index 0000000..a07a9b1 Binary files /dev/null and b/res/models/playership/body/bs_corner1.png differ diff --git a/res/models/playership/body/bs_corner1_side1.mtl b/res/models/playership/body/bs_corner1_side1.mtl new file mode 100644 index 0000000..81c21a3 --- /dev/null +++ b/res/models/playership/body/bs_corner1_side1.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner1_side1 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner1_side1.png + diff --git a/res/models/playership/body/bs_corner1_side1.obj b/res/models/playership/body/bs_corner1_side1.obj new file mode 100644 index 0000000..4b22c3b --- /dev/null +++ b/res/models/playership/body/bs_corner1_side1.obj @@ -0,0 +1,77 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner1_side1.mtl +o bs_corner1_side1 +#14 vertices, 10 faces +v 1.00000000 -1.00000000 5.5511151e-17 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 -0.50000000 -1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v 1.00000000 1.00000000 5.5511151e-17 +v 1.0496626e-16 -1.00000000 -1.00000000 +v 1.0496626e-16 1.00000000 -1.00000000 +v -1.00000000 -1.00000000 -1.6653345e-16 +v -1.00000000 -1.00000000 -1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.00000000 1.00000000 -1.6653345e-16 +v -1.00000000 1.00000000 -1.00000000 +vt 4.3618659e-2 0.41573834 +vt 4.3970368e-2 0.55591580 +vt 4.5701806e-2 0.63508882 +vt 4.5719216e-2 0.95478126 +vt 4.5827943e-2 0.63483468 +vt 4.5883602e-2 0.24462879 +vt 4.5892703e-2 0.10581864 +vt 4.6068540e-2 0.95452702 +vt 0.18468920 0.31404296 +vt 0.18470740 3.6422666e-2 +vt 0.22441531 0.63507909 +vt 0.22443272 0.95477153 +vt 0.22454140 0.63470018 +vt 0.22478199 0.95439252 +vt 0.32349935 0.31405206 +vt 0.32351755 3.6431767e-2 +vt 0.32397358 0.41503492 +vt 0.32432529 0.55521238 +vt 0.38426153 0.63507039 +vt 0.38427023 0.79491661 +vt 0.38438757 0.63457988 +vt 0.38444624 0.95505090 +vt 0.38450787 0.79442605 +vt 0.38456254 0.95454776 +vt 0.46230949 0.31406116 +vt 0.46232769 3.6440868e-2 +vt 0.46397518 0.34459448 +vt 0.46467860 0.62494940 +vt 0.60112419 0.24466519 +vt 0.60113329 0.10585504 +vt 0.60432849 0.41433150 +vt 0.60468020 0.55450896 +vn 0.46094620 -0.88733643 1.2754078e-2 +vn 0.50673185 -0.45323475 0.73334923 +vn 0.65425704 -0.37933555 -0.65425704 +vn 0.50673185 0.45323475 0.73334923 +vn 0.65425704 0.37933555 -0.65425704 +vn 0.46094620 0.88733643 1.2754078e-2 +vn 0.17488254 -0.77813807 -0.60325553 +vn 0.17488254 0.77813807 -0.60325553 +vn -0.45696631 -0.86568941 0.20436155 +vn -0.57735027 -0.57735027 -0.57735027 +vn -0.50673185 -0.45323475 0.73334923 +vn -0.50673185 0.45323475 0.73334923 +vn -0.45696631 0.86568941 0.20436155 +vn -0.57735027 0.57735027 -0.57735027 +g bs_corner1_side1_bs_corner1_side1 +usemtl bs_corner1_side1 +s 1 +f 1/14/1 9/13/9 10/21/10 7/23/7 +f 2/17/2 4/18/4 12/2/12 11/1/11 +f 2/8/2 11/5/11 9/13/9 1/14/1 +f 3/24/3 1/14/1 7/23/7 +f 3/29/3 7/25/7 10/15/10 14/16/14 8/26/8 5/30/5 +f 5/32/5 6/28/6 4/18/4 2/17/2 1/27/1 3/31/3 +f 6/12/6 8/20/8 14/19/14 13/11/13 +f 8/20/8 6/12/6 5/22/5 +f 10/15/10 9/9/9 11/6/11 12/7/12 13/10/13 14/16/14 +f 13/11/13 12/3/12 4/4/4 6/12/6 diff --git a/res/models/playership/body/bs_corner1_side1.png b/res/models/playership/body/bs_corner1_side1.png new file mode 100644 index 0000000..185ccfb Binary files /dev/null and b/res/models/playership/body/bs_corner1_side1.png differ diff --git a/res/models/playership/body/bs_corner1_side1_m.mtl b/res/models/playership/body/bs_corner1_side1_m.mtl new file mode 100644 index 0000000..81c21a3 --- /dev/null +++ b/res/models/playership/body/bs_corner1_side1_m.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner1_side1 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner1_side1.png + diff --git a/res/models/playership/body/bs_corner1_side1_m.obj b/res/models/playership/body/bs_corner1_side1_m.obj new file mode 100644 index 0000000..cf286a6 --- /dev/null +++ b/res/models/playership/body/bs_corner1_side1_m.obj @@ -0,0 +1,77 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner1_side1_m.mtl +o bs_corner1_side1_m +#14 vertices, 10 faces +v -1.00000000 -1.00000000 5.5511151e-17 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 -0.50000000 -1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.00000000 1.00000000 5.5511151e-17 +v -1.0496626e-16 -1.00000000 -1.00000000 +v -1.0496626e-16 1.00000000 -1.00000000 +v 1.00000000 -1.00000000 -1.6653345e-16 +v 1.00000000 -1.00000000 -1.00000000 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 -1.6653345e-16 +v 1.00000000 1.00000000 -1.00000000 +vt 4.3618659e-2 0.41573834 +vt 4.3970368e-2 0.55591580 +vt 4.5701806e-2 0.63508882 +vt 4.5719216e-2 0.95478126 +vt 4.5827943e-2 0.63483468 +vt 4.5883602e-2 0.24462879 +vt 4.5892703e-2 0.10581864 +vt 4.6068540e-2 0.95452702 +vt 0.18468920 0.31404296 +vt 0.18470740 3.6422666e-2 +vt 0.22441531 0.63507909 +vt 0.22443272 0.95477153 +vt 0.22454140 0.63470018 +vt 0.22478199 0.95439252 +vt 0.32349935 0.31405206 +vt 0.32351755 3.6431767e-2 +vt 0.32397358 0.41503492 +vt 0.32432529 0.55521238 +vt 0.38426153 0.63507039 +vt 0.38427023 0.79491661 +vt 0.38438757 0.63457988 +vt 0.38444624 0.95505090 +vt 0.38450787 0.79442605 +vt 0.38456254 0.95454776 +vt 0.46230949 0.31406116 +vt 0.46232769 3.6440868e-2 +vt 0.46397518 0.34459448 +vt 0.46467860 0.62494940 +vt 0.60112419 0.24466519 +vt 0.60113329 0.10585504 +vt 0.60432849 0.41433150 +vt 0.60468020 0.55450896 +vn -0.46094620 -0.88733643 1.2754078e-2 +vn -0.50673185 -0.45323475 0.73334923 +vn -0.65425704 -0.37933555 -0.65425704 +vn -0.50673185 0.45323475 0.73334923 +vn -0.65425704 0.37933555 -0.65425704 +vn -0.46094620 0.88733643 1.2754078e-2 +vn -0.17488254 -0.77813807 -0.60325553 +vn -0.17488254 0.77813807 -0.60325553 +vn 0.45696631 -0.86568941 0.20436155 +vn 0.57735027 -0.57735027 -0.57735027 +vn 0.50673185 -0.45323475 0.73334923 +vn 0.50673185 0.45323475 0.73334923 +vn 0.45696631 0.86568941 0.20436155 +vn 0.57735027 0.57735027 -0.57735027 +g bs_corner1_side1_m_bs_corner1_side1 +usemtl bs_corner1_side1 +s 1 +f 1/14/1 9/13/9 11/5/11 2/8/2 +f 3/31/3 1/27/1 2/17/2 4/18/4 6/28/6 5/32/5 +f 5/22/5 6/12/6 8/20/8 +f 5/30/5 8/26/8 14/16/14 10/15/10 7/25/7 3/29/3 +f 6/12/6 4/4/4 12/3/12 13/11/13 +f 7/23/7 1/14/1 3/24/3 +f 7/23/7 10/21/10 9/13/9 1/14/1 +f 11/1/11 12/2/12 4/18/4 2/17/2 +f 13/11/13 14/19/14 8/20/8 6/12/6 +f 14/16/14 13/10/13 12/7/12 11/6/11 9/9/9 10/15/10 diff --git a/res/models/playership/body/bs_corner1_side2.mtl b/res/models/playership/body/bs_corner1_side2.mtl new file mode 100644 index 0000000..fae68f4 --- /dev/null +++ b/res/models/playership/body/bs_corner1_side2.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner1_side2 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner1_side2.png + diff --git a/res/models/playership/body/bs_corner1_side2.obj b/res/models/playership/body/bs_corner1_side2.obj new file mode 100644 index 0000000..64d986f --- /dev/null +++ b/res/models/playership/body/bs_corner1_side2.obj @@ -0,0 +1,81 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner1_side2.mtl +o bs_corner1_side2 +#14 vertices, 12 faces +v -1.1102230e-16 -1.00000000 -1.00000000 +v 1.00000000 -0.50000000 -1.00000000 +v -1.00000000 -0.50000000 -1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.1102230e-16 1.00000000 -1.00000000 +v 1.00000000 -1.00000000 -6.1230318e-17 +v -5.5511151e-17 -1.00000000 0.0000000e+0 +v 1.00000000 1.00000000 -6.1230318e-17 +v -5.5511151e-17 1.00000000 0.0000000e+0 +v 1.00000000 -0.50000000 1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 1.00000000 +v -1.00000000 0.50000000 1.00000000 +vt 6.6802000e-2 0.60397531 +vt 6.6822076e-2 0.60395431 +vt 6.6850003e-2 0.36260453 +vt 6.6850003e-2 0.52759030 +vt 6.6895662e-2 0.77791902 +vt 6.6908165e-2 0.94157833 +vt 6.6915738e-2 0.77789802 +vt 6.6928241e-2 0.94155733 +vt 6.7803368e-2 0.13469673 +vt 6.7803368e-2 0.29968250 +vt 0.23062677 0.77791902 +vt 0.23064685 0.77789802 +vt 0.23314571 0.94163075 +vt 0.23316579 0.94160975 +vt 0.39682155 0.36260453 +vt 0.39682155 0.52759030 +vt 0.39777491 0.13469673 +vt 0.39777491 0.29968250 +vt 0.40191470 0.60397531 +vt 0.40193477 0.60395431 +vt 0.40193883 0.94161296 +vt 0.40195890 0.94159196 +vt 0.50744041 0.69248108 +vt 0.50744041 0.85746685 +vt 0.50762138 0.69246799 +vt 0.50762138 0.85745376 +vt 0.67242619 0.60998820 +vt 0.67242619 0.93995974 +vt 0.67260715 0.60997511 +vt 0.67260715 0.93994665 +vt 0.83741196 0.69248108 +vt 0.83741196 0.85746685 +vt 0.83759292 0.69246799 +vt 0.83759292 0.85745376 +vn -1.2754078e-2 -0.88733643 -0.46094620 +vn 0.65425704 -0.37933555 -0.65425704 +vn -0.73334923 -0.45323475 -0.50673185 +vn 0.65425704 0.37933555 -0.65425704 +vn -0.73334923 0.45323475 -0.50673185 +vn -1.2754078e-2 0.88733643 -0.46094620 +vn 0.46094620 -0.88733643 1.2754078e-2 +vn -0.15638647 -0.97523666 0.15638647 +vn 0.46094620 0.88733643 1.2754078e-2 +vn -0.15638647 0.97523666 0.15638647 +vn 0.50673185 -0.45323475 0.73334923 +vn -0.53240740 -0.65809173 0.53240740 +vn 0.50673185 0.45323475 0.73334923 +vn -0.53240740 0.65809173 0.53240740 +g bs_corner1_side2_bs_corner1_side2 +usemtl bs_corner1_side2 +s 1 +f 1/7/1 7/14/7 8/12/8 +f 2/25/2 1/29/1 3/33/3 5/34/5 6/30/6 4/26/4 +f 2/31/2 4/32/4 9/28/9 13/24/13 11/23/11 7/27/7 +f 3/9/3 12/17/12 14/18/14 5/10/5 +f 6/5/6 5/1/5 14/19/14 10/11/10 +f 6/5/6 9/13/9 4/6/4 +f 7/14/7 1/7/1 2/8/2 +f 8/12/8 12/20/12 3/2/3 1/7/1 +f 10/11/10 9/13/9 6/5/6 +f 10/11/10 14/19/14 13/21/13 9/13/9 +f 11/22/11 12/20/12 8/12/8 7/14/7 +f 13/16/13 14/4/14 12/3/12 11/15/11 diff --git a/res/models/playership/body/bs_corner1_side2.png b/res/models/playership/body/bs_corner1_side2.png new file mode 100644 index 0000000..c8a4983 Binary files /dev/null and b/res/models/playership/body/bs_corner1_side2.png differ diff --git a/res/models/playership/body/bs_corner2_next.mtl b/res/models/playership/body/bs_corner2_next.mtl new file mode 100644 index 0000000..bcf2588 --- /dev/null +++ b/res/models/playership/body/bs_corner2_next.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner2_next +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner2_next.png + diff --git a/res/models/playership/body/bs_corner2_next.obj b/res/models/playership/body/bs_corner2_next.obj new file mode 100644 index 0000000..bba2862 --- /dev/null +++ b/res/models/playership/body/bs_corner2_next.obj @@ -0,0 +1,81 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner2_next.mtl +o bs_corner2_next +#14 vertices, 10 faces +v -1.00000000 -1.00000000 0.0000000e+0 +v -1.00000000 -1.00000000 1.00000000 +v -1.00000000 -0.50000000 -1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.00000000 1.00000000 0.0000000e+0 +v -1.00000000 1.00000000 1.00000000 +v 0.0000000e+0 -1.00000000 -1.00000000 +v 0.0000000e+0 1.00000000 -1.00000000 +v 1.00000000 -1.00000000 0.0000000e+0 +v 1.00000000 -1.00000000 1.00000000 +v 1.00000000 -0.50000000 -1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v 1.00000000 1.00000000 0.0000000e+0 +v 1.00000000 1.00000000 1.00000000 +vt 9.9611734e-4 0.65759189 +vt 9.9611734e-4 0.82425855 +vt 0.12589259 9.5778903e-2 +vt 0.12589259 0.26115855 +vt 0.12589259 0.43687442 +vt 0.12606080 9.5937310e-2 +vt 0.12606080 0.26131696 +vt 0.12606080 0.43703283 +vt 0.16766278 0.57425855 +vt 0.16766278 0.90759189 +vt 0.29255926 0.43704580 +vt 0.29272747 0.43720421 +vt 0.33421752 0.57416925 +vt 0.33421752 0.90750258 +vt 0.33432945 0.57425855 +vt 0.33432945 0.90759189 +vt 0.45922593 9.5778903e-2 +vt 0.45922593 0.26115855 +vt 0.45922593 0.43687442 +vt 0.45939414 9.5937310e-2 +vt 0.45939414 0.26131696 +vt 0.45939414 0.43703283 +vt 0.56541363 0.17486434 +vt 0.56541363 0.34153100 +vt 0.66755086 0.57416925 +vt 0.66755086 0.90750258 +vt 0.66768398 0.57422010 +vt 0.66768398 0.90755343 +vt 0.73208029 9.1531004e-2 +vt 0.73208029 0.42486434 +vt 0.83435065 0.57422010 +vt 0.83435065 0.90755343 +vt 0.89787315 0.17486434 +vt 0.89787315 0.34153100 +vt 0.99977141 0.65755343 +vt 0.99977141 0.82422010 +vn -0.60325553 -0.77813807 -0.17488254 +vn -0.57735027 -0.57735027 0.57735027 +vn -0.65425704 -0.37933555 -0.65425704 +vn -0.65425704 0.37933555 -0.65425704 +vn -0.60325553 0.77813807 -0.17488254 +vn -0.57735027 0.57735027 0.57735027 +vn 0.0000000e+0 -0.82311938 -0.56786837 +vn 0.0000000e+0 0.82311938 -0.56786837 +vn 0.60325553 -0.77813807 -0.17488254 +vn 0.57735027 -0.57735027 0.57735027 +vn 0.65425704 -0.37933555 -0.65425704 +vn 0.65425704 0.37933555 -0.65425704 +vn 0.60325553 0.77813807 -0.17488254 +vn 0.57735027 0.57735027 0.57735027 +g bs_corner2_next_bs_corner2_next +usemtl bs_corner2_next +s 1 +f 1/18/1 7/11/7 9/4/9 10/3/10 2/17/2 +f 2/15/2 6/16/6 5/10/5 4/2/4 3/1/3 1/9/1 +f 2/13/2 10/25/10 14/26/14 6/14/6 +f 3/19/3 7/11/7 1/18/1 +f 4/34/4 8/30/8 12/24/12 11/23/11 7/29/7 3/33/3 +f 5/7/5 8/12/8 4/8/4 +f 6/6/6 14/20/14 13/21/13 8/12/8 5/7/5 +f 7/11/7 11/5/11 9/4/9 +f 9/31/9 11/35/11 12/36/12 13/32/13 14/28/14 10/27/10 +f 13/21/13 12/22/12 8/12/8 diff --git a/res/models/playership/body/bs_corner2_next.png b/res/models/playership/body/bs_corner2_next.png new file mode 100644 index 0000000..1d93b70 Binary files /dev/null and b/res/models/playership/body/bs_corner2_next.png differ diff --git a/res/models/playership/body/bs_corner2_opp.mtl b/res/models/playership/body/bs_corner2_opp.mtl new file mode 100644 index 0000000..3856d4f --- /dev/null +++ b/res/models/playership/body/bs_corner2_opp.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner2_opp +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner2_opp.png + diff --git a/res/models/playership/body/bs_corner2_opp.obj b/res/models/playership/body/bs_corner2_opp.obj new file mode 100644 index 0000000..7451adb --- /dev/null +++ b/res/models/playership/body/bs_corner2_opp.obj @@ -0,0 +1,155 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner2_opp.mtl +o bs_corner2_opp +#36 vertices, 10 faces +v -1.00000000 -1.00000000 -1.00000000 +v -1.00000000 -1.00000000 -0.50000000 +v -1.00000000 -1.00000000 0.0000000e+0 +v -1.00000000 -0.50000000 -1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.0000000e+0 -1.00000000 +v -1.00000000 0.0000000e+0 1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.00000000 1.00000000 -1.00000000 +v -1.00000000 1.00000000 -0.50000000 +v -1.00000000 1.00000000 0.0000000e+0 +v -0.50000000 -1.00000000 -1.00000000 +v -0.50000000 -1.00000000 0.50000000 +v -0.50000000 1.00000000 -1.00000000 +v -0.50000000 1.00000000 0.50000000 +v 0.0000000e+0 -1.00000000 -1.00000000 +v 0.0000000e+0 -1.00000000 1.00000000 +v 0.0000000e+0 1.00000000 -1.00000000 +v 0.0000000e+0 1.00000000 1.00000000 +v 0.50000000 -1.00000000 -0.50000000 +v 0.50000000 -1.00000000 1.00000000 +v 0.50000000 1.00000000 -0.50000000 +v 0.50000000 1.00000000 1.00000000 +v 1.00000000 -1.00000000 0.0000000e+0 +v 1.00000000 -1.00000000 0.50000000 +v 1.00000000 -1.00000000 1.00000000 +v 1.00000000 -0.50000000 -1.00000000 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.0000000e+0 -1.00000000 +v 1.00000000 0.0000000e+0 1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 0.0000000e+0 +v 1.00000000 1.00000000 0.50000000 +v 1.00000000 1.00000000 1.00000000 +vt 0.27270342 0.20838243 +vt 0.27270342 0.29171576 +vt 0.27270342 0.37504909 +vt 0.27284786 0.20871576 +vt 0.27284786 0.29204909 +vt 0.27284786 0.37538243 +vt 0.33633045 0.49599917 +vt 0.33633045 0.66266584 +vt 0.33633045 0.74599917 +vt 0.33633045 0.82933251 +vt 0.33669349 0.49611659 +vt 0.33669349 0.66278326 +vt 0.33669349 0.74611659 +vt 0.33669349 0.82944992 +vt 0.39055455 0.12504909 +vt 0.39055455 0.45838243 +vt 0.39069899 0.12538243 +vt 0.39069899 0.45871576 +vt 0.41966379 0.57933251 +vt 0.41966379 0.82933251 +vt 0.42002682 0.57944992 +vt 0.42002682 0.82944992 +vt 0.44948011 0.12504909 +vt 0.44948011 0.45838243 +vt 0.44962456 0.12538243 +vt 0.44962456 0.45871576 +vt 0.50299712 0.49599917 +vt 0.50299712 0.82933251 +vt 0.50336016 0.49611659 +vt 0.50336016 0.82944992 +vt 0.50840568 0.12504909 +vt 0.50840568 0.20838243 +vt 0.50840568 0.29171576 +vt 0.50840568 0.37504909 +vt 0.50840568 0.45838243 +vt 0.50855012 0.12538243 +vt 0.50855012 0.20871576 +vt 0.50855012 0.29204909 +vt 0.50855012 0.37538243 +vt 0.50855012 0.45871576 +vt 0.56733124 0.12504909 +vt 0.56733124 0.45838243 +vt 0.56747569 0.12538243 +vt 0.56747569 0.45871576 +vt 0.58633045 0.49599917 +vt 0.58633045 0.74599917 +vt 0.58669349 0.49611659 +vt 0.58669349 0.74611659 +vt 0.62625681 0.12504909 +vt 0.62625681 0.45838243 +vt 0.62640125 0.12538243 +vt 0.62640125 0.45871576 +vt 0.66966379 0.49599917 +vt 0.66966379 0.57933251 +vt 0.66966379 0.66266584 +vt 0.66966379 0.82933251 +vt 0.67002682 0.49611659 +vt 0.67002682 0.57944992 +vt 0.67002682 0.66278326 +vt 0.67002682 0.82944992 +vt 0.74410794 0.20838243 +vt 0.74410794 0.29171576 +vt 0.74410794 0.37504909 +vt 0.74425238 0.20871576 +vt 0.74425238 0.29204909 +vt 0.74425238 0.37538243 +vn -0.57735027 -0.57735027 -0.57735027 +vn -0.70710678 -0.70710678 0.0000000e+0 +vn -0.60325553 -0.77813807 0.17488254 +vn -0.70710678 0.0000000e+0 -0.70710678 +vn -0.65425704 -0.37933555 0.65425704 +vn -0.70710678 0.0000000e+0 -0.70710678 +vn -0.70710678 0.0000000e+0 0.70710678 +vn -0.70710678 0.0000000e+0 -0.70710678 +vn -0.65425704 0.37933555 0.65425704 +vn -0.57735027 0.57735027 -0.57735027 +vn -0.70710678 0.70710678 0.0000000e+0 +vn -0.60325553 0.77813807 0.17488254 +vn 0.0000000e+0 -0.70710678 -0.70710678 +vn -0.21418650 -0.95302061 0.21418650 +vn 0.0000000e+0 0.70710678 -0.70710678 +vn -0.21418650 0.95302061 0.21418650 +vn 0.17488254 -0.77813807 -0.60325553 +vn -0.17488254 -0.77813807 0.60325553 +vn 0.17488254 0.77813807 -0.60325553 +vn -0.17488254 0.77813807 0.60325553 +vn 0.21418650 -0.95302061 -0.21418650 +vn 0.0000000e+0 -0.70710678 0.70710678 +vn 0.21418650 0.95302061 -0.21418650 +vn 0.0000000e+0 0.70710678 0.70710678 +vn 0.60325553 -0.77813807 -0.17488254 +vn 0.70710678 -0.70710678 0.0000000e+0 +vn 0.57735027 -0.57735027 0.57735027 +vn 0.65425704 -0.37933555 -0.65425704 +vn 0.70710678 0.0000000e+0 0.70710678 +vn 0.70710678 0.0000000e+0 -0.70710678 +vn 0.70710678 0.0000000e+0 0.70710678 +vn 0.65425704 0.37933555 -0.65425704 +vn 0.70710678 0.0000000e+0 0.70710678 +vn 0.60325553 0.77813807 -0.17488254 +vn 0.70710678 0.70710678 0.0000000e+0 +vn 0.57735027 0.57735027 0.57735027 +g bs_corner2_opp_bs_corner2_opp +usemtl bs_corner2_opp +s 1 +f 1/14/1 13/13/13 17/12/17 21/21/21 25/29/25 26/47/26 27/57/27 22/58/22 18/59/18 14/48/14 3/30/3 2/22/2 +f 2/41/2 3/49/3 5/61/5 7/62/7 9/63/9 12/50/12 11/42/11 10/35/10 8/34/8 6/33/6 4/32/4 1/31/1 +f 4/32/4 6/33/6 8/34/8 10/35/10 15/24/15 19/16/19 32/3/32 30/2/30 28/1/28 17/15/17 13/23/13 1/31/1 +f 5/4/5 18/17/18 22/25/22 27/36/27 29/37/29 31/38/31 33/39/33 36/40/36 24/26/24 20/18/20 9/6/9 7/5/7 +f 11/9/11 12/8/12 16/19/16 20/27/20 24/45/24 36/53/36 35/54/35 34/55/34 23/46/23 19/28/19 15/20/15 10/10/10 +f 12/8/12 9/7/9 20/27/20 16/19/16 +f 14/48/14 18/59/18 5/60/5 3/30/3 +f 17/12/17 28/11/28 25/29/25 21/21/21 +f 23/46/23 34/55/34 32/56/32 19/28/19 +f 25/51/25 28/64/28 30/65/30 32/66/32 34/52/34 35/44/35 36/40/36 33/39/33 31/38/31 29/37/29 27/36/27 26/43/26 diff --git a/res/models/playership/body/bs_corner2_opp.png b/res/models/playership/body/bs_corner2_opp.png new file mode 100644 index 0000000..687c741 Binary files /dev/null and b/res/models/playership/body/bs_corner2_opp.png differ diff --git a/res/models/playership/body/bs_corner2_side1.mtl b/res/models/playership/body/bs_corner2_side1.mtl new file mode 100644 index 0000000..124aae5 --- /dev/null +++ b/res/models/playership/body/bs_corner2_side1.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner2_side1 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner2_side1.png + diff --git a/res/models/playership/body/bs_corner2_side1.obj b/res/models/playership/body/bs_corner2_side1.obj new file mode 100644 index 0000000..8f9a1fb --- /dev/null +++ b/res/models/playership/body/bs_corner2_side1.obj @@ -0,0 +1,83 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner2_side1.mtl +o bs_corner2_side1 +#14 vertices, 12 faces +v -1.1102230e-16 -1.00000000 -1.00000000 +v 1.00000000 -0.50000000 -1.00000000 +v -1.00000000 -0.50000000 -1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.1102230e-16 1.00000000 -1.00000000 +v 1.00000000 -1.00000000 0.0000000e+0 +v -1.00000000 -1.00000000 1.1102230e-16 +v 1.00000000 1.00000000 0.0000000e+0 +v -1.00000000 1.00000000 1.1102230e-16 +v 1.00000000 -0.50000000 1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 1.00000000 +v -1.00000000 0.50000000 1.00000000 +vt 0.12893899 0.30920097 +vt 0.12917678 0.30926992 +vt 0.12971424 0.14253431 +vt 0.12971424 0.47586764 +vt 0.12995203 0.14260325 +vt 0.12995203 0.47593658 +vt 0.29431864 0.14253431 +vt 0.29431864 0.47586764 +vt 0.29455642 0.14260325 +vt 0.29455642 0.47593658 +vt 0.33176766 0.70777198 +vt 0.33176766 0.87443864 +vt 0.33226981 0.70816594 +vt 0.33226981 0.87483261 +vt 0.33262668 0.70816594 +vt 0.33262668 0.87483261 +vt 0.47003451 0.14253431 +vt 0.47003451 0.47586764 +vt 0.47027230 0.14260325 +vt 0.47027230 0.47593658 +vt 0.49843432 0.62443864 +vt 0.49843432 0.95777198 +vt 0.49893648 0.62483261 +vt 0.49893648 0.95816594 +vt 0.49929334 0.62483261 +vt 0.49929334 0.95816594 +vt 0.55040713 0.21312755 +vt 0.55040713 0.37979422 +vt 0.66510099 0.70777198 +vt 0.66510099 0.87443864 +vt 0.66560314 0.70816594 +vt 0.66560314 0.87483261 +vt 0.66596001 0.70816594 +vt 0.66596001 0.87483261 +vt 0.88374046 0.21312755 +vt 0.88374046 0.37979422 +vn -1.7353750e-17 -0.82311938 -0.56786837 +vn 0.65425704 -0.37933555 -0.65425704 +vn -0.65425704 -0.37933555 -0.65425704 +vn 0.65425704 0.37933555 -0.65425704 +vn -0.65425704 0.37933555 -0.65425704 +vn -1.7353750e-17 0.82311938 -0.56786837 +vn 0.46094620 -0.88733643 1.2754078e-2 +vn -0.46094620 -0.88733643 1.2754078e-2 +vn 0.46094620 0.88733643 1.2754078e-2 +vn -0.46094620 0.88733643 1.2754078e-2 +vn 0.50673185 -0.45323475 0.73334923 +vn -0.50673185 -0.45323475 0.73334923 +vn 0.50673185 0.45323475 0.73334923 +vn -0.50673185 0.45323475 0.73334923 +g bs_corner2_side1_bs_corner2_side1 +usemtl bs_corner2_side1 +s 1 +f 2/13/2 1/23/1 3/31/3 5/32/5 6/24/6 4/14/4 +f 2/33/2 4/34/4 9/26/9 13/16/13 11/15/11 7/25/7 +f 3/11/3 8/21/8 12/29/12 14/30/14 10/22/10 5/12/5 +f 6/2/6 9/10/9 4/6/4 +f 7/8/7 1/1/1 2/4/2 +f 7/8/7 11/18/11 12/17/12 8/7/8 +f 8/7/8 1/1/1 7/8/7 +f 8/7/8 3/3/3 1/1/1 +f 9/10/9 6/2/6 10/9/10 +f 10/9/10 6/2/6 5/5/5 +f 10/9/10 14/19/14 13/20/13 9/10/9 +f 11/35/11 13/36/13 14/28/14 12/27/12 diff --git a/res/models/playership/body/bs_corner2_side1.png b/res/models/playership/body/bs_corner2_side1.png new file mode 100644 index 0000000..b413d8a Binary files /dev/null and b/res/models/playership/body/bs_corner2_side1.png differ diff --git a/res/models/playership/body/bs_corner3.mtl b/res/models/playership/body/bs_corner3.mtl new file mode 100644 index 0000000..3642550 --- /dev/null +++ b/res/models/playership/body/bs_corner3.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner3 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner3.png + diff --git a/res/models/playership/body/bs_corner3.obj b/res/models/playership/body/bs_corner3.obj new file mode 100644 index 0000000..6ab86b4 --- /dev/null +++ b/res/models/playership/body/bs_corner3.obj @@ -0,0 +1,89 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner3.mtl +o bs_corner3 +#16 vertices, 12 faces +v -2.9849780e-16 -1.00000000 -1.00000000 +v 1.00000000 -0.50000000 -1.00000000 +v -1.00000000 -0.50000000 -1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -2.9849780e-16 1.00000000 -1.00000000 +v 1.00000000 -1.00000000 -2.8604980e-16 +v -1.00000000 -1.00000000 3.2625337e-16 +v 1.00000000 1.00000000 -2.8604980e-16 +v -1.00000000 1.00000000 3.2625337e-16 +v 1.00000000 -1.00000000 1.00000000 +v 3.1380538e-16 -1.00000000 1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 1.00000000 +v 3.1380538e-16 1.00000000 1.00000000 +vt 0.17434457 0.18885128 +vt 0.17434457 0.35465929 +vt 0.17518722 0.18861897 +vt 0.17518722 0.35442698 +vt 0.33995790 0.70769108 +vt 0.34006446 0.70755164 +vt 0.34015258 0.10594728 +vt 0.34015258 0.43756330 +vt 0.34060181 0.87317619 +vt 0.34070838 0.87303675 +vt 0.34099523 0.10571497 +vt 0.34099523 0.43733098 +vt 0.34123020 0.54235684 +vt 0.34133676 0.54221740 +vt 0.50480034 0.54220597 +vt 0.50490691 0.54206653 +vt 0.50533785 0.35461544 +vt 0.50533785 0.18880744 +vt 0.50596059 0.18885128 +vt 0.50596059 0.35465929 +vt 0.50608818 0.87317619 +vt 0.50619474 0.87303675 +vt 0.50680324 0.18861897 +vt 0.50680324 0.35442698 +vt 0.67033754 0.87272658 +vt 0.67044411 0.87258714 +vt 0.67093062 0.70769108 +vt 0.67103719 0.70755164 +vt 0.67110716 0.54240902 +vt 0.67114586 0.10590343 +vt 0.67114586 0.43751945 +vt 0.67121372 0.54226958 +vt 0.67176860 0.10594728 +vt 0.67176860 0.43756330 +vt 0.83695387 0.10590343 +vt 0.83695387 0.43751945 +vt 0.83757661 0.10594728 +vt 0.83757661 0.43756330 +vn -1.7353750e-16 -0.82311938 -0.56786837 +vn 0.65425704 -0.37933555 -0.65425704 +vn -0.65425704 -0.37933555 -0.65425704 +vn 0.65425704 0.37933555 -0.65425704 +vn -0.65425704 0.37933555 -0.65425704 +vn -1.7353750e-16 0.82311938 -0.56786837 +vn 0.60325553 -0.77813807 -0.17488254 +vn -0.56786837 -0.82311938 1.9089125e-16 +vn 0.60325553 0.77813807 -0.17488254 +vn -0.56786837 0.82311938 2.2559875e-16 +vn 0.57735027 -0.57735027 0.57735027 +vn -0.17488254 -0.77813807 0.60325553 +vn -0.65425704 -0.37933555 0.65425704 +vn -0.65425704 0.37933555 0.65425704 +vn 0.57735027 0.57735027 0.57735027 +vn -0.17488254 0.77813807 0.60325553 +g bs_corner3_bs_corner3 +usemtl bs_corner3 +s 1 +f 2/3/2 1/11/1 3/23/3 5/24/5 6/12/6 4/4/4 +f 2/18/2 4/17/4 9/31/9 15/36/15 11/35/11 7/30/7 +f 3/1/3 8/7/8 13/19/13 14/20/14 10/8/10 5/2/5 +f 6/28/6 9/22/9 4/26/4 +f 7/21/7 1/27/1 2/25/2 +f 8/15/8 3/29/3 1/27/1 +f 9/22/9 6/28/6 10/16/10 16/6/16 15/10/15 +f 10/16/10 6/28/6 5/32/5 +f 10/16/10 14/14/14 16/6/16 +f 11/9/11 12/5/12 8/15/8 1/27/1 7/21/7 +f 11/37/11 15/38/15 16/34/16 14/20/14 13/19/13 12/33/12 +f 12/5/12 13/13/13 8/15/8 diff --git a/res/models/playership/body/bs_corner3.png b/res/models/playership/body/bs_corner3.png new file mode 100644 index 0000000..ba7587c Binary files /dev/null and b/res/models/playership/body/bs_corner3.png differ diff --git a/res/models/playership/body/bs_corner4.mtl b/res/models/playership/body/bs_corner4.mtl new file mode 100644 index 0000000..7320c00 --- /dev/null +++ b/res/models/playership/body/bs_corner4.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_corner4 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_corner4.png + diff --git a/res/models/playership/body/bs_corner4.obj b/res/models/playership/body/bs_corner4.obj new file mode 100644 index 0000000..bf826ff --- /dev/null +++ b/res/models/playership/body/bs_corner4.obj @@ -0,0 +1,93 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_corner4.mtl +o bs_corner4 +#16 vertices, 14 faces +v -1.00000000 -1.00000000 0.0000000e+0 +v -1.00000000 -0.50000000 -1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.00000000 1.00000000 0.0000000e+0 +v 0.0000000e+0 -1.00000000 -1.00000000 +v 0.0000000e+0 -1.00000000 1.00000000 +v 0.0000000e+0 1.00000000 -1.00000000 +v 0.0000000e+0 1.00000000 1.00000000 +v 1.00000000 -1.00000000 0.0000000e+0 +v 1.00000000 -0.50000000 -1.00000000 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 0.0000000e+0 +vt 0.34228889 0.69583333 +vt 0.34228889 0.69621111 +vt 0.34228889 0.69645556 +vt 0.34228889 0.86250000 +vt 0.34228889 0.86287778 +vt 0.34228889 0.86312222 +vt 0.34247778 8.8977778e-2 +vt 0.34247778 8.9122222e-2 +vt 0.34247778 0.25564444 +vt 0.34247778 0.25578889 +vt 0.34247778 0.42231111 +vt 0.34247778 0.69583333 +vt 0.34247778 0.86250000 +vt 0.34247778 0.42245556 +vt 0.50895556 0.61250000 +vt 0.50895556 0.61287778 +vt 0.50895556 0.61312222 +vt 0.50895556 0.94583333 +vt 0.50895556 0.94621111 +vt 0.50895556 0.94645556 +vt 0.50914444 8.8977778e-2 +vt 0.50914444 8.9122222e-2 +vt 0.50914444 0.42231111 +vt 0.50914444 0.61250000 +vt 0.50914444 0.94583333 +vt 0.50914444 0.42245556 +vt 0.67562222 0.69583333 +vt 0.67562222 0.69621111 +vt 0.67562222 0.69645556 +vt 0.67562222 0.86250000 +vt 0.67562222 0.86287778 +vt 0.67562222 0.86312222 +vt 0.67581111 8.8977778e-2 +vt 0.67581111 8.9122222e-2 +vt 0.67581111 0.25564444 +vt 0.67581111 0.25578889 +vt 0.67581111 0.42231111 +vt 0.67581111 0.42245556 +vt 0.67581111 0.69583333 +vt 0.67581111 0.86250000 +vn -0.56786837 -0.82311938 0.0000000e+0 +vn -0.65425704 -0.37933555 -0.65425704 +vn -0.65425704 -0.37933555 0.65425704 +vn -0.65425704 0.37933555 -0.65425704 +vn -0.65425704 0.37933555 0.65425704 +vn -0.56786837 0.82311938 0.0000000e+0 +vn 0.0000000e+0 -0.82311938 -0.56786837 +vn 0.0000000e+0 -0.82311938 0.56786837 +vn 0.0000000e+0 0.82311938 -0.56786837 +vn 0.0000000e+0 0.82311938 0.56786837 +vn 0.56786837 -0.82311938 0.0000000e+0 +vn 0.65425704 -0.37933555 -0.65425704 +vn 0.65425704 -0.37933555 0.65425704 +vn 0.65425704 0.37933555 -0.65425704 +vn 0.65425704 0.37933555 0.65425704 +vn 0.56786837 0.82311938 0.0000000e+0 +g bs_corner4_bs_corner4 +usemtl bs_corner4 +s 1 +f 2/1/2 1/15/1 3/27/3 5/30/5 6/18/6 4/4/4 +f 2/38/2 7/26/7 1/36/1 +f 3/2/3 8/16/8 13/28/13 15/31/15 10/19/10 5/5/5 +f 4/32/4 9/20/9 14/6/14 12/3/12 7/17/7 2/29/2 +f 6/9/6 9/23/9 4/11/4 +f 7/26/7 11/10/11 8/22/8 1/36/1 +f 7/26/7 12/14/12 11/10/11 +f 8/22/8 3/34/3 1/36/1 +f 10/21/10 6/9/6 5/7/5 +f 10/21/10 15/33/15 16/35/16 +f 11/10/11 13/8/13 8/22/8 +f 14/40/14 16/25/16 15/13/15 13/12/13 11/24/11 12/39/12 +f 16/35/16 9/23/9 6/9/6 10/21/10 +f 16/35/16 14/37/14 9/23/9 diff --git a/res/models/playership/body/bs_corner4.png b/res/models/playership/body/bs_corner4.png new file mode 100644 index 0000000..2103063 Binary files /dev/null and b/res/models/playership/body/bs_corner4.png differ diff --git a/res/models/playership/body/bs_point.mtl b/res/models/playership/body/bs_point.mtl new file mode 100644 index 0000000..f81f40f --- /dev/null +++ b/res/models/playership/body/bs_point.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_point +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_point.png + diff --git a/res/models/playership/body/bs_point.obj b/res/models/playership/body/bs_point.obj new file mode 100644 index 0000000..64c1559 --- /dev/null +++ b/res/models/playership/body/bs_point.obj @@ -0,0 +1,56 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_point.mtl +o bs_point +#9 vertices, 7 faces +v -8.1640424e-17 0.0000000e+0 0.0000000e+0 +v -1.00000000 0.0000000e+0 1.00000000 +v 1.00000000 0.0000000e+0 1.00000000 +v 1.00000000 0.50000000 1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v 1.00000000 -0.50000000 1.00000000 +v 0.0000000e+0 -1.00000000 1.00000000 +v 0.0000000e+0 1.00000000 1.00000000 +vt 8.7244444e-2 0.52448672 +vt 8.7244444e-2 0.64948672 +vt 8.7244444e-2 0.77448672 +vt 0.33724444 0.39948672 +vt 0.33724444 0.89948672 +vt 0.41607778 0.13533279 +vt 0.41628889 0.13576613 +vt 0.58724444 0.52448672 +vt 0.58724444 0.64948672 +vt 0.58724444 0.77448672 +vt 0.66607778 4.6944444e-2 +vt 0.66607778 0.40049784 +vt 0.66628889 4.7377778e-2 +vt 0.66628889 0.40093117 +vt 0.70025393 0.48936504 +vt 0.70042168 0.48925393 +vt 0.82525393 0.48936504 +vt 0.82525393 0.84291843 +vt 0.82542168 0.48925393 +vt 0.82542168 0.84280732 +vt 0.91607778 0.13533279 +vt 0.91628889 0.13576613 +vt 0.95025393 0.48936504 +vt 0.95042168 0.48925393 +vn -2.7205479e-17 0.0000000e+0 -1.00000000 +vn -0.92387953 0.0000000e+0 0.38268343 +vn 0.92387953 0.0000000e+0 0.38268343 +vn 0.80592145 0.51639778 -0.28952367 +vn -0.80592145 0.51639778 -0.28952367 +vn -0.80592145 -0.51639778 -0.28952367 +vn 0.80592145 -0.51639778 -0.28952367 +vn 4.0390295e-17 -0.97014250 -0.24253563 +vn 4.0390295e-17 0.97014250 -0.24253563 +g bs_point_bs_point +usemtl bs_point +s 1 +f 1/14/1 7/7/7 8/13/8 +f 1/14/1 8/13/8 6/22/6 +f 2/2/2 6/1/6 8/4/8 7/8/7 3/9/3 4/10/4 9/5/9 5/3/5 +f 3/19/3 7/24/7 1/20/1 4/16/4 +f 5/23/5 1/18/1 6/15/6 2/17/2 +f 9/11/9 1/12/1 5/6/5 +f 9/11/9 4/21/4 1/12/1 diff --git a/res/models/playership/body/bs_point.png b/res/models/playership/body/bs_point.png new file mode 100644 index 0000000..a7b345f Binary files /dev/null and b/res/models/playership/body/bs_point.png differ diff --git a/res/models/playership/body/bs_side.mtl b/res/models/playership/body/bs_side.mtl new file mode 100644 index 0000000..969a004 --- /dev/null +++ b/res/models/playership/body/bs_side.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_side +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_side.png + diff --git a/res/models/playership/body/bs_side.obj b/res/models/playership/body/bs_side.obj new file mode 100644 index 0000000..e16330c --- /dev/null +++ b/res/models/playership/body/bs_side.obj @@ -0,0 +1,67 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_side.mtl +o bs_side +#12 vertices, 8 faces +v -1.00000000 -1.00000000 -1.00000000 +v -1.00000000 -1.00000000 0.0000000e+0 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.00000000 1.00000000 -1.00000000 +v -1.00000000 1.00000000 0.0000000e+0 +v 1.00000000 -1.00000000 -1.00000000 +v 1.00000000 -1.00000000 0.0000000e+0 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 -1.00000000 +v 1.00000000 1.00000000 0.0000000e+0 +vt 0.0000000e+0 8.3333333e-2 +vt 0.0000000e+0 0.51967233 +vt 0.0000000e+0 0.68633900 +vt 8.3266727e-17 0.33333333 +vt 8.3266727e-17 0.68633900 +vt 1.6653345e-16 0.25000000 +vt 1.6653345e-16 0.85300566 +vt 0.16666667 1.1102230e-16 +vt 0.16666667 0.33333333 +vt 0.33333333 0.68633900 +vt 0.33333333 8.3266727e-17 +vt 0.33333333 0.33333333 +vt 0.33333333 0.51967233 +vt 0.33333333 0.33333333 +vt 0.33333333 0.33333333 +vt 0.33333333 0.68633900 +vt 0.33333333 0.68633900 +vt 0.33333333 0.51967233 +vt 0.33333333 0.85300566 +vt 0.66666667 0.0000000e+0 +vt 0.66666667 0.33333333 +vt 0.66666667 0.33333333 +vt 0.66666667 0.51967233 +vt 0.66666667 0.68633900 +vt 0.83333333 0.0000000e+0 +vt 0.83333333 0.33333333 +vt 1.00000000 0.25000000 +vt 1.00000000 8.3333333e-2 +vn -0.57735027 -0.57735027 -0.57735027 +vn -0.45696631 -0.86568941 0.20436155 +vn -0.50673185 -0.45323475 0.73334923 +vn -0.50673185 0.45323475 0.73334923 +vn -0.57735027 0.57735027 -0.57735027 +vn -0.45696631 0.86568941 0.20436155 +vn 0.57735027 -0.57735027 -0.57735027 +vn 0.45696631 -0.86568941 0.20436155 +vn 0.50673185 -0.45323475 0.73334923 +vn 0.50673185 0.45323475 0.73334923 +vn 0.57735027 0.57735027 -0.57735027 +vn 0.45696631 0.86568941 0.20436155 +g bs_side_bs_side +usemtl bs_side +s 1 +f 1/24/1 7/17/7 8/18/8 2/23/2 +f 2/25/2 3/28/3 4/27/4 6/26/6 5/21/5 1/20/1 +f 3/3/3 9/10/9 10/19/10 4/7/4 +f 5/21/5 11/14/11 7/11/7 1/20/1 +f 6/2/6 12/13/12 11/16/11 5/5/5 +f 7/11/7 11/14/11 12/9/12 10/6/10 9/1/9 8/8/8 +f 8/18/8 9/15/9 3/22/3 2/23/2 +f 10/12/10 12/13/12 6/2/6 4/4/4 diff --git a/res/models/playership/body/bs_side.png b/res/models/playership/body/bs_side.png new file mode 100644 index 0000000..869fd2a Binary files /dev/null and b/res/models/playership/body/bs_side.png differ diff --git a/res/models/playership/body/bs_side1.mtl b/res/models/playership/body/bs_side1.mtl new file mode 100644 index 0000000..ee8a87c --- /dev/null +++ b/res/models/playership/body/bs_side1.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_side1 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_side1.png + diff --git a/res/models/playership/body/bs_side1.obj b/res/models/playership/body/bs_side1.obj new file mode 100644 index 0000000..cfb905d --- /dev/null +++ b/res/models/playership/body/bs_side1.obj @@ -0,0 +1,67 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_side1.mtl +o bs_side1 +#12 vertices, 8 faces +v -1.00000000 -1.00000000 -1.00000000 +v -1.00000000 -1.00000000 0.0000000e+0 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.00000000 1.00000000 -1.00000000 +v -1.00000000 1.00000000 0.0000000e+0 +v 1.00000000 -1.00000000 -1.00000000 +v 1.00000000 -1.00000000 0.0000000e+0 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 -1.00000000 +v 1.00000000 1.00000000 0.0000000e+0 +vt 0.0000000e+0 8.3333333e-2 +vt 0.0000000e+0 0.51967233 +vt 0.0000000e+0 0.68633900 +vt 8.3266727e-17 0.33333333 +vt 8.3266727e-17 0.68633900 +vt 1.6653345e-16 0.25000000 +vt 1.6653345e-16 0.85300566 +vt 0.16666667 1.1102230e-16 +vt 0.16666667 0.33333333 +vt 0.33333333 0.68633900 +vt 0.33333333 8.3266727e-17 +vt 0.33333333 0.33333333 +vt 0.33333333 0.51967233 +vt 0.33333333 0.33333333 +vt 0.33333333 0.33333333 +vt 0.33333333 0.68633900 +vt 0.33333333 0.68633900 +vt 0.33333333 0.51967233 +vt 0.33333333 0.85300566 +vt 0.66666667 0.0000000e+0 +vt 0.66666667 0.33333333 +vt 0.66666667 0.33333333 +vt 0.66666667 0.51967233 +vt 0.66666667 0.68633900 +vt 0.83333333 0.0000000e+0 +vt 0.83333333 0.33333333 +vt 1.00000000 0.25000000 +vt 1.00000000 8.3333333e-2 +vn -0.57735027 -0.57735027 -0.57735027 +vn -0.45696631 -0.86568941 0.20436155 +vn -0.50673185 -0.45323475 0.73334923 +vn -0.50673185 0.45323475 0.73334923 +vn -0.57735027 0.57735027 -0.57735027 +vn -0.45696631 0.86568941 0.20436155 +vn 0.57735027 -0.57735027 -0.57735027 +vn 0.45696631 -0.86568941 0.20436155 +vn 0.50673185 -0.45323475 0.73334923 +vn 0.50673185 0.45323475 0.73334923 +vn 0.57735027 0.57735027 -0.57735027 +vn 0.45696631 0.86568941 0.20436155 +g bs_side1_bs_side1 +usemtl bs_side1 +s 1 +f 1/24/1 7/17/7 8/18/8 2/23/2 +f 2/25/2 3/28/3 4/27/4 6/26/6 5/21/5 1/20/1 +f 3/3/3 9/10/9 10/19/10 4/7/4 +f 5/21/5 11/14/11 7/11/7 1/20/1 +f 6/2/6 12/13/12 11/16/11 5/5/5 +f 7/11/7 11/14/11 12/9/12 10/6/10 9/1/9 8/8/8 +f 8/18/8 9/15/9 3/22/3 2/23/2 +f 10/12/10 12/13/12 6/2/6 4/4/4 diff --git a/res/models/playership/body/bs_side1.png b/res/models/playership/body/bs_side1.png new file mode 100644 index 0000000..869fd2a Binary files /dev/null and b/res/models/playership/body/bs_side1.png differ diff --git a/res/models/playership/body/bs_side2_next.mtl b/res/models/playership/body/bs_side2_next.mtl new file mode 100644 index 0000000..d0ec716 --- /dev/null +++ b/res/models/playership/body/bs_side2_next.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_side2_next +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_side2_next.png + diff --git a/res/models/playership/body/bs_side2_next.obj b/res/models/playership/body/bs_side2_next.obj new file mode 100644 index 0000000..62facdc --- /dev/null +++ b/res/models/playership/body/bs_side2_next.obj @@ -0,0 +1,85 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_side2_next.mtl +o bs_side2_next +#14 vertices, 10 faces +v -1.00000000 -0.50000000 -1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.1102230e-16 -1.00000000 -1.00000000 +v -1.6653345e-16 -1.00000000 2.7755576e-16 +v -1.1102230e-16 1.00000000 -1.00000000 +v -1.6653345e-16 1.00000000 0.0000000e+0 +v 1.00000000 -1.00000000 -1.00000000 +v 1.00000000 -1.00000000 2.7755576e-16 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 -1.00000000 +v 1.00000000 1.00000000 0.0000000e+0 +vt 8.8544444e-2 0.80041192 +vt 8.8544444e-2 0.96076937 +vt 0.17347778 0.49993129 +vt 0.17347778 0.66028874 +vt 0.31595725 4.0495482e-2 +vt 0.31595725 0.36121040 +vt 0.31653640 0.36122691 +vt 0.31653640 4.0511996e-2 +vt 0.33383523 0.41975256 +vt 0.33383523 0.74046747 +vt 0.40925936 0.80041192 +vt 0.40925936 0.96076937 +vt 0.49419269 0.41975256 +vt 0.49419269 0.74046747 +vt 0.49524233 4.0495482e-2 +vt 0.49524233 0.20085294 +vt 0.49562494 4.0507855e-2 +vt 0.49562494 0.20086531 +vt 0.49582149 0.20086945 +vt 0.49582149 4.0511996e-2 +vt 0.49589556 4.0305022e-2 +vt 0.49589556 0.20066248 +vt 0.65455015 0.41975256 +vt 0.65455015 0.74046747 +vt 0.67491002 4.0507855e-2 +vt 0.67491002 0.36122277 +vt 0.67518064 4.0305022e-2 +vt 0.67518064 0.36101994 +vt 0.72997427 0.80041192 +vt 0.72997427 0.96076937 +vt 0.73035379 0.80022216 +vt 0.73035379 0.96057961 +vt 0.73043571 0.80036850 +vt 0.73043571 0.96072595 +vt 0.81490760 0.49993129 +vt 0.81490760 0.66028874 +vt 0.89071125 0.80022216 +vt 0.89071125 0.96057961 +vt 0.89079317 0.80036850 +vt 0.89079317 0.96072595 +vn -0.73334923 -0.45323475 -0.50673185 +vn -0.53240740 -0.65809173 0.53240740 +vn -0.73334923 0.45323475 -0.50673185 +vn -0.53240740 0.65809173 0.53240740 +vn -0.20436155 -0.86568941 -0.45696631 +vn -0.15638647 -0.97523666 0.15638647 +vn -0.20436155 0.86568941 -0.45696631 +vn -0.15638647 0.97523666 0.15638647 +vn 0.57735027 -0.57735027 -0.57735027 +vn 0.45696631 -0.86568941 0.20436155 +vn 0.50673185 -0.45323475 0.73334923 +vn 0.50673185 0.45323475 0.73334923 +vn 0.57735027 0.57735027 -0.57735027 +vn 0.45696631 0.86568941 0.20436155 +g bs_side2_next_bs_side2_next +usemtl bs_side2_next +s 1 +f 1/1/1 2/11/2 4/12/4 3/2/3 +f 2/11/2 11/29/11 12/30/12 4/12/4 +f 3/36/3 7/24/7 13/14/13 9/13/9 5/23/5 1/35/1 +f 5/37/5 9/31/9 10/32/10 6/38/6 +f 6/19/6 2/7/2 1/8/1 5/20/5 +f 7/21/7 3/27/3 4/28/4 8/22/8 +f 8/16/8 4/6/4 12/5/12 14/15/14 +f 8/40/8 14/34/14 13/33/13 7/39/7 +f 9/13/9 13/14/13 14/10/14 12/4/12 11/3/11 10/9/10 +f 10/17/10 11/25/11 2/26/2 6/18/6 diff --git a/res/models/playership/body/bs_side2_next.png b/res/models/playership/body/bs_side2_next.png new file mode 100644 index 0000000..869071b Binary files /dev/null and b/res/models/playership/body/bs_side2_next.png differ diff --git a/res/models/playership/body/bs_side2_opp.mtl b/res/models/playership/body/bs_side2_opp.mtl new file mode 100644 index 0000000..704930e --- /dev/null +++ b/res/models/playership/body/bs_side2_opp.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_side2_opp +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_side2_opp.png + diff --git a/res/models/playership/body/bs_side2_opp.obj b/res/models/playership/body/bs_side2_opp.obj new file mode 100644 index 0000000..f6dcb50 --- /dev/null +++ b/res/models/playership/body/bs_side2_opp.obj @@ -0,0 +1,70 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_side2_opp.mtl +o bs_side2_opp +#12 vertices, 8 faces +v -1.00000000 -1.00000000 0.0000000e+0 +v -1.00000000 -0.50000000 -1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.00000000 0.50000000 1.00000000 +v -1.00000000 1.00000000 0.0000000e+0 +v 1.00000000 -1.00000000 0.0000000e+0 +v 1.00000000 -0.50000000 -1.00000000 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 0.0000000e+0 +vt 0.0000000e+0 0.40000000 +vt 0.0000000e+0 0.40000000 +vt 0.0000000e+0 0.60000000 +vt 0.0000000e+0 0.80000000 +vt 0.0000000e+0 1.00000000 +vt 2.7755576e-17 0.60000000 +vt 5.5511151e-17 0.20000000 +vt 8.3266727e-17 0.0000000e+0 +vt 0.40000000 0.40000000 +vt 0.40000000 0.60000000 +vt 0.40000000 0.60000000 +vt 0.40000000 0.70000000 +vt 0.40000000 0.80000000 +vt 0.40000000 0.90000000 +vt 0.40000000 1.00000000 +vt 0.40000000 0.20000000 +vt 0.40000000 0.0000000e+0 +vt 0.40000000 8.3266727e-17 +vt 0.40000000 0.20000000 +vt 0.40000000 0.30000000 +vt 0.40000000 0.50000000 +vt 0.60000000 0.60000000 +vt 0.60000000 1.00000000 +vt 0.60000000 0.20000000 +vt 0.60000000 0.60000000 +vt 0.80000000 0.70000000 +vt 0.80000000 0.90000000 +vt 0.80000000 0.0000000e+0 +vt 0.80000000 0.20000000 +vt 0.80000000 0.30000000 +vt 0.80000000 0.50000000 +vn -0.48795004 -0.87287156 0.0000000e+0 +vn -0.50673185 -0.45323475 -0.73334923 +vn -0.50673185 -0.45323475 0.73334923 +vn -0.50673185 0.45323475 -0.73334923 +vn -0.50673185 0.45323475 0.73334923 +vn -0.48795004 0.87287156 0.0000000e+0 +vn 0.48795004 -0.87287156 0.0000000e+0 +vn 0.50673185 -0.45323475 -0.73334923 +vn 0.50673185 -0.45323475 0.73334923 +vn 0.50673185 0.45323475 -0.73334923 +vn 0.50673185 0.45323475 0.73334923 +vn 0.48795004 0.87287156 0.0000000e+0 +g bs_side2_opp_bs_side2_opp +usemtl bs_side2_opp +s 1 +f 1/16/1 2/9/2 8/1/8 7/7/7 +f 2/12/2 1/22/1 3/26/3 5/27/5 6/23/6 4/14/4 +f 3/17/3 9/28/9 11/29/11 5/19/5 +f 4/10/4 10/6/10 8/2/8 2/9/2 +f 7/7/7 9/8/9 3/18/3 1/16/1 +f 8/30/8 10/31/10 12/25/12 11/21/11 9/20/9 7/24/7 +f 11/11/11 12/13/12 6/4/6 5/3/5 +f 12/13/12 10/15/10 4/5/4 6/4/6 diff --git a/res/models/playership/body/bs_side2_opp.png b/res/models/playership/body/bs_side2_opp.png new file mode 100644 index 0000000..974d2f2 Binary files /dev/null and b/res/models/playership/body/bs_side2_opp.png differ diff --git a/res/models/playership/body/bs_side3.mtl b/res/models/playership/body/bs_side3.mtl new file mode 100644 index 0000000..59fcc2d --- /dev/null +++ b/res/models/playership/body/bs_side3.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl N-Cube29_auv +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_side3.png + diff --git a/res/models/playership/body/bs_side3.obj b/res/models/playership/body/bs_side3.obj new file mode 100644 index 0000000..8d18096 --- /dev/null +++ b/res/models/playership/body/bs_side3.obj @@ -0,0 +1,71 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_side3.mtl +o bs_side3 +#12 vertices, 10 faces +v -1.00000000 -0.50000000 -1.00000000 +v -1.00000000 -0.50000000 1.00000000 +v -1.00000000 0.50000000 -1.00000000 +v -1.00000000 0.50000000 1.00000000 +v 0.0000000e+0 -1.00000000 0.0000000e+0 +v 0.0000000e+0 1.00000000 0.0000000e+0 +v 1.00000000 -1.00000000 0.0000000e+0 +v 1.00000000 -0.50000000 -1.00000000 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 -1.00000000 +v 1.00000000 0.50000000 1.00000000 +v 1.00000000 1.00000000 0.0000000e+0 +vt 9.1626623e-4 0.28061714 +vt 9.1626623e-4 0.44728380 +vt 0.11967181 0.63253728 +vt 0.11967181 0.79920395 +vt 0.28633848 0.88253728 +vt 0.29668134 0.54920395 +vt 0.33196718 0.28057289 +vt 0.33196718 0.44723955 +vt 0.33216289 0.28061714 +vt 0.33216289 0.44728380 +vt 0.45300515 0.63253728 +vt 0.45300515 0.79920395 +vt 0.54047758 0.53865807 +vt 0.54047758 0.87199140 +vt 0.54048421 0.70532474 +vt 0.54067690 0.87191022 +vt 0.54067690 0.53857689 +vt 0.54068353 0.70524355 +vt 0.66518168 0.28046875 +vt 0.66518168 0.44713541 +vt 0.66530051 0.28057289 +vt 0.66530051 0.44723955 +vt 0.69552100 0.70532474 +vt 0.69572032 0.70524355 +vt 0.87123687 0.53865807 +vt 0.87123687 0.87199140 +vt 0.87143619 0.87191022 +vt 0.87143619 0.53857689 +vt 0.99851502 0.28046875 +vt 0.99851502 0.44713541 +vn -0.53240740 -0.65809173 -0.53240740 +vn -0.53240740 -0.65809173 0.53240740 +vn -0.53240740 0.65809173 -0.53240740 +vn -0.53240740 0.65809173 0.53240740 +vn -0.16439899 -0.98639392 0.0000000e+0 +vn -0.16439899 0.98639392 0.0000000e+0 +vn 0.48795004 -0.87287156 0.0000000e+0 +vn 0.50673185 -0.45323475 -0.73334923 +vn 0.50673185 -0.45323475 0.73334923 +vn 0.50673185 0.45323475 -0.73334923 +vn 0.50673185 0.45323475 0.73334923 +vn 0.48795004 0.87287156 0.0000000e+0 +g bs_side3_N-Cube29_auv +usemtl N-Cube29_auv +s 1 +f 1/7/1 2/21/2 4/22/4 3/8/3 +f 1/27/1 5/24/5 2/28/2 +f 2/19/2 9/29/9 11/30/11 4/20/4 +f 3/26/3 4/25/4 6/23/6 +f 3/26/3 6/23/6 12/15/12 10/14/10 +f 3/10/3 10/2/10 8/1/8 1/9/1 +f 5/24/5 1/27/1 8/16/8 7/18/7 +f 7/18/7 9/17/9 2/28/2 5/24/5 +f 8/11/8 10/12/10 12/5/12 11/4/11 9/3/9 7/6/7 +f 11/13/11 12/15/12 6/23/6 4/25/4 diff --git a/res/models/playership/body/bs_side3.png b/res/models/playership/body/bs_side3.png new file mode 100644 index 0000000..c59ec4f Binary files /dev/null and b/res/models/playership/body/bs_side3.png differ diff --git a/res/models/playership/body/bs_triangle.mtl b/res/models/playership/body/bs_triangle.mtl new file mode 100644 index 0000000..52190cc --- /dev/null +++ b/res/models/playership/body/bs_triangle.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bs_triangle +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bs_triangle.png + diff --git a/res/models/playership/body/bs_triangle.obj b/res/models/playership/body/bs_triangle.obj new file mode 100644 index 0000000..b5469d3 --- /dev/null +++ b/res/models/playership/body/bs_triangle.obj @@ -0,0 +1,60 @@ +# Exported from Wings 3D 1.4.1 +mtllib bs_triangle.mtl +o bs_triangle +#10 vertices, 7 faces +v -1.00000000 -1.00000000 1.00000000 +v -5.7191665e-18 -1.00000000 1.00000000 +v 1.00000000 -0.50000000 1.00000000 +v 1.00000000 0.50000000 1.00000000 +v -1.00000000 1.00000000 1.00000000 +v -5.7191665e-18 1.00000000 1.00000000 +v -1.00000000 -1.00000000 4.4408921e-16 +v -1.00000000 1.00000000 4.4408921e-16 +v -1.00000000 -0.50000000 -1.00000000 +v -1.00000000 0.50000000 -1.00000000 +vt 0.11004438 0.67442031 +vt 0.11004438 0.87250993 +vt 0.22771502 5.7043455e-2 +vt 0.22771502 0.25513308 +vt 0.22778348 0.25513013 +vt 0.22779083 0.25518214 +vt 0.30813400 0.57537550 +vt 0.30813400 0.97155474 +vt 0.37020797 0.42416365 +vt 0.37044415 0.42465287 +vt 0.50622362 0.57537550 +vt 0.50622362 0.97155474 +vt 0.50626678 0.57537292 +vt 0.50626678 0.97155216 +vt 0.50785897 0.54618722 +vt 0.50850746 0.54620972 +vt 0.64592229 0.42463036 +vt 0.64615846 0.42418616 +vt 0.70435640 0.57537292 +vt 0.70435640 0.97155216 +vt 0.78792163 0.25509477 +vt 0.78799708 5.7043455e-2 +vt 0.78799708 0.25513308 +vt 0.78812309 0.25512641 +vt 0.90244602 0.87250735 +vt 0.90244602 0.67441773 +vn -0.57735027 -0.57735027 0.57735027 +vn 0.20897385 -0.92982699 0.30290545 +vn 0.80410303 -0.58864427 -8.3163976e-2 +vn 0.80410303 0.58864427 -8.3163976e-2 +vn -0.57735027 0.57735027 0.57735027 +vn 0.20897385 0.92982699 0.30290545 +vn -0.30290545 -0.92982699 -0.20897385 +vn -0.30290545 0.92982699 -0.20897385 +vn 8.3163976e-2 -0.58864427 -0.80410303 +vn 8.3163976e-2 0.58864427 -0.80410303 +g bs_triangle_bs_triangle +usemtl bs_triangle +s 1 +f 1/15/1 7/9/7 2/17/2 +f 2/19/2 3/26/3 4/25/4 6/20/6 5/14/5 1/13/1 +f 2/17/2 7/9/7 9/5/9 3/24/3 +f 4/4/4 3/3/3 9/22/9 10/23/10 +f 5/12/5 8/8/8 10/2/10 9/1/9 7/7/7 1/11/1 +f 6/10/6 8/18/8 5/16/5 +f 8/18/8 6/10/6 4/6/4 10/21/10 diff --git a/res/models/playership/body/bs_triangle.png b/res/models/playership/body/bs_triangle.png new file mode 100644 index 0000000..ba15ea2 Binary files /dev/null and b/res/models/playership/body/bs_triangle.png differ diff --git a/res/models/playership/body/bw_arrow.mtl b/res/models/playership/body/bw_arrow.mtl new file mode 100644 index 0000000..0cab2c4 --- /dev/null +++ b/res/models/playership/body/bw_arrow.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bw_arrow +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bw_arrow.png + diff --git a/res/models/playership/body/bw_arrow.obj b/res/models/playership/body/bw_arrow.obj new file mode 100644 index 0000000..2d0c825 --- /dev/null +++ b/res/models/playership/body/bw_arrow.obj @@ -0,0 +1,36 @@ +# Exported from Wings 3D 1.4.1 +mtllib bw_arrow.mtl +o bw_arrow +#6 vertices, 5 faces +v 2.2204460e-16 -9.1868000e-2 -1.1102230e-16 +v 2.2204460e-16 9.1868000e-2 -1.1102230e-16 +v 1.00000000 -9.1868000e-2 1.00000000 +v -1.00000000 -9.1868000e-2 1.00000000 +v 1.00000000 9.1868000e-2 1.00000000 +v -1.00000000 9.1868000e-2 1.00000000 +vt 0.23141111 0.26878029 +vt 0.23141111 0.23240242 +vt 0.31084127 0.62214972 +vt 0.31084127 0.58577185 +vt 0.50883117 0.82013962 +vt 0.50883117 0.38778195 +vt 0.51141111 0.23240242 +vt 0.51141111 0.26878029 +vt 0.70682107 0.58577185 +vt 0.70682107 0.62214972 +vt 0.79141111 0.23240242 +vt 0.79141111 0.26878029 +vn 6.4098756e-17 -0.57735027 -0.81649658 +vn 6.4098756e-17 0.57735027 -0.81649658 +vn 0.56151667 -0.79410449 0.23258782 +vn -0.56151667 -0.79410449 0.23258782 +vn 0.56151667 0.79410449 0.23258782 +vn -0.56151667 0.79410449 0.23258782 +g bw_arrow_bw_arrow +usemtl bw_arrow +s 1 +f 1/6/1 3/9/3 4/4/4 +f 3/2/3 1/7/1 2/8/2 5/1/5 +f 5/10/5 2/5/2 6/3/6 +f 5/10/5 6/3/6 4/4/4 3/9/3 +f 6/12/6 2/8/2 1/7/1 4/11/4 diff --git a/res/models/playership/body/bw_arrow.png b/res/models/playership/body/bw_arrow.png new file mode 100644 index 0000000..6d07117 Binary files /dev/null and b/res/models/playership/body/bw_arrow.png differ diff --git a/res/models/playership/body/bw_cube.mtl b/res/models/playership/body/bw_cube.mtl new file mode 100644 index 0000000..701db3a --- /dev/null +++ b/res/models/playership/body/bw_cube.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bw_cube +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bw_cube.png + diff --git a/res/models/playership/body/bw_cube.obj b/res/models/playership/body/bw_cube.obj new file mode 100644 index 0000000..acabd35 --- /dev/null +++ b/res/models/playership/body/bw_cube.obj @@ -0,0 +1,45 @@ +# Exported from Wings 3D 1.4.1 +mtllib bw_cube.mtl +o bw_cube +#8 vertices, 6 faces +v -1.00000000 -9.1868000e-2 1.00000000 +v -1.00000000 9.1868000e-2 1.00000000 +v 1.00000000 9.1868000e-2 1.00000000 +v 1.00000000 -9.1868000e-2 1.00000000 +v -1.00000000 -9.1868000e-2 -1.00000000 +v -1.00000000 9.1868000e-2 -1.00000000 +v 1.00000000 9.1868000e-2 -1.00000000 +v 1.00000000 -9.1868000e-2 -1.00000000 +vt 0.0000000e+0 1.8561541e-16 +vt 0.0000000e+0 3.0622667e-2 +vt 0.0000000e+0 0.36395600 +vt 0.0000000e+0 0.39457867 +vt 1.1102230e-16 3.0622667e-2 +vt 1.1102230e-16 0.72791200 +vt 0.33333333 3.0622667e-2 +vt 0.33333333 3.0622667e-2 +vt 0.33333333 0.36395600 +vt 0.33333333 0.72791200 +vt 0.33333333 0.39457867 +vt 0.33333333 0.0000000e+0 +vt 0.66666667 2.4112656e-16 +vt 0.66666667 3.0622667e-2 +vt 1.00000000 1.8561541e-16 +vt 1.00000000 3.0622667e-2 +vn -0.57735027 -0.57735027 0.57735027 +vn -0.57735027 0.57735027 0.57735027 +vn 0.57735027 0.57735027 0.57735027 +vn 0.57735027 -0.57735027 0.57735027 +vn -0.57735027 -0.57735027 -0.57735027 +vn -0.57735027 0.57735027 -0.57735027 +vn 0.57735027 0.57735027 -0.57735027 +vn 0.57735027 -0.57735027 -0.57735027 +g bw_cube_bw_cube +usemtl bw_cube +s 1 +f 1/3/1 4/9/4 3/11/3 2/4/2 +f 1/3/1 5/5/5 8/8/8 4/9/4 +f 2/16/2 6/14/6 5/13/5 1/15/1 +f 3/11/3 7/10/7 6/6/6 2/4/2 +f 4/1/4 8/12/8 7/7/7 3/2/3 +f 6/14/6 7/7/7 8/12/8 5/13/5 diff --git a/res/models/playership/body/bw_cube.png b/res/models/playership/body/bw_cube.png new file mode 100644 index 0000000..72c50fc Binary files /dev/null and b/res/models/playership/body/bw_cube.png differ diff --git a/res/models/playership/body/bw_triangle.mtl b/res/models/playership/body/bw_triangle.mtl new file mode 100644 index 0000000..9e1d631 --- /dev/null +++ b/res/models/playership/body/bw_triangle.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bw_triangle +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bw_triangle.png + diff --git a/res/models/playership/body/bw_triangle.obj b/res/models/playership/body/bw_triangle.obj new file mode 100644 index 0000000..eb7b1cb --- /dev/null +++ b/res/models/playership/body/bw_triangle.obj @@ -0,0 +1,36 @@ +# Exported from Wings 3D 1.4.1 +mtllib bw_triangle.mtl +o bw_triangle +#6 vertices, 5 faces +v -1.00000000 9.1868000e-2 -1.00000000 +v -1.00000000 -9.1868000e-2 -1.00000000 +v 1.00000000 -9.1868000e-2 1.00000000 +v 1.00000000 9.1868000e-2 1.00000000 +v -1.00000000 9.1868000e-2 1.00000000 +v -1.00000000 -9.1868000e-2 1.00000000 +vt 0.21141111 0.26052013 +vt 0.21141111 0.28808053 +vt 0.29669913 0.59182975 +vt 0.29669913 0.61939015 +vt 0.50883117 0.37969771 +vt 0.50883117 0.83152218 +vt 0.51141111 0.28808053 +vt 0.51141111 0.26052013 +vt 0.72096320 0.61939015 +vt 0.72096320 0.59182975 +vt 0.81141111 0.26052013 +vt 0.81141111 0.28808053 +vn -0.23258782 0.79410449 -0.56151667 +vn -0.23258782 -0.79410449 -0.56151667 +vn 0.56151667 -0.79410449 0.23258782 +vn 0.56151667 0.79410449 0.23258782 +vn -0.57735027 0.57735027 0.57735027 +vn -0.57735027 -0.57735027 0.57735027 +g bw_triangle_bw_triangle +usemtl bw_triangle +s 1 +f 1/9/1 4/4/4 3/3/3 2/10/2 +f 2/10/2 3/3/3 6/5/6 +f 2/1/2 6/8/6 5/7/5 1/2/1 +f 4/12/4 5/7/5 6/8/6 3/11/3 +f 5/6/5 4/4/4 1/9/1 diff --git a/res/models/playership/body/bw_triangle.png b/res/models/playership/body/bw_triangle.png new file mode 100644 index 0000000..1402249 Binary files /dev/null and b/res/models/playership/body/bw_triangle.png differ diff --git a/res/models/playership/misc/engine.mtl b/res/models/playership/misc/engine.mtl new file mode 100644 index 0000000..aa97acb --- /dev/null +++ b/res/models/playership/misc/engine.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl engine +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd engine.png + diff --git a/res/models/playership/misc/engine.obj b/res/models/playership/misc/engine.obj new file mode 100644 index 0000000..866d826 --- /dev/null +++ b/res/models/playership/misc/engine.obj @@ -0,0 +1,321 @@ +# Exported from Wings 3D 1.4.1 +mtllib engine.mtl +o engine +#64 vertices, 50 faces +v 0.90000000 1.1533201e-17 -0.18767079 +v 0.83149158 -0.34441509 -0.18767079 +v 0.63639610 -0.63639610 -0.18767079 +v 0.34441509 -0.83149158 -0.18767079 +v 5.5107286e-17 -0.90000000 -0.18767079 +v -0.34441509 -0.83149158 -0.18767079 +v -0.63639610 -0.63639610 -0.18767079 +v -0.83149158 -0.34441509 -0.18767079 +v -0.90000000 -9.8681371e-17 -0.18767079 +v -0.83149158 0.34441509 -0.18767079 +v -0.63639610 0.63639610 -0.18767079 +v -0.34441509 0.83149158 -0.18767079 +v -1.6532186e-16 0.90000000 -0.18767079 +v 0.34441509 0.83149158 -0.18767079 +v 0.63639610 0.63639610 -0.18767079 +v 0.83149158 0.34441509 -0.18767079 +v 0.50000000 -4.9697117e-17 -0.99767079 +v 0.46193977 -0.19134172 -0.99767079 +v 0.35355339 -0.35355339 -0.99767079 +v 0.19134172 -0.46193977 -0.99767079 +v 3.0615159e-17 -0.50000000 -0.99767079 +v -0.19134172 -0.46193977 -0.99767079 +v -0.35355339 -0.35355339 -0.99767079 +v -0.46193977 -0.19134172 -0.99767079 +v -0.50000000 -1.1092743e-16 -0.99767079 +v -0.46193977 0.19134172 -0.99767079 +v -0.35355339 0.35355339 -0.99767079 +v -0.19134172 0.46193977 -0.99767079 +v -9.1845477e-17 0.50000000 -0.99767079 +v 0.19134172 0.46193977 -0.99767079 +v 0.35355339 0.35355339 -0.99767079 +v 0.46193977 0.19134172 -0.99767079 +v 0.79425201 8.3185449e-18 -0.15340844 +v 0.73379317 -0.30394708 -0.15340844 +v 0.56162098 -0.56162098 -0.15340844 +v 0.30394708 -0.73379317 -0.15340844 +v 5.5107286e-17 -0.79425201 -0.15340844 +v -0.30394708 -0.73379317 -0.15340844 +v -0.56162098 -0.56162098 -0.15340844 +v -0.73379317 -0.30394708 -0.15340844 +v -0.79425201 -7.9393437e-17 -0.15340844 +v -0.73379317 0.30394708 -0.15340844 +v -0.56162098 0.56162098 -0.15340844 +v -0.30394708 0.73379317 -0.15340844 +v -1.6049987e-16 0.79425201 -0.15340844 +v 0.30394708 0.73379317 -0.15340844 +v 0.56162098 0.56162098 -0.15340844 +v 0.73379317 0.30394708 -0.15340844 +v 0.42213233 -1.6010612e-17 -0.90695079 +v 0.38999942 -0.16154305 -0.90695079 +v 0.29849263 -0.29849263 -0.90695079 +v 0.16154305 -0.38999942 -0.90695079 +v 2.7186261e-17 -0.42213233 -0.90695079 +v -0.16154305 -0.38999942 -0.90695079 +v -0.29849263 -0.29849263 -0.90695079 +v -0.38999942 -0.16154305 -0.90695079 +v -0.42213233 -7.9756610e-17 -0.90695079 +v -0.38999942 0.16154305 -0.90695079 +v -0.29849263 0.29849263 -0.90695079 +v -0.16154305 0.38999942 -0.90695079 +v -8.1558783e-17 0.42213233 -0.90695079 +v 0.16154305 0.38999942 -0.90695079 +v 0.29849263 0.29849263 -0.90695079 +v 0.38999942 0.16154305 -0.90695079 +vt 1.1991352e-2 0.31681871 +vt 1.3528095e-2 0.37643719 +vt 2.0738989e-2 0.25782545 +vt 2.5303350e-2 0.43490145 +vt 3.9509911e-2 0.20121822 +vt 4.6965655e-2 0.49046645 +vt 6.7743853e-2 0.14868661 +vt 7.7868444e-2 0.54147374 +vt 0.10459810 0.10179856 +vt 0.11708935 0.58640086 +vt 0.14897265 6.1953546e-2 +vt 0.16345772 0.62390686 +vt 0.16670490 0.96281274 +vt 0.16679763 0.78896351 +vt 0.17342512 0.32663293 +vt 0.17424188 0.35831921 +vt 0.17807435 0.29527895 +vt 0.18050024 0.38939203 +vt 0.18805080 0.26519311 +vt 0.19201341 0.41892395 +vt 0.19945000 3.0079531e-2 +vt 0.19954303 3.0340853e-2 +vt 0.20305669 0.23727339 +vt 0.20420270 0.78574036 +vt 0.20843775 0.44603351 +vt 0.21558957 0.65287227 +vt 0.22264414 0.21235313 +vt 0.22928304 0.46991156 +vt 0.23403402 0.95701106 +vt 0.24049479 0.77612720 +vt 0.24591337 0.36935008 +vt 0.24622851 0.19117614 +vt 0.25392709 0.48984540 +vt 0.25470050 7.6272032e-3 +vt 0.27192891 0.67243255 +vt 0.27305326 0.17409252 +vt 0.27310586 0.17437450 +vt 0.27459065 0.76041097 +vt 0.27954132 0.38604406 +vt 0.28002261 0.38609698 +vt 0.28163434 0.50524006 +vt 0.29935977 0.93970738 +vt 0.30241803 0.16215946 +vt 0.30547263 0.73906076 +vt 0.30947614 0.20753743 +vt 0.31027205 0.40833432 +vt 0.31157781 0.51563604 +vt 0.33079414 0.68200387 +vt 0.33221896 0.71271380 +vt 0.33624260 0.43544629 +vt 0.34286374 0.52072304 +vt 0.35403133 0.68215651 +vt 0.35715909 0.46662366 +vt 0.36073233 0.91141817 +vt 0.37000645 0.23758659 +vt 0.37025871 0.64830093 +vt 0.37050985 0.23765299 +vt 0.37239724 0.50093586 +vt 0.38041674 0.61215757 +vt 0.38150221 0.53735875 +vt 0.38420224 0.57480522 +vt 0.41631988 0.87298778 +vt 0.42495885 0.27768020 +vt 0.46446328 0.82556326 +vt 0.47170583 0.32648174 +vt 0.50372556 0.77056013 +vt 0.50935553 0.38260100 +vt 0.53293484 0.70962009 +vt 0.53678419 0.44436296 +vt 0.55121929 0.64456205 +vt 0.55317313 0.50992418 +vt 0.55803318 0.57732781 +vt 0.59156556 0.21331955 +vt 0.60476743 0.27986797 +vt 0.60483100 0.14676943 +vt 0.61297483 0.21333009 +vt 0.62454543 0.27168425 +vt 0.62461321 0.15496872 +vt 0.64244522 0.33628004 +vt 0.64253711 9.0338251e-2 +vt 0.65757572 0.32114191 +vt 0.65768436 0.10547786 +vt 0.67101718 0.53553805 +vt 0.67834159 0.49871576 +vt 0.67834159 0.57236034 +vt 0.68744093 0.82459281 +vt 0.69362467 0.85568056 +vt 0.69362467 0.79350505 +vt 0.69887628 0.37392938 +vt 0.69894926 5.2603687e-2 +vt 0.69919975 0.46749933 +vt 0.69919975 0.60357677 +vt 0.70705003 0.35414725 +vt 0.70715853 7.2381760e-2 +vt 0.71123447 0.88203549 +vt 0.71123447 0.76715012 +vt 0.73041618 0.44664118 +vt 0.73041618 0.62443492 +vt 0.73758940 0.89964529 +vt 0.73758940 0.74954032 +vt 0.76541002 0.36568842 +vt 0.76543136 0.38709768 +vt 0.76549268 3.9304690e-2 +vt 0.76551402 6.0713955e-2 +vt 0.76723847 0.43931677 +vt 0.76723847 0.63175933 +vt 0.76867716 0.90582903 +vt 0.76867716 0.74335658 +vt 0.79976492 0.89964529 +vt 0.79976492 0.74954032 +vt 0.80406076 0.44664118 +vt 0.80406076 0.62443492 +vt 0.82376551 0.35402061 +vt 0.82387401 7.2255119e-2 +vt 0.82611984 0.76715012 +vt 0.82611984 0.88203549 +vt 0.83197477 0.37379869 +vt 0.83204776 5.2472996e-2 +vt 0.83527719 0.46749933 +vt 0.83527719 0.60357677 +vt 0.84372964 0.85568056 +vt 0.84372964 0.79350505 +vt 0.84991338 0.82459281 +vt 0.85613534 0.49871576 +vt 0.85613534 0.57236034 +vt 0.86345975 0.53553805 +vt 0.87323968 0.32092451 +vt 0.87334831 0.10526047 +vt 0.88838693 0.33606412 +vt 0.88847882 9.0122329e-2 +vt 0.90631083 0.27143365 +vt 0.90637861 0.15471812 +vt 0.91794921 0.21307229 +vt 0.92609304 0.27963294 +vt 0.92615661 0.14653440 +vt 0.93935848 0.21308283 +vn 0.91817060 -3.2113718e-17 0.39618525 +vn 0.84827902 -0.35136868 0.39618525 +vn 0.64924466 -0.64924466 0.39618525 +vn 0.35136868 -0.84827902 0.39618525 +vn 0.0000000e+0 -0.91817060 0.39618525 +vn -0.35136868 -0.84827902 0.39618525 +vn -0.64924466 -0.64924466 0.39618525 +vn -0.84827902 -0.35136868 0.39618525 +vn -0.91817060 -1.4183559e-16 0.39618525 +vn -0.84827902 0.35136868 0.39618525 +vn -0.64924466 0.64924466 0.39618525 +vn -0.35136868 0.84827902 0.39618525 +vn -5.3522863e-17 0.91817060 0.39618525 +vn 0.35136868 0.84827902 0.39618525 +vn 0.64924466 0.64924466 0.39618525 +vn 0.84827902 0.35136868 0.39618525 +vn 0.68612784 -2.1574543e-17 -0.72748098 +vn 0.63389947 -0.26256976 -0.72748098 +vn 0.48516565 -0.48516565 -0.72748098 +vn 0.26256976 -0.63389947 -0.72748098 +vn -7.5510902e-17 -0.68612784 -0.72748098 +vn -0.26256976 -0.63389947 -0.72748098 +vn -0.48516565 -0.48516565 -0.72748098 +vn -0.63389947 -0.26256976 -0.72748098 +vn -0.68612784 -9.7085445e-17 -0.72748098 +vn -0.63389947 0.26256976 -0.72748098 +vn -0.48516565 0.48516565 -0.72748098 +vn -0.26256976 0.63389947 -0.72748098 +vn -1.2944726e-16 0.68612784 -0.72748098 +vn 0.26256976 0.63389947 -0.72748098 +vn 0.48516565 0.48516565 -0.72748098 +vn 0.63389947 0.26256976 -0.72748098 +vn -0.38335959 -2.7754906e-17 0.92359917 +vn -0.35417808 0.14670536 0.92359917 +vn -0.27107616 0.27107616 0.92359917 +vn -0.14670536 0.35417808 0.92359917 +vn 9.2516353e-18 0.38335959 0.92359917 +vn 0.14670536 0.35417808 0.92359917 +vn 0.27107616 0.27107616 0.92359917 +vn 0.35417808 0.14670536 0.92359917 +vn 0.38335959 9.9455080e-17 0.92359917 +vn 0.35417808 -0.14670536 0.92359917 +vn 0.27107616 -0.27107616 0.92359917 +vn 0.14670536 -0.35417808 0.92359917 +vn 4.6258177e-17 -0.38335959 0.92359917 +vn -0.14670536 -0.35417808 0.92359917 +vn -0.27107616 -0.27107616 0.92359917 +vn -0.35417808 -0.14670536 0.92359917 +vn -0.68612784 -2.1574543e-17 0.72748098 +vn -0.63389947 0.26256976 0.72748098 +vn -0.48516565 0.48516565 0.72748098 +vn -0.26256976 0.63389947 0.72748098 +vn 1.0787272e-17 0.68612784 0.72748098 +vn 0.26256976 0.63389947 0.72748098 +vn 0.48516565 0.48516565 0.72748098 +vn 0.63389947 0.26256976 0.72748098 +vn 0.68612784 1.6180907e-16 0.72748098 +vn 0.63389947 -0.26256976 0.72748098 +vn 0.48516565 -0.48516565 0.72748098 +vn 0.26256976 -0.63389947 0.72748098 +vn 5.3936358e-17 -0.68612784 0.72748098 +vn -0.26256976 -0.63389947 0.72748098 +vn -0.48516565 -0.48516565 0.72748098 +vn -0.63389947 -0.26256976 0.72748098 +g engine_engine +usemtl engine +s 1 +f 1/42/1 17/30/17 32/38/32 16/54/16 +f 1/136/1 33/133/33 34/132/34 2/135/2 +f 2/29/2 18/24/18 17/30/17 1/42/1 +f 2/135/2 34/132/34 35/128/35 3/130/3 +f 3/13/3 19/14/19 18/24/18 2/29/2 +f 3/130/3 35/128/35 36/114/36 4/118/4 +f 4/55/4 20/39/20 19/31/19 3/45/3 +f 4/118/4 36/114/36 37/104/37 5/103/5 +f 5/63/5 21/46/21 20/40/20 4/57/4 +f 5/103/5 37/104/37 38/94/38 6/90/6 +f 6/65/6 22/50/22 21/46/21 5/63/5 +f 6/90/6 38/94/38 39/82/39 7/80/7 +f 7/67/7 23/53/23 22/50/22 6/65/6 +f 7/80/7 39/82/39 40/78/40 8/75/8 +f 8/69/8 24/58/24 23/53/23 7/67/7 +f 8/75/8 40/78/40 41/76/41 9/73/9 +f 9/71/9 25/60/25 24/58/24 8/69/8 +f 9/73/9 41/76/41 42/77/42 10/74/10 +f 10/72/10 26/61/26 25/60/25 9/71/9 +f 10/74/10 42/77/42 43/81/43 11/79/11 +f 11/70/11 27/59/27 26/61/26 10/72/10 +f 11/79/11 43/81/43 44/93/44 12/89/12 +f 12/68/12 28/56/28 27/59/27 11/70/11 +f 12/89/12 44/93/44 45/101/45 13/102/13 +f 13/66/13 29/52/29 28/56/28 12/68/12 +f 13/102/13 45/101/45 46/113/46 14/117/14 +f 14/64/14 30/49/30 29/52/29 13/66/13 +f 14/117/14 46/113/46 47/127/47 15/129/15 +f 15/62/15 31/44/31 30/49/30 14/64/14 +f 15/129/15 47/127/47 48/131/48 16/134/16 +f 16/54/16 32/38/32 31/44/31 15/62/15 +f 16/134/16 48/131/48 33/133/33 1/136/1 +f 18/84/18 19/91/19 20/97/20 21/105/21 22/111/22 23/119/23 24/124/24 25/126/25 26/125/26 27/120/27 28/112/28 29/106/29 30/98/30 31/92/31 32/85/32 17/83/17 +f 33/7/33 49/23/49 50/19/50 34/5/34 +f 34/5/34 50/19/50 51/17/51 35/3/35 +f 35/3/35 51/17/51 52/15/52 36/1/36 +f 36/1/36 52/15/52 53/16/53 37/2/37 +f 37/2/37 53/16/53 54/18/54 38/4/38 +f 38/4/38 54/18/54 55/20/55 39/6/39 +f 39/6/39 55/20/55 56/25/56 40/8/40 +f 40/8/40 56/25/56 57/28/57 41/10/41 +f 41/10/41 57/28/57 58/33/58 42/12/42 +f 42/12/42 58/33/58 59/41/59 43/26/43 +f 43/26/43 59/41/59 60/47/60 44/35/44 +f 44/35/44 60/47/60 61/51/61 45/48/45 +f 45/34/45 61/43/61 62/36/62 46/21/46 +f 46/22/46 62/37/62 63/32/63 47/11/47 +f 47/11/47 63/32/63 64/27/64 48/9/48 +f 48/9/48 64/27/64 49/23/49 33/7/33 +f 49/123/49 64/121/64 63/116/63 62/109/62 61/107/61 60/99/60 59/95/59 58/87/58 57/86/57 56/88/56 55/96/55 54/100/54 53/108/53 52/110/52 51/115/51 50/122/50 diff --git a/res/models/playership/misc/engine.png b/res/models/playership/misc/engine.png new file mode 100644 index 0000000..d3ec714 Binary files /dev/null and b/res/models/playership/misc/engine.png differ diff --git a/res/models/playership/misc/engine_big.mtl b/res/models/playership/misc/engine_big.mtl new file mode 100644 index 0000000..7dde8c8 --- /dev/null +++ b/res/models/playership/misc/engine_big.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl engine2 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd engine_big.png + diff --git a/res/models/playership/misc/engine_big.obj b/res/models/playership/misc/engine_big.obj new file mode 100644 index 0000000..3d1a7b4 --- /dev/null +++ b/res/models/playership/misc/engine_big.obj @@ -0,0 +1,954 @@ +# Exported from Wings 3D 1.4.1 +mtllib engine_big.mtl +o engine_big +#192 vertices, 194 faces +v 0.50400000 8.4263259e-17 -0.40000000 +v 0.46563528 0.19287245 -0.40000000 +v 0.35638182 0.35638182 -0.40000000 +v 0.19287245 0.46563528 -0.40000000 +v -1.2577468e-18 0.50400000 -0.40000000 +v -0.19287245 0.46563528 -0.40000000 +v -0.35638182 0.35638182 -0.40000000 +v -0.46563528 0.19287245 -0.40000000 +v -0.50400000 1.4598342e-16 -0.40000000 +v -0.46563528 -0.19287245 -0.40000000 +v -0.35638182 -0.35638182 -0.40000000 +v -0.19287245 -0.46563528 -0.40000000 +v -1.2469807e-16 -0.50400000 -0.40000000 +v 0.19287245 -0.46563528 -0.40000000 +v 0.35638182 -0.35638182 -0.40000000 +v 0.46563528 -0.19287245 -0.40000000 +v 0.84000000 -2.7497787e-17 -5.5511151e-17 +v 0.77605881 0.32145408 -5.5511151e-17 +v 0.59396970 0.59396970 -5.5511151e-17 +v 0.32145408 0.77605881 -5.5511151e-17 +v 4.5627926e-17 0.84000000 -5.5511151e-17 +v -0.32145408 0.77605881 -5.5511151e-17 +v -0.59396970 0.59396970 -5.5511151e-17 +v -0.77605881 0.32145408 -5.5511151e-17 +v -0.84000000 7.5369146e-17 -5.5511151e-17 +v -0.77605881 -0.32145408 -5.5511151e-17 +v -0.59396970 -0.59396970 -5.5511151e-17 +v -0.32145408 -0.77605881 -5.5511151e-17 +v -1.6010594e-16 -0.84000000 -5.5511151e-17 +v 0.32145408 -0.77605881 -5.5511151e-17 +v 0.59396970 -0.59396970 -5.5511151e-17 +v 0.77605881 -0.32145408 -5.5511151e-17 +v 0.84000000 -2.7497787e-17 0.50000000 +v 0.77605881 0.32145408 0.50000000 +v 0.59396970 0.59396970 0.50000000 +v 0.32145408 0.77605881 0.50000000 +v 2.8975902e-17 0.84000000 0.50000000 +v -0.32145408 0.77605881 0.50000000 +v -0.59396970 0.59396970 0.50000000 +v -0.77605881 0.32145408 0.50000000 +v -0.84000000 7.5369146e-17 0.50000000 +v -0.77605881 -0.32145408 0.50000000 +v -0.59396970 -0.59396970 0.50000000 +v -0.32145408 -0.77605881 0.50000000 +v -1.7675797e-16 -0.84000000 0.50000000 +v 0.32145408 -0.77605881 0.50000000 +v 0.59396970 -0.59396970 0.50000000 +v 0.77605881 -0.32145408 0.50000000 +v 0.67200000 -1.7989209e-17 0.50000000 +v 0.62084705 0.25716327 0.50000000 +v 0.47517576 0.47517576 0.50000000 +v 0.25716327 0.62084705 0.50000000 +v 3.1353046e-17 0.67200000 0.50000000 +v -0.25716327 0.62084705 0.50000000 +v -0.47517576 0.47517576 0.50000000 +v -0.62084705 0.25716327 0.50000000 +v -0.67200000 4.6843412e-17 0.50000000 +v -0.62084705 -0.25716327 0.50000000 +v -0.47517576 -0.47517576 0.50000000 +v -0.25716327 -0.62084705 0.50000000 +v -1.3872365e-16 -0.67200000 0.50000000 +v 0.25716327 -0.62084705 0.50000000 +v 0.47517576 -0.47517576 0.50000000 +v 0.62084705 -0.25716327 0.50000000 +v 0.67200000 -1.7989209e-17 1.0000000e-1 +v 0.62084705 0.25716327 1.0000000e-1 +v 0.47517576 0.47517576 1.0000000e-1 +v 0.25716327 0.62084705 1.0000000e-1 +v 3.1353046e-17 0.67200000 1.0000000e-1 +v -0.25716327 0.62084705 1.0000000e-1 +v -0.47517576 0.47517576 1.0000000e-1 +v -0.62084705 0.25716327 1.0000000e-1 +v -0.67200000 4.6843412e-17 1.0000000e-1 +v -0.62084705 -0.25716327 1.0000000e-1 +v -0.47517576 -0.47517576 1.0000000e-1 +v -0.25716327 -0.62084705 1.0000000e-1 +v -1.3872365e-16 -0.67200000 1.0000000e-1 +v 0.25716327 -0.62084705 1.0000000e-1 +v 0.47517576 -0.47517576 1.0000000e-1 +v 0.62084705 -0.25716327 1.0000000e-1 +v 0.46608777 0.19305987 -0.53640000 +v 0.50448976 8.4277119e-17 -0.53640000 +v 0.46608777 -0.19305987 -0.53640000 +v 0.35672813 -0.35672813 -0.53640000 +v 0.19305987 -0.46608777 -0.53640000 +v -1.2486439e-16 -0.50448976 -0.53640000 +v -0.19305987 -0.46608777 -0.53640000 +v -0.35672813 -0.35672813 -0.53640000 +v -0.46608777 -0.19305987 -0.53640000 +v -0.50448976 1.4614281e-16 -0.53640000 +v -0.46608777 0.19305987 -0.53640000 +v -0.35672813 0.35672813 -0.53640000 +v -0.19305987 0.46608777 -0.53640000 +v -1.2438868e-18 0.50448976 -0.53640000 +v 0.19305987 0.46608777 -0.53640000 +v 0.35672813 0.35672813 -0.53640000 +v 0.46563528 0.19287245 -1.00000000 +v 0.50400000 8.4263259e-17 -1.00000000 +v 0.46563528 -0.19287245 -1.00000000 +v 0.35638182 -0.35638182 -1.00000000 +v 0.19287245 -0.46563528 -1.00000000 +v -1.2007251e-16 -0.50400000 -1.00000000 +v -0.19287245 -0.46563528 -1.00000000 +v -0.35638182 -0.35638182 -1.00000000 +v -0.46563528 -0.19287245 -1.00000000 +v -0.50400000 1.4598342e-16 -1.00000000 +v -0.46563528 0.19287245 -1.00000000 +v -0.35638182 0.35638182 -1.00000000 +v -0.19287245 0.46563528 -1.00000000 +v 3.3678153e-18 0.50400000 -1.00000000 +v 0.19287245 0.46563528 -1.00000000 +v 0.35638182 0.35638182 -1.00000000 +v 0.46608777 0.19305987 -0.86360000 +v 0.50448976 8.4277119e-17 -0.86360000 +v 0.46608777 -0.19305987 -0.86360000 +v 0.35672813 -0.35672813 -0.86360000 +v 0.19305987 -0.46608777 -0.86360000 +v -1.2332253e-16 -0.50448976 -0.86360000 +v -0.19305987 -0.46608777 -0.86360000 +v -0.35672813 -0.35672813 -0.86360000 +v -0.46608777 -0.19305987 -0.86360000 +v -0.50448976 1.4614281e-16 -0.86360000 +v -0.46608777 0.19305987 -0.86360000 +v -0.35672813 0.35672813 -0.86360000 +v -0.19305987 0.46608777 -0.86360000 +v 2.9796721e-19 0.50448976 -0.86360000 +v 0.19305987 0.46608777 -0.86360000 +v 0.35672813 0.35672813 -0.86360000 +v 0.60186174 0.12091646 -0.76282168 +v 0.60186174 0.12091646 -0.63717832 +v 0.60232046 0.11861028 -0.63717832 +v 0.60232046 0.11861028 -0.76282168 +v -0.60232046 0.11861028 -0.76282168 +v -0.60232046 0.11861028 -0.63717832 +v -0.60186174 0.12091646 -0.63717832 +v -0.60186174 0.12091646 -0.76282168 +v -0.51108136 0.34007967 -0.76282168 +v -0.51108136 0.34007967 -0.63717832 +v -0.50977502 0.34203475 -0.63717832 +v -0.50977502 0.34203475 -0.76282168 +v -0.60186174 -0.12091646 -0.76282168 +v -0.60186174 -0.12091646 -0.63717832 +v -0.60232046 -0.11861028 -0.63717832 +v -0.60232046 -0.11861028 -0.76282168 +v 0.51108136 -0.34007967 -0.76282168 +v 0.51108136 -0.34007967 -0.63717832 +v 0.50977502 -0.34203475 -0.63717832 +v 0.50977502 -0.34203475 -0.76282168 +v 0.34007967 0.51108136 -0.76282168 +v 0.34007967 0.51108136 -0.63717832 +v 0.34203475 0.50977502 -0.63717832 +v 0.34203475 0.50977502 -0.76282168 +v 0.34203475 -0.50977502 -0.76282168 +v 0.34203475 -0.50977502 -0.63717832 +v 0.34007967 -0.51108136 -0.63717832 +v 0.34007967 -0.51108136 -0.76282168 +v 0.11861028 0.60232046 -0.76282168 +v 0.11861028 0.60232046 -0.63717832 +v 0.12091646 0.60186174 -0.63717832 +v 0.12091646 0.60186174 -0.76282168 +v -0.34007967 -0.51108136 -0.76282168 +v -0.34007967 -0.51108136 -0.63717832 +v -0.34203475 -0.50977502 -0.63717832 +v -0.34203475 -0.50977502 -0.76282168 +v -0.12091646 0.60186174 -0.76282168 +v -0.12091646 0.60186174 -0.63717832 +v -0.11861028 0.60232046 -0.63717832 +v -0.11861028 0.60232046 -0.76282168 +v -0.34203475 0.50977502 -0.76282168 +v -0.34203475 0.50977502 -0.63717832 +v -0.34007967 0.51108136 -0.63717832 +v -0.34007967 0.51108136 -0.76282168 +v 0.51108136 0.34007967 -0.63717832 +v 0.51108136 0.34007967 -0.76282168 +v 0.50977502 0.34203475 -0.76282168 +v 0.50977502 0.34203475 -0.63717832 +v 0.12091646 -0.60186174 -0.76282168 +v 0.12091646 -0.60186174 -0.63717832 +v 0.11861028 -0.60232046 -0.63717832 +v 0.11861028 -0.60232046 -0.76282168 +v -0.50977502 -0.34203475 -0.76282168 +v -0.50977502 -0.34203475 -0.63717832 +v -0.51108136 -0.34007967 -0.63717832 +v -0.51108136 -0.34007967 -0.76282168 +v 0.60232046 -0.11861028 -0.76282168 +v 0.60232046 -0.11861028 -0.63717832 +v 0.60186174 -0.12091646 -0.63717832 +v 0.60186174 -0.12091646 -0.76282168 +v -0.11861028 -0.60232046 -0.76282168 +v -0.11861028 -0.60232046 -0.63717832 +v -0.12091646 -0.60186174 -0.63717832 +v -0.12091646 -0.60186174 -0.76282168 +vt 6.1533333e-2 0.76255726 +vt 6.4422222e-2 0.30088946 +vt 7.5641037e-2 0.69163305 +vt 7.5641037e-2 0.83348147 +vt 7.8529925e-2 0.37181367 +vt 7.8529925e-2 0.22996524 +vt 9.8600114e-2 0.76255726 +vt 9.8823359e-2 0.76182936 +vt 0.10988628 0.70581789 +vt 0.10988628 0.81929663 +vt 0.11010952 0.70508999 +vt 0.11010952 0.81856874 +vt 0.11581638 0.63150640 +vt 0.11581638 0.89360812 +vt 0.11870527 0.43194032 +vt 0.11870527 0.16983860 +vt 0.13855578 0.30088946 +vt 0.13910000 0.29989150 +vt 0.14202655 0.65771657 +vt 0.14202655 0.86739795 +vt 0.14224979 0.65698868 +vt 0.14224979 0.86667005 +vt 0.14702040 0.34344399 +vt 0.14702040 0.25833493 +vt 0.14756462 0.25733698 +vt 0.14756462 0.34244603 +vt 0.17112561 0.37951997 +vt 0.17112561 0.22225894 +vt 0.17166983 0.37852202 +vt 0.17166983 0.22126099 +vt 0.17594302 0.59133106 +vt 0.17594302 0.93378346 +vt 0.17883191 0.12966326 +vt 0.17883191 0.47211566 +vt 0.19012786 0.62557630 +vt 0.19012786 0.89953822 +vt 0.19035111 0.62484841 +vt 0.19035111 0.89881032 +vt 0.20720160 0.19815374 +vt 0.20720160 0.40362518 +vt 0.20774581 0.19715578 +vt 0.20774581 0.40262722 +vt 0.24686724 0.57722336 +vt 0.24686724 0.61429014 +vt 0.24686724 0.91082438 +vt 0.24686724 0.94789116 +vt 0.24709048 0.61356224 +vt 0.24709048 0.91009649 +vt 0.24975612 0.48622336 +vt 0.24975612 0.11555556 +vt 0.24975612 0.18968912 +vt 0.24975612 0.41208980 +vt 0.25030034 0.41109184 +vt 0.25030034 0.18869116 +vt 0.29231065 0.40362518 +vt 0.29231065 0.19815374 +vt 0.29285487 0.40262722 +vt 0.29285487 0.19715578 +vt 0.30360661 0.89953822 +vt 0.30360661 0.62557630 +vt 0.30382985 0.89881032 +vt 0.30382985 0.62484841 +vt 0.31779145 0.93378346 +vt 0.31779145 0.59133106 +vt 0.32068034 0.47211566 +vt 0.32068034 0.12966326 +vt 0.32838664 0.22225894 +vt 0.32838664 0.37951997 +vt 0.32893086 0.22126099 +vt 0.32893086 0.37852202 +vt 0.35170792 0.65771657 +vt 0.35170792 0.86739795 +vt 0.35193117 0.65698868 +vt 0.35193117 0.86667005 +vt 0.35249184 0.34344399 +vt 0.35249184 0.25833493 +vt 0.35303606 0.34244603 +vt 0.35303606 0.25733698 +vt 0.36095647 0.30088946 +vt 0.36150068 0.29989150 +vt 0.37791809 0.63150640 +vt 0.37791809 0.89360812 +vt 0.38080698 0.16983860 +vt 0.38080698 0.43194032 +vt 0.38384819 0.70581789 +vt 0.38384819 0.81929663 +vt 0.38407144 0.70508999 +vt 0.38407144 0.81856874 +vt 0.39513436 0.76255726 +vt 0.39535760 0.76182936 +vt 0.41809343 0.69163305 +vt 0.41809343 0.83348147 +vt 0.42098232 0.22996524 +vt 0.42098232 0.37181367 +vt 0.43220114 0.76255726 +vt 0.43509003 0.30088946 +vt 0.53490114 0.43882222 +vt 0.53490114 0.54914002 +vt 0.56257439 0.43882222 +vt 0.56257439 0.54914002 +vt 0.57231225 0.60199649 +vt 0.57231225 0.69025072 +vt 0.58038000 0.22228813 +vt 0.58038000 0.27462743 +vt 0.58048121 0.22177931 +vt 0.58048121 0.27513626 +vt 0.58081333 0.22271257 +vt 0.58081333 0.27505187 +vt 0.58091454 0.22220375 +vt 0.58091454 0.27556070 +vt 0.58906780 0.75640628 +vt 0.58906780 0.78412768 +vt 0.58906780 0.75640628 +vt 0.58906780 0.78412768 +vt 0.58916902 0.75640628 +vt 0.58916902 0.78412768 +vt 0.59445085 0.60199649 +vt 0.59445085 0.69025072 +vt 0.60051059 0.17342410 +vt 0.60051059 0.32349147 +vt 0.60079882 0.32392283 +vt 0.60079882 0.17299274 +vt 0.60094392 0.17384854 +vt 0.60094392 0.32391591 +vt 0.60123215 0.17341718 +vt 0.60123215 0.32434727 +vt 0.60196493 0.24845778 +vt 0.60239826 0.24888222 +vt 0.60770114 0.85323624 +vt 0.60772517 0.85552712 +vt 0.60812245 0.88328738 +vt 0.60814646 0.88557603 +vt 0.60842336 0.88326625 +vt 0.60844740 0.88097538 +vt 0.60884467 0.85321511 +vt 0.60886868 0.85092646 +vt 0.60919840 0.75640628 +vt 0.60919840 0.78412768 +vt 0.60948662 0.75640628 +vt 0.60948662 0.78412768 +vt 0.61043778 0.20586190 +vt 0.61043778 0.29105366 +vt 0.61087111 0.20628634 +vt 0.61087111 0.29147810 +vt 0.61370790 0.43882222 +vt 0.61370790 0.43882222 +vt 0.61370790 0.54914002 +vt 0.62429810 0.85094537 +vt 0.62436656 0.85746922 +vt 0.62470330 0.88099873 +vt 0.62477169 0.88751626 +vt 0.62502032 0.88555712 +vt 0.62508878 0.87903327 +vt 0.62542552 0.85550376 +vt 0.62549391 0.84898624 +vt 0.63456641 0.16975086 +vt 0.63456641 0.32716471 +vt 0.63499974 0.17017530 +vt 0.63499974 0.32758915 +vt 0.63535766 0.60199649 +vt 0.63535766 0.69025072 +vt 0.63535766 0.60199649 +vt 0.63780829 0.13598327 +vt 0.63780829 0.36093230 +vt 0.63823965 0.13569504 +vt 0.63823965 0.36122053 +vt 0.63824162 0.13640771 +vt 0.63824162 0.36135674 +vt 0.63867298 0.13611948 +vt 0.63867298 0.36164497 +vt 0.64649610 0.75640628 +vt 0.64649610 0.78412768 +vt 0.64649610 0.75640628 +vt 0.64649610 0.78412768 +vt 0.64692746 0.75640628 +vt 0.64692746 0.78412768 +vt 0.65498933 0.84900326 +vt 0.65509178 0.85876690 +vt 0.65536474 0.87905851 +vt 0.65546708 0.88881267 +vt 0.65571156 0.88749923 +vt 0.65581400 0.87773559 +vt 0.65608696 0.85744398 +vt 0.65618931 0.84768982 +vt 0.67067745 0.14562223 +vt 0.67067745 0.35129334 +vt 0.67111078 0.14604667 +vt 0.67111078 0.35171778 +vt 0.68051705 0.43882222 +vt 0.68051705 0.54914002 +vt 0.68051705 0.54914002 +vt 0.68659486 0.11566566 +vt 0.68659486 0.38124991 +vt 0.68702819 0.11609010 +vt 0.68702819 0.38167435 +vt 0.68710368 0.11556445 +vt 0.68710368 0.38135112 +vt 0.68753702 0.11598889 +vt 0.68753702 0.38177556 +vt 0.68880498 0.60199649 +vt 0.68880498 0.69025072 +vt 0.69510237 0.84770558 +vt 0.69522321 0.85922258 +vt 0.69528266 0.75640628 +vt 0.69528266 0.78412768 +vt 0.69528266 0.75640628 +vt 0.69528266 0.78412768 +vt 0.69543883 0.87776209 +vt 0.69555956 0.88926791 +vt 0.69579149 0.75640628 +vt 0.69579149 0.78412768 +vt 0.69579149 0.75640628 +vt 0.69579149 0.78412768 +vt 0.69582459 0.88879691 +vt 0.69594544 0.87727991 +vt 0.69616105 0.85874040 +vt 0.69628178 0.84723458 +vt 0.69674867 0.87753228 +vt 0.69679083 0.84743742 +vt 0.69689311 0.85764256 +vt 0.69693528 0.88773742 +vt 0.71327333 0.13714938 +vt 0.71327333 0.35976618 +vt 0.71370666 0.13757382 +vt 0.71370666 0.36019062 +vt 0.72072645 0.68963519 +vt 0.72072645 0.60138095 +vt 0.73853036 0.84724990 +vt 0.73865121 0.85876690 +vt 0.73882466 0.87730685 +vt 0.73894539 0.88881267 +vt 0.73925258 0.88925259 +vt 0.73937343 0.87773559 +vt 0.73944298 0.11556445 +vt 0.73944298 0.38135112 +vt 0.73954688 0.85919564 +vt 0.73966761 0.84768982 +vt 0.73987631 0.11598889 +vt 0.73987631 0.38177556 +vt 0.73995181 0.38124991 +vt 0.73995181 0.11566566 +vt 0.74017904 0.84746782 +vt 0.74017904 0.87756271 +vt 0.74032349 0.85761214 +vt 0.74032349 0.88770703 +vt 0.74038514 0.11609010 +vt 0.74038514 0.38167435 +vt 0.74665594 0.60199649 +vt 0.74665594 0.69025072 +vt 0.74665594 0.60199649 +vt 0.74665594 0.69025072 +vt 0.74701534 0.43805204 +vt 0.74701534 0.54836984 +vt 0.74813079 0.75640628 +vt 0.74813079 0.78412768 +vt 0.74813079 0.75640628 +vt 0.74813079 0.78412768 +vt 0.74863961 0.75640628 +vt 0.74863961 0.78412768 +vt 0.74863961 0.75640628 +vt 0.74863961 0.78412768 +vt 0.75283075 0.43882222 +vt 0.75283075 0.54914002 +vt 0.75283075 0.54914002 +vt 0.75586921 0.35129334 +vt 0.75586921 0.14562223 +vt 0.75630255 0.14604667 +vt 0.75630255 0.35171778 +vt 0.77857741 0.60138095 +vt 0.77857741 0.68963519 +vt 0.77866179 0.84770558 +vt 0.77876424 0.85746922 +vt 0.77891713 0.87776209 +vt 0.77901948 0.88751626 +vt 0.77938401 0.88879691 +vt 0.77948646 0.87903327 +vt 0.77963936 0.85874040 +vt 0.77974170 0.84898624 +vt 0.78830701 0.13569504 +vt 0.78830701 0.36122053 +vt 0.78873837 0.13598327 +vt 0.78873837 0.36093230 +vt 0.78874035 0.13611948 +vt 0.78874035 0.36164497 +vt 0.78917171 0.13640771 +vt 0.78917171 0.36135674 +vt 0.78948200 0.75622408 +vt 0.78948200 0.78394547 +vt 0.79198026 0.32716471 +vt 0.79198026 0.16975086 +vt 0.79241359 0.17017530 +vt 0.79241359 0.32758915 +vt 0.79699482 0.75640628 +vt 0.79699482 0.78412768 +vt 0.79699482 0.75640628 +vt 0.79699482 0.78412768 +vt 0.79742618 0.75640628 +vt 0.79742618 0.78412768 +vt 0.79742618 0.75640628 +vt 0.79742618 0.78412768 +vt 0.80010326 0.60199649 +vt 0.80010326 0.69025072 +vt 0.80938702 0.84900326 +vt 0.80945547 0.85552712 +vt 0.80961253 0.87905851 +vt 0.80968092 0.88557603 +vt 0.81010924 0.88749923 +vt 0.81017769 0.88097538 +vt 0.81033475 0.85744398 +vt 0.81040314 0.85092646 +vt 0.81610888 0.29105366 +vt 0.81610888 0.20586190 +vt 0.81654222 0.20628634 +vt 0.81654222 0.29147810 +vt 0.81932904 0.43805204 +vt 0.81932904 0.54836984 +vt 0.81963990 0.43882222 +vt 0.81963990 0.43882222 +vt 0.81963990 0.54914002 +vt 0.82458173 0.24845778 +vt 0.82501506 0.24888222 +vt 0.82574785 0.17299274 +vt 0.82574785 0.32392283 +vt 0.82602840 0.85094537 +vt 0.82603607 0.17342410 +vt 0.82603607 0.32349147 +vt 0.82605244 0.85323624 +vt 0.82618118 0.17341718 +vt 0.82618118 0.32434727 +vt 0.82623776 0.88099873 +vt 0.82626177 0.88328738 +vt 0.82646941 0.17384854 +vt 0.82646941 0.32391591 +vt 0.82675062 0.88555712 +vt 0.82677466 0.88326625 +vt 0.82695998 0.85550376 +vt 0.82698399 0.85321511 +vt 0.83443565 0.75640628 +vt 0.83443565 0.78412768 +vt 0.83443565 0.75640628 +vt 0.83443565 0.78412768 +vt 0.83472388 0.75640628 +vt 0.83472388 0.78412768 +vt 0.83472388 0.75640628 +vt 0.83472388 0.78412768 +vt 0.84101006 0.60199649 +vt 0.84101006 0.69025072 +vt 0.84182130 0.75622408 +vt 0.84182130 0.78394547 +vt 0.84606546 0.22177931 +vt 0.84606546 0.27513626 +vt 0.84616667 0.22228813 +vt 0.84616667 0.27462743 +vt 0.84649879 0.22220375 +vt 0.84649879 0.27556070 +vt 0.84660000 0.22271257 +vt 0.84660000 0.27505187 +vt 0.85475326 0.75640628 +vt 0.85475326 0.78412768 +vt 0.85485447 0.75640628 +vt 0.85485447 0.78412768 +vt 0.86314867 0.60199649 +vt 0.86314867 0.69025072 +vt 0.87077341 0.43882222 +vt 0.87077341 0.54914002 +vt 0.87077341 0.54914002 +vt 0.89844666 0.43882222 +vt 0.89844666 0.43882222 +vt 0.89844666 0.54914002 +vn 0.93971927 -3.7523212e-17 -0.34194691 +vn 0.86818740 0.35961500 -0.34194691 +vn 0.66448187 0.66448187 -0.34194691 +vn 0.35961500 0.86818740 -0.34194691 +vn 1.5009285e-17 0.93971927 -0.34194691 +vn -0.35961500 0.86818740 -0.34194691 +vn -0.66448187 0.66448187 -0.34194691 +vn -0.86818740 0.35961500 -0.34194691 +vn -0.93971927 3.0018569e-16 -0.34194691 +vn -0.86818740 -0.35961500 -0.34194691 +vn -0.66448187 -0.66448187 -0.34194691 +vn -0.35961500 -0.86818740 -0.34194691 +vn -3.0769033e-16 -0.93971927 -0.34194691 +vn 0.35961500 -0.86818740 -0.34194691 +vn 0.66448187 -0.66448187 -0.34194691 +vn 0.86818740 -0.35961500 -0.34194691 +vn 0.93910662 -1.4999447e-17 -0.34362591 +vn 0.86762138 0.35938054 -0.34362591 +vn 0.66404866 0.66404866 -0.34362591 +vn 0.35938054 0.86762138 -0.34362591 +vn 1.4999447e-17 0.93910662 -0.34362591 +vn -0.35938054 0.86762138 -0.34362591 +vn -0.66404866 0.66404866 -0.34362591 +vn -0.86762138 0.35938054 -0.34362591 +vn -0.93910662 2.8498949e-16 -0.34362591 +vn -0.86762138 -0.35938054 -0.34362591 +vn -0.66404866 -0.66404866 -0.34362591 +vn -0.35938054 -0.86762138 -0.34362591 +vn -3.4498727e-16 -0.93910662 -0.34362591 +vn 0.35938054 -0.86762138 -0.34362591 +vn 0.66404866 -0.66404866 -0.34362591 +vn 0.86762138 -0.35938054 -0.34362591 +vn 0.70021451 -1.9815608e-17 0.71393252 +vn 0.64691385 0.26796049 0.71393252 +vn 0.49512643 0.49512643 0.71393252 +vn 0.26796049 0.64691385 0.71393252 +vn 9.9078040e-18 0.70021451 0.71393252 +vn -0.26796049 0.64691385 0.71393252 +vn -0.49512643 0.49512643 0.71393252 +vn -0.64691385 0.26796049 0.71393252 +vn -0.70021451 2.1797169e-16 0.71393252 +vn -0.64691385 -0.26796049 0.71393252 +vn -0.49512643 -0.49512643 0.71393252 +vn -0.26796049 -0.64691385 0.71393252 +vn -2.4769510e-16 -0.70021451 0.71393252 +vn 0.26796049 -0.64691385 0.71393252 +vn 0.49512643 -0.49512643 0.71393252 +vn 0.64691385 -0.26796049 0.71393252 +vn -0.70021451 9.9078040e-18 0.71393252 +vn -0.64691385 -0.26796049 0.71393252 +vn -0.49512643 -0.49512643 0.71393252 +vn -0.26796049 -0.64691385 0.71393252 +vn -2.9723412e-17 -0.70021451 0.71393252 +vn 0.26796049 -0.64691385 0.71393252 +vn 0.49512643 -0.49512643 0.71393252 +vn 0.64691385 -0.26796049 0.71393252 +vn 0.70021451 -3.1704973e-16 0.71393252 +vn 0.64691385 0.26796049 0.71393252 +vn 0.49512643 0.49512643 0.71393252 +vn 0.26796049 0.64691385 0.71393252 +vn -9.9078040e-18 0.70021451 0.71393252 +vn -0.26796049 0.64691385 0.71393252 +vn -0.49512643 0.49512643 0.71393252 +vn -0.64691385 0.26796049 0.71393252 +vn -0.89090915 1.2606070e-17 0.45418155 +vn -0.82309273 -0.34093617 0.45418155 +vn -0.62996790 -0.62996790 0.45418155 +vn -0.34093617 -0.82309273 0.45418155 +vn -3.7818211e-17 -0.89090915 0.45418155 +vn 0.34093617 -0.82309273 0.45418155 +vn 0.62996790 -0.62996790 0.45418155 +vn 0.82309273 -0.34093617 0.45418155 +vn 0.89090915 -4.0339425e-16 0.45418155 +vn 0.82309273 0.34093617 0.45418155 +vn 0.62996790 0.62996790 0.45418155 +vn 0.34093617 0.82309273 0.45418155 +vn -1.2606070e-17 0.89090915 0.45418155 +vn -0.34093617 0.82309273 0.45418155 +vn -0.62996790 0.62996790 0.45418155 +vn -0.82309273 0.34093617 0.45418155 +vn 0.80431039 0.33315627 0.49202814 +vn 0.87057930 -5.5108789e-17 0.49202814 +vn 0.80431039 -0.33315627 0.49202814 +vn 0.61559252 -0.61559252 0.49202814 +vn 0.33315627 -0.80431039 0.49202814 +vn -3.6126873e-16 -0.87057930 0.49202814 +vn -0.33315627 -0.80431039 0.49202814 +vn -0.61559252 -0.61559252 0.49202814 +vn -0.80431039 -0.33315627 0.49202814 +vn -0.87057930 3.5514553e-16 0.49202814 +vn -0.80431039 0.33315627 0.49202814 +vn -0.61559252 0.61559252 0.49202814 +vn -0.33315627 0.80431039 0.49202814 +vn 6.1231987e-18 0.87057930 0.49202814 +vn 0.33315627 0.80431039 0.49202814 +vn 0.61559252 0.61559252 0.49202814 +vn 0.82189422 0.34043973 -0.45671729 +vn 0.88961189 -6.2938962e-17 -0.45671729 +vn 0.82189422 -0.34043973 -0.45671729 +vn 0.62905060 -0.62905060 -0.45671729 +vn 0.34043973 -0.82189422 -0.45671729 +vn -2.0140468e-16 -0.88961189 -0.45671729 +vn -0.34043973 -0.82189422 -0.45671729 +vn -0.62905060 -0.62905060 -0.45671729 +vn -0.82189422 -0.34043973 -0.45671729 +vn -0.88961189 3.0210702e-16 -0.45671729 +vn -0.82189422 0.34043973 -0.45671729 +vn -0.62905060 0.62905060 -0.45671729 +vn -0.34043973 0.82189422 -0.45671729 +vn 5.0351170e-17 0.88961189 -0.45671729 +vn 0.34043973 0.82189422 -0.45671729 +vn 0.62905060 0.62905060 -0.45671729 +vn 0.80431039 0.33315627 -0.49202814 +vn 0.87057930 -7.9601584e-17 -0.49202814 +vn 0.80431039 -0.33315627 -0.49202814 +vn 0.61559252 -0.61559252 -0.49202814 +vn 0.33315627 -0.80431039 -0.49202814 +vn -3.5514553e-16 -0.87057930 -0.49202814 +vn -0.33315627 -0.80431039 -0.49202814 +vn -0.61559252 -0.61559252 -0.49202814 +vn -0.80431039 -0.33315627 -0.49202814 +vn -0.87057930 3.4902233e-16 -0.49202814 +vn -0.80431039 0.33315627 -0.49202814 +vn -0.61559252 0.61559252 -0.49202814 +vn -0.33315627 0.80431039 -0.49202814 +vn 6.1231987e-18 0.87057930 -0.49202814 +vn 0.33315627 0.80431039 -0.49202814 +vn 0.61559252 0.61559252 -0.49202814 +vn 0.87658637 0.26791629 -0.39977144 +vn 0.87658637 0.26791629 0.39977144 +vn 0.91238733 8.7932701e-2 0.39977144 +vn 0.91238733 8.7932701e-2 -0.39977144 +vn -0.91238733 8.7932701e-2 -0.39977144 +vn -0.91238733 8.7932701e-2 0.39977144 +vn -0.87658637 0.26791629 0.39977144 +vn -0.87658637 0.26791629 -0.39977144 +vn -0.80928559 0.43039474 -0.39977144 +vn -0.80928559 0.43039474 0.39977144 +vn -0.70733308 0.58297746 0.39977144 +vn -0.70733308 0.58297746 -0.39977144 +vn -0.87658637 -0.26791629 -0.39977144 +vn -0.87658637 -0.26791629 0.39977144 +vn -0.91238733 -8.7932701e-2 0.39977144 +vn -0.91238733 -8.7932701e-2 -0.39977144 +vn 0.80928559 -0.43039474 -0.39977144 +vn 0.80928559 -0.43039474 0.39977144 +vn 0.70733308 -0.58297746 0.39977144 +vn 0.70733308 -0.58297746 -0.39977144 +vn 0.43039474 0.80928559 -0.39977144 +vn 0.43039474 0.80928559 0.39977144 +vn 0.58297746 0.70733308 0.39977144 +vn 0.58297746 0.70733308 -0.39977144 +vn 0.58297746 -0.70733308 -0.39977144 +vn 0.58297746 -0.70733308 0.39977144 +vn 0.43039474 -0.80928559 0.39977144 +vn 0.43039474 -0.80928559 -0.39977144 +vn 8.7932701e-2 0.91238733 -0.39977144 +vn 8.7932701e-2 0.91238733 0.39977144 +vn 0.26791629 0.87658637 0.39977144 +vn 0.26791629 0.87658637 -0.39977144 +vn -0.43039474 -0.80928559 -0.39977144 +vn -0.43039474 -0.80928559 0.39977144 +vn -0.58297746 -0.70733308 0.39977144 +vn -0.58297746 -0.70733308 -0.39977144 +vn -0.26791629 0.87658637 -0.39977144 +vn -0.26791629 0.87658637 0.39977144 +vn -8.7932701e-2 0.91238733 0.39977144 +vn -8.7932701e-2 0.91238733 -0.39977144 +vn -0.58297746 0.70733308 -0.39977144 +vn -0.58297746 0.70733308 0.39977144 +vn -0.43039474 0.80928559 0.39977144 +vn -0.43039474 0.80928559 -0.39977144 +vn 0.80928559 0.43039474 0.39977144 +vn 0.80928559 0.43039474 -0.39977144 +vn 0.70733308 0.58297746 -0.39977144 +vn 0.70733308 0.58297746 0.39977144 +vn 0.26791629 -0.87658637 -0.39977144 +vn 0.26791629 -0.87658637 0.39977144 +vn 8.7932701e-2 -0.91238733 0.39977144 +vn 8.7932701e-2 -0.91238733 -0.39977144 +vn -0.70733308 -0.58297746 -0.39977144 +vn -0.70733308 -0.58297746 0.39977144 +vn -0.80928559 -0.43039474 0.39977144 +vn -0.80928559 -0.43039474 -0.39977144 +vn 0.91238733 -8.7932701e-2 -0.39977144 +vn 0.91238733 -8.7932701e-2 0.39977144 +vn 0.87658637 -0.26791629 0.39977144 +vn 0.87658637 -0.26791629 -0.39977144 +vn -8.7932701e-2 -0.91238733 -0.39977144 +vn -8.7932701e-2 -0.91238733 0.39977144 +vn -0.26791629 -0.87658637 0.39977144 +vn -0.26791629 -0.87658637 -0.39977144 +g engine_big_engine2 +usemtl engine2 +s 1 +f 1/17/1 17/2/17 32/6/32 16/24/16 +f 1/135/1 82/133/82 81/134/81 2/136/2 +f 2/23/2 18/5/18 17/2/17 1/17/1 +f 2/136/2 81/134/81 96/153/96 3/155/3 +f 3/27/3 19/15/19 18/5/18 2/23/2 +f 3/155/3 96/153/96 95/182/95 4/184/4 +f 4/40/4 20/34/20 19/15/19 3/27/3 +f 4/184/4 95/182/95 94/215/94 5/217/5 +f 5/52/5 21/49/21 20/34/20 4/40/4 +f 5/242/5 94/243/94 93/218/93 6/219/6 +f 6/55/6 22/65/22 21/49/21 5/52/5 +f 6/237/6 93/233/93 92/276/92 7/278/7 +f 7/68/7 23/84/23 22/65/22 6/55/6 +f 7/278/7 92/276/92 91/308/91 8/310/8 +f 8/75/8 24/94/24 23/84/23 7/68/7 +f 8/310/8 91/308/91 90/335/90 9/337/9 +f 9/79/9 25/96/25 24/94/24 8/75/8 +f 9/337/9 90/335/90 89/334/89 10/336/10 +f 10/76/10 26/93/26 25/96/25 9/79/9 +f 10/336/10 89/334/89 88/307/88 11/309/11 +f 11/67/11 27/83/27 26/93/26 10/76/10 +f 11/309/11 88/307/88 87/275/87 12/277/12 +f 12/56/12 28/66/28 27/83/27 11/67/11 +f 12/277/12 87/275/87 86/232/86 13/236/13 +f 13/51/13 29/50/29 28/66/28 12/56/12 +f 13/236/13 86/232/86 85/214/85 14/216/14 +f 14/39/14 30/33/30 29/50/29 13/51/13 +f 14/216/14 85/214/85 84/181/84 15/183/15 +f 15/28/15 31/16/31 30/33/30 14/39/14 +f 15/183/15 84/181/84 83/152/83 16/154/16 +f 16/24/16 32/6/32 31/16/31 15/28/15 +f 16/154/16 83/152/83 82/133/82 1/135/1 +f 17/98/17 33/97/33 48/99/48 32/100/32 +f 18/98/18 34/97/34 33/97/33 17/98/17 +f 19/100/19 35/99/35 34/97/34 18/98/18 +f 20/147/20 36/146/36 35/99/35 19/100/19 +f 21/191/21 37/189/37 36/146/36 20/147/20 +f 22/253/22 38/252/38 37/315/37 21/316/21 +f 23/319/23 39/318/39 38/262/38 22/264/22 +f 24/365/24 40/364/40 39/318/39 23/319/23 +f 25/369/25 41/368/41 40/364/40 24/365/24 +f 26/369/26 42/367/42 41/368/41 25/369/25 +f 27/366/27 43/364/43 42/367/42 26/369/26 +f 28/319/28 44/317/44 43/364/43 27/366/27 +f 29/263/29 45/262/45 44/317/44 28/319/28 +f 30/190/30 46/189/46 45/262/45 29/263/29 +f 31/147/31 47/145/47 46/189/46 30/190/30 +f 32/100/32 48/99/48 47/145/47 31/147/31 +f 33/95/33 49/89/49 64/85/64 48/91/48 +f 34/92/34 50/86/50 49/89/49 33/95/33 +f 35/82/35 51/72/51 50/86/50 34/92/34 +f 36/63/36 52/59/52 51/72/51 35/82/35 +f 37/46/37 53/45/53 52/59/52 36/63/36 +f 38/32/38 54/36/54 53/45/53 37/46/37 +f 39/14/39 55/20/55 54/36/54 38/32/38 +f 40/4/40 56/10/56 55/20/55 39/14/39 +f 41/1/41 57/7/57 56/10/56 40/4/40 +f 42/3/42 58/9/58 57/7/57 41/1/41 +f 43/13/43 59/19/59 58/9/58 42/3/42 +f 44/31/44 60/35/60 59/19/59 43/13/43 +f 45/43/45 61/44/61 60/35/60 44/31/44 +f 46/64/46 62/60/62 61/44/61 45/43/45 +f 47/81/47 63/71/63 62/60/62 46/64/46 +f 48/91/48 64/85/64 63/71/63 47/81/47 +f 49/362/49 65/363/65 80/347/80 64/346/64 +f 50/362/50 66/363/66 65/363/65 49/362/49 +f 51/346/51 67/347/67 66/363/66 50/362/50 +f 52/301/52 68/302/68 67/347/67 51/346/51 +f 53/248/53 69/249/69 68/302/68 52/301/52 +f 54/269/54 70/270/70 69/226/69 53/227/53 +f 55/162/55 71/161/71 70/201/70 54/200/54 +f 56/117/56 72/118/72 71/161/71 55/162/55 +f 57/101/57 73/102/73 72/118/72 56/117/56 +f 58/101/58 74/102/74 73/102/73 57/101/57 +f 59/117/59 75/118/75 74/102/74 58/101/58 +f 60/160/60 76/161/76 75/118/75 59/117/59 +f 61/200/61 77/201/77 76/161/76 60/160/60 +f 62/250/62 78/251/78 77/201/77 61/200/61 +f 63/301/63 79/302/79 78/251/78 62/250/62 +f 64/346/64 80/347/80 79/302/79 63/301/63 +f 66/88/66 67/74/67 68/61/68 69/48/69 70/38/70 71/22/71 72/12/72 73/8/73 74/11/74 75/21/75 76/37/76 77/47/77 78/62/78 79/73/79 80/87/80 65/90/65 +f 81/314/81 173/333/173 176/329/176 96/292/96 +f 82/321/82 131/357/131 130/355/130 81/314/81 +f 82/321/82 186/356/186 131/357/131 +f 83/313/83 146/332/146 187/354/187 +f 83/313/83 187/354/187 186/356/186 82/321/82 +f 84/291/84 147/328/147 146/332/146 83/313/83 +f 84/291/84 154/285/154 147/328/147 +f 85/267/85 155/283/155 154/285/154 84/291/84 +f 85/267/85 178/246/178 155/283/155 +f 86/224/86 179/238/179 178/246/178 85/267/85 +f 86/224/86 190/198/190 179/238/179 +f 87/187/87 162/169/162 191/194/191 +f 87/187/87 191/194/191 190/198/190 86/224/86 +f 88/158/88 163/167/163 162/169/162 87/187/87 +f 88/158/88 182/125/182 163/167/163 +f 89/143/89 142/109/142 183/123/183 +f 89/143/89 183/123/183 182/125/182 88/158/88 +f 90/128/90 134/108/134 143/107/143 +f 90/128/90 143/107/143 142/109/142 89/143/89 +f 91/144/91 135/110/135 134/108/134 90/128/90 +f 91/144/91 138/124/138 135/110/135 +f 92/159/92 139/126/139 138/124/138 91/144/91 +f 92/159/92 170/168/170 139/126/139 +f 93/188/93 166/195/166 171/170/171 +f 93/188/93 171/170/171 170/168/170 92/159/92 +f 94/225/94 158/239/158 167/199/167 +f 94/225/94 167/199/167 166/195/166 93/188/93 +f 95/268/95 150/284/150 159/247/159 +f 95/268/95 159/247/159 158/239/158 94/225/94 +f 96/292/96 151/286/151 150/284/150 95/268/95 +f 96/292/96 176/329/176 151/286/151 +f 97/132/97 112/151/112 128/149/128 113/130/113 +f 97/132/97 113/130/113 114/129/114 98/131/98 +f 98/18/98 99/25/99 100/30/100 101/41/101 102/54/102 103/58/103 104/69/104 105/78/105 106/80/106 107/77/107 108/70/108 109/57/109 110/53/110 111/42/111 112/29/112 97/26/97 +f 98/131/98 114/129/114 115/148/115 99/150/99 +f 99/150/99 115/148/115 116/177/116 100/179/100 +f 100/179/100 116/177/116 117/202/117 101/208/101 +f 101/208/101 117/202/117 118/228/118 102/230/102 +f 102/230/102 118/228/118 119/271/119 103/273/103 +f 103/273/103 119/271/119 120/303/120 104/305/104 +f 104/305/104 120/303/120 121/324/121 105/330/105 +f 105/330/105 121/324/121 122/327/122 106/331/106 +f 106/331/106 122/327/122 123/304/123 107/306/107 +f 107/306/107 123/304/123 124/272/124 108/274/108 +f 108/274/108 124/272/124 125/229/125 109/231/109 +f 109/221/109 125/220/125 126/244/126 110/245/110 +f 110/209/110 126/203/126 127/178/127 111/180/111 +f 111/180/111 127/178/127 128/149/128 112/151/112 +f 113/142/113 129/106/129 132/104/132 114/127/114 +f 114/127/114 185/103/185 188/105/188 115/141/115 +f 115/141/115 145/119/145 148/122/148 116/156/116 +f 116/156/116 153/163/153 156/165/156 117/185/117 +f 117/185/117 177/192/177 180/196/180 118/222/118 +f 118/222/118 189/234/189 192/241/192 119/266/119 +f 119/266/119 161/279/161 164/281/164 120/290/120 +f 120/290/120 181/322/181 184/325/184 121/312/121 +f 121/312/121 141/350/141 144/352/144 122/320/122 +f 122/320/122 133/353/133 136/351/136 123/311/123 +f 123/311/123 137/326/137 140/323/140 124/289/124 +f 124/289/124 169/282/169 172/280/172 125/265/125 +f 125/265/125 165/240/165 168/235/168 126/223/126 +f 126/223/126 157/197/157 160/193/160 127/186/127 +f 127/186/127 149/166/149 152/164/152 128/157/128 +f 128/157/128 175/121/175 174/120/174 113/142/113 +f 129/116/129 174/138/174 173/137/173 130/115/130 +f 130/115/130 131/111/131 132/112/132 129/116/129 +f 131/111/131 186/113/186 185/114/185 132/112/132 +f 132/104/132 185/103/185 114/127/114 +f 133/361/133 144/361/144 143/360/143 134/360/134 +f 134/360/134 135/358/135 136/359/136 133/361/133 +f 135/358/135 138/342/138 137/343/137 136/359/136 +f 136/351/136 137/326/137 123/311/123 +f 138/342/138 139/338/139 140/339/140 137/343/137 +f 139/338/139 170/297/170 169/298/169 140/339/140 +f 140/323/140 169/282/169 124/289/124 +f 141/359/141 184/345/184 183/344/183 142/358/142 +f 142/358/142 143/360/143 144/361/144 141/359/141 +f 144/352/144 133/353/133 122/320/122 +f 145/138/145 188/116/188 187/115/187 146/137/146 +f 146/137/146 147/139/147 148/140/148 145/138/145 +f 147/139/147 154/173/154 153/174/153 148/140/148 +f 148/122/148 153/163/153 116/156/116 +f 149/176/149 160/205/160 159/204/159 150/175/150 +f 150/175/150 151/171/151 152/172/152 149/176/149 +f 151/171/151 176/139/176 175/140/175 152/172/152 +f 152/164/152 175/121/175 128/157/128 +f 154/173/154 155/175/155 156/176/156 153/174/153 +f 155/175/155 178/206/178 177/207/177 156/176/156 +f 156/165/156 177/192/177 117/185/117 +f 157/349/157 168/288/168 167/287/167 158/348/158 +f 158/210/158 159/204/159 160/205/160 157/211/157 +f 160/193/160 149/166/149 127/186/127 +f 161/296/161 192/261/192 191/260/191 162/295/162 +f 162/295/162 163/299/163 164/300/164 161/296/161 +f 163/299/163 182/340/182 181/341/181 164/300/164 +f 164/281/164 181/322/181 120/290/120 +f 165/259/165 172/294/172 171/293/171 166/258/166 +f 166/258/166 167/254/167 168/255/168 165/259/165 +f 168/235/168 157/197/157 126/223/126 +f 170/297/170 171/293/171 172/294/172 169/298/169 +f 172/280/172 165/240/165 125/265/125 +f 173/333/173 81/314/81 130/355/130 +f 174/120/174 129/106/129 113/142/113 +f 174/138/174 175/140/175 176/139/176 173/137/173 +f 178/206/178 179/212/179 180/213/180 177/207/177 +f 179/212/179 190/256/190 189/257/189 180/213/180 +f 180/196/180 189/234/189 118/222/118 +f 182/340/182 183/344/183 184/345/184 181/341/181 +f 184/325/184 141/350/141 121/312/121 +f 186/113/186 187/115/187 188/116/188 185/114/185 +f 188/105/188 145/119/145 115/141/115 +f 190/256/190 191/260/191 192/261/192 189/257/189 +f 192/241/192 161/279/161 119/266/119 diff --git a/res/models/playership/misc/engine_big.png b/res/models/playership/misc/engine_big.png new file mode 100644 index 0000000..b6a80a5 Binary files /dev/null and b/res/models/playership/misc/engine_big.png differ diff --git a/res/models/playership/weapons/w_cannon.mtl b/res/models/playership/weapons/w_cannon.mtl new file mode 100644 index 0000000..97ee58a --- /dev/null +++ b/res/models/playership/weapons/w_cannon.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl w_cannon +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd w_cannon.png + diff --git a/res/models/playership/weapons/w_cannon.obj b/res/models/playership/weapons/w_cannon.obj new file mode 100644 index 0000000..33ae8b7 --- /dev/null +++ b/res/models/playership/weapons/w_cannon.obj @@ -0,0 +1,893 @@ +# Exported from Wings 3D 1.4.1 +mtllib w_cannon.mtl +o w_cannon +#176 vertices, 170 faces +v -0.26930676 -0.13358700 0.35942340 +v -0.26731935 9.4147106e-2 0.35942340 +v -0.10488172 0.25377413 0.35942340 +v 0.12285238 0.25178672 0.35942340 +v 0.28247940 8.9349085e-2 0.35942340 +v 0.28049200 -0.13838502 0.35942340 +v 0.11805436 -0.29801204 0.35942340 +v -0.10967974 -0.29602463 0.35942340 +v 8.8750684e-2 -0.37578288 2.28931823 +v -8.1737811e-2 -0.37429505 2.28931823 +v -8.1737811e-2 -0.37429505 0.40071224 +v 8.8750684e-2 -0.37578288 0.40071224 +v 0.36025025 6.0045405e-2 2.28931823 +v 0.35876242 -0.11044309 2.28931823 +v 0.35876242 -0.11044309 0.40071224 +v 0.36025025 6.0045405e-2 0.40071224 +v -0.18539286 -0.33029609 2.28931823 +v -0.30489438 -0.20869047 2.28931823 +v -0.30489438 -0.20869047 0.40071224 +v -0.18539286 -0.33029609 0.40071224 +v 0.19856551 0.28605818 2.28931823 +v 0.31806702 0.16445256 2.28931823 +v 0.31806702 0.16445256 0.40071224 +v 0.19856551 0.28605818 0.40071224 +v -0.30159082 0.16986023 2.28931823 +v -0.17998519 0.28936175 2.28931823 +v -0.17998519 0.28936175 0.40071224 +v -0.30159082 0.16986023 0.40071224 +v -0.28433824 0.10137119 2.33060707 +v -0.28644913 -0.14051296 2.33060707 +v -0.11690383 -0.31304352 2.33060707 +v 0.12498033 -0.31515441 2.33060707 +v 0.29751088 -0.14560910 2.33060707 +v 0.29962177 9.6275051e-2 2.33060707 +v 0.13007647 0.26880560 2.33060707 +v -0.11180768 0.27091649 2.33060707 +v -7.5578038e-2 0.33154497 2.28931823 +v 9.4910456e-2 0.33005714 2.28931823 +v 9.4910456e-2 0.33005714 0.40071224 +v -7.5578038e-2 0.33154497 0.40071224 +v -0.34707761 -0.10428332 2.28931823 +v -0.34558978 6.6205178e-2 2.28931823 +v -0.34558978 6.6205178e-2 0.40071224 +v -0.34707761 -0.10428332 0.40071224 +v 0.31476346 -0.21409814 2.28931823 +v 0.19315784 -0.33359966 2.28931823 +v 0.19315784 -0.33359966 0.40071224 +v 0.31476346 -0.21409814 0.40071224 +v 3.9977700e-3 -0.31873774 0.35942340 +v -0.29003246 -1.9530403e-2 0.35942340 +v -0.20132445 0.18945258 0.35942340 +v 0.30320511 -2.4707509e-2 0.35942340 +v 0.21815786 0.18579182 0.35942340 +v 0.21449710 -0.23369049 0.35942340 +v -0.20498522 -0.23002973 0.35942340 +v 9.1748758e-3 0.27449983 0.35942340 +v 3.5064366e-3 -0.37503897 0.40071224 +v -0.34633369 -1.9039069e-2 0.40071224 +v -0.24078800 0.22961099 0.40071224 +v 0.35950634 -2.5198842e-2 0.40071224 +v 0.25831627 0.22525537 0.40071224 +v 0.25396065 -0.27384890 0.40071224 +v 9.6662092e-3 0.33080106 0.40071224 +v -0.24514362 -0.26949328 0.40071224 +v 9.9327578e-2 -0.25166162 -0.78833652 +v -9.0146879e-2 -0.25000810 -0.78833652 +v -0.22295634 -0.11486021 -0.78833652 +v -0.22130282 7.4614246e-2 -0.78833652 +v -8.6154932e-2 0.20742371 -0.78833652 +v 0.10331952 0.20577019 -0.78833652 +v 0.23612898 7.0622299e-2 -0.78833652 +v 0.23447547 -0.11885216 -0.78833652 +v 4.4326504e-3 -0.26890539 -0.78833628 +v -0.16944091 -0.19510044 -0.78833628 +v -0.24020011 -1.9965283e-2 -0.78833628 +v -0.16639516 0.15390828 -0.78833628 +v 8.7399954e-3 0.22466747 -0.78833628 +v 0.18261356 0.15086253 -0.78833628 +v 0.25337275 -2.4272628e-2 -0.78833628 +v 0.17956780 -0.19814619 -0.78833628 +v 4.8125985e-3 -0.22536764 -0.82931813 +v -7.3081335e-2 -0.20980420 -0.82931813 +v -0.13838641 -0.16458327 -0.82931813 +v -0.18246072 -9.8498920e-2 -0.82931813 +v -0.19666236 -2.0345231e-2 -0.82931813 +v -0.18109892 5.7548702e-2 -0.82931813 +v -0.13587799 0.12285378 -0.82931813 +v -6.9793642e-2 0.16692809 -0.82931813 +v 8.3600473e-3 0.18112973 -0.82931813 +v 8.6253980e-2 0.16556628 -0.82931813 +v 0.15155906 0.12034535 -0.82931813 +v 0.19563337 5.4261009e-2 -0.82931813 +v 0.20983501 -2.3892680e-2 -0.82931813 +v 0.19427156 -0.10178661 -0.82931813 +v 0.14905063 -0.16709169 -0.82931813 +v 8.2966288e-2 -0.21116600 -0.82931813 +v 4.8125985e-3 -0.22536764 -1.48717350 +v -7.3081335e-2 -0.20980420 -1.48717350 +v -0.13838641 -0.16458327 -1.48717350 +v -0.18246072 -9.8498920e-2 -1.48717350 +v -0.19666236 -2.0345231e-2 -1.48717350 +v -0.18109892 5.7548702e-2 -1.48717350 +v -0.13587799 0.12285378 -1.48717350 +v -6.9793642e-2 0.16692809 -1.48717350 +v 8.3600473e-3 0.18112973 -1.48717350 +v 8.6253980e-2 0.16556628 -1.48717350 +v 0.15155906 0.12034535 -1.48717350 +v 0.19563337 5.4261009e-2 -1.48717350 +v 0.20983501 -2.3892680e-2 -1.48717350 +v 0.19427156 -0.10178661 -1.48717350 +v 0.14905063 -0.16709169 -1.48717350 +v 8.2966288e-2 -0.21116600 -1.48717350 +v 5.1559000e-3 -0.18602918 -1.52581675 +v -5.7661788e-2 -0.17347802 -1.52581675 +v -0.11032717 -0.13700953 -1.52581675 +v -0.14587097 -8.3715701e-2 -1.52581675 +v -0.15732391 -2.0688533e-2 -1.52581675 +v -0.14477274 4.2129155e-2 -1.52581675 +v -0.10830425 9.4794540e-2 -1.52581675 +v -5.5010423e-2 0.13033834 -1.52581675 +v 8.0167458e-3 0.14179127 -1.52581675 +v 7.0834434e-2 0.12924011 -1.52581675 +v 0.12349982 9.2771617e-2 -1.52581675 +v 0.15904362 3.9477790e-2 -1.52581675 +v 0.17049655 -2.3549379e-2 -1.52581675 +v 0.15794539 -8.6367067e-2 -1.52581675 +v 0.12147690 -0.13903245 -1.52581675 +v 6.8183069e-2 -0.17457625 -1.52581675 +v 5.1559000e-3 -0.18602918 -1.98217516 +v -5.7661788e-2 -0.17347802 -1.98217516 +v -0.11032717 -0.13700953 -1.98217516 +v -0.14587097 -8.3715701e-2 -1.98217516 +v -0.15732391 -2.0688533e-2 -1.98217516 +v -0.14477274 4.2129155e-2 -1.98217516 +v -0.10830425 9.4794540e-2 -1.98217516 +v -5.5010423e-2 0.13033834 -1.98217516 +v 8.0167458e-3 0.14179127 -1.98217516 +v 7.0834434e-2 0.12924011 -1.98217516 +v 0.12349982 9.2771617e-2 -1.98217516 +v 0.15904362 3.9477790e-2 -1.98217516 +v 0.17049655 -2.3549379e-2 -1.98217516 +v 0.15794539 -8.6367067e-2 -1.98217516 +v 0.12147690 -0.13903245 -1.98217516 +v 6.8183069e-2 -0.17457625 -1.98217516 +v 5.4591497e-3 -0.15128022 -1.98417516 +v -4.4041189e-2 -0.14138990 -1.98417516 +v -8.5541512e-2 -0.11265273 -1.98417516 +v -0.11355003 -7.0657191e-2 -1.98417516 +v -0.12257494 -2.0991782e-2 -1.98417516 +v -0.11268462 2.8508556e-2 -1.98417516 +v -8.3947448e-2 7.0008879e-2 -1.98417516 +v -4.1951913e-2 9.8017393e-2 -1.98417516 +v 7.7134961e-3 0.10704230 -1.98417516 +v 5.7213834e-2 9.7151987e-2 -1.98417516 +v 9.8714158e-2 6.8414815e-2 -1.98417516 +v 0.12672267 2.6419280e-2 -1.98417516 +v 0.13574758 -2.3246129e-2 -1.98417516 +v 0.12585727 -7.2746467e-2 -1.98417516 +v 9.7120094e-2 -0.11424679 -1.98417516 +v 5.5124559e-2 -0.14225530 -1.98417516 +v 5.4591497e-3 -0.15128022 -1.77974402 +v -4.4041189e-2 -0.14138990 -1.77974402 +v -8.5541512e-2 -0.11265273 -1.77974402 +v -0.11355003 -7.0657191e-2 -1.77974402 +v -0.12257494 -2.0991782e-2 -1.77974402 +v -0.11268462 2.8508556e-2 -1.77974402 +v -8.3947448e-2 7.0008879e-2 -1.77974402 +v -4.1951913e-2 9.8017393e-2 -1.77974402 +v 7.7134961e-3 0.10704230 -1.77974402 +v 5.7213834e-2 9.7151987e-2 -1.77974402 +v 9.8714158e-2 6.8414815e-2 -1.77974402 +v 0.12672267 2.6419280e-2 -1.77974402 +v 0.13574758 -2.3246129e-2 -1.77974402 +v 0.12585727 -7.2746467e-2 -1.77974402 +v 9.7120094e-2 -0.11424679 -1.77974402 +v 5.5124559e-2 -0.14225530 -1.77974402 +vt 0.0000000e+0 3.1367830e-2 +vt 0.0000000e+0 0.58339524 +vt 0.0000000e+0 0.63088847 +vt 1.6653345e-16 0.52828080 +vt 9.4368957e-16 0.34681206 +vt 1.2767565e-15 0.42567312 +vt 1.3322676e-15 0.18908995 +vt 1.3877788e-15 0.37055868 +vt 1.3877788e-15 0.55202741 +vt 1.5543122e-15 0.44941974 +vt 1.7208457e-15 0.11022889 +vt 1.8873791e-15 0.13397550 +vt 1.8873791e-15 0.21283656 +vt 1.8873791e-15 0.29169762 +vt 2.0539126e-15 0.0000000e+0 +vt 2.0539126e-15 0.23658318 +vt 2.1094237e-15 0.58339524 +vt 2.1649349e-15 0.26795101 +vt 2.1649349e-15 0.47316635 +vt 2.2759572e-15 0.31544423 +vt 2.6090241e-15 7.8861059e-2 +vt 2.6090241e-15 0.39430529 +vt 3.1086245e-15 5.5114444e-2 +vt 3.2196468e-15 0.50453418 +vt 4.7184479e-15 0.15772212 +vt 1.0465922e-2 0.96881478 +vt 1.0465922e-2 0.99094185 +vt 1.0558734e-2 0.65873485 +vt 1.0558734e-2 0.94638679 +vt 1.0558734e-2 0.96851386 +vt 1.0558734e-2 0.63660778 +vt 1.0558734e-2 0.92425971 +vt 1.0558734e-2 0.70298900 +vt 1.0558734e-2 0.68086193 +vt 1.0558734e-2 0.88000557 +vt 1.0558734e-2 0.90213264 +vt 1.0558734e-2 0.85787850 +vt 1.0558734e-2 0.79149728 +vt 1.0558734e-2 0.72511607 +vt 1.0558734e-2 0.74724314 +vt 1.0558734e-2 0.81362436 +vt 1.0558734e-2 0.83575143 +vt 1.0558734e-2 0.76937021 +vt 0.19371867 0.99094185 +vt 0.19371867 0.96881478 +vt 0.19381149 0.63660778 +vt 0.19381149 0.65873485 +vt 0.19381149 0.68086193 +vt 0.19381149 0.70298900 +vt 0.19381149 0.72511607 +vt 0.19381149 0.96851386 +vt 0.19381149 0.74724314 +vt 0.19381149 0.94638679 +vt 0.19381149 0.90213264 +vt 0.19381149 0.92425971 +vt 0.19381149 0.76937021 +vt 0.19381149 0.81362436 +vt 0.19381149 0.79149728 +vt 0.19381149 0.83575143 +vt 0.19381149 0.88000557 +vt 0.19381149 0.85787850 +vt 0.20942961 0.87034494 +vt 0.20942961 0.69190081 +vt 0.20942961 0.72758963 +vt 0.20942961 0.88818935 +vt 0.20942961 0.70974522 +vt 0.20942961 0.85250052 +vt 0.20942961 0.63836757 +vt 0.20942961 0.90603376 +vt 0.20942961 0.67405640 +vt 0.20942961 0.65621198 +vt 0.20942961 0.83465611 +vt 0.20942961 0.74543405 +vt 0.20942961 0.81681170 +vt 0.20942961 0.76327846 +vt 0.20942961 0.78112287 +vt 0.20942961 0.79896729 +vt 0.20966651 0.90605175 +vt 0.20966651 0.92389616 +vt 0.33655320 0.67405640 +vt 0.33655320 0.63836757 +vt 0.33655320 0.65621198 +vt 0.33655320 0.69190081 +vt 0.33655320 0.81681170 +vt 0.33655320 0.85250052 +vt 0.33655320 0.83465611 +vt 0.33655320 0.70974522 +vt 0.33655320 0.87034494 +vt 0.33655320 0.90603376 +vt 0.33655320 0.88818935 +vt 0.33655320 0.79896729 +vt 0.33655320 0.72758963 +vt 0.33655320 0.78112287 +vt 0.33655320 0.74543405 +vt 0.33655320 0.76327846 +vt 0.33679010 0.90605175 +vt 0.33679010 0.92389616 +vt 0.34579209 0.82138571 +vt 0.34579209 0.83544711 +vt 0.34579209 0.63858755 +vt 0.34579209 0.65264894 +vt 0.34579209 0.84950850 +vt 0.34579209 0.80732431 +vt 0.34579209 0.66671034 +vt 0.34579209 0.68077174 +vt 0.34579209 0.79326291 +vt 0.34579209 0.69483313 +vt 0.34579209 0.70889453 +vt 0.34579209 0.77920152 +vt 0.34579209 0.72295593 +vt 0.34579209 0.73701733 +vt 0.34579209 0.75107872 +vt 0.34579209 0.76514012 +vt 0.34584061 0.84958930 +vt 0.34584061 0.86365069 +vt 0.40273860 0.84950850 +vt 0.40273860 0.83544711 +vt 0.40273860 0.82138571 +vt 0.40273860 0.80732431 +vt 0.40273860 0.66671034 +vt 0.40273860 0.65264894 +vt 0.40273860 0.79326291 +vt 0.40273860 0.68077174 +vt 0.40273860 0.63858755 +vt 0.40273860 0.77920152 +vt 0.40273860 0.69483313 +vt 0.40273860 0.76514012 +vt 0.40273860 0.70889453 +vt 0.40273860 0.75107872 +vt 0.40273860 0.73701733 +vt 0.40273860 0.72295593 +vt 0.40278712 0.84958930 +vt 0.40278712 0.86365069 +vt 0.52609170 0.60714185 +vt 0.52609170 0.58339524 +vt 0.52609170 0.63088847 +vt 0.52609170 0.55202741 +vt 0.52609170 0.26795101 +vt 0.52609170 0.42567312 +vt 0.52609170 0.58339524 +vt 0.52609170 0.47316635 +vt 0.52609170 2.4424907e-15 +vt 0.52609170 0.31544423 +vt 0.52609170 0.39430529 +vt 0.52609170 0.34681206 +vt 0.52609170 0.50453418 +vt 0.52609170 0.15772212 +vt 0.52609170 0.18908995 +vt 0.52609170 0.11022889 +vt 0.52609170 7.8861059e-2 +vt 0.52609170 0.23658318 +vt 0.52609170 3.1367830e-2 +vt 0.55688874 0.47505495 +vt 0.56044719 0.44859304 +vt 0.56044801 4.6669738e-2 +vt 0.56055523 0.44843916 +vt 0.56361935 0.42191407 +vt 0.56363731 7.3346664e-2 +vt 0.56635544 0.10007571 +vt 0.56635732 0.39518705 +vt 0.56862329 0.36841588 +vt 0.56863860 0.12684541 +vt 0.57044909 0.15365124 +vt 0.57045367 0.34161141 +vt 0.57181084 0.31477882 +vt 0.57182349 0.18048295 +vt 0.57272427 0.20733474 +vt 0.57273155 0.28792770 +vt 0.57317836 0.26106452 +vt 0.57318833 0.23419763 +vt 0.62013178 0.63367691 +vt 0.62050000 0.68203558 +vt 0.62212355 0.87697997 +vt 0.62256078 0.85282537 +vt 0.62290393 0.90110406 +vt 0.63259132 0.60290672 +vt 0.63341731 0.71263219 +vt 0.63453254 0.82329784 +vt 0.63538230 0.93038005 +vt 0.64095918 0.62420266 +vt 0.64147464 0.69119380 +vt 0.64148594 0.87684967 +vt 0.64735146 0.84570358 +vt 0.64771792 0.90781018 +vt 0.65104977 0.80561949 +vt 0.65231205 0.94760789 +vt 0.66494501 0.81922050 +vt 0.66574411 0.93369369 +vt 0.66650182 0.56842851 +vt 0.66786818 0.74664569 +vt 0.66837244 0.78870706 +vt 0.67012395 0.96390257 +vt 0.68793438 0.57644133 +vt 0.68921515 0.73820933 +vt 0.69109524 0.80105001 +vt 0.69229596 0.95082418 +vt 0.69705955 0.55545752 +vt 0.69765672 0.77604486 +vt 0.69872522 0.75904114 +vt 0.69976750 0.97547623 +vt 0.72183107 0.77501494 +vt 0.72221097 0.79442813 +vt 0.72355238 0.95617309 +vt 0.72393229 0.97558628 +vt 0.74541942 0.55501577 +vt 0.74599586 0.77512499 +vt 0.74708510 0.75859939 +vt 0.74810663 0.97455636 +vt 0.75346739 0.79977705 +vt 0.75466812 0.94955121 +vt 0.75492949 0.57584758 +vt 0.75621026 0.73761558 +vt 0.77563941 0.78669865 +vt 0.77627646 0.56741122 +vt 0.77739091 0.96189416 +vt 0.77764283 0.74562840 +vt 0.78001924 0.81690753 +vt 0.78081834 0.93138072 +vt 0.79345130 0.80299333 +vt 0.79471359 0.94498173 +vt 0.79804544 0.84279104 +vt 0.79841189 0.90489764 +vt 0.80267000 0.62286311 +vt 0.80318546 0.68985426 +vt 0.80427741 0.87375155 +vt 0.81038105 0.82022117 +vt 0.81072734 0.60142472 +vt 0.81123081 0.92730338 +vt 0.81155332 0.71115020 +vt 0.82285943 0.84949716 +vt 0.82320258 0.89777585 +vt 0.82363981 0.87362126 +vt 0.82364465 0.63202133 +vt 0.82401286 0.68038000 +vt 0.83795505 0.62253362 +vt 0.84263174 0.59491862 +vt 0.84359507 0.65010234 +vt 0.85048388 0.76795920 +vt 0.85474760 0.79077512 +vt 0.85477715 0.62221805 +vt 0.85491275 0.74532538 +vt 0.85760013 0.57145582 +vt 0.85823537 0.60088910 +vt 0.85919718 0.64357767 +vt 0.85925987 0.67347878 +vt 0.86111320 0.90037233 +vt 0.86430425 0.91793302 +vt 0.86461072 0.88287009 +vt 0.86585584 0.76798225 +vt 0.86743054 0.81034771 +vt 0.86802205 0.72639380 +vt 0.86896590 0.75124656 +vt 0.86917120 0.78498256 +vt 0.86955603 0.58287166 +vt 0.87080912 0.90045707 +vt 0.87102677 0.90010721 +vt 0.87129861 0.66172500 +vt 0.87332265 0.91428949 +vt 0.87354075 0.91394205 +vt 0.87355390 0.52129341 +vt 0.87356405 0.88667071 +vt 0.87378182 0.88631835 +vt 0.87420708 0.93278209 +vt 0.87477161 0.86819640 +vt 0.87788710 0.48918029 +vt 0.87788801 6.0986081e-3 +vt 0.87795872 0.48930352 +vt 0.87848083 0.73744837 +vt 0.87874587 0.79964222 +vt 0.88032349 0.55549184 +vt 0.88112306 0.92598596 +vt 0.88134283 0.92564036 +vt 0.88156773 0.87511239 +vt 0.88169972 0.45711416 +vt 0.88172139 3.8162264e-2 +vt 0.88178687 0.87475798 +vt 0.88220300 0.68954341 +vt 0.88498829 7.0288581e-2 +vt 0.88499063 0.42499029 +vt 0.88627118 0.82409447 +vt 0.88670598 0.57075397 +vt 0.88765016 0.71435237 +vt 0.88771408 0.39281335 +vt 0.88773256 0.10246375 +vt 0.88888078 0.94294297 +vt 0.88891107 0.67424237 +vt 0.88962069 0.85829360 +vt 0.88990856 0.13468235 +vt 0.88991414 0.36059639 +vt 0.89154528 0.32834562 +vt 0.89156056 0.16693206 +vt 0.89264315 0.19920590 +vt 0.89265198 0.29607259 +vt 0.89268140 0.93398963 +vt 0.89278448 0.72871170 +vt 0.89285314 0.81001356 +vt 0.89290319 0.93364541 +vt 0.89318894 0.26378507 +vt 0.89320100 0.23149307 +vt 0.89326420 0.86731200 +vt 0.89348519 0.86695591 +vt 0.90638301 0.94644050 +vt 0.90646777 0.93674457 +vt 0.90669205 0.93640046 +vt 0.90709663 0.86479849 +vt 0.90718139 0.85510257 +vt 0.90732002 0.86444192 +vt 0.90737672 0.56705538 +vt 0.90764654 0.55052685 +vt 0.90881615 0.82961441 +vt 0.90941805 0.69536546 +vt 0.90964391 0.81426473 +vt 0.90966664 0.72653265 +vt 0.90968787 0.67883694 +vt 0.91049440 0.71118298 +vt 0.92030020 0.93423107 +vt 0.92052689 0.93388648 +vt 0.92088301 0.86755344 +vt 0.92110888 0.86719698 +vt 0.92394371 0.94324947 +vt 0.92468362 0.85860010 +vt 0.92645741 0.73078383 +vt 0.92652607 0.81208569 +vt 0.92815352 0.57164994 +vt 0.93035861 0.67513835 +vt 0.93166039 0.82644501 +vt 0.93199668 0.92643068 +vt 0.93222520 0.92608440 +vt 0.93244134 0.87555711 +vt 0.93266925 0.87520203 +vt 0.93303937 0.71670292 +vt 0.93486160 0.55634890 +vt 0.93674110 0.69040047 +vt 0.93879280 0.93334667 +vt 0.93935732 0.86876098 +vt 0.94000036 0.91487236 +vt 0.94023025 0.91452404 +vt 0.94024175 0.88725358 +vt 0.94047132 0.88690034 +vt 0.94056468 0.74115517 +vt 0.94082972 0.80334901 +vt 0.94275528 0.90108600 +vt 0.94298531 0.90073518 +vt 0.94576598 0.58416731 +vt 0.94750856 0.66302065 +vt 0.94895368 0.91867298 +vt 0.94926015 0.88361005 +vt 0.95013935 0.75581482 +vt 0.95034465 0.78955082 +vt 0.95128850 0.81440359 +vt 0.95188001 0.73044968 +vt 0.95245121 0.90117074 +vt 0.95345471 0.77281514 +vt 0.95780472 0.57241353 +vt 0.95786741 0.60231464 +vt 0.95882922 0.64500321 +vt 0.95946447 0.67443649 +vt 0.96228744 0.62367427 +vt 0.96439780 0.79547200 +vt 0.96456296 0.75002226 +vt 0.96882667 0.77283819 +vt 0.97346952 0.59578998 +vt 0.97443286 0.65097369 +vt 0.97910954 0.62335870 +vn -0.74715616 -0.30187068 -0.59214168 +vn -0.74177399 0.31486438 -0.59214168 +vn -0.30187068 0.74715616 -0.59214168 +vn 0.31486438 0.74177399 -0.59214168 +vn 0.74715616 0.30187068 -0.59214168 +vn 0.74177399 -0.31486438 -0.59214168 +vn 0.30187068 -0.74715616 -0.59214168 +vn -0.31486438 -0.74177399 -0.59214168 +vn 0.17515570 -0.88286469 0.43574122 +vn -0.19053714 -0.87967334 0.43574122 +vn -0.19598315 -0.85409519 -0.48178005 +vn 0.18104728 -0.85738548 -0.48178005 +vn 0.88286469 0.17515570 0.43574122 +vn 0.87967334 -0.19053714 0.43574122 +vn 0.85409519 -0.19598315 -0.48178005 +vn 0.85738548 0.18104728 -0.48178005 +vn -0.50042583 -0.74813340 0.43574122 +vn -0.75675309 -0.48729288 0.43574122 +vn -0.74251751 -0.46535549 -0.48178005 +vn -0.47824333 -0.73428285 -0.48178005 +vn 0.50042583 0.74813340 0.43574122 +vn 0.75675309 0.48729288 0.43574122 +vn 0.74251751 0.46535549 -0.48178005 +vn 0.47824333 0.73428285 -0.48178005 +vn -0.74813340 0.50042583 0.43574122 +vn -0.48729288 0.75675309 0.43574122 +vn -0.46535549 0.74251751 -0.48178005 +vn -0.73428285 0.47824333 -0.48178005 +vn -0.42036275 0.17843340 0.88963851 +vn -0.42341282 -0.17106988 0.88963851 +vn -0.17843340 -0.42036275 0.88963851 +vn 0.17106988 -0.42341282 0.88963851 +vn 0.42036275 -0.17843340 0.88963851 +vn 0.42341282 0.17106988 0.88963851 +vn 0.17843340 0.42036275 0.88963851 +vn -0.17106988 0.42341282 0.88963851 +vn -0.17515570 0.88286469 0.43574122 +vn 0.19053714 0.87967334 0.43574122 +vn 0.19598315 0.85409519 -0.48178005 +vn -0.18104728 0.85738548 -0.48178005 +vn -0.88286469 -0.17515570 0.43574122 +vn -0.87967334 0.19053714 0.43574122 +vn -0.85409519 0.19598315 -0.48178005 +vn -0.85738548 -0.18104728 -0.48178005 +vn 0.74813340 -0.50042583 0.43574122 +vn 0.48729288 -0.75675309 0.43574122 +vn 0.46535549 -0.74251751 -0.48178005 +vn 0.73428285 -0.47824333 -0.48178005 +vn -7.5273077e-3 -0.86254403 -0.50592602 +vn -0.86254403 7.5273077e-3 -0.50592602 +vn -0.60458812 0.61523334 -0.50592602 +vn 0.86254403 -7.5273077e-3 -0.50592602 +vn 0.61523334 0.60458812 -0.50592602 +vn 0.60458812 -0.61523334 -0.50592602 +vn -0.61523334 -0.60458812 -0.50592602 +vn 7.5273077e-3 0.86254403 -0.50592602 +vn -6.7516212e-3 -0.77365916 -0.63356603 +vn -0.77365916 6.7516212e-3 -0.63356603 +vn -0.54228552 0.55183376 -0.63356603 +vn 0.77365916 -6.7516212e-3 -0.63356603 +vn 0.55183376 0.54228552 -0.63356603 +vn 0.54228552 -0.55183376 -0.63356603 +vn 6.7516212e-3 0.77365916 -0.63356603 +vn -0.55183376 -0.54228552 -0.63356603 +vn 0.34009519 -0.84176513 -0.41924543 +vn -0.35473422 -0.83570144 -0.41924543 +vn -0.84176513 -0.34009519 -0.41924543 +vn -0.83570144 0.35473422 -0.41924543 +vn -0.34009519 0.84176513 -0.41924543 +vn 0.35473422 0.83570144 -0.41924543 +vn 0.84176513 0.34009519 -0.41924543 +vn 0.83570144 -0.35473422 -0.41924543 +vn -7.9269356e-3 -0.90833685 -0.41816423 +vn -0.64789634 -0.63668596 -0.41816423 +vn -0.90833685 7.9269356e-3 -0.41816423 +vn -0.63668596 0.64789634 -0.41816423 +vn 7.9269356e-3 0.90833685 -0.41816423 +vn 0.64789634 0.63668596 -0.41816423 +vn 0.90833685 -7.9269356e-3 -0.41816423 +vn 0.63668596 -0.64789634 -0.41816423 +vn -8.0037943e-3 -0.91714399 -0.39847565 +vn -0.35819175 -0.84384688 -0.39952610 +vn -0.65417827 -0.64285920 -0.39847565 +vn -0.84996967 -0.34341004 -0.39952610 +vn -0.91714399 8.0037943e-3 -0.39847565 +vn -0.84384688 0.35819175 -0.39952610 +vn -0.64285920 0.65417827 -0.39847565 +vn -0.34341004 0.84996967 -0.39952610 +vn 8.0037943e-3 0.91714399 -0.39847565 +vn 0.35819175 0.84384688 -0.39952610 +vn 0.65417827 0.64285920 -0.39847565 +vn 0.84996967 0.34341004 -0.39952610 +vn 0.91714399 -8.0037943e-3 -0.39847565 +vn 0.84384688 -0.35819175 -0.39952610 +vn 0.64285920 -0.65417827 -0.39847565 +vn 0.34341004 -0.84996967 -0.39952610 +vn -8.0408744e-3 -0.92139294 -0.38854909 +vn -0.35986002 -0.84777708 -0.38958284 +vn -0.65720895 -0.64583744 -0.38854909 +vn -0.85392838 -0.34500946 -0.38958284 +vn -0.92139294 8.0408744e-3 -0.38854909 +vn -0.84777708 0.35986002 -0.38958284 +vn -0.64583744 0.65720895 -0.38854909 +vn -0.34500946 0.85392838 -0.38958284 +vn 8.0408744e-3 0.92139294 -0.38854909 +vn 0.35986002 0.84777708 -0.38958284 +vn 0.65720895 0.64583744 -0.38854909 +vn 0.85392838 0.34500946 -0.38958284 +vn 0.92139294 -8.0408744e-3 -0.38854909 +vn 0.84777708 -0.35986002 -0.38958284 +vn 0.64583744 -0.65720895 -0.38854909 +vn 0.34500946 -0.85392838 -0.38958284 +vn -8.0408744e-3 -0.92139294 -0.38854909 +vn -0.35986002 -0.84777708 -0.38958284 +vn -0.65720895 -0.64583744 -0.38854909 +vn -0.85392838 -0.34500946 -0.38958284 +vn -0.92139294 8.0408744e-3 -0.38854909 +vn -0.84777708 0.35986002 -0.38958284 +vn -0.64583744 0.65720895 -0.38854909 +vn -0.34500946 0.85392838 -0.38958284 +vn 8.0408744e-3 0.92139294 -0.38854909 +vn 0.35986002 0.84777708 -0.38958284 +vn 0.65720895 0.64583744 -0.38854909 +vn 0.85392838 0.34500946 -0.38958284 +vn 0.92139294 -8.0408744e-3 -0.38854909 +vn 0.84777708 -0.35986002 -0.38958284 +vn 0.64583744 -0.65720895 -0.38854909 +vn 0.34500946 -0.85392838 -0.38958284 +vn -6.2948111e-3 -0.72131391 -0.69257969 +vn -0.28142687 -0.66300016 -0.69370722 +vn -0.51449706 -0.50559485 -0.69257969 +vn -0.66781076 -0.26981306 -0.69370722 +vn -0.72131391 6.2948111e-3 -0.69257969 +vn -0.66300016 0.28142687 -0.69370722 +vn -0.50559485 0.51449706 -0.69257969 +vn -0.26981306 0.66781076 -0.69370722 +vn 6.2948111e-3 0.72131391 -0.69257969 +vn 0.28142687 0.66300016 -0.69370722 +vn 0.51449706 0.50559485 -0.69257969 +vn 0.66781076 0.26981306 -0.69370722 +vn 0.72131391 -6.2948111e-3 -0.69257969 +vn 0.66300016 -0.28142687 -0.69370722 +vn 0.50559485 -0.51449706 -0.69257969 +vn 0.26981306 -0.66781076 -0.69370722 +vn 5.9305858e-3 0.67957782 -0.73357945 +vn 0.26509464 0.62452384 -0.73463923 +vn 0.48472765 0.47634053 -0.73357945 +vn 0.62905526 0.25415482 -0.73463923 +vn 0.67957782 -5.9305858e-3 -0.73357945 +vn 0.62452384 -0.26509464 -0.73463923 +vn 0.47634053 -0.48472765 -0.73357945 +vn 0.25415482 -0.62905526 -0.73463923 +vn -5.9305858e-3 -0.67957782 -0.73357945 +vn -0.26509464 -0.62452384 -0.73463923 +vn -0.48472765 -0.47634053 -0.73357945 +vn -0.62905526 -0.25415482 -0.73463923 +vn -0.67957782 5.9305858e-3 -0.73357945 +vn -0.62452384 0.26509464 -0.73463923 +vn -0.47634053 0.48472765 -0.73357945 +vn -0.25415482 0.62905526 -0.73463923 +vn 7.7770068e-3 0.89115671 -0.45362897 +vn 0.34799109 0.81981563 -0.45475767 +vn 0.63564212 0.62464378 -0.45362897 +vn 0.82576405 0.33363033 -0.45475767 +vn 0.89115671 -7.7770068e-3 -0.45362897 +vn 0.81981563 -0.34799109 -0.45475767 +vn 0.62464378 -0.63564212 -0.45362897 +vn 0.33363033 -0.82576405 -0.45475767 +vn -7.7770068e-3 -0.89115671 -0.45362897 +vn -0.34799109 -0.81981563 -0.45475767 +vn -0.63564212 -0.62464378 -0.45362897 +vn -0.82576405 -0.33363033 -0.45475767 +vn -0.89115671 7.7770068e-3 -0.45362897 +vn -0.81981563 0.34799109 -0.45475767 +vn -0.62464378 0.63564212 -0.45362897 +vn -0.33363033 0.82576405 -0.45475767 +g w_cannon_w_cannon +usemtl w_cannon +s 1 +f 1/299/1 50/298/50 75/169/75 67/170/67 +f 1/299/1 67/170/67 74/167/74 55/292/55 +f 2/293/2 51/290/51 76/165/76 68/168/68 +f 2/293/2 68/168/68 75/169/75 50/298/50 +f 3/289/3 56/283/56 77/161/77 69/164/69 +f 3/289/3 69/164/69 76/165/76 51/290/51 +f 4/279/4 53/274/53 78/157/78 70/160/70 +f 4/279/4 70/160/70 77/161/77 56/283/56 +f 5/267/5 52/260/52 79/153/79 71/156/71 +f 5/265/5 71/154/71 78/157/78 53/274/53 +f 6/275/6 54/278/54 80/159/80 72/158/72 +f 6/275/6 72/158/72 79/155/79 52/266/52 +f 7/284/7 49/288/49 73/163/73 65/162/65 +f 7/284/7 65/162/65 80/159/80 54/278/54 +f 8/291/8 55/292/55 74/167/74 66/166/66 +f 8/291/8 66/166/66 73/163/73 49/288/49 +f 9/205/9 32/211/32 31/193/31 10/197/10 +f 10/147/10 11/25/11 57/12/57 12/11/12 9/149/9 +f 10/147/10 17/148/17 20/7/20 11/25/11 +f 11/206/11 20/213/20 8/209/8 +f 12/11/12 47/21/47 46/150/46 9/149/9 +f 13/234/13 34/224/34 33/223/33 14/233/14 +f 14/2/14 15/135/15 60/134/60 16/136/16 13/3/13 +f 14/142/14 45/152/45 48/1/48 15/15/15 +f 15/174/15 48/178/48 6/183/6 +f 16/17/16 23/9/23 22/137/22 13/140/13 +f 17/189/17 31/193/31 30/180/30 18/176/18 +f 18/151/18 19/16/19 64/13/64 20/7/20 17/148/17 +f 18/151/18 41/138/41 44/18/44 19/16/19 +f 19/226/19 44/230/44 1/221/1 +f 21/216/21 35/212/35 34/224/34 22/229/22 +f 22/137/22 23/9/23 61/4/61 24/24/24 21/146/21 +f 22/229/22 34/224/34 13/234/13 +f 23/179/23 16/175/16 5/184/5 +f 24/24/24 39/19/39 38/141/38 21/146/21 +f 25/177/25 29/181/29 36/194/36 26/190/26 +f 26/144/26 27/22/27 59/8/59 28/5/28 25/145/25 +f 26/144/26 37/139/37 40/6/40 27/22/27 +f 27/215/27 40/208/40 3/210/3 +f 28/5/28 43/20/43 42/143/42 25/145/25 +f 29/181/29 42/172/42 41/171/41 30/180/30 +f 30/180/30 31/193/31 32/211/32 33/223/33 34/224/34 35/212/35 36/194/36 29/181/29 +f 30/180/30 41/171/41 18/176/18 +f 31/193/31 17/189/17 10/197/10 +f 32/211/32 46/214/46 45/227/45 33/223/33 +f 33/223/33 45/227/45 14/233/14 +f 35/212/35 38/207/38 37/199/37 36/194/36 +f 36/194/36 37/199/37 26/190/26 +f 38/207/38 35/212/35 21/216/21 +f 38/141/38 39/19/39 63/10/63 40/6/40 37/139/37 +f 39/200/39 24/192/24 4/196/4 +f 42/172/42 29/181/29 25/177/25 +f 42/143/42 43/20/43 58/14/58 44/18/44 41/138/41 +f 43/231/43 28/228/28 2/222/2 +f 46/214/46 32/211/32 9/205/9 +f 46/150/46 47/21/47 62/23/62 48/1/48 45/152/45 +f 47/191/47 12/198/12 7/195/7 +f 49/202/49 57/201/57 11/206/11 8/209/8 +f 50/225/50 58/232/58 43/231/43 2/222/2 +f 51/218/51 59/220/59 27/215/27 3/210/3 +f 52/182/52 60/173/60 15/174/15 6/183/6 +f 53/188/53 61/186/61 23/179/23 5/184/5 +f 54/187/54 62/185/62 47/191/47 7/195/7 +f 55/217/55 64/219/64 19/226/19 1/221/1 +f 56/203/56 63/204/63 39/200/39 4/196/4 +f 57/201/57 49/202/49 7/195/7 12/198/12 +f 58/232/58 50/225/50 1/221/1 44/230/44 +f 59/220/59 51/218/51 2/222/2 28/228/28 +f 60/173/60 52/182/52 5/184/5 16/175/16 +f 61/186/61 53/188/53 4/196/4 24/192/24 +f 62/185/62 54/187/54 6/183/6 48/178/48 +f 63/204/63 56/203/56 3/210/3 40/208/40 +f 64/219/64 55/217/55 8/209/8 20/213/20 +f 65/270/65 96/281/96 95/254/95 80/242/80 +f 66/332/66 74/354/74 83/344/83 82/324/82 +f 67/362/67 75/364/75 85/358/85 84/355/84 +f 68/363/68 76/357/76 87/345/87 86/356/86 +f 69/333/69 77/311/77 89/314/89 88/325/88 +f 70/277/70 78/245/78 91/257/91 90/286/90 +f 71/237/71 79/235/79 93/240/93 92/244/92 +f 72/236/72 80/242/80 95/254/95 94/243/94 +f 73/309/73 81/308/81 96/281/96 65/270/65 +f 81/50/81 97/39/97 112/33/112 96/49/96 +f 82/324/82 81/308/81 73/309/73 66/332/66 +f 82/52/82 98/40/98 97/39/97 81/50/81 +f 83/56/83 99/43/99 98/40/98 82/52/82 +f 84/355/84 83/344/83 74/354/74 67/362/67 +f 84/58/84 100/38/100 99/43/99 83/56/83 +f 85/57/85 101/41/101 100/38/100 84/58/84 +f 86/356/86 85/358/85 75/364/75 68/363/68 +f 86/59/86 102/42/102 101/41/101 85/57/85 +f 87/61/87 103/37/103 102/42/102 86/59/86 +f 88/325/88 87/345/87 76/357/76 69/333/69 +f 88/60/88 104/35/104 103/37/103 87/61/87 +f 89/54/89 105/36/105 104/35/104 88/60/88 +f 90/286/90 89/314/89 77/311/77 70/277/70 +f 90/55/90 106/32/106 105/36/105 89/54/89 +f 91/53/91 107/29/107 106/32/106 90/55/90 +f 92/244/92 91/257/91 78/245/78 71/237/71 +f 92/51/92 108/30/108 107/29/107 91/53/91 +f 93/26/93 109/45/109 108/44/108 92/27/92 +f 94/243/94 93/240/93 79/235/79 72/236/72 +f 94/47/94 110/28/110 109/31/109 93/46/93 +f 95/48/95 111/34/111 110/28/110 94/47/94 +f 96/49/96 112/33/112 111/34/111 95/48/95 +f 98/331/98 99/351/99 115/340/115 114/322/114 +f 99/351/99 100/360/100 116/348/116 115/340/115 +f 100/360/100 101/361/101 117/353/117 116/348/116 +f 101/361/101 102/359/102 118/349/118 117/353/117 +f 102/359/102 103/350/103 119/341/119 118/349/118 +f 103/350/103 104/326/104 120/323/120 119/341/119 +f 104/326/104 105/310/105 121/312/121 120/323/120 +f 105/310/105 106/280/106 122/296/122 121/312/121 +f 106/280/106 107/250/107 123/269/123 122/296/122 +f 107/250/107 108/239/108 124/253/124 123/269/123 +f 108/239/108 109/238/109 125/249/125 124/253/124 +f 109/238/109 110/241/110 126/252/126 125/249/125 +f 110/241/110 111/251/111 127/268/127 126/252/126 +f 111/251/111 112/282/112 128/295/128 127/268/127 +f 112/282/112 97/315/97 113/313/113 128/295/128 +f 113/87/113 129/66/129 144/63/144 128/83/128 +f 114/322/114 113/313/113 97/315/97 98/331/98 +f 114/92/114 130/64/130 129/66/129 113/87/113 +f 115/94/115 131/73/131 130/64/130 114/92/114 +f 116/95/116 132/75/132 131/73/131 115/94/115 +f 117/93/117 133/76/133 132/75/132 116/95/116 +f 118/91/118 134/77/134 133/76/133 117/93/117 +f 119/84/119 135/74/135 134/77/134 118/91/118 +f 120/86/120 136/72/136 135/74/135 119/84/119 +f 121/85/121 137/67/137 136/72/136 120/86/120 +f 122/88/122 138/62/138 137/67/137 121/85/121 +f 123/90/123 139/65/139 138/62/138 122/88/122 +f 124/89/124 140/69/140 139/65/139 123/90/123 +f 125/78/125 141/96/141 140/97/140 124/79/124 +f 126/82/126 142/71/142 141/68/141 125/81/125 +f 127/80/127 143/70/143 142/71/142 126/82/126 +f 128/83/128 144/63/144 143/70/143 127/80/127 +f 129/306/129 145/305/145 160/300/160 144/287/144 +f 130/321/130 146/318/146 145/305/145 129/306/129 +f 131/335/131 147/329/147 146/318/146 130/321/130 +f 132/347/132 148/338/148 147/329/147 131/335/131 +f 133/352/133 149/342/149 148/338/148 132/347/132 +f 134/346/134 150/336/150 149/342/149 133/352/133 +f 135/334/135 151/327/151 150/336/150 134/346/134 +f 136/320/136 152/316/152 151/327/151 135/334/135 +f 137/302/137 153/303/153 152/316/152 136/320/136 +f 138/285/138 154/294/154 153/303/153 137/302/137 +f 139/263/139 155/271/155 154/294/154 138/285/138 +f 140/247/140 156/258/156 155/271/155 139/263/139 +f 141/246/141 157/255/157 156/258/156 140/247/140 +f 142/248/142 158/261/158 157/255/157 141/246/141 +f 143/264/143 159/273/159 158/261/158 142/248/142 +f 144/287/144 160/300/160 159/273/159 143/264/143 +f 145/126/145 161/107/161 176/105/176 160/123/160 +f 146/128/146 162/108/162 161/107/161 145/126/145 +f 147/131/147 163/110/163 162/108/162 146/128/146 +f 148/130/148 164/111/164 163/110/163 147/131/147 +f 149/129/149 165/112/165 164/111/164 148/130/148 +f 150/127/150 166/113/166 165/112/165 149/129/149 +f 151/125/151 167/109/167 166/113/166 150/127/150 +f 152/122/152 168/106/168 167/109/167 151/125/151 +f 153/119/153 169/103/169 168/106/168 152/122/152 +f 154/118/154 170/98/170 169/103/169 153/119/153 +f 155/117/155 171/99/171 170/98/170 154/118/154 +f 156/116/156 172/102/172 171/99/171 155/117/155 +f 157/114/157 173/132/173 172/133/172 156/115/156 +f 158/121/158 174/101/174 173/100/173 157/124/157 +f 159/120/159 175/104/175 174/101/174 158/121/158 +f 160/123/160 176/105/176 175/104/175 159/120/159 +f 162/319/162 163/330/163 164/339/164 165/343/165 166/337/166 167/328/167 168/317/168 169/304/169 170/297/170 171/272/171 172/259/172 173/256/173 174/262/174 175/276/175 176/301/176 161/307/161 diff --git a/res/models/playership/weapons/w_cannon.png b/res/models/playership/weapons/w_cannon.png new file mode 100644 index 0000000..c409d6d Binary files /dev/null and b/res/models/playership/weapons/w_cannon.png differ diff --git a/res/models/playership/weapons/w_emp.mtl b/res/models/playership/weapons/w_emp.mtl new file mode 100644 index 0000000..bf4ce61 --- /dev/null +++ b/res/models/playership/weapons/w_emp.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl w_emp +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd w_emp.png + diff --git a/res/models/playership/weapons/w_emp.obj b/res/models/playership/weapons/w_emp.obj new file mode 100644 index 0000000..fd6ce2a --- /dev/null +++ b/res/models/playership/weapons/w_emp.obj @@ -0,0 +1,755 @@ +# Exported from Wings 3D 1.4.1 +mtllib w_emp.mtl +o w_emp +#157 vertices, 165 faces +v -0.11886575 -0.31766553 0.35942340 +v -0.29110468 -0.14239393 0.35942340 +v -0.28896025 0.10333312 0.35942340 +v -0.11368865 0.27557204 0.35942340 +v 0.13203840 0.27342762 0.35942340 +v 0.30427732 9.8156016e-2 0.35942340 +v 0.30213290 -0.14757103 0.35942340 +v 0.12686129 -0.31980996 0.35942340 +v 0.31476346 -0.21409814 2.28931823 +v 0.19315784 -0.33359966 2.28931823 +v 0.19315784 -0.33359966 0.40071224 +v 0.31476346 -0.21409814 0.40071224 +v 0.19856551 0.28605818 2.28931823 +v 0.31806702 0.16445256 2.28931823 +v 0.31806702 0.16445256 0.40071224 +v 0.19856551 0.28605818 0.40071224 +v 8.8750684e-2 -0.37578288 2.28931823 +v -8.1737811e-2 -0.37429505 2.28931823 +v -8.1737811e-2 -0.37429505 0.40071224 +v 8.8750684e-2 -0.37578288 0.40071224 +v -7.5578038e-2 0.33154497 2.28931823 +v 9.4910456e-2 0.33005714 2.28931823 +v 9.4910456e-2 0.33005714 0.40071224 +v -7.5578038e-2 0.33154497 0.40071224 +v -0.34707761 -0.10428332 2.28931823 +v -0.34558978 6.6205178e-2 2.28931823 +v -0.34558978 6.6205178e-2 0.40071224 +v -0.34707761 -0.10428332 0.40071224 +v -0.28644913 -0.14051296 2.33060707 +v -0.11690383 -0.31304352 2.33060707 +v 0.12498033 -0.31515441 2.33060707 +v 0.29751088 -0.14560910 2.33060707 +v 0.29962177 9.6275051e-2 2.33060707 +v 0.13007647 0.26880560 2.33060707 +v -0.11180768 0.27091649 2.33060707 +v -0.28433824 0.10137119 2.33060707 +v -0.30159082 0.16986023 2.28931823 +v -0.17998519 0.28936175 2.28931823 +v -0.17998519 0.28936175 0.40071224 +v -0.30159082 0.16986023 0.40071224 +v -0.18539286 -0.33029609 2.28931823 +v -0.30489438 -0.20869047 2.28931823 +v -0.30489438 -0.20869047 0.40071224 +v -0.18539286 -0.33029609 0.40071224 +v 0.36025025 6.0045405e-2 2.28931823 +v 0.35876242 -0.11044309 2.28931823 +v 0.35876242 -0.11044309 0.40071224 +v 0.36025025 6.0045405e-2 0.40071224 +v 0.21051346 -0.10868089 0.35942340 +v 8.9576053e-2 -0.22752575 0.35942340 +v -7.9975610e-2 -0.22604609 0.35942340 +v -0.19882047 -0.10510869 0.35942340 +v -0.19734081 6.4442978e-2 0.35942340 +v -7.6403407e-2 0.18328783 0.35942340 +v 9.3148256e-2 0.18180818 0.35942340 +v 0.21199311 6.0870775e-2 0.35942340 +v 0.12160123 -7.0939886e-2 0.35942340 +v 5.3392531e-2 -0.13796839 0.35942340 +v -4.2234608e-2 -0.13713386 0.35942340 +v -0.10926311 -6.8925164e-2 0.35942340 +v -0.10842858 2.6701975e-2 0.35942340 +v -4.0219885e-2 9.3730474e-2 0.35942340 +v 5.5407253e-2 9.2895949e-2 0.35942340 +v 0.12243575 2.4687252e-2 0.35942340 +v 1.15681510 -1.18164544 -1.90837459 +v -1.15475359 -1.17216666 -1.89436071 +v -1.14364245 1.13740753 -1.85515246 +v 1.16792623 1.12792875 -1.86916634 +v 0.11317946 -6.7365056e-2 -1.60386424 +v 4.9965226e-2 -0.12948551 -1.60386424 +v -3.8659778e-2 -0.12871209 -1.60386424 +v -0.10078023 -6.5497858e-2 -1.60386424 +v -0.10000681 2.3127145e-2 -1.60386424 +v -3.6792580e-2 8.5247596e-2 -1.60386424 +v 5.1832423e-2 8.4474177e-2 -1.60386424 +v 0.11395287 2.1259947e-2 -1.60386424 +v 0.26871861 -0.13338751 -1.75834522 +v 0.11326309 -0.28615322 -1.75834522 +v -0.10468223 -0.28425124 -1.75834522 +v -0.25744795 -0.12879572 -1.75834522 +v -0.25554597 8.9149599e-2 -1.75834522 +v -0.10009045 0.24191531 -1.75834522 +v 0.11785488 0.24001333 -1.75834522 +v 0.27062059 8.4557813e-2 -1.75834522 +v 0.23945210 -0.12096461 -2.11218378 +v 0.10135286 -0.25667436 -2.11218378 +v -9.2259335e-2 -0.25498473 -2.11218378 +v -0.22796908 -0.11688549 -2.11218378 +v -0.22627945 7.6726702e-2 -2.11218378 +v -8.8180212e-2 0.21243645 -2.11218378 +v 0.10543198 0.21074682 -2.11218378 +v 0.24114173 7.2647580e-2 -2.11218378 +v 8.7496879e-2 -0.10445414 -1.60386424 +v 5.5789616e-3 -0.13755112 -1.60386424 +v -7.5748857e-2 -0.10302951 -1.60386424 +v -0.10884584 -2.1111594e-2 -1.60386424 +v -7.4324233e-2 6.0216224e-2 -1.60386424 +v 7.5936842e-3 9.3313211e-2 -1.60386424 +v 8.8921503e-2 5.8791600e-2 -1.60386424 +v 0.12201849 -2.3126317e-2 -1.60386424 +v 0.20556039 -0.22459644 -1.75834522 +v 0.23686925 -0.11986826 -1.69058890 +v 4.1090347e-3 -0.30598807 -1.75834522 +v 0.10030175 -0.25407277 -1.69058890 +v -0.19589116 -0.22109302 -1.75834522 +v -9.1162978e-2 -0.25240188 -1.69058890 +v -0.27728279 -1.9641667e-2 -1.75834522 +v -0.22536749 -0.11583438 -1.69058890 +v -0.19238774 0.18035853 -1.75834522 +v -0.22369660 7.5630345e-2 -1.69058890 +v 9.0636111e-3 0.26175016 -1.75834522 +v -8.7129099e-2 0.20983485 -1.69058890 +v 0.20906381 0.17685511 -1.75834522 +v 0.10433562 0.20816397 -1.69058890 +v 0.29045544 -2.4596244e-2 -1.75834522 +v 0.23854013 7.1596467e-2 -1.69058890 +v 0.16186077 -0.18012738 -2.16488314 +v 0.27933507 -0.13789393 -1.96161418 +v 4.6531084e-3 -0.24364339 -2.16488314 +v 0.11758354 -0.29684671 -1.96161418 +v -0.15142210 -0.17739340 -2.16488314 +v -0.10918865 -0.29486770 -1.96161418 +v -0.21493812 -2.0185741e-2 -2.16488314 +v -0.26814143 -0.13311617 -1.96161418 +v -0.14868812 0.13588947 -2.16488314 +v -0.26616242 9.3656017e-2 -1.96161418 +v 8.5195374e-3 0.19940548 -2.16488314 +v -0.10441090 0.25260880 -1.96161418 +v 0.16459474 0.13315549 -2.16488314 +v 0.12236130 0.25062979 -1.96161418 +v 0.22811076 -2.4052170e-2 -2.16488314 +v 0.28131408 8.8878262e-2 -1.96161418 +v 6.5863229e-3 -2.2118956e-2 -2.23263947 +v 0.18138482 -0.19999520 -1.69058890 +v 4.4100280e-3 -0.27149765 -1.69058890 +v -0.17128992 -0.19691745 -1.69058890 +v -0.24279238 -1.9942661e-2 -1.69058890 +v -0.16821217 0.15575729 -1.69058890 +v 8.7626178e-3 0.22725974 -1.69058890 +v 0.18446256 0.15267954 -1.69058890 +v 0.25596502 -2.4295251e-2 -1.69058890 +v 0.21361891 -0.23279685 -1.96161418 +v 4.0087036e-3 -0.31748487 -1.96161418 +v -0.20409157 -0.22915155 -1.96161418 +v -0.28877960 -1.9541336e-2 -1.96161418 +v -0.20044627 0.18855894 -1.96161418 +v 9.1639422e-3 0.27324696 -1.96161418 +v 0.21726422 0.18491364 -1.96161418 +v 0.30195224 -2.4696575e-2 -1.96161418 +v 8.7496879e-2 -0.10445414 0.35942340 +v 5.5789616e-3 -0.13755112 0.35942340 +v -7.5748857e-2 -0.10302951 0.35942340 +v -0.10884584 -2.1111594e-2 0.35942340 +v -7.4324233e-2 6.0216224e-2 0.35942340 +v 7.5936842e-3 9.3313211e-2 0.35942340 +v 8.8921503e-2 5.8791600e-2 0.35942340 +v 0.12201849 -2.3126317e-2 0.35942340 +vt 9.4401274e-3 0.31541295 +vt 9.4401274e-3 0.36607904 +vt 9.4405543e-3 0.36648961 +vt 9.4405543e-3 0.39995302 +vt 9.4405543e-3 0.73647105 +vt 9.4405543e-3 0.70300763 +vt 9.4405543e-3 0.45061912 +vt 9.4405543e-3 0.78713714 +vt 9.4405543e-3 0.65234154 +vt 9.4405543e-3 0.82060055 +vt 9.4405543e-3 0.87126665 +vt 9.4405543e-3 0.90473006 +vt 9.4405543e-3 0.48408253 +vt 9.4405543e-3 0.61887813 +vt 9.4405543e-3 0.53474862 +vt 9.4405543e-3 0.95539615 +vt 9.4405543e-3 0.98885957 +vt 9.4405543e-3 0.56821203 +vt 9.8069541e-3 9.0462074e-2 +vt 1.0053343e-2 0.10383633 +vt 1.0299733e-2 0.11721059 +vt 1.0509296e-2 0.13058548 +vt 1.0718859e-2 0.14396037 +vt 1.0891613e-2 0.15733578 +vt 1.1064367e-2 0.17071119 +vt 1.1200292e-2 0.18408703 +vt 1.1336215e-2 0.19746287 +vt 1.1435318e-2 0.21083903 +vt 1.1534422e-2 0.22421519 +vt 1.1596712e-2 0.23759158 +vt 1.1659002e-2 0.25096796 +vt 1.1684465e-2 0.26434446 +vt 1.1698570e-2 0.29109749 +vt 1.1709928e-2 0.27772097 +vt 1.1764601e-2 0.29104327 +vt 1.1764865e-2 0.30441982 +vt 0.57067828 0.31541295 +vt 0.57067828 0.36607904 +vt 0.57067870 0.61887813 +vt 0.57067870 0.56821203 +vt 0.57067870 0.45061912 +vt 0.57067870 0.65234154 +vt 0.57067870 0.48408253 +vt 0.57067870 0.53474862 +vt 0.57067870 0.39995302 +vt 0.57067870 0.95539615 +vt 0.57067870 0.36648961 +vt 0.57067870 0.98885957 +vt 0.57067870 0.70300763 +vt 0.57067870 0.90473006 +vt 0.57067870 0.73647105 +vt 0.57067870 0.87126665 +vt 0.57067870 0.82060055 +vt 0.57067870 0.78713714 +vt 0.58118131 0.76711531 +vt 0.58148131 0.79760488 +vt 0.58363159 0.93665423 +vt 0.58370191 0.90624649 +vt 0.58898776 0.74768493 +vt 0.58967445 0.81686544 +vt 0.59154384 0.95602471 +vt 0.59173877 0.88684894 +vt 0.59183511 7.8938391e-2 +vt 0.59209048 9.3113868e-2 +vt 0.59235739 0.10728913 +vt 0.59257375 0.12146526 +vt 0.59280163 0.13564120 +vt 0.59297896 0.14981787 +vt 0.59316783 0.16399439 +vt 0.59330614 0.17817150 +vt 0.59345598 0.19234848 +vt 0.59355526 0.20652591 +vt 0.59366607 0.22070326 +vt 0.59372632 0.23488090 +vt 0.59379811 0.24905850 +vt 0.59381933 0.26323626 +vt 0.59383428 0.29159177 +vt 0.59385209 0.27741400 +vt 0.59390088 0.29104689 +vt 0.59390619 0.30522464 +vt 0.59430304 0.76111113 +vt 0.59471525 0.80334831 +vt 0.59610835 0.94286271 +vt 0.59622316 0.90010457 +vt 0.61033147 0.72586358 +vt 0.61143116 0.83822751 +vt 0.61211248 0.93629236 +vt 0.61220004 0.90678171 +vt 0.61286629 0.97767973 +vt 0.61335061 0.86523123 +vt 0.62388153 0.73094701 +vt 0.62485417 0.83294035 +vt 0.62609801 0.97330712 +vt 0.62660939 0.86981282 +vt 0.62769278 0.92992942 +vt 0.62770504 0.92158746 +vt 0.62771545 0.91325777 +vt 0.62964748 0.71770989 +vt 0.63083762 0.84606823 +vt 0.63216155 0.98589209 +vt 0.63287148 0.95733948 +vt 0.63290740 0.85732977 +vt 0.63312851 0.88594950 +vt 0.63356847 0.93587768 +vt 0.63360248 0.90739129 +vt 0.63943116 0.94183095 +vt 0.63949019 0.90154130 +vt 0.64128891 9.9088563e-2 +vt 0.64215383 0.13691680 +vt 0.64313112 6.3515339e-2 +vt 0.64480623 5.0318938e-2 +vt 0.64776619 0.94191276 +vt 0.64780737 0.90162070 +vt 0.65011057 0.17666002 +vt 0.65032818 2.2951112e-2 +vt 0.65608337 0.94199217 +vt 0.65614240 0.90170251 +vt 0.65821451 2.3275891e-2 +vt 0.65895766 0.12721711 +vt 0.66013862 0.71745623 +vt 0.66132876 0.84581457 +vt 0.66146833 9.9919602e-2 +vt 0.66184380 5.1020587e-2 +vt 0.66197108 0.93614218 +vt 0.66200509 0.90765579 +vt 0.66244505 0.95758397 +vt 0.66252508 6.4314031e-2 +vt 0.66266617 0.98620369 +vt 0.66270208 0.88619399 +vt 0.66341202 0.85764137 +vt 0.66551282 8.9547086e-2 +vt 0.66612207 0.73058411 +vt 0.66709472 0.83257746 +vt 0.66785811 0.93027569 +vt 0.66786853 0.92194601 +vt 0.66788079 0.91360405 +vt 0.66896418 0.97372064 +vt 0.66947555 0.87022634 +vt 0.67026899 6.6574356e-2 +vt 0.67135528 0.14214197 +vt 0.67378072 0.14149472 +vt 0.67954508 0.72529695 +vt 0.68064478 0.83766088 +vt 0.68222296 0.97830224 +vt 0.68270727 0.86585374 +vt 0.68337352 0.93675176 +vt 0.68346108 0.90724110 +vt 0.69163651 8.9205517e-2 +vt 0.69327249 7.2810000e-2 +vt 0.69573097 3.0312384e-2 +vt 0.69626100 0.76017615 +vt 0.69665786 0.17667026 +vt 0.69667320 0.80241334 +vt 0.69887279 0.13186936 +vt 0.69935040 0.94342889 +vt 0.69946521 0.90067075 +vt 0.70130179 0.74665902 +vt 0.70198848 0.81583953 +vt 0.70383479 0.95668453 +vt 0.70402972 0.88750876 +vt 0.70703305 3.5656967e-2 +vt 0.70949493 0.76591959 +vt 0.70979493 0.79640916 +vt 0.71187165 0.93728698 +vt 0.71194197 0.90687924 +vt 0.71264519 8.7981814e-2 +vt 0.71281130 7.4418976e-2 +vt 0.71895588 0.12343667 +vt 0.71943293 3.8493483e-2 +vt 0.72635534 0.17780594 +vt 0.73006626 7.3756752e-2 +vt 0.73055702 8.5845859e-2 +vt 0.73246783 3.9321875e-2 +vt 0.73259598 0.15018194 +vt 0.73601279 0.11628832 +vt 0.74581202 7.2413330e-2 +vt 0.74593293 3.9032194e-2 +vt 0.74652680 8.3560225e-2 +vt 0.75066511 0.14578645 +vt 0.75090269 0.11082986 +vt 0.75575506 0.18751203 +vt 0.75585959 0.18678383 +vt 0.75590301 0.18740821 +vt 0.75613664 0.18936888 +vt 0.75805035 0.13027932 +vt 0.75979376 3.7847719e-2 +vt 0.76069752 7.0633085e-2 +vt 0.76138506 8.1353077e-2 +vt 0.76450659 0.10677943 +vt 0.77164673 0.13166019 +vt 0.77413735 3.6361597e-2 +vt 0.77516348 6.9223965e-2 +vt 0.77558197 7.9653885e-2 +vt 0.77721329 0.10410559 +vt 0.77983530 0.12151508 +vt 0.78907273 3.4644108e-2 +vt 0.78945129 0.10272523 +vt 0.78952664 6.8027253e-2 +vt 0.78953145 7.8532244e-2 +vt 0.79026299 0.12648698 +vt 0.79553677 0.16477707 +vt 0.79749237 0.98991259 +vt 0.79817479 0.98249867 +vt 0.79826489 0.99318831 +vt 0.79835290 0.98919533 +vt 0.79973105 0.11959021 +vt 0.80146506 0.10258822 +vt 0.80350824 7.8293630e-2 +vt 0.80409326 6.7645806e-2 +vt 0.80477251 3.3136324e-2 +vt 0.80768765 0.12745507 +vt 0.81350358 0.10380761 +vt 0.81780065 7.8947274e-2 +vt 0.81902965 0.12364412 +vt 0.81909917 6.7861108e-2 +vt 0.82137090 3.1809465e-2 +vt 0.82453132 0.13468713 +vt 0.82572569 0.10653703 +vt 0.83259118 8.0796131e-2 +vt 0.83473747 6.9253116e-2 +vt 0.83805922 0.13513098 +vt 0.83826526 0.11101111 +vt 0.83908186 3.1022876e-2 +vt 0.84005994 0.15072768 +vt 0.84214488 0.18745172 +vt 0.84224941 0.18671686 +vt 0.84229285 0.18742950 +vt 0.84252648 0.18936888 +vt 0.84808234 8.3912592e-2 +vt 0.84998451 0.18113917 +vt 0.85119568 7.1561335e-2 +vt 0.85134666 0.11766697 +vt 0.85569348 0.15808458 +vt 0.85709028 0.19062384 +vt 0.85715251 0.18906200 +vt 0.85719121 0.18959018 +vt 0.85726484 0.19088855 +vt 0.85813841 3.0668271e-2 +vt 0.86447300 8.8659792e-2 +vt 0.86517324 0.12698781 +vt 0.86855851 7.5431029e-2 +vt 0.87879335 3.1183329e-2 +vt 0.88030580 0.14001103 +vt 0.88222770 9.5036041e-2 +vt 0.88682889 8.0575297e-2 +vt 0.89061430 0.18059882 +vt 0.89074326 0.17926287 +vt 0.89075419 0.17969638 +vt 0.89079059 0.18086931 +vt 0.89404259 3.6555233e-2 +vt 0.89752530 0.15790800 +vt 0.90256739 0.10322510 +vt 0.90759516 8.6057733e-2 +vt 0.90881012 3.9477146e-2 +vt 0.92057100 0.99423834 +vt 0.92066540 0.97790479 +vt 0.92121032 0.98997265 +vt 0.92173064 0.98235837 +vt 0.92328251 3.8807525e-2 +vt 0.92743064 0.11394580 +vt 0.93370075 8.9010106e-2 +vt 0.95022328 0.18058729 +vt 0.95035216 0.17936465 +vt 0.95036317 0.17973354 +vt 0.95039949 0.18096986 +vt 0.98376829 0.19054185 +vt 0.98391253 0.19103151 +vt 0.98392965 0.18920909 +vt 0.98393060 0.18961220 +vn -0.10853958 -0.65528868 -0.74753990 +vn -0.65644193 -9.7300350e-2 -0.74807528 +vn -0.65521219 0.10821763 -0.74765362 +vn -9.7037848e-2 0.65620337 -0.74831864 +vn 0.10833770 0.65519279 -0.74765323 +vn 0.65633550 9.7105732e-2 -0.74819395 +vn 0.65541233 -0.10864488 -0.74741619 +vn 9.7447198e-2 -0.65642910 -0.74806743 +vn 0.74813340 -0.50042583 0.43574122 +vn 0.48729288 -0.75675309 0.43574122 +vn 0.49268738 -0.76613898 -0.41266236 +vn 0.75742371 -0.50598331 -0.41266236 +vn 0.50042583 0.74813340 0.43574122 +vn 0.75675309 0.48729288 0.43574122 +vn 0.76613898 0.49268738 -0.41266236 +vn 0.50598331 0.75742371 -0.41266236 +vn 0.17515570 -0.88286469 0.43574122 +vn -0.19053714 -0.87967334 0.43574122 +vn -0.19335948 -0.89012465 -0.41266236 +vn 0.17779521 -0.89336367 -0.41266236 +vn -0.17515570 0.88286469 0.43574122 +vn 0.19053714 0.87967334 0.43574122 +vn 0.19335948 0.89012465 -0.41266236 +vn -0.17779521 0.89336367 -0.41266236 +vn -0.88286469 -0.17515570 0.43574122 +vn -0.87967334 0.19053714 0.43574122 +vn -0.89012465 0.19335948 -0.41266236 +vn -0.89336367 -0.17779521 -0.41266236 +vn -0.42341282 -0.17106988 0.88963851 +vn -0.17843340 -0.42036275 0.88963851 +vn 0.17106988 -0.42341282 0.88963851 +vn 0.42036275 -0.17843340 0.88963851 +vn 0.42341282 0.17106988 0.88963851 +vn 0.17843340 0.42036275 0.88963851 +vn -0.17106988 0.42341282 0.88963851 +vn -0.42036275 0.17843340 0.88963851 +vn -0.74813340 0.50042583 0.43574122 +vn -0.48729288 0.75675309 0.43574122 +vn -0.49268738 0.76613898 -0.41266236 +vn -0.75742371 0.50598331 -0.41266236 +vn -0.50042583 -0.74813340 0.43574122 +vn -0.75675309 -0.48729288 0.43574122 +vn -0.76613898 -0.49268738 -0.41266236 +vn -0.50598331 -0.75742371 -0.41266236 +vn 0.88286469 0.17515570 0.43574122 +vn 0.87967334 -0.19053714 0.43574122 +vn 0.89012465 -0.19335948 -0.41266236 +vn 0.89336367 0.17779521 -0.41266236 +vn -5.2902782e-2 0.36522036 -0.92941669 +vn -0.36347034 5.9341762e-2 -0.92971386 +vn 0.36444441 5.2620553e-2 -0.92973725 +vn 5.9034046e-2 0.36283633 -0.92998107 +vn 5.1916156e-2 -0.36280837 -0.93041647 +vn 0.36105825 -5.8319059e-2 -0.93071791 +vn -0.36330136 -5.2153528e-2 -0.93021080 +vn -5.8549416e-2 -0.36169476 -0.93045627 +vn 0.63499701 -0.26954024 -0.72396606 +vn 0.25841696 -0.63960442 -0.72396606 +vn -0.26954024 -0.63499701 -0.72396606 +vn -0.63960442 -0.25841696 -0.72396606 +vn -0.63499701 0.26954024 -0.72396606 +vn -0.25841696 0.63960442 -0.72396606 +vn 0.26954024 0.63499701 -0.72396606 +vn 0.63960442 0.25841696 -0.72396606 +vn -0.55411236 0.56610158 -0.61031836 +vn 0.56447181 0.55289332 -0.61292786 +vn 0.54914411 -0.56112721 -0.61933594 +vn -0.56211242 -0.55054380 -0.61719620 +vn 0.80402447 -0.34128814 0.48689532 +vn 0.32720400 -0.80985832 0.48689532 +vn -0.34128814 -0.80402447 0.48689532 +vn -0.80985832 -0.32720400 0.48689532 +vn -0.80402447 0.34128814 0.48689532 +vn -0.32720400 0.80985832 0.48689532 +vn 0.34128814 0.80402447 0.48689532 +vn 0.80985832 0.32720400 0.48689532 +vn 0.88840879 -0.37710716 0.26176327 +vn 0.36154485 -0.89485491 0.26176327 +vn -0.37710716 -0.88840879 0.26176327 +vn -0.89485491 -0.36154485 0.26176327 +vn -0.88840879 0.37710716 0.26176327 +vn -0.36154485 0.89485491 0.26176327 +vn 0.37710716 0.88840879 0.26176327 +vn 0.89485491 0.36154485 0.26176327 +vn 0.76412259 -0.32435080 -0.55759593 +vn 0.31096562 -0.76966691 -0.55759593 +vn -0.32435080 -0.76412259 -0.55759593 +vn -0.76966691 -0.31096562 -0.55759593 +vn -0.76412259 0.32435080 -0.55759593 +vn -0.31096562 0.76966691 -0.55759593 +vn 0.32435080 0.76412259 -0.55759593 +vn 0.76966691 0.31096562 -0.55759593 +vn 0.61621720 -0.62706718 0.47651140 +vn -7.6720933e-3 -0.87913482 0.47651140 +vn -0.62706718 -0.61621720 0.47651140 +vn -0.87913482 7.6720933e-3 0.47651140 +vn -0.61621720 0.62706718 0.47651140 +vn 7.6720933e-3 0.87913482 0.47651140 +vn 0.62706718 0.61621720 0.47651140 +vn 0.87913482 -7.6720933e-3 0.47651140 +vn 0.67661476 -0.68852818 0.26100080 +vn 0.68205517 -0.28951524 0.67155169 +vn -8.4240614e-3 -0.96530183 0.26100080 +vn 0.27756765 -0.68700403 0.67155169 +vn -0.68852818 -0.67661476 0.26100080 +vn -0.28951524 -0.68205517 0.67155169 +vn -0.96530183 8.4240614e-3 0.26100080 +vn -0.68700403 -0.27756765 0.67155169 +vn -0.67661476 0.68852818 0.26100080 +vn -0.68205517 0.28951524 0.67155169 +vn 8.4240614e-3 0.96530183 0.26100080 +vn -0.27756765 0.68700403 0.67155169 +vn 0.68852818 0.67661476 0.26100080 +vn 0.28951524 0.68205517 0.67155169 +vn 0.96530183 -8.4240614e-3 0.26100080 +vn 0.68700403 0.27756765 0.67155169 +vn 0.51990509 -0.52905927 -0.67066757 +vn 0.91236306 -0.38727514 -0.13270877 +vn -6.4729780e-3 -0.74172981 -0.67066757 +vn 0.37129323 -0.91898298 -0.13270877 +vn -0.52905927 -0.51990509 -0.67066757 +vn -0.38727514 -0.91236306 -0.13270877 +vn -0.74172981 6.4729780e-3 -0.67066757 +vn -0.91898298 -0.37129323 -0.13270877 +vn -0.51990509 0.52905927 -0.67066757 +vn -0.91236306 0.38727514 -0.13270877 +vn 6.4729780e-3 0.74172981 -0.67066757 +vn -0.37129323 0.91898298 -0.13270877 +vn 0.52905927 0.51990509 -0.67066757 +vn 0.38727514 0.91236306 -0.13270877 +vn 0.74172981 -6.4729780e-3 -0.67066757 +vn 0.91898298 0.37129323 -0.13270877 +vn -4.2269409e-17 4.6112082e-17 -1.00000000 +vn 0.52007670 -0.52923389 0.67039668 +vn -6.4751146e-3 -0.74197464 0.67039668 +vn -0.52923389 -0.52007670 0.67039668 +vn -0.74197464 6.4751146e-3 0.67039668 +vn -0.52007670 0.52923389 0.67039668 +vn 6.4751146e-3 0.74197464 0.67039668 +vn 0.52923389 0.52007670 0.67039668 +vn 0.74197464 -6.4751146e-3 0.67039668 +vn 0.69489281 -0.70712806 -0.13074357 +vn -8.6516288e-3 -0.99137847 -0.13074357 +vn -0.70712806 -0.69489281 -0.13074357 +vn -0.99137847 8.6516288e-3 -0.13074357 +vn -0.69489281 0.70712806 -0.13074357 +vn 8.6516288e-3 0.99137847 -0.13074357 +vn 0.70712806 0.69489281 -0.13074357 +vn 0.99137847 -8.6516288e-3 -0.13074357 +vn 0.62582319 -0.63684231 -0.45030791 +vn -7.7916908e-3 -0.89283933 -0.45030791 +vn -0.63684231 -0.62582319 -0.45030791 +vn -0.89283933 7.7916908e-3 -0.45030791 +vn -0.62582319 0.63684231 -0.45030791 +vn 7.7916908e-3 0.89283933 -0.45030791 +vn 0.63684231 0.62582319 -0.45030791 +vn 0.89283933 -7.7916908e-3 -0.45030791 +g w_emp_w_emp +usemtl w_emp +s 1 +f 1/138/1 44/145/44 43/160/43 2/156/2 +f 1/138/1 51/129/51 50/103/50 8/94/8 +f 1/269/1 66/257/66 51/264/51 +f 2/156/2 28/165/28 27/164/27 3/155/3 +f 2/225/2 66/205/66 1/181/1 +f 3/155/3 40/159/40 39/144/39 4/137/4 +f 3/155/3 53/146/53 52/147/52 2/156/2 +f 3/267/3 67/256/67 53/265/53 +f 4/137/4 24/128/24 23/100/23 5/93/5 +f 4/227/4 67/202/67 3/183/3 +f 5/93/5 16/89/16 15/61/15 6/83/6 +f 5/93/5 55/101/55 54/126/54 4/137/4 +f 5/266/5 68/258/68 55/262/55 +f 6/83/6 48/57/48 47/58/47 7/84/7 +f 6/228/6 68/203/68 5/184/5 +f 7/84/7 12/62/12 11/90/11 8/94/8 +f 7/84/7 49/88/49 56/87/56 6/83/6 +f 7/268/7 65/255/65 49/263/49 +f 8/94/8 20/102/20 19/130/19 1/138/1 +f 8/226/8 65/204/65 7/182/7 +f 9/157/9 32/151/32 31/132/31 10/142/10 +f 10/18/10 11/40/11 12/39/12 9/14/9 +f 10/18/10 17/15/17 20/44/20 11/40/11 +f 11/90/11 20/102/20 8/94/8 +f 12/39/12 47/42/47 46/9/46 9/14/9 +f 13/143/13 34/133/34 33/153/33 14/158/14 +f 14/5/14 15/51/15 16/54/16 13/8/13 +f 14/5/14 45/6/45 48/49/48 15/51/15 +f 15/61/15 48/57/48 6/83/6 +f 16/54/16 23/53/23 22/10/22 13/8/13 +f 17/120/17 31/132/31 30/91/30 18/98/18 +f 18/13/18 19/43/19 20/44/20 17/15/17 +f 18/13/18 41/7/41 44/41/44 19/43/19 +f 19/130/19 44/145/44 1/138/1 +f 21/99/21 35/92/35 34/133/34 22/121/22 +f 22/10/22 23/53/23 24/52/24 21/11/21 +f 22/121/22 34/133/34 13/143/13 +f 23/100/23 16/89/16 5/93/5 +f 24/52/24 39/50/39 38/12/38 21/11/21 +f 25/55/25 29/81/29 36/82/36 26/56/26 +f 26/1/26 27/37/27 28/38/28 25/2/25 +f 26/17/26 37/16/37 40/46/40 27/48/27 +f 27/164/27 40/159/40 3/155/3 +f 28/47/28 43/45/43 42/4/42 25/3/25 +f 29/81/29 42/59/42 41/85/41 30/91/30 +f 30/91/30 31/132/31 32/151/32 33/153/33 34/133/34 35/92/35 36/82/36 29/81/29 +f 30/91/30 41/85/41 18/98/18 +f 31/132/31 17/120/17 10/142/10 +f 32/151/32 46/162/46 45/163/45 33/153/33 +f 33/153/33 45/163/45 14/158/14 +f 35/92/35 38/86/38 37/60/37 36/82/36 +f 36/82/36 37/60/37 26/56/26 +f 38/86/38 35/92/35 21/99/21 +f 38/12/38 39/50/39 40/46/40 37/16/37 +f 39/144/39 24/128/24 4/137/4 +f 42/59/42 29/81/29 25/55/25 +f 42/4/42 43/45/43 44/41/44 41/7/41 +f 43/160/43 28/165/28 2/156/2 +f 46/162/46 32/151/32 9/157/9 +f 46/9/46 47/42/47 48/49/48 45/6/45 +f 47/58/47 12/62/12 7/84/7 +f 49/88/49 57/97/57 157/96/157 64/95/64 56/87/56 +f 49/263/49 65/255/65 50/247/50 +f 50/103/50 58/107/58 150/105/150 57/97/57 49/88/49 +f 50/247/50 65/255/65 8/235/8 +f 51/129/51 59/117/59 151/113/151 58/107/58 50/103/50 +f 51/264/51 66/257/66 52/248/52 +f 52/147/52 60/136/60 152/125/152 59/117/59 51/129/51 +f 52/248/52 66/257/66 2/236/2 +f 53/146/53 61/134/61 153/135/153 60/136/60 52/147/52 +f 53/265/53 67/256/67 54/249/54 +f 54/126/54 62/116/62 154/124/154 61/134/61 53/146/53 +f 54/249/54 67/256/67 4/237/4 +f 55/101/55 63/106/63 155/112/155 62/116/62 54/126/54 +f 55/262/55 68/258/68 56/246/56 +f 56/87/56 64/95/64 156/104/156 63/106/63 55/101/55 +f 56/246/56 68/258/68 6/234/6 +f 57/71/57 69/27/69 100/26/100 157/70/157 +f 57/71/57 150/72/150 93/28/93 69/27/69 +f 58/73/58 70/29/70 93/28/93 150/72/150 +f 58/73/58 151/74/151 94/30/94 70/29/70 +f 59/75/59 71/31/71 94/30/94 151/74/151 +f 59/75/59 152/76/152 95/32/95 71/31/71 +f 60/78/60 72/34/72 95/32/95 152/76/152 +f 60/78/60 153/77/153 96/33/96 72/34/72 +f 61/80/61 73/36/73 96/35/96 153/79/153 +f 61/63/61 154/64/154 97/20/97 73/19/73 +f 62/65/62 74/21/74 97/20/97 154/64/154 +f 62/65/62 155/66/155 98/22/98 74/21/74 +f 63/67/63 75/23/75 98/22/98 155/66/155 +f 63/67/63 156/68/156 99/24/99 75/23/75 +f 64/69/64 76/25/76 99/24/99 156/68/156 +f 64/69/64 157/70/157 100/26/100 76/25/76 +f 69/210/69 93/216/93 134/215/134 102/209/102 +f 69/210/69 102/209/102 141/198/141 100/196/100 +f 70/223/70 94/238/94 135/231/135 104/220/104 +f 70/223/70 104/220/104 134/215/134 93/216/93 +f 71/242/71 95/250/95 136/245/136 106/241/106 +f 71/242/71 106/241/106 135/231/135 94/238/94 +f 72/254/72 96/259/96 137/261/137 108/253/108 +f 72/254/72 108/253/108 136/245/136 95/250/95 +f 73/150/73 97/161/97 138/149/138 110/139/110 +f 73/118/73 110/123/110 137/111/137 96/115/96 +f 74/169/74 98/173/98 139/171/139 112/167/112 +f 74/169/74 112/167/112 138/149/138 97/161/97 +f 75/177/75 99/186/99 140/187/140 114/176/114 +f 75/177/75 114/176/114 139/171/139 98/173/98 +f 76/191/76 100/196/100 141/198/141 116/192/116 +f 76/191/76 116/192/116 140/187/140 99/186/99 +f 77/208/77 101/213/101 142/212/142 118/207/118 +f 77/208/77 102/209/102 134/215/134 101/213/101 +f 77/208/77 118/207/118 149/197/149 115/199/115 +f 78/219/78 103/229/103 143/222/143 120/218/120 +f 78/219/78 104/220/104 135/231/135 103/229/103 +f 78/219/78 120/218/120 142/212/142 101/213/101 +f 79/239/79 105/244/105 144/240/144 122/232/122 +f 79/239/79 106/241/106 136/245/136 105/244/105 +f 79/239/79 122/232/122 143/222/143 103/229/103 +f 80/252/80 107/260/107 145/251/145 124/243/124 +f 80/252/80 108/253/108 137/261/137 107/260/107 +f 80/252/80 124/243/124 144/240/144 105/244/105 +f 81/131/81 109/148/109 146/154/146 126/141/126 +f 81/131/81 110/139/110 138/149/138 109/148/109 +f 81/127/81 126/122/126 145/108/145 107/110/107 +f 82/166/82 111/172/111 147/175/147 128/168/128 +f 82/166/82 112/167/112 139/171/139 111/172/111 +f 82/166/82 128/168/128 146/154/146 109/148/109 +f 83/178/83 113/188/113 148/189/148 130/180/130 +f 83/178/83 114/176/114 140/187/140 113/188/113 +f 83/178/83 130/180/130 147/175/147 111/172/111 +f 84/193/84 115/199/115 149/197/149 132/194/132 +f 84/193/84 116/192/116 141/198/141 115/199/115 +f 84/193/84 132/194/132 148/189/148 113/188/113 +f 85/206/85 117/211/117 133/201/133 131/200/131 +f 85/206/85 118/207/118 142/212/142 117/211/117 +f 86/214/86 119/217/119 133/201/133 117/211/117 +f 86/214/86 120/218/120 143/222/143 119/217/119 +f 87/221/87 121/224/121 133/201/133 119/217/119 +f 87/221/87 122/232/122 144/240/144 121/224/121 +f 88/233/88 123/230/123 133/201/133 121/224/121 +f 88/233/88 124/243/124 145/251/145 123/230/123 +f 89/119/89 125/140/125 133/114/133 123/109/123 +f 89/152/89 126/141/126 146/154/146 125/170/125 +f 90/174/90 127/179/127 133/201/133 125/170/125 +f 90/174/90 128/168/128 147/175/147 127/179/127 +f 91/185/91 129/190/129 133/201/133 127/179/127 +f 91/185/91 130/180/130 148/189/148 129/190/129 +f 92/195/92 131/200/131 133/201/133 129/190/129 +f 92/195/92 132/194/132 149/197/149 131/200/131 +f 101/213/101 134/215/134 104/220/104 78/219/78 +f 103/229/103 135/231/135 106/241/106 79/239/79 +f 105/244/105 136/245/136 108/253/108 80/252/80 +f 107/110/107 137/111/137 110/123/110 81/127/81 +f 109/148/109 138/149/138 112/167/112 82/166/82 +f 111/172/111 139/171/139 114/176/114 83/178/83 +f 113/188/113 140/187/140 116/192/116 84/193/84 +f 115/199/115 141/198/141 102/209/102 77/208/77 +f 117/211/117 142/212/142 120/218/120 86/214/86 +f 119/217/119 143/222/143 122/232/122 87/221/87 +f 121/224/121 144/240/144 124/243/124 88/233/88 +f 123/109/123 145/108/145 126/122/126 89/119/89 +f 125/170/125 146/154/146 128/168/128 90/174/90 +f 127/179/127 147/175/147 130/180/130 91/185/91 +f 129/190/129 148/189/148 132/194/132 92/195/92 +f 131/200/131 149/197/149 118/207/118 85/206/85 diff --git a/res/models/playership/weapons/w_emp.png b/res/models/playership/weapons/w_emp.png new file mode 100644 index 0000000..91babfa Binary files /dev/null and b/res/models/playership/weapons/w_emp.png differ diff --git a/res/models/playership/weapons/w_flame.mtl b/res/models/playership/weapons/w_flame.mtl new file mode 100644 index 0000000..1ed9277 --- /dev/null +++ b/res/models/playership/weapons/w_flame.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl w_flame +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd w_flame.png + diff --git a/res/models/playership/weapons/w_flame.obj b/res/models/playership/weapons/w_flame.obj new file mode 100644 index 0000000..8047ce0 --- /dev/null +++ b/res/models/playership/weapons/w_flame.obj @@ -0,0 +1,599 @@ +# Exported from Wings 3D 1.4.1 +mtllib w_flame.mtl +o w_flame +#120 vertices, 122 faces +v -0.60257433 0.43157433 2.00705446 +v -0.60257433 -0.43157433 2.00705446 +v 0.60257433 -0.43157433 2.00705446 +v 0.60257433 0.43157433 2.00705446 +v -0.67100000 -0.43157433 1.93862878 +v -0.67100000 0.43157433 1.93862878 +v -0.67100000 0.43157433 -0.47451987 +v -0.67100000 -0.43157433 -0.47451987 +v -0.60257433 0.50000000 1.93862878 +v 0.60257433 0.50000000 1.93862878 +v 0.60257433 0.50000000 -0.47451987 +v -0.60257433 0.50000000 -0.47451987 +v -0.60257433 -0.43157433 -0.54294554 +v -0.60257433 0.43157433 -0.54294554 +v 0.60257433 0.43157433 -0.54294554 +v 0.60257433 -0.43157433 -0.54294554 +v 0.67100000 0.43157433 1.93862878 +v 0.67100000 -0.43157433 1.93862878 +v 0.67100000 -0.43157433 -0.47451987 +v 0.67100000 0.43157433 -0.47451987 +v 0.60257433 -0.50000000 1.93862878 +v -0.60257433 -0.50000000 1.93862878 +v -0.60257433 -0.50000000 -0.47451987 +v 0.60257433 -0.50000000 -0.47451987 +v -0.33918566 -8.6331262e-2 -0.54294554 +v -0.24435790 0.25057777 -0.54294554 +v 9.4827765e-2 0.33690903 -0.54294554 +v 0.33918566 8.6331262e-2 -0.54294554 +v 0.24435790 -0.25057777 -0.54294554 +v -9.4827765e-2 -0.33690903 -0.54294554 +v -0.33345346 9.3855147e-2 -0.54294554 +v -0.24800767 -0.24185160 -0.54294554 +v -0.33918566 -8.6331262e-2 -1.41919499 +v -8.5445789e-2 0.33570674 -0.54294554 +v -0.24435790 0.25057777 -1.41919499 +v 0.24800767 0.24185160 -0.54294554 +v 9.4827765e-2 0.33690903 -1.41919499 +v 0.33345346 -9.3855147e-2 -0.54294554 +v 0.33918566 8.6331262e-2 -1.41919499 +v 8.5445789e-2 -0.33570674 -0.54294554 +v 0.24435790 -0.25057777 -1.41919499 +v -9.4827765e-2 -0.33690903 -1.41919499 +v -0.24800767 -0.24185160 -1.41919499 +v 8.5445789e-2 -0.33570674 -1.41919499 +v 0.33345346 -9.3855147e-2 -1.41919499 +v 0.24800767 0.24185160 -1.41919499 +v -8.5445789e-2 0.33570674 -1.41919499 +v -0.33345346 9.3855147e-2 -1.41919499 +v -0.32104593 -0.31307689 -1.41919499 +v -0.43907584 -0.11175582 -1.41919499 +v -0.43165551 0.12149549 -1.41919499 +v -0.31632130 0.32437292 -1.41919499 +v -0.11060957 0.43457238 -1.41919499 +v 0.12275454 0.43612874 -1.41919499 +v 0.32104593 0.31307689 -1.41919499 +v 0.43907584 0.11175582 -1.41919499 +v 0.43165551 -0.12149549 -1.41919499 +v 0.31632130 -0.32437292 -1.41919499 +v 0.11060957 -0.43457238 -1.41919499 +v -0.12275454 -0.43612874 -1.41919499 +v -0.32104593 -0.31307689 -1.97606051 +v -0.43907584 -0.11175582 -1.97606051 +v -0.43165551 0.12149549 -1.97606051 +v -0.31632130 0.32437292 -1.97606051 +v -0.11060957 0.43457238 -1.97606051 +v 0.12275454 0.43612874 -1.97606051 +v 0.32104593 0.31307689 -1.97606051 +v 0.43907584 0.11175582 -1.97606051 +v 0.43165551 -0.12149549 -1.97606051 +v 0.31632130 -0.32437292 -1.97606051 +v 0.11060957 -0.43457238 -1.97606051 +v -0.12275454 -0.43612874 -1.97606051 +v -0.22858470 -0.22291075 -1.97806051 +v -0.31262200 -7.9570143e-2 -1.97806051 +v -0.30733872 8.6504787e-2 -1.97806051 +v -0.22522076 0.23095352 -1.97806051 +v -7.8754017e-2 0.30941553 -1.97806051 +v 8.7401234e-2 0.31052366 -1.97806051 +v 0.22858470 0.22291075 -1.97806051 +v 0.31262200 7.9570143e-2 -1.97806051 +v 0.30733872 -8.6504787e-2 -1.97806051 +v 0.22522076 -0.23095352 -1.97806051 +v 7.8754017e-2 -0.30941553 -1.97806051 +v -8.7401234e-2 -0.31052366 -1.97806051 +v -0.22858470 -0.22291075 -1.72972859 +v -0.31262200 -7.9570143e-2 -1.72972859 +v -0.30733872 8.6504787e-2 -1.72972859 +v -0.22522076 0.23095352 -1.72972859 +v -7.8754017e-2 0.30941553 -1.72972859 +v 8.7401234e-2 0.31052366 -1.72972859 +v 0.22858470 0.22291075 -1.72972859 +v 0.31262200 7.9570143e-2 -1.72972859 +v 0.30733872 -8.6504787e-2 -1.72972859 +v 0.22522076 -0.23095352 -1.72972859 +v 7.8754017e-2 -0.30941553 -1.72972859 +v -8.7401234e-2 -0.31052366 -1.72972859 +v 0.20085811 0.43157433 -0.54294554 +v -0.20085811 0.43157433 -0.54294554 +v 0.60257433 -0.14385811 -0.54294554 +v 0.60257433 0.14385811 -0.54294554 +v -0.20085811 -0.43157433 -0.54294554 +v 0.20085811 -0.43157433 -0.54294554 +v -0.60257433 0.14385811 -0.54294554 +v -0.60257433 -0.14385811 -0.54294554 +v -0.78507000 -0.50494196 0.12876730 +v -0.70501196 0.58500000 0.12876730 +v 0.78507000 0.50494196 0.12876730 +v 0.70501196 -0.58500000 0.12876730 +v -0.70501196 -0.58500000 0.12876730 +v 0.78507000 -0.50494196 0.12876730 +v 0.70501196 0.58500000 0.12876730 +v -0.78507000 0.50494196 0.12876730 +v -0.78507000 0.50494196 1.33534162 +v 0.70501196 0.58500000 1.33534162 +v 0.78507000 -0.50494196 1.33534162 +v -0.70501196 -0.58500000 1.33534162 +v 0.70501196 -0.58500000 1.33534162 +v 0.78507000 0.50494196 1.33534162 +v -0.70501196 0.58500000 1.33534162 +v -0.78507000 -0.50494196 1.33534162 +vt 2.5794736e-2 3.4840544e-2 +vt 2.5794736e-2 0.14537639 +vt 2.6259011e-2 0.97750144 +vt 2.6259011e-2 0.80356901 +vt 4.5485201e-2 0.71990468 +vt 4.5485201e-2 0.76919769 +vt 6.2043472e-2 0.80356901 +vt 6.2043472e-2 0.97750144 +vt 7.2117720e-2 3.4840544e-2 +vt 7.2117720e-2 0.14537639 +vt 7.2385102e-2 0.57882259 +vt 7.3858012e-2 0.62512215 +vt 7.8467166e-2 0.71990468 +vt 7.8467166e-2 0.76919769 +vt 9.2212950e-2 0.58386928 +vt 9.3350772e-2 0.61963564 +vt 9.5813623e-2 0.53886107 +vt 9.6028731e-2 0.34283346 +vt 9.6751446e-2 0.66539261 +vt 9.7077443e-2 0.30986818 +vt 9.7827933e-2 0.80356901 +vt 9.7827933e-2 0.97750144 +vt 0.11031146 0.55299904 +vt 0.11103593 0.65074453 +vt 0.11144913 0.71990468 +vt 0.11144913 0.76919769 +vt 0.11270984 0.37128607 +vt 0.11337757 0.28119561 +vt 0.11844071 3.4840544e-2 +vt 0.11844071 0.14537639 +vt 0.13361239 0.80356901 +vt 0.13361239 0.97750144 +vt 0.13517376 0.51443571 +vt 0.13758450 0.68726681 +vt 0.14071713 0.53413047 +vt 0.14073426 0.38867692 +vt 0.14245070 0.26562118 +vt 0.14257942 0.66764233 +vt 0.14443110 0.71990468 +vt 0.14443110 0.76919769 +vt 0.16476369 3.4840544e-2 +vt 0.16476369 0.14537639 +vt 0.16939685 0.80356901 +vt 0.16939685 0.97750144 +vt 0.17371549 0.38845696 +vt 0.17543193 0.26540122 +vt 0.17650080 0.53436912 +vt 0.17741306 0.71990468 +vt 0.17741306 0.76919769 +vt 0.17836309 0.66788098 +vt 0.18149572 0.51474464 +vt 0.18390645 0.68757574 +vt 0.20278862 0.37288253 +vt 0.20345635 0.28279207 +vt 0.20518132 0.80356901 +vt 0.20518132 0.97750144 +vt 0.20804429 0.55126692 +vt 0.20876876 0.64901242 +vt 0.21039503 0.71990468 +vt 0.21039503 0.76919769 +vt 0.21108667 3.4840544e-2 +vt 0.21108667 0.14537639 +vt 0.21908875 0.34420997 +vt 0.22013746 0.31124468 +vt 0.22232877 0.53661885 +vt 0.22326659 0.66315039 +vt 0.22572945 0.58237581 +vt 0.22686727 0.61814218 +vt 0.24096578 0.80356901 +vt 0.24096578 0.97750144 +vt 0.24337699 0.71990468 +vt 0.24337699 0.76919769 +vt 0.24522220 0.57688930 +vt 0.24669511 0.62318886 +vt 0.25740966 3.4840544e-2 +vt 0.25740966 0.14537639 +vt 0.26857392 0.62269276 +vt 0.27004687 0.57639216 +vt 0.27635896 0.71990468 +vt 0.27635896 0.76919769 +vt 0.27675024 0.80356901 +vt 0.27675024 0.97750144 +vt 0.29200275 0.66265531 +vt 0.29294104 0.53612093 +vt 0.29367760 0.61630332 +vt 0.29472632 0.58333861 +vt 0.30373264 3.4840544e-2 +vt 0.30373264 0.14537639 +vt 0.30934092 0.71990468 +vt 0.30934092 0.76919769 +vt 0.31035828 0.64475551 +vt 0.31102630 0.55466663 +vt 0.31253470 0.80356901 +vt 0.31253470 0.97750144 +vt 0.33136377 0.68708122 +vt 0.33377501 0.51424623 +vt 0.33838219 0.66214608 +vt 0.34009893 0.53909249 +vt 0.34232289 0.71990468 +vt 0.34232289 0.76919769 +vt 0.34831916 0.80356901 +vt 0.34831916 0.97750144 +vt 0.35005563 3.4840544e-2 +vt 0.35005563 0.14537639 +vt 0.37136285 0.66192628 +vt 0.37307959 0.53887269 +vt 0.37530485 0.71990468 +vt 0.37530485 0.76919769 +vt 0.37768677 0.68677254 +vt 0.38009801 0.51393755 +vt 0.38410362 0.80356901 +vt 0.38410362 0.97750144 +vt 0.39538912 0.39327476 +vt 0.39589023 0.22004119 +vt 0.39637861 3.4840544e-2 +vt 0.39637861 0.14537639 +vt 0.40043548 0.64635214 +vt 0.40110350 0.55626326 +vt 0.40828682 0.71990468 +vt 0.40828682 0.76919769 +vt 0.41378159 0.41134899 +vt 0.41421950 0.20200433 +vt 0.41451210 0.39227284 +vt 0.41492179 0.22107547 +vt 0.41673546 0.61768016 +vt 0.41778418 0.58471545 +vt 0.41852074 0.66489784 +vt 0.41945903 0.53836346 +vt 0.41988808 0.80356901 +vt 0.41988808 0.97750144 +vt 0.44126878 0.71990468 +vt 0.44126878 0.76919769 +vt 0.44141491 0.62462661 +vt 0.44270160 0.14537639 +vt 0.44270160 3.4840544e-2 +vt 0.44288786 0.57832601 +vt 0.45567254 0.80356901 +vt 0.45567254 0.97750144 +vt 0.48902458 0.14537639 +vt 0.48902458 3.4840544e-2 +vt 0.49980515 0.46732664 +vt 0.49980515 0.74624553 +vt 0.50017091 0.46745155 +vt 0.50017091 0.74637044 +vt 0.50168511 0.80521705 +vt 0.50168511 0.80532795 +vt 0.50168511 0.97654901 +vt 0.50168511 0.97665991 +vt 0.50247547 0.72686433 +vt 0.50247590 0.48667960 +vt 0.50284123 0.72698924 +vt 0.50284167 0.48680451 +vt 0.53534757 0.14537639 +vt 0.53534757 3.4840544e-2 +vt 0.58167055 0.14537639 +vt 0.58167055 3.4840544e-2 +vt 0.62255454 0.44465826 +vt 0.62263885 0.76880590 +vt 0.62292031 0.44478317 +vt 0.62300461 0.76893081 +vt 0.62355732 0.79065383 +vt 0.62355732 0.79076473 +vt 0.62355732 0.99111223 +vt 0.62355732 0.99122313 +vt 0.62360866 0.46709251 +vt 0.62367984 0.74636600 +vt 0.62397442 0.46721742 +vt 0.62404561 0.74649092 +vt 0.65369684 0.39242480 +vt 0.65410653 0.22122742 +vt 0.65439913 0.41149594 +vt 0.65483704 0.20215128 +vt 0.67272840 0.39345907 +vt 0.67322951 0.22022550 +vt 0.69556042 0.39339665 +vt 0.69636294 0.21866938 +vt 0.71326111 0.41056216 +vt 0.71393095 0.20162397 +vt 0.71485225 0.39139315 +vt 0.71497431 0.33505536 +vt 0.71524024 0.27712140 +vt 0.71547960 0.22074690 +vt 0.76706635 0.32346211 +vt 0.76845133 0.28754412 +vt 0.78483462 0.35399056 +vt 0.78620396 0.25667878 +vt 0.79406920 0.39136056 +vt 0.79473954 0.22084418 +vt 0.81535816 0.37246334 +vt 0.81772079 0.23992660 +vt 0.85174840 0.37225953 +vt 0.85411102 0.23972279 +vt 0.86254538 0.46698170 +vt 0.86261657 0.74625519 +vt 0.86291115 0.46710661 +vt 0.86298233 0.74638010 +vt 0.86305807 0.79065383 +vt 0.86305807 0.79076473 +vt 0.86305807 0.99111223 +vt 0.86305807 0.99122313 +vt 0.86358638 0.44454180 +vt 0.86367068 0.76868944 +vt 0.86395214 0.44466672 +vt 0.86403645 0.76881436 +vt 0.87472965 0.39134195 +vt 0.87539999 0.22082557 +vt 0.88326522 0.35550735 +vt 0.88463457 0.25819557 +vt 0.90101786 0.32464201 +vt 0.90240284 0.28872402 +vt 0.95398959 0.39143923 +vt 0.95422895 0.33506473 +vt 0.95449487 0.27713077 +vt 0.95461694 0.22079297 +vt 0.95553824 0.41056216 +vt 0.95620807 0.20162397 +vt 0.97310625 0.39351675 +vt 0.97390876 0.21878948 +vt 0.98374932 0.72666810 +vt 0.98374976 0.48648337 +vt 0.98411509 0.72679301 +vt 0.98411552 0.48660828 +vt 0.98493027 0.80521705 +vt 0.98493027 0.80532795 +vt 0.98493027 0.97654901 +vt 0.98493027 0.97665991 +vt 0.98642008 0.46710217 +vt 0.98642008 0.74602106 +vt 0.98678584 0.46722708 +vt 0.98678584 0.74614597 +vn -0.36700100 0.36700100 0.85476344 +vn -0.36700100 -0.36700100 0.85476344 +vn 0.36700100 -0.36700100 0.85476344 +vn 0.36700100 0.36700100 0.85476344 +vn -0.81425113 -0.34907712 0.46383215 +vn -0.81425113 0.34907712 0.46383215 +vn -0.80433598 0.27829351 -0.52497272 +vn -0.80433598 -0.27829351 -0.52497272 +vn -0.35052247 0.81973176 0.45296119 +vn 0.35052247 0.81973176 0.45296119 +vn 0.27939412 0.80919824 -0.51685310 +vn -0.27939412 0.80919824 -0.51685310 +vn -0.29289006 -0.29289006 -0.91018175 +vn -0.29289006 0.29289006 -0.91018175 +vn 0.29289006 0.29289006 -0.91018175 +vn 0.29289006 -0.29289006 -0.91018175 +vn 0.81425113 0.34907712 0.46383215 +vn 0.81425113 -0.34907712 0.46383215 +vn 0.80433598 -0.27829351 -0.52497272 +vn 0.80433598 0.27829351 -0.52497272 +vn 0.35052247 -0.81973176 0.45296119 +vn -0.35052247 -0.81973176 0.45296119 +vn -0.27939412 -0.80919824 -0.51685310 +vn 0.27939412 -0.80919824 -0.51685310 +vn -0.67141349 -0.17089158 -0.72111026 +vn -0.48370319 0.49601535 -0.72111026 +vn 0.18771029 0.66690692 -0.72111026 +vn 0.67141349 0.17089158 -0.72111026 +vn 0.48370319 -0.49601535 -0.72111026 +vn -0.18771029 -0.66690692 -0.72111026 +vn -0.67047403 0.18871431 -0.71753152 +vn -0.49866840 -0.48629039 -0.71753152 +vn -0.67141349 -0.17089158 0.72111026 +vn -0.17180563 0.67500470 -0.71753152 +vn -0.48370319 0.49601535 0.72111026 +vn 0.49866840 0.48629039 -0.71753152 +vn 0.18771029 0.66690692 0.72111026 +vn 0.67047403 -0.18871431 -0.71753152 +vn 0.67141349 0.17089158 0.72111026 +vn 0.17180563 -0.67500470 -0.71753152 +vn 0.48370319 -0.49601535 0.72111026 +vn -0.18771029 -0.66690692 0.72111026 +vn -0.49866840 -0.48629039 0.71753152 +vn 0.17180563 -0.67500470 0.71753152 +vn 0.67047403 -0.18871431 0.71753152 +vn 0.49866840 0.48629039 0.71753152 +vn -0.17180563 0.67500470 0.71753152 +vn -0.67047403 0.18871431 0.71753152 +vn -0.49866840 -0.48629039 0.71753152 +vn -0.67141349 -0.17089158 0.72111026 +vn -0.67047403 0.18871431 0.71753152 +vn -0.48370319 0.49601535 0.72111026 +vn -0.17180563 0.67500470 0.71753152 +vn 0.18771029 0.66690692 0.72111026 +vn 0.49866840 0.48629039 0.71753152 +vn 0.67141349 0.17089158 0.72111026 +vn 0.67047403 -0.18871431 0.71753152 +vn 0.48370319 -0.49601535 0.72111026 +vn 0.17180563 -0.67500470 0.71753152 +vn -0.18771029 -0.66690692 0.72111026 +vn -0.50274896 -0.49026966 -0.71195446 +vn -0.67696323 -0.17230413 -0.71556417 +vn -0.67596046 0.19025854 -0.71195446 +vn -0.48770136 0.50011529 -0.71556417 +vn -0.17321150 0.68052820 -0.71195446 +vn 0.18926186 0.67241941 -0.71556417 +vn 0.50274896 0.49026966 -0.71195446 +vn 0.67696323 0.17230413 -0.71556417 +vn 0.67596046 -0.19025854 -0.71195446 +vn 0.48770136 -0.50011529 -0.71556417 +vn 0.17321150 -0.68052820 -0.71195446 +vn -0.18926186 -0.67241941 -0.71556417 +vn 0.49455809 0.48228210 -0.72306035 +vn 0.66582466 0.16946908 -0.72660702 +vn 0.66494760 -0.18715881 -0.72306035 +vn 0.47967686 -0.49188653 -0.72660702 +vn 0.17038951 -0.66944092 -0.72306035 +vn -0.18614780 -0.66135561 -0.72660702 +vn -0.49455809 -0.48228210 -0.72306035 +vn -0.66582466 -0.16946908 -0.72660702 +vn -0.66494760 0.18715881 -0.72306035 +vn -0.47967686 0.49188653 -0.72660702 +vn -0.17038951 0.66944092 -0.72306035 +vn 0.18614780 0.66135561 -0.72660702 +vn 0.63646817 0.62066968 -0.45790547 +vn 0.85965688 0.21880425 -0.46164354 +vn 0.85574979 -0.24086276 -0.45790547 +vn 0.61931847 -0.63508257 -0.46164354 +vn 0.21928162 -0.86153244 -0.45790547 +vn -0.24033840 -0.85388682 -0.46164354 +vn -0.63646817 -0.62066968 -0.45790547 +vn -0.85965688 -0.21880425 -0.46164354 +vn -0.85574979 0.24086276 -0.45790547 +vn -0.61931847 0.63508257 -0.46164354 +vn -0.21928162 0.86153244 -0.45790547 +vn 0.24033840 0.85388682 -0.46164354 +vn 0.0000000e+0 0.38268343 -0.92387953 +vn 0.0000000e+0 0.38268343 -0.92387953 +vn 0.38268343 0.0000000e+0 -0.92387953 +vn 0.38268343 0.0000000e+0 -0.92387953 +vn 0.0000000e+0 -0.38268343 -0.92387953 +vn 0.0000000e+0 -0.38268343 -0.92387953 +vn -0.38268343 0.0000000e+0 -0.92387953 +vn -0.38268343 0.0000000e+0 -0.92387953 +vn -0.91862880 -0.37984634 -0.10880204 +vn -0.37961188 0.92013399 -9.6167889e-2 +vn 0.91862880 0.37984634 -0.10880204 +vn 0.37961188 -0.92013399 -9.6167889e-2 +vn -0.37961188 -0.92013399 -9.6167889e-2 +vn 0.91862880 -0.37984634 -0.10880204 +vn 0.37961188 0.92013399 -9.6167889e-2 +vn -0.91862880 0.37984634 -0.10880204 +vn -0.91862880 0.37984634 0.10880204 +vn 0.37961188 0.92013399 9.6167889e-2 +vn 0.91862880 -0.37984634 0.10880204 +vn -0.37961188 -0.92013399 9.6167889e-2 +vn 0.37961188 -0.92013399 9.6167889e-2 +vn 0.91862880 0.37984634 0.10880204 +vn -0.37961188 0.92013399 9.6167889e-2 +vn -0.91862880 -0.37984634 0.10880204 +g w_flame_w_flame +usemtl w_flame +s 1 +f 1/123/1 6/113/6 5/114/5 2/124/2 +f 2/124/2 3/170/3 4/169/4 1/123/1 +f 2/124/2 5/114/5 22/122/22 +f 2/124/2 22/122/22 21/172/21 3/170/3 +f 3/170/3 18/174/18 17/173/17 4/169/4 +f 4/169/4 10/171/10 9/121/9 1/123/1 +f 6/226/6 113/200/113 120/198/120 5/224/5 +f 7/148/7 8/146/8 105/162/105 112/164/112 +f 7/217/7 103/212/103 104/213/104 8/218/8 +f 8/218/8 104/213/104 13/214/13 +f 9/121/9 6/113/6 1/123/1 +f 10/219/10 114/194/114 119/193/119 9/220/9 +f 11/149/11 12/150/12 106/165/106 111/166/111 +f 11/177/11 97/187/97 98/205/98 12/215/12 +f 12/215/12 14/211/14 7/217/7 +f 12/215/12 98/205/98 14/211/14 +f 13/214/13 23/216/23 8/218/8 +f 13/214/13 32/208/32 30/192/30 101/206/101 +f 14/211/14 26/207/26 31/209/31 103/212/103 +f 15/179/15 36/185/36 27/189/27 97/187/97 +f 16/182/16 29/186/29 38/184/38 99/181/99 +f 17/173/17 10/171/10 4/169/4 +f 18/223/18 115/197/115 118/199/118 17/225/17 +f 19/145/19 20/147/20 107/163/107 110/161/110 +f 19/176/19 24/178/24 16/182/16 +f 19/176/19 99/181/99 100/180/100 20/175/20 +f 20/175/20 15/179/15 11/177/11 +f 20/175/20 100/180/100 15/179/15 +f 21/172/21 18/174/18 3/170/3 +f 22/221/22 116/196/116 117/195/117 21/222/21 +f 23/151/23 24/152/24 108/167/108 109/168/109 +f 23/216/23 101/206/101 102/188/102 24/178/24 +f 24/178/24 102/188/102 16/182/16 +f 25/102/25 33/101/33 43/111/43 32/112/32 +f 25/210/25 104/213/104 103/212/103 31/209/31 +f 26/207/26 14/211/14 98/205/98 34/191/34 +f 28/183/28 100/180/100 99/181/99 38/184/38 +f 29/186/29 16/182/16 102/188/102 40/190/40 +f 30/130/30 32/112/32 43/111/43 42/129/42 +f 31/94/31 48/93/48 33/101/33 25/102/25 +f 32/208/32 13/214/13 104/213/104 25/210/25 +f 33/15/33 50/11/50 49/17/49 43/23/43 +f 34/70/34 47/69/47 35/81/35 26/82/26 +f 34/191/34 98/205/98 97/187/97 27/189/27 +f 35/81/35 48/93/48 31/94/31 26/82/26 +f 35/24/35 52/19/52 51/12/51 48/16/48 +f 36/185/36 15/179/15 100/180/100 28/183/28 +f 36/44/36 46/43/46 37/55/37 27/56/27 +f 37/55/37 47/69/47 34/70/34 27/56/27 +f 37/50/37 54/52/54 53/34/53 47/38/47 +f 38/22/38 45/21/45 39/31/39 28/32/28 +f 39/31/39 46/43/46 36/44/36 28/32/28 +f 39/68/39 56/74/56 55/66/55 46/58/46 +f 40/3/40 44/4/44 41/7/41 29/8/29 +f 40/190/40 102/188/102 101/206/101 30/192/30 +f 41/7/41 45/21/45 38/22/38 29/8/29 +f 41/57/41 58/65/58 57/73/57 45/67/45 +f 42/129/42 44/137/44 40/138/40 30/130/30 +f 42/35/42 60/33/60 59/51/59 44/47/44 +f 43/23/43 49/17/49 60/33/60 42/35/42 +f 44/47/44 59/51/59 58/65/58 41/57/41 +f 45/67/45 57/73/57 56/74/56 39/68/39 +f 46/58/46 55/66/55 54/52/54 37/50/37 +f 47/38/47 53/34/53 52/19/52 35/24/35 +f 48/16/48 51/12/51 50/11/50 33/15/33 +f 49/139/49 61/140/61 72/154/72 60/153/60 +f 50/134/50 62/135/62 61/140/61 49/139/49 +f 51/116/51 63/115/63 62/135/62 50/134/50 +f 52/104/52 64/103/64 63/115/63 51/116/51 +f 53/88/53 65/87/65 64/103/64 52/104/52 +f 54/76/54 66/75/66 65/87/65 53/88/53 +f 55/62/55 67/61/67 66/75/66 54/76/54 +f 56/42/56 68/41/68 67/61/67 55/62/55 +f 57/30/57 69/29/69 68/41/68 56/42/56 +f 58/10/58 70/9/70 69/29/69 57/30/57 +f 59/2/59 71/1/71 70/9/70 58/10/58 +f 60/153/60 72/154/72 71/156/71 59/155/59 +f 61/128/61 73/118/73 84/106/84 72/110/72 +f 62/136/62 74/126/74 73/118/73 61/128/61 +f 63/133/63 75/125/75 74/126/74 62/136/62 +f 64/127/64 76/117/76 75/125/75 63/133/63 +f 65/109/65 77/105/77 76/117/76 64/127/64 +f 66/95/66 78/97/78 77/105/77 65/109/65 +f 67/83/67 79/91/79 78/97/78 66/95/66 +f 68/77/68 80/85/80 79/91/79 67/83/67 +f 69/78/69 81/86/81 80/85/80 68/77/68 +f 70/84/70 82/92/82 81/86/81 69/78/69 +f 71/96/71 83/98/83 82/92/82 70/84/70 +f 72/110/72 84/106/84 83/98/83 71/96/71 +f 73/108/73 85/107/85 96/119/96 84/120/84 +f 74/100/74 86/99/86 85/107/85 73/108/73 +f 75/90/75 87/89/87 86/99/86 74/100/74 +f 76/80/76 88/79/88 87/89/87 75/90/75 +f 77/72/77 89/71/89 88/79/88 76/80/76 +f 78/60/78 90/59/90 89/71/89 77/72/77 +f 79/49/79 91/48/91 90/59/90 78/60/78 +f 80/40/80 92/39/92 91/48/91 79/49/79 +f 81/26/81 93/25/93 92/39/92 80/40/80 +f 82/14/82 94/13/94 93/25/93 81/26/81 +f 83/6/83 95/5/95 94/13/94 82/14/82 +f 84/120/84 96/119/96 95/131/95 83/132/83 +f 86/64/86 87/63/87 88/53/88 89/45/89 90/36/90 91/27/91 92/18/92 93/20/93 94/28/94 95/37/95 96/46/96 85/54/85 +f 97/187/97 11/177/11 15/179/15 +f 99/181/99 19/176/19 16/182/16 +f 101/206/101 23/216/23 13/214/13 +f 103/212/103 7/217/7 14/211/14 +f 106/165/106 112/157/112 113/201/113 119/193/119 +f 107/158/107 111/166/111 114/194/114 118/202/118 +f 108/167/108 110/159/110 115/203/115 117/195/117 +f 109/168/109 105/160/105 8/144/8 23/151/23 +f 110/159/110 108/167/108 24/152/24 19/143/19 +f 111/166/111 107/158/107 20/142/20 11/149/11 +f 112/157/112 106/165/106 12/150/12 7/141/7 +f 116/196/116 120/204/120 105/160/105 109/168/109 +f 117/195/117 115/203/115 18/229/18 21/222/21 +f 117/195/117 116/196/116 109/168/109 108/167/108 +f 118/202/118 114/194/114 10/219/10 17/228/17 +f 118/199/118 115/197/115 110/161/110 107/163/107 +f 119/193/119 113/201/113 6/227/6 9/220/9 +f 119/193/119 114/194/114 111/166/111 106/165/106 +f 120/198/120 113/200/113 112/164/112 105/162/105 +f 120/204/120 116/196/116 22/221/22 5/230/5 diff --git a/res/models/playership/weapons/w_flame.png b/res/models/playership/weapons/w_flame.png new file mode 100644 index 0000000..55db34d Binary files /dev/null and b/res/models/playership/weapons/w_flame.png differ diff --git a/res/models/playership/weapons/w_laser.mtl b/res/models/playership/weapons/w_laser.mtl new file mode 100644 index 0000000..6ba3655 --- /dev/null +++ b/res/models/playership/weapons/w_laser.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl w_laser +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd w_laser.png + diff --git a/res/models/playership/weapons/w_laser.obj b/res/models/playership/weapons/w_laser.obj new file mode 100644 index 0000000..0e15828 --- /dev/null +++ b/res/models/playership/weapons/w_laser.obj @@ -0,0 +1,853 @@ +# Exported from Wings 3D 1.4.1 +mtllib w_laser.mtl +o w_laser +#168 vertices, 162 faces +v -0.16015904 -8.9488456e-2 0.35942340 +v -0.15895789 4.8150392e-2 0.35942340 +v -6.0783177e-2 0.14462641 0.35942340 +v 7.6855670e-2 0.14342525 0.35942340 +v 0.17333169 4.5250545e-2 0.35942340 +v 0.17213053 -9.2388303e-2 0.35942340 +v 7.3955823e-2 -0.18886432 0.35942340 +v -6.3683024e-2 -0.18766316 0.35942340 +v 8.8750684e-2 -0.37578288 2.28931823 +v -8.1737811e-2 -0.37429505 2.28931823 +v -8.1737811e-2 -0.37429505 0.40071224 +v 8.8750684e-2 -0.37578288 0.40071224 +v 0.36025025 6.0045405e-2 2.28931823 +v 0.35876242 -0.11044309 2.28931823 +v 0.35876242 -0.11044309 0.40071224 +v 0.36025025 6.0045405e-2 0.40071224 +v -0.18539286 -0.33029609 2.28931823 +v -0.30489438 -0.20869047 2.28931823 +v -0.30489438 -0.20869047 0.40071224 +v -0.18539286 -0.33029609 0.40071224 +v 0.19856551 0.28605818 2.28931823 +v 0.31806702 0.16445256 2.28931823 +v 0.31806702 0.16445256 0.40071224 +v 0.19856551 0.28605818 0.40071224 +v -0.30159082 0.16986023 2.28931823 +v -0.17998519 0.28936175 2.28931823 +v -0.17998519 0.28936175 0.40071224 +v -0.30159082 0.16986023 0.40071224 +v -0.28433824 0.10137119 2.33060707 +v -0.28644913 -0.14051296 2.33060707 +v -0.11690383 -0.31304352 2.33060707 +v 0.12498033 -0.31515441 2.33060707 +v 0.29751088 -0.14560910 2.33060707 +v 0.29962177 9.6275051e-2 2.33060707 +v 0.13007647 0.26880560 2.33060707 +v -0.11180768 0.27091649 2.33060707 +v -7.5578038e-2 0.33154497 2.28931823 +v 9.4910456e-2 0.33005714 2.28931823 +v 9.4910456e-2 0.33005714 0.40071224 +v -7.5578038e-2 0.33154497 0.40071224 +v -0.34707761 -0.10428332 2.28931823 +v -0.34558978 6.6205178e-2 2.28931823 +v -0.34558978 6.6205178e-2 0.40071224 +v -0.34707761 -0.10428332 0.40071224 +v 0.31476346 -0.21409814 2.28931823 +v 0.19315784 -0.33359966 2.28931823 +v 0.19315784 -0.33359966 0.40071224 +v 0.31476346 -0.21409814 0.40071224 +v 5.0218429e-3 -0.20139060 0.35942340 +v -0.17268533 -2.0554476e-2 0.35942340 +v -0.11907162 0.10575150 0.35942340 +v 0.18585797 -2.3683436e-2 0.35942340 +v 0.13445678 0.10353899 0.35942340 +v 0.13224427 -0.14998941 0.35942340 +v -0.12128413 -0.14777690 0.35942340 +v 8.1508029e-3 0.15715269 0.35942340 +v 5.0218429e-3 -0.20139060 -0.79568593 +v -6.3683024e-2 -0.18766316 -0.79568593 +v -0.12128413 -0.14777690 -0.79568593 +v -0.16015904 -8.9488456e-2 -0.79568593 +v -0.17268533 -2.0554476e-2 -0.79568593 +v -0.15895789 4.8150392e-2 -0.79568593 +v -0.11907162 0.10575150 -0.79568593 +v -6.0783177e-2 0.14462641 -0.79568593 +v 8.1508029e-3 0.15715269 -0.79568593 +v 7.6855670e-2 0.14342525 -0.79568593 +v 0.13445678 0.10353899 -0.79568593 +v 0.17333169 4.5250545e-2 -0.79568593 +v 0.18585797 -2.3683436e-2 -0.79568593 +v 0.17213053 -9.2388303e-2 -0.79568593 +v 0.13224427 -0.14998941 -0.79568593 +v 7.3955823e-2 -0.18886432 -0.79568593 +v 5.4974448e-3 -0.14689202 -0.79568593 +v -4.2321143e-2 -0.13733772 -0.79568593 +v -8.2411512e-2 -0.10957688 -0.79568593 +v -0.10946845 -6.9008128e-2 -0.79568593 +v -0.11818674 -2.1030078e-2 -0.79568593 +v -0.10863245 2.6788510e-2 -0.79568593 +v -8.0871606e-2 6.6878880e-2 -0.79568593 +v -4.0302849e-2 9.3935818e-2 -0.79568593 +v 7.6752010e-3 0.10265411 -0.79568593 +v 5.5493789e-2 9.3099813e-2 -0.79568593 +v 9.5584158e-2 6.5338973e-2 -0.79568593 +v 0.12264110 2.4770216e-2 -0.79568593 +v 0.13135939 -2.3207834e-2 -0.79568593 +v 0.12180509 -7.1026421e-2 -0.79568593 +v 9.4044252e-2 -0.11111679 -0.79568593 +v 5.3475495e-2 -0.13817373 -0.79568593 +v 5.4974448e-3 -0.14689202 -1.66687783 +v -4.2321143e-2 -0.13733772 -1.66687783 +v -8.2411512e-2 -0.10957688 -1.66687783 +v -0.10946845 -6.9008128e-2 -1.66687783 +v -0.11818674 -2.1030078e-2 -1.66687783 +v -0.10863245 2.6788510e-2 -1.66687783 +v -8.0871606e-2 6.6878880e-2 -1.66687783 +v -4.0302849e-2 9.3935818e-2 -1.66687783 +v 7.6752010e-3 0.10265411 -1.66687783 +v 5.5493789e-2 9.3099813e-2 -1.66687783 +v 9.5584158e-2 6.5338973e-2 -1.66687783 +v 0.12264110 2.4770216e-2 -1.66687783 +v 0.13135939 -2.3207834e-2 -1.66687783 +v 0.12180509 -7.1026421e-2 -1.66687783 +v 9.4044252e-2 -0.11111679 -1.66687783 +v 5.3475495e-2 -0.13817373 -1.66687783 +v 4.8795992e-3 -0.21769012 -1.66687783 +v -7.0071967e-2 -0.20271457 -1.66687783 +v -0.13291021 -0.15920182 -1.66687783 +v -0.17531966 -9.5613742e-2 -1.66687783 +v -0.18898484 -2.0412232e-2 -1.66687783 +v -0.17400929 5.4539334e-2 -1.66687783 +v -0.13049654 0.11737758 -1.66687783 +v -6.6908464e-2 0.15978702 -1.66687783 +v 8.2930466e-3 0.17345221 -1.66687783 +v 8.3244613e-2 0.15847666 -1.66687783 +v 0.14608285 0.11496390 -1.66687783 +v 0.18849230 5.1375831e-2 -1.66687783 +v 0.20215749 -2.3825679e-2 -1.66687783 +v 0.18718194 -9.8777246e-2 -1.66687783 +v 0.14366918 -0.16161549 -1.66687783 +v 8.0081109e-2 -0.20402494 -1.66687783 +v 4.8795992e-3 -0.21769012 -2.01954199 +v -7.0071967e-2 -0.20271457 -2.01954199 +v -0.13291021 -0.15920182 -2.01954199 +v -0.17531966 -9.5613742e-2 -2.01954199 +v -0.18898484 -2.0412232e-2 -2.01954199 +v -0.17400929 5.4539334e-2 -2.01954199 +v -0.13049654 0.11737758 -2.01954199 +v -6.6908464e-2 0.15978702 -2.01954199 +v 8.2930466e-3 0.17345221 -2.01954199 +v 8.3244613e-2 0.15847666 -2.01954199 +v 0.14608285 0.11496390 -2.01954199 +v 0.18849230 5.1375831e-2 -2.01954199 +v 0.20215749 -2.3825679e-2 -2.01954199 +v 0.18718194 -9.8777246e-2 -2.01954199 +v 0.14366918 -0.16161549 -2.01954199 +v 8.0081109e-2 -0.20402494 -2.01954199 +v 5.3404146e-3 -0.16488591 -2.01954199 +v -4.9374229e-2 -0.15395375 -2.01954199 +v -9.5246146e-2 -0.12218944 -2.01954199 +v -0.12620504 -7.5770150e-2 -2.01954199 +v -0.13618063 -2.0873047e-2 -2.01954199 +v -0.12524848 3.3841596e-2 -2.01954199 +v -9.3484165e-2 7.9713513e-2 -2.01954199 +v -4.7064871e-2 0.11067241 -2.01954199 +v 7.8322312e-3 0.12064799 -2.01954199 +v 6.2546875e-2 0.10971584 -2.01954199 +v 0.10841879 7.7951532e-2 -2.01954199 +v 0.13937769 3.1532238e-2 -2.01954199 +v 0.14935327 -2.3364864e-2 -2.01954199 +v 0.13842112 -7.8079507e-2 -2.01954199 +v 0.10665681 -0.12395142 -2.01954199 +v 6.0237517e-2 -0.15491032 -2.01954199 +v 5.3404146e-3 -0.16488591 -1.80144508 +v -4.9374229e-2 -0.15395375 -1.80144508 +v -9.5246146e-2 -0.12218944 -1.80144508 +v -0.12620504 -7.5770150e-2 -1.80144508 +v -0.13618063 -2.0873047e-2 -1.80144508 +v -0.12524848 3.3841596e-2 -1.80144508 +v -9.3484165e-2 7.9713513e-2 -1.80144508 +v -4.7064871e-2 0.11067241 -1.80144508 +v 7.8322312e-3 0.12064799 -1.80144508 +v 6.2546875e-2 0.10971584 -1.80144508 +v 0.10841879 7.7951532e-2 -1.80144508 +v 0.13937769 3.1532238e-2 -1.80144508 +v 0.14935327 -2.3364864e-2 -1.80144508 +v 0.13842112 -7.8079507e-2 -1.80144508 +v 0.10665681 -0.12395142 -1.80144508 +v 6.0237517e-2 -0.15491032 -1.80144508 +vt -5.5511151e-17 0.44992481 +vt 0.0000000e+0 0.61663275 +vt 0.0000000e+0 0.66683179 +vt 0.0000000e+0 0.75001680 +vt 1.8318680e-15 0.19986288 +vt 3.8302694e-15 0.16670795 +vt 5.2735594e-15 0.41676987 +vt 5.5511151e-15 0.11650891 +vt 7.1609385e-15 0.50012384 +vt 8.6597396e-15 0.25006192 +vt 1.1546319e-14 0.53327878 +vt 1.3045121e-14 8.3353974e-2 +vt 1.3600232e-14 0.28321686 +vt 1.3877788e-14 0.33341590 +vt 1.4099832e-14 0.36657083 +vt 1.9151347e-14 0.58347782 +vt 2.3814284e-14 0.61663275 +vt 2.3925306e-14 1.6486812e-14 +vt 2.4480418e-14 3.3154935e-2 +vt 5.6620196e-4 0.80118447 +vt 1.3231774e-2 0.71745432 +vt 1.4345147e-2 0.83347088 +vt 2.2088051e-2 0.73998048 +vt 2.2782262e-2 0.81079911 +vt 4.9075157e-2 0.68100958 +vt 5.0842973e-2 0.86925746 +vt 7.1729634e-2 0.68947855 +vt 7.3338664e-2 0.86037825 +vt 8.1373839e-2 0.66729960 +vt 8.3386472e-2 0.88237674 +vt 0.13248666 0.66683179 +vt 0.13449929 0.88190894 +vt 0.14253447 0.68883028 +vt 0.14414349 0.85972998 +vt 0.16503016 0.67995107 +vt 0.16679797 0.86819896 +vt 0.19309087 0.73840943 +vt 0.19378508 0.80922805 +vt 0.20152798 0.71573765 +vt 0.20264136 0.83175421 +vt 0.21530693 0.74802407 +vt 0.21587313 0.79605511 +vt 0.21587313 0.79919174 +vt 0.21633365 0.74551603 +vt 0.22839635 0.82705097 +vt 0.22940641 0.71475262 +vt 0.26381805 0.86309635 +vt 0.26546160 0.67934493 +vt 0.26843576 0.77141349 +vt 0.26852140 0.77125613 +vt 0.27212389 0.79170980 +vt 0.27216306 0.79134932 +vt 0.27247755 0.75118464 +vt 0.27252555 0.75123070 +vt 0.28349746 0.80833635 +vt 0.28356988 0.80887174 +vt 0.28416320 0.73444712 +vt 0.28422131 0.73422508 +vt 0.28448184 0.77155352 +vt 0.28704878 0.78567976 +vt 0.28729493 0.75747424 +vt 0.29458460 0.87615745 +vt 0.29501519 0.79762446 +vt 0.29546858 0.74567039 +vt 0.29645411 0.66683179 +vt 0.30028552 0.81996675 +vt 0.30052944 0.82061550 +vt 0.30115673 0.72311556 +vt 0.30138324 0.72277909 +vt 0.30681904 0.80579812 +vt 0.30741329 0.73770398 +vt 0.32031517 0.82396494 +vt 0.32075829 0.82465728 +vt 0.32089832 0.80861120 +vt 0.32125467 0.71947201 +vt 0.32153952 0.73513704 +vt 0.32167956 0.71909096 +vt 0.33502456 0.80604427 +vt 0.33561881 0.73795013 +vt 0.34041312 0.82032139 +vt 0.34105460 0.82096916 +vt 0.34128432 0.72347020 +vt 0.34190841 0.72313275 +vt 0.34511573 0.87660516 +vt 0.34696926 0.79807786 +vt 0.34698524 0.66727950 +vt 0.34742266 0.74612378 +vt 0.35514292 0.78627401 +vt 0.35538907 0.75806849 +vt 0.35740664 0.80898983 +vt 0.35795600 0.77219472 +vt 0.35807239 0.73510060 +vt 0.35821654 0.80952317 +vt 0.35886797 0.73487651 +vt 0.36904429 0.79220626 +vt 0.36940679 0.75208763 +vt 0.36996030 0.79256361 +vt 0.37031396 0.75203844 +vt 0.37304845 0.77218082 +vt 0.37400209 0.77233475 +vt 0.37610825 0.86409203 +vt 0.37775179 0.68034060 +vt 0.41216344 0.82868433 +vt 0.41317350 0.71638598 +vt 0.42523619 0.79792092 +vt 0.42569672 0.72391153 +vt 0.42569672 0.74738184 +vt 0.42972017 0.74605320 +vt 0.43010598 0.70184345 +vt 0.44124392 0.72404721 +vt 0.44153874 0.72379049 +vt 0.44220684 0.76477551 +vt 0.44291750 0.68334191 +vt 0.44418105 0.74021062 +vt 0.44446269 0.70793751 +vt 0.44447587 0.73995391 +vt 0.44475751 0.70768079 +vt 0.45329631 0.75387791 +vt 0.45359113 0.75362120 +vt 0.45381509 0.69443139 +vt 0.45410991 0.69417467 +vt 0.46070837 0.77758702 +vt 0.46163981 0.67085525 +vt 0.46680243 0.76323031 +vt 0.46709725 0.76297360 +vt 0.46748238 0.68531612 +vt 0.46777720 0.68505941 +vt 0.48277645 0.78199629 +vt 0.48291213 0.76644908 +vt 0.48320695 0.76619237 +vt 0.48364580 0.68237900 +vt 0.48378148 0.66683179 +vt 0.48394062 0.68212228 +vt 0.49907555 0.76351196 +vt 0.49937037 0.76325524 +vt 0.49975549 0.68559777 +vt 0.50005032 0.68534105 +vt 0.50491812 0.77797283 +vt 0.50584955 0.67124106 +vt 0.51274283 0.75439669 +vt 0.51303766 0.75413998 +vt 0.51326162 0.69495017 +vt 0.51355644 0.69469345 +vt 0.52209524 0.74089057 +vt 0.52237688 0.70861746 +vt 0.52239006 0.74063386 +vt 0.52267170 0.70836074 +vt 0.52364043 0.76548617 +vt 0.52435109 0.68405257 +vt 0.52531400 0.72478087 +vt 0.52560883 0.72452416 +vt 0.53645194 0.74698463 +vt 0.53683775 0.70277488 +vt 0.54086121 0.72491655 +vt 0.55606448 0.16670795 +vt 0.55606448 0.61663275 +vt 0.55606448 0.66683179 +vt 0.55606448 0.41676987 +vt 0.55606448 0.19986288 +vt 0.55606448 0.11650891 +vt 0.55606448 0.44992481 +vt 0.55606448 0.50012384 +vt 0.55606448 0.36657083 +vt 0.55606448 8.3353974e-2 +vt 0.55606448 0.28321686 +vt 0.55606448 0.25006192 +vt 0.55606448 0.33341590 +vt 0.55606448 0.53327878 +vt 0.55606448 3.3154935e-2 +vt 0.55606448 0.0000000e+0 +vt 0.55606448 0.61663275 +vt 0.55606448 0.0000000e+0 +vt 0.55606448 0.12377210 +vt 0.55606448 0.18565816 +vt 0.55606448 0.20628684 +vt 0.55606448 0.22691552 +vt 0.55606448 0.24754421 +vt 0.55606448 0.26817289 +vt 0.55606448 0.30943026 +vt 0.55606448 0.30943026 +vt 0.55606448 0.33005894 +vt 0.55606448 0.33005894 +vt 0.55606448 0.58347782 +vt 0.55606448 0.16502947 +vt 0.55606448 0.28880158 +vt 0.55606448 0.34441651 +vt 0.55606448 0.54542240 +vt 0.55606448 0.54542240 +vt 0.55606448 0.55977997 +vt 0.55606448 4.1257368e-2 +vt 0.55606448 6.1886052e-2 +vt 0.55606448 0.10314342 +vt 0.55606448 0.14440079 +vt 0.55606448 0.41620433 +vt 0.55606448 2.0628684e-2 +vt 0.55606448 8.2514736e-2 +vt 0.55606448 0.35877407 +vt 0.55606448 0.37313164 +vt 0.55606448 0.38748920 +vt 0.55606448 0.40184676 +vt 0.55606448 0.44491946 +vt 0.55606448 0.51670728 +vt 0.55606448 0.43056189 +vt 0.55606448 0.45927702 +vt 0.55606448 0.48799215 +vt 0.55606448 0.53106484 +vt 0.55606448 0.47363458 +vt 0.55606448 0.50234971 +vt 0.81257053 0.33005894 +vt 0.81257053 0.54542240 +vt 0.81257053 0.55977997 +vt 0.81257053 0.34441651 +vt 0.81257053 0.35877407 +vt 0.81257053 0.44491946 +vt 0.81257053 0.41620433 +vt 0.81257053 0.43056189 +vt 0.81257053 0.47363458 +vt 0.81257053 0.37313164 +vt 0.81257053 0.45927702 +vt 0.81257053 0.54362437 +vt 0.81257053 0.38748920 +vt 0.81257053 0.40184676 +vt 0.81257053 0.48799215 +vt 0.81257053 0.50234971 +vt 0.81257053 0.52719626 +vt 0.81257053 0.53106484 +vt 0.81257053 0.54542240 +vt 0.81257053 0.56005248 +vt 0.81257053 0.57648059 +vt 0.81257053 0.57648059 +vt 0.81257053 0.59290870 +vt 0.81257053 0.33005894 +vt 0.81257053 0.34648705 +vt 0.81257053 0.36291516 +vt 0.81257053 0.51670728 +vt 0.81257053 0.37934327 +vt 0.81257053 0.49434004 +vt 0.81257053 0.51076815 +vt 0.81257053 0.39577138 +vt 0.81257053 0.42862760 +vt 0.81257053 0.46148382 +vt 0.81257053 0.41219949 +vt 0.81257053 0.44505571 +vt 0.81257053 0.47791193 +vt 0.87678506 0.57648059 +vt 0.87678506 0.54362437 +vt 0.87678506 0.56005248 +vt 0.87678506 0.57648059 +vt 0.87678506 0.59290870 +vt 0.87678506 0.51076815 +vt 0.87678506 0.52719626 +vt 0.87678506 0.34648705 +vt 0.87678506 0.36291516 +vt 0.87678506 0.37934327 +vt 0.87678506 0.33005894 +vt 0.87678506 0.47791193 +vt 0.87678506 0.49434004 +vt 0.87678506 0.39577138 +vt 0.87678506 0.41219949 +vt 0.87678506 0.44505571 +vt 0.87678506 0.46148382 +vt 0.87678506 0.42862760 +vt 0.88031447 0.51629292 +vt 0.88433792 0.49415125 +vt 0.88472374 0.53836099 +vt 0.89615377 0.33760313 +vt 0.89615377 0.36010739 +vt 0.89616468 0.30943026 +vt 0.89616468 0.26817289 +vt 0.89616468 0.28880158 +vt 0.89616468 0.14440079 +vt 0.89616468 0.24754421 +vt 0.89616468 0.30943026 +vt 0.89616468 0.33005894 +vt 0.89616468 0.16502947 +vt 0.89616468 0.18565816 +vt 0.89616468 0.20628684 +vt 0.89616468 0.22691552 +vt 0.89616468 2.4980018e-16 +vt 0.89616468 4.4408921e-16 +vt 0.89616468 2.0628684e-2 +vt 0.89616468 4.1257368e-2 +vt 0.89616468 6.1886052e-2 +vt 0.89616468 8.2514736e-2 +vt 0.89616468 0.10314342 +vt 0.89616468 0.12377210 +vt 0.89616468 0.29255538 +vt 0.89616468 2.2504260e-2 +vt 0.89616468 4.5008519e-2 +vt 0.89616468 0.27005112 +vt 0.89616468 0.31505964 +vt 0.89616468 0.33756389 +vt 0.89616468 6.7512779e-2 +vt 0.89616468 9.0017039e-2 +vt 0.89616468 0.11252130 +vt 0.89616468 0.13502556 +vt 0.89616468 0.24754686 +vt 0.89616468 0.15752982 +vt 0.89616468 0.18003408 +vt 0.89616468 0.20253834 +vt 0.89616468 0.22504260 +vt 0.89682459 0.47542894 +vt 0.89753525 0.55686253 +vt 0.90115963 0.51611100 +vt 0.90372657 0.50198477 +vt 0.90397272 0.53019029 +vt 0.91169298 0.49004006 +vt 0.91214637 0.54199414 +vt 0.91532612 0.46261742 +vt 0.91625756 0.56934919 +vt 0.92349683 0.48186641 +vt 0.92409108 0.54996055 +vt 0.93739420 0.45820816 +vt 0.93757611 0.47905332 +vt 0.93821731 0.55252748 +vt 0.93839923 0.57337265 +vt 0.95170235 0.48162026 +vt 0.95229660 0.54971440 +vt 0.95953587 0.46223161 +vt 0.96046730 0.56896338 +vt 0.96364706 0.48958667 +vt 0.96410045 0.54154074 +vt 0.97182071 0.50139052 +vt 0.97206686 0.52959604 +vt 0.97463380 0.51546980 +vt 0.97825818 0.47471827 +vt 0.97896884 0.55615187 +vt 0.99106969 0.49321981 +vt 0.99145551 0.53742956 +vt 0.99547896 0.51528789 +vt 0.99998909 0.33760313 +vt 0.99998909 0.36010739 +vt 1.00000000 4.5008519e-2 +vt 1.00000000 0.0000000e+0 +vt 1.00000000 2.2504260e-2 +vt 1.00000000 6.7512779e-2 +vt 1.00000000 0.27005112 +vt 1.00000000 0.29255538 +vt 1.00000000 0.31505964 +vt 1.00000000 0.33756389 +vt 1.00000000 9.0017039e-2 +vt 1.00000000 0.20253834 +vt 1.00000000 0.22504260 +vt 1.00000000 0.24754686 +vt 1.00000000 0.11252130 +vt 1.00000000 0.15752982 +vt 1.00000000 0.18003408 +vt 1.00000000 0.13502556 +vn -0.61534828 -0.24861684 -0.74802149 +vn -0.61091560 0.25931829 -0.74802149 +vn -0.24861684 0.61534828 -0.74802149 +vn 0.25931829 0.61091560 -0.74802149 +vn 0.61534828 0.24861684 -0.74802149 +vn 0.61091560 -0.25931829 -0.74802149 +vn 0.24861684 -0.61534828 -0.74802149 +vn -0.25931829 -0.61091560 -0.74802149 +vn 0.17515570 -0.88286469 0.43574122 +vn -0.19053714 -0.87967334 0.43574122 +vn -0.15823329 -0.75997885 -0.63039224 +vn 0.14494573 -0.76262465 -0.63039224 +vn 0.88286469 0.17515570 0.43574122 +vn 0.87967334 -0.19053714 0.43574122 +vn 0.75997885 -0.15823329 -0.63039224 +vn 0.76262465 0.14494573 -0.63039224 +vn -0.50042583 -0.74813340 0.43574122 +vn -0.75675309 -0.48729288 0.43574122 +vn -0.64927403 -0.42549836 -0.63039224 +vn -0.43676495 -0.64174917 -0.63039224 +vn 0.50042583 0.74813340 0.43574122 +vn 0.75675309 0.48729288 0.43574122 +vn 0.64927403 0.42549836 -0.63039224 +vn 0.43676495 0.64174917 -0.63039224 +vn -0.74813340 0.50042583 0.43574122 +vn -0.48729288 0.75675309 0.43574122 +vn -0.42549836 0.64927403 -0.63039224 +vn -0.64174917 0.43676495 -0.63039224 +vn -0.42036275 0.17843340 0.88963851 +vn -0.42341282 -0.17106988 0.88963851 +vn -0.17843340 -0.42036275 0.88963851 +vn 0.17106988 -0.42341282 0.88963851 +vn 0.42036275 -0.17843340 0.88963851 +vn 0.42341282 0.17106988 0.88963851 +vn 0.17843340 0.42036275 0.88963851 +vn -0.17106988 0.42341282 0.88963851 +vn -0.17515570 0.88286469 0.43574122 +vn 0.19053714 0.87967334 0.43574122 +vn 0.15823329 0.75997885 -0.63039224 +vn -0.14494573 0.76262465 -0.63039224 +vn -0.88286469 -0.17515570 0.43574122 +vn -0.87967334 0.19053714 0.43574122 +vn -0.75997885 0.15823329 -0.63039224 +vn -0.76262465 -0.14494573 -0.63039224 +vn 0.74813340 -0.50042583 0.43574122 +vn 0.48729288 -0.75675309 0.43574122 +vn 0.42549836 -0.64927403 -0.63039224 +vn 0.64174917 -0.43676495 -0.63039224 +vn -7.9704834e-3 -0.91332694 -0.40714909 +vn -0.91332694 7.9704834e-3 -0.40714909 +vn -0.64018369 0.65145565 -0.40714909 +vn 0.91332694 -7.9704834e-3 -0.40714909 +vn 0.65145565 0.64018369 -0.40714909 +vn 0.64018369 -0.65145565 -0.40714909 +vn -0.65145565 -0.64018369 -0.40714909 +vn 7.9704834e-3 0.91332694 -0.40714909 +vn -6.1152204e-3 -0.70073485 -0.71339559 +vn -0.27337272 -0.64402578 -0.71449154 +vn -0.49981848 -0.49117025 -0.71339559 +vn -0.64869870 -0.26209129 -0.71449154 +vn -0.70073485 6.1152204e-3 -0.71339559 +vn -0.64402578 0.27337272 -0.71449154 +vn -0.49117025 0.49981848 -0.71339559 +vn -0.26209129 0.64869870 -0.71449154 +vn 6.1152204e-3 0.70073485 -0.71339559 +vn 0.27337272 0.64402578 -0.71449154 +vn 0.49981848 0.49117025 -0.71339559 +vn 0.64869870 0.26209129 -0.71449154 +vn 0.70073485 -6.1152204e-3 -0.71339559 +vn 0.64402578 -0.27337272 -0.71449154 +vn 0.49117025 -0.49981848 -0.71339559 +vn 0.26209129 -0.64869870 -0.71449154 +vn -6.1152204e-3 -0.70073485 -0.71339559 +vn -0.27337272 -0.64402578 -0.71449154 +vn -0.49981848 -0.49117025 -0.71339559 +vn -0.64869870 -0.26209129 -0.71449154 +vn -0.70073485 6.1152204e-3 -0.71339559 +vn -0.64402578 0.27337272 -0.71449154 +vn -0.49117025 0.49981848 -0.71339559 +vn -0.26209129 0.64869870 -0.71449154 +vn 6.1152204e-3 0.70073485 -0.71339559 +vn 0.27337272 0.64402578 -0.71449154 +vn 0.49981848 0.49117025 -0.71339559 +vn 0.64869870 0.26209129 -0.71449154 +vn 0.70073485 -6.1152204e-3 -0.71339559 +vn 0.64402578 -0.27337272 -0.71449154 +vn 0.49117025 -0.49981848 -0.71339559 +vn 0.26209129 -0.64869870 -0.71449154 +vn -6.1152204e-3 -0.70073485 0.71339559 +vn -0.27337272 -0.64402578 0.71449154 +vn -0.49981848 -0.49117025 0.71339559 +vn -0.64869870 -0.26209129 0.71449154 +vn -0.70073485 6.1152204e-3 0.71339559 +vn -0.64402578 0.27337272 0.71449154 +vn -0.49117025 0.49981848 0.71339559 +vn -0.26209129 0.64869870 0.71449154 +vn 6.1152204e-3 0.70073485 0.71339559 +vn 0.27337272 0.64402578 0.71449154 +vn 0.49981848 0.49117025 0.71339559 +vn 0.64869870 0.26209129 0.71449154 +vn 0.70073485 -6.1152204e-3 0.71339559 +vn 0.64402578 -0.27337272 0.71449154 +vn 0.49117025 -0.49981848 0.71339559 +vn 0.26209129 -0.64869870 0.71449154 +vn -6.1152204e-3 -0.70073485 0.71339559 +vn -0.27337272 -0.64402578 0.71449154 +vn -0.49981848 -0.49117025 0.71339559 +vn -0.64869870 -0.26209129 0.71449154 +vn -0.70073485 6.1152204e-3 0.71339559 +vn -0.64402578 0.27337272 0.71449154 +vn -0.49117025 0.49981848 0.71339559 +vn -0.26209129 0.64869870 0.71449154 +vn 6.1152204e-3 0.70073485 0.71339559 +vn 0.27337272 0.64402578 0.71449154 +vn 0.49981848 0.49117025 0.71339559 +vn 0.64869870 0.26209129 0.71449154 +vn 0.70073485 -6.1152204e-3 0.71339559 +vn 0.64402578 -0.27337272 0.71449154 +vn 0.49117025 -0.49981848 0.71339559 +vn 0.26209129 -0.64869870 0.71449154 +vn -6.1152204e-3 -0.70073485 -0.71339559 +vn -0.27337272 -0.64402578 -0.71449154 +vn -0.49981848 -0.49117025 -0.71339559 +vn -0.64869870 -0.26209129 -0.71449154 +vn -0.70073485 6.1152204e-3 -0.71339559 +vn -0.64402578 0.27337272 -0.71449154 +vn -0.49117025 0.49981848 -0.71339559 +vn -0.26209129 0.64869870 -0.71449154 +vn 6.1152204e-3 0.70073485 -0.71339559 +vn 0.27337272 0.64402578 -0.71449154 +vn 0.49981848 0.49117025 -0.71339559 +vn 0.64869870 0.26209129 -0.71449154 +vn 0.70073485 -6.1152204e-3 -0.71339559 +vn 0.64402578 -0.27337272 -0.71449154 +vn 0.49117025 -0.49981848 -0.71339559 +vn 0.26209129 -0.64869870 -0.71449154 +vn 6.1152204e-3 0.70073485 -0.71339559 +vn 0.27337272 0.64402578 -0.71449154 +vn 0.49981848 0.49117025 -0.71339559 +vn 0.64869870 0.26209129 -0.71449154 +vn 0.70073485 -6.1152204e-3 -0.71339559 +vn 0.64402578 -0.27337272 -0.71449154 +vn 0.49117025 -0.49981848 -0.71339559 +vn 0.26209129 -0.64869870 -0.71449154 +vn -6.1152204e-3 -0.70073485 -0.71339559 +vn -0.27337272 -0.64402578 -0.71449154 +vn -0.49981848 -0.49117025 -0.71339559 +vn -0.64869870 -0.26209129 -0.71449154 +vn -0.70073485 6.1152204e-3 -0.71339559 +vn -0.64402578 0.27337272 -0.71449154 +vn -0.49117025 0.49981848 -0.71339559 +vn -0.26209129 0.64869870 -0.71449154 +vn 7.7770068e-3 0.89115671 -0.45362897 +vn 0.34799109 0.81981563 -0.45475767 +vn 0.63564212 0.62464378 -0.45362897 +vn 0.82576405 0.33363033 -0.45475767 +vn 0.89115671 -7.7770068e-3 -0.45362897 +vn 0.81981563 -0.34799109 -0.45475767 +vn 0.62464378 -0.63564212 -0.45362897 +vn 0.33363033 -0.82576405 -0.45475767 +vn -7.7770068e-3 -0.89115671 -0.45362897 +vn -0.34799109 -0.81981563 -0.45475767 +vn -0.63564212 -0.62464378 -0.45362897 +vn -0.82576405 -0.33363033 -0.45475767 +vn -0.89115671 7.7770068e-3 -0.45362897 +vn -0.81981563 0.34799109 -0.45475767 +vn -0.62464378 0.63564212 -0.45362897 +vn -0.33363033 0.82576405 -0.45475767 +g w_laser_w_laser +usemtl w_laser +s 1 +f 1/271/1 60/193/60 59/173/59 55/286/55 +f 2/276/2 62/174/62 61/184/61 50/275/50 +f 3/278/3 64/176/64 63/175/63 51/277/51 +f 4/269/4 66/178/66 65/177/65 56/272/56 +f 5/268/5 68/179/68 67/185/67 53/270/53 +f 6/281/6 70/195/70 69/172/69 52/280/52 +f 7/283/7 72/191/72 71/190/71 54/282/54 +f 8/285/8 58/192/58 57/196/57 49/284/49 +f 9/31/9 32/33/32 31/27/31 10/29/10 +f 10/155/10 11/6/11 12/8/12 9/160/9 +f 10/155/10 17/159/17 20/5/20 11/6/11 +f 11/86/11 20/102/20 8/82/8 +f 12/8/12 47/12/47 46/164/46 9/160/9 +f 13/43/13 34/38/34 33/37/33 14/41/14 +f 14/2/14 15/156/15 16/157/16 13/3/13 +f 14/170/14 45/169/45 48/19/48 15/18/15 +f 15/44/15 48/46/48 6/54/6 +f 16/17/16 23/16/23 22/183/22 13/171/13 +f 17/25/17 31/27/31 30/23/30 18/21/18 +f 18/166/18 19/10/19 20/5/20 17/159/17 +f 18/166/18 41/165/41 44/13/44 19/10/19 +f 19/104/19 44/107/44 1/96/1 +f 21/36/21 35/34/35 34/38/34 22/40/22 +f 22/183/22 23/16/23 24/11/24 21/168/21 +f 22/40/22 34/38/34 13/43/13 +f 23/45/23 16/42/16 5/52/5 +f 24/11/24 39/9/39 38/162/38 21/168/21 +f 25/22/25 29/24/29 36/28/36 26/26/26 +f 26/158/26 27/7/27 28/15/28 25/163/25 +f 26/158/26 37/161/37 40/1/40 27/7/27 +f 27/101/27 40/84/40 3/80/3 +f 28/15/28 43/14/43 42/167/42 25/163/25 +f 29/24/29 42/20/42 41/4/41 30/23/30 +f 30/23/30 31/27/31 32/33/32 33/37/33 34/38/34 35/34/35 36/28/36 29/24/29 +f 30/23/30 41/4/41 18/21/18 +f 31/27/31 17/25/17 10/29/10 +f 32/33/32 46/35/46 45/39/45 33/37/33 +f 33/37/33 45/39/45 14/41/14 +f 35/34/35 38/32/38 37/30/37 36/28/36 +f 36/28/36 37/30/37 26/26/26 +f 38/32/38 35/34/35 21/36/21 +f 38/162/38 39/9/39 40/1/40 37/161/37 +f 39/62/39 24/47/24 4/66/4 +f 42/20/42 29/24/29 25/22/25 +f 42/167/42 43/14/43 44/13/44 41/165/41 +f 43/105/43 28/103/28 2/95/2 +f 46/35/46 32/33/32 9/31/9 +f 46/164/46 47/12/47 48/19/48 45/169/45 +f 47/48/47 12/65/12 7/68/7 +f 49/75/49 7/68/7 12/65/12 11/86/11 8/82/8 +f 49/284/49 57/196/57 72/191/72 7/283/7 +f 50/99/50 1/96/1 44/107/44 43/105/43 2/95/2 +f 50/275/50 61/184/61 60/193/60 1/271/1 +f 51/90/51 2/95/2 28/103/28 27/101/27 3/80/3 +f 51/277/51 63/175/63 62/174/62 2/276/2 +f 52/50/52 5/52/5 16/42/16 15/44/15 6/54/6 +f 52/180/52 69/273/69 68/274/68 5/181/5 +f 53/55/53 4/66/4 24/47/24 23/45/23 5/52/5 +f 53/270/53 67/185/67 66/178/66 4/269/4 +f 54/57/54 6/54/6 48/46/48 47/48/47 7/68/7 +f 54/282/54 71/190/71 70/195/70 6/281/6 +f 55/92/55 8/82/8 20/102/20 19/104/19 1/96/1 +f 55/286/55 59/173/59 58/192/58 8/285/8 +f 56/72/56 3/80/3 40/84/40 39/62/39 4/66/4 +f 56/272/56 65/177/65 64/176/64 3/278/3 +f 57/77/57 73/76/73 88/71/88 72/69/72 +f 58/83/58 74/79/74 73/76/73 57/77/57 +f 59/94/59 75/87/75 74/79/74 58/83/58 +f 60/98/60 76/89/76 75/87/75 59/94/59 +f 61/100/61 77/91/77 76/89/76 60/98/60 +f 62/97/62 78/88/78 77/91/77 61/100/61 +f 63/93/63 79/85/79 78/88/78 62/97/62 +f 64/81/64 80/78/80 79/85/79 63/93/63 +f 65/73/65 81/74/81 80/78/80 64/81/64 +f 66/67/66 82/70/82 81/74/81 65/73/65 +f 67/56/67 83/63/83 82/70/82 66/67/66 +f 68/51/68 84/60/84 83/63/83 67/56/67 +f 69/49/69 85/59/85 84/60/84 68/51/68 +f 70/53/70 86/61/86 85/59/85 69/49/69 +f 71/58/71 87/64/87 86/61/86 70/53/70 +f 72/69/72 88/71/88 87/64/87 71/58/71 +f 73/221/73 89/199/89 104/198/104 88/218/88 +f 74/222/74 90/200/90 89/199/89 73/221/73 +f 75/215/75 91/194/91 90/200/90 74/222/74 +f 76/216/76 92/203/92 91/194/91 75/215/75 +f 77/214/77 93/201/93 92/203/92 76/216/76 +f 78/219/78 94/204/94 93/201/93 77/214/77 +f 79/217/79 95/207/95 94/204/94 78/219/78 +f 80/223/80 96/205/96 95/207/95 79/217/79 +f 81/224/81 97/208/97 96/205/96 80/223/80 +f 82/235/82 98/202/98 97/208/97 81/224/81 +f 83/226/83 99/206/99 98/202/98 82/235/82 +f 84/227/84 100/187/100 99/206/99 83/226/83 +f 85/188/85 101/210/101 100/211/100 84/189/84 +f 86/212/86 102/186/102 101/182/101 85/209/85 +f 87/213/87 103/197/103 102/186/102 86/212/86 +f 88/218/88 104/198/104 103/197/103 87/213/87 +f 89/314/89 105/313/105 120/319/120 104/317/104 +f 90/311/90 106/309/106 105/313/105 89/314/89 +f 91/307/91 107/302/107 106/309/106 90/311/90 +f 92/305/92 108/264/108 107/302/107 91/307/91 +f 93/304/93 109/263/109 108/264/108 92/305/92 +f 94/306/94 110/265/110 109/263/109 93/304/93 +f 95/308/95 111/303/111 110/265/110 94/306/94 +f 96/312/96 112/310/112 111/303/111 95/308/95 +f 97/315/97 113/316/113 112/310/112 96/312/96 +f 98/318/98 114/320/114 113/316/113 97/315/97 +f 99/322/99 115/327/115 114/320/114 98/318/98 +f 100/324/100 116/329/116 115/327/115 99/322/99 +f 101/325/101 117/330/117 116/329/116 100/324/100 +f 102/323/102 118/328/118 117/330/117 101/325/101 +f 103/321/103 119/326/119 118/328/118 102/323/102 +f 104/317/104 120/319/120 119/326/119 103/321/103 +f 105/341/105 121/294/121 136/293/136 120/336/120 +f 106/345/106 122/295/122 121/294/121 105/341/105 +f 107/348/107 123/296/123 122/295/122 106/345/106 +f 108/346/108 124/298/124 123/296/123 107/348/107 +f 109/347/109 125/299/125 124/298/124 108/346/108 +f 110/342/110 126/300/126 125/299/125 109/347/109 +f 111/343/111 127/301/127 126/300/126 110/342/110 +f 112/344/112 128/297/128 127/301/127 111/343/111 +f 113/337/113 129/290/129 128/297/128 112/344/112 +f 114/338/114 130/287/130 129/290/129 113/337/113 +f 115/339/115 131/291/131 130/287/130 114/338/114 +f 116/340/116 132/292/132 131/291/131 115/339/115 +f 117/266/117 133/331/133 132/332/132 116/267/116 +f 118/335/118 134/288/134 133/279/133 117/334/117 +f 119/333/119 135/289/135 134/288/134 118/335/118 +f 120/336/120 136/293/136 135/289/135 119/333/119 +f 121/132/121 137/131/137 152/126/152 136/123/136 +f 122/139/122 138/136/138 137/131/137 121/132/121 +f 123/149/123 139/142/139 138/136/138 122/139/122 +f 124/153/124 140/145/140 139/142/139 123/149/123 +f 125/154/125 141/150/141 140/145/140 124/153/124 +f 126/152/126 142/144/142 141/150/141 125/154/125 +f 127/148/127 143/140/143 142/144/142 126/152/126 +f 128/138/128 144/134/144 143/140/143 127/148/127 +f 129/128/129 145/129/145 144/134/144 128/138/128 +f 130/122/130 146/124/146 145/129/145 129/128/129 +f 131/112/131 147/118/147 146/124/146 130/122/130 +f 132/108/132 148/114/148 147/118/147 131/112/131 +f 133/106/133 149/110/149 148/114/148 132/108/132 +f 134/109/134 150/115/150 149/110/149 133/106/133 +f 135/113/135 151/120/151 150/115/150 134/109/134 +f 136/123/136 152/126/152 151/120/151 135/113/135 +f 137/258/137 153/239/153 168/236/168 152/254/152 +f 138/259/138 154/242/154 153/239/153 137/258/137 +f 139/262/139 155/240/155 154/242/154 138/259/138 +f 140/260/140 156/243/156 155/240/155 139/262/139 +f 141/261/141 157/241/157 156/243/156 140/260/140 +f 142/256/142 158/244/158 157/241/157 141/261/141 +f 143/257/143 159/237/159 158/244/158 142/256/142 +f 144/250/144 160/238/160 159/237/159 143/257/143 +f 145/251/145 161/225/161 160/238/160 144/250/144 +f 146/246/146 162/220/162 161/225/161 145/251/145 +f 147/247/147 163/228/163 162/220/162 146/246/146 +f 148/245/148 164/229/164 163/228/163 147/247/147 +f 149/230/149 165/248/165 164/249/164 148/231/148 +f 150/252/150 166/233/166 165/232/165 149/255/149 +f 151/253/151 167/234/167 166/233/166 150/252/150 +f 152/254/152 168/236/168 167/234/167 151/253/151 +f 154/137/154 155/143/155 156/147/156 157/151/157 158/146/158 159/141/159 160/135/160 161/130/161 162/125/162 163/119/163 164/116/164 165/111/165 166/117/166 167/121/167 168/127/168 153/133/153 diff --git a/res/models/playership/weapons/w_laser.png b/res/models/playership/weapons/w_laser.png new file mode 100644 index 0000000..9e03a50 Binary files /dev/null and b/res/models/playership/weapons/w_laser.png differ diff --git a/res/models/playership/weapons/w_plasma.mtl b/res/models/playership/weapons/w_plasma.mtl new file mode 100644 index 0000000..ab1f61b --- /dev/null +++ b/res/models/playership/weapons/w_plasma.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl w_plasma +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd w_plasma.png + diff --git a/res/models/playership/weapons/w_plasma.obj b/res/models/playership/weapons/w_plasma.obj new file mode 100644 index 0000000..c055b4d --- /dev/null +++ b/res/models/playership/weapons/w_plasma.obj @@ -0,0 +1,4465 @@ +# Exported from Wings 3D 1.4.1 +mtllib w_plasma.mtl +o w_plasma +#1105 vertices, 1095 faces +v -0.39056407 -0.20351974 -1.64128227 +v -0.44670806 -3.7992289e-2 -1.61260386 +v -0.41047509 0.13620444 -1.58392546 +v -0.31033799 0.28327547 -1.55524705 +v -0.16154172 0.38083058 -1.52656865 +v 1.3260828e-2 0.41401788 -1.49789025 +v 0.18745755 0.37778491 -1.46921184 +v 0.33452859 0.27764781 -1.44053344 +v 0.43208369 0.12885154 -1.41185503 +v 0.46527100 -4.5951010e-2 -1.38317663 +v 0.42903802 -0.22014774 -1.35449822 +v 0.32890092 -0.36721877 -1.32581982 +v 0.18010466 -0.46477388 -1.29714141 +v 5.3021074e-3 -0.49796118 -1.26846301 +v -0.16889462 -0.46172821 -1.23978460 +v -0.31596565 -0.36159110 -1.21110620 +v -0.41352076 -0.21279484 -1.18242780 +v -0.44670806 -3.7992289e-2 -1.15374939 +v -0.41047509 0.13620444 -1.12507099 +v -0.31033799 0.28327547 -1.09639258 +v -0.16154172 0.38083058 -1.06771418 +v 1.3260828e-2 0.41401788 -1.03903577 +v 0.18745755 0.37778491 -1.01035737 +v 0.33452859 0.27764781 -0.98167896 +v 0.43208369 0.12885154 -0.95300056 +v 0.46527100 -4.5951010e-2 -0.92432215 +v 0.42903802 -0.22014774 -0.89564375 +v 0.32890092 -0.36721877 -0.86696535 +v 0.18010466 -0.46477388 -0.83828694 +v 5.3021074e-3 -0.49796118 -0.80960854 +v -0.16889462 -0.46172821 -0.78093013 +v -0.31596565 -0.36159110 -0.75225173 +v -0.41352076 -0.21279484 -0.72357332 +v -0.44670806 -3.7992289e-2 -0.69489492 +v -0.41047509 0.13620444 -0.66621651 +v -0.31033799 0.28327547 -0.63753811 +v -0.16154172 0.38083058 -0.60885970 +v 1.3260828e-2 0.41401788 -0.58018130 +v 0.18745755 0.37778491 -0.55150290 +v 0.33452859 0.27764781 -0.52282449 +v 0.43208369 0.12885154 -0.49414609 +v 0.46527100 -4.5951010e-2 -0.46546768 +v 0.42903802 -0.22014774 -0.43678928 +v 0.32890092 -0.36721877 -0.40811087 +v 0.18010466 -0.46477388 -0.37943247 +v 5.3021074e-3 -0.49796118 -0.35075406 +v -0.16889462 -0.46172821 -0.32207566 +v -0.31596565 -0.36159110 -0.29339726 +v -0.41352076 -0.21279484 -0.26471885 +v -0.44670806 -3.7992289e-2 -0.23604045 +v -0.41047509 0.13620444 -0.20736204 +v -0.31033799 0.28327547 -0.17868364 +v -0.16154172 0.38083058 -0.15000523 +v 1.3260828e-2 0.41401788 -0.12132683 +v 0.18745755 0.37778491 -9.2648424e-2 +v 0.33452859 0.27764781 -6.3970019e-2 +v 0.43208369 0.12885154 -3.5291615e-2 +v 0.45692939 -8.7772633e-2 -6.6132100e-3 +v -0.38426557 -0.20097497 -1.59832633 +v -0.43803053 -3.8068017e-2 -1.55773011 +v -0.40248707 0.13281373 -1.52905171 +v -0.30425559 0.27708598 -1.50037330 +v -0.15829094 0.37278460 -1.47169490 +v 1.3185100e-2 0.40534034 -1.44301649 +v 0.18406684 0.36979689 -1.41433809 +v 0.32833910 0.27156541 -1.38565968 +v 0.42403772 0.12560075 -1.35698128 +v 0.45659346 -4.5875282e-2 -1.32830288 +v 0.42105001 -0.21675703 -1.29962447 +v 0.32281853 -0.36102928 -1.27094607 +v 0.17685387 -0.45672790 -1.24226766 +v 5.3778351e-3 -0.48928364 -1.21358926 +v -0.16550391 -0.45374019 -1.18491085 +v -0.30977616 -0.35550871 -1.15623245 +v -0.40547478 -0.20954405 -1.12755404 +v -0.43803053 -3.8068017e-2 -1.09887564 +v -0.40248707 0.13281373 -1.07019723 +v -0.30425559 0.27708598 -1.04151883 +v -0.15829094 0.37278460 -1.01284043 +v 1.3185100e-2 0.40534034 -0.98416202 +v 0.18406684 0.36979689 -0.95548362 +v 0.32833910 0.27156541 -0.92680521 +v 0.42403772 0.12560075 -0.89812681 +v 0.45659346 -4.5875282e-2 -0.86944840 +v 0.42105001 -0.21675703 -0.84077000 +v 0.32281853 -0.36102928 -0.81209159 +v 0.17685387 -0.45672790 -0.78341319 +v 5.3778351e-3 -0.48928364 -0.75473479 +v -0.16550391 -0.45374019 -0.72605638 +v -0.30977616 -0.35550871 -0.69737798 +v -0.40547478 -0.20954405 -0.66869957 +v -0.43803053 -3.8068017e-2 -0.64002117 +v -0.40248707 0.13281373 -0.61134276 +v -0.30425559 0.27708598 -0.58266436 +v -0.15829094 0.37278460 -0.55398595 +v 1.3185100e-2 0.40534034 -0.52530755 +v 0.18406684 0.36979689 -0.49662914 +v 0.32833910 0.27156541 -0.46795074 +v 0.42403772 0.12560075 -0.43927234 +v 0.45659346 -4.5875282e-2 -0.41059393 +v 0.42105001 -0.21675703 -0.38191553 +v 0.32281853 -0.36102928 -0.35323712 +v 0.17685387 -0.45672790 -0.32455872 +v 5.3778351e-3 -0.48928364 -0.29588031 +v -0.16550391 -0.45374019 -0.26720191 +v -0.30977616 -0.35550871 -0.23852350 +v -0.40547478 -0.20954405 -0.20984510 +v -0.43803053 -3.8068017e-2 -0.18116669 +v -0.40248707 0.13281373 -0.15248829 +v -0.30425559 0.27708598 -0.12380989 +v -0.15829094 0.37278460 -9.5131481e-2 +v 1.3185100e-2 0.40534034 -6.6453077e-2 +v 0.18406684 0.36979689 -3.7774672e-2 +v 0.32833910 0.27156541 -9.0962677e-3 +v 0.42403772 0.12560075 1.9582137e-2 +v 0.44888682 -8.4513424e-2 4.8260541e-2 +v -0.36632896 -0.19372811 -1.56191004 +v -0.41331900 -3.8283671e-2 -1.51121039 +v -0.37973913 0.12315780 -1.48253199 +v -0.28693439 0.25945980 -1.45385358 +v -0.14903348 0.34987160 -1.42517518 +v 1.2969446e-2 0.38062882 -1.39649677 +v 0.17441091 0.34704894 -1.36781837 +v 0.31071292 0.25424421 -1.33913996 +v 0.40112472 0.11634330 -1.31046156 +v 0.43188194 -4.5659628e-2 -1.28178316 +v 0.39830206 -0.20710109 -1.25310475 +v 0.30549733 -0.34340310 -1.22442635 +v 0.16759642 -0.43381490 -1.19574794 +v 5.5934893e-3 -0.46457212 -1.16706954 +v -0.15584798 -0.43099224 -1.13839113 +v -0.29214998 -0.33818751 -1.10971273 +v -0.38256178 -0.20028660 -1.08103432 +v -0.41331900 -3.8283671e-2 -1.05235592 +v -0.37973913 0.12315780 -1.02367751 +v -0.28693439 0.25945980 -0.99499911 +v -0.14903348 0.34987160 -0.96632071 +v 1.2969446e-2 0.38062882 -0.93764230 +v 0.17441091 0.34704894 -0.90896390 +v 0.31071292 0.25424421 -0.88028549 +v 0.40112472 0.11634330 -0.85160709 +v 0.43188194 -4.5659628e-2 -0.82292868 +v 0.39830206 -0.20710109 -0.79425028 +v 0.30549733 -0.34340310 -0.76557187 +v 0.16759642 -0.43381490 -0.73689347 +v 5.5934893e-3 -0.46457212 -0.70821507 +v -0.15584798 -0.43099224 -0.67953666 +v -0.29214998 -0.33818751 -0.65085826 +v -0.38256178 -0.20028660 -0.62217985 +v -0.41331900 -3.8283671e-2 -0.59350145 +v -0.37973913 0.12315780 -0.56482304 +v -0.28693439 0.25945980 -0.53614464 +v -0.14903348 0.34987160 -0.50746623 +v 1.2969446e-2 0.38062882 -0.47878783 +v 0.17441091 0.34704894 -0.45010942 +v 0.31071292 0.25424421 -0.42143102 +v 0.40112472 0.11634330 -0.39275262 +v 0.43188194 -4.5659628e-2 -0.36407421 +v 0.39830206 -0.20710109 -0.33539581 +v 0.30549733 -0.34340310 -0.30671740 +v 0.16759642 -0.43381490 -0.27803900 +v 5.5934893e-3 -0.46457212 -0.24936059 +v -0.15584798 -0.43099224 -0.22068219 +v -0.29214998 -0.33818751 -0.19200378 +v -0.38256178 -0.20028660 -0.16332538 +v -0.41331900 -3.8283671e-2 -0.13464697 +v -0.37973913 0.12315780 -0.10596857 +v -0.28693439 0.25945980 -7.7290166e-2 +v -0.14903348 0.34987160 -4.8611761e-2 +v 1.2969446e-2 0.38062882 -1.9933357e-2 +v 0.17441091 0.34704894 8.7450479e-3 +v 0.31071292 0.25424421 3.7423452e-2 +v 0.40112472 0.11634330 6.6101857e-2 +v 0.42598353 -7.5231981e-2 9.4780261e-2 +v -0.33948491 -0.18288241 -1.53757746 +v -0.37633559 -3.8606421e-2 -1.48012691 +v -0.34569442 0.10870667 -1.45144850 +v -0.26101139 0.23308036 -1.42277010 +v -0.13517872 0.31557987 -1.39409169 +v 1.2646697e-2 0.34364541 -1.36541329 +v 0.15995979 0.31300424 -1.33673489 +v 0.28433348 0.22832121 -1.30805648 +v 0.36683299 0.10248854 -1.27937808 +v 0.39489852 -4.5336879e-2 -1.25069967 +v 0.36425736 -0.19264997 -1.22202127 +v 0.27957433 -0.31702366 -1.19334286 +v 0.15374166 -0.39952317 -1.16466446 +v 5.9162387e-3 -0.42758870 -1.13598605 +v -0.14139686 -0.39694754 -1.10730765 +v -0.26577054 -0.31226451 -1.07862925 +v -0.34827005 -0.18643184 -1.04995084 +v -0.37633559 -3.8606421e-2 -1.02127244 +v -0.34569442 0.10870667 -0.99259403 +v -0.26101139 0.23308036 -0.96391563 +v -0.13517872 0.31557987 -0.93523722 +v 1.2646697e-2 0.34364541 -0.90655882 +v 0.15995979 0.31300424 -0.87788041 +v 0.28433348 0.22832121 -0.84920201 +v 0.36683299 0.10248854 -0.82052360 +v 0.39489852 -4.5336879e-2 -0.79184520 +v 0.36425736 -0.19264997 -0.76316680 +v 0.27957433 -0.31702366 -0.73448839 +v 0.15374166 -0.39952317 -0.70580999 +v 5.9162387e-3 -0.42758870 -0.67713158 +v -0.14139686 -0.39694754 -0.64845318 +v -0.26577054 -0.31226451 -0.61977477 +v -0.34827005 -0.18643184 -0.59109637 +v -0.37633559 -3.8606421e-2 -0.56241796 +v -0.34569442 0.10870667 -0.53373956 +v -0.26101139 0.23308036 -0.50506115 +v -0.13517872 0.31557987 -0.47638275 +v 1.2646697e-2 0.34364541 -0.44770435 +v 0.15995979 0.31300424 -0.41902594 +v 0.28433348 0.22832121 -0.39034754 +v 0.36683299 0.10248854 -0.36166913 +v 0.39489852 -4.5336879e-2 -0.33299073 +v 0.36425736 -0.19264997 -0.30431232 +v 0.27957433 -0.31702366 -0.27563392 +v 0.15374166 -0.39952317 -0.24695551 +v 5.9162387e-3 -0.42758870 -0.21827711 +v -0.14139686 -0.39694754 -0.18959870 +v -0.26577054 -0.31226451 -0.16092030 +v -0.34827005 -0.18643184 -0.13224190 +v -0.37633559 -3.8606421e-2 -0.10356349 +v -0.34569442 0.10870667 -7.4885087e-2 +v -0.26101139 0.23308036 -4.6206682e-2 +v -0.13517872 0.31557987 -1.7528278e-2 +v 1.2646697e-2 0.34364541 1.1150127e-2 +v 0.15995979 0.31300424 3.9828531e-2 +v 0.28433348 0.22832121 6.8506936e-2 +v 0.36683299 0.10248854 9.7185340e-2 +v 0.39170633 -6.1341321e-2 0.12586374 +v -0.30782020 -0.17008904 -1.52903299 +v -0.33271068 -3.8987129e-2 -1.46921184 +v -0.30553595 9.1660416e-2 -1.44053344 +v -0.23043312 0.20196369 -1.41185503 +v -0.11883592 0.27513002 -1.38317663 +v 1.2265988e-2 0.30002050 -1.35449822 +v 0.14291353 0.27284577 -1.32581982 +v 0.25321681 0.19774294 -1.29714141 +v 0.32638314 8.6145741e-2 -1.26846301 +v 0.35127361 -4.4956170e-2 -1.23978460 +v 0.32409889 -0.17560372 -1.21110620 +v 0.24899606 -0.28590699 -1.18242780 +v 0.13739886 -0.35907332 -1.15374939 +v 6.2969475e-3 -0.38396380 -1.12507099 +v -0.12435060 -0.35678907 -1.09639258 +v -0.23465387 -0.28168624 -1.06771418 +v -0.30782020 -0.17008904 -1.03903577 +v -0.33271068 -3.8987129e-2 -1.01035737 +v -0.30553595 9.1660416e-2 -0.98167896 +v -0.23043312 0.20196369 -0.95300056 +v -0.11883592 0.27513002 -0.92432215 +v 1.2265988e-2 0.30002050 -0.89564375 +v 0.14291353 0.27284577 -0.86696535 +v 0.25321681 0.19774294 -0.83828694 +v 0.32638314 8.6145741e-2 -0.80960854 +v 0.35127361 -4.4956170e-2 -0.78093013 +v 0.32409889 -0.17560372 -0.75225173 +v 0.24899606 -0.28590699 -0.72357332 +v 0.13739886 -0.35907332 -0.69489492 +v 6.2969475e-3 -0.38396380 -0.66621651 +v -0.12435060 -0.35678907 -0.63753811 +v -0.23465387 -0.28168624 -0.60885970 +v -0.30782020 -0.17008904 -0.58018130 +v -0.33271068 -3.8987129e-2 -0.55150290 +v -0.30553595 9.1660416e-2 -0.52282449 +v -0.23043312 0.20196369 -0.49414609 +v -0.11883592 0.27513002 -0.46546768 +v 1.2265988e-2 0.30002050 -0.43678928 +v 0.14291353 0.27284577 -0.40811087 +v 0.25321681 0.19774294 -0.37943247 +v 0.32638314 8.6145741e-2 -0.35075406 +v 0.35127361 -4.4956170e-2 -0.32207566 +v 0.32409889 -0.17560372 -0.29339726 +v 0.24899606 -0.28590699 -0.26471885 +v 0.13739886 -0.35907332 -0.23604045 +v 6.2969475e-3 -0.38396380 -0.20736204 +v -0.12435060 -0.35678907 -0.17868364 +v -0.23465387 -0.28168624 -0.15000523 +v -0.30782020 -0.17008904 -0.12132683 +v -0.33271068 -3.8987129e-2 -9.2648424e-2 +v -0.30553595 9.1660416e-2 -6.3970019e-2 +v -0.23043312 0.20196369 -3.5291615e-2 +v -0.11883592 0.27513002 -6.6132100e-3 +v 1.2265988e-2 0.30002050 2.2065194e-2 +v 0.14291353 0.27284577 5.0743599e-2 +v 0.25321681 0.19774294 7.9422004e-2 +v 0.32638314 8.6145741e-2 0.10810041 +v 0.35127361 -4.4956170e-2 0.13677881 +v -0.27615549 -0.15729567 -1.53757746 +v -0.28908577 -3.9367838e-2 -1.48012691 +v -0.26537748 7.4614157e-2 -1.45144850 +v -0.19985486 0.17084702 -1.42277010 +v -0.10249312 0.23468017 -1.39409169 +v 1.1885279e-2 0.25639559 -1.36541329 +v 0.12586727 0.23268730 -1.33673489 +v 0.22210014 0.16716467 -1.30805648 +v 0.28593329 6.9802941e-2 -1.27937808 +v 0.30764870 -4.4575461e-2 -1.25069967 +v 0.28394042 -0.15855746 -1.22202127 +v 0.21841779 -0.25479032 -1.19334286 +v 0.12105606 -0.31862347 -1.16466446 +v 6.6776563e-3 -0.34033889 -1.13598605 +v -0.10730434 -0.31663060 -1.10730765 +v -0.20353720 -0.25110797 -1.07862925 +v -0.26737035 -0.15374624 -1.04995084 +v -0.28908577 -3.9367838e-2 -1.02127244 +v -0.26537748 7.4614157e-2 -0.99259403 +v -0.19985486 0.17084702 -0.96391563 +v -0.10249312 0.23468017 -0.93523722 +v 1.1885279e-2 0.25639559 -0.90655882 +v 0.12586727 0.23268730 -0.87788041 +v 0.22210014 0.16716467 -0.84920201 +v 0.28593329 6.9802941e-2 -0.82052360 +v 0.30764870 -4.4575461e-2 -0.79184520 +v 0.28394042 -0.15855746 -0.76316680 +v 0.21841779 -0.25479032 -0.73448839 +v 0.12105606 -0.31862347 -0.70580999 +v 6.6776563e-3 -0.34033889 -0.67713158 +v -0.10730434 -0.31663060 -0.64845318 +v -0.20353720 -0.25110797 -0.61977477 +v -0.26737035 -0.15374624 -0.59109637 +v -0.28908577 -3.9367838e-2 -0.56241796 +v -0.26537748 7.4614157e-2 -0.53373956 +v -0.19985486 0.17084702 -0.50506115 +v -0.10249312 0.23468017 -0.47638275 +v 1.1885279e-2 0.25639559 -0.44770435 +v 0.12586727 0.23268730 -0.41902594 +v 0.22210014 0.16716467 -0.39034754 +v 0.28593329 6.9802941e-2 -0.36166913 +v 0.30764870 -4.4575461e-2 -0.33299073 +v 0.28394042 -0.15855746 -0.30431232 +v 0.21841779 -0.25479032 -0.27563392 +v 0.12105606 -0.31862347 -0.24695551 +v 6.6776563e-3 -0.34033889 -0.21827711 +v -0.10730434 -0.31663060 -0.18959870 +v -0.20353720 -0.25110797 -0.16092030 +v -0.26737035 -0.15374624 -0.13224190 +v -0.28908577 -3.9367838e-2 -0.10356349 +v -0.26537748 7.4614157e-2 -7.4885087e-2 +v -0.19985486 0.17084702 -4.6206682e-2 +v -0.10249312 0.23468017 -1.7528278e-2 +v 1.1885279e-2 0.25639559 1.1150127e-2 +v 0.12586727 0.23268730 3.9828531e-2 +v 0.22210014 0.16716467 6.8506936e-2 +v 0.28593329 6.9802941e-2 9.7185340e-2 +v 0.31084090 -2.8571019e-2 0.12586374 +v -0.24931145 -0.14644997 -1.56191004 +v -0.25210236 -3.9690588e-2 -1.51121039 +v -0.23133277 6.0163036e-2 -1.48253199 +v -0.17393185 0.14446758 -1.45385358 +v -8.8638365e-2 0.20038844 -1.42517518 +v 1.1562530e-2 0.21941217 -1.39649677 +v 0.11141615 0.19864259 -1.36781837 +v 0.19572070 0.14124167 -1.33913996 +v 0.25164156 5.5948183e-2 -1.31046156 +v 0.27066529 -4.4252712e-2 -1.28178316 +v 0.24989571 -0.14410634 -1.25310475 +v 0.19249479 -0.22841088 -1.22442635 +v 0.10720130 -0.28433174 -1.19574794 +v 7.0004057e-3 -0.30335547 -1.16706954 +v -9.2853218e-2 -0.28258589 -1.13839113 +v -0.17715776 -0.22518497 -1.10971273 +v -0.23307862 -0.13989148 -1.08103432 +v -0.25210236 -3.9690588e-2 -1.05235592 +v -0.23133277 6.0163036e-2 -1.02367751 +v -0.17393185 0.14446758 -0.99499911 +v -8.8638365e-2 0.20038844 -0.96632071 +v 1.1562530e-2 0.21941217 -0.93764230 +v 0.11141615 0.19864259 -0.90896390 +v 0.19572070 0.14124167 -0.88028549 +v 0.25164156 5.5948183e-2 -0.85160709 +v 0.27066529 -4.4252712e-2 -0.82292868 +v 0.24989571 -0.14410634 -0.79425028 +v 0.19249479 -0.22841088 -0.76557187 +v 0.10720130 -0.28433174 -0.73689347 +v 7.0004057e-3 -0.30335547 -0.70821507 +v -9.2853218e-2 -0.28258589 -0.67953666 +v -0.17715776 -0.22518497 -0.65085826 +v -0.23307862 -0.13989148 -0.62217985 +v -0.25210236 -3.9690588e-2 -0.59350145 +v -0.23133277 6.0163036e-2 -0.56482304 +v -0.17393185 0.14446758 -0.53614464 +v -8.8638365e-2 0.20038844 -0.50746623 +v 1.1562530e-2 0.21941217 -0.47878783 +v 0.11141615 0.19864259 -0.45010942 +v 0.19572070 0.14124167 -0.42143102 +v 0.25164156 5.5948183e-2 -0.39275262 +v 0.27066529 -4.4252712e-2 -0.36407421 +v 0.24989571 -0.14410634 -0.33539581 +v 0.19249479 -0.22841088 -0.30671740 +v 0.10720130 -0.28433174 -0.27803900 +v 7.0004057e-3 -0.30335547 -0.24936059 +v -9.2853218e-2 -0.28258589 -0.22068219 +v -0.17715776 -0.22518497 -0.19200378 +v -0.23307862 -0.13989148 -0.16332538 +v -0.25210236 -3.9690588e-2 -0.13464697 +v -0.23133277 6.0163036e-2 -0.10596857 +v -0.17393185 0.14446758 -7.7290166e-2 +v -8.8638365e-2 0.20038844 -4.8611761e-2 +v 1.1562530e-2 0.21941217 -1.9933357e-2 +v 0.11141615 0.19864259 8.7450479e-3 +v 0.19572070 0.14124167 3.7423452e-2 +v 0.25164156 5.5948183e-2 6.6101857e-2 +v 0.27656370 -1.4680359e-2 9.4780261e-2 +v -0.23137483 -0.13920311 -1.59832633 +v -0.22739083 -3.9906242e-2 -1.55773011 +v -0.20858483 5.0507106e-2 -1.52905171 +v -0.15661066 0.12684140 -1.50037330 +v -7.9380912e-2 0.17747544 -1.47169490 +v 1.1346876e-2 0.19470065 -1.44301649 +v 0.10176022 0.17589465 -1.41433809 +v 0.17809452 0.12392047 -1.38565968 +v 0.22872856 4.6690730e-2 -1.35698128 +v 0.24595377 -4.4037057e-2 -1.32830288 +v 0.22714776 -0.13445040 -1.29962447 +v 0.17517359 -0.21078470 -1.27094607 +v 9.7943847e-2 -0.26141874 -1.24226766 +v 7.2160599e-3 -0.27864395 -1.21358926 +v -8.3197288e-2 -0.25983794 -1.18491085 +v -0.15953158 -0.20786377 -1.15623245 +v -0.21016562 -0.13063403 -1.12755404 +v -0.22739083 -3.9906242e-2 -1.09887564 +v -0.20858483 5.0507106e-2 -1.07019723 +v -0.15661066 0.12684140 -1.04151883 +v -7.9380912e-2 0.17747544 -1.01284043 +v 1.1346876e-2 0.19470065 -0.98416202 +v 0.10176022 0.17589465 -0.95548362 +v 0.17809452 0.12392047 -0.92680521 +v 0.22872856 4.6690730e-2 -0.89812681 +v 0.24595377 -4.4037057e-2 -0.86944840 +v 0.22714776 -0.13445040 -0.84077000 +v 0.17517359 -0.21078470 -0.81209159 +v 9.7943847e-2 -0.26141874 -0.78341319 +v 7.2160599e-3 -0.27864395 -0.75473479 +v -8.3197288e-2 -0.25983794 -0.72605638 +v -0.15953158 -0.20786377 -0.69737798 +v -0.21016562 -0.13063403 -0.66869957 +v -0.22739083 -3.9906242e-2 -0.64002117 +v -0.20858483 5.0507106e-2 -0.61134276 +v -0.15661066 0.12684140 -0.58266436 +v -7.9380912e-2 0.17747544 -0.55398595 +v 1.1346876e-2 0.19470065 -0.52530755 +v 0.10176022 0.17589465 -0.49662914 +v 0.17809452 0.12392047 -0.46795074 +v 0.22872856 4.6690730e-2 -0.43927234 +v 0.24595377 -4.4037057e-2 -0.41059393 +v 0.22714776 -0.13445040 -0.38191553 +v 0.17517359 -0.21078470 -0.35323712 +v 9.7943847e-2 -0.26141874 -0.32455872 +v 7.2160599e-3 -0.27864395 -0.29588031 +v -8.3197288e-2 -0.25983794 -0.26720191 +v -0.15953158 -0.20786377 -0.23852350 +v -0.21016562 -0.13063403 -0.20984510 +v -0.22739083 -3.9906242e-2 -0.18116669 +v -0.20858483 5.0507106e-2 -0.15248829 +v -0.15661066 0.12684140 -0.12380989 +v -7.9380912e-2 0.17747544 -9.5131481e-2 +v 1.1346876e-2 0.19470065 -6.6453077e-2 +v 0.10176022 0.17589465 -3.7774672e-2 +v 0.17809452 0.12392047 -9.0962677e-3 +v 0.22872856 4.6690730e-2 1.9582137e-2 +v 0.25366040 -5.3989161e-3 4.8260541e-2 +v -0.22507633 -0.13665835 -1.64128227 +v -0.21871330 -3.9981969e-2 -1.61260386 +v -0.20059681 4.7116394e-2 -1.58392546 +v -0.15052826 0.12065191 -1.55524705 +v -7.6130126e-2 0.16942946 -1.52656865 +v 1.1271148e-2 0.18602311 -1.49789025 +v 9.8369511e-2 0.16790663 -1.46921184 +v 0.17190503 0.11783808 -1.44053344 +v 0.22068258 4.3439944e-2 -1.41185503 +v 0.23727623 -4.3961330e-2 -1.38317663 +v 0.21915975 -0.13105969 -1.35449822 +v 0.16909120 -0.20459521 -1.32581982 +v 9.4693062e-2 -0.25337276 -1.29714141 +v 7.2917876e-3 -0.26996641 -1.26846301 +v -7.9806576e-2 -0.25184993 -1.23978460 +v -0.15334209 -0.20178138 -1.21110620 +v -0.20211965 -0.12738324 -1.18242780 +v -0.21871330 -3.9981969e-2 -1.15374939 +v -0.20059681 4.7116394e-2 -1.12507099 +v -0.15052826 0.12065191 -1.09639258 +v -7.6130126e-2 0.16942946 -1.06771418 +v 1.1271148e-2 0.18602311 -1.03903577 +v 9.8369511e-2 0.16790663 -1.01035737 +v 0.17190503 0.11783808 -0.98167896 +v 0.22068258 4.3439944e-2 -0.95300056 +v 0.23727623 -4.3961330e-2 -0.92432215 +v 0.21915975 -0.13105969 -0.89564375 +v 0.16909120 -0.20459521 -0.86696535 +v 9.4693062e-2 -0.25337276 -0.83828694 +v 7.2917876e-3 -0.26996641 -0.80960854 +v -7.9806576e-2 -0.25184993 -0.78093013 +v -0.15334209 -0.20178138 -0.75225173 +v -0.20211965 -0.12738324 -0.72357332 +v -0.21871330 -3.9981969e-2 -0.69489492 +v -0.20059681 4.7116394e-2 -0.66621651 +v -0.15052826 0.12065191 -0.63753811 +v -7.6130126e-2 0.16942946 -0.60885970 +v 1.1271148e-2 0.18602311 -0.58018130 +v 9.8369511e-2 0.16790663 -0.55150290 +v 0.17190503 0.11783808 -0.52282449 +v 0.22068258 4.3439944e-2 -0.49414609 +v 0.23727623 -4.3961330e-2 -0.46546768 +v 0.21915975 -0.13105969 -0.43678928 +v 0.16909120 -0.20459521 -0.40811087 +v 9.4693062e-2 -0.25337276 -0.37943247 +v 7.2917876e-3 -0.26996641 -0.35075406 +v -7.9806576e-2 -0.25184993 -0.32207566 +v -0.15334209 -0.20178138 -0.29339726 +v -0.20211965 -0.12738324 -0.26471885 +v -0.21871330 -3.9981969e-2 -0.23604045 +v -0.20059681 4.7116394e-2 -0.20736204 +v -0.15052826 0.12065191 -0.17868364 +v -7.6130126e-2 0.16942946 -0.15000523 +v 1.1271148e-2 0.18602311 -0.12132683 +v 9.8369511e-2 0.16790663 -9.2648424e-2 +v 0.17190503 0.11783808 -6.3970019e-2 +v 0.22068258 4.3439944e-2 -3.5291615e-2 +v 0.24561784 -2.1397069e-3 -6.6132100e-3 +v -0.23137483 -0.13920311 -1.68423821 +v -0.22739083 -3.9906242e-2 -1.66747761 +v -0.20858483 5.0507106e-2 -1.63879921 +v -0.15661066 0.12684140 -1.61012081 +v -7.9380912e-2 0.17747544 -1.58144240 +v 1.1346876e-2 0.19470065 -1.55276400 +v 0.10176022 0.17589465 -1.52408559 +v 0.17809452 0.12392047 -1.49540719 +v 0.22872856 4.6690730e-2 -1.46672878 +v 0.24595377 -4.4037057e-2 -1.43805038 +v 0.22714776 -0.13445040 -1.40937197 +v 0.17517359 -0.21078470 -1.38069357 +v 9.7943847e-2 -0.26141874 -1.35201516 +v 7.2160599e-3 -0.27864395 -1.32333676 +v -8.3197288e-2 -0.25983794 -1.29465836 +v -0.15953158 -0.20786377 -1.26597995 +v -0.21016562 -0.13063403 -1.23730155 +v -0.22739083 -3.9906242e-2 -1.20862314 +v -0.20858483 5.0507106e-2 -1.17994474 +v -0.15661066 0.12684140 -1.15126633 +v -7.9380912e-2 0.17747544 -1.12258793 +v 1.1346876e-2 0.19470065 -1.09390952 +v 0.10176022 0.17589465 -1.06523112 +v 0.17809452 0.12392047 -1.03655272 +v 0.22872856 4.6690730e-2 -1.00787431 +v 0.24595377 -4.4037057e-2 -0.97919591 +v 0.22714776 -0.13445040 -0.95051750 +v 0.17517359 -0.21078470 -0.92183910 +v 9.7943847e-2 -0.26141874 -0.89316069 +v 7.2160599e-3 -0.27864395 -0.86448229 +v -8.3197288e-2 -0.25983794 -0.83580388 +v -0.15953158 -0.20786377 -0.80712548 +v -0.21016562 -0.13063403 -0.77844707 +v -0.22739083 -3.9906242e-2 -0.74976867 +v -0.20858483 5.0507106e-2 -0.72109027 +v -0.15661066 0.12684140 -0.69241186 +v -7.9380912e-2 0.17747544 -0.66373346 +v 1.1346876e-2 0.19470065 -0.63505505 +v 0.10176022 0.17589465 -0.60637665 +v 0.17809452 0.12392047 -0.57769824 +v 0.22872856 4.6690730e-2 -0.54901984 +v 0.24595377 -4.4037057e-2 -0.52034143 +v 0.22714776 -0.13445040 -0.49166303 +v 0.17517359 -0.21078470 -0.46298462 +v 9.7943847e-2 -0.26141874 -0.43430622 +v 7.2160599e-3 -0.27864395 -0.40562782 +v -8.3197288e-2 -0.25983794 -0.37694941 +v -0.15953158 -0.20786377 -0.34827101 +v -0.21016562 -0.13063403 -0.31959260 +v -0.22739083 -3.9906242e-2 -0.29091420 +v -0.20858483 5.0507106e-2 -0.26223579 +v -0.15661066 0.12684140 -0.23355739 +v -7.9380912e-2 0.17747544 -0.20487898 +v 1.1346876e-2 0.19470065 -0.17620058 +v 0.10176022 0.17589465 -0.14752217 +v 0.17809452 0.12392047 -0.11884377 +v 0.22872856 4.6690730e-2 -9.0165366e-2 +v 0.25366040 -5.3989161e-3 -6.1486961e-2 +v -0.24931145 -0.14644997 -1.72065449 +v -0.25210236 -3.9690588e-2 -1.71399733 +v -0.23133277 6.0163036e-2 -1.68531893 +v -0.17393185 0.14446758 -1.65664053 +v -8.8638365e-2 0.20038844 -1.62796212 +v 1.1562530e-2 0.21941217 -1.59928372 +v 0.11141615 0.19864259 -1.57060531 +v 0.19572070 0.14124167 -1.54192691 +v 0.25164156 5.5948183e-2 -1.51324850 +v 0.27066529 -4.4252712e-2 -1.48457010 +v 0.24989571 -0.14410634 -1.45589169 +v 0.19249479 -0.22841088 -1.42721329 +v 0.10720130 -0.28433174 -1.39853488 +v 7.0004057e-3 -0.30335547 -1.36985648 +v -9.2853218e-2 -0.28258589 -1.34117808 +v -0.17715776 -0.22518497 -1.31249967 +v -0.23307862 -0.13989148 -1.28382127 +v -0.25210236 -3.9690588e-2 -1.25514286 +v -0.23133277 6.0163036e-2 -1.22646446 +v -0.17393185 0.14446758 -1.19778605 +v -8.8638365e-2 0.20038844 -1.16910765 +v 1.1562530e-2 0.21941217 -1.14042924 +v 0.11141615 0.19864259 -1.11175084 +v 0.19572070 0.14124167 -1.08307244 +v 0.25164156 5.5948183e-2 -1.05439403 +v 0.27066529 -4.4252712e-2 -1.02571563 +v 0.24989571 -0.14410634 -0.99703722 +v 0.19249479 -0.22841088 -0.96835882 +v 0.10720130 -0.28433174 -0.93968041 +v 7.0004057e-3 -0.30335547 -0.91100201 +v -9.2853218e-2 -0.28258589 -0.88232360 +v -0.17715776 -0.22518497 -0.85364520 +v -0.23307862 -0.13989148 -0.82496679 +v -0.25210236 -3.9690588e-2 -0.79628839 +v -0.23133277 6.0163036e-2 -0.76760999 +v -0.17393185 0.14446758 -0.73893158 +v -8.8638365e-2 0.20038844 -0.71025318 +v 1.1562530e-2 0.21941217 -0.68157477 +v 0.11141615 0.19864259 -0.65289637 +v 0.19572070 0.14124167 -0.62421796 +v 0.25164156 5.5948183e-2 -0.59553956 +v 0.27066529 -4.4252712e-2 -0.56686115 +v 0.24989571 -0.14410634 -0.53818275 +v 0.19249479 -0.22841088 -0.50950434 +v 0.10720130 -0.28433174 -0.48082594 +v 7.0004057e-3 -0.30335547 -0.45214754 +v -9.2853218e-2 -0.28258589 -0.42346913 +v -0.17715776 -0.22518497 -0.39479073 +v -0.23307862 -0.13989148 -0.36611232 +v -0.25210236 -3.9690588e-2 -0.33743392 +v -0.23133277 6.0163036e-2 -0.30875551 +v -0.17393185 0.14446758 -0.28007711 +v -8.8638365e-2 0.20038844 -0.25139870 +v 1.1562530e-2 0.21941217 -0.22272030 +v 0.11141615 0.19864259 -0.19404190 +v 0.19572070 0.14124167 -0.16536349 +v 0.25164156 5.5948183e-2 -0.13668509 +v 0.27656370 -1.4680359e-2 -0.10800668 +v -0.27615549 -0.15729567 -1.74498708 +v -0.28908577 -3.9367838e-2 -1.74508082 +v -0.26537748 7.4614157e-2 -1.71640241 +v -0.19985486 0.17084702 -1.68772401 +v -0.10249312 0.23468017 -1.65904560 +v 1.1885279e-2 0.25639559 -1.63036720 +v 0.12586727 0.23268730 -1.60168880 +v 0.22210014 0.16716467 -1.57301039 +v 0.28593329 6.9802941e-2 -1.54433199 +v 0.30764870 -4.4575461e-2 -1.51565358 +v 0.28394042 -0.15855746 -1.48697518 +v 0.21841779 -0.25479032 -1.45829677 +v 0.12105606 -0.31862347 -1.42961837 +v 6.6776563e-3 -0.34033889 -1.40093996 +v -0.10730434 -0.31663060 -1.37226156 +v -0.20353720 -0.25110797 -1.34358315 +v -0.26737035 -0.15374624 -1.31490475 +v -0.28908577 -3.9367838e-2 -1.28622635 +v -0.26537748 7.4614157e-2 -1.25754794 +v -0.19985486 0.17084702 -1.22886954 +v -0.10249312 0.23468017 -1.20019113 +v 1.1885279e-2 0.25639559 -1.17151273 +v 0.12586727 0.23268730 -1.14283432 +v 0.22210014 0.16716467 -1.11415592 +v 0.28593329 6.9802941e-2 -1.08547751 +v 0.30764870 -4.4575461e-2 -1.05679911 +v 0.28394042 -0.15855746 -1.02812070 +v 0.21841779 -0.25479032 -0.99944230 +v 0.12105606 -0.31862347 -0.97076390 +v 6.6776563e-3 -0.34033889 -0.94208549 +v -0.10730434 -0.31663060 -0.91340709 +v -0.20353720 -0.25110797 -0.88472868 +v -0.26737035 -0.15374624 -0.85605028 +v -0.28908577 -3.9367838e-2 -0.82737187 +v -0.26537748 7.4614157e-2 -0.79869347 +v -0.19985486 0.17084702 -0.77001506 +v -0.10249312 0.23468017 -0.74133666 +v 1.1885279e-2 0.25639559 -0.71265826 +v 0.12586727 0.23268730 -0.68397985 +v 0.22210014 0.16716467 -0.65530145 +v 0.28593329 6.9802941e-2 -0.62662304 +v 0.30764870 -4.4575461e-2 -0.59794464 +v 0.28394042 -0.15855746 -0.56926623 +v 0.21841779 -0.25479032 -0.54058783 +v 0.12105606 -0.31862347 -0.51190942 +v 6.6776563e-3 -0.34033889 -0.48323102 +v -0.10730434 -0.31663060 -0.45455261 +v -0.20353720 -0.25110797 -0.42587421 +v -0.26737035 -0.15374624 -0.39719581 +v -0.28908577 -3.9367838e-2 -0.36851740 +v -0.26537748 7.4614157e-2 -0.33983900 +v -0.19985486 0.17084702 -0.31116059 +v -0.10249312 0.23468017 -0.28248219 +v 1.1885279e-2 0.25639559 -0.25380378 +v 0.12586727 0.23268730 -0.22512538 +v 0.22210014 0.16716467 -0.19644697 +v 0.28593329 6.9802941e-2 -0.16776857 +v 0.31084090 -2.8571019e-2 -0.13909016 +v -0.30782020 -0.17008904 -1.75353155 +v -0.33271068 -3.8987129e-2 -1.75599589 +v -0.30553595 9.1660416e-2 -1.72731748 +v -0.23043312 0.20196369 -1.69863908 +v -0.11883592 0.27513002 -1.66996067 +v 1.2265988e-2 0.30002050 -1.64128227 +v 0.14291353 0.27284577 -1.61260386 +v 0.25321681 0.19774294 -1.58392546 +v 0.32638314 8.6145741e-2 -1.55524705 +v 0.35127361 -4.4956170e-2 -1.52656865 +v 0.32409889 -0.17560372 -1.49789025 +v 0.24899606 -0.28590699 -1.46921184 +v 0.13739886 -0.35907332 -1.44053344 +v 6.2969475e-3 -0.38396380 -1.41185503 +v -0.12435060 -0.35678907 -1.38317663 +v -0.23465387 -0.28168624 -1.35449822 +v -0.30782020 -0.17008904 -1.32581982 +v -0.33271068 -3.8987129e-2 -1.29714141 +v -0.30553595 9.1660416e-2 -1.26846301 +v -0.23043312 0.20196369 -1.23978460 +v -0.11883592 0.27513002 -1.21110620 +v 1.2265988e-2 0.30002050 -1.18242780 +v 0.14291353 0.27284577 -1.15374939 +v 0.25321681 0.19774294 -1.12507099 +v 0.32638314 8.6145741e-2 -1.09639258 +v 0.35127361 -4.4956170e-2 -1.06771418 +v 0.32409889 -0.17560372 -1.03903577 +v 0.24899606 -0.28590699 -1.01035737 +v 0.13739886 -0.35907332 -0.98167896 +v 6.2969475e-3 -0.38396380 -0.95300056 +v -0.12435060 -0.35678907 -0.92432215 +v -0.23465387 -0.28168624 -0.89564375 +v -0.30782020 -0.17008904 -0.86696535 +v -0.33271068 -3.8987129e-2 -0.83828694 +v -0.30553595 9.1660416e-2 -0.80960854 +v -0.23043312 0.20196369 -0.78093013 +v -0.11883592 0.27513002 -0.75225173 +v 1.2265988e-2 0.30002050 -0.72357332 +v 0.14291353 0.27284577 -0.69489492 +v 0.25321681 0.19774294 -0.66621651 +v 0.32638314 8.6145741e-2 -0.63753811 +v 0.35127361 -4.4956170e-2 -0.60885970 +v 0.32409889 -0.17560372 -0.58018130 +v 0.24899606 -0.28590699 -0.55150290 +v 0.13739886 -0.35907332 -0.52282449 +v 6.2969475e-3 -0.38396380 -0.49414609 +v -0.12435060 -0.35678907 -0.46546768 +v -0.23465387 -0.28168624 -0.43678928 +v -0.30782020 -0.17008904 -0.40811087 +v -0.33271068 -3.8987129e-2 -0.37943247 +v -0.30553595 9.1660416e-2 -0.35075406 +v -0.23043312 0.20196369 -0.32207566 +v -0.11883592 0.27513002 -0.29339726 +v 1.2265988e-2 0.30002050 -0.26471885 +v 0.14291353 0.27284577 -0.23604045 +v 0.25321681 0.19774294 -0.20736204 +v 0.32638314 8.6145741e-2 -0.17868364 +v 0.35127361 -4.4956170e-2 -0.15000523 +v -0.33948491 -0.18288241 -1.74498708 +v -0.37633559 -3.8606421e-2 -1.74508082 +v -0.34569442 0.10870667 -1.71640241 +v -0.26101139 0.23308036 -1.68772401 +v -0.13517872 0.31557987 -1.65904560 +v 1.2646697e-2 0.34364541 -1.63036720 +v 0.15995979 0.31300424 -1.60168880 +v 0.28433348 0.22832121 -1.57301039 +v 0.36683299 0.10248854 -1.54433199 +v 0.39489852 -4.5336879e-2 -1.51565358 +v 0.36425736 -0.19264997 -1.48697518 +v 0.27957433 -0.31702366 -1.45829677 +v 0.15374166 -0.39952317 -1.42961837 +v 5.9162387e-3 -0.42758870 -1.40093996 +v -0.14139686 -0.39694754 -1.37226156 +v -0.26577054 -0.31226451 -1.34358315 +v -0.34827005 -0.18643184 -1.31490475 +v -0.37633559 -3.8606421e-2 -1.28622635 +v -0.34569442 0.10870667 -1.25754794 +v -0.26101139 0.23308036 -1.22886954 +v -0.13517872 0.31557987 -1.20019113 +v 1.2646697e-2 0.34364541 -1.17151273 +v 0.15995979 0.31300424 -1.14283432 +v 0.28433348 0.22832121 -1.11415592 +v 0.36683299 0.10248854 -1.08547751 +v 0.39489852 -4.5336879e-2 -1.05679911 +v 0.36425736 -0.19264997 -1.02812070 +v 0.27957433 -0.31702366 -0.99944230 +v 0.15374166 -0.39952317 -0.97076390 +v 5.9162387e-3 -0.42758870 -0.94208549 +v -0.14139686 -0.39694754 -0.91340709 +v -0.26577054 -0.31226451 -0.88472868 +v -0.34827005 -0.18643184 -0.85605028 +v -0.37633559 -3.8606421e-2 -0.82737187 +v -0.34569442 0.10870667 -0.79869347 +v -0.26101139 0.23308036 -0.77001506 +v -0.13517872 0.31557987 -0.74133666 +v 1.2646697e-2 0.34364541 -0.71265826 +v 0.15995979 0.31300424 -0.68397985 +v 0.28433348 0.22832121 -0.65530145 +v 0.36683299 0.10248854 -0.62662304 +v 0.39489852 -4.5336879e-2 -0.59794464 +v 0.36425736 -0.19264997 -0.56926623 +v 0.27957433 -0.31702366 -0.54058783 +v 0.15374166 -0.39952317 -0.51190942 +v 5.9162387e-3 -0.42758870 -0.48323102 +v -0.14139686 -0.39694754 -0.45455261 +v -0.26577054 -0.31226451 -0.42587421 +v -0.34827005 -0.18643184 -0.39719581 +v -0.37633559 -3.8606421e-2 -0.36851740 +v -0.34569442 0.10870667 -0.33983900 +v -0.26101139 0.23308036 -0.31116059 +v -0.13517872 0.31557987 -0.28248219 +v 1.2646697e-2 0.34364541 -0.25380378 +v 0.15995979 0.31300424 -0.22512538 +v 0.28433348 0.22832121 -0.19644697 +v 0.36683299 0.10248854 -0.16776857 +v 0.39170633 -6.1341321e-2 -0.13909016 +v -0.36632896 -0.19372811 -1.72065449 +v -0.41331900 -3.8283671e-2 -1.71399733 +v -0.37973913 0.12315780 -1.68531893 +v -0.28693439 0.25945980 -1.65664053 +v -0.14903348 0.34987160 -1.62796212 +v 1.2969446e-2 0.38062882 -1.59928372 +v 0.17441091 0.34704894 -1.57060531 +v 0.31071292 0.25424421 -1.54192691 +v 0.40112472 0.11634330 -1.51324850 +v 0.43188194 -4.5659628e-2 -1.48457010 +v 0.39830206 -0.20710109 -1.45589169 +v 0.30549733 -0.34340310 -1.42721329 +v 0.16759642 -0.43381490 -1.39853488 +v 5.5934893e-3 -0.46457212 -1.36985648 +v -0.15584798 -0.43099224 -1.34117808 +v -0.29214998 -0.33818751 -1.31249967 +v -0.38256178 -0.20028660 -1.28382127 +v -0.41331900 -3.8283671e-2 -1.25514286 +v -0.37973913 0.12315780 -1.22646446 +v -0.28693439 0.25945980 -1.19778605 +v -0.14903348 0.34987160 -1.16910765 +v 1.2969446e-2 0.38062882 -1.14042924 +v 0.17441091 0.34704894 -1.11175084 +v 0.31071292 0.25424421 -1.08307244 +v 0.40112472 0.11634330 -1.05439403 +v 0.43188194 -4.5659628e-2 -1.02571563 +v 0.39830206 -0.20710109 -0.99703722 +v 0.30549733 -0.34340310 -0.96835882 +v 0.16759642 -0.43381490 -0.93968041 +v 5.5934893e-3 -0.46457212 -0.91100201 +v -0.15584798 -0.43099224 -0.88232360 +v -0.29214998 -0.33818751 -0.85364520 +v -0.38256178 -0.20028660 -0.82496679 +v -0.41331900 -3.8283671e-2 -0.79628839 +v -0.37973913 0.12315780 -0.76760999 +v -0.28693439 0.25945980 -0.73893158 +v -0.14903348 0.34987160 -0.71025318 +v 1.2969446e-2 0.38062882 -0.68157477 +v 0.17441091 0.34704894 -0.65289637 +v 0.31071292 0.25424421 -0.62421796 +v 0.40112472 0.11634330 -0.59553956 +v 0.43188194 -4.5659628e-2 -0.56686115 +v 0.39830206 -0.20710109 -0.53818275 +v 0.30549733 -0.34340310 -0.50950434 +v 0.16759642 -0.43381490 -0.48082594 +v 5.5934893e-3 -0.46457212 -0.45214754 +v -0.15584798 -0.43099224 -0.42346913 +v -0.29214998 -0.33818751 -0.39479073 +v -0.38256178 -0.20028660 -0.36611232 +v -0.41331900 -3.8283671e-2 -0.33743392 +v -0.37973913 0.12315780 -0.30875551 +v -0.28693439 0.25945980 -0.28007711 +v -0.14903348 0.34987160 -0.25139870 +v 1.2969446e-2 0.38062882 -0.22272030 +v 0.17441091 0.34704894 -0.19404190 +v 0.31071292 0.25424421 -0.16536349 +v 0.40112472 0.11634330 -0.13668509 +v 0.42598353 -7.5231981e-2 -0.10800668 +v -0.38426557 -0.20097497 -1.68423821 +v -0.43803053 -3.8068017e-2 -1.66747761 +v -0.40248707 0.13281373 -1.63879921 +v -0.30425559 0.27708598 -1.61012081 +v -0.15829094 0.37278460 -1.58144240 +v 1.3185100e-2 0.40534034 -1.55276400 +v 0.18406684 0.36979689 -1.52408559 +v 0.32833910 0.27156541 -1.49540719 +v 0.42403772 0.12560075 -1.46672878 +v 0.45659346 -4.5875282e-2 -1.43805038 +v 0.42105001 -0.21675703 -1.40937197 +v 0.32281853 -0.36102928 -1.38069357 +v 0.17685387 -0.45672790 -1.35201516 +v 5.3778351e-3 -0.48928364 -1.32333676 +v -0.16550391 -0.45374019 -1.29465836 +v -0.30977616 -0.35550871 -1.26597995 +v -0.40547478 -0.20954405 -1.23730155 +v -0.43803053 -3.8068017e-2 -1.20862314 +v -0.40248707 0.13281373 -1.17994474 +v -0.30425559 0.27708598 -1.15126633 +v -0.15829094 0.37278460 -1.12258793 +v 1.3185100e-2 0.40534034 -1.09390952 +v 0.18406684 0.36979689 -1.06523112 +v 0.32833910 0.27156541 -1.03655272 +v 0.42403772 0.12560075 -1.00787431 +v 0.45659346 -4.5875282e-2 -0.97919591 +v 0.42105001 -0.21675703 -0.95051750 +v 0.32281853 -0.36102928 -0.92183910 +v 0.17685387 -0.45672790 -0.89316069 +v 5.3778351e-3 -0.48928364 -0.86448229 +v -0.16550391 -0.45374019 -0.83580388 +v -0.30977616 -0.35550871 -0.80712548 +v -0.40547478 -0.20954405 -0.77844707 +v -0.43803053 -3.8068017e-2 -0.74976867 +v -0.40248707 0.13281373 -0.72109027 +v -0.30425559 0.27708598 -0.69241186 +v -0.15829094 0.37278460 -0.66373346 +v 1.3185100e-2 0.40534034 -0.63505505 +v 0.18406684 0.36979689 -0.60637665 +v 0.32833910 0.27156541 -0.57769824 +v 0.42403772 0.12560075 -0.54901984 +v 0.45659346 -4.5875282e-2 -0.52034143 +v 0.42105001 -0.21675703 -0.49166303 +v 0.32281853 -0.36102928 -0.46298462 +v 0.17685387 -0.45672790 -0.43430622 +v 5.3778351e-3 -0.48928364 -0.40562782 +v -0.16550391 -0.45374019 -0.37694941 +v -0.30977616 -0.35550871 -0.34827101 +v -0.40547478 -0.20954405 -0.31959260 +v -0.43803053 -3.8068017e-2 -0.29091420 +v -0.40248707 0.13281373 -0.26223579 +v -0.30425559 0.27708598 -0.23355739 +v -0.15829094 0.37278460 -0.20487898 +v 1.3185100e-2 0.40534034 -0.17620058 +v 0.18406684 0.36979689 -0.14752217 +v 0.32833910 0.27156541 -0.11884377 +v 0.42403772 0.12560075 -9.0165366e-2 +v 0.44888682 -8.4513424e-2 -6.1486961e-2 +v 0.33526905 -0.22200780 -6.6132100e-3 +v 0.33180043 -0.21405331 4.8260541e-2 +v 0.32192263 -0.19140082 9.4780261e-2 +v 0.30713946 -0.15749898 0.12586374 +v 0.28970152 -0.11750904 0.13677881 +v 0.27226358 -7.7519089e-2 0.12586374 +v 0.25748040 -4.3617249e-2 9.4780261e-2 +v 0.24760260 -2.0964764e-2 4.8260541e-2 +v 0.24413398 -1.3010269e-2 -6.6132100e-3 +v 0.24760260 -2.0964764e-2 -6.1486961e-2 +v 0.25748040 -4.3617249e-2 -0.10800668 +v 0.27226358 -7.7519089e-2 -0.13909016 +v 0.28970152 -0.11750904 -0.15000523 +v 0.30713946 -0.15749898 -0.13909016 +v 0.32192263 -0.19140082 -0.10800668 +v 0.33180043 -0.21405331 -6.1486961e-2 +v 0.16578072 -0.28630353 6.3535988e-2 +v 0.18705281 -0.26145602 0.10844182 +v 0.20296226 -0.22384674 0.14171676 +v 0.21108700 -0.17920136 0.15829501 +v 0.21019011 -0.13431673 0.15565267 +v 0.20040813 -9.6026128e-2 0.13419203 +v 0.18323028 -7.0158958e-2 9.7180258e-2 +v 0.16127174 -6.0653257e-2 5.0252074e-2 +v 0.13787549 -6.8956183e-2 5.5186416e-4 +v 0.11660340 -9.3803691e-2 -4.4353965e-2 +v 0.10069395 -0.13141297 -7.7628907e-2 +v 9.2569216e-2 -0.17605836 -9.4207155e-2 +v 9.3466109e-2 -0.22094299 -9.1564820e-2 +v 0.10324809 -0.25923359 -7.0104174e-2 +v 0.12042593 -0.28510076 -3.3092406e-2 +v 0.14238447 -0.29460646 1.3835779e-2 +v 3.0405239e-2 -0.27930563 0.13434760 +v 5.9450656e-2 -0.25307814 0.17378003 +v 8.5318928e-2 -0.21523236 0.19972843 +v 0.10407185 -0.17152995 0.20824238 +v 0.11285445 -0.12862421 0.19802572 +v 0.11032966 -9.3047161e-2 0.17063383 +v 9.6881861e-2 -7.0215077e-2 0.13023690 +v 7.4558356e-2 -6.3603938e-2 8.2984972e-2 +v 4.6757696e-2 -7.4220230e-2 3.6071738e-2 +v 1.7712279e-2 -0.10044772 -3.3606915e-3 +v -8.1559931e-3 -0.13829351 -2.9309086e-2 +v -2.6908910e-2 -0.18199592 -3.7823039e-2 +v -3.5691511e-2 -0.22490165 -2.7606376e-2 +v -3.3166725e-2 -0.26047870 -2.1449332e-4 +v -1.9718926e-2 -0.28331079 4.0182444e-2 +v 2.6045792e-3 -0.28992193 8.7434368e-2 +v -2.4955134e-2 -0.20252918 0.16211294 +v 1.8255373e-2 -0.18427904 0.19188236 +v 5.6497789e-2 -0.15299521 0.21014790 +v 8.3950052e-2 -0.11344037 0.21412880 +v 9.6432805e-2 -7.1636377e-2 0.20321900 +v 9.2045662e-2 -3.3947521e-2 0.17907941 +v 7.1456525e-2 -6.1115838e-3 0.14538508 +v 3.7799905e-2 7.6336651e-3 0.10726566 +v -3.8002850e-3 5.1956363e-3 7.0524483e-2 +v -4.7010792e-2 -1.3054502e-2 4.0755061e-2 +v -8.5253207e-2 -4.4338333e-2 2.2489519e-2 +v -0.11270547 -8.3893176e-2 1.8508622e-2 +v -0.12518822 -0.12569716 2.9418424e-2 +v -0.12080108 -0.16338602 5.3558007e-2 +v -0.10021194 -0.19122196 8.7252338e-2 +v -6.6555323e-2 -0.20496721 0.12537176 +v -2.7132037e-2 -0.12221492 0.27267948 +v 2.6938801e-2 -0.11162388 0.27979342 +v 7.2908778e-2 -8.5937816e-2 0.28112680 +v 0.10377938 -4.9067207e-2 0.27647664 +v 0.11485084 -6.6252671e-3 0.26655087 +v 0.10443762 3.4926603e-2 0.25286060 +v 7.4125053e-2 6.9262509e-2 0.23749006 +v 2.8527942e-2 9.1155119e-2 0.22277926 +v -2.5972915e-2 8.3676844e-2 0.20829799 +v -7.7372641e-2 7.5374044e-2 0.20385386 +v -0.12545278 6.0994375e-2 0.20252048 +v -0.15632338 2.4123766e-2 0.20717064 +v -0.16739484 -1.8318174e-2 0.21709641 +v -0.15698162 -5.9870044e-2 0.23078668 +v -0.12666905 -9.4205950e-2 0.24615722 +v -8.1071943e-2 -0.11609856 0.26086802 +v -0.11742062 -7.7474545e-2 0.35942340 +v -0.11660911 1.5515281e-2 0.35942340 +v -5.0281546e-2 8.0695193e-2 0.35942340 +v 4.2708280e-2 7.9883683e-2 0.35942340 +v 0.10788819 1.3556122e-2 0.35942340 +v 0.10707668 -7.9433703e-2 0.35942340 +v 4.0749122e-2 -0.14461362 0.35942340 +v -5.2240704e-2 -0.14380211 0.35942340 +v -8.3445326e-2 4.8105237e-2 0.35942340 +v -3.7866330e-3 8.0289438e-2 0.35942340 +v 7.5298236e-2 4.6719903e-2 0.35942340 +v 0.10748244 -3.2938790e-2 0.35942340 +v 7.3912902e-2 -0.11202366 0.35942340 +v -5.7457913e-3 -0.14420786 0.35942340 +v -8.4830660e-2 -0.11063833 0.35942340 +v -0.11701486 -3.0979632e-2 0.35942340 +v -0.38895890 -0.20287120 -1.61938764 +v -0.38895890 -0.20287120 -1.66317689 +v -0.37660627 -0.19788042 -1.57893165 +v -0.35378158 -0.18865864 -1.54796797 +v -0.32395969 -0.17660982 -1.53121055 +v -0.29168071 -0.16356826 -1.53121055 +v -0.26185882 -0.15151944 -1.54796797 +v -0.23903413 -0.14229767 -1.57893165 +v -0.22668150 -0.13730688 -1.61938764 +v -0.22668150 -0.13730688 -1.66317689 +v -0.23903413 -0.14229767 -1.70363289 +v -0.26185882 -0.15151944 -1.73459657 +v -0.29168071 -0.16356826 -1.75135399 +v -0.32395969 -0.17660982 -1.75135399 +v -0.35378158 -0.18865864 -1.73459657 +v -0.37660627 -0.19788042 -1.70363289 +v -0.23399579 -0.35281087 -1.64128227 +v -0.44236929 -3.8030153e-2 -1.58516699 +v -0.42567476 -3.8175844e-2 -1.53447025 +v -0.39482729 -3.8445046e-2 -1.49566865 +v -0.35452313 -3.8796775e-2 -1.47466937 +v -0.31089822 -3.9177484e-2 -1.47466937 +v -0.27059406 -3.9529213e-2 -1.49566865 +v -0.23974659 -3.9798415e-2 -1.53447025 +v -0.22305206 -3.9944106e-2 -1.58516699 +v -0.22305206 -3.9944106e-2 -1.64004074 +v -0.23974659 -3.9798415e-2 -1.69073747 +v -0.27059406 -3.9529213e-2 -1.72953908 +v -0.31089822 -3.9177484e-2 -1.75053835 +v -0.35452313 -3.8796775e-2 -1.75053835 +v -0.39482729 -3.8445046e-2 -1.72953908 +v -0.42567476 -3.8175844e-2 -1.69073747 +v -0.44236929 -3.8030153e-2 -1.64004074 +v -0.20645388 -0.11344632 0.35942340 +v -0.20500102 5.3035421e-2 0.35942340 +v -8.6253320e-2 0.16972846 0.35942340 +v 8.0228420e-2 0.16827559 0.35942340 +v 0.19692146 4.9527897e-2 0.35942340 +v 0.19546859 -0.11695384 0.35942340 +v 7.6720896e-2 -0.23364688 0.35942340 +v -8.9760844e-2 -0.23219402 0.35942340 +v 5.0900699e-2 -0.27156892 2.28931823 +v -6.4606411e-2 -0.27056090 2.28931823 +v -6.4606411e-2 -0.27056090 0.40071224 +v 5.0900699e-2 -0.27156892 0.40071224 +v 0.23484350 2.3707700e-2 2.28931823 +v 0.23383548 -9.1799410e-2 2.28931823 +v 0.23383548 -9.1799410e-2 0.40071224 +v 0.23484350 2.3707700e-2 0.40071224 +v -0.13483341 -0.24075131 2.28931823 +v -0.21579650 -0.15836268 2.28931823 +v -0.21579650 -0.15836268 0.40071224 +v -0.13483341 -0.24075131 0.40071224 +v 0.12530099 0.17683289 2.28931823 +v 0.20626407 9.4444253e-2 2.28931823 +v 0.20626407 9.4444253e-2 0.40071224 +v 0.12530099 0.17683289 0.40071224 +v -0.21355831 9.8107988e-2 2.28931823 +v -0.13116968 0.17907107 2.28931823 +v -0.13116968 0.17907107 0.40071224 +v -0.21355831 9.8107988e-2 0.40071224 +v -0.20186957 5.1706201e-2 2.33060707 +v -0.20329972 -0.11217195 2.33060707 +v -8.8431625e-2 -0.22906257 2.33060707 +v 7.5446530e-2 -0.23049271 2.33060707 +v 0.19233715 -0.11562462 2.33060707 +v 0.19376729 4.8253531e-2 2.33060707 +v 7.8899200e-2 0.16514415 2.33060707 +v -8.4978954e-2 0.16657429 2.33060707 +v -6.0433123e-2 0.20765050 2.28931823 +v 5.5073987e-2 0.20664248 2.28931823 +v 5.5073987e-2 0.20664248 0.40071224 +v -6.0433123e-2 0.20765050 0.40071224 +v -0.24437592 -8.7626123e-2 2.28931823 +v -0.24336790 2.7880988e-2 2.28931823 +v -0.24336790 2.7880988e-2 0.40071224 +v -0.24437592 -8.7626123e-2 0.40071224 +v 0.20402589 -0.16202641 2.28931823 +v 0.12163725 -0.24298950 2.28931823 +v 0.12163725 -0.24298950 0.40071224 +v 0.20402589 -0.16202641 0.40071224 +vt 0.0000000e+0 0.72038776 +vt 0.0000000e+0 0.98261599 +vt 0.0000000e+0 1.00000000 +vt 7.2164497e-16 0.73777178 +vt 8.0491169e-16 0.93891128 +vt 9.7144515e-16 0.85150188 +vt 1.0547119e-15 0.95629530 +vt 1.3322676e-15 0.82518119 +vt 1.3600232e-15 0.98261599 +vt 1.3877788e-15 0.69406707 +vt 1.4988011e-15 0.80779717 +vt 1.7486013e-15 0.78147648 +vt 1.7486013e-15 0.86888589 +vt 1.7763568e-15 0.76409247 +vt 2.0261570e-15 0.91259059 +vt 2.1926905e-15 0.67668306 +vt 2.4980018e-15 0.65036237 +vt 2.6922908e-15 0.89520658 +vt 1.7580520e-2 0.32018496 +vt 1.7580520e-2 0.32018496 +vt 1.7580520e-2 0.32018496 +vt 2.3246272e-2 0.29177904 +vt 2.3474440e-2 0.32023640 +vt 2.3474440e-2 0.32023640 +vt 2.3474440e-2 0.32023640 +vt 2.3474440e-2 0.32023640 +vt 2.3474440e-2 0.32023640 +vt 2.3474440e-2 0.32023640 +vt 2.8708913e-2 0.29399275 +vt 2.8708913e-2 0.29399275 +vt 4.0121867e-2 0.43891366 +vt 4.0121867e-2 0.43891366 +vt 4.0121867e-2 0.43891366 +vt 4.0121867e-2 0.43891366 +vt 4.0258906e-2 0.32038287 +vt 4.0258906e-2 0.32038287 +vt 4.0258906e-2 0.32038287 +vt 4.0258906e-2 0.32038287 +vt 4.0258906e-2 0.32038287 +vt 4.0258906e-2 0.32038287 +vt 4.2190536e-2 0.20186775 +vt 4.2190536e-2 0.20186775 +vt 4.2190536e-2 0.20186775 +vt 4.4265197e-2 0.30029685 +vt 4.4265197e-2 0.30029685 +vt 4.5586823e-2 0.43670567 +vt 4.5586823e-2 0.43670567 +vt 4.5586823e-2 0.43670567 +vt 4.5586823e-2 0.43670567 +vt 4.5586823e-2 0.43670567 +vt 4.5586823e-2 0.43670567 +vt 4.5586823e-2 0.43670567 +vt 4.5586823e-2 0.43670567 +vt 4.7616125e-2 0.20417077 +vt 4.7616125e-2 0.20417077 +vt 4.7616125e-2 0.20417077 +vt 4.7616125e-2 0.20417077 +vt 4.7616125e-2 0.20417077 +vt 4.7616125e-2 0.20417077 +vt 6.1149701e-2 0.43041786 +vt 6.1149701e-2 0.43041786 +vt 6.1149701e-2 0.43041786 +vt 6.1149701e-2 0.43041786 +vt 6.1149701e-2 0.43041786 +vt 6.1149701e-2 0.43041786 +vt 6.1149701e-2 0.43041786 +vt 6.1149701e-2 0.43041786 +vt 6.3066895e-2 0.21072924 +vt 6.3066895e-2 0.21072924 +vt 6.3066895e-2 0.21072924 +vt 6.3066895e-2 0.21072924 +vt 6.3066895e-2 0.21072924 +vt 6.3066895e-2 0.21072924 +vt 6.5378633e-2 0.32060209 +vt 6.5378633e-2 0.32060209 +vt 6.5378633e-2 0.32060209 +vt 6.5378633e-2 0.32060209 +vt 6.5378633e-2 0.32060209 +vt 6.5378633e-2 0.32060209 +vt 6.7546822e-2 0.30973161 +vt 6.7546822e-2 0.30973161 +vt 8.4441193e-2 0.42100749 +vt 8.4441193e-2 0.42100749 +vt 8.4441193e-2 0.42100749 +vt 8.4441193e-2 0.42100749 +vt 8.4441193e-2 0.42100749 +vt 8.4441193e-2 0.42100749 +vt 8.4441193e-2 0.42100749 +vt 8.4441193e-2 0.42100749 +vt 8.6190606e-2 0.22054467 +vt 8.6190606e-2 0.22054467 +vt 8.6190606e-2 0.22054467 +vt 8.6190606e-2 0.22054467 +vt 8.6190606e-2 0.22054467 +vt 8.6190606e-2 0.22054467 +vt 9.5009372e-2 0.32086067 +vt 9.5009372e-2 0.32086067 +vt 9.5009372e-2 0.32086067 +vt 9.5009372e-2 0.32086067 +vt 9.5009372e-2 0.32086067 +vt 9.5009372e-2 0.32086067 +vt 9.5009372e-2 0.32086067 +vt 9.5009372e-2 0.32086067 +vt 0.10587993 0.20060436 +vt 0.10638286 0.53997847 +vt 0.10638286 0.53997847 +vt 0.10638286 0.53997847 +vt 0.10638286 0.53997847 +vt 0.10823587 0.20600718 +vt 0.10823587 0.20600718 +vt 0.11020526 0.10197474 +vt 0.11020526 0.10197474 +vt 0.11020526 0.10197474 +vt 0.11058686 0.53584721 +vt 0.11058686 0.53584721 +vt 0.11058686 0.53584721 +vt 0.11058686 0.53584721 +vt 0.11058686 0.53584721 +vt 0.11058686 0.53584721 +vt 0.11058686 0.53584721 +vt 0.11058686 0.53584721 +vt 0.11191538 0.40990719 +vt 0.11191538 0.40990719 +vt 0.11191538 0.40990719 +vt 0.11191538 0.40990719 +vt 0.11191538 0.40990719 +vt 0.11191538 0.40990719 +vt 0.11191538 0.40990719 +vt 0.11191538 0.40990719 +vt 0.11346688 0.23212276 +vt 0.11346688 0.23212276 +vt 0.11346688 0.23212276 +vt 0.11346688 0.23212276 +vt 0.11346688 0.23212276 +vt 0.11346688 0.23212276 +vt 0.11433652 0.10617874 +vt 0.11433652 0.10617874 +vt 0.11433652 0.10617874 +vt 0.11433652 0.10617874 +vt 0.11433652 0.10617874 +vt 0.11433652 0.10617874 +vt 0.11494503 0.22139311 +vt 0.11494503 0.22139311 +vt 0.12247192 0.33198973 +vt 0.12247192 0.33198973 +vt 0.12255885 0.52408237 +vt 0.12255885 0.52408237 +vt 0.12255885 0.52408237 +vt 0.12255885 0.52408237 +vt 0.12255885 0.52408237 +vt 0.12255885 0.52408237 +vt 0.12255885 0.52408237 +vt 0.12255885 0.52408237 +vt 0.12464011 0.32111926 +vt 0.12464011 0.32111926 +vt 0.12464011 0.32111926 +vt 0.12464011 0.32111926 +vt 0.12464011 0.32111926 +vt 0.12498600 0.24441979 +vt 0.12498600 0.24441979 +vt 0.12610136 0.11815073 +vt 0.12610136 0.11815073 +vt 0.12610136 0.11815073 +vt 0.12610136 0.11815073 +vt 0.12610136 0.11815073 +vt 0.12610136 0.11815073 +vt 0.13683013 0.27158160 +vt 0.13683013 0.27158160 +vt 0.13938957 0.39880690 +vt 0.13938957 0.39880690 +vt 0.13938957 0.39880690 +vt 0.13938957 0.39880690 +vt 0.13938957 0.39880690 +vt 0.13938957 0.39880690 +vt 0.13938957 0.39880690 +vt 0.13938957 0.39880690 +vt 0.14047619 0.50647505 +vt 0.14047619 0.50647505 +vt 0.14047619 0.50647505 +vt 0.14047619 0.50647505 +vt 0.14047619 0.50647505 +vt 0.14047619 0.50647505 +vt 0.14047619 0.50647505 +vt 0.14047619 0.50647505 +vt 0.14074316 0.24370086 +vt 0.14074316 0.24370086 +vt 0.14074316 0.24370086 +vt 0.14074316 0.24370086 +vt 0.14074316 0.24370086 +vt 0.14074316 0.24370086 +vt 0.14370868 0.13606807 +vt 0.14370868 0.13606807 +vt 0.14370868 0.13606807 +vt 0.14370868 0.13606807 +vt 0.14370868 0.13606807 +vt 0.14370868 0.13606807 +vt 0.14575355 0.34142449 +vt 0.14575355 0.34142449 +vt 0.14867426 0.29874341 +vt 0.14867426 0.29874341 +vt 0.14975984 0.32133847 +vt 0.14975984 0.32133847 +vt 0.14975984 0.32133847 +vt 0.14975984 0.32133847 +vt 0.14975984 0.32133847 +vt 0.14975984 0.32133847 +vt 0.15871523 0.32177009 +vt 0.15871523 0.32177009 +vt 0.16130983 0.34772859 +vt 0.16130983 0.34772859 +vt 0.16161113 0.48570580 +vt 0.16161113 0.48570580 +vt 0.16161113 0.48570580 +vt 0.16161113 0.48570580 +vt 0.16161113 0.48570580 +vt 0.16161113 0.48570580 +vt 0.16161113 0.48570580 +vt 0.16161113 0.48570580 +vt 0.16268106 0.38939653 +vt 0.16268106 0.38939653 +vt 0.16268106 0.38939653 +vt 0.16268106 0.38939653 +vt 0.16268106 0.38939653 +vt 0.16268106 0.38939653 +vt 0.16268106 0.38939653 +vt 0.16268106 0.38939653 +vt 0.16386687 0.25351629 +vt 0.16386687 0.25351629 +vt 0.16386687 0.25351629 +vt 0.16386687 0.25351629 +vt 0.16386687 0.25351629 +vt 0.16386687 0.25351629 +vt 0.16447793 0.15720301 +vt 0.16447793 0.15720301 +vt 0.16447793 0.15720301 +vt 0.16447793 0.15720301 +vt 0.16447793 0.15720301 +vt 0.16447793 0.15720301 +vt 0.16542439 0.33715602 +vt 0.16542439 0.33715602 +vt 0.16654430 0.32148495 +vt 0.16654430 0.32148495 +vt 0.16654430 0.32148495 +vt 0.16654430 0.32148495 +vt 0.16654430 0.32148495 +vt 0.16654430 0.32148495 +vt 0.16677247 0.34994230 +vt 0.16778033 0.34255884 +vt 0.17243822 0.32153638 +vt 0.17243822 0.32153638 +vt 0.17243822 0.32153638 +vt 0.17824394 0.38310872 +vt 0.17824394 0.38310872 +vt 0.17824394 0.38310872 +vt 0.17824394 0.38310872 +vt 0.17824394 0.38310872 +vt 0.17824394 0.38310872 +vt 0.17824394 0.38310872 +vt 0.17824394 0.38310872 +vt 0.17931764 0.26007475 +vt 0.17931764 0.26007475 +vt 0.17931764 0.26007475 +vt 0.17931764 0.26007475 +vt 0.17931764 0.26007475 +vt 0.17931764 0.26007475 +vt 0.18274607 0.46493655 +vt 0.18274607 0.46493655 +vt 0.18274607 0.46493655 +vt 0.18274607 0.46493655 +vt 0.18274607 0.46493655 +vt 0.18274607 0.46493655 +vt 0.18274607 0.46493655 +vt 0.18274607 0.46493655 +vt 0.18370890 0.38090073 +vt 0.18370890 0.38090073 +vt 0.18370890 0.38090073 +vt 0.18370890 0.38090073 +vt 0.18474323 0.26237778 +vt 0.18474323 0.26237778 +vt 0.18474323 0.26237778 +vt 0.18524718 0.17833795 +vt 0.18524718 0.17833795 +vt 0.18524718 0.17833795 +vt 0.18524718 0.17833795 +vt 0.18524718 0.17833795 +vt 0.18524718 0.17833795 +vt 0.19022637 0.22967919 +vt 0.19083555 0.26016555 +vt 0.19574482 0.19935533 +vt 0.19747963 0.28617314 +vt 0.20066341 0.44732923 +vt 0.20066341 0.44732923 +vt 0.20066341 0.44732923 +vt 0.20066341 0.44732923 +vt 0.20066341 0.44732923 +vt 0.20066341 0.44732923 +vt 0.20066341 0.44732923 +vt 0.20066341 0.44732923 +vt 0.20285450 0.19625529 +vt 0.20285450 0.19625529 +vt 0.20285450 0.19625529 +vt 0.20285450 0.19625529 +vt 0.20285450 0.19625529 +vt 0.20285450 0.19625529 +vt 0.20627587 0.60799320 +vt 0.20627587 0.60799320 +vt 0.20627587 0.60799320 +vt 0.20627587 0.60799320 +vt 0.20655077 0.17381050 +vt 0.20857889 0.60256761 +vt 0.20857889 0.60256761 +vt 0.20857889 0.60256761 +vt 0.20857889 0.60256761 +vt 0.20857889 0.60256761 +vt 0.20857889 0.60256761 +vt 0.20857889 0.60256761 +vt 0.20857889 0.60256761 +vt 0.20914710 0.30374253 +vt 0.21127008 3.5713747e-2 +vt 0.21127008 3.5713747e-2 +vt 0.21127008 3.5713747e-2 +vt 0.21263539 0.43556440 +vt 0.21263539 0.43556440 +vt 0.21263539 0.43556440 +vt 0.21263539 0.43556440 +vt 0.21263539 0.43556440 +vt 0.21263539 0.43556440 +vt 0.21263539 0.43556440 +vt 0.21263539 0.43556440 +vt 0.21347806 4.1178703e-2 +vt 0.21347806 4.1178703e-2 +vt 0.21347806 4.1178703e-2 +vt 0.21347806 4.1178703e-2 +vt 0.21347806 4.1178703e-2 +vt 0.21347806 4.1178703e-2 +vt 0.21461933 0.20822727 +vt 0.21461933 0.20822727 +vt 0.21461933 0.20822727 +vt 0.21461933 0.20822727 +vt 0.21461933 0.20822727 +vt 0.21461933 0.20822727 +vt 0.21513736 0.58711684 +vt 0.21513736 0.58711684 +vt 0.21513736 0.58711684 +vt 0.21513736 0.58711684 +vt 0.21513736 0.58711684 +vt 0.21513736 0.58711684 +vt 0.21513736 0.58711684 +vt 0.21513736 0.58711684 +vt 0.21683939 0.43143314 +vt 0.21683939 0.43143314 +vt 0.21683939 0.43143314 +vt 0.21683939 0.43143314 +vt 0.21875059 0.21243127 +vt 0.21875059 0.21243127 +vt 0.21875059 0.21243127 +vt 0.21976587 5.6741581e-2 +vt 0.21976587 5.6741581e-2 +vt 0.21976587 5.6741581e-2 +vt 0.21976587 5.6741581e-2 +vt 0.21976587 5.6741581e-2 +vt 0.21976587 5.6741581e-2 +vt 0.22099912 0.15693367 +vt 0.22406169 0.31019896 +vt 0.22495279 0.56399313 +vt 0.22495279 0.56399313 +vt 0.22495279 0.56399313 +vt 0.22495279 0.56399313 +vt 0.22495279 0.56399313 +vt 0.22495279 0.56399313 +vt 0.22495279 0.56399313 +vt 0.22495279 0.56399313 +vt 0.22917625 8.0033073e-2 +vt 0.22917625 8.0033073e-2 +vt 0.22917625 8.0033073e-2 +vt 0.22917625 8.0033073e-2 +vt 0.22917625 8.0033073e-2 +vt 0.22917625 8.0033073e-2 +vt 0.23653088 0.53671685 +vt 0.23653088 0.53671685 +vt 0.23653088 0.53671685 +vt 0.23653088 0.53671685 +vt 0.23653088 0.53671685 +vt 0.23653088 0.53671685 +vt 0.23653088 0.53671685 +vt 0.23653088 0.53671685 +vt 0.23689023 0.15129419 +vt 0.23995280 0.30455948 +vt 0.24027654 0.10750726 +vt 0.24027654 0.10750726 +vt 0.24027654 0.10750726 +vt 0.24027654 0.10750726 +vt 0.24027654 0.10750726 +vt 0.24027654 0.10750726 +vt 0.24810898 0.50944057 +vt 0.24810898 0.50944057 +vt 0.24810898 0.50944057 +vt 0.24810898 0.50944057 +vt 0.24810898 0.50944057 +vt 0.24810898 0.50944057 +vt 0.24810898 0.50944057 +vt 0.24810898 0.50944057 +vt 0.25137683 0.13498145 +vt 0.25137683 0.13498145 +vt 0.25137683 0.13498145 +vt 0.25137683 0.13498145 +vt 0.25137683 0.13498145 +vt 0.25137683 0.13498145 +vt 0.25180482 0.15775061 +vt 0.25440115 0.28768265 +vt 0.25559152 0.34689564 +vt 0.25694750 0.26403199 +vt 0.25792441 0.48631686 +vt 0.25792441 0.48631686 +vt 0.25792441 0.48631686 +vt 0.25792441 0.48631686 +vt 0.25792441 0.48631686 +vt 0.25792441 0.48631686 +vt 0.25792441 0.48631686 +vt 0.25792441 0.48631686 +vt 0.25866237 0.28819650 +vt 0.26032066 0.36060316 +vt 0.26059625 0.32902307 +vt 0.26078720 0.15827294 +vt 0.26078720 0.15827294 +vt 0.26078720 0.15827294 +vt 0.26078720 0.15827294 +vt 0.26078720 0.15827294 +vt 0.26078720 0.15827294 +vt 0.26087185 0.29744298 +vt 0.26266434 0.37511833 +vt 0.26291278 0.23488973 +vt 0.26311143 0.31806839 +vt 0.26347229 0.17532001 +vt 0.26448287 0.47086609 +vt 0.26448287 0.47086609 +vt 0.26448287 0.47086609 +vt 0.26448287 0.47086609 +vt 0.26448287 0.47086609 +vt 0.26448287 0.47086609 +vt 0.26448287 0.47086609 +vt 0.26448287 0.47086609 +vt 0.26520710 0.26213782 +vt 0.26678590 0.46544050 +vt 0.26678590 0.46544050 +vt 0.26678590 0.46544050 +vt 0.26678590 0.46544050 +vt 0.26707502 0.17383582 +vt 0.26707502 0.17383582 +vt 0.26707502 0.17383582 +vt 0.26707502 0.17383582 +vt 0.26707502 0.17383582 +vt 0.26707502 0.17383582 +vt 0.26779633 0.30370442 +vt 0.26810134 0.30273905 +vt 0.26928300 0.17930078 +vt 0.26928300 0.17930078 +vt 0.26928300 0.17930078 +vt 0.27011637 0.20132760 +vt 0.27072555 0.23181396 +vt 0.27108116 0.32833792 +vt 0.27565006 0.20520635 +vt 0.27657983 0.27434511 +vt 0.28245628 0.38312853 +vt 0.28295882 0.30819481 +vt 0.28325312 0.39843983 +vt 0.28339722 0.27530736 +vt 0.28407924 0.29302528 +vt 0.28506563 0.34724454 +vt 0.29322021 0.17950089 +vt 0.29522584 0.24747882 +vt 0.30184147 0.30098405 +vt 0.30459190 0.40565390 +vt 0.30592259 0.25317174 +vt 0.30792575 0.35658053 +vt 0.31294832 0.16168675 +vt 0.31422341 0.41330964 +vt 0.31530278 0.27557889 +vt 0.32120071 0.22623034 +vt 0.32156958 0.28316992 +vt 0.32459308 0.63260321 +vt 0.32459308 0.63260321 +vt 0.32459308 0.63260321 +vt 0.32459308 0.63260321 +vt 0.32464452 0.62670929 +vt 0.32464452 0.62670929 +vt 0.32464452 0.62670929 +vt 0.32464452 0.62670929 +vt 0.32464452 0.62670929 +vt 0.32464452 0.62670929 +vt 0.32464452 0.62670929 +vt 0.32479099 0.60992483 +vt 0.32479099 0.60992483 +vt 0.32479099 0.60992483 +vt 0.32479099 0.60992483 +vt 0.32479099 0.60992483 +vt 0.32479099 0.60992483 +vt 0.32479099 0.60992483 +vt 0.32479099 0.60992483 +vt 0.32501021 0.58480510 +vt 0.32501021 0.58480510 +vt 0.32501021 0.58480510 +vt 0.32501021 0.58480510 +vt 0.32501021 0.58480510 +vt 0.32501021 0.58480510 +vt 0.32501021 0.58480510 +vt 0.32501021 0.58480510 +vt 0.32526879 0.55517436 +vt 0.32526879 0.55517436 +vt 0.32526879 0.55517436 +vt 0.32526879 0.55517436 +vt 0.32526879 0.55517436 +vt 0.32526879 0.55517436 +vt 0.32526879 0.55517436 +vt 0.32526879 0.55517436 +vt 0.32552738 0.52554362 +vt 0.32552738 0.52554362 +vt 0.32552738 0.52554362 +vt 0.32552738 0.52554362 +vt 0.32552738 0.52554362 +vt 0.32552738 0.52554362 +vt 0.32552738 0.52554362 +vt 0.32552738 0.52554362 +vt 0.32574659 0.50042389 +vt 0.32574659 0.50042389 +vt 0.32574659 0.50042389 +vt 0.32574659 0.50042389 +vt 0.32574659 0.50042389 +vt 0.32574659 0.50042389 +vt 0.32574659 0.50042389 +vt 0.32574659 0.50042389 +vt 0.32589307 0.48363943 +vt 0.32589307 0.48363943 +vt 0.32589307 0.48363943 +vt 0.32589307 0.48363943 +vt 0.32589307 0.48363943 +vt 0.32589307 0.48363943 +vt 0.32589307 0.48363943 +vt 0.32589307 0.48363943 +vt 0.32594450 0.47774551 +vt 0.32594450 0.47774551 +vt 0.32594450 0.47774551 +vt 0.32594450 0.47774551 +vt 0.32864735 0.16803010 +vt 0.32864735 0.16803010 +vt 0.32864735 0.16803010 +vt 0.32869878 0.16213618 +vt 0.32869878 0.16213618 +vt 0.32869878 0.16213618 +vt 0.32869878 0.16213618 +vt 0.32869878 0.16213618 +vt 0.32869878 0.16213618 +vt 0.32884526 0.14535172 +vt 0.32884526 0.14535172 +vt 0.32884526 0.14535172 +vt 0.32884526 0.14535172 +vt 0.32884526 0.14535172 +vt 0.32884526 0.14535172 +vt 0.32906448 0.12023199 +vt 0.32906448 0.12023199 +vt 0.32906448 0.12023199 +vt 0.32906448 0.12023199 +vt 0.32906448 0.12023199 +vt 0.32906448 0.12023199 +vt 0.32932306 9.0601251e-2 +vt 0.32932306 9.0601251e-2 +vt 0.32932306 9.0601251e-2 +vt 0.32932306 9.0601251e-2 +vt 0.32932306 9.0601251e-2 +vt 0.32932306 9.0601251e-2 +vt 0.32958164 6.0970513e-2 +vt 0.32958164 6.0970513e-2 +vt 0.32958164 6.0970513e-2 +vt 0.32958164 6.0970513e-2 +vt 0.32958164 6.0970513e-2 +vt 0.32958164 6.0970513e-2 +vt 0.32980086 3.5850786e-2 +vt 0.32980086 3.5850786e-2 +vt 0.32980086 3.5850786e-2 +vt 0.32980086 3.5850786e-2 +vt 0.32980086 3.5850786e-2 +vt 0.32980086 3.5850786e-2 +vt 0.32994734 1.9066320e-2 +vt 0.32994734 1.9066320e-2 +vt 0.32994734 1.9066320e-2 +vt 0.32994734 1.9066320e-2 +vt 0.32994734 1.9066320e-2 +vt 0.32994734 1.9066320e-2 +vt 0.32999877 1.3172400e-2 +vt 0.32999877 1.3172400e-2 +vt 0.32999877 1.3172400e-2 +vt 0.33183098 0.15447600 +vt 0.33617199 0.40592950 +vt 0.33618126 0.35492458 +vt 0.33750268 0.25344733 +vt 0.33913973 0.25746445 +vt 0.34699346 0.15896639 +vt 0.35054998 0.21383456 +vt 0.35124127 0.40823028 +vt 0.35187701 0.22778108 +vt 0.35202856 0.26838529 +vt 0.35612742 0.17447431 +vt 0.35784230 0.19863881 +vt 0.36553053 0.34252880 +vt 0.36775208 0.40620509 +vt 0.36908277 0.25372293 +vt 0.37880549 0.21217861 +vt 0.38530885 0.46647484 +vt 0.38530885 0.46647484 +vt 0.38530885 0.46647484 +vt 0.38530885 0.46647484 +vt 0.38615279 0.40259088 +vt 0.38751684 0.47193979 +vt 0.38751684 0.47193979 +vt 0.38751684 0.47193979 +vt 0.38751684 0.47193979 +vt 0.38751684 0.47193979 +vt 0.38751684 0.47193979 +vt 0.38751684 0.47193979 +vt 0.38751684 0.47193979 +vt 0.38780596 0.18033511 +vt 0.38780596 0.18033511 +vt 0.38780596 0.18033511 +vt 0.38866541 0.27253962 +vt 0.39010898 0.17490952 +vt 0.39010898 0.17490952 +vt 0.39010898 0.17490952 +vt 0.39010898 0.17490952 +vt 0.39010898 0.17490952 +vt 0.39010898 0.17490952 +vt 0.39027745 0.38406947 +vt 0.39121839 0.27624830 +vt 0.39150539 0.32128032 +vt 0.39380465 0.48750267 +vt 0.39380465 0.48750267 +vt 0.39380465 0.48750267 +vt 0.39380465 0.48750267 +vt 0.39380465 0.48750267 +vt 0.39380465 0.48750267 +vt 0.39380465 0.48750267 +vt 0.39380465 0.48750267 +vt 0.39666744 0.15945875 +vt 0.39666744 0.15945875 +vt 0.39666744 0.15945875 +vt 0.39666744 0.15945875 +vt 0.39666744 0.15945875 +vt 0.39666744 0.15945875 +vt 0.40166561 0.22151460 +vt 0.40321502 0.51079416 +vt 0.40321502 0.51079416 +vt 0.40321502 0.51079416 +vt 0.40321502 0.51079416 +vt 0.40321502 0.51079416 +vt 0.40321502 0.51079416 +vt 0.40321502 0.51079416 +vt 0.40321502 0.51079416 +vt 0.40648288 0.13633504 +vt 0.40648288 0.13633504 +vt 0.40648288 0.13633504 +vt 0.40648288 0.13633504 +vt 0.40648288 0.13633504 +vt 0.40648288 0.13633504 +vt 0.41015141 0.29441403 +vt 0.41280282 0.36193385 +vt 0.41307842 0.33035376 +vt 0.41335402 0.29877367 +vt 0.41431531 0.53826835 +vt 0.41431531 0.53826835 +vt 0.41431531 0.53826835 +vt 0.41431531 0.53826835 +vt 0.41431531 0.53826835 +vt 0.41431531 0.53826835 +vt 0.41431531 0.53826835 +vt 0.41431531 0.53826835 +vt 0.41565008 0.24042122 +vt 0.41806097 0.10905876 +vt 0.41806097 0.10905876 +vt 0.41806097 0.10905876 +vt 0.41806097 0.10905876 +vt 0.41806097 0.10905876 +vt 0.41806097 0.10905876 +vt 0.41862990 0.26602009 +vt 0.41880959 0.39282398 +vt 0.41963570 0.28740943 +vt 0.42541561 0.56574254 +vt 0.42541561 0.56574254 +vt 0.42541561 0.56574254 +vt 0.42541561 0.56574254 +vt 0.42541561 0.56574254 +vt 0.42541561 0.56574254 +vt 0.42541561 0.56574254 +vt 0.42541561 0.56574254 +vt 0.42963906 8.1782486e-2 +vt 0.42963906 8.1782486e-2 +vt 0.42963906 8.1782486e-2 +vt 0.42963906 8.1782486e-2 +vt 0.42963906 8.1782486e-2 +vt 0.42963906 8.1782486e-2 +vt 0.43034165 0.91259059 +vt 0.43034165 0.98261599 +vt 0.43034165 1.00000000 +vt 0.43034165 0.89520658 +vt 0.43034165 0.69406707 +vt 0.43034165 0.78147648 +vt 0.43034165 0.93891128 +vt 0.43034165 0.67668306 +vt 0.43034165 0.80779717 +vt 0.43034165 0.65036237 +vt 0.43034165 0.82518119 +vt 0.43034165 0.95629530 +vt 0.43034165 0.85150188 +vt 0.43034165 0.86888589 +vt 0.43034165 0.98261599 +vt 0.43034165 0.76409247 +vt 0.43034165 0.72038776 +vt 0.43034165 0.73777178 +vt 0.43482598 0.58903403 +vt 0.43482598 0.58903403 +vt 0.43482598 0.58903403 +vt 0.43482598 0.58903403 +vt 0.43482598 0.58903403 +vt 0.43482598 0.58903403 +vt 0.43482598 0.58903403 +vt 0.43482598 0.58903403 +vt 0.43584126 0.43334434 +vt 0.43584126 0.43334434 +vt 0.43584126 0.43334434 +vt 0.43584126 0.43334434 +vt 0.43775246 0.21434247 +vt 0.43775246 0.21434247 +vt 0.43775246 0.21434247 +vt 0.43945450 5.8658774e-2 +vt 0.43945450 5.8658774e-2 +vt 0.43945450 5.8658774e-2 +vt 0.43945450 5.8658774e-2 +vt 0.43945450 5.8658774e-2 +vt 0.43945450 5.8658774e-2 +vt 0.43977740 0.36778087 +vt 0.43997252 0.43754834 +vt 0.43997252 0.43754834 +vt 0.43997252 0.43754834 +vt 0.43997252 0.43754834 +vt 0.43997252 0.43754834 +vt 0.43997252 0.43754834 +vt 0.43997252 0.43754834 +vt 0.43997252 0.43754834 +vt 0.44022449 0.31073093 +vt 0.44111379 0.60459691 +vt 0.44111379 0.60459691 +vt 0.44111379 0.60459691 +vt 0.44111379 0.60459691 +vt 0.44111379 0.60459691 +vt 0.44111379 0.60459691 +vt 0.44111379 0.60459691 +vt 0.44111379 0.60459691 +vt 0.44195646 0.21021121 +vt 0.44195646 0.21021121 +vt 0.44195646 0.21021121 +vt 0.44195646 0.21021121 +vt 0.44195646 0.21021121 +vt 0.44195646 0.21021121 +vt 0.44332178 0.61006186 +vt 0.44332178 0.61006186 +vt 0.44332178 0.61006186 +vt 0.44332178 0.61006186 +vt 0.44601296 4.3208005e-2 +vt 0.44601296 4.3208005e-2 +vt 0.44601296 4.3208005e-2 +vt 0.44601296 4.3208005e-2 +vt 0.44601296 4.3208005e-2 +vt 0.44601296 4.3208005e-2 +vt 0.44729731 0.33895363 +vt 0.44831598 3.7782416e-2 +vt 0.44831598 3.7782416e-2 +vt 0.44831598 3.7782416e-2 +vt 0.44911943 0.71673235 +vt 0.44984764 0.68932218 +vt 0.45173735 0.44952032 +vt 0.45173735 0.44952032 +vt 0.45173735 0.44952032 +vt 0.45173735 0.44952032 +vt 0.45173735 0.44952032 +vt 0.45173735 0.44952032 +vt 0.45173735 0.44952032 +vt 0.45173735 0.44952032 +vt 0.45392844 0.19844638 +vt 0.45392844 0.19844638 +vt 0.45392844 0.19844638 +vt 0.45392844 0.19844638 +vt 0.45392844 0.19844638 +vt 0.45392844 0.19844638 +vt 0.45650779 0.73483381 +vt 0.45774929 0.67158971 +vt 0.46238078 0.72198168 +vt 0.46319753 0.68459692 +vt 0.46934467 0.46743766 +vt 0.46934467 0.46743766 +vt 0.46934467 0.46743766 +vt 0.46934467 0.46743766 +vt 0.46934467 0.46743766 +vt 0.46934467 0.46743766 +vt 0.46934467 0.46743766 +vt 0.46934467 0.46743766 +vt 0.46984862 0.38339784 +vt 0.46984862 0.38339784 +vt 0.46984862 0.38339784 +vt 0.46984862 0.38339784 +vt 0.47088296 0.26487488 +vt 0.47088296 0.26487488 +vt 0.47088296 0.26487488 +vt 0.47184578 0.18083906 +vt 0.47184578 0.18083906 +vt 0.47184578 0.18083906 +vt 0.47184578 0.18083906 +vt 0.47184578 0.18083906 +vt 0.47184578 0.18083906 +vt 0.47527421 0.38570086 +vt 0.47527421 0.38570086 +vt 0.47527421 0.38570086 +vt 0.47527421 0.38570086 +vt 0.47527421 0.38570086 +vt 0.47527421 0.38570086 +vt 0.47527421 0.38570086 +vt 0.47527421 0.38570086 +vt 0.47568774 0.75423511 +vt 0.47634791 0.26266689 +vt 0.47634791 0.26266689 +vt 0.47634791 0.26266689 +vt 0.47634791 0.26266689 +vt 0.47634791 0.26266689 +vt 0.47634791 0.26266689 +vt 0.47744770 0.65279728 +vt 0.48215363 0.32423923 +vt 0.48215363 0.32423923 +vt 0.48215363 0.32423923 +vt 0.48215363 0.32423923 +vt 0.48242761 0.71401265 +vt 0.48264696 0.70366636 +vt 0.48290325 0.69327424 +vt 0.48510059 0.32426495 +vt 0.48510059 0.32426495 +vt 0.48647550 0.25857508 +vt 0.48756576 0.25813459 +vt 0.48804755 0.32429066 +vt 0.48804755 0.32429066 +vt 0.48804755 0.32429066 +vt 0.48804755 0.32429066 +vt 0.48804755 0.32429066 +vt 0.48804755 0.32429066 +vt 0.48804755 0.32429066 +vt 0.48804755 0.32429066 +vt 0.48860925 0.74857723 +vt 0.48972055 0.72138919 +vt 0.49011392 0.48857260 +vt 0.49011392 0.48857260 +vt 0.49011392 0.48857260 +vt 0.49011392 0.48857260 +vt 0.49011392 0.48857260 +vt 0.49011392 0.48857260 +vt 0.49011392 0.48857260 +vt 0.49011392 0.48857260 +vt 0.49018811 0.65882178 +vt 0.49048415 0.68607932 +vt 0.49072498 0.39225932 +vt 0.49072498 0.39225932 +vt 0.49072498 0.39225932 +vt 0.49072498 0.39225932 +vt 0.49072498 0.39225932 +vt 0.49072498 0.39225932 +vt 0.49072498 0.39225932 +vt 0.49072498 0.39225932 +vt 0.49075355 0.25684664 +vt 0.49075355 0.25684664 +vt 0.49191079 0.25637908 +vt 0.49191079 0.25637908 +vt 0.49191079 0.25637908 +vt 0.49191079 0.25637908 +vt 0.49191079 0.25637908 +vt 0.49191079 0.25637908 +vt 0.49253375 0.11176082 +vt 0.49298072 0.16006981 +vt 0.49298072 0.16006981 +vt 0.49298072 0.16006981 +vt 0.49298072 0.16006981 +vt 0.49298072 0.16006981 +vt 0.49298072 0.16006981 +vt 0.49348283 0.76178868 +vt 0.49541439 0.64574015 +vt 0.49595587 0.25474477 +vt 0.49595587 0.25474477 +vt 0.49643978 0.32436390 +vt 0.49643978 0.32436390 +vt 0.49704460 0.72878879 +vt 0.49807099 0.67885613 +vt 0.50293639 0.25192445 +vt 0.50293639 0.25192445 +vt 0.50483201 0.32443714 +vt 0.50483201 0.32443714 +vt 0.50483201 0.32443714 +vt 0.50483201 0.32443714 +vt 0.50483201 0.32443714 +vt 0.50483201 0.32443714 +vt 0.50483201 0.32443714 +vt 0.50483201 0.32443714 +vt 0.50752812 0.72888637 +vt 0.50856640 0.67899739 +vt 0.51088317 0.50970755 +vt 0.51088317 0.50970755 +vt 0.51088317 0.50970755 +vt 0.51088317 0.50970755 +vt 0.51088317 0.50970755 +vt 0.51088317 0.50970755 +vt 0.51088317 0.50970755 +vt 0.51088317 0.50970755 +vt 0.51145876 0.24848119 +vt 0.51145876 0.24848119 +vt 0.51384869 0.40207476 +vt 0.51384869 0.40207476 +vt 0.51384869 0.40207476 +vt 0.51384869 0.40207476 +vt 0.51384869 0.40207476 +vt 0.51384869 0.40207476 +vt 0.51384869 0.40207476 +vt 0.51384869 0.40207476 +vt 0.51411567 0.13930056 +vt 0.51411567 0.13930056 +vt 0.51411567 0.13930056 +vt 0.51411567 0.13930056 +vt 0.51411567 0.13930056 +vt 0.51411567 0.13930056 +vt 0.51520228 0.24696871 +vt 0.51520228 0.24696871 +vt 0.51520228 0.24696871 +vt 0.51520228 0.24696871 +vt 0.51520228 0.24696871 +vt 0.51520228 0.24696871 +vt 0.51739188 0.32454675 +vt 0.51739188 0.32454675 +vt 0.51802352 0.72902763 +vt 0.51904992 0.67909497 +vt 0.52068013 0.76214361 +vt 0.52116929 0.24455788 +vt 0.52116929 0.24455788 +vt 0.52261169 0.64609508 +vt 0.52561037 0.72180443 +vt 0.52590641 0.74906197 +vt 0.52637397 0.68649457 +vt 0.52748527 0.65930653 +vt 0.52849049 0.52762489 +vt 0.52849049 0.52762489 +vt 0.52849049 0.52762489 +vt 0.52849049 0.52762489 +vt 0.52849049 0.52762489 +vt 0.52849049 0.52762489 +vt 0.52849049 0.52762489 +vt 0.52849049 0.52762489 +vt 0.52995174 0.32465636 +vt 0.52995174 0.32465636 +vt 0.52995174 0.32465636 +vt 0.52995174 0.32465636 +vt 0.52995174 0.32465636 +vt 0.52995174 0.32465636 +vt 0.52995174 0.32465636 +vt 0.52995174 0.32465636 +vt 0.53171427 0.24029743 +vt 0.53171427 0.24029743 +vt 0.53203301 0.12169324 +vt 0.53203301 0.12169324 +vt 0.53203301 0.12169324 +vt 0.53203301 0.12169324 +vt 0.53203301 0.12169324 +vt 0.53203301 0.12169324 +vt 0.53319127 0.71460952 +vt 0.53344755 0.70421740 +vt 0.53366690 0.69387111 +vt 0.53864682 0.75508648 +vt 0.54025533 0.53959687 +vt 0.54025533 0.53959687 +vt 0.54025533 0.53959687 +vt 0.54025533 0.53959687 +vt 0.54025533 0.53959687 +vt 0.54025533 0.53959687 +vt 0.54025533 0.53959687 +vt 0.54025533 0.53959687 +vt 0.54040678 0.65364864 +vt 0.54112497 0.41365285 +vt 0.54112497 0.41365285 +vt 0.54112497 0.41365285 +vt 0.54112497 0.41365285 +vt 0.54112497 0.41365285 +vt 0.54112497 0.41365285 +vt 0.54112497 0.41365285 +vt 0.54112497 0.41365285 +vt 0.54267647 0.23586842 +vt 0.54267647 0.23586842 +vt 0.54267647 0.23586842 +vt 0.54267647 0.23586842 +vt 0.54267647 0.23586842 +vt 0.54267647 0.23586842 +vt 0.54267647 0.23586842 +vt 0.54267647 0.23586842 +vt 0.54400499 0.10992840 +vt 0.54400499 0.10992840 +vt 0.54400499 0.10992840 +vt 0.54400499 0.10992840 +vt 0.54400499 0.10992840 +vt 0.54400499 0.10992840 +vt 0.54438659 0.54380087 +vt 0.54438659 0.54380087 +vt 0.54438659 0.54380087 +vt 0.54438659 0.54380087 +vt 0.54476711 0.32478565 +vt 0.54476711 0.32478565 +vt 0.54820899 0.10579714 +vt 0.54820899 0.10579714 +vt 0.54820899 0.10579714 +vt 0.55289699 0.72328683 +vt 0.55363867 0.23143940 +vt 0.55363867 0.23143940 +vt 0.55371373 0.68590208 +vt 0.55834522 0.73629405 +vt 0.55958248 0.32491494 +vt 0.55958248 0.32491494 +vt 0.55958248 0.32491494 +vt 0.55958248 0.32491494 +vt 0.55958248 0.32491494 +vt 0.55958248 0.32491494 +vt 0.55958248 0.32491494 +vt 0.55958248 0.32491494 +vt 0.55958673 0.67304995 +vt 0.56418365 0.22717895 +vt 0.56418365 0.22717895 +vt 0.56624688 0.71856158 +vt 0.56697509 0.69115141 +vt 0.56840125 0.42523094 +vt 0.56840125 0.42523094 +vt 0.56840125 0.42523094 +vt 0.56840125 0.42523094 +vt 0.56840125 0.42523094 +vt 0.56840125 0.42523094 +vt 0.56840125 0.42523094 +vt 0.56840125 0.42523094 +vt 0.57015066 0.22476812 +vt 0.57015066 0.22476812 +vt 0.57015066 0.22476812 +vt 0.57015066 0.22476812 +vt 0.57015066 0.22476812 +vt 0.57015066 0.22476812 +vt 0.57318620 0.69082455 +vt 0.57330261 0.71811337 +vt 0.57389418 0.22325564 +vt 0.57389418 0.22325564 +vt 0.57439785 0.32504423 +vt 0.57439785 0.32504423 +vt 0.58045155 0.67296193 +vt 0.58072444 0.73593219 +vt 0.58241655 0.21981238 +vt 0.58241655 0.21981238 +vt 0.58683092 0.68596498 +vt 0.58700386 0.72283209 +vt 0.58921322 0.32517352 +vt 0.58921322 0.32517352 +vt 0.58921322 0.32517352 +vt 0.58921322 0.32517352 +vt 0.58921322 0.32517352 +vt 0.58921322 0.32517352 +vt 0.58921322 0.32517352 +vt 0.58921322 0.32517352 +vt 0.58939707 0.21699207 +vt 0.58939707 0.21699207 +vt 0.59152496 0.43504638 +vt 0.59152496 0.43504638 +vt 0.59152496 0.43504638 +vt 0.59152496 0.43504638 +vt 0.59152496 0.43504638 +vt 0.59152496 0.43504638 +vt 0.59152496 0.43504638 +vt 0.59152496 0.43504638 +vt 0.59344215 0.21535775 +vt 0.59344215 0.21535775 +vt 0.59344215 0.21535775 +vt 0.59344215 0.21535775 +vt 0.59344215 0.21535775 +vt 0.59344215 0.21535775 +vt 0.59459939 0.21489020 +vt 0.59459939 0.21489020 +vt 0.59778718 0.21360225 +vt 0.59778718 0.21360225 +vt 0.59887744 0.21316175 +vt 0.59960879 0.65354806 +vt 0.60010797 0.75529447 +vt 0.60177308 0.32528313 +vt 0.60177308 0.32528313 +vt 0.60697573 0.44160484 +vt 0.60697573 0.44160484 +vt 0.60697573 0.44160484 +vt 0.60697573 0.44160484 +vt 0.60697573 0.44160484 +vt 0.60697573 0.44160484 +vt 0.60697573 0.44160484 +vt 0.60697573 0.44160484 +vt 0.60900503 0.20906994 +vt 0.60900503 0.20906994 +vt 0.60900503 0.20906994 +vt 0.60900503 0.20906994 +vt 0.60900503 0.20906994 +vt 0.60900503 0.20906994 +vt 0.61240132 0.44390786 +vt 0.61240132 0.44390786 +vt 0.61240132 0.44390786 +vt 0.61240132 0.44390786 +vt 0.61271558 0.65973293 +vt 0.61321634 0.74878826 +vt 0.61433295 0.32539274 +vt 0.61433295 0.32539274 +vt 0.61433295 0.32539274 +vt 0.61433295 0.32539274 +vt 0.61433295 0.32539274 +vt 0.61433295 0.32539274 +vt 0.61433295 0.32539274 +vt 0.61433295 0.32539274 +vt 0.61446998 0.20686195 +vt 0.61446998 0.20686195 +vt 0.61446998 0.20686195 +vt 0.61737331 0.64600746 +vt 0.61813719 0.76245976 +vt 0.62272518 0.32546598 +vt 0.62272518 0.32546598 +vt 0.63111741 0.32553922 +vt 0.63111741 0.32553922 +vt 0.63111741 0.32553922 +vt 0.63111741 0.32553922 +vt 0.63111741 0.32553922 +vt 0.63111741 0.32553922 +vt 0.63111741 0.32553922 +vt 0.63111741 0.32553922 +vt 0.63406437 0.32556493 +vt 0.63701133 0.32559065 +vt 0.63701133 0.32559065 +vt 0.63701133 0.32559065 +vt 0.63701133 0.32559065 +vt 0.64465832 0.64574015 +vt 0.64542220 0.76219244 +vt 0.64957917 0.65941165 +vt 0.65007993 0.74846698 +vt 0.66268754 0.65290543 +vt 0.66318672 0.75465185 +vt 0.67579165 0.68536781 +vt 0.67596459 0.72223492 +vt 0.68207107 0.67226772 +vt 0.68234396 0.73523797 +vt 0.68949291 0.69008653 +vt 0.68960931 0.71737536 +vn -0.88527009 -0.46507713 -3.4612510e-4 +vn -0.99825135 -5.9111551e-2 -2.6310556e-4 +vn -0.92050485 0.39073113 -4.9415426e-16 +vn -0.70090926 0.71325045 -2.5781961e-16 +vn -0.37460659 0.92718385 -1.5755643e-16 +vn 8.7265355e-3 0.99996192 -4.1537604e-16 +vn 0.39073113 0.92050485 -4.9415426e-16 +vn 0.71325045 0.70090926 -3.6524445e-16 +vn 0.92718385 0.37460659 6.4454903e-17 +vn 0.99996192 -8.7265355e-3 3.2943617e-16 +vn 0.92050485 -0.39073113 2.2917299e-16 +vn 0.70090926 -0.71325045 3.4375948e-16 +vn 0.37460659 -0.92718385 4.0821439e-16 +vn -8.7265355e-3 -0.99996192 -3.1511286e-16 +vn -0.39073113 -0.92050485 -6.2306407e-16 +vn -0.71325045 -0.70090926 -3.9389108e-16 +vn -0.92718385 -0.37460659 -7.1616559e-16 +vn -0.99996192 8.7265355e-3 -5.6577082e-16 +vn -0.92050485 0.39073113 -1.5039477e-16 +vn -0.70090926 0.71325045 -3.7956776e-16 +vn -0.37460659 0.92718385 -2.9362789e-16 +vn 8.7265355e-3 0.99996192 1.2174815e-16 +vn 0.39073113 0.92050485 1.5755643e-16 +vn 0.71325045 0.70090926 1.0742484e-16 +vn 0.92718385 0.37460659 -3.5808280e-17 +vn 0.99996192 -8.7265355e-3 -3.6524445e-16 +vn 0.92050485 -0.39073113 -4.0105273e-16 +vn 0.70090926 -0.71325045 -1.9336471e-16 +vn 0.37460659 -0.92718385 1.4323312e-17 +vn -8.7265355e-3 -0.99996192 2.9362789e-16 +vn -0.39073113 -0.92050485 4.7983095e-16 +vn -0.71325045 -0.70090926 1.3607146e-16 +vn -0.92718385 -0.37460659 -2.5781961e-16 +vn -0.99996192 8.7265355e-3 -3.0795120e-16 +vn -0.92050485 0.39073113 -2.6498127e-16 +vn -0.70090926 0.71325045 5.0131591e-17 +vn -0.37460659 0.92718385 4.3686101e-16 +vn 8.7265355e-3 0.99996192 2.0052637e-16 +vn 0.39073113 0.92050485 -2.5065796e-16 +vn 0.71325045 0.70090926 -4.0821439e-16 +vn 0.92718385 0.37460659 -4.2969936e-16 +vn 0.99996192 -8.7265355e-3 -5.0847757e-16 +vn 0.92050485 -0.39073113 -8.9520699e-16 +vn 0.70090926 -0.71325045 -7.2332725e-16 +vn 0.37460659 -0.92718385 -2.7930458e-16 +vn -8.7265355e-3 -0.99996192 1.4323312e-16 +vn -0.39073113 -0.92050485 3.2943617e-16 +vn -0.71325045 -0.70090926 -2.1484968e-16 +vn -0.92718385 -0.37460659 -4.7983095e-16 +vn -0.99996192 8.7265355e-3 -3.9389108e-16 +vn -0.92050485 0.39073113 -6.0874075e-16 +vn -0.70090926 0.71325045 -7.9494381e-16 +vn -0.37460659 0.92718385 -5.2996254e-16 +vn 8.7265355e-3 0.99996192 -4.0105273e-16 +vn 0.39073113 0.92050485 -6.5171069e-16 +vn 0.71325045 0.70090926 -7.8062050e-16 +vn 0.94008235 0.34094743 -1.6665221e-4 +vn 0.95236659 -0.30495549 -1.7793416e-4 +vn -0.81786711 -0.48960537 0.30229121 +vn -0.94150600 -0.11404156 0.31711350 +vn -0.89213713 0.32220254 0.31666523 +vn -0.70092566 0.63908243 0.31666523 +vn -0.40300461 0.85866782 0.31666523 +vn -4.3729763e-2 0.94752881 0.31666523 +vn 0.32220254 0.89213713 0.31666523 +vn 0.63908243 0.70092566 0.31666523 +vn 0.85866782 0.40300461 0.31666523 +vn 0.94752881 4.3729763e-2 0.31666523 +vn 0.89213713 -0.32220254 0.31666523 +vn 0.70092566 -0.63908243 0.31666523 +vn 0.40300461 -0.85866782 0.31666523 +vn 4.3729763e-2 -0.94752881 0.31666523 +vn -0.32220254 -0.89213713 0.31666523 +vn -0.63908243 -0.70092566 0.31666523 +vn -0.85866782 -0.40300461 0.31666523 +vn -0.94752881 -4.3729763e-2 0.31666523 +vn -0.89213713 0.32220254 0.31666523 +vn -0.70092566 0.63908243 0.31666523 +vn -0.40300461 0.85866782 0.31666523 +vn -4.3729763e-2 0.94752881 0.31666523 +vn 0.32220254 0.89213713 0.31666523 +vn 0.63908243 0.70092566 0.31666523 +vn 0.85866782 0.40300461 0.31666523 +vn 0.94752881 4.3729763e-2 0.31666523 +vn 0.89213713 -0.32220254 0.31666523 +vn 0.70092566 -0.63908243 0.31666523 +vn 0.40300461 -0.85866782 0.31666523 +vn 4.3729763e-2 -0.94752881 0.31666523 +vn -0.32220254 -0.89213713 0.31666523 +vn -0.63908243 -0.70092566 0.31666523 +vn -0.85866782 -0.40300461 0.31666523 +vn -0.94752881 -4.3729763e-2 0.31666523 +vn -0.89213713 0.32220254 0.31666523 +vn -0.70092566 0.63908243 0.31666523 +vn -0.40300461 0.85866782 0.31666523 +vn -4.3729763e-2 0.94752881 0.31666523 +vn 0.32220254 0.89213713 0.31666523 +vn 0.63908243 0.70092566 0.31666523 +vn 0.85866782 0.40300461 0.31666523 +vn 0.94752881 4.3729763e-2 0.31666523 +vn 0.89213713 -0.32220254 0.31666523 +vn 0.70092566 -0.63908243 0.31666523 +vn 0.40300461 -0.85866782 0.31666523 +vn 4.3729763e-2 -0.94752881 0.31666523 +vn -0.32220254 -0.89213713 0.31666523 +vn -0.63908243 -0.70092566 0.31666523 +vn -0.85866782 -0.40300461 0.31666523 +vn -0.94752881 -4.3729763e-2 0.31666523 +vn -0.89213713 0.32220254 0.31666523 +vn -0.70092566 0.63908243 0.31666523 +vn -0.40300461 0.85866782 0.31666523 +vn -4.3729763e-2 0.94752881 0.31666523 +vn 0.32220254 0.89213713 0.31666523 +vn 0.63908243 0.70092566 0.31666523 +vn 0.87654168 0.36827120 0.30992096 +vn 0.90774054 -0.26671251 0.32383875 +vn -0.63448501 -0.49989235 0.58952219 +vn -0.76181444 -0.17967663 0.62237856 +vn -0.75384166 0.20209448 0.62520443 +vn -0.61912067 0.47519367 0.62520443 +vn -0.39014417 0.67594893 0.62520443 +vn -0.10177176 0.77379709 0.62520443 +vn 0.20209448 0.75384166 0.62520443 +vn 0.47519367 0.61912067 0.62520443 +vn 0.67594893 0.39014417 0.62520443 +vn 0.77379709 0.10177176 0.62520443 +vn 0.75384166 -0.20209448 0.62520443 +vn 0.61912067 -0.47519367 0.62520443 +vn 0.39014417 -0.67594893 0.62520443 +vn 0.10177176 -0.77379709 0.62520443 +vn -0.20209448 -0.75384166 0.62520443 +vn -0.47519367 -0.61912067 0.62520443 +vn -0.67594893 -0.39014417 0.62520443 +vn -0.77379709 -0.10177176 0.62520443 +vn -0.75384166 0.20209448 0.62520443 +vn -0.61912067 0.47519367 0.62520443 +vn -0.39014417 0.67594893 0.62520443 +vn -0.10177176 0.77379709 0.62520443 +vn 0.20209448 0.75384166 0.62520443 +vn 0.47519367 0.61912067 0.62520443 +vn 0.67594893 0.39014417 0.62520443 +vn 0.77379709 0.10177176 0.62520443 +vn 0.75384166 -0.20209448 0.62520443 +vn 0.61912067 -0.47519367 0.62520443 +vn 0.39014417 -0.67594893 0.62520443 +vn 0.10177176 -0.77379709 0.62520443 +vn -0.20209448 -0.75384166 0.62520443 +vn -0.47519367 -0.61912067 0.62520443 +vn -0.67594893 -0.39014417 0.62520443 +vn -0.77379709 -0.10177176 0.62520443 +vn -0.75384166 0.20209448 0.62520443 +vn -0.61912067 0.47519367 0.62520443 +vn -0.39014417 0.67594893 0.62520443 +vn -0.10177176 0.77379709 0.62520443 +vn 0.20209448 0.75384166 0.62520443 +vn 0.47519367 0.61912067 0.62520443 +vn 0.67594893 0.39014417 0.62520443 +vn 0.77379709 0.10177176 0.62520443 +vn 0.75384166 -0.20209448 0.62520443 +vn 0.61912067 -0.47519367 0.62520443 +vn 0.39014417 -0.67594893 0.62520443 +vn 0.10177176 -0.77379709 0.62520443 +vn -0.20209448 -0.75384166 0.62520443 +vn -0.47519367 -0.61912067 0.62520443 +vn -0.67594893 -0.39014417 0.62520443 +vn -0.77379709 -0.10177176 0.62520443 +vn -0.75384166 0.20209448 0.62520443 +vn -0.61912067 0.47519367 0.62520443 +vn -0.39014417 0.67594893 0.62520443 +vn -0.10177176 0.77379709 0.62520443 +vn 0.20209448 0.75384166 0.62520443 +vn 0.47519367 0.61912067 0.62520443 +vn 0.70030029 0.36240765 0.61501236 +vn 0.74405533 -0.18299821 0.64256776 +vn -0.31515433 -0.48200082 0.81752857 +vn -0.43307120 -0.25079360 0.86576665 +vn -0.47793906 2.2181426e-2 0.87811288 +vn -0.43306965 0.20339233 0.87811288 +vn -0.32226931 0.35363859 0.87811288 +vn -0.16240639 0.45004658 0.87811288 +vn 2.2181426e-2 0.47793906 0.87811288 +vn 0.20339233 0.43306965 0.87811288 +vn 0.35363859 0.32226931 0.87811288 +vn 0.45004658 0.16240639 0.87811288 +vn 0.47793906 -2.2181426e-2 0.87811288 +vn 0.43306965 -0.20339233 0.87811288 +vn 0.32226931 -0.35363859 0.87811288 +vn 0.16240639 -0.45004658 0.87811288 +vn -2.2181426e-2 -0.47793906 0.87811288 +vn -0.20339233 -0.43306965 0.87811288 +vn -0.35363859 -0.32226931 0.87811288 +vn -0.45004658 -0.16240639 0.87811288 +vn -0.47793906 2.2181426e-2 0.87811288 +vn -0.43306965 0.20339233 0.87811288 +vn -0.32226931 0.35363859 0.87811288 +vn -0.16240639 0.45004658 0.87811288 +vn 2.2181426e-2 0.47793906 0.87811288 +vn 0.20339233 0.43306965 0.87811288 +vn 0.35363859 0.32226931 0.87811288 +vn 0.45004658 0.16240639 0.87811288 +vn 0.47793906 -2.2181426e-2 0.87811288 +vn 0.43306965 -0.20339233 0.87811288 +vn 0.32226931 -0.35363859 0.87811288 +vn 0.16240639 -0.45004658 0.87811288 +vn -2.2181426e-2 -0.47793906 0.87811288 +vn -0.20339233 -0.43306965 0.87811288 +vn -0.35363859 -0.32226931 0.87811288 +vn -0.45004658 -0.16240639 0.87811288 +vn -0.47793906 2.2181426e-2 0.87811288 +vn -0.43306965 0.20339233 0.87811288 +vn -0.32226931 0.35363859 0.87811288 +vn -0.16240639 0.45004658 0.87811288 +vn 2.2181426e-2 0.47793906 0.87811288 +vn 0.20339233 0.43306965 0.87811288 +vn 0.35363859 0.32226931 0.87811288 +vn 0.45004658 0.16240639 0.87811288 +vn 0.47793906 -2.2181426e-2 0.87811288 +vn 0.43306965 -0.20339233 0.87811288 +vn 0.32226931 -0.35363859 0.87811288 +vn 0.16240639 -0.45004658 0.87811288 +vn -2.2181426e-2 -0.47793906 0.87811288 +vn -0.20339233 -0.43306965 0.87811288 +vn -0.35363859 -0.32226931 0.87811288 +vn -0.45004658 -0.16240639 0.87811288 +vn -0.47793906 2.2181426e-2 0.87811288 +vn -0.43306965 0.20339233 0.87811288 +vn -0.32226931 0.35363859 0.87811288 +vn -0.16240639 0.45004658 0.87811288 +vn 2.2181426e-2 0.47793906 0.87811288 +vn 0.20339233 0.43306965 0.87811288 +vn 0.38091250 0.30941773 0.87130152 +vn 0.43076659 -4.8955509e-2 0.90113457 +vn 0.10628023 -0.41885362 0.90181270 +vn 1.1510461e-2 -0.30436586 0.95248566 +vn -8.1491517e-2 -0.19030861 0.97833622 +vn -0.14811630 -0.14463677 0.97833622 +vn -0.19219171 -7.6945303e-2 0.97833622 +vn -0.20700768 2.4603936e-3 0.97833622 +vn -0.19030861 8.1491517e-2 0.97833622 +vn -0.14463677 0.14811630 0.97833622 +vn -7.6945303e-2 0.19219171 0.97833622 +vn 2.4603936e-3 0.20700768 0.97833622 +vn 8.1491517e-2 0.19030861 0.97833622 +vn 0.14811630 0.14463677 0.97833622 +vn 0.19219171 7.6945303e-2 0.97833622 +vn 0.20700768 -2.4603936e-3 0.97833622 +vn 0.19030861 -8.1491517e-2 0.97833622 +vn 0.14463677 -0.14811630 0.97833622 +vn 7.6945303e-2 -0.19219171 0.97833622 +vn -2.4603936e-3 -0.20700768 0.97833622 +vn -8.1491517e-2 -0.19030861 0.97833622 +vn -0.14811630 -0.14463677 0.97833622 +vn -0.19219171 -7.6945303e-2 0.97833622 +vn -0.20700768 2.4603936e-3 0.97833622 +vn -0.19030861 8.1491517e-2 0.97833622 +vn -0.14463677 0.14811630 0.97833622 +vn -7.6945303e-2 0.19219171 0.97833622 +vn 2.4603936e-3 0.20700768 0.97833622 +vn 8.1491517e-2 0.19030861 0.97833622 +vn 0.14811630 0.14463677 0.97833622 +vn 0.19219171 7.6945303e-2 0.97833622 +vn 0.20700768 -2.4603936e-3 0.97833622 +vn 0.19030861 -8.1491517e-2 0.97833622 +vn 0.14463677 -0.14811630 0.97833622 +vn 7.6945303e-2 -0.19219171 0.97833622 +vn -2.4603936e-3 -0.20700768 0.97833622 +vn -8.1491517e-2 -0.19030861 0.97833622 +vn -0.14811630 -0.14463677 0.97833622 +vn -0.19219171 -7.6945303e-2 0.97833622 +vn -0.20700768 2.4603936e-3 0.97833622 +vn -0.19030861 8.1491517e-2 0.97833622 +vn -0.14463677 0.14811630 0.97833622 +vn -7.6945303e-2 0.19219171 0.97833622 +vn 2.4603936e-3 0.20700768 0.97833622 +vn 8.1491517e-2 0.19030861 0.97833622 +vn 0.14811630 0.14463677 0.97833622 +vn 0.19219171 7.6945303e-2 0.97833622 +vn 0.20700768 -2.4603936e-3 0.97833622 +vn 0.19030861 -8.1491517e-2 0.97833622 +vn 0.14463677 -0.14811630 0.97833622 +vn 7.6945303e-2 -0.19219171 0.97833622 +vn -2.4603936e-3 -0.20700768 0.97833622 +vn -8.1491517e-2 -0.19030861 0.97833622 +vn -0.14811630 -0.14463677 0.97833622 +vn -0.19219171 -7.6945303e-2 0.97833622 +vn -0.20700768 2.4603936e-3 0.97833622 +vn -0.19030861 8.1491517e-2 0.97833622 +vn -0.14463677 0.14811630 0.97833622 +vn -5.8312288e-2 0.19406032 0.97925496 +vn -1.7287977e-3 0.10486883 0.99448456 +vn 0.50980432 -0.31830936 0.79923633 +vn 0.44314021 -0.31549594 0.83910015 +vn 0.32763873 -0.36566515 0.87117270 +vn 0.16276472 -0.46321246 0.87117270 +vn -2.6888740e-2 -0.49023987 0.87117270 +vn -0.21244863 -0.44263271 0.87117270 +vn -0.36566515 -0.32763873 0.87117270 +vn -0.46321246 -0.16276472 0.87117270 +vn -0.49023987 2.6888740e-2 0.87117270 +vn -0.44263271 0.21244863 0.87117270 +vn -0.32763873 0.36566515 0.87117270 +vn -0.16276472 0.46321246 0.87117270 +vn 2.6888740e-2 0.49023987 0.87117270 +vn 0.21244863 0.44263271 0.87117270 +vn 0.36566515 0.32763873 0.87117270 +vn 0.46321246 0.16276472 0.87117270 +vn 0.49023987 -2.6888740e-2 0.87117270 +vn 0.44263271 -0.21244863 0.87117270 +vn 0.32763873 -0.36566515 0.87117270 +vn 0.16276472 -0.46321246 0.87117270 +vn -2.6888740e-2 -0.49023987 0.87117270 +vn -0.21244863 -0.44263271 0.87117270 +vn -0.36566515 -0.32763873 0.87117270 +vn -0.46321246 -0.16276472 0.87117270 +vn -0.49023987 2.6888740e-2 0.87117270 +vn -0.44263271 0.21244863 0.87117270 +vn -0.32763873 0.36566515 0.87117270 +vn -0.16276472 0.46321246 0.87117270 +vn 2.6888740e-2 0.49023987 0.87117270 +vn 0.21244863 0.44263271 0.87117270 +vn 0.36566515 0.32763873 0.87117270 +vn 0.46321246 0.16276472 0.87117270 +vn 0.49023987 -2.6888740e-2 0.87117270 +vn 0.44263271 -0.21244863 0.87117270 +vn 0.32763873 -0.36566515 0.87117270 +vn 0.16276472 -0.46321246 0.87117270 +vn -2.6888740e-2 -0.49023987 0.87117270 +vn -0.21244863 -0.44263271 0.87117270 +vn -0.36566515 -0.32763873 0.87117270 +vn -0.46321246 -0.16276472 0.87117270 +vn -0.49023987 2.6888740e-2 0.87117270 +vn -0.44263271 0.21244863 0.87117270 +vn -0.32763873 0.36566515 0.87117270 +vn -0.16276472 0.46321246 0.87117270 +vn 2.6888740e-2 0.49023987 0.87117270 +vn 0.21244863 0.44263271 0.87117270 +vn 0.36566515 0.32763873 0.87117270 +vn 0.46321246 0.16276472 0.87117270 +vn 0.49023987 -2.6888740e-2 0.87117270 +vn 0.44263271 -0.21244863 0.87117270 +vn 0.32763873 -0.36566515 0.87117270 +vn 0.16276472 -0.46321246 0.87117270 +vn -2.6888740e-2 -0.49023987 0.87117270 +vn -0.21244863 -0.44263271 0.87117270 +vn -0.36566515 -0.32763873 0.87117270 +vn -0.46321246 -0.16276472 0.87117270 +vn -0.48764076 2.5300714e-2 0.87267770 +vn -0.43243009 0.20782372 0.87739018 +vn 0.79419364 -0.21215313 0.56942735 +vn 0.75296476 -0.28208757 0.59453400 +vn 0.64049620 -0.45347100 0.61978114 +vn 0.41820549 -0.66405986 0.61978114 +vn 0.13224679 -0.77355163 0.61978114 +vn -0.17384529 -0.76527717 0.61978114 +vn -0.45347100 -0.64049620 0.61978114 +vn -0.66405986 -0.41820549 0.61978114 +vn -0.77355163 -0.13224679 0.61978114 +vn -0.76527717 0.17384529 0.61978114 +vn -0.64049620 0.45347100 0.61978114 +vn -0.41820549 0.66405986 0.61978114 +vn -0.13224679 0.77355163 0.61978114 +vn 0.17384529 0.76527717 0.61978114 +vn 0.45347100 0.64049620 0.61978114 +vn 0.66405986 0.41820549 0.61978114 +vn 0.77355163 0.13224679 0.61978114 +vn 0.76527717 -0.17384529 0.61978114 +vn 0.64049620 -0.45347100 0.61978114 +vn 0.41820549 -0.66405986 0.61978114 +vn 0.13224679 -0.77355163 0.61978114 +vn -0.17384529 -0.76527717 0.61978114 +vn -0.45347100 -0.64049620 0.61978114 +vn -0.66405986 -0.41820549 0.61978114 +vn -0.77355163 -0.13224679 0.61978114 +vn -0.76527717 0.17384529 0.61978114 +vn -0.64049620 0.45347100 0.61978114 +vn -0.41820549 0.66405986 0.61978114 +vn -0.13224679 0.77355163 0.61978114 +vn 0.17384529 0.76527717 0.61978114 +vn 0.45347100 0.64049620 0.61978114 +vn 0.66405986 0.41820549 0.61978114 +vn 0.77355163 0.13224679 0.61978114 +vn 0.76527717 -0.17384529 0.61978114 +vn 0.64049620 -0.45347100 0.61978114 +vn 0.41820549 -0.66405986 0.61978114 +vn 0.13224679 -0.77355163 0.61978114 +vn -0.17384529 -0.76527717 0.61978114 +vn -0.45347100 -0.64049620 0.61978114 +vn -0.66405986 -0.41820549 0.61978114 +vn -0.77355163 -0.13224679 0.61978114 +vn -0.76527717 0.17384529 0.61978114 +vn -0.64049620 0.45347100 0.61978114 +vn -0.41820549 0.66405986 0.61978114 +vn -0.13224679 0.77355163 0.61978114 +vn 0.17384529 0.76527717 0.61978114 +vn 0.45347100 0.64049620 0.61978114 +vn 0.66405986 0.41820549 0.61978114 +vn 0.77355163 0.13224679 0.61978114 +vn 0.76527717 -0.17384529 0.61978114 +vn 0.64049620 -0.45347100 0.61978114 +vn 0.41820549 -0.66405986 0.61978114 +vn 0.13224679 -0.77355163 0.61978114 +vn -0.17384529 -0.76527717 0.61978114 +vn -0.45347100 -0.64049620 0.61978114 +vn -0.66405986 -0.41820549 0.61978114 +vn -0.77295587 -0.16912337 0.61150348 +vn -0.76128506 0.19608869 0.61805686 +vn 0.94897363 -0.12086054 0.29127611 +vn 0.92821625 -0.21575865 0.30308876 +vn 0.83304988 -0.45454583 0.31530300 +vn 0.59569058 -0.73873998 0.31530300 +vn 0.26764278 -0.91046766 0.31530300 +vn -0.10115120 -0.94358489 0.31530300 +vn -0.45454583 -0.83304988 0.31530300 +vn -0.73873998 -0.59569058 0.31530300 +vn -0.91046766 -0.26764278 0.31530300 +vn -0.94358489 0.10115120 0.31530300 +vn -0.83304988 0.45454583 0.31530300 +vn -0.59569058 0.73873998 0.31530300 +vn -0.26764278 0.91046766 0.31530300 +vn 0.10115120 0.94358489 0.31530300 +vn 0.45454583 0.83304988 0.31530300 +vn 0.73873998 0.59569058 0.31530300 +vn 0.91046766 0.26764278 0.31530300 +vn 0.94358489 -0.10115120 0.31530300 +vn 0.83304988 -0.45454583 0.31530300 +vn 0.59569058 -0.73873998 0.31530300 +vn 0.26764278 -0.91046766 0.31530300 +vn -0.10115120 -0.94358489 0.31530300 +vn -0.45454583 -0.83304988 0.31530300 +vn -0.73873998 -0.59569058 0.31530300 +vn -0.91046766 -0.26764278 0.31530300 +vn -0.94358489 0.10115120 0.31530300 +vn -0.83304988 0.45454583 0.31530300 +vn -0.59569058 0.73873998 0.31530300 +vn -0.26764278 0.91046766 0.31530300 +vn 0.10115120 0.94358489 0.31530300 +vn 0.45454583 0.83304988 0.31530300 +vn 0.73873998 0.59569058 0.31530300 +vn 0.91046766 0.26764278 0.31530300 +vn 0.94358489 -0.10115120 0.31530300 +vn 0.83304988 -0.45454583 0.31530300 +vn 0.59569058 -0.73873998 0.31530300 +vn 0.26764278 -0.91046766 0.31530300 +vn -0.10115120 -0.94358489 0.31530300 +vn -0.45454583 -0.83304988 0.31530300 +vn -0.73873998 -0.59569058 0.31530300 +vn -0.91046766 -0.26764278 0.31530300 +vn -0.94358489 0.10115120 0.31530300 +vn -0.83304988 0.45454583 0.31530300 +vn -0.59569058 0.73873998 0.31530300 +vn -0.26764278 0.91046766 0.31530300 +vn 0.10115120 0.94358489 0.31530300 +vn 0.45454583 0.83304988 0.31530300 +vn 0.73873998 0.59569058 0.31530300 +vn 0.91046766 0.26764278 0.31530300 +vn 0.94358489 -0.10115120 0.31530300 +vn 0.83304988 -0.45454583 0.31530300 +vn 0.59569058 -0.73873998 0.31530300 +vn 0.26764278 -0.91046766 0.31530300 +vn -0.10115120 -0.94358489 0.31530300 +vn -0.45454583 -0.83304988 0.31530300 +vn -0.73873998 -0.59569058 0.31530300 +vn -0.88273573 -0.36050671 0.30135121 +vn -0.95177646 4.6526615e-2 0.30324386 +vn 0.99874163 -5.0149442e-2 -4.3837173e-4 +vn 0.99160434 -0.12930861 -3.3143847e-4 +vn 0.92050485 -0.39073113 -3.5839200e-17 +vn 0.70090926 -0.71325045 -3.0821712e-16 +vn 0.37460659 -0.92718385 -7.9563025e-16 +vn -8.7265355e-3 -0.99996192 -6.5227345e-16 +vn -0.39073113 -0.92050485 -3.0104928e-16 +vn -0.71325045 -0.70090926 -1.4335680e-16 +vn -0.92718385 -0.37460659 3.7272768e-16 +vn -0.99996192 8.7265355e-3 5.6625937e-16 +vn -0.92050485 0.39073113 2.1503520e-16 +vn -0.70090926 0.71325045 1.7919600e-16 +vn -0.37460659 0.92718385 1.5769248e-16 +vn 8.7265355e-3 0.99996192 1.4335680e-16 +vn 0.39073113 0.92050485 3.0821712e-16 +vn 0.71325045 0.70090926 7.1678401e-17 +vn 0.92718385 0.37460659 -3.7989552e-16 +vn 0.99996192 -8.7265355e-3 -4.5157393e-16 +vn 0.92050485 -0.39073113 -1.7919600e-16 +vn 0.70090926 -0.71325045 -3.0821712e-16 +vn 0.37460659 -0.92718385 -4.7307745e-16 +vn -8.7265355e-3 -0.99996192 -4.8741313e-16 +vn -0.39073113 -0.92050485 -5.2325233e-16 +vn -0.71325045 -0.70090926 0.0000000e+0 +vn -0.92718385 -0.37460659 1.9353168e-16 +vn -0.99996192 8.7265355e-3 -1.0034976e-16 +vn -0.92050485 0.39073113 -1.4335680e-16 +vn -0.70090926 0.71325045 2.6521008e-16 +vn -0.37460659 0.92718385 7.0244833e-16 +vn 8.7265355e-3 0.99996192 4.9458097e-16 +vn 0.39073113 0.92050485 2.7237792e-16 +vn 0.71325045 0.70090926 2.7237792e-16 +vn 0.92718385 0.37460659 5.0174881e-17 +vn 0.99996192 -8.7265355e-3 -9.3181921e-17 +vn 0.92050485 -0.39073113 -7.1678401e-17 +vn 0.70090926 -0.71325045 1.0034976e-16 +vn 0.37460659 -0.92718385 2.5087440e-16 +vn -8.7265355e-3 -0.99996192 2.2937088e-16 +vn -0.39073113 -0.92050485 2.1503520e-17 +vn -0.71325045 -0.70090926 -2.6521008e-16 +vn -0.92718385 -0.37460659 -3.5122416e-16 +vn -0.99996192 8.7265355e-3 2.2220304e-16 +vn -0.92050485 0.39073113 8.0279809e-16 +vn -0.70090926 0.71325045 2.8671360e-16 +vn -0.37460659 0.92718385 -3.0821712e-16 +vn 8.7265355e-3 0.99996192 1.2185328e-16 +vn 0.39073113 0.92050485 4.7307745e-16 +vn 0.71325045 0.70090926 1.9353168e-16 +vn 0.92718385 0.37460659 4.3007041e-17 +vn 0.99996192 -8.7265355e-3 1.0034976e-16 +vn 0.92050485 -0.39073113 -2.9388144e-16 +vn 0.70090926 -0.71325045 -7.2395185e-16 +vn 0.37460659 -0.92718385 -5.4475585e-16 +vn -8.7265355e-3 -0.99996192 -3.5839200e-16 +vn -0.39073113 -0.92050485 -4.9458097e-16 +vn -0.71325045 -0.70090926 -4.4440609e-16 +vn -0.86533961 -0.50118095 2.2380062e-3 +vn -0.99544775 -9.5278737e-2 2.3945691e-3 +vn 0.95393844 -7.2357386e-3 -0.29991514 +vn 0.95015026 -3.8775050e-2 -0.30937190 +vn 0.90565798 -0.28349187 -0.31530300 +vn 0.72823123 -0.60849264 -0.31530300 +vn 0.43993788 -0.84085592 -0.31530300 +vn 8.4667968e-2 -0.94520651 -0.31530300 +vn -0.28349187 -0.90565798 -0.31530300 +vn -0.60849264 -0.72823123 -0.31530300 +vn -0.84085592 -0.43993788 -0.31530300 +vn -0.94520651 -8.4667968e-2 -0.31530300 +vn -0.90565798 0.28349187 -0.31530300 +vn -0.72823123 0.60849264 -0.31530300 +vn -0.43993788 0.84085592 -0.31530300 +vn -8.4667968e-2 0.94520651 -0.31530300 +vn 0.28349187 0.90565798 -0.31530300 +vn 0.60849264 0.72823123 -0.31530300 +vn 0.84085592 0.43993788 -0.31530300 +vn 0.94520651 8.4667968e-2 -0.31530300 +vn 0.90565798 -0.28349187 -0.31530300 +vn 0.72823123 -0.60849264 -0.31530300 +vn 0.43993788 -0.84085592 -0.31530300 +vn 8.4667968e-2 -0.94520651 -0.31530300 +vn -0.28349187 -0.90565798 -0.31530300 +vn -0.60849264 -0.72823123 -0.31530300 +vn -0.84085592 -0.43993788 -0.31530300 +vn -0.94520651 -8.4667968e-2 -0.31530300 +vn -0.90565798 0.28349187 -0.31530300 +vn -0.72823123 0.60849264 -0.31530300 +vn -0.43993788 0.84085592 -0.31530300 +vn -8.4667968e-2 0.94520651 -0.31530300 +vn 0.28349187 0.90565798 -0.31530300 +vn 0.60849264 0.72823123 -0.31530300 +vn 0.84085592 0.43993788 -0.31530300 +vn 0.94520651 8.4667968e-2 -0.31530300 +vn 0.90565798 -0.28349187 -0.31530300 +vn 0.72823123 -0.60849264 -0.31530300 +vn 0.43993788 -0.84085592 -0.31530300 +vn 8.4667968e-2 -0.94520651 -0.31530300 +vn -0.28349187 -0.90565798 -0.31530300 +vn -0.60849264 -0.72823123 -0.31530300 +vn -0.84085592 -0.43993788 -0.31530300 +vn -0.94520651 -8.4667968e-2 -0.31530300 +vn -0.90565798 0.28349187 -0.31530300 +vn -0.72823123 0.60849264 -0.31530300 +vn -0.43993788 0.84085592 -0.31530300 +vn -8.4667968e-2 0.94520651 -0.31530300 +vn 0.28349187 0.90565798 -0.31530300 +vn 0.60849264 0.72823123 -0.31530300 +vn 0.84085592 0.43993788 -0.31530300 +vn 0.94520651 8.4667968e-2 -0.31530300 +vn 0.90565798 -0.28349187 -0.31530300 +vn 0.72823123 -0.60849264 -0.31530300 +vn 0.43993788 -0.84085592 -0.31530300 +vn 8.4667968e-2 -0.94520651 -0.31530300 +vn -0.28349187 -0.90565798 -0.31530300 +vn -0.60849264 -0.72823123 -0.31530300 +vn -0.78352551 -0.55278650 -0.28375139 +vn -0.95034353 -8.1153447e-2 -0.30043518 +vn 0.79914277 -6.0272478e-3 -0.60111106 +vn 0.78711814 3.8180412e-2 -0.61561943 +vn 0.77112579 -0.14572698 -0.61978114 +vn 0.65666003 -0.42973124 -0.61978114 +vn 0.44222374 -0.64831281 -0.61978114 +vn 0.16046289 -0.76819464 -0.61978114 +vn -0.14572698 -0.77112579 -0.61978114 +vn -0.42973124 -0.65666003 -0.61978114 +vn -0.64831281 -0.44222374 -0.61978114 +vn -0.76819464 -0.16046289 -0.61978114 +vn -0.77112579 0.14572698 -0.61978114 +vn -0.65666003 0.42973124 -0.61978114 +vn -0.44222374 0.64831281 -0.61978114 +vn -0.16046289 0.76819464 -0.61978114 +vn 0.14572698 0.77112579 -0.61978114 +vn 0.42973124 0.65666003 -0.61978114 +vn 0.64831281 0.44222374 -0.61978114 +vn 0.76819464 0.16046289 -0.61978114 +vn 0.77112579 -0.14572698 -0.61978114 +vn 0.65666003 -0.42973124 -0.61978114 +vn 0.44222374 -0.64831281 -0.61978114 +vn 0.16046289 -0.76819464 -0.61978114 +vn -0.14572698 -0.77112579 -0.61978114 +vn -0.42973124 -0.65666003 -0.61978114 +vn -0.64831281 -0.44222374 -0.61978114 +vn -0.76819464 -0.16046289 -0.61978114 +vn -0.77112579 0.14572698 -0.61978114 +vn -0.65666003 0.42973124 -0.61978114 +vn -0.44222374 0.64831281 -0.61978114 +vn -0.16046289 0.76819464 -0.61978114 +vn 0.14572698 0.77112579 -0.61978114 +vn 0.42973124 0.65666003 -0.61978114 +vn 0.64831281 0.44222374 -0.61978114 +vn 0.76819464 0.16046289 -0.61978114 +vn 0.77112579 -0.14572698 -0.61978114 +vn 0.65666003 -0.42973124 -0.61978114 +vn 0.44222374 -0.64831281 -0.61978114 +vn 0.16046289 -0.76819464 -0.61978114 +vn -0.14572698 -0.77112579 -0.61978114 +vn -0.42973124 -0.65666003 -0.61978114 +vn -0.64831281 -0.44222374 -0.61978114 +vn -0.76819464 -0.16046289 -0.61978114 +vn -0.77112579 0.14572698 -0.61978114 +vn -0.65666003 0.42973124 -0.61978114 +vn -0.44222374 0.64831281 -0.61978114 +vn -0.16046289 0.76819464 -0.61978114 +vn 0.14572698 0.77112579 -0.61978114 +vn 0.42973124 0.65666003 -0.61978114 +vn 0.64831281 0.44222374 -0.61978114 +vn 0.76819464 0.16046289 -0.61978114 +vn 0.77112579 -0.14572698 -0.61978114 +vn 0.65666003 -0.42973124 -0.61978114 +vn 0.44222374 -0.64831281 -0.61978114 +vn 0.16046289 -0.76819464 -0.61978114 +vn -0.14572698 -0.77112579 -0.61978114 +vn -0.42973124 -0.65666003 -0.61978114 +vn -0.63343759 -0.51459250 -0.57788527 +vn -0.77388070 -1.6967140e-2 -0.63310408 +vn 0.50070102 -6.0399371e-2 -0.86351051 +vn 0.47277638 8.7231554e-2 -0.87685412 +vn 0.49063448 1.8328779e-2 -0.87117270 +vn 0.46030127 -0.17082410 -0.87117270 +vn 0.35989137 -0.33397056 -0.87117270 +vn 0.20469127 -0.44627303 -0.87117270 +vn 1.8328779e-2 -0.49063448 -0.87117270 +vn -0.17082410 -0.46030127 -0.87117270 +vn -0.33397056 -0.35989137 -0.87117270 +vn -0.44627303 -0.20469127 -0.87117270 +vn -0.49063448 -1.8328779e-2 -0.87117270 +vn -0.46030127 0.17082410 -0.87117270 +vn -0.35989137 0.33397056 -0.87117270 +vn -0.20469127 0.44627303 -0.87117270 +vn -1.8328779e-2 0.49063448 -0.87117270 +vn 0.17082410 0.46030127 -0.87117270 +vn 0.33397056 0.35989137 -0.87117270 +vn 0.44627303 0.20469127 -0.87117270 +vn 0.49063448 1.8328779e-2 -0.87117270 +vn 0.46030127 -0.17082410 -0.87117270 +vn 0.35989137 -0.33397056 -0.87117270 +vn 0.20469127 -0.44627303 -0.87117270 +vn 1.8328779e-2 -0.49063448 -0.87117270 +vn -0.17082410 -0.46030127 -0.87117270 +vn -0.33397056 -0.35989137 -0.87117270 +vn -0.44627303 -0.20469127 -0.87117270 +vn -0.49063448 -1.8328779e-2 -0.87117270 +vn -0.46030127 0.17082410 -0.87117270 +vn -0.35989137 0.33397056 -0.87117270 +vn -0.20469127 0.44627303 -0.87117270 +vn -1.8328779e-2 0.49063448 -0.87117270 +vn 0.17082410 0.46030127 -0.87117270 +vn 0.33397056 0.35989137 -0.87117270 +vn 0.44627303 0.20469127 -0.87117270 +vn 0.49063448 1.8328779e-2 -0.87117270 +vn 0.46030127 -0.17082410 -0.87117270 +vn 0.35989137 -0.33397056 -0.87117270 +vn 0.20469127 -0.44627303 -0.87117270 +vn 1.8328779e-2 -0.49063448 -0.87117270 +vn -0.17082410 -0.46030127 -0.87117270 +vn -0.33397056 -0.35989137 -0.87117270 +vn -0.44627303 -0.20469127 -0.87117270 +vn -0.49063448 -1.8328779e-2 -0.87117270 +vn -0.46030127 0.17082410 -0.87117270 +vn -0.35989137 0.33397056 -0.87117270 +vn -0.20469127 0.44627303 -0.87117270 +vn -1.8328779e-2 0.49063448 -0.87117270 +vn 0.17082410 0.46030127 -0.87117270 +vn 0.33397056 0.35989137 -0.87117270 +vn 0.44627303 0.20469127 -0.87117270 +vn 0.49063448 1.8328779e-2 -0.87117270 +vn 0.46030127 -0.17082410 -0.87117270 +vn 0.35989137 -0.33397056 -0.87117270 +vn 0.20469127 -0.44627303 -0.87117270 +vn 1.8328779e-2 -0.49063448 -0.87117270 +vn -0.17082410 -0.46030127 -0.87117270 +vn -0.35379572 -0.39272707 -0.84887810 +vn -0.43728551 -3.4574426e-2 -0.89865788 +vn 6.5510561e-2 -0.16584388 -0.98397367 +vn 2.1947758e-2 9.8685398e-2 -0.99487662 +vn 8.0287791e-2 0.19081956 -0.97833622 +vn 0.14719973 0.14556948 -0.97833622 +vn 0.19170185 7.8157763e-2 -0.97833622 +vn 0.20701909 -1.1527633e-3 -0.97833622 +vn 0.19081956 -8.0287791e-2 -0.97833622 +vn 0.14556948 -0.14719973 -0.97833622 +vn 7.8157763e-2 -0.19170185 -0.97833622 +vn -1.1527633e-3 -0.20701909 -0.97833622 +vn -8.0287791e-2 -0.19081956 -0.97833622 +vn -0.14719973 -0.14556948 -0.97833622 +vn -0.19170185 -7.8157763e-2 -0.97833622 +vn -0.20701909 1.1527633e-3 -0.97833622 +vn -0.19081956 8.0287791e-2 -0.97833622 +vn -0.14556948 0.14719973 -0.97833622 +vn -7.8157763e-2 0.19170185 -0.97833622 +vn 1.1527633e-3 0.20701909 -0.97833622 +vn 8.0287791e-2 0.19081956 -0.97833622 +vn 0.14719973 0.14556948 -0.97833622 +vn 0.19170185 7.8157763e-2 -0.97833622 +vn 0.20701909 -1.1527633e-3 -0.97833622 +vn 0.19081956 -8.0287791e-2 -0.97833622 +vn 0.14556948 -0.14719973 -0.97833622 +vn 7.8157763e-2 -0.19170185 -0.97833622 +vn -1.1527633e-3 -0.20701909 -0.97833622 +vn -8.0287791e-2 -0.19081956 -0.97833622 +vn -0.14719973 -0.14556948 -0.97833622 +vn -0.19170185 -7.8157763e-2 -0.97833622 +vn -0.20701909 1.1527633e-3 -0.97833622 +vn -0.19081956 8.0287791e-2 -0.97833622 +vn -0.14556948 0.14719973 -0.97833622 +vn -7.8157763e-2 0.19170185 -0.97833622 +vn 1.1527633e-3 0.20701909 -0.97833622 +vn 8.0287791e-2 0.19081956 -0.97833622 +vn 0.14719973 0.14556948 -0.97833622 +vn 0.19170185 7.8157763e-2 -0.97833622 +vn 0.20701909 -1.1527633e-3 -0.97833622 +vn 0.19081956 -8.0287791e-2 -0.97833622 +vn 0.14556948 -0.14719973 -0.97833622 +vn 7.8157763e-2 -0.19170185 -0.97833622 +vn -1.1527633e-3 -0.20701909 -0.97833622 +vn -8.0287791e-2 -0.19081956 -0.97833622 +vn -0.14719973 -0.14556948 -0.97833622 +vn -0.19170185 -7.8157763e-2 -0.97833622 +vn -0.20701909 1.1527633e-3 -0.97833622 +vn -0.19081956 8.0287791e-2 -0.97833622 +vn -0.14556948 0.14719973 -0.97833622 +vn -7.8157763e-2 0.19170185 -0.97833622 +vn 1.1527633e-3 0.20701909 -0.97833622 +vn 8.0287791e-2 0.19081956 -0.97833622 +vn 0.14719973 0.14556948 -0.97833622 +vn 0.19170185 7.8157763e-2 -0.97833622 +vn 0.20701909 -1.1527633e-3 -0.97833622 +vn 0.19081956 -8.0287791e-2 -0.97833622 +vn 0.14556948 -0.14719973 -0.97833622 +vn 6.0441738e-2 -0.19919693 -0.97809375 +vn 9.2050074e-4 -0.11273891 -0.99362422 +vn -0.37952033 -0.28270475 -0.88093265 +vn -0.43938502 7.5478133e-2 -0.89512226 +vn -0.34796035 0.32839208 -0.87811288 +vn -0.19580324 0.43655338 -0.87811288 +vn -1.3836861e-2 0.47825339 -0.87811288 +vn 0.17023606 0.44714365 -0.87811288 +vn 0.32839208 0.34796035 -0.87811288 +vn 0.43655338 0.19580324 -0.87811288 +vn 0.47825339 1.3836861e-2 -0.87811288 +vn 0.44714365 -0.17023606 -0.87811288 +vn 0.34796035 -0.32839208 -0.87811288 +vn 0.19580324 -0.43655338 -0.87811288 +vn 1.3836861e-2 -0.47825339 -0.87811288 +vn -0.17023606 -0.44714365 -0.87811288 +vn -0.32839208 -0.34796035 -0.87811288 +vn -0.43655338 -0.19580324 -0.87811288 +vn -0.47825339 -1.3836861e-2 -0.87811288 +vn -0.44714365 0.17023606 -0.87811288 +vn -0.34796035 0.32839208 -0.87811288 +vn -0.19580324 0.43655338 -0.87811288 +vn -1.3836861e-2 0.47825339 -0.87811288 +vn 0.17023606 0.44714365 -0.87811288 +vn 0.32839208 0.34796035 -0.87811288 +vn 0.43655338 0.19580324 -0.87811288 +vn 0.47825339 1.3836861e-2 -0.87811288 +vn 0.44714365 -0.17023606 -0.87811288 +vn 0.34796035 -0.32839208 -0.87811288 +vn 0.19580324 -0.43655338 -0.87811288 +vn 1.3836861e-2 -0.47825339 -0.87811288 +vn -0.17023606 -0.44714365 -0.87811288 +vn -0.32839208 -0.34796035 -0.87811288 +vn -0.43655338 -0.19580324 -0.87811288 +vn -0.47825339 -1.3836861e-2 -0.87811288 +vn -0.44714365 0.17023606 -0.87811288 +vn -0.34796035 0.32839208 -0.87811288 +vn -0.19580324 0.43655338 -0.87811288 +vn -1.3836861e-2 0.47825339 -0.87811288 +vn 0.17023606 0.44714365 -0.87811288 +vn 0.32839208 0.34796035 -0.87811288 +vn 0.43655338 0.19580324 -0.87811288 +vn 0.47825339 1.3836861e-2 -0.87811288 +vn 0.44714365 -0.17023606 -0.87811288 +vn 0.34796035 -0.32839208 -0.87811288 +vn 0.19580324 -0.43655338 -0.87811288 +vn 1.3836861e-2 -0.47825339 -0.87811288 +vn -0.17023606 -0.44714365 -0.87811288 +vn -0.32839208 -0.34796035 -0.87811288 +vn -0.43655338 -0.19580324 -0.87811288 +vn -0.47825339 -1.3836861e-2 -0.87811288 +vn -0.44714365 0.17023606 -0.87811288 +vn -0.34796035 0.32839208 -0.87811288 +vn -0.19580324 0.43655338 -0.87811288 +vn -1.3836861e-2 0.47825339 -0.87811288 +vn 0.17023606 0.44714365 -0.87811288 +vn 0.32839208 0.34796035 -0.87811288 +vn 0.43655338 0.19580324 -0.87811288 +vn 0.47829310 1.1221039e-2 -0.87812858 +vn 0.42295285 -0.20390661 -0.88291165 +vn -0.69163834 -0.37145236 -0.61940258 +vn -0.77158676 3.4535433e-2 -0.63518593 +vn -0.66903702 0.40188169 -0.62520443 +vn -0.46431615 0.62731965 -0.62520443 +vn -0.18890735 0.75725388 -0.62520443 +vn 0.11526088 0.77190307 -0.62520443 +vn 0.40188169 0.66903702 -0.62520443 +vn 0.62731965 0.46431615 -0.62520443 +vn 0.75725388 0.18890735 -0.62520443 +vn 0.77190307 -0.11526088 -0.62520443 +vn 0.66903702 -0.40188169 -0.62520443 +vn 0.46431615 -0.62731965 -0.62520443 +vn 0.18890735 -0.75725388 -0.62520443 +vn -0.11526088 -0.77190307 -0.62520443 +vn -0.40188169 -0.66903702 -0.62520443 +vn -0.62731965 -0.46431615 -0.62520443 +vn -0.75725388 -0.18890735 -0.62520443 +vn -0.77190307 0.11526088 -0.62520443 +vn -0.66903702 0.40188169 -0.62520443 +vn -0.46431615 0.62731965 -0.62520443 +vn -0.18890735 0.75725388 -0.62520443 +vn 0.11526088 0.77190307 -0.62520443 +vn 0.40188169 0.66903702 -0.62520443 +vn 0.62731965 0.46431615 -0.62520443 +vn 0.75725388 0.18890735 -0.62520443 +vn 0.77190307 -0.11526088 -0.62520443 +vn 0.66903702 -0.40188169 -0.62520443 +vn 0.46431615 -0.62731965 -0.62520443 +vn 0.18890735 -0.75725388 -0.62520443 +vn -0.11526088 -0.77190307 -0.62520443 +vn -0.40188169 -0.66903702 -0.62520443 +vn -0.62731965 -0.46431615 -0.62520443 +vn -0.75725388 -0.18890735 -0.62520443 +vn -0.77190307 0.11526088 -0.62520443 +vn -0.66903702 0.40188169 -0.62520443 +vn -0.46431615 0.62731965 -0.62520443 +vn -0.18890735 0.75725388 -0.62520443 +vn 0.11526088 0.77190307 -0.62520443 +vn 0.40188169 0.66903702 -0.62520443 +vn 0.62731965 0.46431615 -0.62520443 +vn 0.75725388 0.18890735 -0.62520443 +vn 0.77190307 -0.11526088 -0.62520443 +vn 0.66903702 -0.40188169 -0.62520443 +vn 0.46431615 -0.62731965 -0.62520443 +vn 0.18890735 -0.75725388 -0.62520443 +vn -0.11526088 -0.77190307 -0.62520443 +vn -0.40188169 -0.66903702 -0.62520443 +vn -0.62731965 -0.46431615 -0.62520443 +vn -0.75725388 -0.18890735 -0.62520443 +vn -0.77190307 0.11526088 -0.62520443 +vn -0.66903702 0.40188169 -0.62520443 +vn -0.46431615 0.62731965 -0.62520443 +vn -0.18890735 0.75725388 -0.62520443 +vn 0.11526088 0.77190307 -0.62520443 +vn 0.40188169 0.66903702 -0.62520443 +vn 0.62731965 0.46431615 -0.62520443 +vn 0.76568120 0.17593837 -0.61869055 +vn 0.72828599 -0.27262547 -0.62870889 +vn -0.84883488 -0.42826451 -0.30994978 +vn -0.94721932 -1.0962757e-2 -0.32039879 +vn -0.85150364 0.41792905 -0.31666523 +vn -0.62675226 0.71197243 -0.31666523 +vn -0.30658353 0.89762446 -0.31666523 +vn 6.0259760e-2 0.94662130 -0.31666523 +vn 0.41792905 0.85150364 -0.31666523 +vn 0.71197243 0.62675226 -0.31666523 +vn 0.89762446 0.30658353 -0.31666523 +vn 0.94662130 -6.0259760e-2 -0.31666523 +vn 0.85150364 -0.41792905 -0.31666523 +vn 0.62675226 -0.71197243 -0.31666523 +vn 0.30658353 -0.89762446 -0.31666523 +vn -6.0259760e-2 -0.94662130 -0.31666523 +vn -0.41792905 -0.85150364 -0.31666523 +vn -0.71197243 -0.62675226 -0.31666523 +vn -0.89762446 -0.30658353 -0.31666523 +vn -0.94662130 6.0259760e-2 -0.31666523 +vn -0.85150364 0.41792905 -0.31666523 +vn -0.62675226 0.71197243 -0.31666523 +vn -0.30658353 0.89762446 -0.31666523 +vn 6.0259760e-2 0.94662130 -0.31666523 +vn 0.41792905 0.85150364 -0.31666523 +vn 0.71197243 0.62675226 -0.31666523 +vn 0.89762446 0.30658353 -0.31666523 +vn 0.94662130 -6.0259760e-2 -0.31666523 +vn 0.85150364 -0.41792905 -0.31666523 +vn 0.62675226 -0.71197243 -0.31666523 +vn 0.30658353 -0.89762446 -0.31666523 +vn -6.0259760e-2 -0.94662130 -0.31666523 +vn -0.41792905 -0.85150364 -0.31666523 +vn -0.71197243 -0.62675226 -0.31666523 +vn -0.89762446 -0.30658353 -0.31666523 +vn -0.94662130 6.0259760e-2 -0.31666523 +vn -0.85150364 0.41792905 -0.31666523 +vn -0.62675226 0.71197243 -0.31666523 +vn -0.30658353 0.89762446 -0.31666523 +vn 6.0259760e-2 0.94662130 -0.31666523 +vn 0.41792905 0.85150364 -0.31666523 +vn 0.71197243 0.62675226 -0.31666523 +vn 0.89762446 0.30658353 -0.31666523 +vn 0.94662130 -6.0259760e-2 -0.31666523 +vn 0.85150364 -0.41792905 -0.31666523 +vn 0.62675226 -0.71197243 -0.31666523 +vn 0.30658353 -0.89762446 -0.31666523 +vn -6.0259760e-2 -0.94662130 -0.31666523 +vn -0.41792905 -0.85150364 -0.31666523 +vn -0.71197243 -0.62675226 -0.31666523 +vn -0.89762446 -0.30658353 -0.31666523 +vn -0.94662130 6.0259760e-2 -0.31666523 +vn -0.85150364 0.41792905 -0.31666523 +vn -0.62675226 0.71197243 -0.31666523 +vn -0.30658353 0.89762446 -0.31666523 +vn 6.0259760e-2 0.94662130 -0.31666523 +vn 0.41792905 0.85150364 -0.31666523 +vn 0.71197243 0.62675226 -0.31666523 +vn 0.90798025 0.28088783 -0.31092426 +vn 0.89652067 -0.30629867 -0.32004970 +vn 0.57504878 -0.81737869 3.4799094e-2 +vn 0.57653670 -0.74236888 0.34131199 +vn 0.51475480 -0.57081222 0.63968813 +vn 0.35852730 -0.28235249 0.88979506 +vn 9.1929347e-2 9.5445581e-2 0.99118068 +vn -0.22096355 0.43982099 0.87047838 +vn -0.48577399 0.63483266 0.60084201 +vn -0.68435450 0.66808756 0.29209233 +vn -0.77699966 0.62906914 -2.3314144e-2 +vn -0.72002235 0.60819593 -0.33416393 +vn -0.57551712 0.51660880 -0.63395220 +vn -0.37268938 0.26882751 -0.88816349 +vn -9.5887813e-2 -9.8282244e-2 -0.99052821 +vn 0.19031674 -0.45900345 -0.86781068 +vn 0.40017793 -0.69883707 -0.59286117 +vn 0.52047234 -0.80759111 -0.27731777 +vn 0.24908260 -0.94982912 0.18916265 +vn 0.33311358 -0.81653369 0.47149558 +vn 0.38685138 -0.56914387 0.72554894 +vn 0.38392194 -0.19123404 0.90334572 +vn 0.29038638 0.26628731 0.91911197 +vn 0.11688449 0.66139205 0.74087689 +vn -6.9843496e-2 0.89062187 0.44934905 +vn -0.21754856 0.96637439 0.13708817 +vn -0.31981699 0.93336803 -0.16291476 +vn -0.38651116 0.80551035 -0.44917947 +vn -0.41785423 0.56499401 -0.71146301 +vn -0.39647284 0.19193980 -0.89775743 +vn -0.30213484 -0.26576758 -0.91546826 +vn -0.15096237 -0.66602815 -0.73049084 +vn 7.2417329e-3 -0.90265186 -0.43031056 +vn 0.14151806 -0.98355351 -0.11222802 +vn -0.20077216 -0.82841382 0.52289683 +vn -5.7075620e-2 -0.65729363 0.75147019 +vn 0.10533487 -0.40438488 0.90850285 +vn 0.33884301 -8.3597331e-2 0.93712160 +vn 0.60455324 0.26964965 0.74953615 +vn 0.70639786 0.59904193 0.37702895 +vn 0.58489367 0.81102222 1.1930665e-2 +vn 0.38289935 0.87968468 -0.28203360 +vn 0.17067381 0.83934775 -0.51610639 +vn -3.7960525e-2 0.70743151 -0.70576175 +vn -0.24385512 0.47525314 -0.84538106 +vn -0.43501496 0.12909085 -0.89112150 +vn -0.56366877 -0.29355550 -0.77207687 +vn -0.57470967 -0.66534584 -0.47647005 +vn -0.48082397 -0.87035977 -0.10621763 +vn -0.34370671 -0.90875967 0.23668874 +vn -0.32155098 -0.70660775 0.63032567 +vn -8.3493315e-2 -0.63602055 0.76714192 +vn 0.23985002 -0.51442322 0.82331083 +vn 0.68346167 -0.27689822 0.67543136 +vn 0.97221684 3.3240593e-2 0.23170989 +vn 0.95006096 0.26911840 -0.15798563 +vn 0.80104296 0.47139180 -0.36894437 +vn 0.56041188 0.65378067 -0.50843816 +vn 0.27565157 0.74644452 -0.60567053 +vn 7.5002965e-3 0.72611939 -0.68752773 +vn -0.33151328 0.57428192 -0.74853137 +vn -0.67993537 0.25888976 -0.68604955 +vn -0.87843432 -0.13748246 -0.45765896 +vn -0.87100329 -0.47465844 -0.12669901 +vn -0.72427756 -0.66345806 0.18773764 +vn -0.52988490 -0.72587393 0.43855334 +vn -7.9784883e-2 -0.97776224 0.19394682 +vn 0.26678782 -0.90823305 0.32239260 +vn 0.60139199 -0.79316776 9.5982146e-2 +vn 0.90138042 -0.43261282 1.8960198e-2 +vn 0.99623553 -5.8594085e-2 -6.3886680e-2 +vn 0.93474992 0.32937763 -0.13324024 +vn 0.72064556 0.66954782 -0.17993246 +vn 0.35113240 0.90664447 -0.23388424 +vn -9.8478855e-3 0.96923272 -0.24594907 +vn -0.25338814 0.93912266 -0.23204113 +vn -0.60381014 0.77904066 -0.16884600 +vn -0.90343684 0.42304679 -6.9521909e-2 +vn -0.99836575 1.4880188e-2 5.5176192e-2 +vn -0.91121575 -0.38569920 0.14464435 +vn -0.64570427 -0.74806298 0.15319196 +vn -0.42188120 -0.86360127 0.27605994 +vn -0.70647352 -0.29851955 -0.64170184 +vn -0.69994316 0.34914584 -0.62303833 +vn -0.21498938 0.68901032 -0.69213030 +vn 0.18362850 0.68586910 -0.70417622 +vn 0.64770209 0.30836516 -0.69670146 +vn 0.57584013 -0.27020370 -0.77162044 +vn 0.13580667 -0.34595790 -0.92836936 +vn -0.13911264 -0.40103126 -0.90544000 +vn -0.58925753 0.74571497 -0.31094171 +vn -7.2140812e-2 0.90326187 -0.42298192 +vn 0.59738624 0.70748451 -0.37761800 +vn 0.89813735 -4.4596192e-3 -0.43969242 +vn 0.42670270 -0.62766197 -0.65112615 +vn 7.5444686e-3 -0.77804006 -0.62816936 +vn -0.49713614 -0.74281143 -0.44842707 +vn -0.97795526 4.9104047e-2 -0.20295885 +vn -0.82381584 -0.54630939 0.15123994 +vn -0.83725579 -0.52502236 -0.15282098 +vn -0.70373777 -0.55278807 0.44629419 +vn -0.45801440 -0.53563478 0.70944922 +vn -8.5851338e-2 -0.47794088 0.87418651 +vn 0.33364636 -0.37568184 0.86460584 +vn 0.67662325 -0.25631258 0.69027881 +vn 0.88931153 -0.15241998 0.43115329 +vn 0.98634468 -7.6645606e-2 0.14577248 +vn 0.98854350 -3.2727893e-2 -0.14734530 +vn 0.89520140 -2.8637988e-2 -0.44474074 +vn 0.68061845 -7.5852883e-2 -0.72870081 +vn 0.31941280 -0.17742851 -0.93085691 +vn -0.12943860 -0.30736232 -0.94274814 +vn -0.51154406 -0.41719504 -0.75117972 +vn -0.74226510 -0.48615694 -0.46118755 +vn 0.37460659 -0.92718385 -1.6157969e-16 +vn -0.97267836 -0.17160745 0.15635760 +vn -0.85626598 -0.22460270 0.46514749 +vn -0.60360930 -0.28032095 0.74637523 +vn -0.20336761 -0.32433210 0.92382374 +vn 0.25706639 -0.33228301 0.90747169 +vn 0.63184012 -0.29722127 0.71584745 +vn 0.86537718 -0.23193223 0.44421816 +vn 0.97748446 -0.14819236 0.15021038 +vn 0.98663509 -5.8073129e-2 -0.15224553 +vn 0.88755677 2.0737818e-2 -0.46023137 +vn 0.65244936 7.0379503e-2 -0.75455719 +vn 0.25700131 7.7711115e-2 -0.96328153 +vn -0.22895212 4.2179160e-2 -0.97252344 +vn -0.63549308 -1.4844601e-2 -0.77196385 +vn -0.87799097 -7.1257089e-2 -0.47334373 +vn -0.97999473 -0.12209623 -0.15717137 +vn -0.45837685 -0.18519627 -0.86924853 +vn -0.45507492 0.19316784 -0.86924853 +vn -0.18519627 0.45837685 -0.86924853 +vn 0.19316784 0.45507492 -0.86924853 +vn 0.45837685 0.18519627 -0.86924853 +vn 0.45507492 -0.19316784 -0.86924853 +vn 0.18519627 -0.45837685 -0.86924853 +vn -0.19316784 -0.45507492 -0.86924853 +vn 0.18075204 -0.92021900 0.34716810 +vn -0.19678455 -0.91692429 0.34716810 +vn -0.19864256 -0.92500653 -0.32388894 +vn 0.18246871 -0.92833244 -0.32388894 +vn 0.92021900 0.18075204 0.34716810 +vn 0.91692429 -0.19678455 0.34716810 +vn 0.92500653 -0.19864256 -0.32388894 +vn 0.92833244 0.18246871 -0.32388894 +vn -0.52288210 -0.77850409 0.34716810 +vn -0.78751107 -0.50921569 0.34716810 +vn -0.79453989 -0.51361689 -0.32388894 +vn -0.52740530 -0.78545503 -0.32388894 +vn 0.52288210 0.77850409 0.34716810 +vn 0.78751107 0.50921569 0.34716810 +vn 0.79453989 0.51361689 -0.32388894 +vn 0.52740530 0.78545503 -0.32388894 +vn -0.77850409 0.52288210 0.34716810 +vn -0.50921569 0.78751107 0.34716810 +vn -0.51361689 0.79453989 -0.32388894 +vn -0.78545503 0.52740530 -0.32388894 +vn -0.53369641 0.22654069 0.81476835 +vn -0.53756881 -0.21719190 0.81476835 +vn -0.22654069 -0.53369641 0.81476835 +vn 0.21719190 -0.53756881 0.81476835 +vn 0.53369641 -0.22654069 0.81476835 +vn 0.53756881 0.21719190 0.81476835 +vn 0.22654069 0.53369641 0.81476835 +vn -0.21719190 0.53756881 0.81476835 +vn -0.18075204 0.92021900 0.34716810 +vn 0.19678455 0.91692429 0.34716810 +vn 0.19864256 0.92500653 -0.32388894 +vn -0.18246871 0.92833244 -0.32388894 +vn -0.92021900 -0.18075204 0.34716810 +vn -0.91692429 0.19678455 0.34716810 +vn -0.92500653 0.19864256 -0.32388894 +vn -0.92833244 -0.18246871 -0.32388894 +vn 0.77850409 -0.52288210 0.34716810 +vn 0.50921569 -0.78751107 0.34716810 +vn 0.51361689 -0.79453989 -0.32388894 +vn 0.78545503 -0.52740530 -0.32388894 +g w_plasma_w_plasma +usemtl w_plasma +s 1 +f 1/1089/1 1025/1087/1025 1042/1137/1042 2/1141/2 +f 1/1089/1 1026/1088/1026 1041/880/1041 1025/1087/1025 +f 2/1141/2 1042/1137/1042 60/1135/60 61/1100/61 3/1111/3 +f 2/1141/2 1057/1137/1057 1026/1088/1026 1/1089/1 +f 3/1111/3 61/1100/61 62/983/62 4/1011/4 +f 3/1111/3 873/1101/873 872/1136/872 1057/1137/1057 2/1141/2 +f 4/1011/4 62/983/62 63/754/63 5/765/5 +f 4/1011/4 874/984/874 873/1101/873 3/1111/3 +f 5/765/5 63/754/63 64/490/64 6/484/6 +f 5/765/5 875/755/875 874/984/874 4/1011/4 +f 6/484/6 64/490/64 65/312/65 7/307/7 +f 6/484/6 876/491/876 875/755/875 5/765/5 +f 7/307/7 65/312/65 66/120/66 8/108/8 +f 7/307/7 877/313/877 876/491/876 6/484/6 +f 8/108/8 66/120/66 67/52/67 9/34/9 +f 8/108/8 878/121/878 877/313/877 7/307/7 +f 9/34/9 67/52/67 68/27/68 10/21/10 +f 9/34/9 879/53/879 878/121/878 8/108/8 +f 10/21/10 68/27/68 69/58/69 11/43/11 +f 10/21/10 880/28/880 879/53/879 9/34/9 +f 11/43/11 69/58/69 70/140/70 12/113/12 +f 11/43/11 881/59/881 880/28/880 10/21/10 +f 12/113/12 70/140/70 71/334/71 13/321/13 +f 12/113/12 882/141/882 881/59/881 11/43/11 +f 13/321/13 71/334/71 72/587/72 14/591/14 +f 13/321/13 883/335/883 882/141/882 12/113/12 +f 14/591/14 72/587/72 73/770/73 15/775/15 +f 14/591/14 884/588/884 883/335/883 13/321/13 +f 15/775/15 73/770/73 74/1006/74 16/1016/16 +f 15/775/15 885/771/885 884/588/884 14/591/14 +f 16/1016/16 74/1006/74 75/1106/75 17/1124/17 +f 16/1016/16 886/1007/886 885/771/885 15/775/15 +f 17/1124/17 75/1106/75 76/1133/76 18/1140/18 +f 17/1124/17 887/1107/887 886/1007/886 16/1016/16 +f 18/1140/18 76/1133/76 77/1098/77 19/1110/19 +f 18/1140/18 888/1134/888 887/1107/887 17/1124/17 +f 19/1110/19 77/1098/77 78/981/78 20/1010/20 +f 19/1110/19 889/1099/889 888/1134/888 18/1140/18 +f 20/1010/20 78/981/78 79/752/79 21/764/21 +f 20/1010/20 890/982/890 889/1099/889 19/1110/19 +f 21/764/21 79/752/79 80/488/80 22/483/22 +f 21/764/21 891/753/891 890/982/890 20/1010/20 +f 22/483/22 80/488/80 81/316/81 23/308/23 +f 22/483/22 892/489/892 891/753/891 21/764/21 +f 23/308/23 81/316/81 82/118/82 24/107/24 +f 23/308/23 893/317/893 892/489/892 22/483/22 +f 24/107/24 82/118/82 83/50/83 25/33/25 +f 24/107/24 894/119/894 893/317/893 23/308/23 +f 25/33/25 83/50/83 84/25/84 26/20/26 +f 25/33/25 895/51/895 894/119/894 24/107/24 +f 26/20/26 84/25/84 85/56/85 27/42/27 +f 26/20/26 896/26/896 895/51/895 25/33/25 +f 27/42/27 85/56/85 86/138/86 28/112/28 +f 27/42/27 897/57/897 896/26/896 26/20/26 +f 28/112/28 86/138/86 87/332/87 29/320/29 +f 28/112/28 898/139/898 897/57/897 27/42/27 +f 29/320/29 87/332/87 88/585/88 30/590/30 +f 29/320/29 899/333/899 898/139/898 28/112/28 +f 30/590/30 88/585/88 89/768/89 31/774/31 +f 30/590/30 900/586/900 899/333/899 29/320/29 +f 31/774/31 89/768/89 90/1004/90 32/1014/32 +f 31/774/31 901/769/901 900/586/900 30/590/30 +f 32/1014/32 90/1004/90 91/1104/91 33/1123/33 +f 32/1014/32 902/1005/902 901/769/901 31/774/31 +f 33/1123/33 91/1104/91 92/1131/92 34/1139/34 +f 33/1123/33 903/1105/903 902/1005/902 32/1014/32 +f 34/1139/34 92/1131/92 93/1096/93 35/1109/35 +f 34/1139/34 904/1132/904 903/1105/903 33/1123/33 +f 35/1109/35 93/1096/93 94/979/94 36/1009/36 +f 35/1109/35 905/1097/905 904/1132/904 34/1139/34 +f 36/1009/36 94/979/94 95/750/95 37/763/37 +f 36/1009/36 906/980/906 905/1097/905 35/1109/35 +f 37/763/37 95/750/95 96/487/96 38/482/38 +f 37/763/37 907/751/907 906/980/906 36/1009/36 +f 38/482/38 96/487/96 97/314/97 39/306/39 +f 38/482/38 908/487/908 907/751/907 37/763/37 +f 39/306/39 97/314/97 98/116/98 40/106/40 +f 39/306/39 909/315/909 908/487/908 38/482/38 +f 40/106/40 98/116/98 99/48/99 41/32/41 +f 40/106/40 910/117/910 909/315/909 39/306/39 +f 41/32/41 99/48/99 100/23/100 42/19/42 +f 41/32/41 911/49/911 910/117/910 40/106/40 +f 42/19/42 100/23/100 101/54/101 43/41/43 +f 42/19/42 912/24/912 911/49/911 41/32/41 +f 43/41/43 101/54/101 102/136/102 44/111/44 +f 43/41/43 913/55/913 912/24/912 42/19/42 +f 44/111/44 102/136/102 103/330/103 45/319/45 +f 44/111/44 914/137/914 913/55/913 43/41/43 +f 45/319/45 103/330/103 104/583/104 46/589/46 +f 45/319/45 915/331/915 914/137/914 44/111/44 +f 46/589/46 104/583/104 105/766/105 47/773/47 +f 46/589/46 916/584/916 915/331/915 45/319/45 +f 47/773/47 105/766/105 106/1002/106 48/1015/48 +f 47/773/47 917/767/917 916/584/916 46/589/46 +f 48/1015/48 106/1002/106 107/1102/107 49/1122/49 +f 48/1015/48 918/1003/918 917/767/917 47/773/47 +f 49/1122/49 107/1102/107 108/1129/108 50/1138/50 +f 49/1122/49 919/1103/919 918/1003/918 48/1015/48 +f 50/1138/50 108/1129/108 109/1094/109 51/1108/51 +f 50/1138/50 920/1130/920 919/1103/919 49/1122/49 +f 51/1108/51 109/1094/109 110/977/110 52/1008/52 +f 51/1108/51 921/1095/921 920/1130/920 50/1138/50 +f 52/1008/52 110/977/110 111/748/111 53/762/53 +f 52/1008/52 922/978/922 921/1095/921 51/1108/51 +f 53/762/53 111/748/111 112/485/112 54/481/54 +f 53/762/53 923/749/923 922/978/922 52/1008/52 +f 54/481/54 112/485/112 113/310/113 55/305/55 +f 54/481/54 924/486/924 923/749/923 53/762/53 +f 55/305/55 113/310/113 114/114/114 56/105/56 +f 55/305/55 925/311/925 924/486/924 54/481/54 +f 56/105/56 114/114/114 115/46/115 57/31/57 +f 56/105/56 926/115/926 925/311/925 55/305/55 +f 57/31/57 115/46/115 116/29/116 58/22/58 +f 57/31/57 927/47/927 926/115/926 56/105/56 +f 58/22/58 928/30/928 927/47/927 57/31/57 +f 58/22/58 929/104/929 944/110/944 928/30/928 +f 59/1085/59 1025/1087/1025 1041/880/1041 1027/1069/1027 +f 59/1085/59 1027/1069/1027 1043/1127/1043 60/1135/60 +f 60/1135/60 1042/1137/1042 1025/1087/1025 59/1085/59 +f 60/1135/60 1043/1127/1043 118/1120/118 119/1077/119 61/1100/61 +f 61/1100/61 119/1077/119 120/955/120 62/983/62 +f 62/983/62 120/955/120 121/723/121 63/754/63 +f 63/754/63 121/723/121 122/498/122 64/490/64 +f 64/490/64 122/498/122 123/346/123 65/312/65 +f 65/312/65 123/346/123 124/152/124 66/120/66 +f 66/120/66 124/152/124 125/66/125 67/52/67 +f 67/52/67 125/66/125 126/39/126 68/27/68 +f 68/27/68 126/39/126 127/72/127 69/58/69 +f 69/58/69 127/72/127 128/165/128 70/140/70 +f 70/140/70 128/165/128 129/361/129 71/334/71 +f 71/334/71 129/361/129 130/581/130 72/587/72 +f 72/587/72 130/581/130 131/736/131 73/770/73 +f 73/770/73 131/736/131 132/971/132 74/1006/74 +f 74/1006/74 132/971/132 133/1083/133 75/1106/75 +f 75/1106/75 133/1083/133 134/1118/134 76/1133/76 +f 76/1133/76 134/1118/134 135/1075/135 77/1098/77 +f 77/1098/77 135/1075/135 136/953/136 78/981/78 +f 78/981/78 136/953/136 137/721/137 79/752/79 +f 79/752/79 137/721/137 138/496/138 80/488/80 +f 80/488/80 138/496/138 139/348/139 81/316/81 +f 81/316/81 139/348/139 140/150/140 82/118/82 +f 82/118/82 140/150/140 141/64/141 83/50/83 +f 83/50/83 141/64/141 142/37/142 84/25/84 +f 84/25/84 142/37/142 143/70/143 85/56/85 +f 85/56/85 143/70/143 144/163/144 86/138/86 +f 86/138/86 144/163/144 145/359/145 87/332/87 +f 87/332/87 145/359/145 146/579/146 88/585/88 +f 88/585/88 146/579/146 147/734/147 89/768/89 +f 89/768/89 147/734/147 148/967/148 90/1004/90 +f 90/1004/90 148/967/148 149/1081/149 91/1104/91 +f 91/1104/91 149/1081/149 150/1116/150 92/1131/92 +f 92/1131/92 150/1116/150 151/1073/151 93/1096/93 +f 93/1096/93 151/1073/151 152/951/152 94/979/94 +f 94/979/94 152/951/152 153/719/153 95/750/95 +f 95/750/95 153/719/153 154/494/154 96/487/96 +f 96/487/96 154/494/154 155/344/155 97/314/97 +f 97/314/97 155/344/155 156/148/156 98/116/98 +f 98/116/98 156/148/156 157/62/157 99/48/99 +f 99/48/99 157/62/157 158/35/158 100/23/100 +f 100/23/100 158/35/158 159/68/159 101/54/101 +f 101/54/101 159/68/159 160/161/160 102/136/102 +f 102/136/102 160/161/160 161/357/161 103/330/103 +f 103/330/103 161/357/161 162/577/162 104/583/104 +f 104/583/104 162/577/162 163/732/163 105/766/105 +f 105/766/105 163/732/163 164/969/164 106/1002/106 +f 106/1002/106 164/969/164 165/1079/165 107/1102/107 +f 107/1102/107 165/1079/165 166/1114/166 108/1129/108 +f 108/1129/108 166/1114/166 167/1071/167 109/1094/109 +f 109/1094/109 167/1071/167 168/949/168 110/977/110 +f 110/977/110 168/949/168 169/717/169 111/748/111 +f 111/748/111 169/717/169 170/492/170 112/485/112 +f 112/485/112 170/492/170 171/342/171 113/310/113 +f 113/310/113 171/342/171 172/146/172 114/114/114 +f 114/114/114 172/146/172 173/60/173 115/46/115 +f 115/46/115 173/60/173 174/44/174 116/29/116 +f 116/29/116 930/109/930 929/104/929 58/22/58 +f 117/1057/117 1027/1069/1027 1041/880/1041 1028/1051/1028 +f 117/1057/117 1028/1051/1028 1044/1092/1044 118/1120/118 +f 118/1120/118 1043/1127/1043 1027/1069/1027 117/1057/117 +f 118/1120/118 1044/1092/1044 176/1067/176 177/1041/177 119/1077/119 +f 119/1077/119 177/1041/177 178/912/178 120/955/120 +f 120/955/120 178/912/178 179/691/179 121/723/121 +f 121/723/121 179/691/179 180/506/180 122/498/122 +f 122/498/122 180/506/180 181/370/181 123/346/123 +f 123/346/123 181/370/181 182/183/182 124/152/124 +f 124/152/124 182/183/182 183/88/183 125/66/125 +f 125/66/125 183/88/183 184/78/184 126/39/126 +f 126/39/126 184/78/184 185/93/185 127/72/127 +f 127/72/127 185/93/185 186/195/186 128/165/128 +f 128/165/128 186/195/186 187/377/187 129/361/129 +f 129/361/129 187/377/187 188/575/188 130/581/130 +f 130/581/130 188/575/188 189/697/189 131/736/131 +f 131/736/131 189/697/189 190/929/190 132/971/132 +f 132/971/132 190/929/190 191/1047/191 133/1083/133 +f 133/1083/133 191/1047/191 192/1065/192 134/1118/134 +f 134/1118/134 192/1065/192 193/1039/193 135/1075/135 +f 135/1075/135 193/1039/193 194/911/194 136/953/136 +f 136/953/136 194/911/194 195/689/195 137/721/137 +f 137/721/137 195/689/195 196/504/196 138/496/138 +f 138/496/138 196/504/196 197/369/197 139/348/139 +f 139/348/139 197/369/197 198/181/198 140/150/140 +f 140/150/140 198/181/198 199/86/199 141/64/141 +f 141/64/141 199/86/199 200/76/200 142/37/142 +f 142/37/142 200/76/200 201/92/201 143/70/143 +f 143/70/143 201/92/201 202/193/202 144/163/144 +f 144/163/144 202/193/202 203/375/203 145/359/145 +f 145/359/145 203/375/203 204/573/204 146/579/146 +f 146/579/146 204/573/204 205/695/205 147/734/147 +f 147/734/147 205/695/205 206/925/206 148/967/148 +f 148/967/148 206/925/206 207/1045/207 149/1081/149 +f 149/1081/149 207/1045/207 208/1063/208 150/1116/150 +f 150/1116/150 208/1063/208 209/1037/209 151/1073/151 +f 151/1073/151 209/1037/209 210/909/210 152/951/152 +f 152/951/152 210/909/210 211/687/211 153/719/153 +f 153/719/153 211/687/211 212/502/212 154/494/154 +f 154/494/154 212/502/212 213/367/213 155/344/155 +f 155/344/155 213/367/213 214/179/214 156/148/156 +f 156/148/156 214/179/214 215/84/215 157/62/157 +f 157/62/157 215/84/215 216/74/216 158/35/158 +f 158/35/158 216/74/216 217/90/217 159/68/159 +f 159/68/159 217/90/217 218/191/218 160/161/160 +f 160/161/160 218/191/218 219/373/219 161/357/161 +f 161/357/161 219/373/219 220/571/220 162/577/162 +f 162/577/162 220/571/220 221/693/221 163/732/163 +f 163/732/163 221/693/221 222/927/222 164/969/164 +f 164/969/164 222/927/222 223/1043/223 165/1079/165 +f 165/1079/165 223/1043/223 224/1061/224 166/1114/166 +f 166/1114/166 224/1061/224 225/1035/225 167/1071/167 +f 167/1071/167 225/1035/225 226/907/226 168/949/168 +f 168/949/168 226/907/226 227/685/227 169/717/169 +f 169/717/169 227/685/227 228/500/228 170/492/170 +f 170/492/170 228/500/228 229/365/229 171/342/171 +f 171/342/171 229/365/229 230/177/230 172/146/172 +f 172/146/172 230/177/230 231/82/231 173/60/173 +f 173/60/173 231/82/231 232/80/232 174/44/174 +f 174/44/174 931/142/931 930/109/930 116/29/116 +f 175/1031/175 1028/1051/1028 1041/880/1041 1029/1018/1029 +f 175/1031/175 1029/1018/1029 1045/1053/1045 176/1067/176 +f 176/1067/176 1044/1092/1044 1028/1051/1028 175/1031/175 +f 176/1067/176 1045/1053/1045 234/1028/234 235/992/235 177/1041/177 +f 177/1041/177 235/992/235 236/860/236 178/912/178 +f 178/912/178 236/860/236 237/673/237 179/691/179 +f 179/691/179 237/673/237 238/514/238 180/506/180 +f 180/506/180 238/514/238 239/384/239 181/370/181 +f 181/370/181 239/384/239 240/217/240 182/183/182 +f 182/183/182 240/217/240 241/128/241 183/88/183 +f 183/88/183 241/128/241 242/102/242 184/78/184 +f 184/78/184 242/102/242 243/134/243 185/93/185 +f 185/93/185 243/134/243 244/237/244 186/195/186 +f 186/195/186 244/237/244 245/393/245 187/377/187 +f 187/377/187 245/393/245 246/569/246 188/575/188 +f 188/575/188 246/569/246 247/680/247 189/697/189 +f 189/697/189 247/680/247 248/885/248 190/929/190 +f 190/929/190 248/885/248 249/998/249 191/1047/191 +f 191/1047/191 249/998/249 250/1026/250 192/1065/192 +f 192/1065/192 250/1026/250 251/990/251 193/1039/193 +f 193/1039/193 251/990/251 252/858/252 194/911/194 +f 194/911/194 252/858/252 253/671/253 195/689/195 +f 195/689/195 253/671/253 254/512/254 196/504/196 +f 196/504/196 254/512/254 255/383/255 197/369/197 +f 197/369/197 255/383/255 256/215/256 198/181/198 +f 198/181/198 256/215/256 257/126/257 199/86/199 +f 199/86/199 257/126/257 258/100/258 200/76/200 +f 200/76/200 258/100/258 259/132/259 201/92/201 +f 201/92/201 259/132/259 260/235/260 202/193/202 +f 202/193/202 260/235/260 261/391/261 203/375/203 +f 203/375/203 261/391/261 262/567/262 204/573/204 +f 204/573/204 262/567/262 263/678/263 205/695/205 +f 205/695/205 263/678/263 264/883/264 206/925/206 +f 206/925/206 264/883/264 265/996/265 207/1045/207 +f 207/1045/207 265/996/265 266/1023/266 208/1063/208 +f 208/1063/208 266/1023/266 267/988/267 209/1037/209 +f 209/1037/209 267/988/267 268/856/268 210/909/210 +f 210/909/210 268/856/268 269/669/269 211/687/211 +f 211/687/211 269/669/269 270/510/270 212/502/212 +f 212/502/212 270/510/270 271/381/271 213/367/213 +f 213/367/213 271/381/271 272/213/272 214/179/214 +f 214/179/214 272/213/272 273/124/273 215/84/215 +f 215/84/215 273/124/273 274/98/274 216/74/216 +f 216/74/216 274/98/274 275/130/275 217/90/217 +f 217/90/217 275/130/275 276/233/276 218/191/218 +f 218/191/218 276/233/276 277/389/277 219/373/219 +f 219/373/219 277/389/277 278/565/278 220/571/220 +f 220/571/220 278/565/278 279/676/279 221/693/221 +f 221/693/221 279/676/279 280/881/280 222/927/222 +f 222/927/222 280/881/280 281/994/281 223/1043/223 +f 223/1043/223 281/994/281 282/1022/282 224/1061/224 +f 224/1061/224 282/1022/282 283/986/283 225/1035/225 +f 225/1035/225 283/986/283 284/854/284 226/907/226 +f 226/907/226 284/854/284 285/667/285 227/685/227 +f 227/685/227 285/667/285 286/508/286 228/500/228 +f 228/500/228 286/508/286 287/379/287 229/365/229 +f 229/365/229 287/379/287 288/211/288 230/177/230 +f 230/177/230 288/211/288 289/122/289 231/82/231 +f 231/82/231 289/122/289 290/96/290 232/80/232 +f 232/80/232 932/159/932 931/142/931 174/44/174 +f 233/1000/233 1029/1018/1029 1041/880/1041 1030/965/1030 +f 233/1000/233 1030/965/1030 1046/1012/1046 234/1028/234 +f 234/1028/234 1045/1053/1045 1029/1018/1029 233/1000/233 +f 234/1028/234 1046/1012/1046 292/963/292 293/923/293 235/992/235 +f 235/992/235 293/923/293 294/802/294 236/860/236 +f 236/860/236 294/802/294 295/655/295 237/673/237 +f 237/673/237 295/655/295 296/522/296 238/514/238 +f 238/514/238 296/522/296 297/400/297 239/384/239 +f 239/384/239 297/400/297 298/271/298 240/217/240 +f 240/217/240 298/271/298 299/175/299 241/128/241 +f 241/128/241 299/175/299 300/157/300 242/102/242 +f 242/102/242 300/157/300 301/189/301 243/134/243 +f 243/134/243 301/189/301 302/285/302 244/237/244 +f 244/237/244 302/285/302 303/407/303 245/393/245 +f 245/393/245 303/407/303 304/563/304 246/569/246 +f 246/569/246 304/563/304 305/661/305 247/680/247 +f 247/680/247 305/661/305 306/815/306 248/885/248 +f 248/885/248 306/815/306 307/935/307 249/998/249 +f 249/998/249 307/935/307 308/961/308 250/1026/250 +f 250/1026/250 308/961/308 309/921/309 251/990/251 +f 251/990/251 309/921/309 310/800/310 252/858/252 +f 252/858/252 310/800/310 311/653/311 253/671/253 +f 253/671/253 311/653/311 312/520/312 254/512/254 +f 254/512/254 312/520/312 313/399/313 255/383/255 +f 255/383/255 313/399/313 314/270/314 256/215/256 +f 256/215/256 314/270/314 315/173/315 257/126/257 +f 257/126/257 315/173/315 316/155/316 258/100/258 +f 258/100/258 316/155/316 317/187/317 259/132/259 +f 259/132/259 317/187/317 318/283/318 260/235/260 +f 260/235/260 318/283/318 319/405/319 261/391/261 +f 261/391/261 319/405/319 320/561/320 262/567/262 +f 262/567/262 320/561/320 321/659/321 263/678/263 +f 263/678/263 321/659/321 322/811/322 264/883/264 +f 264/883/264 322/811/322 323/933/323 265/996/265 +f 265/996/265 323/933/323 324/959/324 266/1023/266 +f 266/1023/266 324/959/324 325/919/325 267/988/267 +f 267/988/267 325/919/325 326/798/326 268/856/268 +f 268/856/268 326/798/326 327/651/327 269/669/269 +f 269/669/269 327/651/327 328/518/328 270/510/270 +f 270/510/270 328/518/328 329/397/329 271/381/271 +f 271/381/271 329/397/329 330/268/330 272/213/272 +f 272/213/272 330/268/330 331/171/331 273/124/273 +f 273/124/273 331/171/331 332/154/332 274/98/274 +f 274/98/274 332/154/332 333/185/333 275/130/275 +f 275/130/275 333/185/333 334/281/334 276/233/276 +f 276/233/276 334/281/334 335/403/335 277/389/277 +f 277/389/277 335/403/335 336/559/336 278/565/278 +f 278/565/278 336/559/336 337/657/337 279/676/279 +f 279/676/279 337/657/337 338/813/338 280/881/280 +f 280/881/280 338/813/338 339/931/339 281/994/281 +f 281/994/281 339/931/339 340/957/340 282/1022/282 +f 282/1022/282 340/957/340 341/917/341 283/986/283 +f 283/986/283 341/917/341 342/796/342 284/854/284 +f 284/854/284 342/796/342 343/649/343 285/667/285 +f 285/667/285 343/649/343 344/516/344 286/508/286 +f 286/508/286 344/516/344 345/395/345 287/379/287 +f 287/379/287 345/395/345 346/266/346 288/211/288 +f 288/211/288 346/266/346 347/169/347 289/122/289 +f 289/122/289 347/169/347 348/144/348 290/96/290 +f 290/96/290 933/167/933 932/159/932 232/80/232 +f 291/942/291 1030/965/1030 1041/880/1041 1031/915/1031 +f 291/942/291 1031/915/1031 1047/937/1047 292/963/292 +f 292/963/292 1046/1012/1046 1030/965/1030 291/942/291 +f 292/963/292 1047/937/1047 350/903/350 351/870/351 293/923/293 +f 293/923/293 351/870/351 352/784/352 294/802/294 +f 294/802/294 352/784/352 353/640/353 295/655/295 +f 295/655/295 353/640/353 354/530/354 296/522/296 +f 296/522/296 354/530/354 355/417/355 297/400/297 +f 297/400/297 355/417/355 356/296/356 298/271/298 +f 298/271/298 356/296/356 357/225/357 299/175/299 +f 299/175/299 357/225/357 358/205/358 300/157/300 +f 300/157/300 358/205/358 359/231/359 301/189/301 +f 301/189/301 359/231/359 360/303/360 302/285/302 +f 302/285/302 360/303/360 361/428/361 303/407/303 +f 303/407/303 361/428/361 362/557/362 304/563/304 +f 304/563/304 362/557/362 363/646/363 305/661/305 +f 305/661/305 363/646/363 364/790/364 306/815/306 +f 306/815/306 364/790/364 365/878/365 307/935/307 +f 307/935/307 365/878/365 366/901/366 308/961/308 +f 308/961/308 366/901/366 367/868/367 309/921/309 +f 309/921/309 367/868/367 368/782/368 310/800/310 +f 310/800/310 368/782/368 369/638/369 311/653/311 +f 311/653/311 369/638/369 370/528/370 312/520/312 +f 312/520/312 370/528/370 371/418/371 313/399/313 +f 313/399/313 371/418/371 372/295/372 314/270/314 +f 314/270/314 372/295/372 373/223/373 315/173/315 +f 315/173/315 373/223/373 374/203/374 316/155/316 +f 316/155/316 374/203/374 375/229/375 317/187/317 +f 317/187/317 375/229/375 376/301/376 318/283/318 +f 318/283/318 376/301/376 377/426/377 319/405/319 +f 319/405/319 377/426/377 378/555/378 320/561/320 +f 320/561/320 378/555/378 379/644/379 321/659/321 +f 321/659/321 379/644/379 380/787/380 322/811/322 +f 322/811/322 380/787/380 381/876/381 323/933/323 +f 323/933/323 381/876/381 382/899/382 324/959/324 +f 324/959/324 382/899/382 383/866/383 325/919/325 +f 325/919/325 383/866/383 384/780/384 326/798/326 +f 326/798/326 384/780/384 385/636/385 327/651/327 +f 327/651/327 385/636/385 386/526/386 328/518/328 +f 328/518/328 386/526/386 387/415/387 329/397/329 +f 329/397/329 387/415/387 388/293/388 330/268/330 +f 330/268/330 388/293/388 389/221/389 331/171/331 +f 331/171/331 389/221/389 390/201/390 332/154/332 +f 332/154/332 390/201/390 391/227/391 333/185/333 +f 333/185/333 391/227/391 392/299/392 334/281/334 +f 334/281/334 392/299/392 393/424/393 335/403/335 +f 335/403/335 393/424/393 394/553/394 336/559/336 +f 336/559/336 394/553/394 395/642/395 337/657/337 +f 337/657/337 395/642/395 396/786/396 338/813/338 +f 338/813/338 396/786/396 397/874/397 339/931/339 +f 339/931/339 397/874/397 398/897/398 340/957/340 +f 340/957/340 398/897/398 399/864/399 341/917/341 +f 341/917/341 399/864/399 400/778/400 342/796/342 +f 342/796/342 400/778/400 401/634/401 343/649/343 +f 343/649/343 401/634/401 402/524/402 344/516/344 +f 344/516/344 402/524/402 403/413/403 345/395/345 +f 345/395/345 403/413/403 404/291/404 346/266/346 +f 346/266/346 404/291/404 405/219/405 347/169/347 +f 347/169/347 405/219/405 406/197/406 348/144/348 +f 348/144/348 934/199/934 933/167/933 290/96/290 +f 349/895/349 1031/915/1031 1041/880/1041 1032/889/1032 +f 349/895/349 1032/889/1032 1048/891/1048 350/903/350 +f 350/903/350 1047/937/1047 1031/915/1031 349/895/349 +f 350/903/350 1048/891/1048 408/850/408 409/823/409 351/870/351 +f 351/870/351 409/823/409 410/745/410 352/784/352 +f 352/784/352 410/745/410 411/619/411 353/640/353 +f 353/640/353 411/619/411 412/538/412 354/530/354 +f 354/530/354 412/538/412 413/440/413 355/417/355 +f 355/417/355 413/440/413 414/328/414 356/296/356 +f 356/296/356 414/328/414 415/258/415 357/225/357 +f 357/225/357 415/258/415 416/245/416 358/205/358 +f 358/205/358 416/245/416 417/264/417 359/231/359 +f 359/231/359 417/264/417 418/340/418 360/303/360 +f 360/303/360 418/340/418 419/452/419 361/428/361 +f 361/428/361 419/452/419 420/551/420 362/557/362 +f 362/557/362 420/551/420 421/629/421 363/646/363 +f 363/646/363 421/629/421 422/760/422 364/790/364 +f 364/790/364 422/760/422 423/830/423 365/878/365 +f 365/878/365 423/830/423 424/848/424 366/901/366 +f 366/901/366 424/848/424 425/821/425 367/868/367 +f 367/868/367 425/821/425 426/743/426 368/782/368 +f 368/782/368 426/743/426 427/617/427 369/638/369 +f 369/638/369 427/617/427 428/536/428 370/528/370 +f 370/528/370 428/536/428 429/439/429 371/418/371 +f 371/418/371 429/439/429 430/326/430 372/295/372 +f 372/295/372 430/326/430 431/256/431 373/223/373 +f 373/223/373 431/256/431 432/243/432 374/203/374 +f 374/203/374 432/243/432 433/262/433 375/229/375 +f 375/229/375 433/262/433 434/338/434 376/301/376 +f 376/301/376 434/338/434 435/450/435 377/426/377 +f 377/426/377 435/450/435 436/549/436 378/555/378 +f 378/555/378 436/549/436 437/627/437 379/644/379 +f 379/644/379 437/627/437 438/758/438 380/787/380 +f 380/787/380 438/758/438 439/828/439 381/876/381 +f 381/876/381 439/828/439 440/846/440 382/899/382 +f 382/899/382 440/846/440 441/819/441 383/866/383 +f 383/866/383 441/819/441 442/741/442 384/780/384 +f 384/780/384 442/741/442 443/615/443 385/636/385 +f 385/636/385 443/615/443 444/534/444 386/526/386 +f 386/526/386 444/534/444 445/437/445 387/415/387 +f 387/415/387 445/437/445 446/324/446 388/293/388 +f 388/293/388 446/324/446 447/254/447 389/221/389 +f 389/221/389 447/254/447 448/241/448 390/201/390 +f 390/201/390 448/241/448 449/260/449 391/227/391 +f 391/227/391 449/260/449 450/336/450 392/299/392 +f 392/299/392 450/336/450 451/448/451 393/424/393 +f 393/424/393 451/448/451 452/547/452 394/553/394 +f 394/553/394 452/547/452 453/625/453 395/642/395 +f 395/642/395 453/625/453 454/756/454 396/786/396 +f 396/786/396 454/756/454 455/826/455 397/874/397 +f 397/874/397 455/826/455 456/844/456 398/897/398 +f 398/897/398 456/844/456 457/817/457 399/864/399 +f 399/864/399 457/817/457 458/739/458 400/778/400 +f 400/778/400 458/739/458 459/613/459 401/634/401 +f 401/634/401 459/613/459 460/532/460 402/524/402 +f 402/524/402 460/532/460 461/435/461 403/413/403 +f 403/413/403 461/435/461 462/322/462 404/291/404 +f 404/291/404 462/322/462 463/252/463 405/219/405 +f 405/219/405 463/252/463 464/209/464 406/197/406 +f 406/197/406 935/207/935 934/199/934 348/144/348 +f 407/872/407 1032/889/1032 1041/880/1041 1033/843/1033 +f 407/872/407 1033/843/1033 1049/840/1049 408/850/408 +f 408/850/408 1048/891/1048 1032/889/1032 407/872/407 +f 408/850/408 1049/840/1049 466/836/466 467/807/467 409/823/409 +f 409/823/409 467/807/467 468/728/468 410/745/410 +f 410/745/410 468/728/468 469/611/469 411/619/411 +f 411/619/411 469/611/469 470/543/470 412/538/412 +f 412/538/412 470/543/470 471/447/471 413/440/413 +f 413/440/413 471/447/471 472/353/472 414/328/414 +f 414/328/414 472/353/472 473/277/473 415/258/415 +f 415/258/415 473/277/473 474/251/474 416/245/416 +f 416/245/416 474/251/474 475/280/475 417/264/417 +f 417/264/417 475/280/475 476/356/476 418/340/418 +f 418/340/418 476/356/476 477/458/477 419/452/419 +f 419/452/419 477/458/477 478/546/478 420/551/420 +f 420/551/420 478/546/478 479/623/479 421/629/421 +f 421/629/421 479/623/479 480/731/480 422/760/422 +f 422/760/422 480/731/480 481/810/481 423/830/423 +f 423/830/423 481/810/481 482/835/482 424/848/424 +f 424/848/424 482/835/482 483/806/483 425/821/425 +f 425/821/425 483/806/483 484/727/484 426/743/426 +f 426/743/426 484/727/484 485/610/485 427/617/427 +f 427/617/427 485/610/485 486/542/486 428/536/428 +f 428/536/428 486/542/486 487/446/487 429/439/429 +f 429/439/429 487/446/487 488/352/488 430/326/430 +f 430/326/430 488/352/488 489/276/489 431/256/431 +f 431/256/431 489/276/489 490/250/490 432/243/432 +f 432/243/432 490/250/490 491/279/491 433/262/433 +f 433/262/433 491/279/491 492/355/492 434/338/434 +f 434/338/434 492/355/492 493/457/493 435/450/435 +f 435/450/435 493/457/493 494/545/494 436/549/436 +f 436/549/436 494/545/494 495/622/495 437/627/437 +f 437/627/437 495/622/495 496/730/496 438/758/438 +f 438/758/438 496/730/496 497/809/497 439/828/439 +f 439/828/439 497/809/497 498/834/498 440/846/440 +f 440/846/440 498/834/498 499/805/499 441/819/441 +f 441/819/441 499/805/499 500/726/500 442/741/442 +f 442/741/442 500/726/500 501/609/501 443/615/443 +f 443/615/443 501/609/501 502/541/502 444/534/444 +f 444/534/444 502/541/502 503/445/503 445/437/445 +f 445/437/445 503/445/503 504/351/504 446/324/446 +f 446/324/446 504/351/504 505/275/505 447/254/447 +f 447/254/447 505/275/505 506/249/506 448/241/448 +f 448/241/448 506/249/506 507/278/507 449/260/449 +f 449/260/449 507/278/507 508/354/508 450/336/450 +f 450/336/450 508/354/508 509/456/509 451/448/451 +f 451/448/451 509/456/509 510/544/510 452/547/452 +f 452/547/452 510/544/510 511/621/511 453/625/453 +f 453/625/453 511/621/511 512/729/512 454/756/454 +f 454/756/454 512/729/512 513/808/513 455/826/455 +f 455/826/455 513/808/513 514/833/514 456/844/456 +f 456/844/456 514/833/514 515/804/515 457/817/457 +f 457/817/457 515/804/515 516/725/516 458/739/458 +f 458/739/458 516/725/516 517/608/517 459/613/459 +f 459/613/459 517/608/517 518/540/518 460/532/460 +f 460/532/460 518/540/518 519/444/519 461/435/461 +f 461/435/461 519/444/519 520/350/520 462/322/462 +f 462/322/462 520/350/520 521/274/521 463/252/463 +f 463/252/463 521/274/521 522/247/522 464/209/464 +f 464/209/464 936/239/936 935/207/935 406/197/406 +f 465/842/465 1033/843/1033 1041/880/1041 1034/843/1034 +f 465/842/465 1034/843/1034 1050/841/1050 466/836/466 +f 466/836/466 1049/840/1049 1033/843/1033 465/842/465 +f 466/836/466 1050/841/1050 524/851/524 525/824/525 467/807/467 +f 467/807/467 525/824/525 526/746/526 468/728/468 +f 468/728/468 526/746/526 527/620/527 469/611/469 +f 469/611/469 527/620/527 528/539/528 470/543/470 +f 470/543/470 528/539/528 529/441/529 471/447/471 +f 471/447/471 529/441/529 530/329/530 472/353/472 +f 472/353/472 530/329/530 531/259/531 473/277/473 +f 473/277/473 531/259/531 532/246/532 474/251/474 +f 474/251/474 532/246/532 533/265/533 475/280/475 +f 475/280/475 533/265/533 534/341/534 476/356/476 +f 476/356/476 534/341/534 535/453/535 477/458/477 +f 477/458/477 535/453/535 536/552/536 478/546/478 +f 478/546/478 536/552/536 537/630/537 479/623/479 +f 479/623/479 537/630/537 538/761/538 480/731/480 +f 480/731/480 538/761/538 539/831/539 481/810/481 +f 481/810/481 539/831/539 540/849/540 482/835/482 +f 482/835/482 540/849/540 541/822/541 483/806/483 +f 483/806/483 541/822/541 542/744/542 484/727/484 +f 484/727/484 542/744/542 543/618/543 485/610/485 +f 485/610/485 543/618/543 544/537/544 486/542/486 +f 486/542/486 544/537/544 545/442/545 487/446/487 +f 487/446/487 545/442/545 546/327/546 488/352/488 +f 488/352/488 546/327/546 547/257/547 489/276/489 +f 489/276/489 547/257/547 548/244/548 490/250/490 +f 490/250/490 548/244/548 549/263/549 491/279/491 +f 491/279/491 549/263/549 550/339/550 492/355/492 +f 492/355/492 550/339/550 551/451/551 493/457/493 +f 493/457/493 551/451/551 552/550/552 494/545/494 +f 494/545/494 552/550/552 553/628/553 495/622/495 +f 495/622/495 553/628/553 554/759/554 496/730/496 +f 496/730/496 554/759/554 555/829/555 497/809/497 +f 497/809/497 555/829/555 556/847/556 498/834/498 +f 498/834/498 556/847/556 557/820/557 499/805/499 +f 499/805/499 557/820/557 558/742/558 500/726/500 +f 500/726/500 558/742/558 559/616/559 501/609/501 +f 501/609/501 559/616/559 560/535/560 502/541/502 +f 502/541/502 560/535/560 561/438/561 503/445/503 +f 503/445/503 561/438/561 562/325/562 504/351/504 +f 504/351/504 562/325/562 563/255/563 505/275/505 +f 505/275/505 563/255/563 564/242/564 506/249/506 +f 506/249/506 564/242/564 565/261/565 507/278/507 +f 507/278/507 565/261/565 566/337/566 508/354/508 +f 508/354/508 566/337/566 567/449/567 509/456/509 +f 509/456/509 567/449/567 568/548/568 510/544/510 +f 510/544/510 568/548/568 569/626/569 511/621/511 +f 511/621/511 569/626/569 570/757/570 512/729/512 +f 512/729/512 570/757/570 571/827/571 513/808/513 +f 513/808/513 571/827/571 572/845/572 514/833/514 +f 514/833/514 572/845/572 573/818/573 515/804/515 +f 515/804/515 573/818/573 574/740/574 516/725/516 +f 516/725/516 574/740/574 575/614/575 517/608/517 +f 517/608/517 575/614/575 576/533/576 518/540/518 +f 518/540/518 576/533/576 577/436/577 519/444/519 +f 519/444/519 577/436/577 578/323/578 520/350/520 +f 520/350/520 578/323/578 579/253/579 521/274/521 +f 521/274/521 579/253/579 580/210/580 522/247/522 +f 522/247/522 937/248/937 936/239/936 464/209/464 +f 523/873/523 1034/843/1034 1041/880/1041 1035/890/1035 +f 523/873/523 1035/890/1035 1051/892/1051 524/851/524 +f 524/851/524 1050/841/1050 1034/843/1034 523/873/523 +f 524/851/524 1051/892/1051 582/904/582 583/871/583 525/824/525 +f 525/824/525 583/871/583 584/785/584 526/746/526 +f 526/746/526 584/785/584 585/641/585 527/620/527 +f 527/620/527 585/641/585 586/531/586 528/539/528 +f 528/539/528 586/531/586 587/420/587 529/441/529 +f 529/441/529 587/420/587 588/298/588 530/329/530 +f 530/329/530 588/298/588 589/226/589 531/259/531 +f 531/259/531 589/226/589 590/206/590 532/246/532 +f 532/246/532 590/206/590 591/232/591 533/265/533 +f 533/265/533 591/232/591 592/304/592 534/341/534 +f 534/341/534 592/304/592 593/429/593 535/453/535 +f 535/453/535 593/429/593 594/558/594 536/552/536 +f 536/552/536 594/558/594 595/647/595 537/630/537 +f 537/630/537 595/647/595 596/791/596 538/761/538 +f 538/761/538 596/791/596 597/879/597 539/831/539 +f 539/831/539 597/879/597 598/902/598 540/849/540 +f 540/849/540 598/902/598 599/869/599 541/822/541 +f 541/822/541 599/869/599 600/783/600 542/744/542 +f 542/744/542 600/783/600 601/639/601 543/618/543 +f 543/618/543 601/639/601 602/529/602 544/537/544 +f 544/537/544 602/529/602 603/419/603 545/442/545 +f 545/442/545 603/419/603 604/297/604 546/327/546 +f 546/327/546 604/297/604 605/224/605 547/257/547 +f 547/257/547 605/224/605 606/204/606 548/244/548 +f 548/244/548 606/204/606 607/230/607 549/263/549 +f 549/263/549 607/230/607 608/302/608 550/339/550 +f 550/339/550 608/302/608 609/427/609 551/451/551 +f 551/451/551 609/427/609 610/556/610 552/550/552 +f 552/550/552 610/556/610 611/645/611 553/628/553 +f 553/628/553 611/645/611 612/788/612 554/759/554 +f 554/759/554 612/788/612 613/877/613 555/829/555 +f 555/829/555 613/877/613 614/900/614 556/847/556 +f 556/847/556 614/900/614 615/867/615 557/820/557 +f 557/820/557 615/867/615 616/781/616 558/742/558 +f 558/742/558 616/781/616 617/637/617 559/616/559 +f 559/616/559 617/637/617 618/527/618 560/535/560 +f 560/535/560 618/527/618 619/416/619 561/438/561 +f 561/438/561 619/416/619 620/294/620 562/325/562 +f 562/325/562 620/294/620 621/222/621 563/255/563 +f 563/255/563 621/222/621 622/202/622 564/242/564 +f 564/242/564 622/202/622 623/228/623 565/261/565 +f 565/261/565 623/228/623 624/300/624 566/337/566 +f 566/337/566 624/300/624 625/425/625 567/449/567 +f 567/449/567 625/425/625 626/554/626 568/548/568 +f 568/548/568 626/554/626 627/643/627 569/626/569 +f 569/626/569 627/643/627 628/789/628 570/757/570 +f 570/757/570 628/789/628 629/875/629 571/827/571 +f 571/827/571 629/875/629 630/898/630 572/845/572 +f 572/845/572 630/898/630 631/865/631 573/818/573 +f 573/818/573 631/865/631 632/779/632 574/740/574 +f 574/740/574 632/779/632 633/635/633 575/614/575 +f 575/614/575 633/635/633 634/525/634 576/533/576 +f 576/533/576 634/525/634 635/414/635 577/436/577 +f 577/436/577 635/414/635 636/292/636 578/323/578 +f 578/323/578 636/292/636 637/220/637 579/253/579 +f 579/253/579 637/220/637 638/198/638 580/210/580 +f 580/210/580 938/240/938 937/248/937 522/247/522 +f 581/896/581 1035/890/1035 1041/880/1041 1036/916/1036 +f 581/896/581 1036/916/1036 1052/938/1052 582/904/582 +f 582/904/582 1051/892/1051 1035/890/1035 581/896/581 +f 582/904/582 1052/938/1052 640/964/640 641/924/641 583/871/583 +f 583/871/583 641/924/641 642/803/642 584/785/584 +f 584/785/584 642/803/642 643/656/643 585/641/585 +f 585/641/585 643/656/643 644/523/644 586/531/586 +f 586/531/586 644/523/644 645/402/645 587/420/587 +f 587/420/587 645/402/645 646/273/646 588/298/588 +f 588/298/588 646/273/646 647/176/647 589/226/589 +f 589/226/589 647/176/647 648/158/648 590/206/590 +f 590/206/590 648/158/648 649/190/649 591/232/591 +f 591/232/591 649/190/649 650/286/650 592/304/592 +f 592/304/592 650/286/650 651/408/651 593/429/593 +f 593/429/593 651/408/651 652/564/652 594/558/594 +f 594/558/594 652/564/652 653/662/653 595/647/595 +f 595/647/595 653/662/653 654/816/654 596/791/596 +f 596/791/596 654/816/654 655/936/655 597/879/597 +f 597/879/597 655/936/655 656/962/656 598/902/598 +f 598/902/598 656/962/656 657/922/657 599/869/599 +f 599/869/599 657/922/657 658/801/658 600/783/600 +f 600/783/600 658/801/658 659/654/659 601/639/601 +f 601/639/601 659/654/659 660/521/660 602/529/602 +f 602/529/602 660/521/660 661/401/661 603/419/603 +f 603/419/603 661/401/661 662/272/662 604/297/604 +f 604/297/604 662/272/662 663/174/663 605/224/605 +f 605/224/605 663/174/663 664/156/664 606/204/606 +f 606/204/606 664/156/664 665/188/665 607/230/607 +f 607/230/607 665/188/665 666/284/666 608/302/608 +f 608/302/608 666/284/666 667/406/667 609/427/609 +f 609/427/609 667/406/667 668/562/668 610/556/610 +f 610/556/610 668/562/668 669/660/669 611/645/611 +f 611/645/611 669/660/669 670/812/670 612/788/612 +f 612/788/612 670/812/670 671/934/671 613/877/613 +f 613/877/613 671/934/671 672/960/672 614/900/614 +f 614/900/614 672/960/672 673/920/673 615/867/615 +f 615/867/615 673/920/673 674/799/674 616/781/616 +f 616/781/616 674/799/674 675/652/675 617/637/617 +f 617/637/617 675/652/675 676/519/676 618/527/618 +f 618/527/618 676/519/676 677/398/677 619/416/619 +f 619/416/619 677/398/677 678/269/678 620/294/620 +f 620/294/620 678/269/678 679/172/679 621/222/621 +f 621/222/621 679/172/679 680/155/680 622/202/622 +f 622/202/622 680/155/680 681/186/681 623/228/623 +f 623/228/623 681/186/681 682/282/682 624/300/624 +f 624/300/624 682/282/682 683/404/683 625/425/625 +f 625/425/625 683/404/683 684/560/684 626/554/626 +f 626/554/626 684/560/684 685/658/685 627/643/627 +f 627/643/627 685/658/685 686/814/686 628/789/628 +f 628/789/628 686/814/686 687/932/687 629/875/629 +f 629/875/629 687/932/687 688/958/688 630/898/630 +f 630/898/630 688/958/688 689/918/689 631/865/631 +f 631/865/631 689/918/689 690/797/690 632/779/632 +f 632/779/632 690/797/690 691/650/691 633/635/633 +f 633/635/633 691/650/691 692/517/692 634/525/634 +f 634/525/634 692/517/692 693/396/693 635/414/635 +f 635/414/635 693/396/693 694/267/694 636/292/636 +f 636/292/636 694/267/694 695/170/695 637/220/637 +f 637/220/637 695/170/695 696/145/696 638/198/638 +f 638/198/638 939/208/939 938/240/938 580/210/580 +f 639/943/639 1036/916/1036 1041/880/1041 1037/966/1037 +f 639/943/639 1037/966/1037 1053/1013/1053 640/964/640 +f 640/964/640 1052/938/1052 1036/916/1036 639/943/639 +f 640/964/640 1053/1013/1053 698/1029/698 699/993/699 641/924/641 +f 641/924/641 699/993/699 700/861/700 642/803/642 +f 642/803/642 700/861/700 701/674/701 643/656/643 +f 643/656/643 701/674/701 702/515/702 644/523/644 +f 644/523/644 702/515/702 703/385/703 645/402/645 +f 645/402/645 703/385/703 704/218/704 646/273/646 +f 646/273/646 704/218/704 705/129/705 647/176/647 +f 647/176/647 705/129/705 706/103/706 648/158/648 +f 648/158/648 706/103/706 707/135/707 649/190/649 +f 649/190/649 707/135/707 708/238/708 650/286/650 +f 650/286/650 708/238/708 709/394/709 651/408/651 +f 651/408/651 709/394/709 710/570/710 652/564/652 +f 652/564/652 710/570/710 711/681/711 653/662/653 +f 653/662/653 711/681/711 712/886/712 654/816/654 +f 654/816/654 712/886/712 713/999/713 655/936/655 +f 655/936/655 713/999/713 714/1027/714 656/962/656 +f 656/962/656 714/1027/714 715/991/715 657/922/657 +f 657/922/657 715/991/715 716/859/716 658/801/658 +f 658/801/658 716/859/716 717/672/717 659/654/659 +f 659/654/659 717/672/717 718/513/718 660/521/660 +f 660/521/660 718/513/718 719/386/719 661/401/661 +f 661/401/661 719/386/719 720/216/720 662/272/662 +f 662/272/662 720/216/720 721/127/721 663/174/663 +f 663/174/663 721/127/721 722/101/722 664/156/664 +f 664/156/664 722/101/722 723/133/723 665/188/665 +f 665/188/665 723/133/723 724/236/724 666/284/666 +f 666/284/666 724/236/724 725/392/725 667/406/667 +f 667/406/667 725/392/725 726/568/726 668/562/668 +f 668/562/668 726/568/726 727/679/727 669/660/669 +f 669/660/669 727/679/727 728/884/728 670/812/670 +f 670/812/670 728/884/728 729/997/729 671/934/671 +f 671/934/671 729/997/729 730/1025/730 672/960/672 +f 672/960/672 730/1025/730 731/989/731 673/920/673 +f 673/920/673 731/989/731 732/857/732 674/799/674 +f 674/799/674 732/857/732 733/670/733 675/652/675 +f 675/652/675 733/670/733 734/511/734 676/519/676 +f 676/519/676 734/511/734 735/382/735 677/398/677 +f 677/398/677 735/382/735 736/214/736 678/269/678 +f 678/269/678 736/214/736 737/125/737 679/172/679 +f 679/172/679 737/125/737 738/99/738 680/155/680 +f 680/155/680 738/99/738 739/131/739 681/186/681 +f 681/186/681 739/131/739 740/234/740 682/282/682 +f 682/282/682 740/234/740 741/390/741 683/404/683 +f 683/404/683 741/390/741 742/566/742 684/560/684 +f 684/560/684 742/566/742 743/677/743 685/658/685 +f 685/658/685 743/677/743 744/882/744 686/814/686 +f 686/814/686 744/882/744 745/995/745 687/932/687 +f 687/932/687 745/995/745 746/1024/746 688/958/688 +f 688/958/688 746/1024/746 747/987/747 689/918/689 +f 689/918/689 747/987/747 748/855/748 690/797/690 +f 690/797/690 748/855/748 749/668/749 691/650/691 +f 691/650/691 749/668/749 750/509/750 692/517/692 +f 692/517/692 750/509/750 751/380/751 693/396/693 +f 693/396/693 751/380/751 752/212/752 694/267/694 +f 694/267/694 752/212/752 753/123/753 695/170/695 +f 695/170/695 753/123/753 754/97/754 696/145/696 +f 696/145/696 940/200/940 939/208/939 638/198/638 +f 697/1001/697 1037/966/1037 1041/880/1041 1038/1019/1038 +f 697/1001/697 1038/1019/1038 1054/1054/1054 698/1029/698 +f 698/1029/698 1053/1013/1053 1037/966/1037 697/1001/697 +f 698/1029/698 1054/1054/1054 756/1068/756 757/1042/757 699/993/699 +f 699/993/699 757/1042/757 758/914/758 700/861/700 +f 700/861/700 758/914/758 759/692/759 701/674/701 +f 701/674/701 759/692/759 760/507/760 702/515/702 +f 702/515/702 760/507/760 761/371/761 703/385/703 +f 703/385/703 761/371/761 762/184/762 704/218/704 +f 704/218/704 762/184/762 763/89/763 705/129/705 +f 705/129/705 763/89/763 764/79/764 706/103/706 +f 706/103/706 764/79/764 765/95/765 707/135/707 +f 707/135/707 765/95/765 766/196/766 708/238/708 +f 708/238/708 766/196/766 767/378/767 709/394/709 +f 709/394/709 767/378/767 768/576/768 710/570/710 +f 710/570/710 768/576/768 769/698/769 711/681/711 +f 711/681/711 769/698/769 770/930/770 712/886/712 +f 712/886/712 770/930/770 771/1048/771 713/999/713 +f 713/999/713 771/1048/771 772/1066/772 714/1027/714 +f 714/1027/714 772/1066/772 773/1040/773 715/991/715 +f 715/991/715 773/1040/773 774/913/774 716/859/716 +f 716/859/716 774/913/774 775/690/775 717/672/717 +f 717/672/717 775/690/775 776/505/776 718/513/718 +f 718/513/718 776/505/776 777/372/777 719/386/719 +f 719/386/719 777/372/777 778/182/778 720/216/720 +f 720/216/720 778/182/778 779/87/779 721/127/721 +f 721/127/721 779/87/779 780/77/780 722/101/722 +f 722/101/722 780/77/780 781/94/781 723/133/723 +f 723/133/723 781/94/781 782/194/782 724/236/724 +f 724/236/724 782/194/782 783/376/783 725/392/725 +f 725/392/725 783/376/783 784/574/784 726/568/726 +f 726/568/726 784/574/784 785/696/785 727/679/727 +f 727/679/727 785/696/785 786/926/786 728/884/728 +f 728/884/728 786/926/786 787/1046/787 729/997/729 +f 729/997/729 787/1046/787 788/1064/788 730/1025/730 +f 730/1025/730 788/1064/788 789/1038/789 731/989/731 +f 731/989/731 789/1038/789 790/910/790 732/857/732 +f 732/857/732 790/910/790 791/688/791 733/670/733 +f 733/670/733 791/688/791 792/503/792 734/511/734 +f 734/511/734 792/503/792 793/368/793 735/382/735 +f 735/382/735 793/368/793 794/180/794 736/214/736 +f 736/214/736 794/180/794 795/85/795 737/125/737 +f 737/125/737 795/85/795 796/75/796 738/99/738 +f 738/99/738 796/75/796 797/91/797 739/131/739 +f 739/131/739 797/91/797 798/192/798 740/234/740 +f 740/234/740 798/192/798 799/374/799 741/390/741 +f 741/390/741 799/374/799 800/572/800 742/566/742 +f 742/566/742 800/572/800 801/694/801 743/677/743 +f 743/677/743 801/694/801 802/928/802 744/882/744 +f 744/882/744 802/928/802 803/1044/803 745/995/745 +f 745/995/745 803/1044/803 804/1062/804 746/1024/746 +f 746/1024/746 804/1062/804 805/1036/805 747/987/747 +f 747/987/747 805/1036/805 806/908/806 748/855/748 +f 748/855/748 806/908/806 807/686/807 749/668/749 +f 749/668/749 807/686/807 808/501/808 750/509/750 +f 750/509/750 808/501/808 809/366/809 751/380/751 +f 751/380/751 809/366/809 810/178/810 752/212/752 +f 752/212/752 810/178/810 811/83/811 753/123/753 +f 753/123/753 811/83/811 812/81/812 754/97/754 +f 754/97/754 941/168/941 940/200/940 696/145/696 +f 755/1032/755 1038/1019/1038 1041/880/1041 1039/1052/1039 +f 755/1032/755 1039/1052/1039 1055/1093/1055 756/1068/756 +f 756/1068/756 1054/1054/1054 1038/1019/1038 755/1032/755 +f 756/1068/756 1055/1093/1055 814/1121/814 815/1078/815 757/1042/757 +f 757/1042/757 815/1078/815 816/956/816 758/914/758 +f 758/914/758 816/956/816 817/724/817 759/692/759 +f 759/692/759 817/724/817 818/499/818 760/507/760 +f 760/507/760 818/499/818 819/347/819 761/371/761 +f 761/371/761 819/347/819 820/153/820 762/184/762 +f 762/184/762 820/153/820 821/67/821 763/89/763 +f 763/89/763 821/67/821 822/40/822 764/79/764 +f 764/79/764 822/40/822 823/73/823 765/95/765 +f 765/95/765 823/73/823 824/166/824 766/196/766 +f 766/196/766 824/166/824 825/362/825 767/378/767 +f 767/378/767 825/362/825 826/582/826 768/576/768 +f 768/576/768 826/582/826 827/737/827 769/698/769 +f 769/698/769 827/737/827 828/972/828 770/930/770 +f 770/930/770 828/972/828 829/1084/829 771/1048/771 +f 771/1048/771 829/1084/829 830/1119/830 772/1066/772 +f 772/1066/772 830/1119/830 831/1076/831 773/1040/773 +f 773/1040/773 831/1076/831 832/954/832 774/913/774 +f 774/913/774 832/954/832 833/722/833 775/690/775 +f 775/690/775 833/722/833 834/497/834 776/505/776 +f 776/505/776 834/497/834 835/349/835 777/372/777 +f 777/372/777 835/349/835 836/151/836 778/182/778 +f 778/182/778 836/151/836 837/65/837 779/87/779 +f 779/87/779 837/65/837 838/38/838 780/77/780 +f 780/77/780 838/38/838 839/71/839 781/94/781 +f 781/94/781 839/71/839 840/164/840 782/194/782 +f 782/194/782 840/164/840 841/360/841 783/376/783 +f 783/376/783 841/360/841 842/580/842 784/574/784 +f 784/574/784 842/580/842 843/735/843 785/696/785 +f 785/696/785 843/735/843 844/968/844 786/926/786 +f 786/926/786 844/968/844 845/1082/845 787/1046/787 +f 787/1046/787 845/1082/845 846/1117/846 788/1064/788 +f 788/1064/788 846/1117/846 847/1074/847 789/1038/789 +f 789/1038/789 847/1074/847 848/952/848 790/910/790 +f 790/910/790 848/952/848 849/720/849 791/688/791 +f 791/688/791 849/720/849 850/495/850 792/503/792 +f 792/503/792 850/495/850 851/345/851 793/368/793 +f 793/368/793 851/345/851 852/149/852 794/180/794 +f 794/180/794 852/149/852 853/63/853 795/85/795 +f 795/85/795 853/63/853 854/36/854 796/75/796 +f 796/75/796 854/36/854 855/69/855 797/91/797 +f 797/91/797 855/69/855 856/162/856 798/192/798 +f 798/192/798 856/162/856 857/358/857 799/374/799 +f 799/374/799 857/358/857 858/578/858 800/572/800 +f 800/572/800 858/578/858 859/733/859 801/694/801 +f 801/694/801 859/733/859 860/970/860 802/928/802 +f 802/928/802 860/970/860 861/1080/861 803/1044/803 +f 803/1044/803 861/1080/861 862/1115/862 804/1062/804 +f 804/1062/804 862/1115/862 863/1072/863 805/1036/805 +f 805/1036/805 863/1072/863 864/950/864 806/908/806 +f 806/908/806 864/950/864 865/718/865 807/686/807 +f 807/686/807 865/718/865 866/493/866 808/501/808 +f 808/501/808 866/493/866 867/343/867 809/366/809 +f 809/366/809 867/343/867 868/147/868 810/178/810 +f 810/178/810 868/147/868 869/61/869 811/83/811 +f 811/83/811 869/61/869 870/45/870 812/81/812 +f 812/81/812 942/160/942 941/168/941 754/97/754 +f 813/1058/813 1039/1052/1039 1041/880/1041 1040/1070/1040 +f 813/1058/813 1040/1070/1040 1056/1128/1056 814/1121/814 +f 814/1121/814 1055/1093/1055 1039/1052/1039 813/1058/813 +f 814/1121/814 1056/1128/1056 872/1136/872 873/1101/873 815/1078/815 +f 815/1078/815 873/1101/873 874/984/874 816/956/816 +f 816/956/816 874/984/874 875/755/875 817/724/817 +f 817/724/817 875/755/875 876/491/876 818/499/818 +f 818/499/818 876/491/876 877/313/877 819/347/819 +f 819/347/819 877/313/877 878/121/878 820/153/820 +f 820/153/820 878/121/878 879/53/879 821/67/821 +f 821/67/821 879/53/879 880/28/880 822/40/822 +f 822/40/822 880/28/880 881/59/881 823/73/823 +f 823/73/823 881/59/881 882/141/882 824/166/824 +f 824/166/824 882/141/882 883/335/883 825/362/825 +f 825/362/825 883/335/883 884/588/884 826/582/826 +f 826/582/826 884/588/884 885/771/885 827/737/827 +f 827/737/827 885/771/885 886/1007/886 828/972/828 +f 828/972/828 886/1007/886 887/1107/887 829/1084/829 +f 829/1084/829 887/1107/887 888/1134/888 830/1119/830 +f 830/1119/830 888/1134/888 889/1099/889 831/1076/831 +f 831/1076/831 889/1099/889 890/982/890 832/954/832 +f 832/954/832 890/982/890 891/753/891 833/722/833 +f 833/722/833 891/753/891 892/489/892 834/497/834 +f 834/497/834 892/489/892 893/317/893 835/349/835 +f 835/349/835 893/317/893 894/119/894 836/151/836 +f 836/151/836 894/119/894 895/51/895 837/65/837 +f 837/65/837 895/51/895 896/26/896 838/38/838 +f 838/38/838 896/26/896 897/57/897 839/71/839 +f 839/71/839 897/57/897 898/139/898 840/164/840 +f 840/164/840 898/139/898 899/333/899 841/360/841 +f 841/360/841 899/333/899 900/586/900 842/580/842 +f 842/580/842 900/586/900 901/769/901 843/735/843 +f 843/735/843 901/769/901 902/1005/902 844/968/844 +f 844/968/844 902/1005/902 903/1105/903 845/1082/845 +f 845/1082/845 903/1105/903 904/1132/904 846/1117/846 +f 846/1117/846 904/1132/904 905/1097/905 847/1074/847 +f 847/1074/847 905/1097/905 906/980/906 848/952/848 +f 848/952/848 906/980/906 907/751/907 849/720/849 +f 849/720/849 907/751/907 908/487/908 850/495/850 +f 850/495/850 908/487/908 909/315/909 851/345/851 +f 851/345/851 909/315/909 910/117/910 852/149/852 +f 852/149/852 910/117/910 911/49/911 853/63/853 +f 853/63/853 911/49/911 912/24/912 854/36/854 +f 854/36/854 912/24/912 913/55/913 855/69/855 +f 855/69/855 913/55/913 914/137/914 856/162/856 +f 856/162/856 914/137/914 915/331/915 857/358/857 +f 857/358/857 915/331/915 916/584/916 858/578/858 +f 858/578/858 916/584/916 917/767/917 859/733/859 +f 859/733/859 917/767/917 918/1003/918 860/970/860 +f 860/970/860 918/1003/918 919/1103/919 861/1080/861 +f 861/1080/861 919/1103/919 920/1130/920 862/1115/862 +f 862/1115/862 920/1130/920 921/1095/921 863/1072/863 +f 863/1072/863 921/1095/921 922/978/922 864/950/864 +f 864/950/864 922/978/922 923/749/923 865/718/865 +f 865/718/865 923/749/923 924/486/924 866/493/866 +f 866/493/866 924/486/924 925/311/925 867/343/867 +f 867/343/867 925/311/925 926/115/926 868/147/868 +f 868/147/868 926/115/926 927/47/927 869/61/869 +f 869/61/869 927/47/927 928/30/928 870/45/870 +f 870/45/870 943/143/943 942/160/942 812/81/812 +f 871/1086/871 1026/1088/1026 1057/1137/1057 872/1136/872 +f 871/1086/871 1040/1070/1040 1041/880/1041 1026/1088/1026 +f 872/1136/872 1056/1128/1056 1040/1070/1040 871/1086/871 +f 928/30/928 944/110/944 943/143/943 870/45/870 +f 929/104/929 945/363/945 960/387/960 944/110/944 +f 930/109/930 946/309/946 945/363/945 929/104/929 +f 931/142/931 947/289/947 946/309/946 930/109/930 +f 932/159/932 948/287/948 947/289/947 931/142/931 +f 933/167/933 949/288/949 948/287/948 932/159/932 +f 934/199/934 950/290/950 949/288/949 933/167/933 +f 935/207/935 951/318/951 950/290/950 934/199/934 +f 936/239/936 952/364/952 951/318/951 935/207/935 +f 937/248/937 953/388/953 952/364/952 936/239/936 +f 938/240/938 954/410/954 953/388/953 937/248/937 +f 939/208/939 955/443/955 954/410/954 938/240/938 +f 940/200/940 956/460/956 955/443/955 939/208/939 +f 941/168/941 957/459/957 956/460/956 940/200/940 +f 942/160/942 958/434/958 957/459/957 941/168/941 +f 943/143/943 959/409/959 958/434/958 942/160/942 +f 944/110/944 960/387/960 959/409/959 943/143/943 +f 945/363/945 961/476/961 976/592/976 960/387/960 +f 946/309/946 962/470/962 961/476/961 945/363/945 +f 947/289/947 963/462/963 962/470/962 946/309/946 +f 948/287/948 964/432/964 963/462/963 947/289/947 +f 949/288/949 965/412/965 964/432/964 948/287/948 +f 950/290/950 966/421/966 965/412/965 949/288/949 +f 951/318/951 967/454/967 966/421/966 950/290/950 +f 952/364/952 968/465/968 967/454/967 951/318/951 +f 953/388/953 969/472/969 968/465/968 952/364/952 +f 954/410/954 970/480/970 969/472/969 953/388/953 +f 955/443/955 971/596/971 970/480/970 954/410/954 +f 956/460/956 972/600/972 971/596/971 955/443/955 +f 957/459/957 973/603/973 972/600/972 956/460/956 +f 958/434/958 974/602/974 973/603/973 957/459/957 +f 959/409/959 975/597/975 974/602/974 958/434/958 +f 960/387/960 976/592/976 975/597/975 959/409/959 +f 961/476/961 977/598/977 992/607/992 976/592/976 +f 962/470/962 978/479/978 977/598/977 961/476/961 +f 963/462/963 979/471/979 978/479/978 962/470/962 +f 964/432/964 980/463/980 979/471/979 963/462/963 +f 965/412/965 981/455/981 980/463/980 964/432/964 +f 966/421/966 982/461/982 981/455/981 965/412/965 +f 967/454/967 983/469/983 982/461/982 966/421/966 +f 968/465/968 984/475/984 983/469/983 967/454/967 +f 969/472/969 985/594/985 984/475/984 968/465/968 +f 970/480/970 986/604/986 985/594/985 969/472/969 +f 971/596/971 987/633/987 986/604/986 970/480/970 +f 972/600/972 988/663/988 987/633/987 971/596/971 +f 973/603/973 989/682/989 988/663/988 972/600/972 +f 974/602/974 990/675/990 989/682/989 973/603/973 +f 975/597/975 991/648/991 990/675/990 974/602/974 +f 976/592/976 992/607/992 991/648/991 975/597/975 +f 977/598/977 993/601/993 1008/624/1008 992/607/992 +f 978/479/978 994/478/994 993/601/993 977/598/977 +f 979/471/979 995/468/995 994/478/994 978/479/978 +f 980/463/980 996/433/996 995/468/995 979/471/979 +f 981/455/981 997/411/997 996/433/996 980/463/980 +f 982/461/982 998/431/998 997/411/997 981/455/981 +f 983/469/983 999/466/999 998/431/998 982/461/982 +f 984/475/984 1000/477/1000 999/466/999 983/469/983 +f 985/594/985 1001/599/1001 1000/477/1000 984/475/984 +f 986/604/986 1002/612/1002 1001/599/1001 985/594/985 +f 987/633/987 1003/683/1003 1002/612/1002 986/604/986 +f 988/663/988 1004/738/1004 1003/683/1003 987/633/987 +f 989/682/989 1005/772/1005 1004/738/1004 988/663/988 +f 990/675/990 1006/747/1006 1005/772/1005 989/682/989 +f 991/648/991 1007/684/1007 1006/747/1006 990/675/990 +f 992/607/992 1008/624/1008 1007/684/1007 991/648/991 +f 994/478/994 995/468/995 1021/467/1021 1015/474/1015 1022/595/1022 993/601/993 +f 996/433/996 1014/430/1014 1021/467/1021 995/468/995 +f 997/411/997 1020/423/1020 1014/430/1014 996/433/996 +f 998/431/998 1013/422/1013 1020/423/1020 997/411/997 +f 999/466/999 1019/464/1019 1013/422/1013 998/431/998 +f 1000/477/1000 1012/473/1012 1019/464/1019 999/466/999 +f 1001/599/1001 1018/593/1018 1012/473/1012 1000/477/1000 +f 1002/612/1002 1011/605/1011 1018/593/1018 1001/599/1001 +f 1003/683/1003 1017/631/1017 1011/605/1011 1002/612/1002 +f 1004/738/1004 1010/664/1010 1017/631/1017 1003/683/1003 +f 1005/772/1005 1024/665/1024 1010/664/1010 1004/738/1004 +f 1006/747/1006 1009/666/1009 1024/665/1024 1005/772/1005 +f 1007/684/1007 1023/632/1023 1009/666/1009 1006/747/1006 +f 1008/624/1008 993/601/993 1022/595/1022 1016/606/1016 1023/632/1023 1007/684/1007 +f 1017/945/1017 1010/973/1010 1059/1017/1059 1060/946/1060 1011/939/1011 +f 1018/905/1018 1011/939/1011 1060/946/1060 1061/852/1061 1012/893/1012 +f 1019/853/1019 1012/893/1012 1061/852/1061 1062/794/1062 1013/837/1013 +f 1020/838/1020 1013/837/1013 1062/794/1062 1063/795/1063 1014/839/1014 +f 1021/863/1021 1014/839/1014 1063/795/1063 1064/862/1064 1015/894/1015 +f 1022/906/1022 1015/894/1015 1064/862/1064 1065/948/1065 1016/940/1016 +f 1023/947/1023 1016/940/1016 1065/948/1065 1058/1020/1058 1009/975/1009 +f 1024/974/1024 1009/975/1009 1058/1020/1058 1059/1017/1059 1010/973/1010 +f 1058/1020/1058 1101/1034/1101 1100/1033/1100 1059/1017/1059 +f 1059/1017/1059 1085/1021/1085 1084/976/1084 1060/946/1060 +f 1060/946/1060 1097/941/1097 1096/887/1096 1061/852/1061 +f 1061/852/1061 1081/825/1081 1080/792/1080 1062/794/1062 +f 1062/794/1062 1073/776/1073 1072/777/1072 1063/795/1063 +f 1063/795/1063 1105/793/1105 1104/832/1104 1064/862/1064 +f 1064/862/1064 1069/888/1069 1068/944/1068 1065/948/1065 +f 1065/948/1065 1077/985/1077 1076/1030/1076 1058/1020/1058 +f 1066/1142/1066 1089/1144/1089 1088/1112/1088 1067/1125/1067 +f 1067/4/1067 1068/716/1068 1069/714/1069 1066/14/1066 +f 1067/4/1067 1074/1/1074 1077/715/1077 1068/716/1068 +f 1068/944/1068 1077/985/1077 1065/948/1065 +f 1069/714/1069 1104/704/1104 1103/12/1103 1066/14/1066 +f 1070/1153/1070 1091/1149/1091 1090/1148/1090 1071/1152/1071 +f 1071/8/1071 1072/709/1072 1073/711/1073 1070/6/1070 +f 1071/8/1071 1102/11/1102 1105/707/1105 1072/709/1072 +f 1072/777/1072 1105/793/1105 1063/795/1063 +f 1073/711/1073 1080/712/1080 1079/13/1079 1070/6/1070 +f 1074/1090/1074 1088/1112/1088 1087/1059/1087 1075/1055/1075 +f 1075/10/1075 1076/703/1076 1077/715/1077 1074/1/1074 +f 1075/10/1075 1098/16/1098 1101/706/1101 1076/703/1076 +f 1076/1030/1076 1101/1034/1101 1058/1020/1058 +f 1078/1147/1078 1092/1145/1092 1091/1149/1091 1079/1151/1079 +f 1079/13/1079 1080/712/1080 1081/702/1081 1078/18/1078 +f 1079/1151/1079 1091/1149/1091 1070/1153/1070 +f 1080/792/1080 1073/776/1073 1062/794/1062 +f 1081/702/1081 1096/699/1096 1095/15/1095 1078/18/1078 +f 1082/1056/1082 1086/1060/1086 1093/1113/1093 1083/1091/1083 +f 1083/7/1083 1084/710/1084 1085/713/1085 1082/9/1082 +f 1083/7/1083 1094/5/1094 1097/705/1097 1084/710/1084 +f 1084/976/1084 1097/941/1097 1060/946/1060 +f 1085/3/1085 1100/2/1100 1099/700/1099 1082/701/1082 +f 1086/1060/1086 1099/1050/1099 1098/1049/1098 1087/1059/1087 +f 1087/1059/1087 1088/1112/1088 1089/1144/1089 1090/1148/1090 1091/1149/1091 1092/1145/1092 1093/1113/1093 1086/1060/1086 +f 1087/1059/1087 1098/1049/1098 1075/1055/1075 +f 1088/1112/1088 1074/1090/1074 1067/1125/1067 +f 1089/1144/1089 1103/1146/1103 1102/1150/1102 1090/1148/1090 +f 1090/1148/1090 1102/1150/1102 1071/1152/1071 +f 1092/1145/1092 1095/1143/1095 1094/1126/1094 1093/1113/1093 +f 1093/1113/1093 1094/1126/1094 1083/1091/1083 +f 1095/1143/1095 1092/1145/1092 1078/1147/1078 +f 1095/15/1095 1096/699/1096 1097/705/1097 1094/5/1094 +f 1096/887/1096 1081/825/1081 1061/852/1061 +f 1099/1050/1099 1086/1060/1086 1082/1056/1082 +f 1099/17/1099 1100/708/1100 1101/706/1101 1098/16/1098 +f 1100/1033/1100 1085/1021/1085 1059/1017/1059 +f 1103/1146/1103 1089/1144/1089 1066/1142/1066 +f 1103/12/1103 1104/704/1104 1105/707/1105 1102/11/1102 +f 1104/832/1104 1069/888/1069 1064/862/1064 diff --git a/res/models/playership/weapons/w_plasma.png b/res/models/playership/weapons/w_plasma.png new file mode 100644 index 0000000..606bf9a Binary files /dev/null and b/res/models/playership/weapons/w_plasma.png differ diff --git a/res/models/playership/weapons/w_rocket.mtl b/res/models/playership/weapons/w_rocket.mtl new file mode 100644 index 0000000..934ecab --- /dev/null +++ b/res/models/playership/weapons/w_rocket.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl w_rocket +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd w_rocket.png + diff --git a/res/models/playership/weapons/w_rocket.obj b/res/models/playership/weapons/w_rocket.obj new file mode 100644 index 0000000..0c7cf72 --- /dev/null +++ b/res/models/playership/weapons/w_rocket.obj @@ -0,0 +1,465 @@ +# Exported from Wings 3D 1.4.1 +mtllib w_rocket.mtl +o w_rocket +#88 vertices, 90 faces +v 0.20395629 -0.87166781 1.84423555 +v -0.20558026 -0.86809384 1.84423555 +v -0.20558026 -0.86809384 -0.80619607 +v 0.20395629 -0.87166781 -0.80619607 +v 0.85613518 0.17525101 1.84423555 +v 0.85256121 -0.23428554 1.84423555 +v 0.85256121 -0.23428554 -0.80619607 +v 0.85613518 0.17525101 -0.80619607 +v -0.45457379 -0.76240236 1.84423555 +v -0.74163268 -0.47028910 1.84423555 +v -0.74163268 -0.47028910 -0.80619607 +v -0.45457379 -0.76240236 -0.80619607 +v 0.46774644 0.71816444 1.84423555 +v 0.75480533 0.42605119 1.84423555 +v 0.75480533 0.42605119 -0.80619607 +v 0.46774644 0.71816444 -0.80619607 +v -0.73369708 0.43904116 1.84423555 +v -0.44158383 0.72610005 1.84423555 +v -0.44158383 0.72610005 -0.80619607 +v -0.73369708 0.43904116 -0.80619607 +v -0.69225403 0.27452118 2.03603444 +v -0.69732468 -0.30651746 2.03603444 +v -0.29005381 -0.72095931 2.03603444 +v 0.29098483 -0.72602996 2.03603444 +v 0.70542668 -0.31875909 2.03603444 +v 0.71049733 0.26227955 2.03603444 +v 0.30322646 0.67672140 2.03603444 +v -0.27781218 0.68179205 2.03603444 +v -0.19078365 0.82742990 1.84423555 +v 0.21875290 0.82385593 1.84423555 +v 0.21875290 0.82385593 -0.80619607 +v -0.19078365 0.82742990 -0.80619607 +v -0.84296253 -0.21948893 1.84423555 +v -0.83938856 0.19004763 1.84423555 +v -0.83938856 0.19004763 -0.80619607 +v -0.84296253 -0.21948893 -0.80619607 +v 0.74686972 -0.48327907 1.84423555 +v 0.45475647 -0.77033796 1.84423555 +v 0.45475647 -0.77033796 -0.80619607 +v 0.74686972 -0.48327907 -0.80619607 +v -0.16227722 -0.65990644 -0.80619607 +v -0.33489713 -0.58663363 -0.80619607 +v -0.56380208 -0.35369826 -0.80619607 +v -0.63405110 -0.17982585 -0.80619607 +v -0.63120116 0.14674458 -0.80619607 +v -0.55792835 0.31936449 -0.80619607 +v -0.32499298 0.54826945 -0.80619607 +v -0.15112057 0.61851846 -0.80619607 +v 0.17544986 0.61566853 -0.80619607 +v 0.34806977 0.54239572 -0.80619607 +v 0.57697473 0.30946034 -0.80619607 +v 0.64722374 0.13558794 -0.80619607 +v 0.64437380 -0.19098249 -0.80619607 +v 0.57110100 -0.36360240 -0.80619607 +v 0.33816562 -0.59250736 -0.80619607 +v 0.16429322 -0.66275637 -0.80619607 +v 0.24868787 -0.98238234 -1.04613601 +v 0.49948805 -0.88105249 -1.04613601 +v 0.85678672 -0.52993607 -1.04613601 +v 0.96247820 -0.28094253 -1.04613601 +v 0.96684971 0.21998259 -1.04613601 +v 0.86551986 0.47078277 -1.04613601 +v 0.51440343 0.82808144 -1.04613601 +v 0.26540990 0.93377293 -1.04613601 +v -0.23551522 0.93814443 -1.04613601 +v -0.48631540 0.83681458 -1.04613601 +v -0.84361407 0.48569815 -1.04613601 +v -0.94930556 0.23670462 -1.04613601 +v -0.95367707 -0.26422050 -1.04613601 +v -0.85234722 -0.51502068 -1.04613601 +v -0.50123079 -0.87231935 -1.04613601 +v -0.25223726 -0.97801084 -1.04613601 +v -0.33489713 -0.58663363 -0.42386253 +v -0.56380208 -0.35369826 -0.42386253 +v -0.63405110 -0.17982585 -0.42386253 +v -0.63120116 0.14674458 -0.42386253 +v -0.55792835 0.31936449 -0.42386253 +v -0.32499298 0.54826945 -0.42386253 +v -0.15112057 0.61851846 -0.42386253 +v 0.17544986 0.61566853 -0.42386253 +v 0.34806977 0.54239572 -0.42386253 +v 0.57697473 0.30946034 -0.42386253 +v 0.64722374 0.13558794 -0.42386253 +v 0.64437380 -0.19098249 -0.42386253 +v 0.57110100 -0.36360240 -0.42386253 +v 0.33816562 -0.59250736 -0.42386253 +v 0.16429322 -0.66275637 -0.42386253 +v -0.16227722 -0.65990644 -0.42386253 +vt 7.9763031e-3 0.11688663 +vt 9.3314941e-3 0.66234180 +vt 1.0684138e-2 0.13143532 +vt 1.0887913e-2 0.72061625 +vt 1.1780989e-2 0.48700791 +vt 1.1906161e-2 0.52280126 +vt 1.3404735e-2 9.9056403e-3 +vt 1.3480469e-2 6.1795194e-2 +vt 2.4217100e-2 0.62238221 +vt 2.7913446e-2 0.75910260 +vt 3.8864441e-2 9.8717132e-3 +vt 3.8909694e-2 6.1756376e-2 +vt 4.2716763e-2 0.65248932 +vt 4.4516682e-2 0.72878049 +vt 4.4634955e-2 0.11681799 +vt 4.7023949e-2 0.13131568 +vt 4.8053524e-2 0.48690981 +vt 4.8091667e-2 0.52276277 +vt 6.5493514e-2 0.58056118 +vt 6.9889079e-2 0.79941239 +vt 7.7719610e-2 0.11695512 +vt 8.3205911e-2 9.8414295e-3 +vt 8.3239455e-2 6.1728476e-2 +vt 9.5854464e-2 0.59764023 +vt 9.9503280e-2 0.78160757 +vt 0.10204779 0.13115389 +vt 0.10294652 0.52281866 +vt 0.10294995 0.48684351 +vt 0.10437725 0.56405601 +vt 0.10866331 9.8481442e-3 +vt 0.10869912 6.1683332e-2 +vt 0.10902246 0.81483701 +vt 0.11446289 0.11686948 +vt 0.13845675 0.13106811 +vt 0.13922772 0.48680941 +vt 0.13925846 0.52278764 +vt 0.14740338 0.11669321 +vt 0.15292661 9.8767210e-3 +vt 0.15294726 6.1624786e-2 +vt 0.16259722 0.56320174 +vt 0.16724243 0.81398274 +vt 0.17211640 0.59643118 +vt 0.17576522 0.78039852 +vt 0.17828581 9.9169184e-3 +vt 0.17834037 6.1573190e-2 +vt 0.18405788 0.11662931 +vt 0.19357929 0.13097769 +vt 0.19401690 0.52281032 +vt 0.19418429 0.48684676 +vt 0.20173060 0.57862636 +vt 0.20612617 0.79747757 +vt 0.21711718 0.11599408 +vt 0.22233239 9.9403130e-3 +vt 0.22240868 6.1436367e-2 +vt 0.22710300 0.64925826 +vt 0.22890292 0.72554944 +vt 0.23002907 0.13095697 +vt 0.23039389 0.52293248 +vt 0.23051493 0.48688980 +vt 0.24370624 0.61893615 +vt 0.24740258 0.75565655 +vt 0.24754636 9.9558187e-3 +vt 0.24760159 6.1335068e-2 +vt 0.25340993 0.11583279 +vt 0.26073177 0.65742250 +vt 0.26228819 0.71569695 +vt 0.28519852 0.13097100 +vt 0.28561455 0.48698994 +vt 0.28567487 0.52302753 +vt 0.28573478 0.70519201 +vt 0.28611738 0.66135078 +vt 0.28632504 0.11576493 +vt 0.29138381 9.9517102e-3 +vt 0.29147341 6.1237058e-2 +vt 0.29516553 0.72853392 +vt 0.29595406 0.63817701 +vt 0.31652022 9.9634709e-3 +vt 0.31660079 6.1097029e-2 +vt 0.32165224 0.13102780 +vt 0.32201068 0.52303481 +vt 0.32201789 0.48703292 +vt 0.32256288 0.11549569 +vt 0.32589542 0.75980489 +vt 0.32722502 0.60744712 +vt 0.34906919 0.76964157 +vt 0.35056694 0.59801638 +vt 0.35476313 0.11512078 +vt 0.36016119 1.0000950e-2 +vt 0.36018861 6.0999586e-2 +vt 0.37680309 0.13115408 +vt 0.37693979 0.48689098 +vt 0.37703628 0.52273207 +vt 0.38515097 1.0048163e-2 +vt 0.38516218 6.0953180e-2 +vt 0.39078332 0.11505627 +vt 0.39291041 0.77002416 +vt 0.39440816 0.59839897 +vt 0.41308504 0.13110583 +vt 0.41318586 0.48681355 +vt 0.41323644 0.52268102 +vt 0.41625233 0.76059342 +vt 0.41758193 0.60823565 +vt 0.42317592 0.11485298 +vt 0.42857458 1.0098982e-2 +vt 0.42858445 6.0913634e-2 +vt 0.44752329 0.72986353 +vt 0.44831182 0.63950662 +vt 0.45347146 1.0113013e-2 +vt 0.45347699 6.0883730e-2 +vt 0.45735997 0.70668976 +vt 0.45774257 0.66284853 +vt 0.45906801 0.11479544 +vt 0.46803424 0.13102714 +vt 0.46810777 0.48671378 +vt 0.46824515 0.52256518 +vt 0.49133980 0.11492928 +vt 0.49681323 1.0111034e-2 +vt 0.49682840 6.0880896e-2 +vt 0.50434393 0.13100924 +vt 0.50435338 0.48665570 +vt 0.50441992 0.52249802 +vt 0.52171599 1.0095583e-2 +vt 0.52174749 6.0867674e-2 +vt 0.52185636 9.6483841e-3 +vt 0.52185636 6.0975659e-2 +vt 0.52730890 0.11489932 +vt 0.55922578 0.52237152 +vt 0.55926627 0.48661384 +vt 0.55932515 0.13098817 +vt 0.56569925 9.6483841e-3 +vt 0.56569925 6.0975659e-2 +vt 0.58014557 1.3418008e-2 +vt 0.58110780 1.3096731e-2 +vt 0.58125748 1.3162605e-2 +vt 0.58125991 1.3619867e-2 +vt 0.58135768 1.4030858e-2 +vt 0.58143562 1.3600442e-2 +vt 0.58171753 1.3347767e-2 +vt 0.58183057 1.3512971e-2 +vt 0.59541616 0.52247292 +vt 0.59551663 0.48661513 +vt 0.59563602 0.13100062 +vt 0.61580034 2.2634540e-2 +vt 0.61598430 2.2574878e-2 +vt 0.61602174 2.2901979e-2 +vt 0.61608449 2.3443131e-2 +vt 0.61616364 2.3008251e-2 +vt 0.61647936 2.2629879e-2 +vt 0.61655859 2.2920780e-2 +vt 0.61760132 2.2202215e-2 +vt 0.62005949 5.1021041e-2 +vt 0.62102173 5.0699764e-2 +vt 0.62130715 5.0621034e-2 +vt 0.62140734 5.1489287e-2 +vt 0.62144963 5.0927997e-2 +vt 0.62149010 5.1053722e-2 +vt 0.62188505 5.0966252e-2 +vt 0.62190725 5.0655898e-2 +vt 0.65026909 0.52258990 +vt 0.65044856 0.48664462 +vt 0.65061225 0.13102616 +vt 0.66486125 5.1243749e-2 +vt 0.66514835 5.1006458e-2 +vt 0.66524854 5.1874711e-2 +vt 0.66529196 5.1149180e-2 +vt 0.66533135 5.1433512e-2 +vt 0.66572630 5.1346042e-2 +vt 0.66574958 5.0877080e-2 +vt 0.66666222 5.0811424e-2 +vt 0.67077741 2.3316725e-2 +vt 0.67096347 2.3058220e-2 +vt 0.67100234 2.3179353e-2 +vt 0.67106367 2.3926473e-2 +vt 0.67114288 2.3484527e-2 +vt 0.67145997 2.2907254e-2 +vt 0.67153783 2.3397057e-2 +vt 0.67257839 2.2884400e-2 +vt 0.68662848 0.52270735 +vt 0.68674486 0.48668210 +vt 0.68690794 0.13104281 +vt 0.68693787 0.48681076 +vt 0.68693787 0.13099726 +vt 0.70569594 1.4642688e-2 +vt 0.70585040 1.4257948e-2 +vt 0.70585606 1.4248449e-2 +vt 0.70595059 1.5126201e-2 +vt 0.70602867 1.4679771e-2 +vt 0.70631368 1.3976349e-2 +vt 0.70642362 1.4592301e-2 +vt 0.70749691 1.4210363e-2 +vt 0.74191917 0.48681076 +vt 0.74191917 0.13099726 +vn 0.18315057 -0.94045820 0.28634637 +vn -0.19953593 -0.93711854 0.28634637 +vn 7.4404121e-2 -0.97374977 -0.21511721 +vn -9.1387065e-2 -0.97230293 -0.21511721 +vn 0.94045820 0.18315057 0.28634637 +vn 0.93711854 -0.19953593 0.28634637 +vn 0.97374977 7.4404121e-2 -0.21511721 +vn 0.97230293 -9.1387065e-2 -0.21511721 +vn -0.53549736 -0.79451138 0.28634637 +vn -0.80373609 -0.52154967 0.28634637 +vn -0.63593341 -0.74115672 -0.21511721 +vn -0.75214241 -0.62290158 -0.21511721 +vn 0.53549736 0.79451138 0.28634637 +vn 0.80373609 0.52154967 0.28634637 +vn 0.63593341 0.74115672 -0.21511721 +vn 0.75214241 0.62290158 -0.21511721 +vn -0.79451138 0.53549736 0.28634637 +vn -0.52154967 0.80373609 0.28634637 +vn -0.74115672 0.63593341 -0.21511721 +vn -0.62290158 0.75214241 -0.21511721 +vn -0.60643881 0.25741800 0.75230841 +vn -0.61083901 -0.24679498 0.75230841 +vn -0.25741800 -0.60643881 0.75230841 +vn 0.24679498 -0.61083901 0.75230841 +vn 0.60643881 -0.25741800 0.75230841 +vn 0.61083901 0.24679498 0.75230841 +vn 0.25741800 0.60643881 0.75230841 +vn -0.24679498 0.61083901 0.75230841 +vn -0.18315057 0.94045820 0.28634637 +vn 0.19953593 0.93711854 0.28634637 +vn -7.4404121e-2 0.97374977 -0.21511721 +vn 9.1387065e-2 0.97230293 -0.21511721 +vn -0.94045820 -0.18315057 0.28634637 +vn -0.93711854 0.19953593 0.28634637 +vn -0.97374977 -7.4404121e-2 -0.21511721 +vn -0.97230293 9.1387065e-2 -0.21511721 +vn 0.79451138 -0.53549736 0.28634637 +vn 0.52154967 -0.80373609 0.28634637 +vn 0.74115672 -0.63593341 -0.21511721 +vn 0.62290158 -0.75214241 -0.21511721 +vn 0.47708714 0.67232576 -0.56600878 +vn 0.15221810 0.81022448 -0.56600878 +vn 0.81275765 0.13805455 -0.56600878 +vn 0.68054968 0.46528077 -0.56600878 +vn 0.67232576 -0.47708714 -0.56600878 +vn 0.81022448 -0.15221810 -0.56600878 +vn 0.13805455 -0.81275765 -0.56600878 +vn 0.46528077 -0.68054968 -0.56600878 +vn -0.47708714 -0.67232576 -0.56600878 +vn -0.15221810 -0.81022448 -0.56600878 +vn -0.81275765 -0.13805455 -0.56600878 +vn -0.68054968 -0.46528077 -0.56600878 +vn -0.67232576 0.47708714 -0.56600878 +vn -0.81022448 0.15221810 -0.56600878 +vn -0.13805455 0.81275765 -0.56600878 +vn -0.46528077 0.68054968 -0.56600878 +vn -0.79672277 -0.43196865 -0.42265342 +vn 0.87318504 0.24271790 -0.42265342 +vn -0.25792011 -0.86881604 -0.42265342 +vn 0.44580759 0.78906253 -0.42265342 +vn 0.43196865 -0.79672277 -0.42265342 +vn -0.24271790 0.87318504 -0.42265342 +vn 0.86881604 -0.25792011 -0.42265342 +vn -0.78906253 0.44580759 -0.42265342 +vn 0.79672277 0.43196865 -0.42265342 +vn -0.87318504 -0.24271790 -0.42265342 +vn 0.25792011 0.86881604 -0.42265342 +vn -0.44580759 -0.78906253 -0.42265342 +vn -0.43196865 0.79672277 -0.42265342 +vn 0.24271790 -0.87318504 -0.42265342 +vn -0.86881604 0.25792011 -0.42265342 +vn 0.78906253 -0.44580759 -0.42265342 +vn 0.50140806 0.73641637 -0.45418155 +vn 0.74505499 0.48847946 -0.45418155 +vn 0.87527405 0.16617597 -0.45418155 +vn 0.87224057 -0.18142630 -0.45418155 +vn 0.73641637 -0.50140806 -0.45418155 +vn 0.48847946 -0.74505499 -0.45418155 +vn 0.16617597 -0.87527405 -0.45418155 +vn -0.18142630 -0.87224057 -0.45418155 +vn -0.50140806 -0.73641637 -0.45418155 +vn -0.74505499 -0.48847946 -0.45418155 +vn -0.87527405 -0.16617597 -0.45418155 +vn -0.87224057 0.18142630 -0.45418155 +vn -0.73641637 0.50140806 -0.45418155 +vn -0.48847946 0.74505499 -0.45418155 +vn -0.16617597 0.87527405 -0.45418155 +vn 0.18142630 0.87224057 -0.45418155 +g w_rocket_w_rocket +usemtl w_rocket +s 1 +f 1/40/1 24/42/24 23/24/23 2/29/2 +f 2/113/2 3/114/3 4/99/4 1/98/1 +f 2/113/2 9/119/9 12/120/12 3/114/3 +f 3/176/3 41/167/41 56/157/56 4/149/4 +f 3/176/3 72/189/72 41/167/41 +f 4/99/4 39/91/39 38/90/38 1/98/1 +f 4/99/4 57/100/57 58/92/58 39/91/39 +f 5/66/5 26/56/26 25/55/25 6/65/6 +f 6/67/6 7/68/7 8/59/8 5/57/5 +f 6/67/6 37/79/37 40/81/40 7/68/7 +f 7/171/7 53/163/53 52/153/52 8/144/8 +f 7/171/7 60/184/60 53/163/53 +f 8/59/8 15/49/15 14/47/14 5/57/5 +f 8/59/8 61/58/61 62/48/62 15/49/15 +f 9/19/9 23/24/23 22/13/22 10/9/10 +f 10/129/10 11/128/11 12/120/12 9/119/9 +f 10/129/10 33/142/33 36/141/36 11/128/11 +f 11/172/11 43/165/43 42/155/42 12/145/12 +f 11/172/11 70/185/70 43/165/43 +f 12/120/12 71/121/71 72/115/72 3/114/3 +f 13/51/13 27/43/27 26/56/26 14/61/14 +f 14/47/14 15/49/15 16/35/16 13/34/13 +f 14/61/14 26/56/26 5/66/5 +f 15/175/15 51/168/51 50/158/50 16/148/16 +f 15/175/15 62/188/62 51/168/51 +f 16/35/16 31/28/31 30/26/30 13/34/13 +f 16/35/16 63/36/63 64/27/64 31/28/31 +f 17/10/17 21/14/21 28/25/28 18/20/18 +f 18/192/18 19/191/19 20/181/20 17/182/17 +f 18/3/18 29/16/29 32/17/32 19/5/19 +f 19/177/19 47/169/47 46/151/46 20/150/20 +f 19/177/19 66/190/66 47/169/47 +f 20/179/20 35/160/35 34/161/34 17/180/17 +f 20/179/20 67/178/67 68/159/68 35/160/35 +f 21/14/21 34/4/34 33/2/33 22/13/22 +f 22/13/22 23/24/23 24/42/24 25/55/25 26/56/26 27/43/27 28/25/28 21/14/21 +f 22/13/22 33/2/33 10/9/10 +f 23/24/23 9/19/9 2/29/2 +f 24/42/24 38/50/38 37/60/37 25/55/25 +f 25/55/25 37/60/37 6/65/6 +f 27/43/27 30/41/30 29/32/29 28/25/28 +f 28/25/28 29/32/29 18/20/18 +f 30/41/30 27/43/27 13/51/13 +f 30/26/30 31/28/31 32/17/32 29/16/29 +f 31/174/31 49/166/49 48/156/48 32/147/32 +f 31/174/31 64/187/64 49/166/49 +f 32/17/32 65/18/65 66/6/66 19/5/19 +f 34/4/34 21/14/21 17/10/17 +f 34/161/34 35/160/35 36/141/36 33/142/33 +f 35/173/35 45/164/45 44/154/44 36/146/36 +f 35/173/35 68/186/68 45/164/45 +f 36/141/36 69/140/69 70/127/70 11/128/11 +f 38/50/38 24/42/24 1/40/1 +f 38/90/38 39/91/39 40/81/40 37/79/37 +f 39/170/39 55/162/55 54/152/54 40/143/40 +f 39/170/39 58/183/58 55/162/55 +f 40/81/40 59/80/59 60/69/60 7/68/7 +f 41/45/41 88/44/88 87/53/87 56/54/56 +f 42/155/42 71/135/71 12/145/12 +f 42/39/42 73/38/73 88/44/88 41/45/41 +f 43/31/43 74/30/74 73/38/73 42/39/42 +f 44/154/44 69/136/69 36/146/36 +f 44/23/44 75/22/75 74/30/74 43/31/43 +f 45/12/45 76/11/76 75/22/75 44/23/44 +f 46/151/46 67/132/67 20/150/20 +f 46/8/46 77/7/77 76/11/76 45/12/45 +f 47/125/47 78/124/78 77/130/77 46/131/46 +f 48/156/48 65/137/65 32/147/32 +f 48/118/48 79/117/79 78/122/78 47/123/47 +f 49/109/49 80/108/80 79/117/79 48/118/48 +f 50/158/50 63/138/63 16/148/16 +f 50/105/50 81/104/81 80/108/80 49/109/49 +f 51/94/51 82/93/82 81/104/81 50/105/50 +f 52/153/52 61/134/61 8/144/8 +f 52/89/52 83/88/83 82/93/82 51/94/51 +f 53/78/53 84/77/84 83/88/83 52/89/52 +f 54/152/54 59/133/59 40/143/40 +f 54/74/54 85/73/85 84/77/84 53/78/53 +f 55/63/55 86/62/86 85/73/85 54/74/54 +f 56/157/56 57/139/57 4/149/4 +f 56/54/56 87/53/87 86/62/86 55/63/55 +f 57/52/57 56/54/56 55/63/55 58/64/58 +f 59/72/59 54/74/54 53/78/53 60/82/60 +f 61/87/61 52/89/52 51/94/51 62/95/62 +f 63/103/63 50/105/50 49/109/49 64/112/64 +f 65/116/65 48/118/48 47/123/47 66/126/66 +f 67/1/67 46/8/46 45/12/45 68/15/68 +f 69/21/69 44/23/44 43/31/43 70/33/70 +f 71/37/71 42/39/42 41/45/41 72/46/72 +f 74/107/74 75/111/75 76/110/76 77/106/77 78/101/78 79/96/79 80/85/80 81/83/81 82/75/82 83/70/83 84/71/84 85/76/85 86/84/86 87/86/87 88/97/88 73/102/73 diff --git a/res/models/playership/weapons/w_rocket.png b/res/models/playership/weapons/w_rocket.png new file mode 100644 index 0000000..9fa609c Binary files /dev/null and b/res/models/playership/weapons/w_rocket.png differ diff --git a/res/models/playership/weapons/w_rocket2.mtl b/res/models/playership/weapons/w_rocket2.mtl new file mode 100644 index 0000000..3a7e615 --- /dev/null +++ b/res/models/playership/weapons/w_rocket2.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl w_rocket2 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd w_rocket2.png + diff --git a/res/models/playership/weapons/w_rocket2.obj b/res/models/playership/weapons/w_rocket2.obj new file mode 100644 index 0000000..2e2053e --- /dev/null +++ b/res/models/playership/weapons/w_rocket2.obj @@ -0,0 +1,1661 @@ +# Exported from Wings 3D 1.4.1 +mtllib w_rocket2.mtl +o w_rocket2 +#216 vertices, 218 faces +v 0.20395629 -0.87166781 1.84423555 +v -0.20558026 -0.86809384 1.84423555 +v -0.20558026 -0.86809384 -0.80619607 +v 0.20395629 -0.87166781 -0.80619607 +v 0.85613518 0.17525101 1.84423555 +v 0.85256121 -0.23428554 1.84423555 +v 0.85256121 -0.23428554 -0.80619607 +v 0.85613518 0.17525101 -0.80619607 +v -0.45457379 -0.76240236 1.84423555 +v -0.74163268 -0.47028910 1.84423555 +v -0.74163268 -0.47028910 -0.80619607 +v -0.45457379 -0.76240236 -0.80619607 +v 0.46774644 0.71816444 1.84423555 +v 0.75480533 0.42605119 1.84423555 +v 0.75480533 0.42605119 -0.80619607 +v 0.46774644 0.71816444 -0.80619607 +v -0.73369708 0.43904116 1.84423555 +v -0.44158383 0.72610005 1.84423555 +v -0.44158383 0.72610005 -0.80619607 +v -0.73369708 0.43904116 -0.80619607 +v -0.69225403 0.27452118 2.03603444 +v -0.69732468 -0.30651746 2.03603444 +v -0.29005381 -0.72095931 2.03603444 +v 0.29098483 -0.72602996 2.03603444 +v 0.70542668 -0.31875909 2.03603444 +v 0.71049733 0.26227955 2.03603444 +v 0.30322646 0.67672140 2.03603444 +v -0.27781218 0.68179205 2.03603444 +v -0.19078365 0.82742990 1.84423555 +v 0.21875290 0.82385593 1.84423555 +v 0.21875290 0.82385593 -0.80619607 +v -0.19078365 0.82742990 -0.80619607 +v -0.84296253 -0.21948893 1.84423555 +v -0.83938856 0.19004763 1.84423555 +v -0.83938856 0.19004763 -0.80619607 +v -0.84296253 -0.21948893 -0.80619607 +v 0.74686972 -0.48327907 1.84423555 +v 0.45475647 -0.77033796 1.84423555 +v 0.45475647 -0.77033796 -0.80619607 +v 0.74686972 -0.48327907 -0.80619607 +v -0.16227722 -0.65990644 -0.80619607 +v -0.33489713 -0.58663363 -0.80619607 +v -0.56380208 -0.35369826 -0.80619607 +v -0.63405110 -0.17982585 -0.80619607 +v -0.63120116 0.14674458 -0.80619607 +v -0.55792835 0.31936449 -0.80619607 +v -0.32499298 0.54826945 -0.80619607 +v -0.15112057 0.61851846 -0.80619607 +v 0.17544986 0.61566853 -0.80619607 +v 0.34806977 0.54239572 -0.80619607 +v 0.57697473 0.30946034 -0.80619607 +v 0.64722374 0.13558794 -0.80619607 +v 0.64437380 -0.19098249 -0.80619607 +v 0.57110100 -0.36360240 -0.80619607 +v 0.33816562 -0.59250736 -0.80619607 +v 0.16429322 -0.66275637 -0.80619607 +v 0.24868787 -0.98238234 -1.04613601 +v 0.49948805 -0.88105249 -1.04613601 +v 0.85678672 -0.52993607 -1.04613601 +v 0.96247820 -0.28094253 -1.04613601 +v 0.96684971 0.21998259 -1.04613601 +v 0.86551986 0.47078277 -1.04613601 +v 0.51440343 0.82808144 -1.04613601 +v 0.26540990 0.93377293 -1.04613601 +v -0.23551522 0.93814443 -1.04613601 +v -0.48631540 0.83681458 -1.04613601 +v -0.84361407 0.48569815 -1.04613601 +v -0.94930556 0.23670462 -1.04613601 +v -0.95367707 -0.26422050 -1.04613601 +v -0.85234722 -0.51502068 -1.04613601 +v -0.50123079 -0.87231935 -1.04613601 +v -0.25223726 -0.97801084 -1.04613601 +v -0.33489713 -0.58663363 -0.42386253 +v -0.56380208 -0.35369826 -0.42386253 +v -0.63405110 -0.17982585 -0.42386253 +v -0.63120116 0.14674458 -0.42386253 +v -0.55792835 0.31936449 -0.42386253 +v -0.32499298 0.54826945 -0.42386253 +v -0.15112057 0.61851846 -0.42386253 +v 0.17544986 0.61566853 -0.42386253 +v 0.34806977 0.54239572 -0.42386253 +v 0.57697473 0.30946034 -0.42386253 +v 0.64722374 0.13558794 -0.42386253 +v 0.64437380 -0.19098249 -0.42386253 +v 0.57110100 -0.36360240 -0.42386253 +v 0.33816562 -0.59250736 -0.42386253 +v 0.16429322 -0.66275637 -0.42386253 +v -0.16227722 -0.65990644 -0.42386253 +v 0.74686972 -0.48327907 0.51901974 +v 0.45475647 -0.77033796 0.51901974 +v -0.84296253 -0.21948893 0.51901974 +v -0.83938856 0.19004763 0.51901974 +v -0.19078365 0.82742990 0.51901974 +v 0.21875290 0.82385593 0.51901974 +v -0.73369708 0.43904116 0.51901974 +v -0.44158383 0.72610005 0.51901974 +v 0.46774644 0.71816444 0.51901974 +v 0.75480533 0.42605119 0.51901974 +v -0.45457379 -0.76240236 0.51901974 +v -0.74163268 -0.47028910 0.51901974 +v 0.85613518 0.17525101 0.51901974 +v 0.85256121 -0.23428554 0.51901974 +v 0.20395629 -0.87166781 0.51901974 +v -0.20558026 -0.86809384 0.51901974 +v 0.20395629 -0.87166781 -0.14358816 +v 0.85613518 0.17525101 -0.14358816 +v -0.45457379 -0.76240236 -0.14358816 +v 0.46774644 0.71816444 -0.14358816 +v -0.73369708 0.43904116 -0.14358816 +v -0.19078365 0.82742990 -0.14358816 +v -0.84296253 -0.21948893 -0.14358816 +v 0.74686972 -0.48327907 -0.14358816 +v 0.45475647 -0.77033796 -0.14358816 +v -0.83938856 0.19004763 -0.14358816 +v 0.21875290 0.82385593 -0.14358816 +v -0.44158383 0.72610005 -0.14358816 +v 0.75480533 0.42605119 -0.14358816 +v -0.74163268 -0.47028910 -0.14358816 +v 0.85256121 -0.23428554 -0.14358816 +v -0.20558026 -0.86809384 -0.14358816 +v 0.74686972 -0.48327907 -0.47489212 +v -0.84296253 -0.21948893 -0.47489212 +v -0.19078365 0.82742990 -0.47489212 +v -0.73369708 0.43904116 -0.47489212 +v 0.46774644 0.71816444 -0.47489212 +v -0.45457379 -0.76240236 -0.47489212 +v 0.85613518 0.17525101 -0.47489212 +v 0.20395629 -0.87166781 -0.47489212 +v 0.45475647 -0.77033796 -0.47489212 +v -0.83938856 0.19004763 -0.47489212 +v 0.21875290 0.82385593 -0.47489212 +v -0.44158383 0.72610005 -0.47489212 +v 0.75480533 0.42605119 -0.47489212 +v -0.74163268 -0.47028910 -0.47489212 +v 0.85256121 -0.23428554 -0.47489212 +v -0.20558026 -0.86809384 -0.47489212 +v -0.20558026 -0.86809384 0.18771579 +v 0.85256121 -0.23428554 0.18771579 +v -0.74163268 -0.47028910 0.18771579 +v 0.75480533 0.42605119 0.18771579 +v -0.44158383 0.72610005 0.18771579 +v 0.21875290 0.82385593 0.18771579 +v -0.83938856 0.19004763 0.18771579 +v 0.45475647 -0.77033796 0.18771579 +v 0.20395629 -0.87166781 0.18771579 +v 0.85613518 0.17525101 0.18771579 +v -0.45457379 -0.76240236 0.18771579 +v 0.46774644 0.71816444 0.18771579 +v -0.73369708 0.43904116 0.18771579 +v -0.19078365 0.82742990 0.18771579 +v -0.84296253 -0.21948893 0.18771579 +v 0.74686972 -0.48327907 0.18771579 +v -0.32434313 0.97964694 0.26954787 +v -0.45124802 0.92837404 0.26954787 +v -0.45124802 0.92837404 0.43718767 +v -0.32434313 0.97964694 0.43718767 +v -0.99517957 -0.35304841 0.26954787 +v -0.94390667 -0.47995330 0.26954787 +v -0.94390667 -0.47995330 0.43718767 +v -0.99517957 -0.35304841 0.43718767 +v 0.94894424 -0.49647196 0.26954787 +v 1.00242413 -0.37048123 0.26954787 +v 1.00242413 -0.37048123 0.43718767 +v 0.94894424 -0.49647196 0.43718767 +v -0.46776668 -0.96447687 0.26954787 +v -0.34177595 -1.01795676 0.26954787 +v -0.34177595 -1.01795676 0.43718767 +v -0.46776668 -0.96447687 0.43718767 +v 0.33751577 -1.02388485 0.26954787 +v 0.46442066 -0.97261195 0.26954787 +v 0.46442066 -0.97261195 0.43718767 +v 0.33751577 -1.02388485 0.43718767 +v -0.93577159 0.45223404 0.26954787 +v -0.98925148 0.32624332 0.26954787 +v -0.98925148 0.32624332 0.43718767 +v -0.93577159 0.45223404 0.43718767 +v 0.48093932 0.92023896 0.26954787 +v 0.35494860 0.97371885 0.26954787 +v 0.35494860 0.97371885 0.43718767 +v 0.48093932 0.92023896 0.43718767 +v 1.00835222 0.30881049 0.26954787 +v 0.95707931 0.43571539 0.26954787 +v 0.95707931 0.43571539 0.43718767 +v 1.00835222 0.30881049 0.43718767 +v -0.32434313 0.97964694 -0.39306004 +v -0.45124802 0.92837404 -0.39306004 +v -0.45124802 0.92837404 -0.22542024 +v -0.32434313 0.97964694 -0.22542024 +v -0.99517957 -0.35304841 -0.39306004 +v -0.94390667 -0.47995330 -0.39306004 +v -0.94390667 -0.47995330 -0.22542024 +v -0.99517957 -0.35304841 -0.22542024 +v 0.94894424 -0.49647196 -0.39306004 +v 1.00242413 -0.37048123 -0.39306004 +v 1.00242413 -0.37048123 -0.22542024 +v 0.94894424 -0.49647196 -0.22542024 +v -0.46776668 -0.96447687 -0.39306004 +v -0.34177595 -1.01795676 -0.39306004 +v -0.34177595 -1.01795676 -0.22542024 +v -0.46776668 -0.96447687 -0.22542024 +v 0.33751577 -1.02388485 -0.39306004 +v 0.46442066 -0.97261195 -0.39306004 +v 0.46442066 -0.97261195 -0.22542024 +v 0.33751577 -1.02388485 -0.22542024 +v -0.93577159 0.45223404 -0.39306004 +v -0.98925148 0.32624332 -0.39306004 +v -0.98925148 0.32624332 -0.22542024 +v -0.93577159 0.45223404 -0.22542024 +v 0.48093932 0.92023896 -0.39306004 +v 0.35494860 0.97371885 -0.39306004 +v 0.35494860 0.97371885 -0.22542024 +v 0.48093932 0.92023896 -0.22542024 +v 1.00835222 0.30881049 -0.39306004 +v 0.95707931 0.43571539 -0.39306004 +v 0.95707931 0.43571539 -0.22542024 +v 1.00835222 0.30881049 -0.22542024 +vt 1.3560174e-2 8.7385697e-3 +vt 1.3565803e-2 5.5602323e-2 +vt 2.2455123e-2 0.14139415 +vt 2.2495693e-2 0.35788188 +vt 2.2511337e-2 0.40121795 +vt 2.2547821e-2 0.44438225 +vt 2.2552735e-2 0.48769352 +vt 2.2559825e-2 0.31461930 +vt 2.2592518e-2 0.52277880 +vt 4.8517087e-2 0.10540787 +vt 5.3590433e-2 8.7337591e-3 +vt 5.3596049e-2 5.5597659e-2 +vt 5.7817619e-2 0.14137314 +vt 5.7866961e-2 0.35786989 +vt 5.7887510e-2 0.40115873 +vt 5.7896751e-2 0.44437887 +vt 5.7909646e-2 0.31458176 +vt 5.7912384e-2 0.48766285 +vt 5.7993449e-2 0.52273319 +vt 7.6576371e-2 8.7310968e-3 +vt 7.6581918e-2 5.5594992e-2 +vt 8.1672713e-2 0.10540394 +vt 0.11134227 0.14137148 +vt 0.11137065 0.40111930 +vt 0.11137344 0.35785690 +vt 0.11138543 0.44437148 +vt 0.11138588 0.48765183 +vt 0.11138926 0.52263455 +vt 0.11142337 0.31454667 +vt 0.11153319 0.10540041 +vt 0.11660666 8.7264110e-3 +vt 0.11661222 5.5590213e-2 +vt 0.13959251 8.7235866e-3 +vt 0.13959805 5.5587445e-2 +vt 0.14468886 0.10539648 +vt 0.14666667 0.14137529 +vt 0.14670228 0.35780048 +vt 0.14671572 0.52268028 +vt 0.14672316 0.48766057 +vt 0.14672939 0.31449535 +vt 0.14672992 0.40109982 +vt 0.14674539 0.44435078 +vt 0.17454938 0.10539295 +vt 0.17962289 8.7188606e-3 +vt 0.17962837 5.5582713e-2 +vt 0.20012430 0.14136191 +vt 0.20019805 0.31447740 +vt 0.20021803 0.35778931 +vt 0.20025201 0.40107369 +vt 0.20026000 0.48763004 +vt 0.20026322 0.44433628 +vt 0.20035530 0.52261434 +vt 0.20260864 8.7161730e-3 +vt 0.20261420 5.5580020e-2 +vt 0.20770504 0.10538901 +vt 0.23544215 0.14134132 +vt 0.23552832 0.31447365 +vt 0.23556141 0.44433038 +vt 0.23556357 0.35775146 +vt 0.23557595 0.48760825 +vt 0.23558048 0.40102436 +vt 0.23563698 0.52255254 +vt 0.23756554 0.10538547 +vt 0.24263895 8.7113384e-3 +vt 0.24264459 5.5575264e-2 +vt 0.26562483 8.7086829e-3 +vt 0.26563038 5.5572539e-2 +vt 0.27072119 0.10538158 +vt 0.28329917 0.70494340 +vt 0.28369886 0.65914387 +vt 0.28895071 0.14128143 +vt 0.28903803 0.31445691 +vt 0.28905382 0.35773860 +vt 0.28908298 0.40099688 +vt 0.28909476 0.44429699 +vt 0.28912525 0.48759259 +vt 0.28922630 0.52255355 +vt 0.29315117 0.72932796 +vt 0.29397493 0.63493497 +vt 0.30058169 0.10537801 +vt 0.30565514 8.7039381e-3 +vt 0.30566069 5.5567796e-2 +vt 0.32430146 0.14125241 +vt 0.32438112 0.31443890 +vt 0.32439692 0.35771688 +vt 0.32442067 0.40096080 +vt 0.32443973 0.44424405 +vt 0.32444287 0.48752199 +vt 0.32453438 0.52247375 +vt 0.32525371 0.76199574 +vt 0.32664271 0.60283243 +vt 0.32864099 8.7012154e-3 +vt 0.32864654 5.5565072e-2 +vt 0.33373735 0.10537408 +vt 0.34946261 0.77227181 +vt 0.35102726 0.59298043 +vt 0.36359785 0.10537054 +vt 0.36867130 8.6964722e-3 +vt 0.36867686 5.5560328e-2 +vt 0.37784038 0.14124059 +vt 0.37790841 0.31440862 +vt 0.37790961 0.35769070 +vt 0.37792957 0.40096157 +vt 0.37797006 0.44423182 +vt 0.37797588 0.48753151 +vt 0.37798314 0.52258797 +vt 0.39165714 8.6937471e-3 +vt 0.39166270 5.5557603e-2 +vt 0.39526214 0.77267150 +vt 0.39675351 0.10536661 +vt 0.39682680 0.59338012 +vt 0.41318140 0.14123981 +vt 0.41324928 0.31440609 +vt 0.41326944 0.35766342 +vt 0.41328803 0.40095131 +vt 0.41333193 0.44424484 +vt 0.41335016 0.48754124 +vt 0.41335480 0.52258527 +vt 0.41964670 0.76281950 +vt 0.42103570 0.60365619 +vt 0.42661401 0.10536307 +vt 0.43168746 8.6890039e-3 +vt 0.43169301 5.5552861e-2 +vt 0.45231448 0.73071696 +vt 0.45313824 0.63632397 +vt 0.45467330 8.6862798e-3 +vt 0.45467886 5.5550137e-2 +vt 0.45976967 0.10535914 +vt 0.46259055 0.70650806 +vt 0.46299024 0.66070852 +vt 0.46666722 0.14124163 +vt 0.46674808 0.31438144 +vt 0.46678661 0.35765290 +vt 0.46680468 0.40093515 +vt 0.46682949 0.44422875 +vt 0.46686209 0.48751421 +vt 0.46692018 0.52247294 +vt 0.48963017 0.10535560 +vt 0.49470362 8.6815370e-3 +vt 0.49470917 5.5545393e-2 +vt 0.50199379 0.14121960 +vt 0.50208785 0.31437335 +vt 0.50214109 0.35765001 +vt 0.50214384 0.40093199 +vt 0.50214412 0.44421551 +vt 0.50216549 0.48748421 +vt 0.50222773 0.52243571 +vt 0.51768946 8.6788129e-3 +vt 0.51769502 5.5542669e-2 +vt 0.52278582 0.10535167 +vt 0.55549437 0.14118134 +vt 0.55559515 0.31434773 +vt 0.55563396 0.35763166 +vt 0.55564317 0.40092736 +vt 0.55565957 0.44421900 +vt 0.55568155 0.52249548 +vt 0.55568859 0.48749670 +vt 0.59084040 0.14116005 +vt 0.59092753 0.31433314 +vt 0.59095285 0.40092580 +vt 0.59095732 0.35765683 +vt 0.59099150 0.52250150 +vt 0.59099318 0.44421665 +vt 0.59103750 0.48748244 +vt 0.60219929 5.1047662e-2 +vt 0.60243137 5.0978501e-2 +vt 0.60243137 5.0978501e-2 +vt 0.60243144 5.0850836e-2 +vt 0.60243144 5.0850836e-2 +vt 0.60243144 5.0850836e-2 +vt 0.60247331 5.0913309e-2 +vt 0.60283253 5.0732296e-2 +vt 0.63148537 4.3376411e-2 +vt 0.63158779 4.3341214e-2 +vt 0.63158779 4.3341214e-2 +vt 0.63160303 4.3271684e-2 +vt 0.63160303 4.3271684e-2 +vt 0.63160303 4.3271684e-2 +vt 0.63167381 4.3363889e-2 +vt 0.63177992 4.3211392e-2 +vt 0.63616438 1.9816666e-2 +vt 0.63624609 1.9885779e-2 +vt 0.63624609 1.9885779e-2 +vt 0.63625766 1.9826288e-2 +vt 0.63630807 1.9825581e-2 +vt 0.63630807 1.9825581e-2 +vt 0.63630807 1.9825581e-2 +vt 0.63644880 1.9945482e-2 +vt 0.64435647 0.14115081 +vt 0.64442668 0.35760842 +vt 0.64443447 0.31430865 +vt 0.64445394 0.40086792 +vt 0.64447894 0.52234878 +vt 0.64449399 0.44413280 +vt 0.64452237 0.48740513 +vt 0.67289350 2.0007249e-2 +vt 0.67297310 1.9874813e-2 +vt 0.67297310 1.9874813e-2 +vt 0.67303503 1.9887827e-2 +vt 0.67303503 1.9887827e-2 +vt 0.67303503 1.9887827e-2 +vt 0.67305472 1.9805652e-2 +vt 0.67307040 1.9912562e-2 +vt 0.67748349 4.3288852e-2 +vt 0.67763754 4.3334198e-2 +vt 0.67764540 4.3327463e-2 +vt 0.67764540 4.3327463e-2 +vt 0.67766057 4.3349744e-2 +vt 0.67766057 4.3349744e-2 +vt 0.67766057 4.3349744e-2 +vt 0.67774780 4.3362599e-2 +vt 0.67969662 0.14113293 +vt 0.67974743 0.35752808 +vt 0.67975385 0.52239190 +vt 0.67976813 0.31426859 +vt 0.67979824 0.40079930 +vt 0.67982336 0.48743780 +vt 0.67982522 0.44411643 +vt 0.69481794 0.79125010 +vt 0.69644388 0.85212756 +vt 0.70640522 5.0907833e-2 +vt 0.70671770 5.0991799e-2 +vt 0.70680630 5.1027733e-2 +vt 0.70680630 5.1027733e-2 +vt 0.70680630 5.1027733e-2 +vt 0.70680637 5.0947339e-2 +vt 0.70680637 5.0947339e-2 +vt 0.70703846 5.1016362e-2 +vt 0.71036846 0.74950558 +vt 0.71422991 0.89233302 +vt 0.72969447 0.78095752 +vt 0.73157479 0.86065648 +vt 0.73320513 0.14112333 +vt 0.73325887 0.31423976 +vt 0.73326936 0.35750839 +vt 0.73330044 0.40076196 +vt 0.73336120 0.44406126 +vt 0.73340192 0.48739528 +vt 0.75348861 0.70581648 +vt 0.75808052 0.93444339 +vt 0.78520573 0.72365843 +vt 0.78901754 0.91584325 +vt 0.79410922 0.68857405 +vt 0.79896192 0.95055699 +vt 0.85492977 0.68768162 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85973207 8.4958352e-2 +vt 0.85975966 3.2261794e-2 +vt 0.85975966 8.4992183e-2 +vt 0.85975966 3.2261794e-2 +vt 0.85975966 8.4992183e-2 +vt 0.85975966 3.2261794e-2 +vt 0.85975966 8.4992183e-2 +vt 0.85975966 3.2261794e-2 +vt 0.85975966 8.4992183e-2 +vt 0.85978247 0.94966456 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.85978729 3.2227993e-2 +vt 0.86487415 0.72239537 +vt 0.86868596 0.91458019 +vt 0.88028643 6.8212362e-2 +vt 0.88028643 6.8212362e-2 +vt 0.88028643 6.8212362e-2 +vt 0.88028643 6.8212362e-2 +vt 0.88028643 6.8212362e-2 +vt 0.88028643 6.8212362e-2 +vt 0.88028643 6.8212362e-2 +vt 0.88028643 6.8212362e-2 +vt 0.88029648 4.9029299e-2 +vt 0.88029648 6.8224678e-2 +vt 0.88029648 4.9029299e-2 +vt 0.88029648 6.8224678e-2 +vt 0.88029648 6.8224678e-2 +vt 0.88029648 4.9029299e-2 +vt 0.88029648 6.8224678e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.88030653 4.9016994e-2 +vt 0.89581117 0.70379523 +vt 0.90040307 0.93242214 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90379689 6.8236983e-2 +vt 0.90380695 4.9029299e-2 +vt 0.90380695 4.9029299e-2 +vt 0.90380695 6.8224678e-2 +vt 0.90380695 6.8224678e-2 +vt 0.90380695 4.9029299e-2 +vt 0.90380695 6.8224678e-2 +vt 0.90380695 4.9029299e-2 +vt 0.90380695 6.8224678e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.90381699 4.9041614e-2 +vt 0.92231690 0.77758214 +vt 0.92419722 0.85728110 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92431613 8.5025984e-2 +vt 0.92434376 3.2261794e-2 +vt 0.92434376 3.2261794e-2 +vt 0.92434376 8.4992183e-2 +vt 0.92434376 8.4992183e-2 +vt 0.92434376 3.2261794e-2 +vt 0.92434376 8.4992183e-2 +vt 0.92434376 3.2261794e-2 +vt 0.92434376 8.4992183e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.92437135 3.2295625e-2 +vt 0.93966178 0.74590560 +vt 0.94352323 0.88873304 +vt 0.95744781 0.78611106 +vt 0.95907375 0.84698852 +vn -0.60643881 0.25741800 0.75230841 +vn -0.61083901 -0.24679498 0.75230841 +vn -0.25741800 -0.60643881 0.75230841 +vn 0.24679498 -0.61083901 0.75230841 +vn 0.60643881 -0.25741800 0.75230841 +vn 0.61083901 0.24679498 0.75230841 +vn 0.25741800 0.60643881 0.75230841 +vn -0.24679498 0.61083901 0.75230841 +vn 0.18652404 -0.98245040 -9.1807486e-17 +vn 0.16450215 -0.82009306 0.54807518 +vn 0.16450215 -0.82009306 0.54807518 +vn 0.18652404 -0.98245040 -9.1807486e-17 +vn -8.7265355e-3 -0.99996192 -8.3301057e-17 +vn -0.17878969 -0.81709720 0.54807518 +vn -0.39073113 -0.92050485 -4.8392902e-17 +vn -0.17878969 -0.81709720 0.54807518 +vn 0.11319691 -0.94229500 -0.31506600 +vn 0.11319691 -0.94229500 -0.31506600 +vn 0.11319691 -0.94229500 -0.31506600 +vn -8.7265355e-3 -0.99996192 7.9905091e-19 +vn 0.11319691 -0.94229500 -0.31506600 +vn -0.66027865 -0.12535782 -0.74048465 +vn -0.66027865 -0.12535782 -0.74048465 +vn 0.24351770 -0.95747647 0.15471891 +vn 0.24351770 -0.95747647 0.15471891 +vn 0.24351770 -0.95747647 0.15471891 +vn 0.98245040 0.18652404 -3.3823094e-17 +vn 0.82009306 0.16450215 0.54807518 +vn 0.82009306 0.16450215 0.54807518 +vn 0.98245040 0.18652404 -3.3823094e-17 +vn 0.97904547 -0.20364175 -5.8493582e-17 +vn 0.81709720 -0.17878969 0.54807518 +vn 0.97904547 -0.20364175 -5.8493582e-17 +vn 0.81709720 -0.17878969 0.54807518 +vn 0.13686218 0.65799029 -0.74048465 +vn 0.13686218 0.65799029 -0.74048465 +vn 0.95308067 -0.26019088 0.15471891 +vn 0.95308067 -0.26019088 0.15471891 +vn 0.95308067 -0.26019088 0.15471891 +vn 0.12535782 -0.66027865 -0.74048465 +vn 0.12535782 -0.66027865 -0.74048465 +vn 0.95747647 0.24351770 0.15471891 +vn 0.95747647 0.24351770 0.15471891 +vn 0.95747647 0.24351770 0.15471891 +vn -0.56280493 -0.82658975 -3.7705771e-17 +vn -0.56280493 -0.82658975 -3.7705771e-17 +vn -0.46357278 -0.69621395 0.54807518 +vn -0.46357278 -0.69621395 0.54807518 +vn -0.83628616 -0.54829323 -1.0568235e-17 +vn -0.83628616 -0.54829323 -1.0568235e-17 +vn -0.70419838 -0.45135157 0.54807518 +vn -0.70419838 -0.45135157 0.54807518 +vn 0.36849322 -0.56204557 -0.74048465 +vn 0.36849322 -0.56204557 -0.74048465 +vn -0.85791254 -0.48994707 0.15471891 +vn -0.85791254 -0.48994707 0.15471891 +vn -0.85791254 -0.48994707 0.15471891 +vn -0.55552888 0.37824615 -0.74048465 +vn -0.55552888 0.37824615 -0.74048465 +vn -0.50484508 -0.84923112 0.15471891 +vn -0.50484508 -0.84923112 0.15471891 +vn -0.50484508 -0.84923112 0.15471891 +vn 0.56280493 0.82658975 5.4091608e-17 +vn 0.46357278 0.69621395 0.54807518 +vn 0.46357278 0.69621395 0.54807518 +vn 0.56280493 0.82658975 5.4091608e-17 +vn 0.83628616 0.54829323 7.2176822e-18 +vn 0.70419838 0.45135157 0.54807518 +vn 0.70419838 0.45135157 0.54807518 +vn 0.83628616 0.54829323 7.2176822e-18 +vn -0.36849322 0.56204557 -0.74048465 +vn -0.36849322 0.56204557 -0.74048465 +vn 0.85791254 0.48994707 0.15471891 +vn 0.85791254 0.48994707 0.15471891 +vn 0.85791254 0.48994707 0.15471891 +vn 0.55552888 -0.37824615 -0.74048465 +vn 0.55552888 -0.37824615 -0.74048465 +vn 0.50484508 0.84923112 0.15471891 +vn 0.50484508 0.84923112 0.15471891 +vn 0.50484508 0.84923112 0.15471891 +vn -0.82658975 0.56280493 7.4344574e-17 +vn -0.69621395 0.46357278 0.54807518 +vn -0.69621395 0.46357278 0.54807518 +vn -0.82658975 0.56280493 7.4344574e-17 +vn -0.54829323 0.83628616 1.0148211e-16 +vn -0.45135157 0.70419838 0.54807518 +vn -0.54829323 0.83628616 1.0148211e-16 +vn -0.45135157 0.70419838 0.54807518 +vn -0.56204557 -0.36849322 -0.74048465 +vn -0.56204557 -0.36849322 -0.74048465 +vn -0.48994707 0.85791254 0.15471891 +vn -0.48994707 0.85791254 0.15471891 +vn -0.48994707 0.85791254 0.15471891 +vn -0.62290158 0.75214241 -0.21511721 +vn -0.62290158 0.75214241 -0.21511721 +vn -0.62290158 0.75214241 -0.21511721 +vn -0.62290158 0.75214241 -0.21511721 +vn -0.62290158 0.75214241 -0.21511721 +vn -0.18652404 0.98245040 9.1909324e-17 +vn -0.18652404 0.98245040 9.1909324e-17 +vn -0.16450215 0.82009306 0.54807518 +vn -0.16450215 0.82009306 0.54807518 +vn 0.20364175 0.97904547 7.7107031e-17 +vn 0.17878969 0.81709720 0.54807518 +vn 0.17878969 0.81709720 0.54807518 +vn 0.20364175 0.97904547 7.7107031e-17 +vn -0.65799029 0.13686218 -0.74048465 +vn -0.65799029 0.13686218 -0.74048465 +vn 0.26019088 0.95308067 0.15471891 +vn 0.26019088 0.95308067 0.15471891 +vn 0.26019088 0.95308067 0.15471891 +vn 0.66027865 0.12535782 -0.74048465 +vn 0.66027865 0.12535782 -0.74048465 +vn -0.24351770 0.95747647 0.15471891 +vn -0.24351770 0.95747647 0.15471891 +vn -0.24351770 0.95747647 0.15471891 +vn -0.98245040 -0.18652404 2.4056738e-17 +vn -0.98245040 -0.18652404 2.4056738e-17 +vn -0.82009306 -0.16450215 0.54807518 +vn -0.82009306 -0.16450215 0.54807518 +vn -0.97904547 0.20364175 4.3793128e-17 +vn -0.81709720 0.17878969 0.54807518 +vn -0.81709720 0.17878969 0.54807518 +vn -0.97904547 0.20364175 4.3793128e-17 +vn -0.13686218 -0.65799029 -0.74048465 +vn -0.13686218 -0.65799029 -0.74048465 +vn -0.95308067 0.26019088 0.15471891 +vn -0.95308067 0.26019088 0.15471891 +vn -0.95308067 0.26019088 0.15471891 +vn -0.97230293 9.1387065e-2 -0.21511721 +vn -0.97230293 9.1387065e-2 -0.21511721 +vn -0.97230293 9.1387065e-2 -0.21511721 +vn -0.97230293 9.1387065e-2 -0.21511721 +vn -0.97230293 9.1387065e-2 -0.21511721 +vn 0.82658975 -0.56280493 -1.0218215e-16 +vn 0.82658975 -0.56280493 -1.0218215e-16 +vn 0.69621395 -0.46357278 0.54807518 +vn 0.69621395 -0.46357278 0.54807518 +vn 0.54829323 -0.83628616 -1.1451739e-16 +vn 0.45135157 -0.70419838 0.54807518 +vn 0.45135157 -0.70419838 0.54807518 +vn 0.54829323 -0.83628616 -1.1451739e-16 +vn 0.56204557 0.36849322 -0.74048465 +vn 0.56204557 0.36849322 -0.74048465 +vn 0.48994707 -0.85791254 0.15471891 +vn 0.48994707 -0.85791254 0.15471891 +vn 0.48994707 -0.85791254 0.15471891 +vn -0.37824615 -0.55552888 -0.74048465 +vn -0.37824615 -0.55552888 -0.74048465 +vn 0.84923112 -0.50484508 0.15471891 +vn 0.84923112 -0.50484508 0.15471891 +vn 0.84923112 -0.50484508 0.15471891 +vn 0.65799029 -0.13686218 -0.74048465 +vn 0.65799029 -0.13686218 -0.74048465 +vn 0.23616998 0.92343688 -0.30246996 +vn 0.23616998 0.92343688 -0.30246996 +vn 0.23616998 0.92343688 -0.30246996 +vn -0.55552888 0.37824615 -0.74048465 +vn -0.55552888 0.37824615 -0.74048465 +vn 0.50020744 0.81135962 -0.30246996 +vn 0.50020744 0.81135962 -0.30246996 +vn 0.50020744 0.81135962 -0.30246996 +vn 0.36849322 -0.56204557 -0.74048465 +vn 0.36849322 -0.56204557 -0.74048465 +vn 0.81996587 0.48597108 -0.30246996 +vn 0.81996587 0.48597108 -0.30246996 +vn 0.81996587 0.48597108 -0.30246996 +vn -0.12535782 0.66027865 -0.74048465 +vn -0.12535782 0.66027865 -0.74048465 +vn 0.92741797 0.22001782 -0.30246996 +vn 0.92741797 0.22001782 -0.30246996 +vn 0.92741797 0.22001782 -0.30246996 +vn -0.13686218 -0.65799029 -0.74048465 +vn -0.13686218 -0.65799029 -0.74048465 +vn 0.92343688 -0.23616998 -0.30246996 +vn 0.92343688 -0.23616998 -0.30246996 +vn 0.92343688 -0.23616998 -0.30246996 +vn 0.37824615 0.55552888 -0.74048465 +vn 0.37824615 0.55552888 -0.74048465 +vn 0.81135962 -0.50020744 -0.30246996 +vn 0.81135962 -0.50020744 -0.30246996 +vn 0.81135962 -0.50020744 -0.30246996 +vn -0.56204557 -0.36849322 -0.74048465 +vn -0.56204557 -0.36849322 -0.74048465 +vn 0.48597108 -0.81996587 -0.30246996 +vn 0.48597108 -0.81996587 -0.30246996 +vn 0.48597108 -0.81996587 -0.30246996 +vn 0.66027865 0.12535782 -0.74048465 +vn 0.66027865 0.12535782 -0.74048465 +vn 0.22001782 -0.92741797 -0.30246996 +vn 0.22001782 -0.92741797 -0.30246996 +vn 0.22001782 -0.92741797 -0.30246996 +vn -0.65799029 0.13686218 -0.74048465 +vn -0.65799029 0.13686218 -0.74048465 +vn -0.34843629 -0.82086446 -0.45251926 +vn -8.7265355e-3 -0.99996192 0.0000000e+0 +vn -0.34843629 -0.82086446 -0.45251926 +vn 0.55552888 -0.37824615 -0.74048465 +vn 0.55552888 -0.37824615 -0.74048465 +vn -0.50020744 -0.81135962 -0.30246996 +vn -0.50020744 -0.81135962 -0.30246996 +vn -0.50020744 -0.81135962 -0.30246996 +vn -0.36849322 0.56204557 -0.74048465 +vn -0.36849322 0.56204557 -0.74048465 +vn -0.81996587 -0.48597108 -0.30246996 +vn -0.81996587 -0.48597108 -0.30246996 +vn -0.81996587 -0.48597108 -0.30246996 +vn 0.12535782 -0.66027865 -0.74048465 +vn 0.12535782 -0.66027865 -0.74048465 +vn -0.92741797 -0.22001782 -0.30246996 +vn -0.92741797 -0.22001782 -0.30246996 +vn -0.92741797 -0.22001782 -0.30246996 +vn 0.13686218 0.65799029 -0.74048465 +vn 0.13686218 0.65799029 -0.74048465 +vn -0.92343688 0.23616998 -0.30246996 +vn -0.92343688 0.23616998 -0.30246996 +vn -0.92343688 0.23616998 -0.30246996 +vn -0.37824615 -0.55552888 -0.74048465 +vn -0.37824615 -0.55552888 -0.74048465 +vn -0.81135962 0.50020744 -0.30246996 +vn -0.81135962 0.50020744 -0.30246996 +vn -0.81135962 0.50020744 -0.30246996 +vn 0.56204557 0.36849322 -0.74048465 +vn 0.56204557 0.36849322 -0.74048465 +vn -0.48597108 0.81996587 -0.30246996 +vn -0.48597108 0.81996587 -0.30246996 +vn -0.48597108 0.81996587 -0.30246996 +vn -0.66027865 -0.12535782 -0.74048465 +vn -0.66027865 -0.12535782 -0.74048465 +vn -0.22001782 0.92741797 -0.30246996 +vn -0.22001782 0.92741797 -0.30246996 +vn -0.22001782 0.92741797 -0.30246996 +vn -0.97785241 -0.18565108 -9.6635040e-2 +vn -0.22118745 0.54745815 -0.80707230 +vn 0.33537111 -0.83007262 0.44553975 +vn 0.83237224 0.54572715 -9.6635040e-2 +vn -0.22118745 0.54745815 -0.80707230 +vn 0.33537111 -0.83007262 0.44553975 +vn -0.56017093 -0.82272121 -9.6635040e-2 +vn -0.54351451 0.23070822 -0.80707230 +vn 0.82409316 -0.34980679 0.44553975 +vn 0.20268868 0.97446342 -9.6635040e-2 +vn -0.54351451 0.23070822 -0.80707230 +vn 0.82409316 -0.34980679 0.44553975 +vn 0.18565108 -0.97785241 -9.6635040e-2 +vn -0.54745815 -0.22118745 -0.80707230 +vn 0.83007262 0.33537111 0.44553975 +vn -0.54572715 0.83237224 -9.6635040e-2 +vn -0.54745815 -0.22118745 -0.80707230 +vn 0.83007262 0.33537111 0.44553975 +vn 0.82272121 -0.56017093 -9.6635040e-2 +vn -0.23070822 -0.54351451 -0.80707230 +vn 0.34980679 0.82409316 0.44553975 +vn -0.97446342 0.20268868 -9.6635040e-2 +vn -0.23070822 -0.54351451 -0.80707230 +vn 0.34980679 0.82409316 0.44553975 +vn 0.97785241 0.18565108 -9.6635040e-2 +vn 0.22118745 -0.54745815 -0.80707230 +vn -0.33537111 0.83007262 0.44553975 +vn -0.83237224 -0.54572715 -9.6635040e-2 +vn 0.22118745 -0.54745815 -0.80707230 +vn -0.33537111 0.83007262 0.44553975 +vn -0.21088747 0.93691036 0.27879286 +vn 0.54351451 -0.23070822 -0.80707230 +vn -0.21088747 0.93691036 0.27879286 +vn -0.20268868 -0.97446342 -9.6635040e-2 +vn 0.54351451 -0.23070822 -0.80707230 +vn -0.82409316 0.34980679 0.44553975 +vn -0.81161563 0.51337570 0.27879286 +vn 0.54745815 0.22118745 -0.80707230 +vn -0.81161563 0.51337570 0.27879286 +vn 0.54572715 -0.83237224 -9.6635040e-2 +vn 0.54745815 0.22118745 -0.80707230 +vn -0.83007262 -0.33537111 0.44553975 +vn -0.82272121 0.56017093 -9.6635040e-2 +vn 0.23070822 0.54351451 -0.80707230 +vn -0.34980679 -0.82409316 0.44553975 +vn 0.49913287 -0.82045166 0.27879286 +vn 0.23070822 0.54351451 -0.80707230 +vn 0.49913287 -0.82045166 0.27879286 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn 0.56280493 0.82658975 0.0000000e+0 +vn 0.56280493 0.82658975 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn 0.83628616 0.54829323 0.0000000e+0 +vn 0.83628616 0.54829323 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn 0.98245040 0.18652404 0.0000000e+0 +vn 0.98245040 0.18652404 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn 0.97904547 -0.20364175 0.0000000e+0 +vn 0.97904547 -0.20364175 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn 0.82658975 -0.56280493 0.0000000e+0 +vn 0.82658975 -0.56280493 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn 0.54829323 -0.83628616 0.0000000e+0 +vn 0.54829323 -0.83628616 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn 0.18652404 -0.98245040 0.0000000e+0 +vn 0.18652404 -0.98245040 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn -8.7265355e-3 -0.99996192 0.0000000e+0 +vn -0.39073113 -0.92050485 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn -0.56280493 -0.82658975 0.0000000e+0 +vn -0.56280493 -0.82658975 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn -0.83628616 -0.54829323 0.0000000e+0 +vn -0.83628616 -0.54829323 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn -0.98245040 -0.18652404 0.0000000e+0 +vn -0.98245040 -0.18652404 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn -0.97904547 0.20364175 0.0000000e+0 +vn -0.97904547 0.20364175 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn -0.82658975 0.56280493 0.0000000e+0 +vn -0.82658975 0.56280493 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn -0.54829323 0.83628616 0.0000000e+0 +vn -0.54829323 0.83628616 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn -0.18652404 0.98245040 0.0000000e+0 +vn -0.18652404 0.98245040 0.0000000e+0 +vn -3.1423142e-17 0.0000000e+0 -1.00000000 +vn 0.20364175 0.97904547 0.0000000e+0 +vn 0.20364175 0.97904547 0.0000000e+0 +vn 0.78754425 -0.61625811 -1.3734139e-16 +vn 0.78754425 -0.61625811 -1.3734139e-16 +vn 0.78754425 -0.61625811 -1.3734139e-16 +vn 0.36224568 -0.15376417 0.91931205 +vn -6.5148542e-2 -0.99787558 -9.8721412e-17 +vn 0.60241971 -0.79817949 -1.4554687e-16 +vn 0.60241971 -0.79817949 -1.4554687e-16 +vn 0.60241971 -0.79817949 -1.4554687e-16 +vn 0.99886059 4.7723289e-2 -2.2319624e-16 +vn 0.14741869 -0.36487406 0.91931205 +vn -0.99263817 -0.12111759 1.6273661e-17 +vn -0.99263817 -0.12111759 1.6273661e-17 +vn -0.99263817 -0.12111759 1.6273661e-17 +vn -0.36487406 -0.14741869 0.91931205 +vn -0.65953761 0.75167156 1.3735153e-16 +vn -0.99037319 0.13842306 2.9402428e-17 +vn -0.99037319 0.13842306 2.9402428e-17 +vn -0.99037319 0.13842306 2.9402428e-17 +vn -0.67255564 -0.74004656 -1.0301365e-16 +vn -0.36224568 0.15376417 0.91931205 +vn -0.12111759 0.99263817 6.0867666e-17 +vn -0.12111759 0.99263817 6.0867666e-17 +vn -0.12111759 0.99263817 6.0867666e-17 +vn -0.14741869 0.36487406 0.91931205 +vn 0.75167156 0.65953761 -3.4337882e-17 +vn 0.13842306 0.99037319 5.1021092e-17 +vn 0.13842306 0.99037319 5.1021092e-17 +vn 0.13842306 0.99037319 5.1021092e-17 +vn -0.74004656 0.67255564 0.0000000e+0 +vn 0.15376417 0.36224568 0.91931205 +vn -0.78754425 0.61625811 6.6796762e-17 +vn -0.78754425 0.61625811 6.6796762e-17 +vn -0.78754425 0.61625811 6.6796762e-17 +vn -0.36224568 0.15376417 0.91931205 +vn 6.5148542e-2 0.99787558 1.1159812e-16 +vn -0.60241971 0.79817949 8.4848816e-17 +vn -0.60241971 0.79817949 8.4848816e-17 +vn -0.60241971 0.79817949 8.4848816e-17 +vn -0.99886059 -4.7723289e-2 0.0000000e+0 +vn -0.14741869 0.36487406 0.91931205 +vn 0.61625811 0.78754425 7.0666666e-17 +vn 0.61625811 0.78754425 7.0666666e-17 +vn 0.61625811 0.78754425 7.0666666e-17 +vn 0.15376417 0.36224568 0.91931205 +vn 0.99787558 -6.5148542e-2 -3.0045647e-17 +vn 0.79817949 0.60241971 3.9485846e-17 +vn 0.79817949 0.60241971 3.9485846e-17 +vn 0.79817949 0.60241971 3.9485846e-17 +vn -4.7723289e-2 0.99886059 0.0000000e+0 +vn 0.36487406 0.14741869 0.91931205 +vn -0.61625811 -0.78754425 -2.5082108e-17 +vn -0.61625811 -0.78754425 -2.5082108e-17 +vn -0.61625811 -0.78754425 -2.5082108e-17 +vn -0.15376417 -0.36224568 0.91931205 +vn -0.99787558 6.5148542e-2 0.0000000e+0 +vn -0.79817949 -0.60241971 -7.0300542e-18 +vn -0.79817949 -0.60241971 -7.0300542e-18 +vn -0.79817949 -0.60241971 -7.0300542e-18 +vn 4.7723289e-2 -0.99886059 0.0000000e+0 +vn -0.36487406 -0.14741869 0.91931205 +vn 0.99263817 0.12111759 -2.2499328e-17 +vn 0.99263817 0.12111759 -2.2499328e-17 +vn 0.99263817 0.12111759 -2.2499328e-17 +vn 0.36487406 0.14741869 0.91931205 +vn 0.65953761 -0.75167156 -1.3735153e-16 +vn 0.99037319 -0.13842306 -3.8910286e-17 +vn 0.99037319 -0.13842306 -3.8910286e-17 +vn 0.99037319 -0.13842306 -3.8910286e-17 +vn 0.67255564 0.74004656 3.4337882e-17 +vn 0.36224568 -0.15376417 0.91931205 +vn 0.12111759 -0.99263817 -1.7487974e-16 +vn 0.12111759 -0.99263817 -1.7487974e-16 +vn 0.12111759 -0.99263817 -1.7487974e-16 +vn 0.14741869 -0.36487406 0.91931205 +vn -0.75167156 -0.65953761 -1.0301365e-16 +vn -8.7265355e-3 -0.99996192 -2.0945122e-16 +vn -0.39073113 -0.92050485 -4.8392902e-17 +vn -8.7265355e-3 -0.99996192 -2.0945122e-16 +vn 0.74004656 -0.67255564 -1.3735153e-16 +vn -0.15376417 -0.36224568 0.91931205 +vn 0.12111759 -0.99263817 2.7097344e-19 +vn 0.12111759 -0.99263817 2.7097344e-19 +vn 0.12111759 -0.99263817 2.7097344e-19 +vn 0.14741869 -0.36487406 0.91931205 +vn -0.75167156 -0.65953761 0.0000000e+0 +vn 0.99263817 0.12111759 0.0000000e+0 +vn 0.99263817 0.12111759 0.0000000e+0 +vn 0.99263817 0.12111759 0.0000000e+0 +vn 0.36487406 0.14741869 0.91931205 +vn 0.65953761 -0.75167156 0.0000000e+0 +vn -0.61625811 -0.78754425 6.5643832e-18 +vn -0.61625811 -0.78754425 6.5643832e-18 +vn -0.61625811 -0.78754425 6.5643832e-18 +vn -0.15376417 -0.36224568 0.91931205 +vn -0.99787558 6.5148542e-2 0.0000000e+0 +vn 0.61625811 0.78754425 0.0000000e+0 +vn 0.61625811 0.78754425 0.0000000e+0 +vn 0.61625811 0.78754425 0.0000000e+0 +vn 0.15376417 0.36224568 0.91931205 +vn 0.99787558 -6.5148542e-2 0.0000000e+0 +vn -0.78754425 0.61625811 3.7035449e-17 +vn -0.78754425 0.61625811 3.7035449e-17 +vn -0.78754425 0.61625811 3.7035449e-17 +vn -0.36224568 0.15376417 0.91931205 +vn 6.5148542e-2 0.99787558 0.0000000e+0 +vn -0.12111759 0.99263817 0.0000000e+0 +vn -0.12111759 0.99263817 0.0000000e+0 +vn -0.12111759 0.99263817 0.0000000e+0 +vn -0.14741869 0.36487406 0.91931205 +vn 0.75167156 0.65953761 0.0000000e+0 +vn -0.99263817 -0.12111759 0.0000000e+0 +vn -0.99263817 -0.12111759 0.0000000e+0 +vn -0.99263817 -0.12111759 0.0000000e+0 +vn -0.36487406 -0.14741869 0.91931205 +vn -0.65953761 0.75167156 0.0000000e+0 +vn 0.78754425 -0.61625811 -1.7342300e-17 +vn 0.78754425 -0.61625811 -1.7342300e-17 +vn 0.78754425 -0.61625811 -1.7342300e-17 +vn 0.36224568 -0.15376417 0.91931205 +vn -6.5148542e-2 -0.99787558 -1.1159812e-16 +vn 0.60241971 -0.79817949 -1.7342300e-17 +vn 0.60241971 -0.79817949 -1.7342300e-17 +vn 0.60241971 -0.79817949 -1.7342300e-17 +vn 0.99886059 4.7723289e-2 0.0000000e+0 +vn 0.14741869 -0.36487406 0.91931205 +vn -0.99037319 0.13842306 1.9693149e-17 +vn -0.99037319 0.13842306 1.9693149e-17 +vn -0.99037319 0.13842306 1.9693149e-17 +vn -0.67255564 -0.74004656 -3.4337882e-17 +vn -0.36224568 0.15376417 0.91931205 +vn 0.13842306 0.99037319 0.0000000e+0 +vn 0.13842306 0.99037319 0.0000000e+0 +vn 0.13842306 0.99037319 0.0000000e+0 +vn -0.74004656 0.67255564 0.0000000e+0 +vn 0.15376417 0.36224568 0.91931205 +vn -0.60241971 0.79817949 1.7342300e-17 +vn -0.60241971 0.79817949 1.7342300e-17 +vn -0.60241971 0.79817949 1.7342300e-17 +vn -0.99886059 -4.7723289e-2 0.0000000e+0 +vn -0.14741869 0.36487406 0.91931205 +vn 0.79817949 0.60241971 0.0000000e+0 +vn 0.79817949 0.60241971 0.0000000e+0 +vn 0.79817949 0.60241971 0.0000000e+0 +vn -4.7723289e-2 0.99886059 0.0000000e+0 +vn 0.36487406 0.14741869 0.91931205 +vn -0.79817949 -0.60241971 0.0000000e+0 +vn -0.79817949 -0.60241971 0.0000000e+0 +vn -0.79817949 -0.60241971 0.0000000e+0 +vn 4.7723289e-2 -0.99886059 0.0000000e+0 +vn -0.36487406 -0.14741869 0.91931205 +vn 0.99037319 -0.13842306 0.0000000e+0 +vn 0.99037319 -0.13842306 0.0000000e+0 +vn 0.99037319 -0.13842306 0.0000000e+0 +vn 0.67255564 0.74004656 0.0000000e+0 +vn 0.36224568 -0.15376417 0.91931205 +vn -8.7265355e-3 -0.99996192 3.9952546e-19 +vn -0.39073113 -0.92050485 1.9357161e-17 +vn -8.7265355e-3 -0.99996192 3.9952546e-19 +vn 0.74004656 -0.67255564 -3.4337882e-17 +vn -0.15376417 -0.36224568 0.91931205 +vn 0.78754425 -0.61625811 -8.2497966e-17 +vn 0.78754425 -0.61625811 -8.2497966e-17 +vn 0.78754425 -0.61625811 -8.2497966e-17 +vn 0.36224568 -0.15376417 -0.91931205 +vn -6.5148542e-2 -0.99787558 -1.1159812e-16 +vn -0.99263817 -0.12111759 -6.2934097e-18 +vn -0.99263817 -0.12111759 -6.2934097e-18 +vn -0.99263817 -0.12111759 -6.2934097e-18 +vn -0.36487406 -0.14741869 -0.91931205 +vn -0.65953761 0.75167156 0.0000000e+0 +vn -0.12111759 0.99263817 1.3540605e-16 +vn -0.12111759 0.99263817 1.3540605e-16 +vn -0.12111759 0.99263817 1.3540605e-16 +vn -0.14741869 0.36487406 -0.91931205 +vn 0.75167156 0.65953761 0.0000000e+0 +vn -0.78754425 0.61625811 1.9360431e-16 +vn -0.78754425 0.61625811 1.9360431e-16 +vn -0.78754425 0.61625811 1.9360431e-16 +vn -0.36224568 0.15376417 -0.91931205 +vn 6.5148542e-2 0.99787558 0.0000000e+0 +vn 0.61625811 0.78754425 6.9857365e-17 +vn 0.61625811 0.78754425 6.9857365e-17 +vn 0.61625811 0.78754425 6.9857365e-17 +vn 0.15376417 0.36224568 -0.91931205 +vn 0.99787558 -6.5148542e-2 0.0000000e+0 +vn -0.61625811 -0.78754425 -8.0635282e-17 +vn -0.61625811 -0.78754425 -8.0635282e-17 +vn -0.61625811 -0.78754425 -8.0635282e-17 +vn -0.15376417 -0.36224568 -0.91931205 +vn -0.99787558 6.5148542e-2 0.0000000e+0 +vn 0.99263817 0.12111759 1.9693149e-17 +vn 0.99263817 0.12111759 1.9693149e-17 +vn 0.99263817 0.12111759 1.9693149e-17 +vn 0.36487406 0.14741869 -0.91931205 +vn 0.65953761 -0.75167156 0.0000000e+0 +vn 0.12111759 -0.99263817 -6.5101885e-17 +vn 0.12111759 -0.99263817 -6.5101885e-17 +vn 0.12111759 -0.99263817 -6.5101885e-17 +vn 0.14741869 -0.36487406 -0.91931205 +vn -0.75167156 -0.65953761 0.0000000e+0 +vn 0.60241971 -0.79817949 -1.3501303e-16 +vn 0.60241971 -0.79817949 -1.3501303e-16 +vn 0.60241971 -0.79817949 -1.3501303e-16 +vn 0.14741869 -0.36487406 -0.91931205 +vn 0.99886059 4.7723289e-2 0.0000000e+0 +vn -0.99037319 0.13842306 7.2479188e-17 +vn -0.99037319 0.13842306 7.2479188e-17 +vn -0.99037319 0.13842306 7.2479188e-17 +vn -0.36224568 0.15376417 -0.91931205 +vn -0.67255564 -0.74004656 -3.4337882e-17 +vn 0.13842306 0.99037319 1.0914851e-16 +vn 0.13842306 0.99037319 1.0914851e-16 +vn 0.13842306 0.99037319 1.0914851e-16 +vn 0.15376417 0.36224568 -0.91931205 +vn -0.74004656 0.67255564 0.0000000e+0 +vn -0.60241971 0.79817949 2.0016870e-16 +vn -0.60241971 0.79817949 2.0016870e-16 +vn -0.60241971 0.79817949 2.0016870e-16 +vn -0.14741869 0.36487406 -0.91931205 +vn -0.99886059 -4.7723289e-2 0.0000000e+0 +vn 0.79817949 0.60241971 3.7035449e-17 +vn 0.79817949 0.60241971 3.7035449e-17 +vn 0.79817949 0.60241971 3.7035449e-17 +vn 0.36487406 0.14741869 -0.91931205 +vn -4.7723289e-2 0.99886059 0.0000000e+0 +vn -0.79817949 -0.60241971 -4.1248983e-17 +vn -0.79817949 -0.60241971 -4.1248983e-17 +vn -0.79817949 -0.60241971 -4.1248983e-17 +vn -0.36487406 -0.14741869 -0.91931205 +vn 4.7723289e-2 -0.99886059 0.0000000e+0 +vn 0.99037319 -0.13842306 -1.3128766e-17 +vn 0.99037319 -0.13842306 -1.3128766e-17 +vn 0.99037319 -0.13842306 -1.3128766e-17 +vn 0.36224568 -0.15376417 -0.91931205 +vn 0.67255564 0.74004656 0.0000000e+0 +vn -8.7265355e-3 -0.99996192 7.9905091e-19 +vn -8.7265355e-3 -0.99996192 7.9905091e-19 +vn -0.39073113 -0.92050485 -1.3550012e-16 +vn -0.15376417 -0.36224568 -0.91931205 +vn 0.74004656 -0.67255564 -3.4337882e-17 +vn -0.39073113 -0.92050485 1.9357161e-17 +vn -8.7265355e-3 -0.99996192 -1.6780069e-16 +vn -8.7265355e-3 -0.99996192 -1.6780069e-16 +vn -0.15376417 -0.36224568 -0.91931205 +vn 0.74004656 -0.67255564 -1.3735153e-16 +vn 0.99037319 -0.13842306 0.0000000e+0 +vn 0.99037319 -0.13842306 0.0000000e+0 +vn 0.99037319 -0.13842306 0.0000000e+0 +vn 0.36224568 -0.15376417 -0.91931205 +vn 0.67255564 0.74004656 3.4337882e-17 +vn -0.79817949 -0.60241971 0.0000000e+0 +vn -0.79817949 -0.60241971 0.0000000e+0 +vn -0.79817949 -0.60241971 0.0000000e+0 +vn -0.36487406 -0.14741869 -0.91931205 +vn 4.7723289e-2 -0.99886059 0.0000000e+0 +vn 0.79817949 0.60241971 3.4684600e-17 +vn 0.79817949 0.60241971 3.4684600e-17 +vn 0.79817949 0.60241971 3.4684600e-17 +vn 0.36487406 0.14741869 -0.91931205 +vn -4.7723289e-2 0.99886059 0.0000000e+0 +vn -0.60241971 0.79817949 3.4684600e-17 +vn -0.60241971 0.79817949 3.4684600e-17 +vn -0.60241971 0.79817949 3.4684600e-17 +vn -0.14741869 0.36487406 -0.91931205 +vn -0.99886059 -4.7723289e-2 0.0000000e+0 +vn 0.13842306 0.99037319 -2.7097344e-19 +vn 0.13842306 0.99037319 -2.7097344e-19 +vn 0.13842306 0.99037319 -2.7097344e-19 +vn 0.15376417 0.36224568 -0.91931205 +vn -0.74004656 0.67255564 0.0000000e+0 +vn -0.99037319 0.13842306 1.9964123e-17 +vn -0.99037319 0.13842306 1.9964123e-17 +vn -0.99037319 0.13842306 1.9964123e-17 +vn -0.36224568 0.15376417 -0.91931205 +vn -0.67255564 -0.74004656 -1.0301365e-16 +vn 0.60241971 -0.79817949 -6.9369200e-17 +vn 0.60241971 -0.79817949 -6.9369200e-17 +vn 0.60241971 -0.79817949 -6.9369200e-17 +vn 0.14741869 -0.36487406 -0.91931205 +vn 0.99886059 4.7723289e-2 -2.2319624e-16 +vn 0.12111759 -0.99263817 -1.1380884e-16 +vn 0.12111759 -0.99263817 -1.1380884e-16 +vn 0.12111759 -0.99263817 -1.1380884e-16 +vn 0.14741869 -0.36487406 -0.91931205 +vn -0.75167156 -0.65953761 -1.0301365e-16 +vn 0.99263817 0.12111759 0.0000000e+0 +vn 0.99263817 0.12111759 0.0000000e+0 +vn 0.99263817 0.12111759 0.0000000e+0 +vn 0.36487406 0.14741869 -0.91931205 +vn 0.65953761 -0.75167156 -1.3735153e-16 +vn -0.61625811 -0.78754425 6.5643832e-18 +vn -0.61625811 -0.78754425 6.5643832e-18 +vn -0.61625811 -0.78754425 6.5643832e-18 +vn -0.15376417 -0.36224568 -0.91931205 +vn -0.99787558 6.5148542e-2 0.0000000e+0 +vn 0.61625811 0.78754425 3.4684600e-17 +vn 0.61625811 0.78754425 3.4684600e-17 +vn 0.61625811 0.78754425 3.4684600e-17 +vn 0.15376417 0.36224568 -0.91931205 +vn 0.99787558 -6.5148542e-2 -3.0045647e-17 +vn -0.78754425 0.61625811 5.4377749e-17 +vn -0.78754425 0.61625811 5.4377749e-17 +vn -0.78754425 0.61625811 5.4377749e-17 +vn -0.36224568 0.15376417 -0.91931205 +vn 6.5148542e-2 0.99787558 1.1159812e-16 +vn -0.12111759 0.99263817 -2.7097344e-19 +vn -0.12111759 0.99263817 -2.7097344e-19 +vn -0.12111759 0.99263817 -2.7097344e-19 +vn -0.14741869 0.36487406 -0.91931205 +vn 0.75167156 0.65953761 -3.4337882e-17 +vn -0.99263817 -0.12111759 2.7097344e-19 +vn -0.99263817 -0.12111759 2.7097344e-19 +vn -0.99263817 -0.12111759 2.7097344e-19 +vn -0.36487406 -0.14741869 -0.91931205 +vn -0.65953761 0.75167156 1.3735153e-16 +vn 0.78754425 -0.61625811 -6.9369200e-17 +vn 0.78754425 -0.61625811 -6.9369200e-17 +vn 0.78754425 -0.61625811 -6.9369200e-17 +vn 0.36224568 -0.15376417 -0.91931205 +vn -6.5148542e-2 -0.99787558 -9.8721412e-17 +vn 0.10585366 0.89957277 -0.42374973 +vn 0.10585366 0.89957277 -0.42374973 +vn 0.10585366 0.89957277 -0.42374973 +vn -0.70104051 0.57356636 -0.42374973 +vn -0.70104051 0.57356636 -0.42374973 +vn -0.70104051 0.57356636 -0.42374973 +vn -0.70104051 0.57356636 0.42374973 +vn -0.70104051 0.57356636 0.42374973 +vn -0.70104051 0.57356636 0.42374973 +vn 0.10585366 0.89957277 0.42374973 +vn 0.10585366 0.89957277 0.42374973 +vn 0.10585366 0.89957277 0.42374973 +vn -0.89957277 0.10585366 -0.42374973 +vn -0.89957277 0.10585366 -0.42374973 +vn -0.89957277 0.10585366 -0.42374973 +vn -0.57356636 -0.70104051 -0.42374973 +vn -0.57356636 -0.70104051 -0.42374973 +vn -0.57356636 -0.70104051 -0.42374973 +vn -0.57356636 -0.70104051 0.42374973 +vn -0.57356636 -0.70104051 0.42374973 +vn -0.57356636 -0.70104051 0.42374973 +vn -0.89957277 0.10585366 0.42374973 +vn -0.89957277 0.10585366 0.42374973 +vn -0.89957277 0.10585366 0.42374973 +vn 0.56124416 -0.71094385 -0.42374973 +vn 0.56124416 -0.71094385 -0.42374973 +vn 0.56124416 -0.71094385 -0.42374973 +vn 0.90128316 9.0137833e-2 -0.42374973 +vn 0.90128316 9.0137833e-2 -0.42374973 +vn 0.90128316 9.0137833e-2 -0.42374973 +vn 0.90128316 9.0137833e-2 0.42374973 +vn 0.90128316 9.0137833e-2 0.42374973 +vn 0.90128316 9.0137833e-2 0.42374973 +vn 0.56124416 -0.71094385 0.42374973 +vn 0.56124416 -0.71094385 0.42374973 +vn 0.56124416 -0.71094385 0.42374973 +vn -0.71094385 -0.56124416 -0.42374973 +vn -0.71094385 -0.56124416 -0.42374973 +vn -0.71094385 -0.56124416 -0.42374973 +vn 9.0137833e-2 -0.90128316 -0.42374973 +vn 9.0137833e-2 -0.90128316 -0.42374973 +vn 9.0137833e-2 -0.90128316 -0.42374973 +vn 9.0137833e-2 -0.90128316 0.42374973 +vn 9.0137833e-2 -0.90128316 0.42374973 +vn 9.0137833e-2 -0.90128316 0.42374973 +vn -0.71094385 -0.56124416 0.42374973 +vn -0.71094385 -0.56124416 0.42374973 +vn -0.71094385 -0.56124416 0.42374973 +vn -0.10585366 -0.89957277 -0.42374973 +vn -0.10585366 -0.89957277 -0.42374973 +vn -0.10585366 -0.89957277 -0.42374973 +vn 0.70104051 -0.57356636 -0.42374973 +vn 0.70104051 -0.57356636 -0.42374973 +vn 0.70104051 -0.57356636 -0.42374973 +vn 0.70104051 -0.57356636 0.42374973 +vn 0.70104051 -0.57356636 0.42374973 +vn 0.70104051 -0.57356636 0.42374973 +vn -0.10585366 -0.89957277 0.42374973 +vn -0.10585366 -0.89957277 0.42374973 +vn -0.10585366 -0.89957277 0.42374973 +vn -0.56124416 0.71094385 -0.42374973 +vn -0.56124416 0.71094385 -0.42374973 +vn -0.56124416 0.71094385 -0.42374973 +vn -0.90128316 -9.0137833e-2 -0.42374973 +vn -0.90128316 -9.0137833e-2 -0.42374973 +vn -0.90128316 -9.0137833e-2 -0.42374973 +vn -0.90128316 -9.0137833e-2 0.42374973 +vn -0.90128316 -9.0137833e-2 0.42374973 +vn -0.90128316 -9.0137833e-2 0.42374973 +vn -0.56124416 0.71094385 0.42374973 +vn -0.56124416 0.71094385 0.42374973 +vn -0.56124416 0.71094385 0.42374973 +vn 0.71094385 0.56124416 -0.42374973 +vn 0.71094385 0.56124416 -0.42374973 +vn 0.71094385 0.56124416 -0.42374973 +vn -9.0137833e-2 0.90128316 -0.42374973 +vn -9.0137833e-2 0.90128316 -0.42374973 +vn -9.0137833e-2 0.90128316 -0.42374973 +vn -9.0137833e-2 0.90128316 0.42374973 +vn -9.0137833e-2 0.90128316 0.42374973 +vn -9.0137833e-2 0.90128316 0.42374973 +vn 0.71094385 0.56124416 0.42374973 +vn 0.71094385 0.56124416 0.42374973 +vn 0.71094385 0.56124416 0.42374973 +vn 0.89957277 -0.10585366 -0.42374973 +vn 0.89957277 -0.10585366 -0.42374973 +vn 0.89957277 -0.10585366 -0.42374973 +vn 0.57356636 0.70104051 -0.42374973 +vn 0.57356636 0.70104051 -0.42374973 +vn 0.57356636 0.70104051 -0.42374973 +vn 0.57356636 0.70104051 0.42374973 +vn 0.57356636 0.70104051 0.42374973 +vn 0.57356636 0.70104051 0.42374973 +vn 0.89957277 -0.10585366 0.42374973 +vn 0.89957277 -0.10585366 0.42374973 +vn 0.89957277 -0.10585366 0.42374973 +vn 0.10585366 0.89957277 -0.42374973 +vn 0.10585366 0.89957277 -0.42374973 +vn 0.10585366 0.89957277 -0.42374973 +vn -0.70104051 0.57356636 -0.42374973 +vn -0.70104051 0.57356636 -0.42374973 +vn -0.70104051 0.57356636 -0.42374973 +vn -0.70104051 0.57356636 0.42374973 +vn -0.70104051 0.57356636 0.42374973 +vn -0.70104051 0.57356636 0.42374973 +vn 0.10585366 0.89957277 0.42374973 +vn 0.10585366 0.89957277 0.42374973 +vn 0.10585366 0.89957277 0.42374973 +vn -0.89957277 0.10585366 -0.42374973 +vn -0.89957277 0.10585366 -0.42374973 +vn -0.89957277 0.10585366 -0.42374973 +vn -0.57356636 -0.70104051 -0.42374973 +vn -0.57356636 -0.70104051 -0.42374973 +vn -0.57356636 -0.70104051 -0.42374973 +vn -0.57356636 -0.70104051 0.42374973 +vn -0.57356636 -0.70104051 0.42374973 +vn -0.57356636 -0.70104051 0.42374973 +vn -0.89957277 0.10585366 0.42374973 +vn -0.89957277 0.10585366 0.42374973 +vn -0.89957277 0.10585366 0.42374973 +vn 0.56124416 -0.71094385 -0.42374973 +vn 0.56124416 -0.71094385 -0.42374973 +vn 0.56124416 -0.71094385 -0.42374973 +vn 0.90128316 9.0137833e-2 -0.42374973 +vn 0.90128316 9.0137833e-2 -0.42374973 +vn 0.90128316 9.0137833e-2 -0.42374973 +vn 0.90128316 9.0137833e-2 0.42374973 +vn 0.90128316 9.0137833e-2 0.42374973 +vn 0.90128316 9.0137833e-2 0.42374973 +vn 0.56124416 -0.71094385 0.42374973 +vn 0.56124416 -0.71094385 0.42374973 +vn 0.56124416 -0.71094385 0.42374973 +vn -0.71094385 -0.56124416 -0.42374973 +vn -0.71094385 -0.56124416 -0.42374973 +vn -0.71094385 -0.56124416 -0.42374973 +vn 9.0137833e-2 -0.90128316 -0.42374973 +vn 9.0137833e-2 -0.90128316 -0.42374973 +vn 9.0137833e-2 -0.90128316 -0.42374973 +vn 9.0137833e-2 -0.90128316 0.42374973 +vn 9.0137833e-2 -0.90128316 0.42374973 +vn 9.0137833e-2 -0.90128316 0.42374973 +vn -0.71094385 -0.56124416 0.42374973 +vn -0.71094385 -0.56124416 0.42374973 +vn -0.71094385 -0.56124416 0.42374973 +vn -0.10585366 -0.89957277 -0.42374973 +vn -0.10585366 -0.89957277 -0.42374973 +vn -0.10585366 -0.89957277 -0.42374973 +vn 0.70104051 -0.57356636 -0.42374973 +vn 0.70104051 -0.57356636 -0.42374973 +vn 0.70104051 -0.57356636 -0.42374973 +vn 0.70104051 -0.57356636 0.42374973 +vn 0.70104051 -0.57356636 0.42374973 +vn 0.70104051 -0.57356636 0.42374973 +vn -0.10585366 -0.89957277 0.42374973 +vn -0.10585366 -0.89957277 0.42374973 +vn -0.10585366 -0.89957277 0.42374973 +vn -0.56124416 0.71094385 -0.42374973 +vn -0.56124416 0.71094385 -0.42374973 +vn -0.56124416 0.71094385 -0.42374973 +vn -0.90128316 -9.0137833e-2 -0.42374973 +vn -0.90128316 -9.0137833e-2 -0.42374973 +vn -0.90128316 -9.0137833e-2 -0.42374973 +vn -0.90128316 -9.0137833e-2 0.42374973 +vn -0.90128316 -9.0137833e-2 0.42374973 +vn -0.90128316 -9.0137833e-2 0.42374973 +vn -0.56124416 0.71094385 0.42374973 +vn -0.56124416 0.71094385 0.42374973 +vn -0.56124416 0.71094385 0.42374973 +vn 0.71094385 0.56124416 -0.42374973 +vn 0.71094385 0.56124416 -0.42374973 +vn 0.71094385 0.56124416 -0.42374973 +vn -9.0137833e-2 0.90128316 -0.42374973 +vn -9.0137833e-2 0.90128316 -0.42374973 +vn -9.0137833e-2 0.90128316 -0.42374973 +vn -9.0137833e-2 0.90128316 0.42374973 +vn -9.0137833e-2 0.90128316 0.42374973 +vn -9.0137833e-2 0.90128316 0.42374973 +vn 0.71094385 0.56124416 0.42374973 +vn 0.71094385 0.56124416 0.42374973 +vn 0.71094385 0.56124416 0.42374973 +vn 0.89957277 -0.10585366 -0.42374973 +vn 0.89957277 -0.10585366 -0.42374973 +vn 0.89957277 -0.10585366 -0.42374973 +vn 0.57356636 0.70104051 -0.42374973 +vn 0.57356636 0.70104051 -0.42374973 +vn 0.57356636 0.70104051 -0.42374973 +vn 0.57356636 0.70104051 0.42374973 +vn 0.57356636 0.70104051 0.42374973 +vn 0.57356636 0.70104051 0.42374973 +vn 0.89957277 -0.10585366 0.42374973 +vn 0.89957277 -0.10585366 0.42374973 +vn 0.89957277 -0.10585366 0.42374973 +g w_rocket2_w_rocket2 +usemtl w_rocket2 +s 1 +f 1/245/10 24/279/4 23/241/3 2/243/14 +f 5/378/28 26/342/6 25/341/5 6/377/32 +f 7/174/35 53/182/213 52/198/208 8/207/40 +f 7/174/36 60/166/242 53/182/214 +f 9/239/47 23/241/3 22/231/2 10/229/51 +f 11/177/53 43/186/163 42/200/158 12/209/58 +f 11/177/54 70/169/272 43/186/164 +f 13/309/64 27/280/7 26/342/6 14/376/68 +f 14/376/69 26/342/6 5/378/29 +f 15/176/71 51/185/203 50/201/198 16/210/76 +f 15/176/72 62/168/248 51/185/204 +f 17/230/82 21/232/1 28/242/8 18/240/86 +f 21/232/1 34/220/122 33/219/119 22/231/2 +f 22/231/2 23/241/3 24/279/4 25/341/5 26/342/6 27/280/7 28/242/8 21/232/1 +f 22/231/2 33/219/120 10/229/52 +f 23/241/3 9/239/48 2/243/16 +f 24/279/4 38/308/140 37/375/137 25/341/5 +f 25/341/5 37/375/138 6/377/34 +f 27/280/7 30/266/104 29/244/101 28/242/8 +f 28/242/8 29/244/102 18/240/88 +f 30/266/105 27/280/7 13/309/65 +f 31/175/107 49/183/193 48/197/188 32/206/112 +f 31/175/108 64/167/254 49/183/194 +f 34/220/123 21/232/1 17/230/83 +f 38/308/141 24/279/4 1/245/11 +f 39/178/143 55/187/223 54/199/218 40/208/148 +f 39/178/144 58/170/236 55/187/224 +f 42/200/159 71/224/275 12/209/59 +f 48/197/189 65/226/257 32/206/113 +f 50/201/199 63/225/251 16/210/77 +f 52/198/209 61/227/245 8/207/41 +f 54/199/219 59/223/239 40/208/149 +f 74/125/284 75/130/287 76/129/290 77/124/293 78/119/296 79/109/299 80/95/302 81/90/305 82/78/308 83/69/311 84/70/314 85/79/317 86/91/320 87/96/323 88/111/326 73/120/281 +f 89/268/332 164/296/683 163/282/681 102/248/398 +f 90/259/337 171/290/704 170/328/702 144/362/608 +f 91/354/342 160/320/671 159/340/669 100/373/388 +f 92/367/347 175/332/716 174/297/714 143/272/603 +f 93/358/352 156/324/659 155/322/657 96/356/368 +f 94/255/357 179/284/728 178/311/726 142/345/598 +f 95/347/362 176/313/719 175/332/717 92/367/348 +f 96/356/367 155/322/656 154/294/654 141/264/593 +f 97/276/372 180/305/731 179/284/729 94/255/358 +f 98/254/377 183/285/740 182/314/738 140/344/588 +f 99/346/382 168/312/695 167/333/693 104/365/408 +f 100/373/387 159/340/668 158/307/666 139/278/583 +f 101/275/392 184/304/743 183/285/741 98/254/378 +f 102/248/397 163/282/680 162/316/678 138/350/578 +f 103/258/402 172/289/707 171/290/705 90/259/338 +f 104/365/407 167/333/692 166/303/690 137/274/573 +f 105/262/412 204/294/803 203/293/801 113/263/453 +f 106/273/417 216/300/839 215/286/837 117/252/473 +f 107/349/422 200/316/791 199/338/789 120/372/488 +f 108/267/427 212/301/827 211/284/825 115/246/463 +f 109/343/432 208/310/815 207/329/813 114/363/458 +f 110/357/437 188/323/755 187/321/753 116/355/468 +f 111/351/442 192/318/767 191/334/765 118/368/478 +f 112/271/447 196/302/779 195/284/777 119/251/483 +f 113/263/452 203/293/800 202/326/798 129/360/533 +f 114/363/457 207/329/812 206/306/810 130/277/538 +f 115/246/462 211/284/824 210/317/822 131/353/543 +f 116/355/467 187/321/752 186/291/750 132/260/548 +f 117/252/472 215/286/836 214/319/834 133/352/553 +f 118/368/477 191/334/764 190/299/762 134/270/558 +f 119/251/482 195/284/776 194/315/774 135/348/563 +f 120/372/487 199/338/788 198/298/786 136/269/568 +f 121/370/493 193/336/771 196/302/780 112/271/448 +f 122/250/498 189/283/759 192/318/768 111/351/443 +f 123/261/503 185/292/747 188/323/756 110/357/438 +f 124/256/508 205/287/807 208/310/816 109/343/433 +f 125/374/513 209/339/819 212/301/828 108/267/428 +f 126/249/518 197/282/783 200/316/792 107/349/423 +f 127/369/523 213/335/831 216/300/840 106/273/418 +f 128/359/528 201/325/795 204/294/804 105/262/413 +f 129/360/532 202/326/797 201/325/794 128/359/527 +f 130/277/537 206/306/809 205/287/806 124/256/507 +f 131/353/542 210/317/821 209/339/818 125/374/512 +f 132/260/547 186/291/749 185/292/746 123/261/502 +f 133/352/552 214/319/833 213/335/830 127/369/522 +f 134/270/557 190/299/761 189/283/758 122/250/497 +f 135/348/562 194/315/773 193/336/770 121/370/492 +f 136/269/567 198/298/785 197/282/782 126/249/517 +f 137/274/572 166/303/689 165/282/686 147/253/622 +f 138/350/577 162/316/677 161/337/674 152/371/647 +f 139/278/582 158/307/665 157/288/662 151/257/642 +f 140/344/587 182/314/737 181/330/734 146/364/617 +f 141/264/592 154/294/653 153/295/650 150/265/637 +f 142/345/597 178/311/725 177/331/722 148/366/627 +f 143/272/602 174/297/713 173/281/710 149/247/632 +f 144/362/607 170/328/701 169/327/698 145/361/612 +f 145/361/613 169/327/699 172/289/708 103/258/403 +f 146/364/618 181/330/735 184/304/744 101/275/393 +f 147/253/623 165/282/687 168/312/696 99/346/383 +f 148/366/628 177/331/723 180/305/732 97/276/373 +f 149/247/633 173/281/711 176/313/720 95/347/363 +f 150/265/638 153/295/651 156/324/660 93/358/353 +f 151/257/643 157/288/663 160/320/672 91/354/343 +f 152/371/648 161/337/675 164/296/684 89/268/333 +f 154/294/652 155/322/655 156/324/658 153/295/649 +f 158/307/664 159/340/667 160/320/670 157/288/661 +f 162/316/676 163/282/679 164/296/682 161/337/673 +f 166/303/688 167/333/691 168/312/694 165/282/685 +f 170/328/700 171/290/703 172/289/706 169/327/697 +f 174/297/712 175/332/715 176/313/718 173/281/709 +f 178/311/724 179/284/727 180/305/730 177/331/721 +f 182/314/736 183/285/739 184/304/742 181/330/733 +f 186/291/748 187/321/751 188/323/754 185/292/745 +f 190/299/760 191/334/763 192/318/766 189/283/757 +f 194/315/772 195/284/775 196/302/778 193/336/769 +f 198/298/784 199/338/787 200/316/790 197/282/781 +f 202/326/796 203/293/799 204/294/802 201/325/793 +f 206/306/808 207/329/811 208/310/814 205/287/805 +f 210/317/820 211/284/823 212/301/826 209/339/817 +f 214/319/832 215/286/835 216/300/838 213/335/829 +s 2 +f 41/67/156 88/66/327 87/81/325 56/82/232 +f 42/65/162 73/64/283 88/66/328 41/67/157 +f 43/54/166 74/53/285 73/64/282 42/65/161 +f 44/45/171 75/44/288 74/53/286 43/54/167 +f 45/34/176 76/33/291 75/44/289 44/45/172 +f 46/32/181 77/31/294 76/33/292 45/34/177 +f 47/21/186 78/20/297 77/31/295 46/32/182 +f 48/12/191 79/11/300 78/20/298 47/21/187 +f 49/2/196 80/1/303 79/11/301 48/12/192 +f 50/140/201 81/139/306 80/148/304 49/149/197 +f 51/127/206 82/126/309 81/139/307 50/140/202 +f 52/123/211 83/122/312 82/126/310 51/127/207 +f 53/108/216 84/107/315 83/122/313 52/123/212 +f 54/99/221 85/98/318 84/107/316 53/108/217 +f 55/93/226 86/92/321 85/98/319 54/99/222 +f 56/82/231 87/81/324 86/92/322 55/93/227 +f 57/80/234 56/82/230 55/93/225 58/94/237 +f 59/97/240 54/99/220 53/108/215 60/110/243 +f 61/121/246 52/123/210 51/127/205 62/128/249 +f 63/138/252 50/140/200 49/149/195 64/150/255 +f 65/10/258 48/12/190 47/21/185 66/22/261 +f 67/30/264 46/32/180 45/34/175 68/35/267 +f 69/43/270 44/45/170 43/54/165 70/55/273 +f 71/63/276 42/65/160 41/67/155 72/68/279 +s 3 +f 2/233/13 104/234/404 103/215/399 1/212/9 +f 3/238/20 4/217/25 128/218/525 136/237/565 +f 3/173/17 41/181/153 56/202/228 4/211/22 +f 3/173/18 72/165/278 41/181/154 +f 4/217/24 57/214/235 58/193/238 39/195/145 +f 6/151/31 102/152/394 101/142/389 5/141/27 +f 7/157/38 8/146/43 127/145/520 135/155/560 +f 8/146/42 61/147/247 62/137/250 15/136/73 +f 10/23/49 100/29/384 99/17/379 9/13/45 +f 11/27/56 12/18/61 126/16/515 134/26/555 +f 12/18/60 71/19/277 72/9/280 3/7/19 +f 14/131/67 98/132/374 97/113/369 13/112/63 +f 15/136/74 16/117/79 125/116/510 133/135/550 +f 16/117/78 63/118/253 64/106/256 31/105/109 +f 18/71/85 96/72/364 95/57/359 17/56/81 +f 19/76/92 20/60/97 124/58/505 132/75/545 +f 19/180/89 47/188/183 46/196/178 20/204/94 +f 19/180/90 66/172/260 47/188/184 +f 20/60/96 67/62/265 68/52/268 35/50/127 +f 30/100/103 94/101/354 93/84/349 29/83/99 +f 31/105/110 32/88/115 123/87/500 131/104/540 +f 32/88/114 65/89/259 66/77/262 19/76/91 +f 34/46/121 92/47/344 91/40/339 33/36/117 +f 35/50/128 36/39/133 122/42/495 130/51/535 +f 35/179/125 45/184/173 44/203/168 36/205/130 +f 35/179/126 68/171/266 45/184/174 +f 36/39/132 69/38/271 70/28/274 11/27/55 +f 38/189/139 90/191/334 89/159/329 37/158/135 +f 39/195/146 40/164/151 121/163/490 129/194/530 +f 40/164/150 59/162/241 60/156/244 7/157/37 +f 44/203/169 69/222/269 36/205/131 +f 46/196/179 67/221/263 20/204/95 +f 56/202/229 57/228/233 4/211/23 +f 89/159/331 90/191/336 144/190/606 152/161/646 +f 89/159/330 102/152/395 6/151/33 37/158/136 +f 91/40/341 92/47/346 143/48/601 151/37/641 +f 91/40/340 100/29/385 10/23/50 33/36/118 +f 93/84/351 94/101/356 142/102/596 150/85/636 +f 93/84/350 96/72/365 18/71/87 29/83/100 +f 95/57/360 92/47/345 34/46/124 17/56/84 +f 95/57/361 96/72/366 141/73/591 149/59/631 +f 97/113/370 94/101/355 30/100/106 13/112/66 +f 97/113/371 98/132/376 140/133/586 148/114/626 +f 99/17/381 100/29/386 139/25/581 147/14/621 +f 99/17/380 104/8/405 2/3/15 9/13/46 +f 101/142/390 98/132/375 14/131/70 5/141/30 +f 101/142/391 102/152/396 138/153/576 146/143/616 +f 103/215/400 90/191/335 38/189/142 1/212/12 +f 103/215/401 104/234/406 137/235/571 145/213/611 +f 105/216/410 120/236/484 136/237/564 128/218/524 +f 106/144/415 119/154/479 135/155/559 127/145/519 +f 107/15/419 118/24/474 134/26/554 126/16/514 +f 108/115/425 117/134/470 133/135/549 125/116/509 +f 109/61/430 116/74/464 132/75/544 124/58/504 +f 110/86/434 115/103/460 131/104/539 123/87/499 +f 111/41/439 114/49/455 130/51/534 122/42/494 +f 112/160/444 113/192/450 129/194/529 121/163/489 +f 113/192/451 112/160/446 152/161/645 144/190/605 +f 114/49/456 111/41/441 151/37/640 143/48/600 +f 115/103/461 110/86/436 150/85/635 142/102/595 +f 116/74/466 109/61/431 149/59/630 141/73/590 +f 117/134/471 108/115/426 148/114/625 140/133/585 +f 118/24/476 107/15/421 147/14/620 139/25/580 +f 119/154/481 106/144/416 146/143/615 138/153/575 +f 120/236/486 105/216/411 145/213/610 137/235/570 +f 129/194/531 128/218/526 4/217/26 39/195/147 +f 130/51/536 124/58/506 20/60/98 35/50/129 +f 131/104/541 125/116/511 16/117/80 31/105/111 +f 132/75/546 123/87/501 32/88/116 19/76/93 +f 133/135/551 127/145/521 8/146/44 15/136/75 +f 134/26/556 122/42/496 36/39/134 11/27/57 +f 135/155/561 121/163/491 40/164/152 7/157/39 +f 136/6/566 126/16/516 12/18/62 3/7/21 +f 137/4/569 147/14/619 107/15/420 120/5/485 +f 138/153/574 152/161/644 112/160/445 119/154/480 +f 139/25/579 151/37/639 111/41/440 118/24/475 +f 140/133/584 146/143/614 106/144/414 117/134/469 +f 141/73/589 150/85/634 110/86/435 116/74/465 +f 142/102/594 148/114/624 108/115/424 115/103/459 +f 143/48/599 149/59/629 109/61/429 114/49/454 +f 144/190/604 145/213/609 105/216/409 113/192/449 diff --git a/res/models/playership/weapons/w_rocket2.png b/res/models/playership/weapons/w_rocket2.png new file mode 100644 index 0000000..4fec985 Binary files /dev/null and b/res/models/playership/weapons/w_rocket2.png differ diff --git a/res/models/powerup/blue-gold.png b/res/models/powerup/blue-gold.png new file mode 100644 index 0000000..17429f0 Binary files /dev/null and b/res/models/powerup/blue-gold.png differ diff --git a/res/models/powerup/blue-silver.png b/res/models/powerup/blue-silver.png new file mode 100644 index 0000000..e45cf12 Binary files /dev/null and b/res/models/powerup/blue-silver.png differ diff --git a/res/models/powerup/dodecahedron5_auv.png b/res/models/powerup/dodecahedron5_auv.png new file mode 100644 index 0000000..9c35e3b Binary files /dev/null and b/res/models/powerup/dodecahedron5_auv.png differ diff --git a/res/models/powerup/green-gold.png b/res/models/powerup/green-gold.png new file mode 100644 index 0000000..cc18321 Binary files /dev/null and b/res/models/powerup/green-gold.png differ diff --git a/res/models/powerup/green-silver.png b/res/models/powerup/green-silver.png new file mode 100644 index 0000000..e291179 Binary files /dev/null and b/res/models/powerup/green-silver.png differ diff --git a/res/models/powerup/red-gold.png b/res/models/powerup/red-gold.png new file mode 100644 index 0000000..49cf31c Binary files /dev/null and b/res/models/powerup/red-gold.png differ diff --git a/res/models/powerup/red-silver.png b/res/models/powerup/red-silver.png new file mode 100644 index 0000000..1df9219 Binary files /dev/null and b/res/models/powerup/red-silver.png differ diff --git a/res/models/powerup/sphere.mtl b/res/models/powerup/sphere.mtl new file mode 100644 index 0000000..2e647aa --- /dev/null +++ b/res/models/powerup/sphere.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl dodecahedron5_auv +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd dodecahedron5_auv.png + diff --git a/res/models/powerup/sphere.obj b/res/models/powerup/sphere.obj new file mode 100644 index 0000000..4b0d3ed --- /dev/null +++ b/res/models/powerup/sphere.obj @@ -0,0 +1,784 @@ +# Exported from Wings 3D 1.4.1 +mtllib sphere.mtl +o dodecahedron5 +#140 vertices, 132 faces +v -0.50000000 0.0000000e+0 1.30901699 +v 0.50000000 0.0000000e+0 1.30901699 +v -0.80901699 -0.80901699 -0.80901699 +v -0.80901699 -0.80901699 0.80901699 +v -0.80901699 0.80901699 -0.80901699 +v -0.80901699 0.80901699 0.80901699 +v 0.80901699 -0.80901699 -0.80901699 +v 0.80901699 -0.80901699 0.80901699 +v 0.80901699 0.80901699 -0.80901699 +v 0.80901699 0.80901699 0.80901699 +v 1.30901699 0.50000000 0.0000000e+0 +v 1.30901699 -0.50000000 0.0000000e+0 +v -1.30901699 0.50000000 0.0000000e+0 +v -1.30901699 -0.50000000 0.0000000e+0 +v -0.50000000 0.0000000e+0 -1.30901699 +v 0.50000000 0.0000000e+0 -1.30901699 +v 0.0000000e+0 1.30901699 0.50000000 +v 0.0000000e+0 1.30901699 -0.50000000 +v 0.0000000e+0 -1.30901699 0.50000000 +v 0.0000000e+0 -1.30901699 -0.50000000 +v -0.40700000 0.10783483 1.24002026 +v 0.40700000 0.10783483 1.24002026 +v 0.65853983 0.76637467 0.83302026 +v 0.0000000e+0 1.17337467 0.58148043 +v -0.65853983 0.76637467 0.83302026 +v 0.40700000 -0.10783483 1.24002026 +v -0.40700000 -0.10783483 1.24002026 +v -0.65853983 -0.76637467 0.83302026 +v 0.0000000e+0 -1.17337467 0.58148043 +v 0.65853983 -0.76637467 0.83302026 +v 0.58148043 0.0000000e+0 1.17337467 +v 0.83302026 -0.65853983 0.76637467 +v 1.24002026 -0.40700000 0.10783483 +v 1.24002026 0.40700000 0.10783483 +v 0.83302026 0.65853983 0.76637467 +v 0.76637467 -0.83302026 -0.65853983 +v 1.17337467 -0.58148043 0.0000000e+0 +v 0.76637467 -0.83302026 0.65853983 +v 0.10783483 -1.24002026 0.40700000 +v 0.10783483 -1.24002026 -0.40700000 +v 1.17337467 0.58148043 0.0000000e+0 +v 0.76637467 0.83302026 -0.65853983 +v 0.10783483 1.24002026 -0.40700000 +v 0.10783483 1.24002026 0.40700000 +v 0.76637467 0.83302026 0.65853983 +v -0.65853983 -0.76637467 -0.83302026 +v -0.40700000 -0.10783483 -1.24002026 +v 0.40700000 -0.10783483 -1.24002026 +v 0.65853983 -0.76637467 -0.83302026 +v 0.0000000e+0 -1.17337467 -0.58148043 +v -0.83302026 -0.65853983 -0.76637467 +v -1.24002026 -0.40700000 -0.10783483 +v -1.24002026 0.40700000 -0.10783483 +v -0.83302026 0.65853983 -0.76637467 +v -0.58148043 0.0000000e+0 -1.17337467 +v -1.17337467 -0.58148043 0.0000000e+0 +v -0.76637467 -0.83302026 -0.65853983 +v -0.10783483 -1.24002026 -0.40700000 +v -0.10783483 -1.24002026 0.40700000 +v -0.76637467 -0.83302026 0.65853983 +v -0.83302026 -0.65853983 0.76637467 +v -0.58148043 0.0000000e+0 1.17337467 +v -0.83302026 0.65853983 0.76637467 +v -1.24002026 0.40700000 0.10783483 +v -1.24002026 -0.40700000 0.10783483 +v 1.24002026 -0.40700000 -0.10783483 +v 0.83302026 -0.65853983 -0.76637467 +v 0.58148043 0.0000000e+0 -1.17337467 +v 0.83302026 0.65853983 -0.76637467 +v 1.24002026 0.40700000 -0.10783483 +v -0.40700000 0.10783483 -1.24002026 +v -0.65853983 0.76637467 -0.83302026 +v 0.0000000e+0 1.17337467 -0.58148043 +v 0.65853983 0.76637467 -0.83302026 +v 0.40700000 0.10783483 -1.24002026 +v -0.76637467 0.83302026 -0.65853983 +v -1.17337467 0.58148043 0.0000000e+0 +v -0.76637467 0.83302026 0.65853983 +v -0.10783483 1.24002026 0.40700000 +v -0.10783483 1.24002026 -0.40700000 +v -0.67955724 0.69254672 -0.65853983 +v -1.08655724 0.44100688 0.0000000e+0 +v -0.67955724 0.69254672 0.65853983 +v -2.1017409e-2 1.09954672 0.40700000 +v -2.1017409e-2 1.09954672 -0.40700000 +v -0.40700000 2.1017409e-2 -1.09954672 +v -0.65853983 0.67955724 -0.69254672 +v 0.0000000e+0 1.08655724 -0.44100688 +v 0.65853983 0.67955724 -0.69254672 +v 0.40700000 2.1017409e-2 -1.09954672 +v 1.09954672 -0.40700000 -2.1017409e-2 +v 0.69254672 -0.65853983 -0.67955724 +v 0.44100688 0.0000000e+0 -1.08655724 +v 0.69254672 0.65853983 -0.67955724 +v 1.09954672 0.40700000 -2.1017409e-2 +v -0.69254672 -0.65853983 0.67955724 +v -0.44100688 0.0000000e+0 1.08655724 +v -0.69254672 0.65853983 0.67955724 +v -1.09954672 0.40700000 2.1017409e-2 +v -1.09954672 -0.40700000 2.1017409e-2 +v -1.08655724 -0.44100688 0.0000000e+0 +v -0.67955724 -0.69254672 -0.65853983 +v -2.1017409e-2 -1.09954672 -0.40700000 +v -2.1017409e-2 -1.09954672 0.40700000 +v -0.67955724 -0.69254672 0.65853983 +v -0.69254672 -0.65853983 -0.67955724 +v -1.09954672 -0.40700000 -2.1017409e-2 +v -1.09954672 0.40700000 -2.1017409e-2 +v -0.69254672 0.65853983 -0.67955724 +v -0.44100688 0.0000000e+0 -1.08655724 +v -0.65853983 -0.67955724 -0.69254672 +v -0.40700000 -2.1017409e-2 -1.09954672 +v 0.40700000 -2.1017409e-2 -1.09954672 +v 0.65853983 -0.67955724 -0.69254672 +v 0.0000000e+0 -1.08655724 -0.44100688 +v 1.08655724 0.44100688 0.0000000e+0 +v 0.67955724 0.69254672 -0.65853983 +v 2.1017409e-2 1.09954672 -0.40700000 +v 2.1017409e-2 1.09954672 0.40700000 +v 0.67955724 0.69254672 0.65853983 +v 0.67955724 -0.69254672 -0.65853983 +v 1.08655724 -0.44100688 0.0000000e+0 +v 0.67955724 -0.69254672 0.65853983 +v 2.1017409e-2 -1.09954672 0.40700000 +v 2.1017409e-2 -1.09954672 -0.40700000 +v 0.44100688 0.0000000e+0 1.08655724 +v 0.69254672 -0.65853983 0.67955724 +v 1.09954672 -0.40700000 2.1017409e-2 +v 1.09954672 0.40700000 2.1017409e-2 +v 0.69254672 0.65853983 0.67955724 +v 0.40700000 -2.1017409e-2 1.09954672 +v -0.40700000 -2.1017409e-2 1.09954672 +v -0.65853983 -0.67955724 0.69254672 +v 0.0000000e+0 -1.08655724 0.44100688 +v 0.65853983 -0.67955724 0.69254672 +v -0.40700000 2.1017409e-2 1.09954672 +v 0.40700000 2.1017409e-2 1.09954672 +v 0.65853983 0.67955724 0.69254672 +v 0.0000000e+0 1.08655724 0.44100688 +v -0.65853983 0.67955724 0.69254672 +vt 0.0000000e+0 9.1736582e-2 +vt 0.0000000e+0 0.27520975 +vt 0.0000000e+0 0.45868291 +vt 0.0000000e+0 0.64215607 +vt 0.0000000e+0 0.78814462 +vt 0.0000000e+0 0.88541456 +vt 1.6142661e-2 0.87592614 +vt 1.7942391e-2 9.1736582e-2 +vt 1.7942391e-2 0.27520975 +vt 1.7942391e-2 0.45868291 +vt 1.7942391e-2 0.64215607 +vt 2.8521946e-2 0.87592614 +vt 4.6770821e-2 0.96498583 +vt 6.2913481e-2 0.89162693 +vt 6.2913481e-2 0.95549741 +vt 6.6650529e-2 0.73389265 +vt 6.6650529e-2 0.55041949 +vt 6.6650529e-2 0.55041949 +vt 6.6650529e-2 0.36694633 +vt 6.6650529e-2 0.18347316 +vt 6.6650529e-2 0.36694633 +vt 6.6650529e-2 2.0955460e-15 +vt 6.6650529e-2 0.18347316 +vt 7.2195032e-2 0.71682843 +vt 7.2195032e-2 0.56748372 +vt 7.2195032e-2 0.53335526 +vt 7.2195032e-2 0.38401056 +vt 7.2195032e-2 0.20053739 +vt 7.2195032e-2 0.34988210 +vt 7.2195032e-2 1.7064228e-2 +vt 7.2195032e-2 0.16640894 +vt 7.3116469e-2 0.87592614 +vt 7.4671423e-2 0.73389265 +vt 0.12082090 0.87592614 +vt 0.14030663 0.94192004 +vt 0.14934285 0.78814462 +vt 0.14934285 0.82167418 +vt 0.15050962 0.89162693 +vt 0.15050962 0.92621926 +vt 0.15997765 0.59600602 +vt 0.15997765 0.68830613 +vt 0.15997765 0.50483296 +vt 0.15997765 0.41253286 +vt 0.15997765 0.22905969 +vt 0.15997765 0.32135980 +vt 0.15997765 4.5586529e-2 +vt 0.15997765 0.13788663 +vt 0.16071261 0.87592614 +vt 0.17449335 0.69885240 +vt 0.17449335 0.58545975 +vt 0.17449335 0.51537923 +vt 0.17449335 0.40198658 +vt 0.17449335 0.21851342 +vt 0.17449335 0.33190607 +vt 0.17449335 3.5040256e-2 +vt 0.17449335 0.14843291 +vt 0.17786479 0.73389265 +vt 0.18900905 0.68830613 +vt 0.18900905 0.59600602 +vt 0.18900905 0.41253286 +vt 0.18900905 0.50483296 +vt 0.18900905 0.22905969 +vt 0.18900905 0.32135980 +vt 0.18900905 4.5586529e-2 +vt 0.18900905 0.13788663 +vt 0.22401427 0.87592614 +vt 0.22790277 0.94192004 +vt 0.23810576 0.92621926 +vt 0.23810576 0.92621926 +vt 0.24830874 0.94192004 +vt 0.27016375 0.73389265 +vt 0.27679167 0.71682843 +vt 0.27679167 0.56748372 +vt 0.27679167 0.53335526 +vt 0.27679167 0.38401056 +vt 0.27679167 0.20053739 +vt 0.27679167 0.34988210 +vt 0.27679167 1.7064228e-2 +vt 0.27679167 0.16640894 +vt 0.28233617 0.73389265 +vt 0.28233617 0.55041949 +vt 0.28233617 0.55041949 +vt 0.28233617 0.36694633 +vt 0.28233617 0.18347316 +vt 0.28233617 0.36694633 +vt 0.28233617 0.0000000e+0 +vt 0.28233617 0.18347316 +vt 0.29868569 0.81346393 +vt 0.29868569 0.82167418 +vt 0.31482835 0.82295235 +vt 0.31549890 0.87592614 +vt 0.32570189 0.92621926 +vt 0.32570189 0.89162693 +vt 0.33104431 0.64215607 +vt 0.33104431 0.45868291 +vt 0.33104431 0.27520975 +vt 0.33104431 9.1736582e-2 +vt 0.33590488 0.94192004 +vt 0.34545651 0.73389265 +vt 0.34898670 0.55041949 +vt 0.34898670 0.56914422 +vt 0.34898670 0.58786895 +vt 0.34898670 0.60659369 +vt 0.34898670 0.62531842 +vt 0.34898670 0.64215607 +vt 0.34898670 0.68149261 +vt 0.34898670 0.70021734 +vt 0.34898670 0.56914422 +vt 0.34898670 0.58786895 +vt 0.34898670 0.62531842 +vt 0.34898670 0.64404315 +vt 0.34898670 0.64404315 +vt 0.34898670 0.66276788 +vt 0.34898670 0.66276788 +vt 0.34898670 0.68149261 +vt 0.34898670 0.45868291 +vt 0.34898670 0.27520975 +vt 0.34898670 0.28233617 +vt 0.34898670 9.1736582e-2 +vt 0.34898670 0.34898670 +vt 0.34898670 0.44128565 +vt 0.34898670 0.53358461 +vt 0.34898670 6.6650529e-2 +vt 0.36159917 0.74338107 +vt 0.36159917 0.81346393 +vt 0.36605093 0.27679167 +vt 0.36605093 7.2195032e-2 +vt 0.36771143 0.34898670 +vt 0.36771143 0.44128565 +vt 0.36771143 0.34898670 +vt 0.36771143 0.53358461 +vt 0.36771143 0.44128565 +vt 0.36771143 0.53358461 +vt 0.37774184 0.82295235 +vt 0.38402695 0.17449335 +vt 0.38643616 0.34898670 +vt 0.38643616 0.44128565 +vt 0.38643616 0.53358461 +vt 0.39457323 0.15997765 +vt 0.39457323 0.18900905 +vt 0.40309504 0.87592614 +vt 0.40516089 0.34898670 +vt 0.40516089 0.34898670 +vt 0.40516089 0.44128565 +vt 0.40516089 0.53358461 +vt 0.40516089 0.44128565 +vt 0.40516089 0.53358461 +vt 0.40837000 0.73389265 +vt 0.41329803 0.89162693 +vt 0.42350102 0.87592614 +vt 0.42388562 0.34898670 +vt 0.42388562 0.44128565 +vt 0.42388562 0.34898670 +vt 0.42388562 0.36771143 +vt 0.42388562 0.38643616 +vt 0.42388562 0.40516089 +vt 0.42388562 0.42388562 +vt 0.42388562 0.42388562 +vt 0.42388562 0.44261036 +vt 0.42388562 0.44261036 +vt 0.42388562 0.46133509 +vt 0.42388562 0.48005982 +vt 0.42388562 0.48005982 +vt 0.42388562 0.49878455 +vt 0.42388562 0.53358461 +vt 0.42451266 0.81346393 +vt 0.42451266 0.74338107 +vt 0.44065532 0.82295235 +vt 0.44072328 0.34898670 +vt 0.44072328 0.33104431 +vt 0.44072328 0.0000000e+0 +vt 0.44072328 1.7942391e-2 +vt 0.44128565 0.68149261 +vt 0.44128565 0.70021734 +vt 0.44128565 0.55041949 +vt 0.44128565 0.56914422 +vt 0.44128565 0.56914422 +vt 0.44128565 0.58786895 +vt 0.44128565 0.60659369 +vt 0.44128565 0.62531842 +vt 0.44128565 0.62531842 +vt 0.44128565 0.64404315 +vt 0.44128565 0.64404315 +vt 0.44128565 0.66276788 +vt 0.44128565 0.66276788 +vt 0.44128565 0.68149261 +vt 0.47128348 0.73389265 +vt 0.48687333 0.18900905 +vt 0.48687333 0.15997765 +vt 0.48742614 0.81346393 +vt 0.48742614 0.74338107 +vt 0.49069118 0.94192004 +vt 0.49741961 0.17449335 +vt 0.50089417 0.89162693 +vt 0.50089417 0.92621926 +vt 0.50356880 0.82295235 +vt 0.51109715 0.87592614 +vt 0.51539563 0.27679167 +vt 0.51539563 7.2195032e-2 +vt 0.51618458 0.34898670 +vt 0.51618458 0.36771143 +vt 0.51618458 0.38643616 +vt 0.51618458 0.40516089 +vt 0.51618458 0.40516089 +vt 0.51618458 0.42388562 +vt 0.51618458 0.42388562 +vt 0.51618458 0.44261036 +vt 0.51618458 0.44261036 +vt 0.51618458 0.46133509 +vt 0.51618458 0.48005982 +vt 0.51618458 0.48005982 +vt 0.51618458 0.49878455 +vt 0.53245986 0.40323866 +vt 0.53245986 6.6650529e-2 +vt 0.53245986 6.6650529e-2 +vt 0.53245986 0.28233617 +vt 0.53245986 0.28233617 +vt 0.53358461 0.55041949 +vt 0.53358461 0.56914422 +vt 0.53358461 0.56914422 +vt 0.53358461 0.58786895 +vt 0.53358461 0.60659369 +vt 0.53358461 0.62531842 +vt 0.53358461 0.62531842 +vt 0.53358461 0.64404315 +vt 0.53358461 0.66276788 +vt 0.53358461 0.66276788 +vt 0.53358461 0.68149261 +vt 0.53358461 0.68149261 +vt 0.53358461 0.70021734 +vt 0.53358461 0.63820101 +vt 0.53419696 0.73389265 +vt 0.54952409 0.27679167 +vt 0.54952409 7.2195032e-2 +vt 0.55033962 0.74338107 +vt 0.56098181 0.49102019 +vt 0.56210655 0.55041949 +vt 0.56648228 0.73389265 +vt 0.56750012 0.17449335 +vt 0.57804639 0.18900905 +vt 0.57804639 0.15997765 +vt 0.57828731 0.94192004 +vt 0.58849030 0.92621926 +vt 0.58849030 0.92621926 +vt 0.59711044 0.82295235 +vt 0.59869329 0.94192004 +vt 0.60713128 0.34898670 +vt 0.60825603 0.69245298 +vt 0.61325310 0.81346393 +vt 0.62419644 0.33104431 +vt 0.62419644 0.34898670 +vt 0.62419644 0.0000000e+0 +vt 0.62419644 1.7942391e-2 +vt 0.62939576 0.82295235 +vt 0.65328076 0.49102019 +vt 0.65440551 0.55041949 +vt 0.66002392 0.73389265 +vt 0.66588345 0.87592614 +vt 0.67034650 0.15997765 +vt 0.67034650 0.18900905 +vt 0.67608644 0.92621926 +vt 0.67608644 0.89162693 +vt 0.67616658 0.74338107 +vt 0.67616658 0.81346393 +vt 0.68089277 0.17449335 +vt 0.68180271 0.40323866 +vt 0.68180271 0.44128565 +vt 0.68180271 0.53358461 +vt 0.68180271 0.34898670 +vt 0.68180271 0.44128565 +vt 0.68292745 0.55041949 +vt 0.68292745 0.64271845 +vt 0.68292745 0.63820101 +vt 0.68628943 0.94192004 +vt 0.69230924 0.82295235 +vt 0.69886880 0.27679167 +vt 0.69886880 7.2195032e-2 +vt 0.70052744 0.44128565 +vt 0.70052744 0.53358461 +vt 0.70052744 0.34898670 +vt 0.70052744 0.44128565 +vt 0.70165219 0.55041949 +vt 0.70165219 0.64271845 +vt 0.71593303 2.8521946e-2 +vt 0.71593303 6.6650529e-2 +vt 0.71593303 0.17786479 +vt 0.71593303 0.28233617 +vt 0.71593303 0.41950659 +vt 0.71593303 0.52269996 +vt 0.71593303 0.59737139 +vt 0.71593303 0.68967034 +vt 0.71593303 0.12082090 +vt 0.71593303 0.27016375 +vt 0.71593303 0.32720764 +vt 0.72293740 0.73389265 +vt 0.73465776 0.59737139 +vt 0.73465776 0.68967034 +vt 0.73465776 0.67694266 +vt 0.73908006 0.81346393 +vt 0.73908006 0.74338107 +vt 0.75080042 0.68643108 +vt 0.75347959 0.87592614 +vt 0.75522272 0.82295235 +vt 0.76368258 0.89162693 +vt 0.77018499 0.44802854 +vt 0.77018499 0.59737139 +vt 0.78142858 0.59737139 +vt 0.78585088 0.73389265 +vt 0.79757124 0.60685980 +vt 0.80199354 0.74338107 +vt 0.80371455 0.0000000e+0 +vt 0.80371455 0.14934285 +vt 0.80371455 0.14934285 +vt 0.80371455 0.29868569 +vt 0.80371455 0.29868569 +vt 0.80371455 0.44802854 +vt 0.85796651 0.60685980 +vt 0.85796651 0.78497919 +vt 0.85796651 7.4671423e-2 +vt 0.85796651 0.17786479 +vt 0.85796651 0.27016375 +vt 0.85796651 0.37335712 +vt 0.85796651 0.47655049 +vt 0.85796651 0.52269996 +vt 0.85796651 0.69591949 +vt 0.85796651 7.4671423e-2 +vt 0.85796651 0.22401427 +vt 0.85796651 0.37335712 +vt 0.85796651 0.56884944 +vt 0.87410917 0.59737139 +vt 0.87410917 0.77549077 +vt 0.87410917 0.68643108 +vt 0.90473733 0.68643108 +vt 0.90473733 0.86455046 +vt 0.90473733 0.77549077 +vt 0.91221848 0.44802854 +vt 0.91221848 0.59737139 +vt 0.91221848 0.0000000e+0 +vt 0.91221848 0.14934285 +vt 0.91221848 0.29868569 +vt 0.91221848 0.44802854 +vt 0.92087999 0.60685980 +vt 0.92087999 0.67694266 +vt 0.92087999 0.69591949 +vt 0.92087999 0.78497919 +vt 0.92087999 0.85506204 +vt 0.92087999 0.76600235 +vt 0.93702266 0.59737139 +vt 0.93702266 0.68643108 +vt 0.93702266 0.77549077 +vt 0.94574804 0.14934285 +vt 0.94574804 0.29868569 +vt 0.96765081 0.68643108 +vt 0.96765081 0.77549077 +vt 0.96765081 0.86455046 +vt 0.98379348 0.67694266 +vt 0.98379348 0.76600235 +vt 0.98379348 0.85506204 +vt 1.00000000 2.8521946e-2 +vt 1.00000000 0.12082090 +vt 1.00000000 0.22401427 +vt 1.00000000 0.32720764 +vt 1.00000000 0.41950659 +vt 1.00000000 0.47655049 +vt 1.00000000 0.56884944 +vn -0.35682209 2.3515153e-17 0.93417236 +vn 0.35682209 2.3515153e-17 0.93417236 +vn -0.57735027 -0.57735027 -0.57735027 +vn -0.57735027 -0.57735027 0.57735027 +vn -0.57735027 0.57735027 -0.57735027 +vn -0.57735027 0.57735027 0.57735027 +vn 0.57735027 -0.57735027 -0.57735027 +vn 0.57735027 -0.57735027 0.57735027 +vn 0.57735027 0.57735027 -0.57735027 +vn 0.57735027 0.57735027 0.57735027 +vn 0.93417236 0.35682209 2.3515153e-17 +vn 0.93417236 -0.35682209 2.3515153e-17 +vn -0.93417236 0.35682209 -2.3515153e-17 +vn -0.93417236 -0.35682209 -2.3515153e-17 +vn -0.35682209 -2.3515153e-17 -0.93417236 +vn 0.35682209 -2.3515153e-17 -0.93417236 +vn 2.3515153e-17 0.93417236 0.35682209 +vn 2.3515153e-17 0.93417236 -0.35682209 +vn 2.3515153e-17 -0.93417236 0.35682209 +vn 2.3515153e-17 -0.93417236 -0.35682209 +vn 0.37317933 0.84310690 0.38717946 +vn -0.37317933 0.84310690 0.38717946 +vn -0.60381684 0.23929007 0.76035879 +vn 0.0000000e+0 -0.13388926 0.99099630 +vn 0.60381684 0.23929007 0.76035879 +vn -0.37317933 -0.84310690 0.38717946 +vn 0.37317933 -0.84310690 0.38717946 +vn 0.60381684 -0.23929007 0.76035879 +vn 0.0000000e+0 0.13388926 0.99099630 +vn -0.60381684 -0.23929007 0.76035879 +vn 0.99099630 0.0000000e+0 -0.13388926 +vn 0.76035879 0.60381684 0.23929007 +vn 0.38717946 0.37317933 0.84310690 +vn 0.38717946 -0.37317933 0.84310690 +vn 0.76035879 -0.60381684 0.23929007 +vn 0.23929007 -0.76035879 0.60381684 +vn -0.13388926 -0.99099630 0.0000000e+0 +vn 0.23929007 -0.76035879 -0.60381684 +vn 0.84310690 -0.38717946 -0.37317933 +vn 0.84310690 -0.38717946 0.37317933 +vn -0.13388926 0.99099630 0.0000000e+0 +vn 0.23929007 0.76035879 0.60381684 +vn 0.84310690 0.38717946 0.37317933 +vn 0.84310690 0.38717946 -0.37317933 +vn 0.23929007 0.76035879 -0.60381684 +vn 0.60381684 -0.23929007 -0.76035879 +vn 0.37317933 -0.84310690 -0.38717946 +vn -0.37317933 -0.84310690 -0.38717946 +vn -0.60381684 -0.23929007 -0.76035879 +vn 0.0000000e+0 0.13388926 -0.99099630 +vn -0.76035879 0.60381684 -0.23929007 +vn -0.38717946 0.37317933 -0.84310690 +vn -0.38717946 -0.37317933 -0.84310690 +vn -0.76035879 -0.60381684 -0.23929007 +vn -0.99099630 0.0000000e+0 0.13388926 +vn 0.13388926 -0.99099630 0.0000000e+0 +vn -0.23929007 -0.76035879 0.60381684 +vn -0.84310690 -0.38717946 0.37317933 +vn -0.84310690 -0.38717946 -0.37317933 +vn -0.23929007 -0.76035879 -0.60381684 +vn -0.76035879 0.60381684 0.23929007 +vn -0.99099630 0.0000000e+0 -0.13388926 +vn -0.76035879 -0.60381684 0.23929007 +vn -0.38717946 -0.37317933 0.84310690 +vn -0.38717946 0.37317933 0.84310690 +vn 0.38717946 0.37317933 -0.84310690 +vn 0.76035879 0.60381684 -0.23929007 +vn 0.99099630 0.0000000e+0 0.13388926 +vn 0.76035879 -0.60381684 -0.23929007 +vn 0.38717946 -0.37317933 -0.84310690 +vn 0.37317933 0.84310690 -0.38717946 +vn 0.60381684 0.23929007 -0.76035879 +vn 0.0000000e+0 -0.13388926 -0.99099630 +vn -0.60381684 0.23929007 -0.76035879 +vn -0.37317933 0.84310690 -0.38717946 +vn -0.23929007 0.76035879 0.60381684 +vn 0.13388926 0.99099630 0.0000000e+0 +vn -0.23929007 0.76035879 -0.60381684 +vn -0.84310690 0.38717946 -0.37317933 +vn -0.84310690 0.38717946 0.37317933 +vn -5.2786405e-2 0.58541020 0.80901699 +vn 0.44721360 0.89442719 0.0000000e+0 +vn -5.2786405e-2 0.58541020 -0.80901699 +vn -0.86180340 8.5410197e-2 -0.50000000 +vn -0.86180340 8.5410197e-2 0.50000000 +vn 0.50000000 0.86180340 -8.5410197e-2 +vn 0.80901699 5.2786405e-2 -0.58541020 +vn 0.0000000e+0 -0.44721360 -0.89442719 +vn -0.80901699 5.2786405e-2 -0.58541020 +vn -0.50000000 0.86180340 -8.5410197e-2 +vn 8.5410197e-2 0.50000000 -0.86180340 +vn 0.58541020 0.80901699 -5.2786405e-2 +vn 0.89442719 0.0000000e+0 0.44721360 +vn 0.58541020 -0.80901699 -5.2786405e-2 +vn 8.5410197e-2 -0.50000000 -0.86180340 +vn -0.58541020 0.80901699 5.2786405e-2 +vn -0.89442719 0.0000000e+0 -0.44721360 +vn -0.58541020 -0.80901699 5.2786405e-2 +vn -8.5410197e-2 -0.50000000 0.86180340 +vn -8.5410197e-2 0.50000000 0.86180340 +vn 0.44721360 -0.89442719 0.0000000e+0 +vn -5.2786405e-2 -0.58541020 0.80901699 +vn -0.86180340 -8.5410197e-2 0.50000000 +vn -0.86180340 -8.5410197e-2 -0.50000000 +vn -5.2786405e-2 -0.58541020 -0.80901699 +vn -0.58541020 0.80901699 -5.2786405e-2 +vn -8.5410197e-2 0.50000000 -0.86180340 +vn -8.5410197e-2 -0.50000000 -0.86180340 +vn -0.58541020 -0.80901699 -5.2786405e-2 +vn -0.89442719 0.0000000e+0 0.44721360 +vn 0.80901699 -5.2786405e-2 -0.58541020 +vn 0.50000000 -0.86180340 -8.5410197e-2 +vn -0.50000000 -0.86180340 -8.5410197e-2 +vn -0.80901699 -5.2786405e-2 -0.58541020 +vn 0.0000000e+0 0.44721360 -0.89442719 +vn -0.44721360 0.89442719 0.0000000e+0 +vn 5.2786405e-2 0.58541020 0.80901699 +vn 0.86180340 8.5410197e-2 0.50000000 +vn 0.86180340 8.5410197e-2 -0.50000000 +vn 5.2786405e-2 0.58541020 -0.80901699 +vn 5.2786405e-2 -0.58541020 0.80901699 +vn -0.44721360 -0.89442719 0.0000000e+0 +vn 5.2786405e-2 -0.58541020 -0.80901699 +vn 0.86180340 -8.5410197e-2 -0.50000000 +vn 0.86180340 -8.5410197e-2 0.50000000 +vn 0.89442719 0.0000000e+0 -0.44721360 +vn 0.58541020 0.80901699 5.2786405e-2 +vn 8.5410197e-2 0.50000000 0.86180340 +vn 8.5410197e-2 -0.50000000 0.86180340 +vn 0.58541020 -0.80901699 5.2786405e-2 +vn -0.50000000 -0.86180340 8.5410197e-2 +vn 0.50000000 -0.86180340 8.5410197e-2 +vn 0.80901699 -5.2786405e-2 0.58541020 +vn 0.0000000e+0 0.44721360 0.89442719 +vn -0.80901699 -5.2786405e-2 0.58541020 +vn 0.50000000 0.86180340 8.5410197e-2 +vn -0.50000000 0.86180340 8.5410197e-2 +vn -0.80901699 5.2786405e-2 0.58541020 +vn 0.0000000e+0 -0.44721360 0.89442719 +vn 0.80901699 5.2786405e-2 0.58541020 +g dodecahedron5_dodecahedron5_auv +usemtl dodecahedron5_auv +s 1 +f 1/135/1 21/140/21 25/126/25 6/118/6 +f 1/135/1 27/139/27 26/189/26 2/193/2 +f 1/105/1 62/94/62 61/73/61 4/81/4 +f 2/193/2 22/188/22 21/140/21 1/135/1 +f 2/193/2 26/189/26 30/199/30 8/215/8 +f 2/3/2 31/10/31 35/26/35 10/18/10 +f 3/285/3 46/277/46 50/253/50 20/252/20 +f 3/17/3 51/25/51 55/11/55 15/4/15 +f 3/87/3 57/79/57 56/97/56 14/119/14 +f 4/123/4 28/127/28 27/139/27 1/135/1 +f 4/86/4 60/78/60 59/64/59 19/55/19 +f 4/81/4 61/73/61 65/59/65 14/50/14 +f 5/16/5 54/24/54 53/41/53 13/49/13 +f 5/287/5 72/276/72 71/260/71 15/265/15 +f 5/21/5 76/29/76 80/45/80 18/54/18 +f 6/118/6 25/126/25 24/170/24 17/169/17 +f 6/80/6 63/72/63 62/94/62 1/105/1 +f 6/20/6 78/28/78 77/9/77 13/2/13 +f 7/23/7 36/31/36 40/47/40 20/56/20 +f 7/214/7 49/234/49 48/241/48 16/239/16 +f 7/83/7 67/75/67 66/60/66 12/52/12 +f 8/215/8 30/199/30 29/172/29 19/171/19 +f 8/19/8 32/27/32 31/10/31 2/3/2 +f 8/22/8 38/30/38 37/8/37 12/1/12 +f 9/85/9 42/77/42 41/96/41 11/117/11 +f 9/82/9 69/74/69 68/95/68 16/116/16 +f 9/217/9 74/233/74 73/250/73 18/251/18 +f 10/216/10 23/198/23 22/188/22 2/193/2 +f 10/18/10 35/26/35 34/42/34 11/51/11 +f 10/84/10 45/76/45 44/62/44 17/53/17 +f 11/51/11 34/42/34 33/43/33 12/52/12 +f 11/117/11 41/96/41 45/76/45 10/84/10 +f 11/51/11 70/61/70 69/74/69 9/82/9 +f 12/52/12 33/43/33 32/27/32 8/19/8 +f 12/1/12 37/8/37 36/31/36 7/23/7 +f 12/52/12 66/60/66 70/61/70 11/51/11 +f 13/49/13 53/41/53 52/40/52 14/50/14 +f 13/49/13 64/58/64 63/72/63 6/80/6 +f 13/2/13 77/9/77 76/29/76 5/21/5 +f 14/50/14 52/40/52 51/25/51 3/17/3 +f 14/119/14 56/97/56 60/78/60 4/86/4 +f 14/50/14 65/59/65 64/58/64 13/49/13 +f 15/265/15 47/259/47 46/277/46 3/285/3 +f 15/4/15 55/11/55 54/24/54 5/16/5 +f 15/265/15 71/260/71 75/240/75 16/239/16 +f 16/239/16 48/241/48 47/259/47 15/265/15 +f 16/116/16 68/95/68 67/75/67 7/83/7 +f 16/239/16 75/240/75 74/233/74 9/217/9 +f 17/169/17 24/170/24 23/198/23 10/216/10 +f 17/53/17 44/62/44 43/63/43 18/54/18 +f 17/53/17 79/44/79 78/28/78 6/20/6 +f 18/54/18 43/63/43 42/77/42 9/85/9 +f 18/251/18 73/250/73 72/276/72 5/287/5 +f 18/54/18 80/45/80 79/44/79 17/53/17 +f 19/171/19 29/172/29 28/127/28 4/123/4 +f 19/55/19 39/46/39 38/30/38 8/22/8 +f 19/55/19 59/64/59 58/65/58 20/56/20 +f 20/56/20 40/47/40 39/46/39 19/55/19 +f 20/252/20 50/253/50 49/234/49 7/214/7 +f 20/56/20 58/65/58 57/79/57 3/87/3 +f 21/318/21 136/331/136 140/346/140 25/334/25 +f 22/206/22 137/207/137 136/159/136 21/158/21 +f 23/168/23 138/166/138 137/187/137 22/191/22 +f 24/181/24 139/182/139 138/111/138 23/104/23 +f 25/224/25 140/225/140 139/182/139 24/181/24 +f 26/347/26 131/335/131 135/325/135 30/332/30 +f 27/204/27 132/205/132 131/157/131 26/156/26 +f 28/257/28 133/263/133 132/254/132 27/249/27 +f 29/179/29 134/180/134 133/110/133 28/103/28 +f 30/222/30 135/223/135 134/180/134 29/179/29 +f 31/121/31 126/129/126 130/131/130 35/122/35 +f 32/120/32 127/128/127 126/129/126 31/121/31 +f 33/357/33 128/354/128 127/344/127 32/349/32 +f 34/283/34 129/272/129 128/271/128 33/282/33 +f 35/308/35 130/310/130 129/303/129 34/299/34 +f 36/68/36 121/67/121 125/38/125 40/48/40 +f 37/177/37 122/178/122 121/102/121 36/108/36 +f 38/220/38 123/221/123 122/178/122 37/177/37 +f 39/302/39 124/304/124 123/274/123 38/261/38 +f 40/209/40 125/210/125 124/162/124 39/161/39 +f 41/179/41 116/178/116 120/221/120 45/222/45 +f 42/103/42 117/109/117 116/178/116 41/179/41 +f 43/98/43 118/92/118 117/141/117 42/149/42 +f 44/156/44 119/155/119 118/202/118 43/203/43 +f 45/194/45 120/197/120 119/244/119 44/242/44 +f 46/107/46 111/106/111 115/173/115 50/174/50 +f 47/249/47 112/245/112 111/235/111 46/238/46 +f 48/155/48 113/154/113 112/201/112 47/202/47 +f 49/295/49 114/300/114 113/275/113 48/264/48 +f 50/174/50 115/173/115 114/228/114 49/230/49 +f 51/143/51 106/151/106 110/152/110 55/146/55 +f 52/342/52 107/348/107 106/356/106 51/353/51 +f 53/279/53 108/268/108 107/267/107 52/278/52 +f 54/196/54 109/190/109 108/232/108 53/235/53 +f 55/146/55 110/152/110 109/165/109 54/147/54 +f 56/175/56 101/176/101 105/101/105 60/100/60 +f 57/218/57 102/219/102 101/176/101 56/175/56 +f 58/258/58 103/262/103 102/246/102 57/243/57 +f 59/208/59 104/209/104 103/161/103 58/160/58 +f 60/195/60 105/192/105 104/149/104 59/150/59 +f 61/307/61 96/309/96 100/301/100 65/298/65 +f 62/144/62 97/137/97 96/136/96 61/142/61 +f 63/145/63 98/138/98 97/137/97 62/144/62 +f 64/358/64 99/355/99 98/345/98 63/350/63 +f 65/290/65 100/296/100 99/297/99 64/291/64 +f 66/269/66 91/280/91 95/281/95 70/270/70 +f 67/134/67 92/125/92 91/148/91 66/167/66 +f 68/137/68 93/132/93 92/130/92 67/136/67 +f 69/138/69 94/133/94 93/132/93 68/137/68 +f 70/6/70 95/7/95 94/15/94 69/13/69 +f 71/164/71 86/163/86 90/211/90 75/212/75 +f 72/90/72 87/88/87 86/99/86 71/124/71 +f 73/186/73 88/185/88 87/227/87 72/229/72 +f 74/115/74 89/114/89 88/185/88 73/186/73 +f 75/317/75 90/330/90 89/343/89 74/333/74 +f 76/14/76 81/32/81 85/39/85 80/35/80 +f 77/184/77 82/183/82 81/225/81 76/226/76 +f 78/113/78 83/112/83 82/183/82 77/184/77 +f 79/70/79 84/69/84 83/91/83 78/93/78 +f 80/154/80 85/153/85 84/200/84 79/201/79 +f 82/324/82 83/341/83 84/364/84 85/365/85 81/337/81 +f 87/273/87 88/248/88 89/231/89 90/237/90 86/256/86 +f 92/315/92 93/328/93 94/316/94 95/288/95 91/294/91 +f 97/361/97 98/352/98 99/321/99 100/320/100 96/351/96 +f 102/314/102 103/293/103 104/286/104 105/313/105 101/327/101 +f 107/323/107 108/329/108 109/306/109 110/289/110 106/305/106 +f 112/255/112 113/236/113 114/213/114 115/247/115 111/266/111 +f 117/312/117 118/292/118 119/284/119 120/311/120 116/326/116 +f 122/322/122 123/340/123 124/362/124 125/363/125 121/336/121 +f 127/338/127 128/359/128 129/360/129 130/339/130 126/319/126 +f 132/12/132 133/5/133 134/33/134 135/36/135 131/34/131 +f 137/71/137 138/89/138 139/66/139 140/37/140 136/57/136 diff --git a/res/models/ships/bird/bird.mtl b/res/models/ships/bird/bird.mtl new file mode 100644 index 0000000..8fce32a --- /dev/null +++ b/res/models/ships/bird/bird.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl bird +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd bird.png + diff --git a/res/models/ships/bird/bird.obj b/res/models/ships/bird/bird.obj new file mode 100644 index 0000000..3ce33ab --- /dev/null +++ b/res/models/ships/bird/bird.obj @@ -0,0 +1,917 @@ +# Exported from Wings 3D 1.4.1 +mtllib bird.mtl +o bird +#200 vertices, 186 faces +v -0.38268343 7.2394985e-17 -0.88003525 +v -0.35355339 -0.14644661 -0.88003525 +v -0.27059805 -0.27059805 -0.88003525 +v -0.14644661 -0.35355339 -0.88003525 +v 1.6702005e-15 -0.38268343 -0.88003525 +v 0.14644661 -0.35355339 -0.88003525 +v 0.27059805 -0.27059805 -0.88003525 +v 0.35355339 -0.14644661 -0.88003525 +v 0.38268343 2.5531329e-17 -0.88003525 +v 0.35355339 0.14644661 -0.88003525 +v 0.27059805 0.27059805 -0.88003525 +v 0.14644661 0.35355339 -0.88003525 +v 1.7639278e-15 0.38268343 -0.88003525 +v -0.14644661 0.35355339 -0.88003525 +v -0.27059805 0.27059805 -0.88003525 +v -0.35355339 0.14644661 -0.88003525 +v -1.24167951 5.9121920e-17 -0.23634981 +v -0.65328148 -0.16506481 -0.66326250 +v -0.50000000 -0.50000000 -0.66326250 +v -0.27059805 -0.65328148 -0.66326250 +v 1.6237898e-15 -0.70710678 -0.66326250 +v 0.27059805 -0.65328148 -0.66326250 +v 0.50000000 -0.50000000 -0.66326250 +v 0.65328148 -0.16506481 -0.66326250 +v 1.24167951 -2.7470825e-17 -0.23634981 +v 0.65328148 0.16506481 -0.66326250 +v 0.50000000 0.50000000 -0.66326250 +v 0.27059805 0.65328148 -0.66326250 +v 1.7969753e-15 0.70710678 -0.66326250 +v -0.27059805 0.65328148 -0.66326250 +v -0.50000000 0.50000000 -0.66326250 +v -0.65328148 0.16506481 -0.66326250 +v -1.62233246 3.9257376e-17 8.8073541e-2 +v -0.85355339 -0.21566757 -0.33883915 +v -0.65328148 -0.65328148 -0.33883915 +v -0.35355339 -0.85355339 -0.33883915 +v 1.5707877e-15 -0.92387953 -0.33883915 +v 0.35355339 -0.85355339 -0.33883915 +v 0.65328148 -0.65328148 -0.33883915 +v 0.85355339 -0.21566757 -0.33883915 +v 1.62233246 -7.3881499e-17 8.8073541e-2 +v 0.85355339 0.21566757 -0.33883915 +v 0.65328148 0.65328148 -0.33883915 +v 0.35355339 0.85355339 -0.33883915 +v 1.7970654e-15 0.92387953 -0.33883915 +v -0.35355339 0.85355339 -0.33883915 +v -0.65328148 0.65328148 -0.33883915 +v -0.85355339 0.21566757 -0.33883915 +v -1.75600000 1.5825548e-17 0.47075697 +v -0.92387953 -0.23343689 4.3844286e-2 +v -0.70710678 -0.70710678 4.3844286e-2 +v -0.38268343 -0.92387953 4.3844286e-2 +v 1.5192631e-15 -1.00000000 4.3844286e-2 +v 0.38268343 -0.92387953 4.3844286e-2 +v 0.70710678 -0.70710678 4.3844286e-2 +v 0.92387953 -0.23343689 4.3844286e-2 +v 1.75600000 -1.0663509e-16 0.47075697 +v 0.92387953 0.23343689 4.3844286e-2 +v 0.70710678 0.70710678 4.3844286e-2 +v 0.38268343 0.92387953 4.3844286e-2 +v 1.7641844e-15 1.00000000 4.3844286e-2 +v -0.38268343 0.92387953 4.3844286e-2 +v -0.70710678 0.70710678 4.3844286e-2 +v -0.92387953 0.23343689 4.3844286e-2 +v -1.62233246 -7.6062806e-18 0.85344041 +v -0.85355339 -0.21566757 0.42652772 +v -0.65328148 -0.65328148 0.42652772 +v -0.35355339 -0.85355339 0.42652772 +v 1.4770603e-15 -0.92387953 0.42652772 +v 0.35355339 -0.85355339 0.42652772 +v 0.65328148 -0.65328148 0.42652772 +v 0.85355339 -0.21566757 0.42652772 +v 1.62233246 -1.2074516e-16 0.85344041 +v 0.85355339 0.21566757 0.42652772 +v 0.65328148 0.65328148 0.42652772 +v 0.35355339 0.85355339 0.42652772 +v 1.7033381e-15 0.92387953 0.42652772 +v -0.35355339 0.85355339 0.42652772 +v -0.65328148 0.65328148 0.42652772 +v -0.85355339 0.21566757 0.42652772 +v -1.24167951 -8.5484384e-14 1.15661513 +v -0.65328148 -0.16506481 0.72970244 +v -0.50000000 -0.50000000 0.72970244 +v -0.27059805 -0.65328148 0.72970244 +v 1.1225334e-15 -0.70710678 0.72970244 +v 0.27059805 -0.65328148 0.72970244 +v 0.50000000 -0.50000000 0.72970244 +v 0.65328148 -0.16506481 0.72970244 +v 1.24167951 -8.5570977e-14 1.15661513 +v 0.65328148 0.16506481 0.72970244 +v 0.50000000 0.50000000 0.72970244 +v 0.27059805 0.65328148 0.72970244 +v 1.2957189e-15 0.70710678 0.72970244 +v -0.27059805 0.65328148 0.72970244 +v -0.50000000 0.50000000 0.72970244 +v -0.65328148 0.16506481 0.72970244 +v -0.38268343 -6.0002637e-13 0.81853903 +v -0.35355339 -0.14644661 0.81853903 +v -0.27059805 -0.27059805 0.81853903 +v -0.14644661 -0.35355339 0.81853903 +v -8.5943464e-16 -0.38268343 0.81853903 +v 0.14644661 -0.35355339 0.81853903 +v 0.27059805 -0.27059805 0.81853903 +v 0.35355339 -0.14644661 0.81853903 +v 0.38268343 -6.0007324e-13 0.81853903 +v 0.35355339 0.14644661 0.81853903 +v 0.27059805 0.27059805 0.81853903 +v 0.14644661 0.35355339 0.81853903 +v -7.6570732e-16 0.38268343 0.81853903 +v -0.14644661 0.35355339 0.81853903 +v -0.27059805 0.27059805 0.81853903 +v -0.35355339 0.14644661 0.81853903 +v -0.20000000 1.7780236e-16 -0.96357606 +v -0.14142136 0.14142136 -0.96357606 +v 1.7640378e-15 0.20000000 -0.96357606 +v 0.14142136 0.14142136 -0.96357606 +v 0.20000000 -4.6448886e-17 -0.96357606 +v 0.14142136 -0.14142136 -0.96357606 +v 1.5642787e-15 -0.20000000 -0.96357606 +v -0.14142136 -0.14142136 -0.96357606 +v -0.30000000 2.3998821e-16 -0.88003525 +v -0.21213203 0.21213203 -0.88003525 +v 1.8618207e-15 0.30000000 -0.88003525 +v 0.21213203 0.21213203 -0.88003525 +v 0.30000000 -9.6388667e-17 -0.88003525 +v 0.21213203 -0.21213203 -0.88003525 +v 1.5621821e-15 -0.30000000 -0.88003525 +v -0.21213203 -0.21213203 -0.88003525 +v -0.20000000 1.1657205e-16 -1.88003525 +v -0.14142136 0.14142136 -1.88003525 +v 1.3063601e-15 0.20000000 -1.88003525 +v 0.14142136 0.14142136 -1.88003525 +v 0.20000000 -1.0767920e-16 -1.88003525 +v 0.14142136 -0.14142136 -1.88003525 +v 1.1066010e-15 -0.20000000 -1.88003525 +v -0.14142136 -0.14142136 -1.88003525 +v -0.30000000 1.7875789e-16 -1.88003525 +v -0.21213203 0.21213203 -1.88003525 +v 1.3624229e-15 0.30000000 -1.88003525 +v 0.21213203 0.21213203 -1.88003525 +v 0.30000000 -1.5761898e-16 -1.88003525 +v 0.21213203 -0.21213203 -1.88003525 +v 1.0627843e-15 -0.30000000 -1.88003525 +v -0.21213203 -0.21213203 -1.88003525 +v -0.25606602 -0.10606602 -0.88003525 +v -0.10606602 -0.25606602 -0.88003525 +v 0.10606602 -0.25606602 -0.88003525 +v 0.25606602 -0.10606602 -0.88003525 +v 0.25606602 0.10606602 -0.88003525 +v 0.10606602 0.25606602 -0.88003525 +v -0.10606602 0.25606602 -0.88003525 +v -0.25606602 0.10606602 -0.88003525 +v -0.61305886 -6.0002746e-13 1.09128881 +v -0.56639253 -0.23460747 1.09128881 +v -0.43349808 -0.43349808 1.09128881 +v -0.23460747 -0.56639253 1.09128881 +v -9.0623851e-16 -0.61305886 1.09128881 +v 0.23460747 -0.56639253 1.09128881 +v 0.43349808 -0.43349808 1.09128881 +v 0.56639253 -0.23460747 1.09128881 +v 0.61305886 -6.0010254e-13 1.09128881 +v 0.56639253 0.23460747 1.09128881 +v 0.43349808 0.43349808 1.09128881 +v 0.23460747 0.56639253 1.09128881 +v -7.5608735e-16 0.61305886 1.09128881 +v -0.23460747 0.56639253 1.09128881 +v -0.43349808 0.43349808 1.09128881 +v -0.56639253 0.23460747 1.09128881 +v -0.46104352 0.19097048 1.17429961 +v -0.49902991 -6.0003553e-13 1.17429961 +v -0.46104352 -0.19097048 1.17429961 +v -0.35286743 -0.35286743 1.17429961 +v -0.19097048 -0.46104352 1.17429961 +v -9.1640407e-16 -0.49902991 1.17429961 +v 0.19097048 -0.46104352 1.17429961 +v 0.35286743 -0.35286743 1.17429961 +v 0.46104352 -0.19097048 1.17429961 +v 0.49902991 -6.0010092e-13 1.17429961 +v 0.46104352 0.19097048 1.17429961 +v 0.35286743 0.35286743 1.17429961 +v 0.19097048 0.46104352 1.17429961 +v -7.9368193e-16 0.49902991 1.17429961 +v -0.19097048 0.46104352 1.17429961 +v -0.35286743 0.35286743 1.17429961 +v -0.30982125 0.12833216 0.84699988 +v -0.33534810 -6.0002858e-13 0.84699988 +v -0.30982125 -0.12833216 0.84699988 +v -0.23712692 -0.23712692 0.84699988 +v -0.12833216 -0.30982125 0.84699988 +v -8.5084625e-16 -0.33534810 0.84699988 +v 0.12833216 -0.30982125 0.84699988 +v 0.23712692 -0.23712692 0.84699988 +v 0.30982125 -0.12833216 0.84699988 +v 0.33534810 -6.0009398e-13 0.84699988 +v 0.30982125 0.12833216 0.84699988 +v 0.23712692 0.23712692 0.84699988 +v 0.12833216 0.30982125 0.84699988 +v -7.7907708e-16 0.33534810 0.84699988 +v -0.12833216 0.30982125 0.84699988 +v -0.23712692 0.23712692 0.84699988 +vt 5.8910598e-3 0.33455135 +vt 5.8910598e-3 0.65667039 +vt 2.5002951e-2 0.58822866 +vt 2.5002952e-2 0.40299307 +vt 3.1610223e-2 0.72272970 +vt 3.1610225e-2 0.26849203 +vt 8.6126817e-2 0.52907231 +vt 8.6126818e-2 0.46214942 +vt 9.2611289e-2 0.20532069 +vt 9.2611289e-2 0.78590104 +vt 0.16313019 0.72609920 +vt 0.16313019 0.26512253 +vt 0.17306525 0.65569986 +vt 0.17306525 0.33552187 +vt 0.17380215 0.79517591 +vt 0.17380215 0.19604583 +vt 0.20325019 0.85616349 +vt 0.20325020 0.13505825 +vt 0.20367908 0.59357905 +vt 0.20367908 0.39764268 +vt 0.22609160 0.92056524 +vt 0.22609160 7.0656492e-2 +vt 0.23745271 0.93159271 +vt 0.23745271 5.9629020e-2 +vt 0.24195361 0.72677990 +vt 0.24195361 0.26444183 +vt 0.24426207 0.55120505 +vt 0.24426207 0.44001668 +vt 0.24531485 0.77854581 +vt 0.24531486 0.21267593 +vt 0.24583281 0.67507378 +vt 0.24583281 0.31614795 +vt 0.24839319 0.90484306 +vt 0.24839319 8.6378676e-2 +vt 0.25342471 0.56691360 +vt 0.25342471 0.42430813 +vt 0.25619187 0.83300798 +vt 0.25619188 0.15821375 +vt 0.25745991 0.62370994 +vt 0.25745991 0.36751179 +vt 0.25756722 0.92283152 +vt 0.25756722 6.8390216e-2 +vt 0.27431136 0.89593491 +vt 0.27431136 9.5286821e-2 +vt 0.27592028 0.57513611 +vt 0.27592028 0.41608562 +vt 0.27803861 0.91234511 +vt 0.27803861 7.8876623e-2 +vt 0.28940259 0.72714356 +vt 0.28940259 0.26407817 +vt 0.29071040 0.77454976 +vt 0.29071040 0.21667197 +vt 0.29106114 0.67999996 +vt 0.29106114 0.31122178 +vt 0.29524047 0.82651892 +vt 0.29524047 0.16470281 +vt 0.29588183 0.63145864 +vt 0.29588183 0.35976309 +vt 0.30316353 0.89181211 +vt 0.30316353 9.9409622e-2 +vt 0.30325101 0.57804595 +vt 0.30325101 0.41317578 +vt 0.30434064 0.91545600 +vt 0.30434064 7.5765728e-2 +vt 0.33379458 0.91336158 +vt 0.33379458 0.89168376 +vt 0.33379458 0.77343909 +vt 0.33379458 0.82472607 +vt 0.33379458 0.72726744 +vt 0.33379458 0.68138978 +vt 0.33379458 0.63335038 +vt 0.33379458 0.57658177 +vt 0.33379458 0.21778264 +vt 0.33379458 0.30983195 +vt 0.33379458 9.9537970e-2 +vt 0.33379458 0.41463996 +vt 0.33379458 0.35787135 +vt 0.33379458 7.7860150e-2 +vt 0.33379458 0.26395429 +vt 0.33379458 0.16649566 +vt 0.36324852 0.91545600 +vt 0.36324852 7.5765728e-2 +vt 0.36433816 0.57804595 +vt 0.36433816 0.41317578 +vt 0.36442563 0.89181211 +vt 0.36442563 9.9409622e-2 +vt 0.37170733 0.63145864 +vt 0.37170733 0.35976309 +vt 0.37234869 0.82651892 +vt 0.37234869 0.16470281 +vt 0.37652803 0.67999996 +vt 0.37652803 0.31122178 +vt 0.37687876 0.77454976 +vt 0.37687876 0.21667197 +vt 0.37818658 0.72714356 +vt 0.37818658 0.26407817 +vt 0.38955056 0.91234511 +vt 0.38955056 7.8876623e-2 +vt 0.39166889 0.57513611 +vt 0.39166889 0.41608562 +vt 0.39327781 0.89593491 +vt 0.39327781 9.5286821e-2 +vt 0.41002195 0.92283152 +vt 0.41002195 6.8390215e-2 +vt 0.41012925 0.62370994 +vt 0.41012925 0.36751179 +vt 0.41139729 0.83300798 +vt 0.41139729 0.15821375 +vt 0.41416445 0.56691360 +vt 0.41416445 0.42430813 +vt 0.41919598 0.90484306 +vt 0.41919598 8.6378676e-2 +vt 0.42175635 0.67507378 +vt 0.42175635 0.31614795 +vt 0.42227431 0.77854581 +vt 0.42227431 0.21267593 +vt 0.42332710 0.55120505 +vt 0.42332710 0.44001668 +vt 0.42563555 0.72677990 +vt 0.42563555 0.26444183 +vt 0.43013645 0.93159271 +vt 0.43013645 5.9629020e-2 +vt 0.44149756 0.92056524 +vt 0.44149756 7.0656493e-2 +vt 0.46391008 0.59357905 +vt 0.46391008 0.39764268 +vt 0.46433897 0.85616349 +vt 0.46433897 0.13505824 +vt 0.49378702 0.79517591 +vt 0.49378702 0.19604583 +vt 0.49452392 0.65569986 +vt 0.49452392 0.33552187 +vt 0.50445898 0.72609920 +vt 0.50445898 0.26512253 +vt 0.57497788 0.78590104 +vt 0.57497788 0.20532069 +vt 0.58146235 0.52907231 +vt 0.58146235 0.46214942 +vt 0.63597894 0.26849203 +vt 0.63597894 0.72272970 +vt 0.64258621 0.58822866 +vt 0.64258622 0.40299307 +vt 0.66169811 0.65667039 +vt 0.66169811 0.33455135 +vt 0.68301049 0.80276384 +vt 0.68301049 0.94930999 +vt 0.68467895 0.62748088 +vt 0.68467895 0.78738560 +vt 0.70303682 0.78738560 +vt 0.70748764 0.80276384 +vt 0.70748764 0.94930999 +vt 0.72139468 0.62748088 +vt 0.72139468 0.78738560 +vt 0.72795281 0.16577917 +vt 0.72894288 0.38808945 +vt 0.73196480 0.80276384 +vt 0.73196480 0.94930999 +vt 0.73541497 0.12826432 +vt 0.73541497 0.20329401 +vt 0.73640504 0.35057461 +vt 0.73640504 0.42560429 +vt 0.73975255 0.78738560 +vt 0.74717664 0.38808945 +vt 0.74719855 0.38805945 +vt 0.75325085 0.35755237 +vt 0.75325085 0.41862653 +vt 0.75327276 0.35752237 +vt 0.75327276 0.41859653 +vt 0.75644195 0.80276384 +vt 0.75644195 0.94930999 +vt 0.75666543 9.6460778e-2 +vt 0.75666543 0.23509756 +vt 0.75765549 0.31877106 +vt 0.75765549 0.45740784 +vt 0.75811042 0.78738560 +vt 0.75811042 0.62748088 +vt 0.76479093 0.16577917 +vt 0.76944896 0.14236166 +vt 0.76944896 0.18919667 +vt 0.77054871 0.33166428 +vt 0.77054871 0.44451462 +vt 0.77057062 0.33163428 +vt 0.77057062 0.44448462 +vt 0.77336611 0.38803129 +vt 0.77337205 0.38805945 +vt 0.77646828 0.78738560 +vt 0.77744798 0.36751037 +vt 0.77744798 0.40855221 +vt 0.77745391 0.36753853 +vt 0.77745391 0.40858037 +vt 0.78091911 0.80276384 +vt 0.78091911 0.94930999 +vt 0.78271391 0.12250926 +vt 0.78271391 0.20904907 +vt 0.78846897 7.5210327e-2 +vt 0.78846897 0.25634801 +vt 0.78907214 0.35011358 +vt 0.78907214 0.42594900 +vt 0.78907808 0.35014173 +vt 0.78907808 0.42597716 +vt 0.78945904 0.29752061 +vt 0.78945904 0.47865829 +vt 0.79482615 0.62748088 +vt 0.79482615 0.78738560 +vt 0.79643680 0.31436641 +vt 0.79643680 0.46181248 +vt 0.79645871 0.31433641 +vt 0.79645871 0.46178248 +vt 0.80256631 0.10924431 +vt 0.80256631 0.22231402 +vt 0.80539626 0.80276384 +vt 0.80539626 0.94930999 +vt 0.80646894 0.33848941 +vt 0.80646894 0.43757317 +vt 0.80647487 0.33851757 +vt 0.80647487 0.43760133 +vt 0.81318402 0.78738560 +vt 0.82598381 6.7748161e-2 +vt 0.82598381 0.10458628 +vt 0.82598381 0.22697205 +vt 0.82598381 0.26381017 +vt 0.82697388 0.29005844 +vt 0.82697388 0.30829221 +vt 0.82697388 0.46788669 +vt 0.82697388 0.48612046 +vt 0.82698986 0.33440754 +vt 0.82698986 0.44165503 +vt 0.82699579 0.30826221 +vt 0.82699579 0.33443570 +vt 0.82699579 0.44168319 +vt 0.82699579 0.46785669 +vt 0.82987342 0.80276384 +vt 0.82987342 0.94930999 +vt 0.83154188 0.78738560 +vt 0.83154188 0.62748088 +vt 0.84751078 0.43757317 +vt 0.84751078 0.33848941 +vt 0.84751671 0.33851757 +vt 0.84751671 0.43760133 +vt 0.84940132 0.10924431 +vt 0.84940132 0.22231402 +vt 0.84989975 0.78738560 +vt 0.85435057 0.80276384 +vt 0.85435057 0.94930999 +vt 0.85751096 0.31436641 +vt 0.85751096 0.46181248 +vt 0.85753287 0.46178248 +vt 0.85753287 0.31433641 +vt 0.86349866 7.5210327e-2 +vt 0.86349866 0.25634801 +vt 0.86448872 0.47865829 +vt 0.86448872 0.29752061 +vt 0.86490757 0.35011358 +vt 0.86490757 0.42594900 +vt 0.86491351 0.35014173 +vt 0.86491351 0.42597716 +vt 0.86825762 0.62748088 +vt 0.86825762 0.78738560 +vt 0.86925372 0.12250926 +vt 0.86925372 0.20904907 +vt 0.87653174 0.36751037 +vt 0.87653174 0.40855221 +vt 0.87653767 0.36753853 +vt 0.87653767 0.40858037 +vt 0.87882773 0.80276384 +vt 0.87882773 0.94930999 +vt 0.88061360 0.38803129 +vt 0.88061954 0.38805945 +vt 0.88251867 0.14236166 +vt 0.88251867 0.18919667 +vt 0.88339905 0.33166428 +vt 0.88339905 0.44451462 +vt 0.88342096 0.33163428 +vt 0.88342096 0.44448462 +vt 0.88626700 0.88248187 +vt 0.88661548 0.78738560 +vt 0.88717670 0.16577917 +vt 0.89530220 9.6460778e-2 +vt 0.89530220 0.23509756 +vt 0.89629227 0.31877106 +vt 0.89629227 0.45740784 +vt 0.90031750 0.84856095 +vt 0.90031750 0.91640278 +vt 0.90069692 0.35755237 +vt 0.90069692 0.41862653 +vt 0.90071883 0.35752237 +vt 0.90071883 0.41859653 +vt 0.90225747 0.88248187 +vt 0.90242398 0.88257032 +vt 0.90497335 0.78738560 +vt 0.90497335 0.62748088 +vt 0.90677112 0.38808945 +vt 0.90679303 0.38805945 +vt 0.91162447 0.85986792 +vt 0.91162447 0.90509581 +vt 0.91179098 0.85995637 +vt 0.91179098 0.90518426 +vt 0.91655265 0.12826432 +vt 0.91655265 0.20329401 +vt 0.91754272 0.35057461 +vt 0.91754272 0.42560429 +vt 0.92333121 0.78738560 +vt 0.92401482 0.16577917 +vt 0.92500489 0.38808945 +vt 0.93423841 0.83451045 +vt 0.93423841 0.85050092 +vt 0.93423841 0.91446281 +vt 0.93423841 0.93045328 +vt 0.93440492 0.85058937 +vt 0.93440492 0.91455126 +vt 0.94168908 0.62748088 +vt 0.94168908 0.78738560 +vt 0.95685236 0.85986792 +vt 0.95685236 0.90509581 +vt 0.95701886 0.85995637 +vt 0.95701886 0.90518426 +vt 0.96004695 0.78738560 +vt 0.96621936 0.88248187 +vt 0.96638586 0.88257032 +vt 0.96815933 0.84856095 +vt 0.96815933 0.91640278 +vt 0.97840481 0.78738560 +vt 0.97840481 0.62748088 +vt 0.98220983 0.88248187 +vn -0.31299576 1.4234737e-15 -0.94975452 +vn -0.29634858 -9.2746741e-2 -0.95056592 +vn -0.22186332 -0.19502671 -0.95537493 +vn -0.11074998 -0.26737411 -0.95720715 +vn 2.0671468e-31 -0.28940366 -0.95720715 +vn 0.11074998 -0.26737411 -0.95720715 +vn 0.22186332 -0.19502671 -0.95537493 +vn 0.29634858 -9.2746741e-2 -0.95056592 +vn 0.31299576 1.2002555e-15 -0.94975452 +vn 0.29634858 9.2746741e-2 -0.95056592 +vn 0.22186332 0.19502671 -0.95537493 +vn 0.11074998 0.26737411 -0.95720715 +vn 2.5455941e-17 0.28940366 -0.95720715 +vn -0.11074998 0.26737411 -0.95720715 +vn -0.22186332 0.19502671 -0.95537493 +vn -0.29634858 9.2746741e-2 -0.95056592 +vn -0.64451345 7.5121627e-15 -0.76459297 +vn -0.62738931 -0.36135380 -0.68978699 +vn -0.53921376 -0.46418715 -0.70269397 +vn -0.27039818 -0.65279895 -0.70762868 +vn 1.4288647e-17 -0.70658450 -0.70762868 +vn 0.27039818 -0.65279895 -0.70762868 +vn 0.53921376 -0.46418715 -0.70269397 +vn 0.62738931 -0.36135380 -0.68978699 +vn 0.64451345 7.2864754e-15 -0.76459297 +vn 0.62738931 0.36135380 -0.68978699 +vn 0.53921376 0.46418715 -0.70269397 +vn 0.27039818 0.65279895 -0.70762868 +vn 9.2876205e-17 0.70658450 -0.70762868 +vn -0.27039818 0.65279895 -0.70762868 +vn -0.53921376 0.46418715 -0.70269397 +vn -0.62738931 0.36135380 -0.68978699 +vn -0.80235001 1.2604785e-14 -0.59685381 +vn -0.67489933 -0.64377662 -0.36064186 +vn -0.70396873 -0.59836107 -0.38261216 +vn -0.35347784 -0.85337100 -0.38315969 +vn 2.1568586e-17 -0.92368212 -0.38315969 +vn 0.35347784 -0.85337100 -0.38315969 +vn 0.70396873 -0.59836107 -0.38261216 +vn 0.67489933 -0.64377662 -0.36064186 +vn 0.80235001 1.2711155e-14 -0.59685381 +vn 0.67489933 0.64377662 -0.36064186 +vn 0.70396873 0.59836107 -0.38261216 +vn 0.35347784 0.85337100 -0.38315969 +vn 1.6535916e-16 0.92368212 -0.38315969 +vn -0.35347784 0.85337100 -0.38315969 +vn -0.70396873 0.59836107 -0.38261216 +vn -0.67489933 0.64377662 -0.36064186 +vn -0.99902683 8.4847458e-15 -4.4106565e-2 +vn -0.65037819 -0.75958060 -6.7462446e-3 +vn -0.76145308 -0.64822003 -3.6712586e-17 +vn -0.38268343 -0.92387953 -3.6041063e-17 +vn 0.0000000e+0 -1.00000000 -1.4416425e-17 +vn 0.38268343 -0.92387953 7.2082126e-18 +vn 0.76145308 -0.64822003 7.3425173e-18 +vn 0.65037819 -0.75958060 -6.7462446e-3 +vn 0.99902683 8.3837369e-15 -4.4106565e-2 +vn 0.65037819 0.75958060 -6.7462446e-3 +vn 0.76145308 0.64822003 2.2027552e-17 +vn 0.38268343 0.92387953 4.3249275e-17 +vn 1.6578889e-16 1.00000000 2.8832850e-17 +vn -0.38268343 0.92387953 -4.3249275e-17 +vn -0.76145308 0.64822003 -3.6712586e-17 +vn -0.65037819 0.75958060 -6.7462446e-3 +vn -0.77721763 -3.8255460e-14 0.62923188 +vn -0.57258273 -0.76517442 0.29437581 +vn -0.69925290 -0.59426124 0.39736502 +vn -0.35109513 -0.84761862 0.39783778 +vn -1.4422189e-17 -0.91745578 0.39783778 +vn 0.35109513 -0.84761862 0.39783778 +vn 0.69925290 -0.59426124 0.39736502 +vn 0.57258273 -0.76517442 0.29437581 +vn 0.77721763 -3.8255460e-14 0.62923188 +vn 0.57258273 0.76517442 0.29437581 +vn 0.69925290 0.59426124 0.39736502 +vn 0.35109513 0.84761862 0.39783778 +vn 6.4899853e-17 0.91745578 0.39783778 +vn -0.35109513 0.84761862 0.39783778 +vn -0.69925290 0.59426124 0.39736502 +vn -0.57258273 0.76517442 0.29437581 +vn 3.1391822e-2 -8.1364922e-13 0.99950716 +vn -0.29101634 -0.62413512 0.72509644 +vn -0.43505155 -0.37181918 0.82004918 +vn -0.21816601 -0.52669934 0.82157860 +vn 4.2645315e-17 -0.57009526 0.82157860 +vn 0.21816601 -0.52669934 0.82157860 +vn 0.43505155 -0.37181918 0.82004918 +vn 0.29101634 -0.62413512 0.72509644 +vn -3.1391822e-2 -8.1299996e-13 0.99950716 +vn 0.29101634 0.62413512 0.72509644 +vn 0.43505155 0.37181918 0.82004918 +vn 0.21816601 0.52669934 0.82157860 +vn -8.7144773e-17 0.57009526 0.82157860 +vn -0.21816601 0.52669934 0.82157860 +vn -0.43505155 0.37181918 0.82004918 +vn -0.29101634 0.62413512 0.72509644 +vn -0.98862485 -1.2530288e-12 0.15040251 +vn -0.71938592 -0.66595235 0.19746232 +vn -0.68651294 -0.66259154 0.29945358 +vn -0.36456699 -0.88014257 0.30403941 +vn 9.0817540e-17 -0.95265946 0.30403941 +vn 0.36456699 -0.88014257 0.30403941 +vn 0.68651294 -0.66259154 0.29945358 +vn 0.71938592 -0.66595235 0.19746232 +vn 0.98862485 -1.2524689e-12 0.15040251 +vn 0.71938592 0.66595235 0.19746232 +vn 0.68651294 0.66259154 0.29945358 +vn 0.36456699 0.88014257 0.30403941 +vn 1.2973934e-17 0.95265946 0.30403941 +vn -0.36456699 0.88014257 0.30403941 +vn -0.68651294 0.66259154 0.29945358 +vn -0.71938592 0.66595235 0.19746232 +vn 0.87946522 -3.1705515e-16 -0.47596315 +vn 0.62187582 -0.62187582 -0.47596315 +vn -6.4519183e-16 -0.87946522 -0.47596315 +vn -0.62187582 -0.62187582 -0.47596315 +vn -0.87946522 4.2274020e-16 -0.47596315 +vn -0.62187582 0.62187582 -0.47596315 +vn 2.5313109e-16 0.87946522 -0.47596315 +vn 0.62187582 0.62187582 -0.47596315 +vn -0.67859834 4.4850818e-16 -0.73450956 +vn -0.47984149 0.47984149 -0.73450956 +vn 4.4850818e-16 0.67859834 -0.73450956 +vn 0.47984149 0.47984149 -0.73450956 +vn 0.67859834 -2.2425409e-16 -0.73450956 +vn 0.47984149 -0.47984149 -0.73450956 +vn -3.0580103e-16 -0.67859834 -0.73450956 +vn -0.47984149 -0.47984149 -0.73450956 +vn 0.67859834 -2.4464083e-16 -0.73450956 +vn 0.47984149 -0.47984149 -0.73450956 +vn -4.0773471e-16 -0.67859834 -0.73450956 +vn -0.47984149 -0.47984149 -0.73450956 +vn -0.67859834 3.2618777e-16 -0.73450956 +vn -0.47984149 0.47984149 -0.73450956 +vn 2.8541430e-16 0.67859834 -0.73450956 +vn 0.47984149 0.47984149 -0.73450956 +vn -0.67859834 4.4850818e-16 -0.73450956 +vn -0.47984149 0.47984149 -0.73450956 +vn 4.4850818e-16 0.67859834 -0.73450956 +vn 0.47984149 0.47984149 -0.73450956 +vn 0.67859834 -2.2425409e-16 -0.73450956 +vn 0.47984149 -0.47984149 -0.73450956 +vn -3.0580103e-16 -0.67859834 -0.73450956 +vn -0.47984149 -0.47984149 -0.73450956 +vn -0.41317149 -0.17114123 -0.89442719 +vn -0.17114123 -0.41317149 -0.89442719 +vn 0.17114123 -0.41317149 -0.89442719 +vn 0.41317149 -0.17114123 -0.89442719 +vn 0.41317149 0.17114123 -0.89442719 +vn 0.17114123 0.41317149 -0.89442719 +vn -0.17114123 0.41317149 -0.89442719 +vn -0.41317149 0.17114123 -0.89442719 +vn -0.99249911 1.0280109e-16 0.12225188 +vn -0.91694961 -0.37981297 0.12225188 +vn -0.70180285 -0.70180285 0.12225188 +vn -0.37981297 -0.91694961 0.12225188 +vn -1.0280109e-17 -0.99249911 0.12225188 +vn 0.37981297 -0.91694961 0.12225188 +vn 0.70180285 -0.70180285 0.12225188 +vn 0.91694961 -0.37981297 0.12225188 +vn 0.99249911 -6.6820711e-17 0.12225188 +vn 0.91694961 0.37981297 0.12225188 +vn 0.70180285 0.70180285 0.12225188 +vn 0.37981297 0.91694961 0.12225188 +vn 2.3130246e-16 0.99249911 0.12225188 +vn -0.37981297 0.91694961 0.12225188 +vn -0.70180285 0.70180285 0.12225188 +vn -0.91694961 0.37981297 0.12225188 +vn 0.21397346 -8.8630710e-2 0.97281034 +vn 0.23160321 4.3432553e-17 0.97281034 +vn 0.21397346 8.8630710e-2 0.97281034 +vn 0.16376820 0.16376820 0.97281034 +vn 8.8630710e-2 0.21397346 0.97281034 +vn 9.7723244e-17 0.23160321 0.97281034 +vn -8.8630710e-2 0.21397346 0.97281034 +vn -0.16376820 0.16376820 0.97281034 +vn -0.21397346 8.8630710e-2 0.97281034 +vn -0.23160321 -5.4290691e-17 0.97281034 +vn -0.21397346 -8.8630710e-2 0.97281034 +vn -0.16376820 -0.16376820 0.97281034 +vn -8.8630710e-2 -0.21397346 0.97281034 +vn 2.1716276e-17 -0.23160321 0.97281034 +vn 8.8630710e-2 -0.21397346 0.97281034 +vn 0.16376820 -0.16376820 0.97281034 +vn 0.63148595 -0.26157005 0.72993603 +vn 0.68351547 1.0772260e-17 0.72993603 +vn 0.63148595 0.26157005 0.72993603 +vn 0.48331842 0.48331842 0.72993603 +vn 0.26157005 0.63148595 0.72993603 +vn 9.6950342e-17 0.68351547 0.72993603 +vn -0.26157005 0.63148595 0.72993603 +vn -0.48331842 0.48331842 0.72993603 +vn -0.63148595 0.26157005 0.72993603 +vn -0.68351547 -3.2316781e-17 0.72993603 +vn -0.63148595 -0.26157005 0.72993603 +vn -0.48331842 -0.48331842 0.72993603 +vn -0.26157005 -0.63148595 0.72993603 +vn -9.6950342e-17 -0.68351547 0.72993603 +vn 0.26157005 -0.63148595 0.72993603 +vn 0.48331842 -0.48331842 0.72993603 +g bird_bird +usemtl bird +s 1 +f 1/123/1 17/135/17 32/127/32 16/111/16 +f 1/22/1 121/24/121 145/42/145 2/34/2 +f 2/34/2 18/18/18 17/9/17 1/22/1 +f 2/34/2 145/42/145 128/48/128 3/44/3 +f 3/44/3 19/38/19 18/18/18 2/34/2 +f 3/44/3 128/48/128 146/64/146 4/60/4 +f 4/60/4 20/56/20 19/38/19 3/44/3 +f 4/60/4 146/64/146 127/78/127 5/75/5 +f 5/75/5 21/80/21 20/56/20 4/60/4 +f 5/75/5 127/78/127 147/82/147 6/86/6 +f 6/86/6 22/90/22 21/80/21 5/75/5 +f 6/86/6 147/82/147 126/98/126 7/102/7 +f 7/102/7 23/108/23 22/90/22 6/86/6 +f 7/102/7 126/98/126 148/104/148 8/112/8 +f 8/112/8 24/128/24 23/108/23 7/102/7 +f 8/112/8 148/104/148 125/122/125 9/124/9 +f 9/124/9 25/136/25 24/128/24 8/112/8 +f 9/21/9 125/23/125 149/41/149 10/33/10 +f 10/33/10 26/17/26 25/10/25 9/21/9 +f 10/33/10 149/41/149 124/47/124 11/43/11 +f 11/43/11 27/37/27 26/17/26 10/33/10 +f 11/43/11 124/47/124 150/63/150 12/59/12 +f 12/59/12 28/55/28 27/37/27 11/43/11 +f 12/59/12 150/63/150 123/65/123 13/66/13 +f 13/66/13 29/68/29 28/55/28 12/59/12 +f 13/66/13 123/65/123 151/81/151 14/85/14 +f 14/85/14 30/89/30 29/68/29 13/66/13 +f 14/85/14 151/81/151 122/97/122 15/101/15 +f 15/101/15 31/107/31 30/89/30 14/85/14 +f 15/101/15 122/97/122 152/103/152 16/111/16 +f 16/111/16 32/127/32 31/107/31 15/101/15 +f 16/111/16 152/103/152 121/121/121 1/123/1 +f 17/135/17 33/140/33 48/129/48 32/127/32 +f 18/18/18 34/16/34 33/6/33 17/9/17 +f 19/38/19 35/30/35 34/16/34 18/18/18 +f 20/56/20 36/52/36 35/30/35 19/38/19 +f 21/80/21 37/73/37 36/52/36 20/56/20 +f 22/90/22 38/94/38 37/73/37 21/80/21 +f 23/108/23 39/116/39 38/94/38 22/90/22 +f 24/128/24 40/130/40 39/116/39 23/108/23 +f 25/136/25 41/139/41 40/130/40 24/128/24 +f 26/17/26 42/15/42 41/5/41 25/10/25 +f 27/37/27 43/29/43 42/15/42 26/17/26 +f 28/55/28 44/51/44 43/29/43 27/37/27 +f 29/68/29 45/67/45 44/51/44 28/55/28 +f 30/89/30 46/93/46 45/67/45 29/68/29 +f 31/107/31 47/115/47 46/93/46 30/89/30 +f 32/127/32 48/129/48 47/115/47 31/107/31 +f 33/140/33 49/143/49 64/133/64 48/129/48 +f 34/16/34 50/12/50 49/1/49 33/6/33 +f 35/30/35 51/26/51 50/12/50 34/16/34 +f 36/52/36 52/50/52 51/26/51 35/30/35 +f 37/73/37 53/79/53 52/50/52 36/52/36 +f 38/94/38 54/96/54 53/79/53 37/73/37 +f 39/116/39 55/120/55 54/96/54 38/94/38 +f 40/130/40 56/134/56 55/120/55 39/116/39 +f 41/139/41 57/144/57 56/134/56 40/130/40 +f 42/15/42 58/11/58 57/2/57 41/5/41 +f 43/29/43 59/25/59 58/11/58 42/15/42 +f 44/51/44 60/49/60 59/25/59 43/29/43 +f 45/67/45 61/69/61 60/49/60 44/51/44 +f 46/93/46 62/95/62 61/69/61 45/67/45 +f 47/115/47 63/119/63 62/95/62 46/93/46 +f 48/129/48 64/133/64 63/119/63 47/115/47 +f 49/143/49 65/141/65 80/131/80 64/133/64 +f 50/12/50 66/14/66 65/4/65 49/1/49 +f 51/26/51 67/32/67 66/14/66 50/12/50 +f 52/50/52 68/54/68 67/32/67 51/26/51 +f 53/79/53 69/74/69 68/54/68 52/50/52 +f 54/96/54 70/92/70 69/74/69 53/79/53 +f 55/120/55 71/114/71 70/92/70 54/96/54 +f 56/134/56 72/132/72 71/114/71 55/120/55 +f 57/144/57 73/142/73 72/132/72 56/134/56 +f 58/11/58 74/13/74 73/3/73 57/2/57 +f 59/25/59 75/31/75 74/13/74 58/11/58 +f 60/49/60 76/53/76 75/31/75 59/25/59 +f 61/69/61 77/70/77 76/53/76 60/49/60 +f 62/95/62 78/91/78 77/70/77 61/69/61 +f 63/119/63 79/113/79 78/91/78 62/95/62 +f 64/133/64 80/131/80 79/113/79 63/119/63 +f 65/141/65 81/137/81 96/125/96 80/131/80 +f 66/14/66 82/20/82 81/8/81 65/4/65 +f 67/32/67 83/40/83 82/20/82 66/14/66 +f 68/54/68 84/58/84 83/40/83 67/32/67 +f 69/74/69 85/77/85 84/58/84 68/54/68 +f 70/92/70 86/88/86 85/77/85 69/74/69 +f 71/114/71 87/106/87 86/88/86 70/92/70 +f 72/132/72 88/126/88 87/106/87 71/114/71 +f 73/142/73 89/138/89 88/126/88 72/132/72 +f 74/13/74 90/19/90 89/7/89 73/3/73 +f 75/31/75 91/39/91 90/19/90 74/13/74 +f 76/53/76 92/57/92 91/39/91 75/31/75 +f 77/70/77 93/71/93 92/57/92 76/53/76 +f 78/91/78 94/87/94 93/71/93 77/70/77 +f 79/113/79 95/105/95 94/87/94 78/91/78 +f 80/131/80 96/125/96 95/105/95 79/113/79 +f 81/137/81 97/117/97 112/109/112 96/125/96 +f 82/20/82 98/36/98 97/28/97 81/8/81 +f 83/40/83 99/46/99 98/36/98 82/20/82 +f 84/58/84 100/62/100 99/46/99 83/40/83 +f 85/77/85 101/76/101 100/62/100 84/58/84 +f 86/88/86 102/84/102 101/76/101 85/77/85 +f 87/106/87 103/100/103 102/84/102 86/88/86 +f 88/126/88 104/110/104 103/100/103 87/106/87 +f 89/138/89 105/118/105 104/110/104 88/126/88 +f 90/19/90 106/35/106 105/27/105 89/7/89 +f 91/39/91 107/45/107 106/35/106 90/19/90 +f 92/57/92 108/61/108 107/45/107 91/39/91 +f 93/71/93 109/72/109 108/61/108 92/57/92 +f 94/87/94 110/83/110 109/72/109 93/71/93 +f 95/105/95 111/99/111 110/83/110 94/87/94 +f 96/125/96 112/109/112 111/99/111 95/105/95 +f 97/277/97 153/303/153 168/299/168 112/270/112 +f 98/269/98 154/298/154 153/303/153 97/277/97 +f 99/259/99 155/278/155 154/298/154 98/269/98 +f 100/240/100 156/249/156 155/278/155 99/259/99 +f 101/219/101 157/218/157 156/249/156 100/240/100 +f 102/209/102 158/195/158 157/218/157 101/219/101 +f 103/193/103 159/171/159 158/195/158 102/209/102 +f 104/178/104 160/158/160 159/171/159 103/193/103 +f 105/177/105 161/154/161 160/158/160 104/178/104 +f 106/179/106 162/159/162 161/154/161 105/177/105 +f 107/194/107 163/172/163 162/159/162 106/179/106 +f 108/210/108 164/196/164 163/172/163 107/194/107 +f 109/220/109 165/221/165 164/196/164 108/210/108 +f 110/241/110 166/250/166 165/221/165 109/220/109 +f 111/260/111 167/279/167 166/250/166 110/241/110 +f 112/270/112 168/299/168 167/279/167 111/260/111 +f 113/146/113 129/145/129 130/150/130 114/151/114 +f 114/316/114 115/310/115 116/297/116 117/289/117 118/296/118 119/309/119 120/315/120 113/319/113 +f 114/151/114 130/150/130 131/156/131 115/157/115 +f 115/157/115 131/156/131 132/169/132 116/170/116 +f 116/170/116 132/169/132 133/191/133 117/192/117 +f 117/192/117 133/191/133 134/211/134 118/212/118 +f 118/212/118 134/211/134 135/232/135 119/233/119 +f 119/233/119 135/232/135 136/243/136 120/244/120 +f 120/244/120 136/243/136 129/265/129 113/266/113 +f 121/148/121 137/147/137 144/152/144 128/153/128 145/149/145 +f 129/318/129 137/324/137 138/321/138 130/314/130 +f 130/314/130 138/321/138 139/308/139 131/307/131 +f 131/307/131 139/308/139 140/283/140 132/295/132 +f 132/295/132 140/283/140 141/275/141 133/288/133 +f 133/288/133 141/275/141 142/282/142 134/294/134 +f 134/294/134 142/282/142 143/305/143 135/306/135 +f 135/306/135 143/305/143 144/320/144 136/313/136 +f 136/313/136 144/320/144 137/324/137 129/318/129 +f 146/162/146 128/153/128 144/152/144 143/176/143 127/175/127 +f 147/186/147 127/175/127 143/176/143 142/203/142 126/204/126 +f 148/217/148 126/204/126 142/203/142 141/235/141 125/234/125 +f 149/242/149 125/234/125 141/235/141 140/257/140 124/258/124 +f 150/276/150 124/258/124 140/257/140 139/291/139 123/290/123 +f 151/302/151 123/290/123 139/291/139 138/311/138 122/312/122 +f 152/317/152 122/312/122 138/311/138 137/323/137 121/322/121 +f 153/304/153 170/292/170 169/284/169 168/300/168 +f 154/301/154 171/285/171 170/292/170 153/304/153 +f 155/281/155 172/272/172 171/285/171 154/301/154 +f 156/251/156 173/246/173 172/272/172 155/281/155 +f 157/225/157 174/224/174 173/246/173 156/251/156 +f 158/202/158 175/206/175 174/224/174 157/225/157 +f 159/174/159 176/181/176 175/206/175 158/202/158 +f 160/161/160 177/166/177 176/181/176 159/174/159 +f 161/155/161 178/163/178 177/166/177 160/161/160 +f 162/160/162 179/165/179 178/163/178 161/155/161 +f 163/173/163 180/180/180 179/165/179 162/160/162 +f 164/201/164 181/205/181 180/180/180 163/173/163 +f 165/222/165 182/223/182 181/205/181 164/201/164 +f 166/252/166 183/245/183 182/223/182 165/222/165 +f 167/280/167 184/271/184 183/245/183 166/252/166 +f 168/300/168 169/284/169 184/271/184 167/280/167 +f 169/286/169 185/263/185 200/255/200 184/273/184 +f 170/293/170 186/268/186 185/263/185 169/286/169 +f 171/287/171 187/264/187 186/268/186 170/293/170 +f 172/274/172 188/256/188 187/264/187 171/287/171 +f 173/247/173 189/239/189 188/256/188 172/274/172 +f 174/231/174 190/230/190 189/239/189 173/247/173 +f 175/208/175 191/216/191 190/230/190 174/231/174 +f 176/183/176 192/200/192 191/216/191 175/208/175 +f 177/168/177 193/190/193 192/200/192 176/183/176 +f 178/164/178 194/185/194 193/190/193 177/168/177 +f 179/167/179 195/189/195 194/185/194 178/164/178 +f 180/182/180 196/199/196 195/189/195 179/167/179 +f 181/207/181 197/215/197 196/199/196 180/182/180 +f 182/228/182 198/229/198 197/215/197 181/207/181 +f 183/248/183 199/238/199 198/229/198 182/228/182 +f 184/273/184 200/255/200 199/238/199 183/248/183 +f 186/267/186 187/262/187 188/254/188 189/236/189 190/227/190 191/214/191 192/198/192 193/188/193 194/184/194 195/187/195 196/197/196 197/213/197 198/226/198 199/237/199 200/253/200 185/261/185 diff --git a/res/models/ships/bird/bird.png b/res/models/ships/bird/bird.png new file mode 100644 index 0000000..06409ac Binary files /dev/null and b/res/models/ships/bird/bird.png differ diff --git a/res/models/ships/burger/burger.mtl b/res/models/ships/burger/burger.mtl new file mode 100644 index 0000000..a2627db --- /dev/null +++ b/res/models/ships/burger/burger.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl burger +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd burger.png + diff --git a/res/models/ships/burger/burger.obj b/res/models/ships/burger/burger.obj new file mode 100644 index 0000000..52f7aab --- /dev/null +++ b/res/models/ships/burger/burger.obj @@ -0,0 +1,1524 @@ +# Exported from Wings 3D 1.4.1 +mtllib burger.mtl +o burger +#354 vertices, 400 faces +v 0.23931566 0.59070902 0.0000000e+0 +v 0.22109884 0.59070902 9.1582140e-2 +v 0.16922173 0.59070902 0.16922173 +v 9.1582140e-2 0.59070902 0.22109884 +v 1.4653374e-17 0.59070902 0.23931566 +v -9.1582140e-2 0.59070902 0.22109884 +v -0.16922173 0.59070902 0.16922173 +v -0.22109884 0.59070902 9.1582140e-2 +v -0.23931566 0.59070902 2.9306748e-17 +v -0.22109884 0.59070902 -9.1582140e-2 +v -0.16922173 0.59070902 -0.16922173 +v -9.1582140e-2 0.59070902 -0.22109884 +v -4.3960122e-17 0.59070902 -0.23931566 +v 9.1582140e-2 0.59070902 -0.22109884 +v 0.16922173 0.59070902 -0.16922173 +v 0.22109884 0.59070902 -9.1582140e-2 +v 0.46472317 0.54882099 0.0000000e+0 +v 0.42934823 0.54882099 0.17784186 +v 0.32860891 0.54882099 0.32860891 +v 0.17784186 0.54882099 0.42934823 +v 2.8455147e-17 0.54882099 0.46472317 +v -0.17784186 0.54882099 0.42934823 +v -0.32860891 0.54882099 0.32860891 +v -0.42934823 0.54882099 0.17784186 +v -0.46472317 0.54882099 5.6910295e-17 +v -0.42934823 0.54882099 -0.17784186 +v -0.32860891 0.54882099 -0.32860891 +v -0.17784186 0.54882099 -0.42934823 +v -8.5365442e-17 0.54882099 -0.46472317 +v 0.17784186 0.54882099 -0.42934823 +v 0.32860891 0.54882099 -0.32860891 +v 0.42934823 0.54882099 -0.17784186 +v 0.66312266 0.48171780 0.0000000e+0 +v 0.61264545 0.48171780 0.25376605 +v 0.46889853 0.48171780 0.46889853 +v 0.25376605 0.48171780 0.61264545 +v 4.0603211e-17 0.48171780 0.66312266 +v -0.25376605 0.48171780 0.61264545 +v -0.46889853 0.48171780 0.46889853 +v -0.61264545 0.48171780 0.25376605 +v -0.66312266 0.48171780 8.1206422e-17 +v -0.61264545 0.48171780 -0.25376605 +v -0.46889853 0.48171780 -0.46889853 +v -0.25376605 0.48171780 -0.61264545 +v -1.2180963e-16 0.48171780 -0.66312266 +v 0.25376605 0.48171780 -0.61264545 +v 0.46889853 0.48171780 -0.46889853 +v 0.61264545 0.48171780 -0.25376605 +v 0.82298387 0.39329926 0.0000000e+0 +v 0.76033795 0.39329926 0.31494229 +v 0.58193747 0.39329926 0.58193747 +v 0.31494229 0.39329926 0.76033795 +v 5.0391564e-17 0.39329926 0.82298387 +v -0.31494229 0.39329926 0.76033795 +v -0.58193747 0.39329926 0.58193747 +v -0.76033795 0.39329926 0.31494229 +v -0.82298387 0.39329926 1.0078313e-16 +v -0.76033795 0.39329926 -0.31494229 +v -0.58193747 0.39329926 -0.58193747 +v -0.31494229 0.39329926 -0.76033795 +v -1.5117469e-16 0.39329926 -0.82298387 +v 0.31494229 0.39329926 -0.76033795 +v 0.58193747 0.39329926 -0.58193747 +v 0.76033795 0.39329926 -0.31494229 +v 0.93501624 0.28870393 0.0000000e+0 +v 0.86384237 0.28870393 0.35781523 +v 0.66115633 0.28870393 0.66115633 +v 0.35781523 0.28870393 0.86384237 +v 5.7251342e-17 0.28870393 0.93501624 +v -0.35781523 0.28870393 0.86384237 +v -0.66115633 0.28870393 0.66115633 +v -0.86384237 0.28870393 0.35781523 +v -0.93501624 0.28870393 1.1450268e-16 +v -0.86384237 0.28870393 -0.35781523 +v -0.66115633 0.28870393 -0.66115633 +v -0.35781523 0.28870393 -0.86384237 +v -1.7175402e-16 0.28870393 -0.93501624 +v 0.35781523 0.28870393 -0.86384237 +v 0.66115633 0.28870393 -0.66115633 +v 0.86384237 0.28870393 -0.35781523 +v 0.93501624 -0.27629121 0.0000000e+0 +v 0.86384237 -0.27629121 0.35781523 +v 0.66115633 -0.27629121 0.66115633 +v 0.35781523 -0.27629121 0.86384237 +v 5.7251342e-17 -0.27629121 0.93501624 +v -0.35781523 -0.27629121 0.86384237 +v -0.66115633 -0.27629121 0.66115633 +v -0.86384237 -0.27629121 0.35781523 +v -0.93501624 -0.27629121 1.1450268e-16 +v -0.86384237 -0.27629121 -0.35781523 +v -0.66115633 -0.27629121 -0.66115633 +v -0.35781523 -0.27629121 -0.86384237 +v -1.7175402e-16 -0.27629121 -0.93501624 +v 0.35781523 -0.27629121 -0.86384237 +v 0.66115633 -0.27629121 -0.66115633 +v 0.86384237 -0.27629121 -0.35781523 +v 0.82298387 -0.38088654 0.0000000e+0 +v 0.76033795 -0.38088654 0.31494229 +v 0.58193747 -0.38088654 0.58193747 +v 0.31494229 -0.38088654 0.76033795 +v 5.0391564e-17 -0.38088654 0.82298387 +v -0.31494229 -0.38088654 0.76033795 +v -0.58193747 -0.38088654 0.58193747 +v -0.76033795 -0.38088654 0.31494229 +v -0.82298387 -0.38088654 1.0078313e-16 +v -0.76033795 -0.38088654 -0.31494229 +v -0.58193747 -0.38088654 -0.58193747 +v -0.31494229 -0.38088654 -0.76033795 +v -1.5117469e-16 -0.38088654 -0.82298387 +v 0.31494229 -0.38088654 -0.76033795 +v 0.58193747 -0.38088654 -0.58193747 +v 0.76033795 -0.38088654 -0.31494229 +v 0.66312266 -0.46930508 0.0000000e+0 +v 0.61264545 -0.46930508 0.25376605 +v 0.46889853 -0.46930508 0.46889853 +v 0.25376605 -0.46930508 0.61264545 +v 4.0603211e-17 -0.46930508 0.66312266 +v -0.25376605 -0.46930508 0.61264545 +v -0.46889853 -0.46930508 0.46889853 +v -0.61264545 -0.46930508 0.25376605 +v -0.66312266 -0.46930508 8.1206422e-17 +v -0.61264545 -0.46930508 -0.25376605 +v -0.46889853 -0.46930508 -0.46889853 +v -0.25376605 -0.46930508 -0.61264545 +v -1.2180963e-16 -0.46930508 -0.66312266 +v 0.25376605 -0.46930508 -0.61264545 +v 0.46889853 -0.46930508 -0.46889853 +v 0.61264545 -0.46930508 -0.25376605 +v 0.46472317 -0.53640827 0.0000000e+0 +v 0.42934823 -0.53640827 0.17784186 +v 0.32860891 -0.53640827 0.32860891 +v 0.17784186 -0.53640827 0.42934823 +v 2.8455147e-17 -0.53640827 0.46472317 +v -0.17784186 -0.53640827 0.42934823 +v -0.32860891 -0.53640827 0.32860891 +v -0.42934823 -0.53640827 0.17784186 +v -0.46472317 -0.53640827 5.6910295e-17 +v -0.42934823 -0.53640827 -0.17784186 +v -0.32860891 -0.53640827 -0.32860891 +v -0.17784186 -0.53640827 -0.42934823 +v -8.5365442e-17 -0.53640827 -0.46472317 +v 0.17784186 -0.53640827 -0.42934823 +v 0.32860891 -0.53640827 -0.32860891 +v 0.42934823 -0.53640827 -0.17784186 +v 0.23931566 -0.57829631 0.0000000e+0 +v 0.22109884 -0.57829631 9.1582140e-2 +v 0.16922173 -0.57829631 0.16922173 +v 9.1582140e-2 -0.57829631 0.22109884 +v 1.4653374e-17 -0.57829631 0.23931566 +v -9.1582140e-2 -0.57829631 0.22109884 +v -0.16922173 -0.57829631 0.16922173 +v -0.22109884 -0.57829631 9.1582140e-2 +v -0.23931566 -0.57829631 2.9306748e-17 +v -0.22109884 -0.57829631 -9.1582140e-2 +v -0.16922173 -0.57829631 -0.16922173 +v -9.1582140e-2 -0.57829631 -0.22109884 +v -4.3960122e-17 -0.57829631 -0.23931566 +v 9.1582140e-2 -0.57829631 -0.22109884 +v 0.16922173 -0.57829631 -0.16922173 +v 0.22109884 -0.57829631 -9.1582140e-2 +v 0.0000000e+0 0.60494753 0.0000000e+0 +v 0.0000000e+0 -0.59253482 0.0000000e+0 +v 0.98451429 0.19030140 0.0000000e+0 +v 0.90957261 0.19030140 0.37675731 +v 0.69615673 0.19030140 0.69615673 +v 0.37675731 0.19030140 0.90957261 +v 6.0282123e-17 0.19030140 0.98451429 +v -0.37675731 0.19030140 0.90957261 +v -0.69615673 0.19030140 0.69615673 +v -0.90957261 0.19030140 0.37675731 +v -0.98451429 0.19030140 1.2056425e-16 +v -0.90957261 0.19030140 -0.37675731 +v -0.69615673 0.19030140 -0.69615673 +v -0.37675731 0.19030140 -0.90957261 +v -1.8084637e-16 0.19030140 -0.98451429 +v 0.37675731 0.19030140 -0.90957261 +v 0.69615673 0.19030140 -0.69615673 +v 0.90957261 0.19030140 -0.37675731 +v 0.98451429 -0.17788868 0.0000000e+0 +v 0.90957261 -0.17788868 0.37675731 +v 0.69615673 -0.17788868 0.69615673 +v 0.37675731 -0.17788868 0.90957261 +v 6.0282123e-17 -0.17788868 0.98451429 +v -0.37675731 -0.17788868 0.90957261 +v -0.69615673 -0.17788868 0.69615673 +v -0.90957261 -0.17788868 0.37675731 +v -0.98451429 -0.17788868 1.2056425e-16 +v -0.90957261 -0.17788868 -0.37675731 +v -0.69615673 -0.17788868 -0.69615673 +v -0.37675731 -0.17788868 -0.90957261 +v -1.8084637e-16 -0.17788868 -0.98451429 +v 0.37675731 -0.17788868 -0.90957261 +v 0.69615673 -0.17788868 -0.69615673 +v 0.90957261 -0.17788868 -0.37675731 +v 0.77040046 -7.3882244e-2 0.31911032 +v 0.83387545 -7.3882244e-2 2.0226964e-17 +v 0.77040046 -7.3882244e-2 -0.31911032 +v 0.58963899 -7.3882244e-2 -0.58963899 +v 0.31911032 -7.3882244e-2 -0.77040046 +v -1.5987723e-16 -7.3882244e-2 -0.83387545 +v -0.31911032 -7.3882244e-2 -0.77040046 +v -0.58963899 -7.3882244e-2 -0.58963899 +v -0.77040046 -7.3882244e-2 -0.31911032 +v -0.83387545 -7.3882244e-2 1.0134080e-16 +v -0.77040046 -7.3882244e-2 0.31911032 +v -0.58963899 -7.3882244e-2 0.58963899 +v -0.31911032 -7.3882244e-2 0.77040046 +v 6.0783880e-17 -7.3882244e-2 0.83387545 +v 0.31911032 -7.3882244e-2 0.77040046 +v 0.58963899 -7.3882244e-2 0.58963899 +v 0.77040046 8.6294962e-2 -0.31911032 +v 0.83387545 8.6294962e-2 2.0226964e-17 +v 0.77040046 8.6294962e-2 0.31911032 +v 0.58963899 8.6294962e-2 0.58963899 +v 0.31911032 8.6294962e-2 0.77040046 +v 6.0783880e-17 8.6294962e-2 0.83387545 +v -0.31911032 8.6294962e-2 0.77040046 +v -0.58963899 8.6294962e-2 0.58963899 +v -0.77040046 8.6294962e-2 0.31911032 +v -0.83387545 8.6294962e-2 1.0134080e-16 +v -0.77040046 8.6294962e-2 -0.31911032 +v -0.58963899 8.6294962e-2 -0.58963899 +v -0.31911032 8.6294962e-2 -0.77040046 +v -1.5987723e-16 8.6294962e-2 -0.83387545 +v 0.31911032 8.6294962e-2 -0.77040046 +v 0.58963899 8.6294962e-2 -0.58963899 +v -0.95098522 0.12053668 -3.4241719e-2 +v -0.89169952 0.12053668 -0.33229106 +v -0.80946656 0.12053668 -0.29822906 +v -0.86197691 0.12053668 -3.4241719e-2 +v -0.89169952 -0.10812396 -0.33229106 +v -0.95098522 -0.10812396 -3.4241719e-2 +v -0.86197691 -0.10812396 -3.4241719e-2 +v -0.80946656 -0.10812396 -0.29822906 +v -0.69666065 -0.10812396 -0.64823555 +v -0.86549204 -0.10812396 -0.39556151 +v -0.78325908 -0.10812396 -0.36149950 +v -0.63372227 -0.10812396 -0.58529716 +v -3.4241719e-2 0.12053668 0.95098522 +v -0.33229106 0.12053668 0.89169952 +v -0.29822906 0.12053668 0.80946656 +v -3.4241719e-2 0.12053668 0.86197691 +v -0.86549204 -0.10812396 0.39556151 +v -0.69666065 -0.10812396 0.64823555 +v -0.63372227 -0.10812396 0.58529716 +v -0.78325908 -0.10812396 0.36149950 +v 0.33229106 0.12053668 0.89169952 +v 3.4241719e-2 0.12053668 0.95098522 +v 3.4241719e-2 0.12053668 0.86197691 +v 0.29822906 0.12053668 0.80946656 +v 3.4241719e-2 0.12053668 -0.95098522 +v 0.33229106 0.12053668 -0.89169952 +v 0.29822906 0.12053668 -0.80946656 +v 3.4241719e-2 0.12053668 -0.86197691 +v 0.89169952 -0.10812396 0.33229106 +v 0.95098522 -0.10812396 3.4241719e-2 +v 0.86197691 -0.10812396 3.4241719e-2 +v 0.80946656 -0.10812396 0.29822906 +v -3.4241719e-2 -0.10812396 -0.95098522 +v -0.33229106 -0.10812396 -0.89169952 +v -0.29822906 -0.10812396 -0.80946656 +v -3.4241719e-2 -0.10812396 -0.86197691 +v 0.64823555 0.12053668 0.69666065 +v 0.39556151 0.12053668 0.86549204 +v 0.36149950 0.12053668 0.78325908 +v 0.58529716 0.12053668 0.63372227 +v 0.39556151 -0.10812396 0.86549204 +v 0.64823555 -0.10812396 0.69666065 +v 0.58529716 -0.10812396 0.63372227 +v 0.36149950 -0.10812396 0.78325908 +v -0.69666065 0.12053668 0.64823555 +v -0.86549204 0.12053668 0.39556151 +v -0.78325908 0.12053668 0.36149950 +v -0.63372227 0.12053668 0.58529716 +v -0.95098522 -0.10812396 3.4241719e-2 +v -0.89169952 -0.10812396 0.33229106 +v -0.80946656 -0.10812396 0.29822906 +v -0.86197691 -0.10812396 3.4241719e-2 +v 0.95098522 -0.10812396 -3.4241719e-2 +v 0.89169952 -0.10812396 -0.33229106 +v 0.80946656 -0.10812396 -0.29822906 +v 0.86197691 -0.10812396 -3.4241719e-2 +v 0.33229106 -0.10812396 -0.89169952 +v 3.4241719e-2 -0.10812396 -0.95098522 +v 3.4241719e-2 -0.10812396 -0.86197691 +v 0.29822906 -0.10812396 -0.80946656 +v -0.64823555 0.12053668 -0.69666065 +v -0.39556151 0.12053668 -0.86549204 +v -0.36149950 0.12053668 -0.78325908 +v -0.58529716 0.12053668 -0.63372227 +v -0.39556151 -0.10812396 -0.86549204 +v -0.64823555 -0.10812396 -0.69666065 +v -0.58529716 -0.10812396 -0.63372227 +v -0.36149950 -0.10812396 -0.78325908 +v 0.86549204 0.12053668 0.39556151 +v 0.69666065 0.12053668 0.64823555 +v 0.63372227 0.12053668 0.58529716 +v 0.78325908 0.12053668 0.36149950 +v 3.4241719e-2 -0.10812396 0.95098522 +v 0.33229106 -0.10812396 0.89169952 +v 0.29822906 -0.10812396 0.80946656 +v 3.4241719e-2 -0.10812396 0.86197691 +v 0.69666065 0.12053668 -0.64823555 +v 0.86549204 0.12053668 -0.39556151 +v 0.78325908 0.12053668 -0.36149950 +v 0.63372227 0.12053668 -0.58529716 +v -0.33229106 0.12053668 -0.89169952 +v -3.4241719e-2 0.12053668 -0.95098522 +v -3.4241719e-2 0.12053668 -0.86197691 +v -0.29822906 0.12053668 -0.80946656 +v -0.39556151 0.12053668 0.86549204 +v -0.64823555 0.12053668 0.69666065 +v -0.58529716 0.12053668 0.63372227 +v -0.36149950 0.12053668 0.78325908 +v -0.64823555 -0.10812396 0.69666065 +v -0.39556151 -0.10812396 0.86549204 +v -0.36149950 -0.10812396 0.78325908 +v -0.58529716 -0.10812396 0.63372227 +v -0.86549204 0.12053668 -0.39556151 +v -0.69666065 0.12053668 -0.64823555 +v -0.63372227 0.12053668 -0.58529716 +v -0.78325908 0.12053668 -0.36149950 +v 0.95098522 0.12053668 3.4241719e-2 +v 0.89169952 0.12053668 0.33229106 +v 0.80946656 0.12053668 0.29822906 +v 0.86197691 0.12053668 3.4241719e-2 +v 0.86549204 -0.10812396 -0.39556151 +v 0.69666065 -0.10812396 -0.64823555 +v 0.63372227 -0.10812396 -0.58529716 +v 0.78325908 -0.10812396 -0.36149950 +v 0.69666065 -0.10812396 0.64823555 +v 0.86549204 -0.10812396 0.39556151 +v 0.78325908 -0.10812396 0.36149950 +v 0.63372227 -0.10812396 0.58529716 +v 0.64823555 -0.10812396 -0.69666065 +v 0.39556151 -0.10812396 -0.86549204 +v 0.36149950 -0.10812396 -0.78325908 +v 0.58529716 -0.10812396 -0.63372227 +v -0.89169952 0.12053668 0.33229106 +v -0.95098522 0.12053668 3.4241719e-2 +v -0.86197691 0.12053668 3.4241719e-2 +v -0.80946656 0.12053668 0.29822906 +v -0.33229106 -0.10812396 0.89169952 +v -3.4241719e-2 -0.10812396 0.95098522 +v -3.4241719e-2 -0.10812396 0.86197691 +v -0.29822906 -0.10812396 0.80946656 +v 0.89169952 0.12053668 -0.33229106 +v 0.95098522 0.12053668 -3.4241719e-2 +v 0.86197691 0.12053668 -3.4241719e-2 +v 0.80946656 0.12053668 -0.29822906 +v 0.39556151 0.12053668 -0.86549204 +v 0.64823555 0.12053668 -0.69666065 +v 0.58529716 0.12053668 -0.63372227 +v 0.36149950 0.12053668 -0.78325908 +vt 6.9026002e-2 0.14477510 +vt 6.9026002e-2 4.3926815e-2 +vt 9.5173315e-2 0.14477510 +vt 9.5173315e-2 4.3926815e-2 +vt 9.5173315e-2 4.3926815e-2 +vt 9.5173315e-2 0.14477510 +vt 9.9057127e-2 0.55312990 +vt 9.9406840e-2 0.58689262 +vt 0.10031089 0.55323083 +vt 0.10053975 0.58691591 +vt 0.10673184 0.14477510 +vt 0.10673184 4.3926815e-2 +vt 0.10673184 4.3926815e-2 +vt 0.10673184 0.14477510 +vt 0.10828215 4.3926815e-2 +vt 0.10828215 0.14477510 +vt 0.11967368 0.44142090 +vt 0.12067599 5.9028752e-2 +vt 0.12067599 0.12967316 +vt 0.12103148 0.44196292 +vt 0.12115386 0.69725902 +vt 0.12205895 0.69722332 +vt 0.12426047 0.56994286 +vt 0.12539699 0.57002658 +vt 0.13144127 4.3926815e-2 +vt 0.13144127 4.3926815e-2 +vt 0.13144127 0.14477510 +vt 0.13144127 0.14477510 +vt 0.13197860 0.40936547 +vt 0.13334875 0.41011805 +vt 0.13378945 0.72840110 +vt 0.13458338 0.72841027 +vt 0.14299979 4.3926815e-2 +vt 0.14299979 0.14477510 +vt 0.14299979 0.14477510 +vt 0.14299979 4.3926815e-2 +vt 0.14867094 5.9028752e-2 +vt 0.14867094 5.9028752e-2 +vt 0.14867094 0.12967316 +vt 0.14867094 0.12967316 +vt 0.14933084 0.43482582 +vt 0.15055283 0.70347931 +vt 0.15059287 0.43542249 +vt 0.15142574 0.70352400 +vt 0.16201790 0.56977899 +vt 0.16309356 0.56989902 +vt 0.18119308 4.3926815e-2 +vt 0.18119308 0.14477510 +vt 0.18119308 0.14477510 +vt 0.18119308 4.3926815e-2 +vt 0.18483842 0.44899720 +vt 0.18542566 0.68937096 +vt 0.18595090 0.44953659 +vt 0.18632037 0.68946969 +vt 0.19401252 0.31170251 +vt 0.19487715 0.82273611 +vt 0.19498439 0.31306429 +vt 0.19554805 0.82294590 +vt 0.20255045 4.3926815e-2 +vt 0.20255045 0.14477510 +vt 0.20255045 4.3926815e-2 +vt 0.20255045 0.14477510 +vt 0.20895137 0.14477510 +vt 0.20895137 4.3926815e-2 +vt 0.20895137 4.3926815e-2 +vt 0.20895137 0.14477510 +vt 0.21213329 0.56970999 +vt 0.21311283 0.56985845 +vt 0.21809697 0.84714055 +vt 0.21813870 0.28585346 +vt 0.21873479 0.84749012 +vt 0.21885565 0.28747348 +vt 0.22449344 0.81763641 +vt 0.22457834 0.31688585 +vt 0.22520369 0.81789219 +vt 0.22535093 0.31817043 +vt 0.22839382 0.12967316 +vt 0.22839382 5.9028752e-2 +vt 0.22839382 5.9028752e-2 +vt 0.22839382 0.12967316 +vt 0.23030874 4.3926815e-2 +vt 0.23030874 4.3926815e-2 +vt 0.23030874 0.14477510 +vt 0.23030874 0.14477510 +vt 0.23174512 0.67065781 +vt 0.23178616 0.46802410 +vt 0.23265068 0.67078341 +vt 0.23273977 0.46846030 +vt 0.25171491 0.79155885 +vt 0.25249419 0.79179852 +vt 0.25256625 0.34420242 +vt 0.25320787 0.34515588 +vt 0.26987397 0.56980017 +vt 0.27076072 0.56995261 +vt 0.28516028 0.64909509 +vt 0.28563822 0.49021563 +vt 0.28606647 0.64922226 +vt 0.28646874 0.49050437 +vt 0.28774554 0.75686413 +vt 0.28861372 0.75705753 +vt 0.28920128 0.38049628 +vt 0.28976891 0.38107159 +vt 0.31025446 0.91284358 +vt 0.31112360 0.91358286 +vt 0.31398958 4.3926815e-2 +vt 0.31398958 0.14477510 +vt 0.31398958 4.3926815e-2 +vt 0.31398958 0.14477510 +vt 0.31534456 0.21944677 +vt 0.31603791 0.21737850 +vt 0.32901226 4.3926815e-2 +vt 0.32901226 0.14477510 +vt 0.32901226 4.3926815e-2 +vt 0.32901226 0.14477510 +vt 0.32917348 0.71677656 +vt 0.33011123 0.71690842 +vt 0.33087413 0.42220579 +vt 0.33144177 0.42250697 +vt 0.33469352 0.57013085 +vt 0.33552849 0.57022853 +vt 0.33607235 0.89702935 +vt 0.33704836 0.89774148 +vt 0.34122713 0.92721383 +vt 0.34189432 4.3926815e-2 +vt 0.34189432 0.14477510 +vt 0.34189432 4.3926815e-2 +vt 0.34189432 0.14477510 +vt 0.34207690 0.23633492 +vt 0.34223356 0.92811323 +vt 0.34307190 0.23581534 +vt 0.34515918 0.62490597 +vt 0.34577495 0.51539073 +vt 0.34604434 0.62498101 +vt 0.34653958 0.51550060 +vt 0.34770754 5.9028752e-2 +vt 0.34770754 0.12967316 +vt 0.34770754 5.9028752e-2 +vt 0.34770754 0.12967316 +vt 0.34873614 0.20429732 +vt 0.35058915 0.20510184 +vt 0.35172389 0.86232449 +vt 0.35276778 0.86289157 +vt 0.35691700 0.14477510 +vt 0.35691700 4.3926815e-2 +vt 0.35691700 4.3926815e-2 +vt 0.35691700 0.14477510 +vt 0.35728058 0.27335286 +vt 0.35782698 0.27301436 +vt 0.37226416 0.81622240 +vt 0.37335075 0.81660492 +vt 0.37559994 0.67161547 +vt 0.37653693 0.67167196 +vt 0.37702375 0.46892236 +vt 0.37711921 0.32183029 +vt 0.37720126 0.32167924 +vt 0.37764729 0.46898974 +vt 0.39563351 0.76305647 +vt 0.39670634 0.76324739 +vt 0.39930243 0.37688862 +vt 0.39953836 0.37691131 +vt 0.40474452 0.57076176 +vt 0.40553340 0.57072979 +vt 0.41007592 0.59876124 +vt 0.41047312 0.54285279 +vt 0.41091952 0.59873333 +vt 0.41122921 0.54280492 +vt 0.42151813 0.70336306 +vt 0.42251422 0.70337950 +vt 0.42386597 0.43809533 +vt 0.42434859 0.43801844 +vt 0.42563951 0.62265651 +vt 0.42644630 0.51928808 +vt 0.42651967 0.62258768 +vt 0.42714478 0.51921111 +vt 0.44912494 0.63880194 +vt 0.45001767 0.63869891 +vt 0.45024408 0.50368396 +vt 0.45089472 0.50353925 +vt 0.45296651 0.95428224 +vt 0.45468251 0.95534364 +vt 0.46673728 0.18562094 +vt 0.46726401 0.18708190 +vt 0.47127874 0.92952620 +vt 0.47259578 0.89076425 +vt 0.47308459 0.93039369 +vt 0.47334574 0.14477510 +vt 0.47334574 4.3926815e-2 +vt 0.47334574 0.14477510 +vt 0.47334574 4.3926815e-2 +vt 0.47334574 0.14477510 +vt 0.47334574 4.3926815e-2 +vt 0.47334574 4.3926815e-2 +vt 0.47397831 0.83953207 +vt 0.47426604 0.89130249 +vt 0.47520835 0.78077830 +vt 0.47543930 0.83974676 +vt 0.47619693 0.71524495 +vt 0.47647904 0.78079569 +vt 0.47695960 0.64473533 +vt 0.47726507 0.71513286 +vt 0.47758890 0.57160599 +vt 0.47787359 0.64457136 +vt 0.47821819 0.49847666 +vt 0.47836491 0.57141067 +vt 0.47885624 0.49824998 +vt 0.47898086 0.42796704 +vt 0.47946475 0.42768848 +vt 0.47996944 0.36243368 +vt 0.48025079 0.36202565 +vt 0.48119948 0.30367992 +vt 0.48129053 0.30307458 +vt 0.48246379 0.25151885 +vt 0.48258201 0.25244774 +vt 0.48364523 0.21242765 +vt 0.48389905 0.21368579 +vt 0.48791378 0.95613009 +vt 0.48844768 5.9028752e-2 +vt 0.48844768 0.12967316 +vt 0.48844768 5.9028752e-2 +vt 0.48844768 0.12967316 +vt 0.48999254 0.95720040 +vt 0.50204732 0.18747770 +vt 0.50221128 0.18892974 +vt 0.50354961 0.14477510 +vt 0.50354961 0.14477510 +vt 0.50354961 4.3926815e-2 +vt 0.50354961 4.3926815e-2 +vt 0.50354961 4.3926815e-2 +vt 0.50354961 4.3926815e-2 +vt 0.50354961 0.14477510 +vt 0.50493371 0.63952802 +vt 0.50583511 0.63928209 +vt 0.50605285 0.50441004 +vt 0.50671216 0.50412243 +vt 0.52873149 0.62392390 +vt 0.52953828 0.52055548 +vt 0.52958504 0.62361023 +vt 0.53021016 0.52023366 +vt 0.53131182 0.70511666 +vt 0.53238123 0.70480290 +vt 0.53365966 0.43984892 +vt 0.53421561 0.43944184 +vt 0.54470467 0.60035919 +vt 0.54510187 0.54445074 +vt 0.54550062 0.60001642 +vt 0.54581031 0.54408801 +vt 0.55043327 0.57245022 +vt 0.55119643 0.57209155 +vt 0.55587536 0.76632337 +vt 0.55719146 0.76591003 +vt 0.55954428 0.38015551 +vt 0.56002349 0.37957395 +vt 0.57797653 0.82153274 +vt 0.57815404 0.67428963 +vt 0.57908254 0.67383160 +vt 0.57957785 0.47159652 +vt 0.57961061 0.82099105 +vt 0.58019290 0.47114938 +vt 0.58291364 0.32698959 +vt 0.58337907 0.32621642 +vt 0.59735081 0.87019762 +vt 0.59944925 0.86946848 +vt 0.60345390 0.28088749 +vt 0.60396205 0.27992977 +vt 0.60458864 0.93811014 +vt 0.60799368 0.93852402 +vt 0.60940284 0.62782125 +vt 0.61001861 0.51830601 +vt 0.61019025 0.62732074 +vt 0.61068549 0.51784033 +vt 0.61210589 0.90739664 +vt 0.61395066 0.21599816 +vt 0.61449627 0.21470811 +vt 0.61465292 0.90648642 +vt 0.61910544 0.24618263 +vt 0.61968146 0.24507986 +vt 0.61997835 4.3926815e-2 +vt 0.61997835 0.14477510 +vt 0.61997835 4.3926815e-2 +vt 0.61997835 0.14477510 +vt 0.62048427 0.57308113 +vt 0.62120134 0.57259281 +vt 0.62430366 0.72100620 +vt 0.62528806 0.72031437 +vt 0.62600431 0.42643543 +vt 0.62661860 0.42591292 +vt 0.62918781 5.9028752e-2 +vt 0.62918781 5.9028752e-2 +vt 0.62918781 0.12967316 +vt 0.62918781 0.12967316 +vt 0.63500103 4.3926815e-2 +vt 0.63500103 0.14477510 +vt 0.63500103 4.3926815e-2 +vt 0.63500103 0.14477510 +vt 0.63913988 0.92583348 +vt 0.64138527 0.92337457 +vt 0.64492333 0.23036841 +vt 0.64560622 0.22923848 +vt 0.64788310 0.14477510 +vt 0.64788310 4.3926815e-2 +vt 0.64788310 4.3926815e-2 +vt 0.64788310 0.14477510 +vt 0.66290577 0.14477510 +vt 0.66290577 4.3926815e-2 +vt 0.66290577 4.3926815e-2 +vt 0.66290577 0.14477510 +vt 0.66597651 0.76271571 +vt 0.66696091 0.76174975 +vt 0.66743225 0.38634786 +vt 0.66811610 0.38576381 +vt 0.66953957 0.65299635 +vt 0.67001751 0.49411689 +vt 0.67026108 0.65231697 +vt 0.67066335 0.49359908 +vt 0.68530382 0.57341182 +vt 0.68596911 0.57286873 +vt 0.70261154 0.79900957 +vt 0.70346288 0.35165314 +vt 0.70352196 0.79766546 +vt 0.70423564 0.35102282 +vt 0.72339163 0.67518789 +vt 0.72343267 0.47255417 +vt 0.72399005 0.67436104 +vt 0.72407914 0.47203793 +vt 0.73059945 0.82632614 +vt 0.73068435 0.32557558 +vt 0.73137889 0.82465091 +vt 0.73152613 0.32492915 +vt 0.73703909 0.85735853 +vt 0.73708082 0.29607144 +vt 0.73787417 0.85534786 +vt 0.73799504 0.29533122 +vt 0.74304450 0.57350200 +vt 0.74361699 0.57296289 +vt 0.74658662 4.3926815e-2 +vt 0.74658662 4.3926815e-2 +vt 0.74658662 0.14477510 +vt 0.74658662 0.14477510 +vt 0.74850153 5.9028752e-2 +vt 0.74850153 5.9028752e-2 +vt 0.74850153 0.12967316 +vt 0.74850153 0.12967316 +vt 0.76030064 0.32047587 +vt 0.76116527 0.83150948 +vt 0.76118178 0.31987544 +vt 0.76174543 0.82975705 +vt 0.76794398 4.3926815e-2 +vt 0.76794398 4.3926815e-2 +vt 0.76794398 0.14477510 +vt 0.76794398 0.14477510 +vt 0.76975213 0.45384102 +vt 0.77033937 0.69421478 +vt 0.77040945 0.45335165 +vt 0.77077892 0.69328475 +vt 0.77434490 4.3926815e-2 +vt 0.77434490 0.14477510 +vt 0.77434490 0.14477510 +vt 0.77434490 4.3926815e-2 +vt 0.79315989 0.57343299 +vt 0.79363627 0.57292232 +vt 0.79570227 4.3926815e-2 +vt 0.79570227 0.14477510 +vt 0.79570227 0.14477510 +vt 0.79570227 4.3926815e-2 +vt 0.80462496 0.43973268 +vt 0.80530409 0.43929734 +vt 0.80584695 0.70838617 +vt 0.80613695 0.70739885 +vt 0.82138834 0.41481089 +vt 0.82214644 0.41441107 +vt 0.82319919 0.73384651 +vt 0.82338108 0.73270329 +vt 0.82822441 5.9028752e-2 +vt 0.82822441 5.9028752e-2 +vt 0.82822441 0.12967316 +vt 0.82822441 0.12967316 +vt 0.83091732 0.57326912 +vt 0.83133284 0.57279476 +vt 0.83389556 4.3926815e-2 +vt 0.83389556 4.3926815e-2 +vt 0.83389556 0.14477510 +vt 0.83389556 0.14477510 +vt 0.83402393 0.44595297 +vt 0.83467087 0.44559802 +vt 0.83550411 0.70179109 +vt 0.83569835 0.70085842 +vt 0.84545409 4.3926815e-2 +vt 0.84545409 4.3926815e-2 +vt 0.84545409 0.14477510 +vt 0.84545409 0.14477510 +vt 0.85577095 0.55631936 +vt 0.85612066 0.59008209 +vt 0.85619008 0.55590543 +vt 0.85621936 5.9028752e-2 +vt 0.85621936 0.12967316 +vt 0.85641893 0.58959051 +vt 0.86861320 4.3926815e-2 +vt 0.86861320 4.3926815e-2 +vt 0.86861320 0.14477510 +vt 0.87016351 4.3926815e-2 +vt 0.87016351 0.14477510 +vt 0.87016351 4.3926815e-2 +vt 0.87016351 0.14477510 +vt 0.88172204 4.3926815e-2 +vt 0.88172204 0.14477510 +vt 0.88172204 4.3926815e-2 +vt 0.88172204 0.14477510 +vt 0.90786935 4.3926815e-2 +vt 0.90786935 0.14477510 +vn 0.12126410 0.99262028 6.7809842e-17 +vn 0.11203342 0.99262028 4.6405764e-2 +vn 8.5746671e-2 0.99262028 8.5746671e-2 +vn 4.6405764e-2 0.99262028 0.11203342 +vn 0.0000000e+0 0.99262028 0.12126410 +vn -4.6405764e-2 0.99262028 0.11203342 +vn -8.5746671e-2 0.99262028 8.5746671e-2 +vn -0.11203342 0.99262028 4.6405764e-2 +vn -0.12126410 0.99262028 2.5037480e-16 +vn -0.11203342 0.99262028 -4.6405764e-2 +vn -8.5746671e-2 0.99262028 -8.5746671e-2 +vn -4.6405764e-2 0.99262028 -0.11203342 +vn -2.7819422e-17 0.99262028 -0.12126410 +vn 4.6405764e-2 0.99262028 -0.11203342 +vn 8.5746671e-2 0.99262028 -8.5746671e-2 +vn 0.11203342 0.99262028 -4.6405764e-2 +vn 0.25214066 0.96769059 -2.7863482e-17 +vn 0.23294760 0.96769059 9.6490054e-2 +vn 0.17829037 0.96769059 0.17829037 +vn 9.6490054e-2 0.96769059 0.23294760 +vn 3.4829353e-18 0.96769059 0.25214066 +vn -9.6490054e-2 0.96769059 0.23294760 +vn -0.17829037 0.96769059 0.17829037 +vn -0.23294760 0.96769059 9.6490054e-2 +vn -0.25214066 0.96769059 4.1795223e-17 +vn -0.23294760 0.96769059 -9.6490054e-2 +vn -0.17829037 0.96769059 -0.17829037 +vn -9.6490054e-2 0.96769059 -0.23294760 +vn -3.4829353e-17 0.96769059 -0.25214066 +vn 9.6490054e-2 0.96769059 -0.23294760 +vn 0.17829037 0.96769059 -0.17829037 +vn 0.23294760 0.96769059 -9.6490054e-2 +vn 0.40370646 0.91488857 -5.2424711e-17 +vn 0.37297614 0.91488857 0.15449178 +vn 0.28546358 0.91488857 0.28546358 +vn 0.15449178 0.91488857 0.37297614 +vn 3.4949808e-18 0.91488857 0.40370646 +vn -0.15449178 0.91488857 0.37297614 +vn -0.28546358 0.91488857 0.28546358 +vn -0.37297614 0.91488857 0.15449178 +vn -0.40370646 0.91488857 6.6404634e-17 +vn -0.37297614 0.91488857 -0.15449178 +vn -0.28546358 0.91488857 -0.28546358 +vn -0.15449178 0.91488857 -0.37297614 +vn -4.1939769e-17 0.91488857 -0.40370646 +vn 0.15449178 0.91488857 -0.37297614 +vn 0.28546358 0.91488857 -0.28546358 +vn 0.37297614 0.91488857 -0.15449178 +vn 0.58742209 0.80928072 -9.8557828e-17 +vn 0.54270725 0.80928072 0.22479670 +vn 0.41537015 0.80928072 0.41537015 +vn 0.22479670 0.80928072 0.54270725 +vn 0.0000000e+0 0.80928072 0.58742209 +vn -0.22479670 0.80928072 0.54270725 +vn -0.41537015 0.80928072 0.41537015 +vn -0.54270725 0.80928072 0.22479670 +vn -0.58742209 0.80928072 9.1517983e-17 +vn -0.54270725 0.80928072 -0.22479670 +vn -0.41537015 0.80928072 -0.41537015 +vn -0.22479670 0.80928072 -0.54270725 +vn -8.4478138e-17 0.80928072 -0.58742209 +vn 0.22479670 0.80928072 -0.54270725 +vn 0.41537015 0.80928072 -0.41537015 +vn 0.54270725 0.80928072 -0.22479670 +vn 0.80002481 0.59996692 -1.2845286e-16 +vn 0.73912655 0.59996692 0.30615624 +vn 0.56570297 0.59996692 0.56570297 +vn 0.30615624 0.59996692 0.73912655 +vn 0.0000000e+0 0.59996692 0.80002481 +vn -0.30615624 0.59996692 0.73912655 +vn -0.56570297 0.59996692 0.56570297 +vn -0.73912655 0.59996692 0.30615624 +vn -0.80002481 0.59996692 1.0704405e-16 +vn -0.73912655 0.59996692 -0.30615624 +vn -0.56570297 0.59996692 -0.56570297 +vn -0.30615624 0.59996692 -0.73912655 +vn -1.2131659e-16 0.59996692 -0.80002481 +vn 0.30615624 0.59996692 -0.73912655 +vn 0.56570297 0.59996692 -0.56570297 +vn 0.73912655 0.59996692 -0.30615624 +vn 0.80002481 -0.59996692 -1.2131659e-16 +vn 0.73912655 -0.59996692 0.30615624 +vn 0.56570297 -0.59996692 0.56570297 +vn 0.30615624 -0.59996692 0.73912655 +vn 0.0000000e+0 -0.59996692 0.80002481 +vn -0.30615624 -0.59996692 0.73912655 +vn -0.56570297 -0.59996692 0.56570297 +vn -0.73912655 -0.59996692 0.30615624 +vn -0.80002481 -0.59996692 1.2131659e-16 +vn -0.73912655 -0.59996692 -0.30615624 +vn -0.56570297 -0.59996692 -0.56570297 +vn -0.30615624 -0.59996692 -0.73912655 +vn -1.2845286e-16 -0.59996692 -0.80002481 +vn 0.30615624 -0.59996692 -0.73912655 +vn 0.56570297 -0.59996692 -0.56570297 +vn 0.73912655 -0.59996692 -0.30615624 +vn 0.58742209 -0.80928072 -1.1263752e-16 +vn 0.54270725 -0.80928072 0.22479670 +vn 0.41537015 -0.80928072 0.41537015 +vn 0.22479670 -0.80928072 0.54270725 +vn 3.5199224e-18 -0.80928072 0.58742209 +vn -0.22479670 -0.80928072 0.54270725 +vn -0.41537015 -0.80928072 0.41537015 +vn -0.54270725 -0.80928072 0.22479670 +vn -0.58742209 -0.80928072 7.3918371e-17 +vn -0.54270725 -0.80928072 -0.22479670 +vn -0.41537015 -0.80928072 -0.41537015 +vn -0.22479670 -0.80928072 -0.54270725 +vn -1.0207775e-16 -0.80928072 -0.58742209 +vn 0.22479670 -0.80928072 -0.54270725 +vn 0.41537015 -0.80928072 -0.41537015 +vn 0.54270725 -0.80928072 -0.22479670 +vn 0.40370646 -0.91488857 -8.0384557e-17 +vn 0.37297614 -0.91488857 0.15449178 +vn 0.28546358 -0.91488857 0.28546358 +vn 0.15449178 -0.91488857 0.37297614 +vn 6.9899615e-18 -0.91488857 0.40370646 +vn -0.15449178 -0.91488857 0.37297614 +vn -0.28546358 -0.91488857 0.28546358 +vn -0.37297614 -0.91488857 0.15449178 +vn -0.40370646 -0.91488857 3.1454827e-17 +vn -0.37297614 -0.91488857 -0.15449178 +vn -0.28546358 -0.91488857 -0.28546358 +vn -0.15449178 -0.91488857 -0.37297614 +vn -7.3394596e-17 -0.91488857 -0.40370646 +vn 0.15449178 -0.91488857 -0.37297614 +vn 0.28546358 -0.91488857 -0.28546358 +vn 0.37297614 -0.91488857 -0.15449178 +vn 0.25214066 -0.96769059 -4.5278159e-17 +vn 0.23294760 -0.96769059 9.6490054e-2 +vn 0.17829037 -0.96769059 0.17829037 +vn 9.6490054e-2 -0.96769059 0.23294760 +vn 5.2244029e-18 -0.96769059 0.25214066 +vn -9.6490054e-2 -0.96769059 0.23294760 +vn -0.17829037 -0.96769059 0.17829037 +vn -0.23294760 -0.96769059 9.6490054e-2 +vn -0.25214066 -0.96769059 1.9156144e-17 +vn -0.23294760 -0.96769059 -9.6490054e-2 +vn -0.17829037 -0.96769059 -0.17829037 +vn -9.6490054e-2 -0.96769059 -0.23294760 +vn -5.7468432e-17 -0.96769059 -0.25214066 +vn 9.6490054e-2 -0.96769059 -0.23294760 +vn 0.17829037 -0.96769059 -0.17829037 +vn 0.23294760 -0.96769059 -9.6490054e-2 +vn 0.12126410 -0.99262028 6.9548556e-17 +vn 0.11203342 -0.99262028 4.6405764e-2 +vn 8.5746671e-2 -0.99262028 8.5746671e-2 +vn 4.6405764e-2 -0.99262028 0.11203342 +vn 1.7387139e-18 -0.99262028 0.12126410 +vn -4.6405764e-2 -0.99262028 0.11203342 +vn -8.5746671e-2 -0.99262028 8.5746671e-2 +vn -0.11203342 -0.99262028 4.6405764e-2 +vn -0.12126410 -0.99262028 2.4863609e-16 +vn -0.11203342 -0.99262028 -4.6405764e-2 +vn -8.5746671e-2 -0.99262028 -8.5746671e-2 +vn -4.6405764e-2 -0.99262028 -0.11203342 +vn -2.7819422e-17 -0.99262028 -0.12126410 +vn 4.6405764e-2 -0.99262028 -0.11203342 +vn 8.5746671e-2 -0.99262028 -8.5746671e-2 +vn 0.11203342 -0.99262028 -4.6405764e-2 +vn 0.0000000e+0 1.00000000 -1.0861952e-19 +vn -1.3034343e-18 -1.00000000 4.2904712e-17 +vn 0.99843896 -5.5853710e-2 -1.1709178e-16 +vn 0.92243732 -5.5853710e-2 0.38208605 +vn 0.70600296 -5.5853710e-2 0.70600296 +vn 0.38208605 -5.5853710e-2 0.92243732 +vn 6.1627255e-18 -5.5853710e-2 0.99843896 +vn -0.38208605 -5.5853710e-2 0.92243732 +vn -0.70600296 -5.5853710e-2 0.70600296 +vn -0.92243732 -5.5853710e-2 0.38208605 +vn -0.99843896 -5.5853710e-2 1.1709178e-16 +vn -0.92243732 -5.5853710e-2 -0.38208605 +vn -0.70600296 -5.5853710e-2 -0.70600296 +vn -0.38208605 -5.5853710e-2 -0.92243732 +vn -1.2941724e-16 -5.5853710e-2 -0.99843896 +vn 0.38208605 -5.5853710e-2 -0.92243732 +vn 0.70600296 -5.5853710e-2 -0.70600296 +vn 0.92243732 -5.5853710e-2 -0.38208605 +vn 0.99843896 5.5853710e-2 -1.1092906e-16 +vn 0.92243732 5.5853710e-2 0.38208605 +vn 0.70600296 5.5853710e-2 0.70600296 +vn 0.38208605 5.5853710e-2 0.92243732 +vn 0.0000000e+0 5.5853710e-2 0.99843896 +vn -0.38208605 5.5853710e-2 0.92243732 +vn -0.70600296 5.5853710e-2 0.70600296 +vn -0.92243732 5.5853710e-2 0.38208605 +vn -0.99843896 5.5853710e-2 1.1709178e-16 +vn -0.92243732 5.5853710e-2 -0.38208605 +vn -0.70600296 5.5853710e-2 -0.70600296 +vn -0.38208605 5.5853710e-2 -0.92243732 +vn -1.2325451e-16 5.5853710e-2 -0.99843896 +vn 0.38208605 5.5853710e-2 -0.92243732 +vn 0.70600296 5.5853710e-2 -0.70600296 +vn 0.92243732 5.5853710e-2 -0.38208605 +vn 0.82732049 0.44509121 0.34268737 +vn 0.89548524 0.44509121 1.8090971e-17 +vn 0.82732049 0.44509121 -0.34268737 +vn 0.63320369 0.44509121 -0.63320369 +vn 0.34268737 0.44509121 -0.82732049 +vn -1.3266712e-16 0.44509121 -0.89548524 +vn -0.34268737 0.44509121 -0.82732049 +vn -0.63320369 0.44509121 -0.63320369 +vn -0.82732049 0.44509121 -0.34268737 +vn -0.89548524 0.44509121 2.6533425e-16 +vn -0.82732049 0.44509121 0.34268737 +vn -0.63320369 0.44509121 0.63320369 +vn -0.34268737 0.44509121 0.82732049 +vn 6.0303238e-18 0.44509121 0.89548524 +vn 0.34268737 0.44509121 0.82732049 +vn 0.63320369 0.44509121 0.63320369 +vn 0.82732049 -0.44509121 -0.34268737 +vn 0.89548524 -0.44509121 1.8090971e-17 +vn 0.82732049 -0.44509121 0.34268737 +vn 0.63320369 -0.44509121 0.63320369 +vn 0.34268737 -0.44509121 0.82732049 +vn 0.0000000e+0 -0.44509121 0.89548524 +vn -0.34268737 -0.44509121 0.82732049 +vn -0.63320369 -0.44509121 0.63320369 +vn -0.82732049 -0.44509121 0.34268737 +vn -0.89548524 -0.44509121 2.6533425e-16 +vn -0.82732049 -0.44509121 -0.34268737 +vn -0.63320369 -0.44509121 -0.63320369 +vn -0.34268737 -0.44509121 -0.82732049 +vn -1.3869745e-16 -0.44509121 -0.89548524 +vn 0.34268737 -0.44509121 -0.82732049 +vn 0.63320369 -0.44509121 -0.63320369 +vn -0.54613904 -0.83589889 -5.4819670e-2 +vn -0.52554526 -0.83589889 -0.15835159 +vn -0.38548201 -0.91503780 -0.11878321 +vn -0.40159530 -0.91503780 -3.7776202e-2 +vn -0.52554526 0.83589889 -0.15835159 +vn -0.54613904 0.83589889 -5.4819670e-2 +vn -0.40159530 0.91503780 -3.7776202e-2 +vn -0.38548201 0.91503780 -0.11878321 +vn -0.42494198 0.83589889 -0.34741526 +vn -0.48358811 0.83589889 -0.25964514 +vn -0.35656935 0.91503780 -0.18858453 +vn -0.31068257 0.91503780 -0.25725895 +vn -5.4819670e-2 -0.83589889 0.54613904 +vn -0.15835159 -0.83589889 0.52554526 +vn -0.11878321 -0.91503780 0.38548201 +vn -3.7776202e-2 -0.91503780 0.40159530 +vn -0.48358811 0.83589889 0.25964514 +vn -0.42494198 0.83589889 0.34741526 +vn -0.31068257 0.91503780 0.25725895 +vn -0.35656935 0.91503780 0.18858453 +vn 0.15835159 -0.83589889 0.52554526 +vn 5.4819670e-2 -0.83589889 0.54613904 +vn 3.7776202e-2 -0.91503780 0.40159530 +vn 0.11878321 -0.91503780 0.38548201 +vn 5.4819670e-2 -0.83589889 -0.54613904 +vn 0.15835159 -0.83589889 -0.52554526 +vn 0.11878321 -0.91503780 -0.38548201 +vn 3.7776202e-2 -0.91503780 -0.40159530 +vn 0.52554526 0.83589889 0.15835159 +vn 0.54613904 0.83589889 5.4819670e-2 +vn 0.40159530 0.91503780 3.7776202e-2 +vn 0.38548201 0.91503780 0.11878321 +vn -5.4819670e-2 0.83589889 -0.54613904 +vn -0.15835159 0.83589889 -0.52554526 +vn -0.11878321 0.91503780 -0.38548201 +vn -3.7776202e-2 0.91503780 -0.40159530 +vn 0.34741526 -0.83589889 0.42494198 +vn 0.25964514 -0.83589889 0.48358811 +vn 0.18858453 -0.91503780 0.35656935 +vn 0.25725895 -0.91503780 0.31068257 +vn 0.25964514 0.83589889 0.48358811 +vn 0.34741526 0.83589889 0.42494198 +vn 0.25725895 0.91503780 0.31068257 +vn 0.18858453 0.91503780 0.35656935 +vn -0.42494198 -0.83589889 0.34741526 +vn -0.48358811 -0.83589889 0.25964514 +vn -0.35656935 -0.91503780 0.18858453 +vn -0.31068257 -0.91503780 0.25725895 +vn -0.54613904 0.83589889 5.4819670e-2 +vn -0.52554526 0.83589889 0.15835159 +vn -0.38548201 0.91503780 0.11878321 +vn -0.40159530 0.91503780 3.7776202e-2 +vn 0.54613904 0.83589889 -5.4819670e-2 +vn 0.52554526 0.83589889 -0.15835159 +vn 0.38548201 0.91503780 -0.11878321 +vn 0.40159530 0.91503780 -3.7776202e-2 +vn 0.15835159 0.83589889 -0.52554526 +vn 5.4819670e-2 0.83589889 -0.54613904 +vn 3.7776202e-2 0.91503780 -0.40159530 +vn 0.11878321 0.91503780 -0.38548201 +vn -0.34741526 -0.83589889 -0.42494198 +vn -0.25964514 -0.83589889 -0.48358811 +vn -0.18858453 -0.91503780 -0.35656935 +vn -0.25725895 -0.91503780 -0.31068257 +vn -0.25964514 0.83589889 -0.48358811 +vn -0.34741526 0.83589889 -0.42494198 +vn -0.25725895 0.91503780 -0.31068257 +vn -0.18858453 0.91503780 -0.35656935 +vn 0.48358811 -0.83589889 0.25964514 +vn 0.42494198 -0.83589889 0.34741526 +vn 0.31068257 -0.91503780 0.25725895 +vn 0.35656935 -0.91503780 0.18858453 +vn 5.4819670e-2 0.83589889 0.54613904 +vn 0.15835159 0.83589889 0.52554526 +vn 0.11878321 0.91503780 0.38548201 +vn 3.7776202e-2 0.91503780 0.40159530 +vn 0.42494198 -0.83589889 -0.34741526 +vn 0.48358811 -0.83589889 -0.25964514 +vn 0.35656935 -0.91503780 -0.18858453 +vn 0.31068257 -0.91503780 -0.25725895 +vn -0.15835159 -0.83589889 -0.52554526 +vn -5.4819670e-2 -0.83589889 -0.54613904 +vn -3.7776202e-2 -0.91503780 -0.40159530 +vn -0.11878321 -0.91503780 -0.38548201 +vn -0.25964514 -0.83589889 0.48358811 +vn -0.34741526 -0.83589889 0.42494198 +vn -0.25725895 -0.91503780 0.31068257 +vn -0.18858453 -0.91503780 0.35656935 +vn -0.34741526 0.83589889 0.42494198 +vn -0.25964514 0.83589889 0.48358811 +vn -0.18858453 0.91503780 0.35656935 +vn -0.25725895 0.91503780 0.31068257 +vn -0.48358811 -0.83589889 -0.25964514 +vn -0.42494198 -0.83589889 -0.34741526 +vn -0.31068257 -0.91503780 -0.25725895 +vn -0.35656935 -0.91503780 -0.18858453 +vn 0.54613904 -0.83589889 5.4819670e-2 +vn 0.52554526 -0.83589889 0.15835159 +vn 0.38548201 -0.91503780 0.11878321 +vn 0.40159530 -0.91503780 3.7776202e-2 +vn 0.48358811 0.83589889 -0.25964514 +vn 0.42494198 0.83589889 -0.34741526 +vn 0.31068257 0.91503780 -0.25725895 +vn 0.35656935 0.91503780 -0.18858453 +vn 0.42494198 0.83589889 0.34741526 +vn 0.48358811 0.83589889 0.25964514 +vn 0.35656935 0.91503780 0.18858453 +vn 0.31068257 0.91503780 0.25725895 +vn 0.34741526 0.83589889 -0.42494198 +vn 0.25964514 0.83589889 -0.48358811 +vn 0.18858453 0.91503780 -0.35656935 +vn 0.25725895 0.91503780 -0.31068257 +vn -0.52554526 -0.83589889 0.15835159 +vn -0.54613904 -0.83589889 5.4819670e-2 +vn -0.40159530 -0.91503780 3.7776202e-2 +vn -0.38548201 -0.91503780 0.11878321 +vn -0.15835159 0.83589889 0.52554526 +vn -5.4819670e-2 0.83589889 0.54613904 +vn -3.7776202e-2 0.91503780 0.40159530 +vn -0.11878321 0.91503780 0.38548201 +vn 0.52554526 -0.83589889 -0.15835159 +vn 0.54613904 -0.83589889 -5.4819670e-2 +vn 0.40159530 -0.91503780 -3.7776202e-2 +vn 0.38548201 -0.91503780 -0.11878321 +vn 0.25964514 -0.83589889 -0.48358811 +vn 0.34741526 -0.83589889 -0.42494198 +vn 0.25725895 -0.91503780 -0.31068257 +vn 0.18858453 -0.91503780 -0.35656935 +g burger_burger +usemtl burger +s 1 +f 1/247/1 17/281/17 32/267/32 16/243/16 +f 1/247/1 161/201/161 2/244/2 +f 2/244/2 18/268/18 17/281/17 1/247/1 +f 2/244/2 161/201/161 3/236/3 +f 3/236/3 19/256/19 18/268/18 2/244/2 +f 3/236/3 161/201/161 4/233/4 +f 4/233/4 20/241/20 19/256/19 3/236/3 +f 4/233/4 161/201/161 5/203/5 +f 5/203/5 21/206/21 20/241/20 4/233/4 +f 5/203/5 161/201/161 6/177/6 +f 6/177/6 22/169/22 21/206/21 5/203/5 +f 6/177/6 161/201/161 7/172/7 +f 7/172/7 23/153/23 22/169/22 6/177/6 +f 7/172/7 161/201/161 8/164/8 +f 8/164/8 24/132/24 23/153/23 7/172/7 +f 8/164/8 161/201/161 9/161/9 +f 9/161/9 25/119/25 24/132/24 8/164/8 +f 9/161/9 161/201/161 10/163/10 +f 10/163/10 26/131/26 25/119/25 9/161/9 +f 10/163/10 161/201/161 11/171/11 +f 11/171/11 27/151/27 26/131/26 10/163/10 +f 11/171/11 161/201/161 12/175/12 +f 12/175/12 28/167/28 27/151/27 11/171/11 +f 12/175/12 161/201/161 13/199/13 +f 13/199/13 29/197/29 28/167/28 12/175/12 +f 13/199/13 161/201/161 14/231/14 +f 14/231/14 30/239/30 29/197/29 13/199/13 +f 14/231/14 161/201/161 15/235/15 +f 15/235/15 31/254/31 30/239/30 14/231/14 +f 15/235/15 161/201/161 16/243/16 +f 16/243/16 32/267/32 31/254/31 15/235/15 +f 16/243/16 161/201/161 1/247/1 +f 17/281/17 33/315/33 48/311/48 32/267/32 +f 18/268/18 34/312/34 33/315/33 17/281/17 +f 19/256/19 35/285/35 34/312/34 18/268/18 +f 20/241/20 36/251/36 35/285/35 19/256/19 +f 21/206/21 37/208/37 36/251/36 20/241/20 +f 22/169/22 38/159/38 37/208/37 21/206/21 +f 23/153/23 39/117/39 38/159/38 22/169/22 +f 24/132/24 40/96/40 39/117/39 23/153/23 +f 25/119/25 41/93/41 40/96/40 24/132/24 +f 26/131/26 42/95/42 41/93/41 25/119/25 +f 27/151/27 43/115/43 42/95/42 26/131/26 +f 28/167/28 44/157/44 43/115/43 27/151/27 +f 29/197/29 45/195/45 44/157/44 28/167/28 +f 30/239/30 46/249/46 45/195/45 29/197/29 +f 31/254/31 47/283/47 46/249/46 30/239/30 +f 32/267/32 48/311/48 47/283/47 31/254/31 +f 33/315/33 49/333/49 64/321/64 48/311/48 +f 34/312/34 50/322/50 49/333/49 33/315/33 +f 35/285/35 51/309/51 50/322/50 34/312/34 +f 36/251/36 52/259/52 51/309/51 35/285/35 +f 37/208/37 53/210/53 52/259/52 36/251/36 +f 38/159/38 54/155/54 53/210/53 37/208/37 +f 39/117/39 55/101/55 54/155/54 38/159/38 +f 40/96/40 56/86/56 55/101/55 39/117/39 +f 41/93/41 57/67/57 56/86/56 40/96/40 +f 42/95/42 58/85/58 57/67/57 41/93/41 +f 43/115/43 59/99/59 58/85/58 42/95/42 +f 44/157/44 60/149/60 59/99/59 43/115/43 +f 45/195/45 61/193/61 60/149/60 44/157/44 +f 46/249/46 62/253/62 61/193/61 45/195/45 +f 47/283/47 63/307/63 62/253/62 46/249/46 +f 48/311/48 64/321/64 63/307/63 47/283/47 +f 49/333/49 65/359/65 80/352/80 64/321/64 +f 50/322/50 66/351/66 65/359/65 49/333/49 +f 51/309/51 67/318/67 66/351/66 50/322/50 +f 52/259/52 68/263/68 67/318/67 51/309/51 +f 53/210/53 69/213/69 68/263/68 52/259/52 +f 54/155/54 70/148/70 69/213/69 53/210/53 +f 55/101/55 71/91/71 70/148/70 54/155/54 +f 56/86/56 72/51/72 71/91/71 55/101/55 +f 57/67/57 73/45/73 72/51/72 56/86/56 +f 58/85/58 74/52/74 73/45/73 57/67/57 +f 59/99/59 75/89/75 74/52/74 58/85/58 +f 60/149/60 76/141/76 75/89/75 59/99/59 +f 61/193/61 77/184/77 76/141/76 60/149/60 +f 62/253/62 78/261/78 77/184/77 61/193/61 +f 63/307/63 79/317/79 78/261/78 62/253/62 +f 64/321/64 80/352/80 79/317/79 63/307/63 +f 65/359/65 163/377/163 178/367/178 80/352/80 +f 66/351/66 164/365/164 163/377/163 65/359/65 +f 67/318/67 165/326/165 164/365/164 66/351/66 +f 68/263/68 166/275/166 165/326/165 67/318/67 +f 69/213/69 167/215/167 166/275/166 68/263/68 +f 70/148/70 168/130/168 167/215/167 69/213/69 +f 71/91/71 169/74/169 168/130/168 70/148/70 +f 72/51/72 170/41/170 169/74/169 71/91/71 +f 73/45/73 171/23/171 170/41/170 72/51/72 +f 74/52/74 172/42/172 171/23/171 73/45/73 +f 75/89/75 173/73/173 172/42/172 74/52/74 +f 76/141/76 174/121/174 173/73/173 75/89/75 +f 77/184/77 175/183/175 174/121/174 76/141/76 +f 78/261/78 176/271/176 175/183/175 77/184/77 +f 79/317/79 177/325/177 176/271/176 78/261/78 +f 80/352/80 178/367/178 177/325/177 79/317/79 +f 81/46/81 97/68/97 112/87/112 96/54/96 +f 81/46/81 179/24/179 180/43/180 82/53/82 +f 82/53/82 98/88/98 97/68/97 81/46/81 +f 82/53/82 180/43/180 181/76/181 83/92/83 +f 83/92/83 99/102/99 98/88/98 82/53/82 +f 83/92/83 181/76/181 182/128/182 84/147/84 +f 84/147/84 100/154/100 99/102/99 83/92/83 +f 84/147/84 182/128/182 183/214/183 85/212/85 +f 85/212/85 101/211/101 100/154/100 84/147/84 +f 85/212/85 183/214/183 184/276/184 86/264/86 +f 86/264/86 102/260/102 101/211/101 85/212/85 +f 86/264/86 184/276/184 185/328/185 87/320/87 +f 87/320/87 103/310/103 102/260/102 86/264/86 +f 87/320/87 185/328/185 186/366/186 88/353/88 +f 88/353/88 104/324/104 103/310/103 87/320/87 +f 88/353/88 186/366/186 187/378/187 89/360/89 +f 89/360/89 105/334/105 104/324/104 88/353/88 +f 89/360/89 187/378/187 188/368/188 90/354/90 +f 90/354/90 106/323/106 105/334/105 89/360/89 +f 90/354/90 188/368/188 189/327/189 91/319/91 +f 91/319/91 107/308/107 106/323/106 90/354/90 +f 91/319/91 189/327/189 190/274/190 92/262/92 +f 92/262/92 108/257/108 107/308/107 91/319/91 +f 92/262/92 190/274/190 191/185/191 93/194/93 +f 93/194/93 109/196/109 108/257/108 92/262/92 +f 93/194/93 191/185/191 192/122/192 94/142/94 +f 94/142/94 110/150/110 109/196/109 93/194/93 +f 94/142/94 192/122/192 193/75/193 95/90/95 +f 95/90/95 111/100/111 110/150/110 94/142/94 +f 95/90/95 193/75/193 194/44/194 96/54/96 +f 96/54/96 112/87/112 111/100/111 95/90/95 +f 96/54/96 194/44/194 179/24/179 81/46/81 +f 97/68/97 113/94/113 128/97/128 112/87/112 +f 98/88/98 114/98/114 113/94/113 97/68/97 +f 99/102/99 115/118/115 114/98/114 98/88/98 +f 100/154/100 116/160/116 115/118/115 99/102/99 +f 101/211/101 117/209/117 116/160/116 100/154/100 +f 102/260/102 118/252/118 117/209/117 101/211/101 +f 103/310/103 119/286/119 118/252/118 102/260/102 +f 104/324/104 120/314/120 119/286/119 103/310/103 +f 105/334/105 121/316/121 120/314/120 104/324/104 +f 106/323/106 122/313/122 121/316/121 105/334/105 +f 107/308/107 123/284/123 122/313/122 106/323/106 +f 108/257/108 124/250/124 123/284/123 107/308/107 +f 109/196/109 125/198/125 124/250/124 108/257/108 +f 110/150/110 126/158/126 125/198/125 109/196/109 +f 111/100/111 127/116/127 126/158/126 110/150/110 +f 112/87/112 128/97/128 127/116/127 111/100/111 +f 113/94/113 129/120/129 144/133/144 128/97/128 +f 114/98/114 130/134/130 129/120/129 113/94/113 +f 115/118/115 131/156/131 130/134/130 114/98/114 +f 116/160/116 132/170/132 131/156/131 115/118/115 +f 117/209/117 133/207/133 132/170/132 116/160/116 +f 118/252/118 134/242/134 133/207/133 117/209/117 +f 119/286/119 135/258/135 134/242/134 118/252/118 +f 120/314/120 136/270/136 135/258/135 119/286/119 +f 121/316/121 137/282/137 136/270/136 120/314/120 +f 122/313/122 138/269/138 137/282/137 121/316/121 +f 123/284/123 139/255/139 138/269/138 122/313/122 +f 124/250/124 140/240/140 139/255/139 123/284/123 +f 125/198/125 141/200/141 140/240/140 124/250/124 +f 126/158/126 142/168/142 141/200/141 125/198/125 +f 127/116/127 143/152/143 142/168/142 126/158/126 +f 128/97/128 144/133/144 143/152/143 127/116/127 +f 129/120/129 145/162/145 160/165/160 144/133/144 +f 130/134/130 146/166/146 145/162/145 129/120/129 +f 131/156/131 147/174/147 146/166/146 130/134/130 +f 132/170/132 148/178/148 147/174/147 131/156/131 +f 133/207/133 149/205/149 148/178/148 132/170/132 +f 134/242/134 150/234/150 149/205/149 133/207/133 +f 135/258/135 151/238/151 150/234/150 134/242/134 +f 136/270/136 152/246/152 151/238/151 135/258/135 +f 137/282/137 153/248/153 152/246/152 136/270/136 +f 138/269/138 154/245/154 153/248/153 137/282/137 +f 139/255/139 155/237/155 154/245/154 138/269/138 +f 140/240/140 156/232/156 155/237/155 139/255/139 +f 141/200/141 157/202/157 156/232/156 140/240/140 +f 142/168/142 158/176/158 157/202/157 141/200/141 +f 143/152/143 159/173/159 158/176/158 142/168/142 +f 144/133/144 160/165/160 159/173/159 143/152/143 +f 145/162/145 162/204/162 160/165/160 +f 146/166/146 162/204/162 145/162/145 +f 147/174/147 162/204/162 146/166/146 +f 148/178/148 162/204/162 147/174/147 +f 149/205/149 162/204/162 148/178/148 +f 150/234/150 162/204/162 149/205/149 +f 151/238/151 162/204/162 150/234/150 +f 152/246/152 162/204/162 151/238/151 +f 153/248/153 162/204/162 152/246/152 +f 154/245/154 162/204/162 153/248/153 +f 155/237/155 162/204/162 154/245/154 +f 156/232/156 162/204/162 155/237/155 +f 157/202/157 162/204/162 156/232/156 +f 158/176/158 162/204/162 157/202/157 +f 159/173/159 162/204/162 158/176/158 +f 160/165/160 162/204/162 159/173/159 +f 163/377/163 323/391/323 348/392/348 +f 163/377/163 348/392/348 347/385/347 178/367/178 +f 164/365/164 295/369/295 324/383/324 +f 164/365/164 324/383/324 323/391/323 163/377/163 +f 165/326/165 263/330/263 296/343/296 +f 165/326/165 296/343/296 295/369/295 164/365/164 +f 166/275/166 247/272/247 264/297/264 +f 166/275/166 264/297/264 263/330/263 165/326/165 +f 167/215/167 239/182/239 248/223/248 +f 167/215/167 248/223/248 247/272/247 166/275/166 +f 168/130/168 240/140/240 239/182/239 167/215/167 +f 168/130/168 311/110/311 240/140/240 +f 169/74/169 271/55/271 312/70/312 +f 169/74/169 312/70/312 311/110/311 168/130/168 +f 170/41/170 272/29/272 271/55/271 169/74/169 +f 170/41/170 339/17/339 272/29/272 +f 171/23/171 227/8/227 340/7/340 +f 171/23/171 340/7/340 339/17/339 170/41/170 +f 172/42/172 228/21/228 227/8/227 171/23/171 +f 172/42/172 319/31/319 228/21/228 +f 173/73/173 287/69/287 320/56/320 +f 173/73/173 320/56/320 319/31/319 172/42/172 +f 174/121/174 288/103/288 287/69/287 173/73/173 +f 174/121/174 307/123/307 288/103/288 +f 175/183/175 251/216/251 308/179/308 +f 175/183/175 308/179/308 307/123/307 174/121/174 +f 176/271/176 252/265/252 251/216/251 175/183/175 +f 176/271/176 351/295/351 252/265/252 +f 177/325/177 303/344/303 352/329/352 +f 177/325/177 352/329/352 351/295/351 176/271/176 +f 178/367/178 304/371/304 303/344/303 177/325/177 +f 178/367/178 347/385/347 304/371/304 +f 179/24/179 256/9/256 255/20/255 180/43/180 +f 180/43/180 332/30/332 331/57/331 181/76/181 +f 181/76/181 268/72/268 267/109/267 182/128/182 +f 182/128/182 300/139/300 299/181/299 183/214/183 +f 183/214/183 344/222/344 343/273/343 184/276/184 +f 184/276/184 316/298/316 315/332/315 185/328/185 +f 185/328/185 244/345/244 243/370/243 186/366/186 +f 186/366/186 276/384/276 275/393/275 187/378/187 +f 187/378/187 232/396/232 231/386/231 188/368/188 +f 188/368/188 236/372/236 235/346/235 189/327/189 +f 189/327/189 292/331/292 291/296/291 190/274/190 +f 190/274/190 260/266/260 259/221/259 191/185/191 +f 191/185/191 284/180/284 283/129/283 192/122/192 +f 192/122/192 336/104/336 335/71/335 193/75/193 +f 193/75/193 328/58/328 327/32/327 194/44/194 +f 194/44/194 280/22/280 279/10/279 179/24/179 +f 195/37/195 258/33/258 257/64/257 196/78/196 +f 195/37/195 333/25/333 258/33/258 +f 196/78/196 257/64/257 282/81/282 +f 196/78/196 282/81/282 281/113/281 197/137/197 +f 197/137/197 198/219/198 226/220/226 211/138/211 +f 197/137/197 281/113/281 330/145/330 +f 197/137/197 330/145/330 329/192/329 198/219/198 +f 198/219/198 329/192/329 338/227/338 +f 198/219/198 338/227/338 337/277/337 199/287/199 +f 199/287/199 286/300/286 285/335/285 200/339/200 +f 199/287/199 337/277/337 286/300/286 +f 200/339/200 262/347/262 261/379/261 201/373/201 +f 200/339/200 285/335/285 262/347/262 +f 201/373/201 261/379/261 294/387/294 +f 201/373/201 294/387/294 293/397/293 202/394/202 +f 202/394/202 238/398/238 237/388/237 203/374/203 +f 202/394/202 293/397/293 238/398/238 +f 203/374/203 234/380/234 233/348/233 204/340/204 +f 203/374/203 237/388/237 234/380/234 +f 204/340/204 233/348/233 278/336/278 +f 204/340/204 278/336/278 277/301/277 205/288/205 +f 205/288/205 246/279/246 245/228/245 206/217/206 +f 205/288/205 277/301/277 246/279/246 +f 206/217/206 245/228/245 318/187/318 +f 206/217/206 318/187/318 317/144/317 207/135/207 +f 207/135/207 317/144/317 346/111/346 +f 207/135/207 346/111/346 345/82/345 208/79/208 +f 208/79/208 302/65/302 301/36/301 209/38/209 +f 208/79/208 345/82/345 302/65/302 +f 209/38/209 270/26/270 269/15/269 210/18/210 +f 209/38/209 301/36/301 270/26/270 +f 210/18/210 269/15/269 334/15/334 +f 210/18/210 334/15/334 333/25/333 195/37/195 +f 211/138/211 212/80/212 196/78/196 197/137/197 +f 211/138/211 350/114/350 349/83/349 212/80/212 +f 212/80/212 213/39/213 195/37/195 196/78/196 +f 212/80/212 326/66/326 325/34/325 213/39/213 +f 213/39/213 214/19/214 210/18/210 195/37/195 +f 213/39/213 298/27/298 297/16/297 214/19/214 +f 214/19/214 215/40/215 209/38/209 210/18/210 +f 214/19/214 266/16/266 265/28/265 215/40/215 +f 215/40/215 216/77/216 208/79/208 209/38/209 +f 215/40/215 250/35/250 249/63/249 216/77/216 +f 216/77/216 217/136/217 207/135/207 208/79/208 +f 216/77/216 242/84/242 241/112/241 217/136/217 +f 217/136/217 218/218/218 206/217/206 207/135/207 +f 217/136/217 314/143/314 313/186/313 218/218/218 +f 218/218/218 219/290/219 205/288/205 206/217/206 +f 218/218/218 274/224/274 273/280/273 219/290/219 +f 219/290/219 220/342/220 204/340/204 205/288/205 +f 219/290/219 342/302/342 341/338/341 220/342/220 +f 220/342/220 221/376/221 203/374/203 204/340/204 +f 220/342/220 230/350/230 229/382/229 221/376/221 +f 221/376/221 222/395/222 202/394/202 203/374/203 +f 221/376/221 322/390/322 321/399/321 222/395/222 +f 222/395/222 223/375/223 201/373/201 202/394/202 +f 222/395/222 290/399/290 289/389/289 223/375/223 +f 223/375/223 224/341/224 200/339/200 201/373/201 +f 223/375/223 310/381/310 309/349/309 224/341/224 +f 224/341/224 225/289/225 199/287/199 200/339/200 +f 224/341/224 254/337/254 253/299/253 225/289/225 +f 225/289/225 226/220/226 198/219/198 199/287/199 +f 225/289/225 354/278/354 353/230/353 226/220/226 +f 226/220/226 306/190/306 305/146/305 211/138/211 +f 228/401/228 229/382/229 230/350/230 227/363/227 +f 228/401/228 319/405/319 322/390/322 229/382/229 +f 229/382/229 322/390/322 221/376/221 +f 230/350/230 341/338/341 340/357/340 227/363/227 +f 231/386/231 236/372/236 188/368/188 +f 232/361/232 233/348/233 234/380/234 231/400/231 +f 232/361/232 275/355/275 278/336/278 233/348/233 +f 234/380/234 237/388/237 236/404/236 231/400/231 +f 235/346/235 292/331/292 189/327/189 +f 236/404/236 237/388/237 238/398/238 235/408/235 +f 238/398/238 293/397/293 292/408/292 235/408/235 +f 240/106/240 241/112/241 242/84/242 239/62/239 +f 240/106/240 311/125/311 314/143/314 241/112/241 +f 241/112/241 314/143/314 217/136/217 +f 242/84/242 249/63/249 248/49/248 239/62/239 +f 243/370/243 276/384/276 186/366/186 +f 244/229/244 245/228/245 246/279/246 243/293/243 +f 244/229/244 315/189/315 318/187/318 245/228/245 +f 246/279/246 277/301/277 276/305/276 243/293/243 +f 248/49/248 249/63/249 250/35/250 247/11/247 +f 249/63/249 242/84/242 216/77/216 +f 250/35/250 265/28/265 264/3/264 247/11/247 +f 252/303/252 253/299/253 254/337/254 251/356/251 +f 252/303/252 351/292/351 354/278/354 253/299/253 +f 253/299/253 354/278/354 225/289/225 +f 254/337/254 309/349/309 308/362/308 251/356/251 +f 255/20/255 332/30/332 180/43/180 +f 256/47/256 257/64/257 258/33/258 255/12/255 +f 256/47/256 279/59/279 282/81/282 257/64/257 +f 258/33/258 333/25/333 332/4/332 255/12/255 +f 259/221/259 284/180/284 191/185/191 +f 260/402/260 261/379/261 262/347/262 259/364/259 +f 260/402/260 291/406/291 294/387/294 261/379/261 +f 262/347/262 285/335/285 284/358/284 259/364/259 +f 264/3/264 265/28/265 266/16/266 263/1/263 +f 265/28/265 250/35/250 215/40/215 +f 266/16/266 297/16/297 296/1/296 263/1/263 +f 267/109/267 300/139/300 182/128/182 +f 268/2/268 269/15/269 270/26/270 267/5/267 +f 268/2/268 331/2/331 334/15/334 269/15/269 +f 270/26/270 301/36/301 300/13/300 267/5/267 +f 272/294/272 273/280/273 274/224/274 271/225/271 +f 272/294/272 339/306/339 342/302/342 273/280/273 +f 273/280/273 342/302/342 219/290/219 +f 274/224/274 313/186/313 312/188/312 271/225/271 +f 275/393/275 232/396/232 187/378/187 +f 276/305/276 277/301/277 278/336/278 275/355/275 +f 279/10/279 256/9/256 179/24/179 +f 280/107/280 281/113/281 282/81/282 279/59/279 +f 280/107/280 327/126/327 330/145/330 281/113/281 +f 283/129/283 336/104/336 192/122/192 +f 284/358/284 285/335/285 286/300/286 283/304/283 +f 286/300/286 337/277/337 336/291/336 283/304/283 +f 288/407/288 289/389/289 290/399/290 287/409/287 +f 288/407/288 307/403/307 310/381/310 289/389/289 +f 289/389/289 310/381/310 223/375/223 +f 290/399/290 321/399/321 320/409/320 287/409/287 +f 291/296/291 260/266/260 190/274/190 +f 292/408/292 293/397/293 294/387/294 291/406/291 +f 296/1/296 297/16/297 298/27/298 295/6/295 +f 297/16/297 266/16/266 214/19/214 +f 298/27/298 325/34/325 324/14/324 295/6/295 +f 299/181/299 344/222/344 183/214/183 +f 300/13/300 301/36/301 302/65/302 299/50/299 +f 302/65/302 345/82/345 344/61/344 299/50/299 +f 304/127/304 305/146/305 306/190/306 303/190/303 +f 304/127/304 347/108/347 350/114/350 305/146/305 +f 305/146/305 350/114/350 211/138/211 +f 306/190/306 353/230/353 352/230/352 303/190/303 +f 308/362/308 309/349/309 310/381/310 307/403/307 +f 309/349/309 254/337/254 224/341/224 +f 312/188/312 313/186/313 314/143/314 311/125/311 +f 313/186/313 274/224/274 218/218/218 +f 315/332/315 244/345/244 185/328/185 +f 316/124/316 317/144/317 318/187/318 315/189/315 +f 316/124/316 343/105/343 346/111/346 317/144/317 +f 320/409/320 321/399/321 322/390/322 319/405/319 +f 321/399/321 290/399/290 222/395/222 +f 324/14/324 325/34/325 326/66/326 323/48/323 +f 325/34/325 298/27/298 213/39/213 +f 326/66/326 349/83/349 348/60/348 323/48/323 +f 327/32/327 280/22/280 194/44/194 +f 328/191/328 329/192/329 330/145/330 327/126/327 +f 328/191/328 335/226/335 338/227/338 329/192/329 +f 331/57/331 268/72/268 181/76/181 +f 332/4/332 333/25/333 334/15/334 331/2/331 +f 335/71/335 328/58/328 193/75/193 +f 336/291/336 337/277/337 338/227/338 335/226/335 +f 340/357/340 341/338/341 342/302/342 339/306/339 +f 341/338/341 230/350/230 220/342/220 +f 343/273/343 316/298/316 184/276/184 +f 344/61/344 345/82/345 346/111/346 343/105/343 +f 348/60/348 349/83/349 350/114/350 347/108/347 +f 349/83/349 326/66/326 212/80/212 +f 352/230/352 353/230/353 354/278/354 351/292/351 +f 353/230/353 306/190/306 226/220/226 diff --git a/res/models/ships/burger/burger.png b/res/models/ships/burger/burger.png new file mode 100644 index 0000000..8fb828a Binary files /dev/null and b/res/models/ships/burger/burger.png differ diff --git a/res/models/ships/cube/cube.mtl b/res/models/ships/cube/cube.mtl new file mode 100644 index 0000000..bba99f5 --- /dev/null +++ b/res/models/ships/cube/cube.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl cube +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd cube.png + diff --git a/res/models/ships/cube/cube.obj b/res/models/ships/cube/cube.obj new file mode 100644 index 0000000..3563b9f --- /dev/null +++ b/res/models/ships/cube/cube.obj @@ -0,0 +1,701 @@ +# Exported from Wings 3D 1.4.1 +mtllib cube.mtl +o cube +#144 vertices, 154 faces +v 1.00000000 0.59692804 0.59692804 +v 1.00000000 -0.59692804 0.59692804 +v 1.00000000 -0.59692804 -0.59692804 +v 1.00000000 0.59692804 -0.59692804 +v 0.59692804 1.00000000 0.59692804 +v 0.59692804 1.00000000 -0.59692804 +v -0.59692804 1.00000000 -0.59692804 +v -0.59692804 1.00000000 0.59692804 +v 0.80918519 -0.80918519 0.80918519 +v -0.59692804 -0.91737476 -0.79640302 +v -0.59692804 -0.79640302 -0.91737476 +v 0.59692804 -0.79640302 -0.91737476 +v 0.59692804 -0.91737476 -0.79640302 +v 0.59692804 0.59692804 -1.00000000 +v 0.59692804 -0.59692804 -1.00000000 +v -0.59692804 -0.59692804 -1.00000000 +v -0.59692804 0.59692804 -1.00000000 +v -0.59692804 -0.79640302 0.91737476 +v -0.59692804 -0.91737476 0.79640302 +v 0.59692804 -0.91737476 0.79640302 +v 0.59692804 -0.79640302 0.91737476 +v 0.79640302 -0.91737476 -0.59692804 +v 0.91737476 -0.79640302 -0.59692804 +v 0.91737476 -0.79640302 0.59692804 +v 0.79640302 -0.91737476 0.59692804 +v 0.91737476 0.59692804 0.79640302 +v 0.79640302 0.59692804 0.91737476 +v 0.79640302 -0.59692804 0.91737476 +v 0.91737476 -0.59692804 0.79640302 +v 0.80918519 0.80918519 -0.80918519 +v -0.79640302 0.91737476 -0.59692804 +v -0.91737476 0.79640302 -0.59692804 +v -0.91737476 0.79640302 0.59692804 +v -0.79640302 0.91737476 0.59692804 +v -1.00000000 -0.59692804 0.59692804 +v -1.00000000 0.59692804 0.59692804 +v -1.00000000 0.59692804 -0.59692804 +v -1.00000000 -0.59692804 -0.59692804 +v 0.59692804 -1.00000000 -0.59692804 +v 0.59692804 -1.00000000 0.59692804 +v -0.59692804 -1.00000000 0.59692804 +v -0.59692804 -1.00000000 -0.59692804 +v -0.80918519 -0.80918519 0.80918519 +v -0.80918519 -0.80918519 -0.80918519 +v -0.79640302 -0.59692804 -0.91737476 +v -0.91737476 -0.59692804 -0.79640302 +v -0.91737476 0.59692804 -0.79640302 +v -0.79640302 0.59692804 -0.91737476 +v 0.91737476 0.79640302 -0.59692804 +v 0.79640302 0.91737476 -0.59692804 +v 0.79640302 0.91737476 0.59692804 +v 0.91737476 0.79640302 0.59692804 +v -0.59692804 0.91737476 0.79640302 +v -0.59692804 0.79640302 0.91737476 +v 0.59692804 0.79640302 0.91737476 +v 0.59692804 0.91737476 0.79640302 +v -0.80918519 0.80918519 -0.80918519 +v 0.59692804 -0.59692804 1.00000000 +v 0.59692804 0.59692804 1.00000000 +v -0.59692804 0.59692804 1.00000000 +v -0.59692804 -0.59692804 1.00000000 +v -0.59692804 0.79640302 -0.91737476 +v -0.59692804 0.91737476 -0.79640302 +v 0.59692804 0.91737476 -0.79640302 +v 0.59692804 0.79640302 -0.91737476 +v -0.91737476 -0.79640302 -0.59692804 +v -0.79640302 -0.91737476 -0.59692804 +v -0.79640302 -0.91737476 0.59692804 +v -0.91737476 -0.79640302 0.59692804 +v -0.79640302 0.59692804 0.91737476 +v -0.91737476 0.59692804 0.79640302 +v -0.91737476 -0.59692804 0.79640302 +v -0.79640302 -0.59692804 0.91737476 +v 0.91737476 -0.59692804 -0.79640302 +v 0.79640302 -0.59692804 -0.91737476 +v 0.79640302 0.59692804 -0.91737476 +v 0.91737476 0.59692804 -0.79640302 +v 0.80918519 0.80918519 0.80918519 +v 0.80918519 -0.80918519 -0.80918519 +v -0.80918519 0.80918519 0.80918519 +v 1.00000000 0.29846402 0.59692804 +v 0.59692804 0.29846402 -1.00000000 +v 0.79640302 0.29846402 0.91737476 +v -1.00000000 0.29846402 -0.59692804 +v -0.79640302 0.29846402 -0.91737476 +v -0.59692804 0.29846402 1.00000000 +v -0.91737476 0.29846402 0.79640302 +v 0.91737476 0.29846402 -0.79640302 +v 0.79640302 0.29846402 -0.91737476 +v -0.79640302 0.29846402 0.91737476 +v 0.59692804 0.29846402 1.00000000 +v -0.91737476 0.29846402 -0.79640302 +v -1.00000000 0.29846402 0.59692804 +v 0.91737476 0.29846402 0.79640302 +v -0.59692804 0.29846402 -1.00000000 +v 1.00000000 0.29846402 -0.59692804 +v 1.00000000 -0.29846402 -0.59692804 +v -0.59692804 -0.29846402 -1.00000000 +v 0.91737476 -0.29846402 0.79640302 +v -1.00000000 -0.29846402 0.59692804 +v -0.91737476 -0.29846402 -0.79640302 +v 0.59692804 -0.29846402 1.00000000 +v -0.79640302 -0.29846402 0.91737476 +v 0.79640302 -0.29846402 -0.91737476 +v 0.91737476 -0.29846402 -0.79640302 +v -0.91737476 -0.29846402 0.79640302 +v -0.59692804 -0.29846402 1.00000000 +v -0.79640302 -0.29846402 -0.91737476 +v -1.00000000 -0.29846402 -0.59692804 +v 0.79640302 -0.29846402 0.91737476 +v 0.59692804 -0.29846402 -1.00000000 +v 1.00000000 -0.29846402 0.59692804 +v 1.09200000 0.23280194 -0.65184542 +v -0.65184542 0.23280194 -1.09200000 +v 1.00177324 0.23280194 0.86967209 +v -1.09200000 0.23280194 0.65184542 +v -1.00177324 0.23280194 -0.86967209 +v 0.65184542 0.23280194 1.09200000 +v -0.86967209 0.23280194 1.00177324 +v 0.86967209 0.23280194 -1.00177324 +v 1.09200000 0.23280194 0.65184542 +v 0.65184542 0.23280194 -1.09200000 +v 0.86967209 0.23280194 1.00177324 +v -1.09200000 0.23280194 -0.65184542 +v -0.86967209 0.23280194 -1.00177324 +v -0.65184542 0.23280194 1.09200000 +v -1.00177324 0.23280194 0.86967209 +v 1.00177324 0.23280194 -0.86967209 +v 1.09200000 -0.23280194 0.65184542 +v 0.65184542 -0.23280194 -1.09200000 +v 0.86967209 -0.23280194 1.00177324 +v -1.09200000 -0.23280194 -0.65184542 +v -0.86967209 -0.23280194 -1.00177324 +v -0.65184542 -0.23280194 1.09200000 +v -1.00177324 -0.23280194 0.86967209 +v 1.00177324 -0.23280194 -0.86967209 +v 1.09200000 -0.23280194 -0.65184542 +v -0.65184542 -0.23280194 -1.09200000 +v 1.00177324 -0.23280194 0.86967209 +v -1.09200000 -0.23280194 0.65184542 +v -1.00177324 -0.23280194 -0.86967209 +v 0.65184542 -0.23280194 1.09200000 +v -0.86967209 -0.23280194 1.00177324 +v 0.86967209 -0.23280194 -1.00177324 +vt 0.10926221 0.18382810 +vt 0.10926221 0.37706964 +vt 0.10933353 0.18381644 +vt 0.10933353 0.37705798 +vt 0.12263621 0.15154042 +vt 0.12263621 0.40935733 +vt 0.12270752 0.15152876 +vt 0.12270752 0.40934566 +vt 0.13249518 0.37423076 +vt 0.13259907 0.37476585 +vt 0.13294012 0.18719288 +vt 0.13299310 0.18737710 +vt 0.14221710 0.13195953 +vt 0.14221710 0.42893822 +vt 0.14228842 0.13194787 +vt 0.14228842 0.42892655 +vt 0.14801052 0.15725514 +vt 0.14807584 0.15778122 +vt 0.14863112 0.40294274 +vt 0.14868040 0.40339230 +vt 0.15115217 0.37358789 +vt 0.15124780 0.37465290 +vt 0.15139464 0.18736391 +vt 0.15154530 0.18760601 +vt 0.17450478 0.11858553 +vt 0.17450478 0.18382810 +vt 0.17450478 0.37706964 +vt 0.17450478 0.44231221 +vt 0.17457610 0.11857387 +vt 0.17457610 0.18381644 +vt 0.17457610 0.37705798 +vt 0.17457610 0.44230055 +vt 0.17726605 0.14183761 +vt 0.17733903 0.41905559 +vt 0.17752433 0.40020739 +vt 0.17782085 0.16048059 +vt 0.17784446 0.41868318 +vt 0.17796223 0.14229569 +vt 0.17800939 0.40041259 +vt 0.17816527 0.16084258 +vt 0.23828452 0.82183733 +vt 0.23842588 0.88107961 +vt 0.24023313 0.59619671 +vt 0.24037173 0.65728408 +vt 0.24900068 0.89424803 +vt 0.24912512 0.93618825 +vt 0.24936622 0.67542459 +vt 0.24949634 0.71536685 +vt 0.25048933 0.80474928 +vt 0.25061377 0.76280906 +vt 0.25074170 0.53729284 +vt 0.25087182 0.57723510 +vt 0.26327948 0.82178230 +vt 0.26342084 0.88102679 +vt 0.26487322 0.59588136 +vt 0.26501300 0.65748761 +vt 0.27304315 0.89417797 +vt 0.27316758 0.93611563 +vt 0.27423724 0.67573156 +vt 0.27436493 0.71492547 +vt 0.27453179 0.80481933 +vt 0.27465623 0.76288168 +vt 0.27561272 0.53759981 +vt 0.27574040 0.57679372 +vt 0.29482115 0.82170563 +vt 0.29496256 0.88096735 +vt 0.29624263 0.59553134 +vt 0.29638368 0.65769528 +vt 0.30338560 0.89409634 +vt 0.30350998 0.93601721 +vt 0.30487424 0.80490097 +vt 0.30499863 0.76298010 +vt 0.30502699 0.67602752 +vt 0.30515221 0.71446311 +vt 0.30640246 0.53789577 +vt 0.30652768 0.57633136 +vt 0.36415636 0.16085419 +vt 0.36431290 0.40040096 +vt 0.36435905 0.14230730 +vt 0.36447899 0.41869473 +vt 0.36450148 0.16046847 +vt 0.36479944 0.40021904 +vt 0.36498357 0.41904418 +vt 0.36505685 0.14182556 +vt 0.36774632 0.11858553 +vt 0.36774632 0.18382810 +vt 0.36774632 0.37706964 +vt 0.36774632 0.44231221 +vt 0.36781764 0.11857387 +vt 0.36781764 0.18381644 +vt 0.36781764 0.37705798 +vt 0.36781764 0.44230055 +vt 0.39077716 0.18759452 +vt 0.39092786 0.18737529 +vt 0.39107472 0.37466339 +vt 0.39117010 0.37357615 +vt 0.39364279 0.40340356 +vt 0.39369156 0.40293084 +vt 0.39424644 0.15776951 +vt 0.39431099 0.15726618 +vt 0.40003400 0.13195953 +vt 0.40003400 0.42893822 +vt 0.40010532 0.13194787 +vt 0.40010532 0.42892655 +vt 0.40932942 0.18736603 +vt 0.40938227 0.18720466 +vt 0.40972292 0.37477650 +vt 0.40982726 0.37421848 +vt 0.41961489 0.15154042 +vt 0.41961489 0.40935733 +vt 0.41968621 0.15152876 +vt 0.41968621 0.40934566 +vt 0.43298889 0.18382810 +vt 0.43298889 0.37706964 +vt 0.43306021 0.18381644 +vt 0.43306021 0.37705798 +vt 0.46934332 0.82128403 +vt 0.46948494 0.88063589 +vt 0.47090505 0.59498253 +vt 0.47104679 0.65745149 +vt 0.47104899 0.89363114 +vt 0.47117318 0.93548747 +vt 0.47253763 0.80536617 +vt 0.47266182 0.76350984 +vt 0.47303821 0.67570352 +vt 0.47316258 0.71387909 +vt 0.47441369 0.53757177 +vt 0.47453806 0.57574735 +vt 0.50098530 0.82110468 +vt 0.50112745 0.88067871 +vt 0.50125961 0.89367049 +vt 0.50138303 0.93526886 +vt 0.50262197 0.59479963 +vt 0.50274825 0.80532682 +vt 0.50276421 0.65749047 +vt 0.50287168 0.76372845 +vt 0.50320827 0.67577021 +vt 0.50333168 0.71364936 +vt 0.50458375 0.53763846 +vt 0.50470715 0.57551761 +vt 0.51776854 0.17286693 +vt 0.51776854 0.38388669 +vt 0.51777654 0.17287161 +vt 0.51777654 0.38389137 +vt 0.52504727 0.89373712 +vt 0.52516989 0.93506107 +vt 0.52614809 0.82093977 +vt 0.52629077 0.88073504 +vt 0.52653592 0.80526019 +vt 0.52665853 0.76393624 +vt 0.52695451 0.67581702 +vt 0.52707719 0.71347421 +vt 0.52782653 0.59466414 +vt 0.52796912 0.65751158 +vt 0.52832998 0.53768527 +vt 0.52845266 0.57534246 +vt 0.53237294 0.13760878 +vt 0.53237294 0.41914484 +vt 0.53238094 0.13761346 +vt 0.53238094 0.41914952 +vt 0.53265997 0.18175604 +vt 0.53265997 0.37499758 +vt 0.53266796 0.18176072 +vt 0.53266796 0.37500226 +vt 0.54603396 0.14946835 +vt 0.54603396 0.40728526 +vt 0.54604196 0.14947304 +vt 0.54604196 0.40728994 +vt 0.55375528 0.11622644 +vt 0.55375528 0.44052717 +vt 0.55376327 0.11623113 +vt 0.55376327 0.44053185 +vt 0.55484439 0.89382448 +vt 0.55496596 0.93479689 +vt 0.55633303 0.80517283 +vt 0.55645460 0.76420042 +vt 0.55676061 0.67583649 +vt 0.55688264 0.71329366 +vt 0.55804013 0.82072098 +vt 0.55813609 0.53770474 +vt 0.55818352 0.88081622 +vt 0.55825812 0.57516191 +vt 0.55970838 0.59451707 +vt 0.55985131 0.65751398 +vt 0.56561486 0.12988746 +vt 0.56561486 0.42686615 +vt 0.56562285 0.12989215 +vt 0.56562285 0.42687083 +vt 0.58901343 0.10162204 +vt 0.58901343 0.45513158 +vt 0.58902143 0.10162672 +vt 0.58902143 0.45513626 +vt 0.59790254 0.11651347 +vt 0.59790254 0.44024015 +vt 0.59791054 0.11651815 +vt 0.59791054 0.44024483 +vt 0.71836838 0.89347615 +vt 0.71848914 0.93417485 +vt 0.71985703 0.80552116 +vt 0.71997778 0.76482246 +vt 0.72107375 0.67541563 +vt 0.72119563 0.71282648 +vt 0.72244923 0.53728388 +vt 0.72257111 0.57469473 +vt 0.73535240 0.82015638 +vt 0.73549666 0.88061571 +vt 0.73625566 0.59408834 +vt 0.73639873 0.65714155 +vt 0.74757054 0.89376773 +vt 0.74768905 0.93370999 +vt 0.74905918 0.80522958 +vt 0.74917769 0.76528732 +vt 0.75078296 0.67533730 +vt 0.75090483 0.71274425 +vt 0.75215844 0.53720555 +vt 0.75228031 0.57461250 +vt 0.76768260 0.81977260 +vt 0.76782836 0.88085998 +vt 0.76819019 0.59401413 +vt 0.76833326 0.65707085 +vt 0.79114408 0.11651347 +vt 0.79114408 0.44024015 +vt 0.79115207 0.11651815 +vt 0.79115207 0.44024483 +vt 0.80003319 0.10162204 +vt 0.80003319 0.45513158 +vt 0.80004118 0.10162672 +vt 0.80004118 0.45513626 +vt 0.82343176 0.12988746 +vt 0.82343176 0.42686615 +vt 0.82343976 0.12989215 +vt 0.82343976 0.42687083 +vt 0.83529134 0.11622644 +vt 0.83529134 0.44052717 +vt 0.83529934 0.11623113 +vt 0.83529934 0.44053185 +vt 0.84301265 0.14946835 +vt 0.84301265 0.40728526 +vt 0.84302065 0.14947304 +vt 0.84302065 0.40728994 +vt 0.85638665 0.18175604 +vt 0.85638665 0.37499758 +vt 0.85639465 0.18176072 +vt 0.85639465 0.37500226 +vt 0.85667367 0.13760878 +vt 0.85667367 0.41914484 +vt 0.85668167 0.13761346 +vt 0.85668167 0.41914952 +vt 0.87127808 0.17286693 +vt 0.87127808 0.38388669 +vt 0.87128607 0.17287161 +vt 0.87128607 0.38389137 +vn 0.95993592 0.19814519 0.19814519 +vn 0.95993592 -0.19814519 0.19814519 +vn 0.95993592 -0.19814519 -0.19814519 +vn 0.95993592 0.19814519 -0.19814519 +vn 0.19814519 0.95993592 0.19814519 +vn 0.19814519 0.95993592 -0.19814519 +vn -0.19814519 0.95993592 -0.19814519 +vn -0.19814519 0.95993592 0.19814519 +vn 0.57735027 -0.57735027 0.57735027 +vn -0.17631327 -0.81375197 -0.55382431 +vn -0.17631327 -0.55382431 -0.81375197 +vn 0.17631327 -0.55382431 -0.81375197 +vn 0.17631327 -0.81375197 -0.55382431 +vn 0.19814519 0.19814519 -0.95993592 +vn 0.19814519 -0.19814519 -0.95993592 +vn -0.19814519 -0.19814519 -0.95993592 +vn -0.19814519 0.19814519 -0.95993592 +vn -0.17631327 -0.55382431 0.81375197 +vn -0.17631327 -0.81375197 0.55382431 +vn 0.17631327 -0.81375197 0.55382431 +vn 0.17631327 -0.55382431 0.81375197 +vn 0.55382431 -0.81375197 -0.17631327 +vn 0.81375197 -0.55382431 -0.17631327 +vn 0.81375197 -0.55382431 0.17631327 +vn 0.55382431 -0.81375197 0.17631327 +vn 0.81375197 0.17631327 0.55382431 +vn 0.55382431 0.17631327 0.81375197 +vn 0.55382431 -0.17631327 0.81375197 +vn 0.81375197 -0.17631327 0.55382431 +vn 0.57735027 0.57735027 -0.57735027 +vn -0.55382431 0.81375197 -0.17631327 +vn -0.81375197 0.55382431 -0.17631327 +vn -0.81375197 0.55382431 0.17631327 +vn -0.55382431 0.81375197 0.17631327 +vn -0.95993592 -0.19814519 0.19814519 +vn -0.95993592 0.19814519 0.19814519 +vn -0.95993592 0.19814519 -0.19814519 +vn -0.95993592 -0.19814519 -0.19814519 +vn 0.19814519 -0.95993592 -0.19814519 +vn 0.19814519 -0.95993592 0.19814519 +vn -0.19814519 -0.95993592 0.19814519 +vn -0.19814519 -0.95993592 -0.19814519 +vn -0.57735027 -0.57735027 0.57735027 +vn -0.57735027 -0.57735027 -0.57735027 +vn -0.55382431 -0.17631327 -0.81375197 +vn -0.81375197 -0.17631327 -0.55382431 +vn -0.81375197 0.17631327 -0.55382431 +vn -0.55382431 0.17631327 -0.81375197 +vn 0.81375197 0.55382431 -0.17631327 +vn 0.55382431 0.81375197 -0.17631327 +vn 0.55382431 0.81375197 0.17631327 +vn 0.81375197 0.55382431 0.17631327 +vn -0.17631327 0.81375197 0.55382431 +vn -0.17631327 0.55382431 0.81375197 +vn 0.17631327 0.55382431 0.81375197 +vn 0.17631327 0.81375197 0.55382431 +vn -0.57735027 0.57735027 -0.57735027 +vn 0.19814519 -0.19814519 0.95993592 +vn 0.19814519 0.19814519 0.95993592 +vn -0.19814519 0.19814519 0.95993592 +vn -0.19814519 -0.19814519 0.95993592 +vn -0.17631327 0.55382431 -0.81375197 +vn -0.17631327 0.81375197 -0.55382431 +vn 0.17631327 0.81375197 -0.55382431 +vn 0.17631327 0.55382431 -0.81375197 +vn -0.81375197 -0.55382431 -0.17631327 +vn -0.55382431 -0.81375197 -0.17631327 +vn -0.55382431 -0.81375197 0.17631327 +vn -0.81375197 -0.55382431 0.17631327 +vn -0.55382431 0.17631327 0.81375197 +vn -0.81375197 0.17631327 0.55382431 +vn -0.81375197 -0.17631327 0.55382431 +vn -0.55382431 -0.17631327 0.81375197 +vn 0.81375197 -0.17631327 -0.55382431 +vn 0.55382431 -0.17631327 -0.81375197 +vn 0.55382431 0.17631327 -0.81375197 +vn 0.81375197 0.17631327 -0.55382431 +vn 0.57735027 0.57735027 0.57735027 +vn 0.57735027 -0.57735027 -0.57735027 +vn -0.57735027 0.57735027 0.57735027 +vn 0.86142120 0.47921947 0.16823264 +vn 0.16823264 0.47921947 -0.86142120 +vn 0.48067365 0.49863422 0.72132985 +vn -0.86142120 0.47921947 -0.16823264 +vn -0.48067365 0.49863422 -0.72132985 +vn -0.16823264 0.47921947 0.86142120 +vn -0.72132985 0.49863422 0.48067365 +vn 0.72132985 0.49863422 -0.48067365 +vn 0.48067365 0.49863422 -0.72132985 +vn -0.48067365 0.49863422 0.72132985 +vn 0.16823264 0.47921947 0.86142120 +vn -0.72132985 0.49863422 -0.48067365 +vn -0.86142120 0.47921947 0.16823264 +vn 0.72132985 0.49863422 0.48067365 +vn -0.16823264 0.47921947 -0.86142120 +vn 0.86142120 0.47921947 -0.16823264 +vn 0.86142120 -0.47921947 -0.16823264 +vn -0.16823264 -0.47921947 -0.86142120 +vn 0.72132985 -0.49863422 0.48067365 +vn -0.86142120 -0.47921947 0.16823264 +vn -0.72132985 -0.49863422 -0.48067365 +vn 0.16823264 -0.47921947 0.86142120 +vn -0.48067365 -0.49863422 0.72132985 +vn 0.48067365 -0.49863422 -0.72132985 +vn 0.72132985 -0.49863422 -0.48067365 +vn -0.72132985 -0.49863422 0.48067365 +vn -0.16823264 -0.47921947 0.86142120 +vn -0.48067365 -0.49863422 -0.72132985 +vn -0.86142120 -0.47921947 -0.16823264 +vn 0.48067365 -0.49863422 0.72132985 +vn 0.16823264 -0.47921947 -0.86142120 +vn 0.86142120 -0.47921947 0.16823264 +vn 0.86142120 0.47921947 -0.16823264 +vn -0.16823264 0.47921947 -0.86142120 +vn 0.72132985 0.49863422 0.48067365 +vn -0.86142120 0.47921947 0.16823264 +vn -0.72132985 0.49863422 -0.48067365 +vn 0.16823264 0.47921947 0.86142120 +vn -0.48067365 0.49863422 0.72132985 +vn 0.48067365 0.49863422 -0.72132985 +vn 0.86142120 0.47921947 0.16823264 +vn 0.16823264 0.47921947 -0.86142120 +vn 0.48067365 0.49863422 0.72132985 +vn -0.86142120 0.47921947 -0.16823264 +vn -0.48067365 0.49863422 -0.72132985 +vn -0.16823264 0.47921947 0.86142120 +vn -0.72132985 0.49863422 0.48067365 +vn 0.72132985 0.49863422 -0.48067365 +vn 0.86142120 -0.47921947 0.16823264 +vn 0.16823264 -0.47921947 -0.86142120 +vn 0.48067365 -0.49863422 0.72132985 +vn -0.86142120 -0.47921947 -0.16823264 +vn -0.48067365 -0.49863422 -0.72132985 +vn -0.16823264 -0.47921947 0.86142120 +vn -0.72132985 -0.49863422 0.48067365 +vn 0.72132985 -0.49863422 -0.48067365 +vn 0.86142120 -0.47921947 -0.16823264 +vn -0.16823264 -0.47921947 -0.86142120 +vn 0.72132985 -0.49863422 0.48067365 +vn -0.86142120 -0.47921947 0.16823264 +vn -0.72132985 -0.49863422 -0.48067365 +vn 0.16823264 -0.47921947 0.86142120 +vn -0.48067365 -0.49863422 0.72132985 +vn 0.48067365 -0.49863422 -0.72132985 +g cube_cube +usemtl cube +s 1 +f 1/28/1 52/34/52 78/19/78 26/14/26 +f 2/177/2 3/201/3 97/202/97 112/178/112 +f 2/32/2 24/37/24 23/83/23 3/92/3 +f 4/204/4 1/182/1 81/180/81 96/203/96 +f 4/88/4 49/80/49 52/34/52 1/28/1 +f 5/27/5 51/39/51 50/82/50 6/87/6 +f 6/87/6 7/86/7 8/26/8 5/27/5 +f 6/87/6 64/95/64 63/94/63 7/86/7 +f 7/86/7 31/77/31 34/36/34 8/26/8 +f 8/26/8 53/24/53 56/21/56 5/27/5 +f 10/93/10 44/99/44 11/105/11 +f 11/105/11 12/108/12 13/96/13 10/93/10 +f 11/105/11 16/115/16 15/116/15 12/108/12 +f 12/108/12 79/98/79 13/96/13 +f 13/96/13 39/91/39 42/90/42 10/93/10 +f 15/71/15 16/123/16 98/124/98 111/72/111 +f 15/116/15 75/112/75 79/98/79 12/108/12 +f 17/122/17 14/70/14 82/69/82 95/121/95 +f 17/113/17 62/106/62 65/107/65 14/114/14 +f 18/11/18 43/17/43 19/23/19 +f 19/23/19 20/22/20 21/10/21 18/11/18 +f 19/23/19 41/30/41 40/31/40 20/22/20 +f 20/22/20 9/20/9 21/10/21 +f 20/22/20 40/31/40 25/35/25 9/20/9 +f 21/10/21 58/4/58 61/3/61 18/11/18 +f 22/78/22 79/98/79 23/83/23 +f 23/83/23 24/37/24 25/35/25 22/78/22 +f 23/83/23 79/98/79 74/104/74 3/92/3 +f 24/37/24 9/20/9 25/35/25 +f 25/35/25 40/31/40 39/91/39 22/78/22 +f 26/14/26 78/19/78 27/6/27 +f 27/140/27 83/139/83 94/155/94 26/156/26 +f 28/8/28 9/20/9 29/16/29 +f 28/137/28 29/151/29 99/152/99 110/138/110 +f 28/8/28 58/4/58 21/10/21 9/20/9 +f 29/16/29 9/20/9 24/37/24 2/32/2 +f 31/77/31 57/100/57 32/79/32 +f 32/79/32 33/33/33 34/36/34 31/77/31 +f 32/79/32 37/85/37 36/25/36 33/33/33 +f 33/33/33 80/18/80 34/36/34 +f 34/36/34 80/18/80 53/24/53 8/26/8 +f 36/198/36 37/174/37 84/173/84 93/197/93 +f 36/25/36 71/13/71 80/18/80 33/33/33 +f 38/175/38 35/199/35 100/200/100 109/176/109 +f 38/89/38 66/84/66 69/38/69 35/29/35 +f 40/31/40 41/30/41 42/90/42 39/91/39 +f 41/30/41 68/40/68 67/81/67 42/90/42 +f 42/90/42 67/81/67 44/99/44 10/93/10 +f 43/17/43 68/40/68 41/30/41 19/23/19 +f 44/99/44 45/111/45 16/115/16 11/105/11 +f 45/111/45 44/99/44 46/103/46 +f 46/103/46 44/99/44 66/84/66 38/89/38 +f 46/149/46 101/150/101 108/136/108 45/134/45 +f 47/146/47 48/132/48 85/131/85 92/145/92 +f 47/101/47 57/100/57 48/109/48 +f 48/109/48 57/100/57 62/106/62 17/113/17 +f 49/80/49 30/97/30 50/82/50 +f 50/82/50 30/97/30 64/95/64 6/87/6 +f 50/82/50 51/39/51 52/34/52 49/80/49 +f 51/39/51 78/19/78 52/34/52 +f 53/24/53 80/18/80 54/12/54 +f 54/12/54 55/9/55 56/21/56 53/24/53 +f 54/12/54 60/1/60 59/2/59 55/9/55 +f 55/9/55 78/19/78 56/21/56 +f 56/21/56 78/19/78 51/39/51 5/27/5 +f 57/100/57 47/101/47 37/85/37 32/79/32 +f 59/128/59 60/76/60 86/75/86 91/127/91 +f 61/73/61 58/125/58 102/126/102 107/74/107 +f 61/3/61 73/7/73 43/17/43 18/11/18 +f 62/106/62 57/100/57 63/94/63 +f 63/94/63 57/100/57 31/77/31 7/86/7 +f 63/94/63 64/95/64 65/107/65 62/106/62 +f 64/95/64 30/97/30 65/107/65 +f 65/107/65 30/97/30 76/110/76 14/114/14 +f 66/84/66 44/99/44 67/81/67 +f 67/81/67 68/40/68 69/38/69 66/84/66 +f 68/40/68 43/17/43 69/38/69 +f 69/38/69 43/17/43 72/15/72 35/29/35 +f 70/5/70 80/18/80 71/13/71 +f 71/52/71 87/51/87 90/63/90 70/64/70 +f 72/15/72 43/17/43 73/7/73 +f 72/47/72 73/59/73 103/60/103 106/48/106 +f 74/104/74 79/98/79 75/112/75 +f 75/61/75 104/62/104 105/50/105 74/49/74 +f 76/110/76 30/97/30 77/102/77 +f 76/58/76 77/46/77 88/45/88 89/57/89 +f 77/102/77 30/97/30 49/80/49 4/88/4 +f 78/19/78 55/9/55 59/2/59 27/6/27 +f 79/98/79 22/78/22 39/91/39 13/96/13 +f 80/18/80 70/5/70 60/1/60 54/12/54 +f 89/57/89 82/69/82 14/70/14 76/58/76 +f 89/240/89 88/232/88 128/236/128 120/248/120 +f 90/63/90 86/75/86 60/76/60 70/64/70 +f 90/167/90 87/187/87 127/171/127 119/159/119 +f 91/127/91 83/139/83 27/140/27 59/128/59 +f 91/164/91 86/163/86 126/143/126 118/144/118 +f 92/145/92 84/173/84 37/174/37 47/146/47 +f 92/231/92 85/239/85 125/247/125 117/235/117 +f 93/195/93 84/223/84 124/227/124 116/191/116 +f 93/197/93 87/209/87 71/210/71 36/198/36 +f 94/155/94 81/180/81 1/182/1 26/156/26 +f 94/188/94 83/168/83 123/160/123 115/172/115 +f 95/243/95 82/244/82 122/252/122 114/251/114 +f 95/121/95 85/131/85 48/132/48 17/122/17 +f 96/224/96 81/196/81 121/192/121 113/228/113 +f 96/203/96 88/215/88 77/216/77 4/204/4 +f 105/214/105 97/202/97 3/201/3 74/213/74 +f 105/230/105 104/238/104 144/246/144 136/234/136 +f 106/212/106 100/200/100 35/199/35 72/211/72 +f 106/185/106 103/165/103 143/157/143 135/169/135 +f 107/161/107 102/162/102 142/142/142 134/141/134 +f 107/74/107 103/60/103 73/59/73 61/73/61 +f 108/136/108 98/124/98 16/123/16 45/134/45 +f 108/237/108 101/229/101 141/233/141 133/245/133 +f 109/221/109 100/193/100 140/189/140 132/225/132 +f 109/176/109 101/150/101 46/149/46 38/175/38 +f 110/166/110 99/186/99 139/170/139 131/158/131 +f 110/138/110 102/126/102 58/125/58 28/137/28 +f 111/242/111 98/241/98 138/249/138 130/250/130 +f 111/72/111 104/62/104 75/61/75 15/71/15 +f 112/194/112 97/222/97 137/226/137 129/190/129 +f 112/178/112 99/152/99 29/151/29 2/177/2 +f 113/228/113 128/236/128 88/232/88 96/224/96 +f 113/208/113 137/207/137 136/219/136 128/220/128 +f 114/251/114 125/247/125 85/239/85 95/243/95 +f 114/118/114 138/117/138 133/129/133 125/130/125 +f 115/172/115 121/192/121 81/196/81 94/188/94 +f 115/154/115 139/153/139 129/183/129 121/184/121 +f 116/191/116 127/171/127 87/187/87 93/195/93 +f 116/206/116 140/205/140 135/217/135 127/218/127 +f 117/235/117 124/227/124 84/223/84 92/231/92 +f 117/148/117 141/147/141 132/179/132 124/181/124 +f 118/144/118 123/160/123 83/168/83 91/164/91 +f 118/120/118 142/119/142 131/133/131 123/135/123 +f 119/159/119 126/143/126 86/163/86 90/167/90 +f 119/56/119 143/55/143 134/67/134 126/68/126 +f 120/248/120 122/252/122 82/244/82 89/240/89 +f 120/54/120 144/53/144 130/65/130 122/66/122 +f 121/184/121 129/183/129 137/207/137 113/208/113 +f 122/66/122 130/65/130 138/117/138 114/118/114 +f 123/135/123 131/133/131 139/153/139 115/154/115 +f 124/181/124 132/179/132 140/205/140 116/206/116 +f 125/130/125 133/129/133 141/147/141 117/148/117 +f 126/68/126 134/67/134 142/119/142 118/120/118 +f 127/44/127 135/43/135 143/55/143 119/56/119 +f 128/42/128 136/41/136 144/53/144 120/54/120 +f 129/190/129 139/170/139 99/186/99 112/194/112 +f 130/250/130 144/246/144 104/238/104 111/242/111 +f 131/158/131 142/142/142 102/162/102 110/166/110 +f 132/225/132 141/233/141 101/229/101 109/221/109 +f 133/245/133 138/249/138 98/241/98 108/237/108 +f 134/141/134 143/157/143 103/165/103 107/161/107 +f 135/169/135 140/189/140 100/193/100 106/185/106 +f 136/234/136 137/226/137 97/222/97 105/230/105 diff --git a/res/models/ships/cube/cube.png b/res/models/ships/cube/cube.png new file mode 100644 index 0000000..b3c6d68 Binary files /dev/null and b/res/models/ships/cube/cube.png differ diff --git a/res/models/ships/cube/cube_blue.png b/res/models/ships/cube/cube_blue.png new file mode 100644 index 0000000..9ce86a6 Binary files /dev/null and b/res/models/ships/cube/cube_blue.png differ diff --git a/res/models/ships/cube/cube_purple.png b/res/models/ships/cube/cube_purple.png new file mode 100644 index 0000000..9224f8b Binary files /dev/null and b/res/models/ships/cube/cube_purple.png differ diff --git a/res/models/ships/cube/cube_red.png b/res/models/ships/cube/cube_red.png new file mode 100644 index 0000000..4609d60 Binary files /dev/null and b/res/models/ships/cube/cube_red.png differ diff --git a/res/models/ships/cube/cube_yellow.png b/res/models/ships/cube/cube_yellow.png new file mode 100644 index 0000000..283f4db Binary files /dev/null and b/res/models/ships/cube/cube_yellow.png differ diff --git a/res/models/ships/falcon/body.png b/res/models/ships/falcon/body.png new file mode 100644 index 0000000..c887294 Binary files /dev/null and b/res/models/ships/falcon/body.png differ diff --git a/res/models/ships/falcon/sidegun.png b/res/models/ships/falcon/sidegun.png new file mode 100644 index 0000000..590b8e3 Binary files /dev/null and b/res/models/ships/falcon/sidegun.png differ diff --git a/res/models/ships/falcon/starship2.mtl b/res/models/ships/falcon/starship2.mtl new file mode 100644 index 0000000..35e5ffd --- /dev/null +++ b/res/models/ships/falcon/starship2.mtl @@ -0,0 +1,50 @@ +# Exported from Wings 3D 1.4.1 +newmtl body +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd body.png + +newmtl default +Ns 100.0 +d 1.0 +illum 2 +Kd 0.7898538076923077 0.8133333333333334 0.6940444444444445 +Ka 0.7898538076923077 0.8133333333333334 0.6940444444444445 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 + +newmtl sidegun +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd sidegun.png + +newmtl wing2 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd wing2.png + +newmtl wing3 +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd wing1.png + diff --git a/res/models/ships/falcon/starship2.obj b/res/models/ships/falcon/starship2.obj new file mode 100644 index 0000000..a3da2c2 --- /dev/null +++ b/res/models/ships/falcon/starship2.obj @@ -0,0 +1,1333 @@ +# Exported from Wings 3D 1.4.1 +mtllib starship2.mtl +o sidegun2 +#80 vertices, 72 faces +v -2.32336816 5.2423845e-2 1.48791381 +v -2.23540500 -0.10797820 1.48791381 +v -2.06995935 -0.18604274 1.48791381 +v -1.89022583 -0.15195176 1.48791381 +v -1.76485652 -1.8726867e-2 1.48791381 +v -1.74173826 0.16274456 1.48791381 +v -1.82970142 0.32314661 1.48791381 +v -1.99514706 0.40121114 1.48791381 +v -2.17488059 0.36712017 1.48791381 +v -2.30024989 0.23389527 1.48791381 +v -2.32336816 5.2423845e-2 -1.03564579 +v -2.23540500 -0.10797820 -1.03564579 +v -2.06995935 -0.18604274 -1.03564579 +v -1.89022583 -0.15195176 -1.03564579 +v -1.76485652 -1.8726867e-2 -1.03564579 +v -1.74173826 0.16274456 -1.03564579 +v -1.82970142 0.32314661 -1.03564579 +v -1.99514706 0.40121114 -1.03564579 +v -2.17488059 0.36712017 -1.03564579 +v -2.30024989 0.23389527 -1.03564579 +v -2.20846758 7.4217624e-2 -1.73341672 +v -2.15525854 -2.2809801e-2 -1.73341672 +v -2.05518024 -7.0031149e-2 -1.73341672 +v -1.94645917 -4.9409469e-2 -1.73341672 +v -1.87062310 3.1178458e-2 -1.73341672 +v -1.85663883 0.14095078 -1.73341672 +v -1.90984787 0.23797821 -1.73341672 +v -2.00992618 0.28519956 -1.73341672 +v -2.11864724 0.26457788 -1.73341672 +v -2.19448331 0.18398995 -1.73341672 +v -2.15525854 -2.2809801e-2 2.18568475 +v -2.20846758 7.4217624e-2 2.18568475 +v -2.19448331 0.18398995 2.18568475 +v -2.11864724 0.26457788 2.18568475 +v -2.00992618 0.28519956 2.18568475 +v -1.90984787 0.23797821 2.18568475 +v -1.85663883 0.14095078 2.18568475 +v -1.87062310 3.1178458e-2 2.18568475 +v -1.94645917 -4.9409469e-2 2.18568475 +v -2.05518024 -7.0031149e-2 2.18568475 +v -2.11980674 9.1034380e-2 -1.73341672 +v -2.09341505 4.2908777e-2 -1.73341672 +v -2.04377621 1.9486989e-2 -1.73341672 +v -1.98985057 2.9715342e-2 -1.73341672 +v -1.95223588 6.9686954e-2 -1.73341672 +v -1.94529968 0.12413403 -1.73341672 +v -1.97169136 0.17225963 -1.73341672 +v -2.02133020 0.19568142 -1.73341672 +v -2.07525585 0.18545307 -1.73341672 +v -2.11287054 0.14548145 -1.73341672 +v -2.11980674 9.1034380e-2 -2.30361690 +v -2.09341505 4.2908777e-2 -2.30361690 +v -2.04377621 1.9486989e-2 -2.30361690 +v -1.98985057 2.9715342e-2 -2.30361690 +v -1.95223588 6.9686954e-2 -2.30361690 +v -1.94529968 0.12413403 -2.30361690 +v -1.97169136 0.17225963 -2.30361690 +v -2.02133020 0.19568142 -2.30361690 +v -2.07525585 0.18545307 -2.30361690 +v -2.11287054 0.14548145 -2.30361690 +v -2.07984462 9.8614199e-2 -2.30361690 +v -2.06554033 7.2530122e-2 -2.30361690 +v -2.03863608 5.9835513e-2 -2.30361690 +v -2.00940838 6.5379281e-2 -2.30361690 +v -1.98902121 8.7043894e-2 -2.30361690 +v -1.98526179 0.11655421 -2.30361690 +v -1.99956609 0.14263828 -2.30361690 +v -2.02647034 0.15533289 -2.30361690 +v -2.05569804 0.14978913 -2.30361690 +v -2.07608520 0.12812451 -2.30361690 +v -2.07984462 9.8614199e-2 -1.64402093 +v -2.06554033 7.2530122e-2 -1.64402093 +v -2.03863608 5.9835513e-2 -1.64402093 +v -2.00940838 6.5379281e-2 -1.64402093 +v -1.98902121 8.7043894e-2 -1.64402093 +v -1.98526179 0.11655421 -1.64402093 +v -1.99956609 0.14263828 -1.64402093 +v -2.02647034 0.15533289 -1.64402093 +v -2.05569804 0.14978913 -1.64402093 +v -2.07608520 0.12812451 -1.64402093 +vt 0.13153642 0.20145552 +vt 0.13258407 0.79951172 +vt 0.17689510 0.20424158 +vt 0.17791373 0.79658850 +vt 0.18931160 1.9217776e-2 +vt 0.19089043 0.98121778 +vt 0.21936393 2.6443602e-2 +vt 0.22086068 0.97390788 +vt 0.22124365 0.20634630 +vt 0.22223876 0.79435790 +vt 0.25020483 3.1298573e-2 +vt 0.25162210 0.96896211 +vt 0.26490089 0.20774050 +vt 0.26587889 0.79284830 +vt 0.28166598 3.4169805e-2 +vt 0.28300100 0.96599563 +vt 0.30815463 0.20841322 +vt 0.30912320 0.79207015 +vt 0.31356055 3.5309485e-2 +vt 0.31480536 0.96475915 +vt 0.34559072 3.5676402e-2 +vt 0.34683554 0.96512607 +vt 0.35127288 0.20836540 +vt 0.35224146 0.79202233 +vt 0.37739509 3.4439923e-2 +vt 0.37873011 0.96626575 +vt 0.39451720 0.20758725 +vt 0.39549520 0.79269506 +vt 0.40877398 3.1473441e-2 +vt 0.41019126 0.96913698 +vt 0.43815733 0.20607765 +vt 0.43915243 0.79408925 +vt 0.43953541 2.6527670e-2 +vt 0.44103215 0.97399195 +vt 0.46941699 1.9159349e-2 +vt 0.46950565 1.9217776e-2 +vt 0.47108449 0.98121778 +vt 0.47130005 0.98088917 +vt 0.48248235 0.20384705 +vt 0.48350099 0.79619397 +vt 0.49756466 7.9787955e-3 +vt 0.49811219 0.99119667 +vt 0.52781201 0.20092383 +vt 0.52787303 0.20068910 +vt 0.52885966 0.79898004 +vt 0.52890544 0.79890943 +vt 0.57037867 0.19442590 +vt 0.57207568 0.80417343 +vt 0.78656832 7.3097559e-2 +vt 0.79002378 4.5973224e-2 +vt 0.79971607 9.7072677e-2 +vt 0.80876259 2.6060246e-2 +vt 0.82444505 0.10874090 +vt 0.83562716 2.0964705e-2 +vt 0.83882171 0.18125644 +vt 0.83882171 0.32215079 +vt 0.85130962 0.10364536 +vt 0.85238411 0.18125644 +vt 0.85238411 0.32215079 +vt 0.86035614 3.2632925e-2 +vt 0.86594651 0.18125644 +vt 0.86594651 0.32215079 +vt 0.87004844 8.3732378e-2 +vt 0.87350390 5.6608043e-2 +vt 0.87876283 5.7399571e-2 +vt 0.87950891 0.18125644 +vt 0.87950891 0.32215079 +vt 0.88221829 8.4523906e-2 +vt 0.89191058 3.3424453e-2 +vt 0.89307131 0.18125644 +vt 0.89307131 0.32215079 +vt 0.89965531 0.33550886 +vt 0.89965531 0.49849258 +vt 0.90067059 6.1554929e-2 +vt 0.90095710 0.10443688 +vt 0.90238450 7.5008599e-2 +vt 0.90479995 0.13330598 +vt 0.90651386 0.14675965 +vt 0.90663371 0.18125644 +vt 0.90663371 0.32215079 +vt 0.90700614 0.33550886 +vt 0.90700614 0.49849258 +vt 0.90700614 0.33550886 +vt 0.90700614 0.49849258 +vt 0.90719188 4.9663271e-2 +vt 0.91132123 0.12141432 +vt 0.91167895 8.4885437e-2 +vt 0.91435696 0.33550886 +vt 0.91435696 0.49849258 +vt 0.91462481 0.13516081 +vt 0.91467444 0.13517893 +vt 0.91555375 0.14245270 +vt 0.91560338 0.14247082 +vt 0.91580831 0.15663649 +vt 0.91663956 2.1756233e-2 +vt 0.91815935 0.12871553 +vt 0.91820898 0.12873365 +vt 0.91945746 4.3875833e-2 +vt 0.92019611 0.18125644 +vt 0.92019611 0.32215079 +vt 0.92059134 0.14780595 +vt 0.92064097 0.14782406 +vt 0.92170778 0.33550886 +vt 0.92170778 0.49849258 +vt 0.92358681 0.11562689 +vt 0.92480729 0.12557874 +vt 0.92485692 0.12559686 +vt 0.92500378 8.7412825e-2 +vt 0.92502828 8.7412702e-2 +vt 0.92781340 0.14917579 +vt 0.92782167 0.10953243 +vt 0.92783967 0.14917651 +vt 0.92784617 0.10953230 +vt 0.92786303 0.14919391 +vt 0.92905860 0.33550886 +vt 0.92905860 0.49849258 +vt 0.92910978 0.15914648 +vt 0.92913313 0.15916388 +vt 0.93202935 0.12694859 +vt 0.93207897 0.12696670 +vt 0.93278228 4.6403222e-2 +vt 0.93375852 0.18125644 +vt 0.93375852 0.32215079 +vt 0.93446134 0.14603900 +vt 0.93448761 0.14603972 +vt 0.93451097 0.14605712 +vt 0.93640942 0.33550886 +vt 0.93640942 0.49849258 +vt 0.93691164 0.11815427 +vt 0.93706694 0.13230183 +vt 0.93711657 0.13231995 +vt 0.93726936 8.1625388e-2 +vt 0.93729386 8.1625265e-2 +vt 0.93799588 0.13959372 +vt 0.93804550 0.13961184 +vt 0.94137535 0.15335904 +vt 0.94139871 0.15337644 +vt 0.94207673 5.6280059e-2 +vt 0.94350414 2.6851774e-2 +vt 0.94376024 0.33550886 +vt 0.94376024 0.49849258 +vt 0.94379064 6.9733729e-2 +vt 0.94620609 0.12803111 +vt 0.94732092 0.18125644 +vt 0.94732092 0.32215079 +vt 0.94791999 0.14148478 +vt 0.95111106 0.33550886 +vt 0.95111106 0.49849258 +vt 0.95255065 9.7864205e-2 +vt 0.95257515 9.7864083e-2 +vt 0.95846189 0.33550886 +vt 0.95846189 0.49849258 +vt 0.96088332 0.18125644 +vt 0.96088332 0.32215079 +vt 0.96088705 0.32223526 +vt 0.96088705 0.18134091 +vt 0.96224295 4.6764752e-2 +vt 0.96569841 7.3889087e-2 +vt 0.96581271 0.33550886 +vt 0.96581271 0.49849258 +vt 0.97316353 0.33550886 +vt 0.97316353 0.49849258 +vt 0.97444946 0.32223526 +vt 0.97444946 0.18134091 +vn -0.97909382 -0.18570973 8.2989055e-2 +vn -0.68294610 -0.72573924 8.2989055e-2 +vn -0.12593618 -0.98856102 8.2989055e-2 +vn 0.47917708 -0.87378610 8.2989055e-2 +vn 0.90126098 -0.42525458 8.2989055e-2 +vn 0.97909382 0.18570973 8.2989055e-2 +vn 0.68294610 0.72573924 8.2989055e-2 +vn 0.12593618 0.98856102 8.2989055e-2 +vn -0.47917708 0.87378610 8.2989055e-2 +vn -0.90126098 0.42525458 8.2989055e-2 +vn -0.97909382 -0.18570973 -8.2989055e-2 +vn -0.68294610 -0.72573924 -8.2989055e-2 +vn -0.12593618 -0.98856102 -8.2989055e-2 +vn 0.47917708 -0.87378610 -8.2989055e-2 +vn 0.90126098 -0.42525458 -8.2989055e-2 +vn 0.97909382 0.18570973 -8.2989055e-2 +vn 0.68294610 0.72573924 -8.2989055e-2 +vn 0.12593618 0.98856102 -8.2989055e-2 +vn -0.47917708 0.87378610 -8.2989055e-2 +vn -0.90126098 0.42525458 -8.2989055e-2 +vn -0.61907031 -0.11742223 -0.77650755 +vn -0.43181934 -0.45887698 -0.77650755 +vn -7.9628067e-2 -0.62505631 -0.77650755 +vn 0.30297842 -0.55248538 -0.77650755 +vn 0.56985745 -0.26888382 -0.77650755 +vn 0.61907031 0.11742223 -0.77650755 +vn 0.43181934 0.45887698 -0.77650755 +vn 7.9628067e-2 0.62505631 -0.77650755 +vn -0.30297842 0.55248538 -0.77650755 +vn -0.56985745 0.26888382 -0.77650755 +vn -0.56143523 -0.59661455 0.57344708 +vn -0.80489188 -0.15266796 0.57344708 +vn -0.74090718 0.34959260 0.57344708 +vn -0.39392113 0.71832067 0.57344708 +vn 0.10352941 0.81267466 0.57344708 +vn 0.56143523 0.59661455 0.57344708 +vn 0.80489188 0.15266796 0.57344708 +vn 0.74090718 -0.34959260 0.57344708 +vn 0.39392113 -0.71832067 0.57344708 +vn -0.10352941 -0.81267466 0.57344708 +vn -0.67707984 -0.12842520 -0.72461704 +vn -0.47228266 -0.50187571 -0.72461704 +vn -8.7089558e-2 -0.68362677 -0.72461704 +vn 0.33136880 -0.60425563 -0.72461704 +vn 0.62325554 -0.29407938 -0.72461704 +vn 0.67707984 0.12842520 -0.72461704 +vn 0.47228266 0.50187571 -0.72461704 +vn 8.7089558e-2 0.68362677 -0.72461704 +vn -0.33136880 0.60425563 -0.72461704 +vn -0.62325554 0.29407938 -0.72461704 +vn -0.67707984 -0.12842520 -0.72461704 +vn -0.47228266 -0.50187571 -0.72461704 +vn -8.7089558e-2 -0.68362677 -0.72461704 +vn 0.33136880 -0.60425563 -0.72461704 +vn 0.62325554 -0.29407938 -0.72461704 +vn 0.67707984 0.12842520 -0.72461704 +vn 0.47228266 0.50187571 -0.72461704 +vn 8.7089558e-2 0.68362677 -0.72461704 +vn -0.33136880 0.60425563 -0.72461704 +vn -0.62325554 0.29407938 -0.72461704 +vn 0.67707984 0.12842520 -0.72461704 +vn 0.47228266 0.50187571 -0.72461704 +vn 8.7089558e-2 0.68362677 -0.72461704 +vn -0.33136880 0.60425563 -0.72461704 +vn -0.62325554 0.29407938 -0.72461704 +vn -0.67707984 -0.12842520 -0.72461704 +vn -0.47228266 -0.50187571 -0.72461704 +vn -8.7089558e-2 -0.68362677 -0.72461704 +vn 0.33136880 -0.60425563 -0.72461704 +vn 0.62325554 -0.29407938 -0.72461704 +vn 0.86962652 0.16494651 -0.46534113 +vn 0.60658951 0.64459817 -0.46534113 +vn 0.11185592 0.87803524 -0.46534113 +vn -0.42560283 0.77609269 -0.46534113 +vn -0.80049576 0.37770911 -0.46534113 +vn -0.86962652 -0.16494651 -0.46534113 +vn -0.60658951 -0.64459817 -0.46534113 +vn -0.11185592 -0.87803524 -0.46534113 +vn 0.42560283 -0.77609269 -0.46534113 +vn 0.80049576 -0.37770911 -0.46534113 +g sidegun2_sidegun +usemtl sidegun +s 1 +f 1/31/1 2/39/2 31/33/31 32/29/32 +f 1/31/1 10/27/10 20/28/20 11/32/11 +f 3/43/3 40/36/40 31/33/31 2/39/2 +f 4/47/4 39/41/39 40/35/40 3/44/3 +f 5/3/5 38/7/38 39/5/39 4/1/4 +f 6/9/6 37/11/37 38/7/38 5/3/5 +f 7/13/7 36/15/36 37/11/37 6/9/6 +f 8/17/8 35/19/35 36/15/36 7/13/7 +f 9/23/9 34/21/34 35/19/35 8/17/8 +f 11/32/11 12/40/12 2/39/2 1/31/1 +f 12/40/12 11/32/11 21/30/21 22/34/22 +f 12/40/12 13/45/13 3/43/3 2/39/2 +f 13/46/13 14/48/14 4/47/4 3/44/3 +f 14/2/14 15/4/15 5/3/5 4/1/4 +f 15/4/15 16/10/16 6/9/6 5/3/5 +f 16/10/16 17/14/17 7/13/7 6/9/6 +f 17/14/17 18/18/18 8/17/8 7/13/7 +f 18/18/18 19/24/19 9/23/9 8/17/8 +f 19/24/19 20/28/20 10/27/10 9/23/9 +f 20/28/20 30/26/30 21/30/21 11/32/11 +f 21/65/21 41/74/41 42/85/42 22/69/22 +f 22/34/22 23/37/23 13/45/13 12/40/12 +f 22/69/22 42/85/42 43/98/43 23/95/23 +f 23/38/23 24/42/24 14/48/14 13/46/13 +f 23/95/23 43/98/43 44/121/44 24/139/24 +f 24/6/24 25/8/25 15/4/15 14/2/14 +f 24/139/24 44/121/44 45/138/45 25/157/25 +f 25/8/25 26/12/26 16/10/16 15/4/15 +f 25/157/25 45/138/45 46/142/46 26/158/26 +f 26/12/26 27/16/27 17/14/17 16/10/16 +f 26/158/26 46/142/46 47/132/47 27/149/27 +f 27/16/27 28/20/28 18/18/18 17/14/17 +f 27/150/27 47/133/47 48/109/48 28/113/28 +f 28/20/28 29/22/29 19/24/19 18/18/18 +f 28/111/28 48/108/48 49/87/49 29/75/29 +f 29/22/29 30/26/30 20/28/20 19/24/19 +f 29/75/29 49/87/49 50/76/50 30/68/30 +f 30/68/30 50/76/50 41/74/41 21/65/21 +f 31/60/31 40/54/40 39/52/39 38/50/38 37/49/37 36/51/36 35/53/35 34/57/34 33/63/33 32/64/32 +f 32/29/32 33/25/33 10/27/10 1/31/1 +f 33/25/33 34/21/34 9/23/9 10/27/10 +f 41/122/41 51/123/51 52/145/52 42/144/42 +f 42/144/42 52/145/52 53/154/53 43/153/43 +f 43/156/43 53/155/53 54/163/54 44/164/44 +f 44/55/44 54/56/54 55/59/55 45/58/45 +f 45/58/45 55/59/55 56/62/56 46/61/46 +f 46/61/46 56/62/56 57/67/57 47/66/47 +f 47/66/47 57/67/57 58/71/58 48/70/48 +f 48/70/48 58/71/58 59/80/59 49/79/49 +f 49/79/49 59/80/59 60/100/60 50/99/50 +f 50/99/50 60/100/60 51/123/51 41/122/41 +f 51/77/51 61/91/61 62/97/62 52/86/52 +f 52/86/52 62/97/62 63/107/63 53/105/53 +f 53/105/53 63/107/63 64/120/64 54/129/54 +f 54/129/54 64/120/64 65/131/65 55/143/55 +f 55/143/55 65/131/65 66/135/66 56/146/56 +f 56/146/56 66/135/66 67/126/67 57/137/57 +f 57/136/57 67/125/67 68/112/68 58/117/58 +f 58/118/58 68/114/68 69/102/69 59/94/59 +f 59/94/59 69/102/69 70/93/70 60/78/60 +f 60/78/60 70/93/70 61/91/61 51/77/51 +f 61/104/61 71/103/71 72/88/72 62/89/62 +f 62/89/62 72/88/72 73/83/73 63/84/63 +f 63/82/63 73/81/73 74/72/74 64/73/64 +f 64/162/64 74/161/74 75/159/75 65/160/65 +f 65/160/65 75/159/75 76/151/76 66/152/66 +f 66/152/66 76/151/76 77/147/77 67/148/67 +f 67/148/67 77/147/77 78/140/78 68/141/68 +f 68/141/68 78/140/78 79/127/79 69/128/69 +f 69/128/69 79/127/79 80/115/80 70/116/70 +f 70/116/70 80/115/80 71/103/71 61/104/61 +f 71/90/71 80/92/80 79/101/79 78/110/78 77/124/77 76/134/76 75/130/75 74/119/74 73/106/73 72/96/72 +o wing2 +#16 vertices, 8 faces +v -0.66225904 -0.21336464 1.66044844 +v -0.66225904 -7.7829370e-2 1.66044844 +v -1.83774096 0.13428598 0.78860596 +v -1.83774096 -1.2492889e-3 0.78860596 +v -0.68280641 -0.28078100 1.55489110 +v -1.81719359 -6.8665655e-2 0.71352814 +v -1.81719359 -6.8665655e-2 -0.15018069 +v -0.68280641 -0.28078100 0.69118227 +v -0.66225904 -7.7829370e-2 0.61610444 +v -0.66225904 -0.21336464 0.61610444 +v -1.83774096 -1.2492889e-3 -0.25573804 +v -1.83774096 0.13428598 -0.25573804 +v -1.81719359 0.20170234 0.71352814 +v -0.68280641 -1.0413004e-2 1.55489110 +v -0.68280641 -1.0413004e-2 0.69118227 +v -1.81719359 0.20170234 -0.15018069 +vt 0.11981486 0.12324946 +vt 0.12120280 0.68355680 +vt 0.15447058 0.15659113 +vt 0.15756056 0.69771318 +vt 0.42000480 0.34786721 +vt 0.42309479 0.88898926 +vt 0.45846632 0.35442481 +vt 0.46372942 0.91470915 +vt 0.50921730 0.34658176 +vt 0.51448040 0.90686610 +vt 0.54540273 0.33199051 +vt 0.54873370 0.87311114 +vt 0.80864866 0.13757718 +vt 0.81197962 0.67869780 +vt 0.84897292 0.11137336 +vt 0.84932403 0.11175123 +vt 0.85017279 0.67208265 +vt 0.85035996 0.67168070 +vt 0.90015963 0.11904053 +vt 0.90100838 0.67937195 +vn -0.59603032 -0.37235158 0.71140857 +vn -0.48737488 0.42553418 0.76248698 +vn -0.48737488 0.42553418 0.76248698 +vn -0.59603032 -0.37235158 0.71140857 +vn -0.36787621 -0.88871631 0.27358806 +vn -0.36787621 -0.88871631 0.27358806 +vn 5.4427409e-2 -0.94893200 -0.31075025 +vn 5.4427409e-2 -0.94893200 -0.31075025 +vn 0.59603032 0.37235158 -0.71140857 +vn 0.48737488 -0.42553418 -0.76248698 +vn 0.48737488 -0.42553418 -0.76248698 +vn 0.59603032 0.37235158 -0.71140857 +vn -5.4427409e-2 0.94893200 0.31075025 +vn -5.4427409e-2 0.94893200 0.31075025 +vn 0.36787621 0.88871631 -0.27358806 +vn 0.36787621 0.88871631 -0.27358806 +g wing2_wing2 +usemtl wing2 +s 1 +f 82/183/82 83/184/83 84/181/84 81/180/81 +f 82/165/82 94/167/94 93/168/93 83/166/83 +f 84/182/84 86/178/86 85/177/85 81/179/81 +f 86/178/86 87/176/87 88/175/88 85/177/85 +f 87/176/87 91/174/91 90/173/90 88/175/88 +f 90/173/90 91/174/91 92/172/92 89/171/89 +f 92/172/92 96/170/96 95/169/95 89/171/89 +f 94/167/94 95/169/95 96/170/96 93/168/93 +o wing1 +#16 vertices, 8 faces +v 0.66225904 -7.7829370e-2 1.66044844 +v 0.66225904 -0.21336464 1.66044844 +v 1.83774096 -1.2492889e-3 0.78860596 +v 1.83774096 0.13428598 0.78860596 +v 0.68280641 -1.0413004e-2 1.55489110 +v 1.81719359 0.20170234 0.71352814 +v 1.81719359 0.20170234 -0.15018069 +v 0.68280641 -1.0413004e-2 0.69118227 +v 0.66225904 -0.21336464 0.61610444 +v 0.66225904 -7.7829370e-2 0.61610444 +v 1.83774096 0.13428598 -0.25573804 +v 1.83774096 -1.2492889e-3 -0.25573804 +v 1.81719359 -6.8665655e-2 0.71352814 +v 0.68280641 -0.28078100 1.55489110 +v 0.68280641 -0.28078100 0.69118227 +v 1.81719359 -6.8665655e-2 -0.15018069 +vt 0.12257123 0.14258600 +vt 0.12824796 0.69062361 +vt 0.16234230 0.16770560 +vt 0.16587531 0.69700165 +vt 0.42225527 0.35455192 +vt 0.42578828 0.88384797 +vt 0.45783201 0.36836469 +vt 0.45971826 0.91642846 +vt 0.50756851 0.37539861 +vt 0.50945477 0.92346237 +vt 0.54510364 0.36849856 +vt 0.54887321 0.89779297 +vt 0.80241412 0.17808422 +vt 0.80618369 0.70737864 +vt 0.83588711 0.14503440 +vt 0.83654559 0.14511933 +vt 0.84156472 0.69307200 +vt 0.84202883 0.69318141 +vt 0.88618506 0.13741699 +vt 0.89166830 0.68547907 +vn 0.48737488 0.42553418 0.76248698 +vn 0.59603032 -0.37235158 0.71140857 +vn 0.59603032 -0.37235158 0.71140857 +vn 0.48737488 0.42553418 0.76248698 +vn 5.4427409e-2 0.94893200 0.31075025 +vn 5.4427409e-2 0.94893200 0.31075025 +vn -0.36787621 0.88871631 -0.27358806 +vn -0.36787621 0.88871631 -0.27358806 +vn -0.48737488 -0.42553418 -0.76248698 +vn -0.59603032 0.37235158 -0.71140857 +vn -0.59603032 0.37235158 -0.71140857 +vn -0.48737488 -0.42553418 -0.76248698 +vn 0.36787621 -0.88871631 0.27358806 +vn 0.36787621 -0.88871631 0.27358806 +vn -5.4427409e-2 -0.94893200 -0.31075025 +vn -5.4427409e-2 -0.94893200 -0.31075025 +g wing1_wing3 +usemtl wing3 +s 1 +f 98/202/98 99/200/99 100/203/100 97/204/97 +f 98/185/98 110/187/110 109/188/109 99/186/99 +f 100/201/100 102/198/102 101/197/101 97/199/97 +f 102/198/102 103/196/103 104/195/104 101/197/101 +f 103/196/103 107/194/107 106/193/106 104/195/104 +f 106/193/106 107/194/107 108/192/108 105/191/105 +f 108/192/108 112/190/112 111/189/111 105/191/105 +f 110/187/110 111/189/111 112/190/112 109/188/109 +o sidegun1 +#80 vertices, 72 faces +v 2.32472041 5.2423845e-2 1.48791381 +v 2.23675725 -0.10797820 1.48791381 +v 2.07131161 -0.18604274 1.48791381 +v 1.89157808 -0.15195176 1.48791381 +v 1.76620878 -1.8726867e-2 1.48791381 +v 1.74309051 0.16274456 1.48791381 +v 1.83105367 0.32314661 1.48791381 +v 1.99649932 0.40121114 1.48791381 +v 2.17623284 0.36712017 1.48791381 +v 2.30160215 0.23389527 1.48791381 +v 2.32472041 5.2423845e-2 -1.03564579 +v 2.23675725 -0.10797820 -1.03564579 +v 2.07131161 -0.18604274 -1.03564579 +v 1.89157808 -0.15195176 -1.03564579 +v 1.76620878 -1.8726867e-2 -1.03564579 +v 1.74309051 0.16274456 -1.03564579 +v 1.83105367 0.32314661 -1.03564579 +v 1.99649932 0.40121114 -1.03564579 +v 2.17623284 0.36712017 -1.03564579 +v 2.30160215 0.23389527 -1.03564579 +v 2.20981984 7.4217624e-2 -1.73341672 +v 2.15661080 -2.2809801e-2 -1.73341672 +v 2.05653249 -7.0031149e-2 -1.73341672 +v 1.94781143 -4.9409469e-2 -1.73341672 +v 1.87197536 3.1178458e-2 -1.73341672 +v 1.85799109 0.14095078 -1.73341672 +v 1.91120013 0.23797821 -1.73341672 +v 2.01127844 0.28519956 -1.73341672 +v 2.11999950 0.26457788 -1.73341672 +v 2.19583557 0.18398995 -1.73341672 +v 2.15661080 -2.2809801e-2 2.18568475 +v 2.20981984 7.4217624e-2 2.18568475 +v 2.19583557 0.18398995 2.18568475 +v 2.11999950 0.26457788 2.18568475 +v 2.01127844 0.28519956 2.18568475 +v 1.91120013 0.23797821 2.18568475 +v 1.85799109 0.14095078 2.18568475 +v 1.87197536 3.1178458e-2 2.18568475 +v 1.94781143 -4.9409469e-2 2.18568475 +v 2.05653249 -7.0031149e-2 2.18568475 +v 2.12115899 9.1034380e-2 -1.73341672 +v 2.09476731 4.2908777e-2 -1.73341672 +v 2.04512847 1.9486989e-2 -1.73341672 +v 1.99120282 2.9715342e-2 -1.73341672 +v 1.95358813 6.9686954e-2 -1.73341672 +v 1.94665193 0.12413403 -1.73341672 +v 1.97304362 0.17225963 -1.73341672 +v 2.02268246 0.19568142 -1.73341672 +v 2.07660810 0.18545307 -1.73341672 +v 2.11422279 0.14548145 -1.73341672 +v 2.12115899 9.1034380e-2 -2.30361690 +v 2.09476731 4.2908777e-2 -2.30361690 +v 2.04512847 1.9486989e-2 -2.30361690 +v 1.99120282 2.9715342e-2 -2.30361690 +v 1.95358813 6.9686954e-2 -2.30361690 +v 1.94665193 0.12413403 -2.30361690 +v 1.97304362 0.17225963 -2.30361690 +v 2.02268246 0.19568142 -2.30361690 +v 2.07660810 0.18545307 -2.30361690 +v 2.11422279 0.14548145 -2.30361690 +v 2.08119688 9.8614199e-2 -2.30361690 +v 2.06689258 7.2530122e-2 -2.30361690 +v 2.03998833 5.9835513e-2 -2.30361690 +v 2.01076063 6.5379281e-2 -2.30361690 +v 1.99037347 8.7043894e-2 -2.30361690 +v 1.98661405 0.11655421 -2.30361690 +v 2.00091834 0.14263828 -2.30361690 +v 2.02782259 0.15533289 -2.30361690 +v 2.05705030 0.14978913 -2.30361690 +v 2.07743746 0.12812451 -2.30361690 +v 2.08119688 9.8614199e-2 -1.64402093 +v 2.06689258 7.2530122e-2 -1.64402093 +v 2.03998833 5.9835513e-2 -1.64402093 +v 2.01076063 6.5379281e-2 -1.64402093 +v 1.99037347 8.7043894e-2 -1.64402093 +v 1.98661405 0.11655421 -1.64402093 +v 2.00091834 0.14263828 -1.64402093 +v 2.02782259 0.15533289 -1.64402093 +v 2.05705030 0.14978913 -1.64402093 +v 2.07743746 0.12812451 -1.64402093 +vt 0.13153642 0.20145552 +vt 0.13258407 0.79951172 +vt 0.17689510 0.20424158 +vt 0.17791373 0.79658850 +vt 0.18931160 1.9217776e-2 +vt 0.19089043 0.98121778 +vt 0.21936393 2.6443602e-2 +vt 0.22086068 0.97390788 +vt 0.22124365 0.20634630 +vt 0.22223876 0.79435790 +vt 0.25020483 3.1298573e-2 +vt 0.25162210 0.96896211 +vt 0.26490089 0.20774050 +vt 0.26587889 0.79284830 +vt 0.28166598 3.4169805e-2 +vt 0.28300100 0.96599563 +vt 0.30815463 0.20841322 +vt 0.30912320 0.79207015 +vt 0.31356055 3.5309485e-2 +vt 0.31480536 0.96475915 +vt 0.34559072 3.5676402e-2 +vt 0.34683554 0.96512607 +vt 0.35127288 0.20836540 +vt 0.35224146 0.79202233 +vt 0.37739509 3.4439923e-2 +vt 0.37873011 0.96626575 +vt 0.39451720 0.20758725 +vt 0.39549520 0.79269506 +vt 0.40877398 3.1473441e-2 +vt 0.41019126 0.96913698 +vt 0.43815733 0.20607765 +vt 0.43915243 0.79408925 +vt 0.43953541 2.6527670e-2 +vt 0.44103215 0.97399195 +vt 0.46941699 1.9159349e-2 +vt 0.46950565 1.9217776e-2 +vt 0.47108449 0.98121778 +vt 0.47130005 0.98088917 +vt 0.48248235 0.20384705 +vt 0.48350099 0.79619397 +vt 0.49756466 7.9787955e-3 +vt 0.49811219 0.99119667 +vt 0.52781201 0.20092383 +vt 0.52787303 0.20068910 +vt 0.52885966 0.79898004 +vt 0.52890544 0.79890943 +vt 0.57037867 0.19442590 +vt 0.57207568 0.80417343 +vt 0.78656832 7.3097559e-2 +vt 0.79002378 4.5973224e-2 +vt 0.79971607 9.7072677e-2 +vt 0.80876259 2.6060246e-2 +vt 0.82444505 0.10874090 +vt 0.83562716 2.0964705e-2 +vt 0.83882171 0.18125644 +vt 0.83882171 0.32215079 +vt 0.85130962 0.10364536 +vt 0.85238411 0.18125644 +vt 0.85238411 0.32215079 +vt 0.86035614 3.2632925e-2 +vt 0.86594651 0.18125644 +vt 0.86594651 0.32215079 +vt 0.87004844 8.3732378e-2 +vt 0.87350390 5.6608043e-2 +vt 0.87876283 5.7399571e-2 +vt 0.87950891 0.18125644 +vt 0.87950891 0.32215079 +vt 0.88221829 8.4523906e-2 +vt 0.89191058 3.3424453e-2 +vt 0.89307131 0.18125644 +vt 0.89307131 0.32215079 +vt 0.89965531 0.33550886 +vt 0.89965531 0.49849258 +vt 0.90067059 6.1554929e-2 +vt 0.90095710 0.10443688 +vt 0.90238450 7.5008599e-2 +vt 0.90479995 0.13330598 +vt 0.90651386 0.14675965 +vt 0.90663371 0.18125644 +vt 0.90663371 0.32215079 +vt 0.90700614 0.33550886 +vt 0.90700614 0.49849258 +vt 0.90700614 0.33550886 +vt 0.90700614 0.49849258 +vt 0.90719188 4.9663271e-2 +vt 0.91132123 0.12141432 +vt 0.91167895 8.4885437e-2 +vt 0.91435696 0.33550886 +vt 0.91435696 0.49849258 +vt 0.91462481 0.13516081 +vt 0.91467444 0.13517893 +vt 0.91555375 0.14245270 +vt 0.91560338 0.14247082 +vt 0.91580831 0.15663649 +vt 0.91663956 2.1756233e-2 +vt 0.91815935 0.12871553 +vt 0.91820898 0.12873365 +vt 0.91945746 4.3875833e-2 +vt 0.92019611 0.18125644 +vt 0.92019611 0.32215079 +vt 0.92059134 0.14780595 +vt 0.92064097 0.14782406 +vt 0.92170778 0.33550886 +vt 0.92170778 0.49849258 +vt 0.92358681 0.11562689 +vt 0.92480729 0.12557874 +vt 0.92485692 0.12559686 +vt 0.92500378 8.7412825e-2 +vt 0.92502828 8.7412702e-2 +vt 0.92781340 0.14917579 +vt 0.92782167 0.10953243 +vt 0.92783967 0.14917651 +vt 0.92784617 0.10953230 +vt 0.92786303 0.14919391 +vt 0.92905860 0.33550886 +vt 0.92905860 0.49849258 +vt 0.92910978 0.15914648 +vt 0.92913313 0.15916388 +vt 0.93202935 0.12694859 +vt 0.93207897 0.12696670 +vt 0.93278228 4.6403222e-2 +vt 0.93375852 0.18125644 +vt 0.93375852 0.32215079 +vt 0.93446134 0.14603900 +vt 0.93448761 0.14603972 +vt 0.93451097 0.14605712 +vt 0.93640942 0.33550886 +vt 0.93640942 0.49849258 +vt 0.93691164 0.11815427 +vt 0.93706694 0.13230183 +vt 0.93711657 0.13231995 +vt 0.93726936 8.1625388e-2 +vt 0.93729386 8.1625265e-2 +vt 0.93799588 0.13959372 +vt 0.93804550 0.13961184 +vt 0.94137535 0.15335904 +vt 0.94139871 0.15337644 +vt 0.94207673 5.6280059e-2 +vt 0.94350414 2.6851774e-2 +vt 0.94376024 0.33550886 +vt 0.94376024 0.49849258 +vt 0.94379064 6.9733729e-2 +vt 0.94620609 0.12803111 +vt 0.94732092 0.18125644 +vt 0.94732092 0.32215079 +vt 0.94791999 0.14148478 +vt 0.95111106 0.33550886 +vt 0.95111106 0.49849258 +vt 0.95255065 9.7864205e-2 +vt 0.95257515 9.7864083e-2 +vt 0.95846189 0.33550886 +vt 0.95846189 0.49849258 +vt 0.96088332 0.18125644 +vt 0.96088332 0.32215079 +vt 0.96088705 0.32223526 +vt 0.96088705 0.18134091 +vt 0.96224295 4.6764752e-2 +vt 0.96569841 7.3889087e-2 +vt 0.96581271 0.33550886 +vt 0.96581271 0.49849258 +vt 0.97316353 0.33550886 +vt 0.97316353 0.49849258 +vt 0.97444946 0.32223526 +vt 0.97444946 0.18134091 +vn 0.97909382 -0.18570973 8.2989055e-2 +vn 0.68294610 -0.72573924 8.2989055e-2 +vn 0.12593618 -0.98856102 8.2989055e-2 +vn -0.47917708 -0.87378610 8.2989055e-2 +vn -0.90126098 -0.42525458 8.2989055e-2 +vn -0.97909382 0.18570973 8.2989055e-2 +vn -0.68294610 0.72573924 8.2989055e-2 +vn -0.12593618 0.98856102 8.2989055e-2 +vn 0.47917708 0.87378610 8.2989055e-2 +vn 0.90126098 0.42525458 8.2989055e-2 +vn 0.97909382 -0.18570973 -8.2989055e-2 +vn 0.68294610 -0.72573924 -8.2989055e-2 +vn 0.12593618 -0.98856102 -8.2989055e-2 +vn -0.47917708 -0.87378610 -8.2989055e-2 +vn -0.90126098 -0.42525458 -8.2989055e-2 +vn -0.97909382 0.18570973 -8.2989055e-2 +vn -0.68294610 0.72573924 -8.2989055e-2 +vn -0.12593618 0.98856102 -8.2989055e-2 +vn 0.47917708 0.87378610 -8.2989055e-2 +vn 0.90126098 0.42525458 -8.2989055e-2 +vn 0.61907031 -0.11742223 -0.77650755 +vn 0.43181934 -0.45887698 -0.77650755 +vn 7.9628067e-2 -0.62505631 -0.77650755 +vn -0.30297842 -0.55248538 -0.77650755 +vn -0.56985745 -0.26888382 -0.77650755 +vn -0.61907031 0.11742223 -0.77650755 +vn -0.43181934 0.45887698 -0.77650755 +vn -7.9628067e-2 0.62505631 -0.77650755 +vn 0.30297842 0.55248538 -0.77650755 +vn 0.56985745 0.26888382 -0.77650755 +vn 0.56143523 -0.59661455 0.57344708 +vn 0.80489188 -0.15266796 0.57344708 +vn 0.74090718 0.34959260 0.57344708 +vn 0.39392113 0.71832067 0.57344708 +vn -0.10352941 0.81267466 0.57344708 +vn -0.56143523 0.59661455 0.57344708 +vn -0.80489188 0.15266796 0.57344708 +vn -0.74090718 -0.34959260 0.57344708 +vn -0.39392113 -0.71832067 0.57344708 +vn 0.10352941 -0.81267466 0.57344708 +vn 0.67707984 -0.12842520 -0.72461704 +vn 0.47228266 -0.50187571 -0.72461704 +vn 8.7089558e-2 -0.68362677 -0.72461704 +vn -0.33136880 -0.60425563 -0.72461704 +vn -0.62325554 -0.29407938 -0.72461704 +vn -0.67707984 0.12842520 -0.72461704 +vn -0.47228266 0.50187571 -0.72461704 +vn -8.7089558e-2 0.68362677 -0.72461704 +vn 0.33136880 0.60425563 -0.72461704 +vn 0.62325554 0.29407938 -0.72461704 +vn 0.67707984 -0.12842520 -0.72461704 +vn 0.47228266 -0.50187571 -0.72461704 +vn 8.7089558e-2 -0.68362677 -0.72461704 +vn -0.33136880 -0.60425563 -0.72461704 +vn -0.62325554 -0.29407938 -0.72461704 +vn -0.67707984 0.12842520 -0.72461704 +vn -0.47228266 0.50187571 -0.72461704 +vn -8.7089558e-2 0.68362677 -0.72461704 +vn 0.33136880 0.60425563 -0.72461704 +vn 0.62325554 0.29407938 -0.72461704 +vn -0.67707984 0.12842520 -0.72461704 +vn -0.47228266 0.50187571 -0.72461704 +vn -8.7089558e-2 0.68362677 -0.72461704 +vn 0.33136880 0.60425563 -0.72461704 +vn 0.62325554 0.29407938 -0.72461704 +vn 0.67707984 -0.12842520 -0.72461704 +vn 0.47228266 -0.50187571 -0.72461704 +vn 8.7089558e-2 -0.68362677 -0.72461704 +vn -0.33136880 -0.60425563 -0.72461704 +vn -0.62325554 -0.29407938 -0.72461704 +vn -0.86962652 0.16494651 -0.46534113 +vn -0.60658951 0.64459817 -0.46534113 +vn -0.11185592 0.87803524 -0.46534113 +vn 0.42560283 0.77609269 -0.46534113 +vn 0.80049576 0.37770911 -0.46534113 +vn 0.86962652 -0.16494651 -0.46534113 +vn 0.60658951 -0.64459817 -0.46534113 +vn 0.11185592 -0.87803524 -0.46534113 +vn -0.42560283 -0.77609269 -0.46534113 +vn -0.80049576 -0.37770911 -0.46534113 +g sidegun1_sidegun +usemtl sidegun +s 1 +f 113/235/113 114/243/114 124/244/124 123/236/123 +f 113/235/113 122/231/122 145/229/145 144/233/144 +f 114/243/114 115/247/115 125/249/125 124/244/124 +f 114/243/114 143/237/143 152/240/152 115/247/115 +f 115/248/115 116/251/116 126/252/126 125/250/125 +f 115/248/115 152/239/152 151/245/151 116/251/116 +f 116/205/116 117/207/117 127/208/127 126/206/126 +f 116/205/116 151/209/151 150/211/150 117/207/117 +f 117/207/117 118/213/118 128/214/128 127/208/127 +f 117/207/117 150/211/150 149/215/149 118/213/118 +f 118/213/118 119/217/119 129/218/129 128/214/128 +f 118/213/118 149/215/149 148/219/148 119/217/119 +f 119/217/119 120/221/120 130/222/130 129/218/129 +f 119/217/119 148/219/148 147/223/147 120/221/120 +f 120/221/120 121/227/121 131/228/131 130/222/130 +f 120/221/120 147/223/147 146/225/146 121/227/121 +f 121/227/121 122/231/122 132/232/132 131/228/131 +f 122/231/122 121/227/121 146/225/146 145/229/145 +f 123/236/123 132/232/132 122/231/122 113/235/113 +f 123/236/123 133/234/133 142/230/142 132/232/132 +f 124/244/124 125/249/125 135/241/135 134/238/134 +f 125/250/125 126/252/126 136/246/136 135/242/135 +f 126/206/126 127/208/127 137/212/137 136/210/136 +f 127/208/127 128/214/128 138/216/138 137/212/137 +f 128/214/128 129/218/129 139/220/139 138/216/138 +f 129/218/129 130/222/130 140/224/140 139/220/139 +f 130/222/130 131/228/131 141/226/141 140/224/140 +f 131/228/131 132/232/132 142/230/142 141/226/141 +f 133/269/133 153/278/153 162/280/162 142/272/142 +f 134/238/134 133/234/133 123/236/123 124/244/124 +f 134/273/134 154/289/154 153/278/153 133/269/133 +f 135/299/135 155/302/155 154/289/154 134/273/134 +f 136/343/136 156/325/156 155/302/155 135/299/135 +f 137/361/137 157/342/157 156/325/156 136/343/136 +f 138/362/138 158/346/158 157/342/157 137/361/137 +f 139/353/139 159/336/159 158/346/158 138/362/138 +f 140/317/140 160/313/160 159/337/159 139/354/139 +f 141/279/141 161/291/161 160/312/160 140/315/140 +f 142/272/142 162/280/162 161/291/161 141/279/141 +f 144/233/144 143/237/143 114/243/114 113/235/113 +f 144/268/144 145/267/145 146/261/146 147/257/147 148/255/148 149/253/149 150/254/150 151/256/151 152/258/152 143/264/143 +f 153/326/153 163/327/163 172/304/172 162/303/162 +f 154/348/154 164/349/164 163/327/163 153/326/153 +f 155/357/155 165/358/165 164/349/164 154/348/154 +f 156/368/156 166/367/166 165/359/165 155/360/155 +f 157/262/157 167/263/167 166/260/166 156/259/156 +f 158/265/158 168/266/168 167/263/167 157/262/157 +f 159/270/159 169/271/169 168/266/168 158/265/158 +f 160/274/160 170/275/170 169/271/169 159/270/159 +f 161/283/161 171/284/171 170/275/170 160/274/160 +f 162/303/162 172/304/172 171/284/171 161/283/161 +f 163/281/163 173/295/173 182/297/182 172/282/172 +f 164/290/164 174/301/174 173/295/173 163/281/163 +f 165/309/165 175/311/175 174/301/174 164/290/164 +f 166/333/166 176/324/176 175/311/175 165/309/165 +f 167/347/167 177/335/177 176/324/176 166/333/166 +f 168/350/168 178/339/178 177/335/177 167/347/167 +f 169/341/169 179/330/179 178/339/178 168/350/168 +f 170/321/170 180/316/180 179/329/179 169/340/169 +f 171/298/171 181/306/181 180/318/180 170/322/170 +f 172/282/172 182/297/182 181/306/181 171/298/171 +f 173/308/173 183/307/183 192/319/192 182/320/182 +f 174/293/174 184/292/184 183/307/183 173/308/173 +f 175/288/175 185/287/185 184/292/184 174/293/174 +f 176/277/176 186/276/186 185/285/185 175/286/175 +f 177/364/177 187/363/187 186/365/186 176/366/176 +f 178/356/178 188/355/188 187/363/187 177/364/177 +f 179/352/179 189/351/189 188/355/188 178/356/178 +f 180/345/180 190/344/190 189/351/189 179/352/179 +f 181/332/181 191/331/191 190/344/190 180/345/180 +f 182/320/182 192/319/192 191/331/191 181/332/181 +f 184/300/184 185/310/185 186/323/186 187/334/187 188/338/188 189/328/189 190/314/190 191/305/191 192/296/192 183/294/183 +o body +#88 vertices, 82 faces +v 0.75400000 -0.13608975 -0.68103938 +v 0.69660517 7.3163083e-2 -0.68103938 +v 0.53315851 0.25055907 -0.68103938 +v 0.28854331 0.36909128 -0.68103938 +v 3.3080906e-17 0.41071425 -0.68103938 +v -0.28854331 0.36909128 -0.68103938 +v -0.53315851 0.25055907 -0.68103938 +v -0.69660517 7.3163083e-2 -0.68103938 +v -0.75400000 -0.13608975 -0.68103938 +v -0.69660517 -0.34534258 -0.68103938 +v -0.53315851 -0.52273856 -0.68103938 +v -0.28854331 -0.64127077 -0.68103938 +v -1.5158973e-16 -0.68289375 -0.68103938 +v 0.28854331 -0.64127077 -0.68103938 +v 0.53315851 -0.52273856 -0.68103938 +v 0.69660517 -0.34534258 -0.68103938 +v 0.75400000 -0.13608975 2.03396144 +v 0.69660517 7.3163083e-2 2.03396144 +v 0.53315851 0.25055907 2.03396144 +v 0.28854331 0.36909128 2.03396144 +v 3.3080906e-17 0.41071425 2.03396144 +v -0.28854331 0.36909128 2.03396144 +v -0.53315851 0.25055907 2.03396144 +v -0.69660517 7.3163083e-2 2.03396144 +v -0.75400000 -0.13608975 2.03396144 +v -0.69660517 -0.34534258 2.03396144 +v -0.53315851 -0.52273856 2.03396144 +v -0.28854331 -0.64127077 2.03396144 +v -1.5158973e-16 -0.68289375 2.03396144 +v 0.28854331 -0.64127077 2.03396144 +v 0.53315851 -0.52273856 2.03396144 +v 0.69660517 -0.34534258 2.03396144 +v 0.63539982 -4.5008353e-2 -1.13310778 +v 0.66053098 -0.13608975 -1.13238860 +v 0.63539982 -0.22717114 -1.13310778 +v 0.51025035 -0.36259406 -1.13410552 +v 0.28263737 -0.47275792 -1.13444851 +v -1.5178624e-16 -0.51351265 -1.13449215 +v -0.28263737 -0.47275792 -1.13444851 +v -0.51025035 -0.36259406 -1.13410552 +v -0.63539982 -0.22717114 -1.13310778 +v -0.66053098 -0.13608975 -1.13238860 +v -0.63539982 -4.5008353e-2 -1.13310778 +v -0.51025035 9.0414560e-2 -1.13410552 +v -0.28263737 0.20057843 -1.13444851 +v 3.7586950e-17 0.24133316 -1.13449215 +v 0.28263737 0.20057843 -1.13444851 +v 0.51025035 9.0414560e-2 -1.13410552 +v 0.66053098 -0.13608975 2.48531066 +v 0.63539982 -4.5008353e-2 2.48602984 +v 0.51025035 9.0414560e-2 2.48702757 +v 0.28263737 0.20057843 2.48737056 +v 4.3047831e-17 0.24133316 2.48741421 +v -0.28263737 0.20057843 2.48737056 +v -0.51025035 9.0414560e-2 2.48702757 +v -0.63539982 -4.5008353e-2 2.48602984 +v -0.66053098 -0.13608975 2.48531066 +v -0.63539982 -0.22717114 2.48602984 +v -0.51025035 -0.36259406 2.48702757 +v -0.28263737 -0.47275792 2.48737056 +v -1.5776422e-16 -0.51351265 2.48741421 +v 0.28263737 -0.47275792 2.48737056 +v 0.51025035 -0.36259406 2.48702757 +v 0.63539982 -0.22717114 2.48602984 +v 0.56361044 -0.13608975 2.58387463 +v 0.47206618 -3.6732655e-2 2.58387463 +v 0.26647817 6.2888303e-2 2.58387463 +v 4.5168038e-17 0.10132834 2.58387463 +v -0.26647817 6.2888303e-2 2.58387463 +v -0.47206618 -3.6732655e-2 2.58387463 +v -0.56361044 -0.13608975 2.58387463 +v -0.47206618 -0.23544684 2.58387463 +v -0.26647817 -0.33506780 2.58387463 +v -1.5907769e-16 -0.37350783 2.58387463 +v 0.26647817 -0.33506780 2.58387463 +v 0.47206618 -0.23544684 2.58387463 +v 0.56361044 -0.13608975 -1.23095257 +v 0.47206618 -0.23544684 -1.23095257 +v 0.26647817 -0.33506780 -1.23095257 +v -1.4635166e-16 -0.37350783 -1.23095257 +v -0.26647817 -0.33506780 -1.23095257 +v -0.47206618 -0.23544684 -1.23095257 +v -0.56361044 -0.13608975 -1.23095257 +v -0.47206618 -3.6732655e-2 -1.23095257 +v -0.26647817 6.2888303e-2 -1.23095257 +v 3.8545495e-17 0.10132834 -1.23095257 +v 0.26647817 6.2888303e-2 -1.23095257 +v 0.47206618 -3.6732655e-2 -1.23095257 +vt 0.17829199 0.89317933 +vt 0.18069339 0.81035116 +vt 0.18527922 0.37571382 +vt 0.18532151 0.29486306 +vt 0.18791959 0.14830115 +vt 0.18791959 0.10856423 +vt 0.20314713 0.12843269 +vt 0.20975035 8.7377216e-2 +vt 0.20975035 0.16948816 +vt 0.21850308 0.11261484 +vt 0.21850308 0.14425053 +vt 0.22165423 0.88975788 +vt 0.22435366 0.80997949 +vt 0.22755171 0.29881073 +vt 0.22870228 0.37723884 +vt 0.24747943 6.9875701e-2 +vt 0.24747943 0.18698968 +vt 0.25127261 9.6838356e-2 +vt 0.25127261 0.16002702 +vt 0.27060734 0.88879196 +vt 0.27074213 0.80997976 +vt 0.27474364 0.37823859 +vt 0.27613144 0.30066702 +vt 0.29361273 6.3409017e-2 +vt 0.29361273 9.0756142e-2 +vt 0.29361273 0.16610924 +vt 0.29361273 0.19345636 +vt 0.31703822 0.81046166 +vt 0.31918689 0.88962826 +vt 0.32069478 0.37856092 +vt 0.32438083 0.30086217 +vt 0.33595285 9.6838356e-2 +vt 0.33595285 0.16002702 +vt 0.33974602 6.9875701e-2 +vt 0.33974602 0.18698968 +vt 0.36055748 0.81138554 +vt 0.36065915 0.81097942 +vt 0.36398168 0.37819292 +vt 0.36418503 0.37789531 +vt 0.36668504 0.89086898 +vt 0.36676280 0.89084943 +vt 0.36691099 0.30207375 +vt 0.36695236 0.30223279 +vt 0.36872238 0.11261484 +vt 0.36872238 0.14425053 +vt 0.37747511 8.7377216e-2 +vt 0.37747511 0.16948816 +vt 0.38407833 0.12843269 +vt 0.39927375 0.81050145 +vt 0.39930587 0.10856423 +vt 0.39930587 0.14830115 +vt 0.40279633 0.37764108 +vt 0.41654613 0.88548784 +vt 0.42155567 0.30182815 +vt 0.43272357 0.88425855 +vt 0.43275680 0.90775599 +vt 0.43350325 0.81061974 +vt 0.43725957 0.37819669 +vt 0.43782803 0.30329259 +vt 0.43836159 0.27949265 +vt 0.44878808 0.88564480 +vt 0.45405976 0.30240273 +vt 0.46772781 0.81117201 +vt 0.47175805 0.37821133 +vt 0.49711609 0.88999730 +vt 0.49711610 0.89012186 +vt 0.50623268 0.30186735 +vt 0.50623760 0.81238777 +vt 0.50626408 0.81208619 +vt 0.50638960 0.30225183 +vt 0.51037824 0.37838238 +vt 0.51040290 0.37778380 +vt 0.54655116 0.89046313 +vt 0.54971633 0.81175061 +vt 0.55206041 0.30060239 +vt 0.55385641 0.37960239 +vt 0.59504260 0.89012459 +vt 0.59589226 0.81191907 +vt 0.60000913 0.38033469 +vt 0.60085458 0.30200292 +vt 0.60679244 0.10592228 +vt 0.60679244 0.14597961 +vt 0.62218877 0.12593387 +vt 0.62891678 8.4880740e-2 +vt 0.62896636 0.16702773 +vt 0.63743325 0.11008240 +vt 0.63745874 0.14177269 +vt 0.64207348 0.81266425 +vt 0.64356312 0.89160241 +vt 0.64615718 0.38051320 +vt 0.64961255 0.30174590 +vt 0.66629420 6.7394362e-2 +vt 0.66645917 0.18441365 +vt 0.67026467 9.4294318e-2 +vt 0.67035065 0.15747925 +vt 0.68553756 0.81384325 +vt 0.68562738 0.81394039 +vt 0.68629619 0.89198425 +vt 0.68636560 0.89196380 +vt 0.68962387 0.38013939 +vt 0.68966677 0.37994608 +vt 0.69647002 0.30424926 +vt 0.69657704 0.30431800 +vt 0.71250700 6.0741977e-2 +vt 0.71255564 8.8126139e-2 +vt 0.71266950 0.16350663 +vt 0.71271814 0.19089079 +vt 0.72424320 0.81357429 +vt 0.72901984 0.38072594 +vt 0.74129825 0.88861041 +vt 0.74799875 0.30496769 +vt 0.75487449 9.4153521e-2 +vt 0.75496046 0.15733845 +vt 0.75744435 0.91092543 +vt 0.75747919 0.88742799 +vt 0.75847221 0.81379175 +vt 0.75876597 6.7219117e-2 +vt 0.75893094 0.18423841 +vt 0.76348133 0.38138140 +vt 0.76426680 0.30647926 +vt 0.76486931 0.28268097 +vt 0.77353962 0.88886078 +vt 0.78050103 0.30563642 +vt 0.78776640 0.10986008 +vt 0.78779189 0.14155038 +vt 0.79269503 0.81444317 +vt 0.79625878 8.4605042e-2 +vt 0.79630836 0.16675203 +vt 0.79797961 0.38149599 +vt 0.80303637 0.12569891 +vt 0.81843270 0.10565316 +vt 0.81843270 0.14571049 +vt 0.82654553 0.89090535 +vt 0.83120113 0.81577050 +vt 0.83177764 0.30476429 +vt 0.83662554 0.38118042 +vn 0.99478471 -2.4573947e-16 -0.10199692 +vn 0.86884241 0.48037499 -0.11980292 +vn 0.58998099 0.79308391 -0.15146070 +vn 0.28887041 0.94185704 -0.17163682 +vn 1.4239539e-17 0.98404780 -0.17790424 +vn -0.28887041 0.94185704 -0.17163682 +vn -0.58998099 0.79308391 -0.15146070 +vn -0.86884241 0.48037499 -0.11980292 +vn -0.99478471 1.3009737e-16 -0.10199692 +vn -0.86884241 -0.48037499 -0.11980292 +vn -0.58998099 -0.79308391 -0.15146070 +vn -0.28887041 -0.94185704 -0.17163682 +vn -4.8414434e-16 -0.98404780 -0.17790424 +vn 0.28887041 -0.94185704 -0.17163682 +vn 0.58998099 -0.79308391 -0.15146070 +vn 0.86884241 -0.48037499 -0.11980292 +vn 0.99478471 -3.6138158e-16 0.10199692 +vn 0.86884241 0.48037499 0.11980292 +vn 0.58998099 0.79308391 0.15146070 +vn 0.28887041 0.94185704 0.17163682 +vn 1.4239539e-17 0.98404780 0.17790424 +vn -0.28887041 0.94185704 0.17163682 +vn -0.58998099 0.79308391 0.15146070 +vn -0.86884241 0.48037499 0.11980292 +vn -0.99478471 2.1682895e-16 0.10199692 +vn -0.86884241 -0.48037499 0.11980292 +vn -0.58998099 -0.79308391 0.15146070 +vn -0.28887041 -0.94185704 0.17163682 +vn -2.5631171e-16 -0.98404780 0.17790424 +vn 0.28887041 -0.94185704 0.17163682 +vn 0.58998099 -0.79308391 0.15146070 +vn 0.86884241 -0.48037499 0.11980292 +vn 0.75581652 0.41041713 -0.51019523 +vn 0.88087860 8.3178752e-16 -0.47334225 +vn 0.75581652 -0.41041713 -0.51019523 +vn 0.49275265 -0.65660116 -0.57102517 +vn 0.23437761 -0.76040030 -0.60568846 +vn -2.4887150e-16 -0.78793020 -0.61576456 +vn -0.23437761 -0.76040030 -0.60568846 +vn -0.49275265 -0.65660116 -0.57102517 +vn -0.75581652 -0.41041713 -0.51019523 +vn -0.88087860 -6.6097401e-16 -0.47334225 +vn -0.75581652 0.41041713 -0.51019523 +vn -0.49275265 0.65660116 -0.57102517 +vn -0.23437761 0.76040030 -0.60568846 +vn 1.0979625e-17 0.78793020 -0.61576456 +vn 0.23437761 0.76040030 -0.60568846 +vn 0.49275265 0.65660116 -0.57102517 +vn 0.88087860 1.6338683e-16 0.47334225 +vn 0.75581652 0.41041713 0.51019523 +vn 0.49275265 0.65660116 0.57102517 +vn 0.23437761 0.76040030 0.60568846 +vn 1.4639500e-17 0.78793020 0.61576456 +vn -0.23437761 0.76040030 0.60568846 +vn -0.49275265 0.65660116 0.57102517 +vn -0.75581652 0.41041713 0.51019523 +vn -0.88087860 7.6494745e-16 0.47334225 +vn -0.75581652 -0.41041713 0.51019523 +vn -0.49275265 -0.65660116 0.57102517 +vn -0.23437761 -0.76040030 0.60568846 +vn -1.4639500e-17 -0.78793020 0.61576456 +vn 0.23437761 -0.76040030 0.60568846 +vn 0.49275265 -0.65660116 0.57102517 +vn 0.75581652 -0.41041713 0.51019523 +vn 0.51727372 3.4597998e-15 0.85582001 +vn 0.25957717 0.34221656 0.90305455 +vn 0.11893973 0.38362651 0.91579694 +vn 9.6596949e-18 0.39363611 0.91926634 +vn -0.11893973 0.38362651 0.91579694 +vn -0.25957717 0.34221656 0.90305455 +vn -0.51727372 3.7278125e-15 0.85582001 +vn -0.25957717 -0.34221656 0.90305455 +vn -0.11893973 -0.38362651 0.91579694 +vn -9.6596949e-18 -0.39363611 0.91926634 +vn 0.11893973 -0.38362651 0.91579694 +vn 0.25957717 -0.34221656 0.90305455 +vn 0.51727372 2.7288562e-15 -0.85582001 +vn 0.25957717 -0.34221656 -0.90305455 +vn 0.11893973 -0.38362651 -0.91579694 +vn 2.9140547e-17 -0.39363611 -0.91926634 +vn -0.11893973 -0.38362651 -0.91579694 +vn -0.25957717 -0.34221656 -0.90305455 +vn -0.51727372 -2.4486612e-15 -0.85582001 +vn -0.25957717 0.34221656 -0.90305455 +vn -0.11893973 0.38362651 -0.91579694 +vn 4.3630089e-17 0.39363611 -0.91926634 +vn 0.11893973 0.38362651 -0.91579694 +vn 0.25957717 0.34221656 -0.90305455 +g body_body +usemtl body +s 1 +f 193/484/193 194/476/194 210/477/210 209/487/209 +f 193/484/193 226/483/226 225/478/225 194/476/194 +f 194/476/194 195/465/195 211/469/211 210/477/210 +f 194/476/194 225/478/225 240/466/240 195/465/195 +f 195/464/195 196/456/196 212/458/212 211/468/211 +f 195/464/195 240/467/240 239/457/239 196/456/196 +f 196/456/196 197/446/197 213/447/213 212/458/212 +f 196/456/196 239/457/239 238/445/238 197/446/197 +f 197/446/197 198/442/198 214/444/214 213/447/213 +f 197/446/197 238/445/238 237/441/237 198/442/198 +f 198/442/198 199/437/199 215/439/215 214/444/214 +f 198/442/198 237/441/237 236/434/236 199/437/199 +f 199/436/199 200/431/200 216/432/216 215/440/215 +f 199/436/199 236/433/236 235/429/235 200/431/200 +f 200/431/200 201/425/201 217/426/217 216/432/216 +f 200/431/200 235/429/235 234/423/234 201/425/201 +f 201/425/201 202/417/202 218/420/218 217/426/217 +f 201/425/201 234/423/234 233/421/233 202/417/202 +f 202/417/202 203/405/203 219/407/219 218/420/218 +f 202/417/202 233/421/233 232/408/232 203/405/203 +f 203/404/203 204/396/204 220/398/220 219/406/219 +f 203/404/203 232/409/232 231/397/231 204/396/204 +f 204/396/204 205/389/205 221/390/221 220/398/220 +f 204/396/204 231/397/231 230/388/230 205/389/205 +f 205/389/205 206/381/206 222/383/222 221/390/221 +f 205/389/205 230/388/230 229/380/229 206/381/206 +f 206/381/206 207/370/207 223/371/223 222/383/222 +f 206/381/206 229/380/229 228/369/228 207/370/207 +f 207/502/207 208/494/208 224/497/224 223/504/223 +f 207/502/207 228/501/228 227/490/227 208/494/208 +f 208/494/208 227/490/227 226/483/226 193/484/193 +f 209/487/209 224/497/224 208/494/208 193/484/193 +f 209/487/209 241/488/241 256/491/256 224/497/224 +f 210/477/210 211/469/211 243/470/243 242/479/242 +f 211/468/211 212/458/212 244/459/244 243/471/243 +f 212/458/212 213/447/213 245/448/245 244/459/244 +f 213/447/213 214/444/214 246/443/246 245/448/245 +f 214/444/214 215/439/215 247/435/247 246/443/246 +f 215/440/215 216/432/216 248/430/248 247/438/247 +f 216/432/216 217/426/217 249/427/249 248/430/248 +f 217/426/217 218/420/218 250/422/250 249/427/249 +f 218/420/218 219/407/219 251/411/251 250/422/250 +f 219/406/219 220/398/220 252/399/252 251/410/251 +f 220/398/220 221/390/221 253/391/253 252/399/252 +f 221/390/221 222/383/222 254/382/254 253/391/253 +f 222/383/222 223/371/223 255/372/255 254/382/254 +f 223/504/223 224/497/224 256/491/256 255/503/255 +f 226/483/226 227/490/227 269/482/269 +f 227/374/227 228/376/228 270/378/270 269/375/269 +f 228/376/228 229/384/229 271/386/271 270/378/270 +f 229/384/229 230/392/230 272/393/272 271/386/271 +f 230/392/230 231/402/231 273/400/273 272/393/272 +f 231/402/231 232/414/232 274/412/274 273/400/273 +f 232/414/232 233/418/233 275/416/275 274/412/274 +f 233/421/233 234/423/234 275/424/275 +f 234/423/234 235/429/235 275/424/275 +f 235/419/235 236/415/236 276/413/276 275/416/275 +f 236/415/236 237/403/237 277/401/277 276/413/276 +f 237/403/237 238/395/238 278/394/278 277/401/277 +f 238/395/238 239/385/239 279/387/279 278/394/278 +f 239/385/239 240/377/240 280/379/280 279/387/279 +f 240/377/240 225/373/225 269/375/269 280/379/280 +f 242/479/242 241/488/241 209/487/209 210/477/210 +f 242/500/242 243/496/243 258/493/258 257/498/257 +f 243/496/243 244/486/244 259/481/259 258/493/258 +f 244/486/244 245/475/245 260/474/260 259/481/259 +f 245/475/245 246/461/246 261/463/261 260/474/260 +f 246/461/246 247/453/247 262/455/262 261/463/261 +f 247/453/247 248/450/248 263/451/263 262/455/262 +f 248/430/248 249/427/249 263/428/263 +f 249/427/249 250/422/250 263/428/263 +f 250/449/250 251/452/251 264/454/264 263/451/263 +f 251/452/251 252/460/252 265/462/265 264/454/264 +f 252/460/252 253/472/253 266/473/266 265/462/265 +f 253/472/253 254/485/254 267/480/267 266/473/266 +f 254/485/254 255/495/255 268/492/268 267/480/267 +f 255/495/255 256/499/256 257/498/257 268/492/268 +f 256/491/256 241/488/241 257/489/257 +f 257/489/257 241/488/241 242/479/242 +f 258/493/258 259/481/259 260/474/260 261/463/261 262/455/262 263/451/263 264/454/264 265/462/265 266/473/266 267/480/267 268/492/268 257/498/257 +f 269/482/269 225/478/225 226/483/226 +f 270/378/270 271/386/271 272/393/272 273/400/273 274/412/274 275/416/275 276/413/276 277/401/277 278/394/278 279/387/279 280/379/280 269/375/269 diff --git a/res/models/ships/falcon/wing1.png b/res/models/ships/falcon/wing1.png new file mode 100644 index 0000000..dea2d6e Binary files /dev/null and b/res/models/ships/falcon/wing1.png differ diff --git a/res/models/ships/falcon/wing2.png b/res/models/ships/falcon/wing2.png new file mode 100644 index 0000000..410ef00 Binary files /dev/null and b/res/models/ships/falcon/wing2.png differ diff --git a/res/models/ships/fighter/starship1.mtl b/res/models/ships/fighter/starship1.mtl new file mode 100644 index 0000000..0535077 --- /dev/null +++ b/res/models/ships/fighter/starship1.mtl @@ -0,0 +1,40 @@ +# Exported from Wings 3D 1.4.1 +newmtl body_auv +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd starship1_body.png + +newmtl default +Ns 100.0 +d 1.0 +illum 2 +Kd 0.7898538076923077 0.8133333333333334 0.6940444444444445 +Ka 0.7898538076923077 0.8133333333333334 0.6940444444444445 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 + +newmtl gun_auv +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd starship1_gun.png + +newmtl jet2_auv +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd starship1_engine.png + diff --git a/res/models/ships/fighter/starship1.obj b/res/models/ships/fighter/starship1.obj new file mode 100644 index 0000000..15b756a --- /dev/null +++ b/res/models/ships/fighter/starship1.obj @@ -0,0 +1,1307 @@ +# Exported from Wings 3D 1.4.1 +mtllib starship1.mtl +o jet1 +#96 vertices, 82 faces +v -1.1999914e-2 -2.1033522e-17 0.17074745 +v -1.4207408e-2 -1.1097819e-2 0.17075132 +v -2.0493818e-2 -2.0506095e-2 0.17075460 +v -2.9902095e-2 -2.6792505e-2 0.17075680 +v -4.0999914e-2 -2.8999998e-2 0.17075757 +v -5.2097734e-2 -2.6792505e-2 0.17075680 +v -6.1506011e-2 -2.0506095e-2 0.17075460 +v -6.7792421e-2 -1.1097819e-2 0.17075132 +v -6.9999914e-2 -2.1033522e-17 0.17074745 +v -6.7792421e-2 1.1097819e-2 0.17074357 +v -6.1506011e-2 2.0506095e-2 0.17074029 +v -5.2097734e-2 2.6792505e-2 0.17073809 +v -4.0999914e-2 2.8999998e-2 0.17073732 +v -2.9902095e-2 2.6792505e-2 0.17073809 +v -2.0493818e-2 2.0506095e-2 0.17074029 +v -1.4207408e-2 1.1097819e-2 0.17074357 +v -2.5803914e-2 -5.5068627e-6 0.15497145 +v -2.6960641e-2 -5.8207639e-3 0.15497348 +v -3.0254720e-2 -1.0750701e-2 0.15497520 +v -3.5184657e-2 -1.4044779e-2 0.15497635 +v -4.0999914e-2 -1.5201506e-2 0.15497675 +v -4.6815172e-2 -1.4044779e-2 0.15497635 +v -5.1745109e-2 -1.0750701e-2 0.15497520 +v -5.5039188e-2 -5.8207639e-3 0.15497348 +v -5.6195914e-2 -5.5068627e-6 0.15497145 +v -5.5039188e-2 5.8097502e-3 0.15496942 +v -5.1745109e-2 1.0739687e-2 0.15496770 +v -4.6815172e-2 1.4033766e-2 0.15496655 +v -4.0999914e-2 1.5190492e-2 0.15496614 +v -3.5184657e-2 1.4033766e-2 0.15496655 +v -3.0254720e-2 1.0739687e-2 0.15496770 +v -2.6960641e-2 5.8097502e-3 0.15496942 +v -2.1441385e-2 -8.1014078e-3 0.17075027 +v -1.9829914e-2 -2.1033522e-17 0.17074745 +v -2.1441385e-2 8.1014078e-3 0.17074462 +v -2.6030464e-2 1.4969450e-2 0.17074222 +v -3.2898506e-2 1.9558529e-2 0.17074062 +v -4.0999914e-2 2.1169999e-2 0.17074006 +v -4.9101323e-2 1.9558529e-2 0.17074062 +v -5.5969365e-2 1.4969450e-2 0.17074222 +v -6.0558444e-2 8.1014078e-3 0.17074462 +v -6.2169914e-2 -2.1033522e-17 0.17074745 +v -6.0558444e-2 -8.1014078e-3 0.17075027 +v -5.5969365e-2 -1.4969450e-2 0.17075267 +v -4.9101323e-2 -1.9558529e-2 0.17075427 +v -4.0999914e-2 -2.1169999e-2 0.17075484 +v -3.2898506e-2 -1.9558529e-2 0.17075427 +v -2.6030464e-2 -1.4969450e-2 0.17075267 +v -1.1999914e-2 -2.1033522e-17 0.17074745 +v -1.4207408e-2 -1.1097819e-2 0.17075132 +v -2.0493818e-2 -2.0506095e-2 0.17075460 +v -2.9902095e-2 -2.6792505e-2 0.17075680 +v -4.0999914e-2 -2.8999998e-2 0.17075757 +v -5.2097734e-2 -2.6792505e-2 0.17075680 +v -6.1506011e-2 -2.0506095e-2 0.17075460 +v -6.7792421e-2 -1.1097819e-2 0.17075132 +v -6.9999914e-2 -2.1033522e-17 0.17074745 +v -6.7792421e-2 1.1097819e-2 0.17074357 +v -6.1506011e-2 2.0506095e-2 0.17074029 +v -5.2097734e-2 2.6792505e-2 0.17073809 +v -4.0999914e-2 2.8999998e-2 0.17073732 +v -2.9902095e-2 2.6792505e-2 0.17073809 +v -2.0493818e-2 2.0506095e-2 0.17074029 +v -1.4207408e-2 1.1097819e-2 0.17074357 +v -2.5803914e-2 -5.5068627e-6 0.15497145 +v -2.6960641e-2 -5.8207639e-3 0.15497348 +v -3.0254720e-2 -1.0750701e-2 0.15497520 +v -3.5184657e-2 -1.4044779e-2 0.15497635 +v -4.0999914e-2 -1.5201506e-2 0.15497675 +v -4.6815172e-2 -1.4044779e-2 0.15497635 +v -5.1745109e-2 -1.0750701e-2 0.15497520 +v -5.5039188e-2 -5.8207639e-3 0.15497348 +v -5.6195914e-2 -5.5068627e-6 0.15497145 +v -5.5039188e-2 5.8097502e-3 0.15496942 +v -5.1745109e-2 1.0739687e-2 0.15496770 +v -4.6815172e-2 1.4033766e-2 0.15496655 +v -4.0999914e-2 1.5190492e-2 0.15496614 +v -3.5184657e-2 1.4033766e-2 0.15496655 +v -3.0254720e-2 1.0739687e-2 0.15496770 +v -2.6960641e-2 5.8097502e-3 0.15496942 +v -2.1441385e-2 -8.1014078e-3 0.17075027 +v -1.9829914e-2 -2.1033522e-17 0.17074745 +v -2.1441385e-2 8.1014078e-3 0.17074462 +v -2.6030464e-2 1.4969450e-2 0.17074222 +v -3.2898506e-2 1.9558529e-2 0.17074062 +v -4.0999914e-2 2.1169999e-2 0.17074006 +v -4.9101323e-2 1.9558529e-2 0.17074062 +v -5.5969365e-2 1.4969450e-2 0.17074222 +v -6.0558444e-2 8.1014078e-3 0.17074462 +v -6.2169914e-2 -2.1033522e-17 0.17074745 +v -6.0558444e-2 -8.1014078e-3 0.17075027 +v -5.5969365e-2 -1.4969450e-2 0.17075267 +v -4.9101323e-2 -1.9558529e-2 0.17075427 +v -4.0999914e-2 -2.1169999e-2 0.17075484 +v -3.2898506e-2 -1.9558529e-2 0.17075427 +v -2.6030464e-2 -1.4969450e-2 0.17075267 +vt 4.7666667e-3 0.44566491 +vt 4.7666667e-3 0.62369430 +vt 4.7666667e-3 0.80473932 +vt 5.9808969e-3 0.26462397 +vt 4.2711951e-2 0.57370190 +vt 4.2996524e-2 0.49584691 +vt 4.3332224e-2 0.85466379 +vt 4.4260617e-2 0.21488718 +vt 9.2450696e-2 0.53542471 +vt 9.3029052e-2 0.53421233 +vt 9.3620936e-2 0.89269279 +vt 9.4254959e-2 0.17694444 +vt 9.9327166e-2 0.71371715 +vt 9.9935505e-2 0.35527899 +vt 0.10564629 0.68151116 +vt 0.10581376 0.74588984 +vt 0.10620618 0.38749446 +vt 0.10647049 0.32311610 +vt 0.12440718 0.65485518 +vt 0.12479371 0.77247752 +vt 0.12500739 0.41420883 +vt 0.12540973 0.29658655 +vt 0.15093770 0.63591729 +vt 0.15152107 0.79124886 +vt 0.15160825 0.43315900 +vt 0.15206667 0.27782702 +vt 0.18310092 0.62938395 +vt 0.18373622 0.79752117 +vt 0.18378061 0.43964724 +vt 0.18427298 0.27150954 +vt 0.21531607 0.63565627 +vt 0.21589945 0.79098783 +vt 0.21598693 0.43332976 +vt 0.21644534 0.27799777 +vt 0.24204343 0.65442761 +vt 0.24242997 0.77204994 +vt 0.24264386 0.41457023 +vt 0.24304620 0.29694795 +vt 0.26102339 0.68101528 +vt 0.26119086 0.74539396 +vt 0.26158311 0.38804068 +vt 0.26184741 0.32366232 +vt 0.26750998 0.71318797 +vt 0.26811809 0.35587778 +vt 0.27321621 0.53421233 +vt 0.27379863 0.53421233 +vt 0.27438645 0.89148041 +vt 0.27502454 0.17694444 +vt 0.32350492 0.57224133 +vt 0.32379297 0.49626960 +vt 0.32412519 0.85320323 +vt 0.32505707 0.21530986 +vt 0.35100915 0.33731438 +vt 0.36207048 0.62216580 +vt 0.36207048 0.80321082 +vt 0.36207269 0.44653281 +vt 0.36321658 0.39868530 +vt 0.36321658 0.27594346 +vt 0.36328692 0.50572297 +vt 0.36328692 0.26549187 +vt 0.36328692 0.67987843 +vt 0.36328692 0.83644886 +vt 0.36331709 0.77141550 +vt 0.36751426 0.80393413 +vt 0.37129679 0.61781996 +vt 0.37135436 0.74192944 +vt 0.39282498 0.61781996 +vt 0.39430903 0.33731438 +vt 0.39798041 0.45071305 +vt 0.39798041 0.22391571 +vt 0.40322046 0.38211515 +vt 0.40322046 0.29251361 +vt 0.42534167 0.49768432 +vt 0.42534167 0.61360771 +vt 0.42859805 0.42009541 +vt 0.42859805 0.25453335 +vt 0.45000816 0.48547688 +vt 0.45000816 0.18915188 +vt 0.45785835 0.61781996 +vt 0.46657831 0.44547301 +vt 0.46657831 0.22915575 +vt 0.47537021 0.86603891 +vt 0.47542777 0.74192944 +vt 0.47921031 0.67982466 +vt 0.48340748 0.64730602 +vt 0.48343764 0.71233939 +vt 0.48343764 0.80398790 +vt 0.48739641 0.50572297 +vt 0.48739641 0.50572297 +vt 0.48739641 0.62585862 +vt 0.48739641 0.74599426 +vt 0.51137908 0.49768432 +vt 0.51137908 0.45438443 +vt 0.51137908 0.22024433 +vt 0.51137908 0.17694444 +vt 0.51693447 0.61781996 +vt 0.51693447 0.73795561 +vt 0.51693447 0.85809126 +vt 0.54945115 0.49768432 +vt 0.54945115 0.61360771 +vt 0.54945115 0.61781996 +vt 0.54945115 0.73374336 +vt 0.54945115 0.73795561 +vt 0.54945115 0.85387901 +vt 0.55617985 0.44547301 +vt 0.55617985 0.22915575 +vt 0.57275000 0.48547688 +vt 0.57275000 0.18915188 +vt 0.58196784 0.73795561 +vt 0.58196784 0.85809126 +vt 0.58196784 0.61781996 +vt 0.59416011 0.42009541 +vt 0.59416011 0.25453335 +vt 0.61150589 0.50572297 +vt 0.61150589 0.62585862 +vt 0.61150589 0.74599426 +vt 0.61953771 0.38211515 +vt 0.61953771 0.29251361 +vt 0.62477775 0.45071305 +vt 0.62477775 0.22391571 +vt 0.62844913 0.33731438 +vt 0.65954158 0.39868530 +vt 0.65954158 0.27594346 +vt 0.67174902 0.33731438 +vt 0.67174902 0.33731438 +vt 0.68395645 0.27594346 +vt 0.68395645 0.39868530 +vt 0.68402680 0.55974278 +vt 0.68402680 0.71631321 +vt 0.68405696 0.65127985 +vt 0.68825413 0.68379848 +vt 0.69203666 0.49768432 +vt 0.69209423 0.62179379 +vt 0.71504890 0.33731438 +vt 0.71872028 0.22391571 +vt 0.71872028 0.45071305 +vt 0.72396033 0.29251361 +vt 0.72396033 0.38211515 +vt 0.74933792 0.25453335 +vt 0.74933792 0.42009541 +vt 0.77074804 0.18915188 +vt 0.77074804 0.48547688 +vt 0.78731818 0.22915575 +vt 0.78731818 0.44547301 +vt 0.79611008 0.74590326 +vt 0.79616764 0.62179379 +vt 0.79995018 0.55968901 +vt 0.80414735 0.52717038 +vt 0.80417751 0.59220374 +vt 0.80417751 0.68385225 +vt 0.83211895 0.17694444 +vt 0.83211895 0.22024433 +vt 0.83211895 0.45438443 +vt 0.83211895 0.49768432 +vt 0.87691972 0.22915575 +vt 0.87691972 0.44547301 +vt 0.89348987 0.18915188 +vt 0.89348987 0.48547688 +vt 0.91489998 0.25453335 +vt 0.91489998 0.42009541 +vt 0.94027758 0.29251361 +vt 0.94027758 0.38211515 +vt 0.94551762 0.22391571 +vt 0.94551762 0.45071305 +vt 0.94918901 0.33731438 +vt 0.98028145 0.27594346 +vt 0.98028145 0.39868530 +vt 0.99248889 0.33731438 +vn 0.90552017 1.4810976e-4 0.42430319 +vn 0.83659155 -0.34637944 0.42442416 +vn 0.64029945 -0.64015130 0.42452670 +vn 0.34652757 -0.83644339 0.42459522 +vn -1.6884180e-17 -0.90537200 0.42461928 +vn -0.34652757 -0.83644339 0.42459522 +vn -0.64029945 -0.64015130 0.42452670 +vn -0.83659155 -0.34637944 0.42442416 +vn -0.90552017 1.4810976e-4 0.42430319 +vn -0.83659155 0.34667566 0.42418223 +vn -0.64029945 0.64044752 0.42407969 +vn -0.34652757 0.83673961 0.42401117 +vn -4.7987725e-31 0.90566822 0.42398711 +vn 0.34652757 0.83673961 0.42401117 +vn 0.64029945 0.64044752 0.42407969 +vn 0.83659155 0.34667566 0.42418223 +vn 0.54292129 -2.9313977e-4 -0.83978354 +vn 0.50159386 -0.20806011 -0.83971101 +vn 0.38390332 -0.38419644 -0.83964953 +vn 0.20776698 -0.50188697 -0.83960845 +vn -1.8221797e-16 -0.54321439 -0.83959402 +vn -0.20776698 -0.50188697 -0.83960845 +vn -0.38390332 -0.38419644 -0.83964953 +vn -0.50159386 -0.20806011 -0.83971101 +vn -0.54292129 -2.9313977e-4 -0.83978354 +vn -0.50159386 0.20747383 -0.83985606 +vn -0.38390332 0.38361016 -0.83991755 +vn -0.20776698 0.50130069 -0.83995863 +vn -1.7209475e-16 0.54262811 -0.83997305 +vn 0.20776698 0.50130069 -0.83995863 +vn 0.38390332 0.38361016 -0.83991755 +vn 0.50159386 0.20747383 -0.83985606 +vn 8.8253535e-16 3.4906584e-4 0.99999994 +vn -2.2439805e-15 3.4906584e-4 0.99999994 +vn -4.9144987e-15 3.4906584e-4 0.99999994 +vn -2.1211580e-15 3.4906584e-4 0.99999994 +vn 2.0801373e-15 3.4906584e-4 0.99999994 +vn -3.9443045e-31 3.4906584e-4 0.99999994 +vn -2.0801373e-15 3.4906584e-4 0.99999994 +vn 2.1211580e-15 3.4906584e-4 0.99999994 +vn 4.9144987e-15 3.4906584e-4 0.99999994 +vn 2.2439805e-15 3.4906584e-4 0.99999994 +vn -8.8253535e-16 3.4906584e-4 0.99999994 +vn 1.8497256e-15 3.4906584e-4 0.99999994 +vn 1.4817229e-15 3.4906584e-4 0.99999994 +vn -9.8607613e-32 3.4906584e-4 0.99999994 +vn -1.4817229e-15 3.4906584e-4 0.99999994 +vn -1.8497256e-15 3.4906584e-4 0.99999994 +vn -0.90552017 -1.4810976e-4 -0.42430319 +vn -0.83659155 0.34637944 -0.42442416 +vn -0.64029945 0.64015130 -0.42452670 +vn -0.34652757 0.83644339 -0.42459522 +vn 1.6884180e-17 0.90537200 -0.42461928 +vn 0.34652757 0.83644339 -0.42459522 +vn 0.64029945 0.64015130 -0.42452670 +vn 0.83659155 0.34637944 -0.42442416 +vn 0.90552017 -1.4810976e-4 -0.42430319 +vn 0.83659155 -0.34667566 -0.42418223 +vn 0.64029945 -0.64044752 -0.42407969 +vn 0.34652757 -0.83673961 -0.42401117 +vn 4.7987725e-31 -0.90566822 -0.42398711 +vn -0.34652757 -0.83673961 -0.42401117 +vn -0.64029945 -0.64044752 -0.42407969 +vn -0.83659155 -0.34667566 -0.42418223 +vn -0.54292129 2.9313977e-4 0.83978354 +vn -0.50159386 0.20806011 0.83971101 +vn -0.38390332 0.38419644 0.83964953 +vn -0.20776698 0.50188697 0.83960845 +vn -2.7332696e-16 0.54321439 0.83959402 +vn 0.20776698 0.50188697 0.83960845 +vn 0.38390332 0.38419644 0.83964953 +vn 0.50159386 0.20806011 0.83971101 +vn 0.54292129 2.9313977e-4 0.83978354 +vn 0.50159386 -0.20747383 0.83985606 +vn 0.38390332 -0.38361016 0.83991755 +vn 0.20776698 -0.50130069 0.83995863 +vn -2.8345018e-16 -0.54262811 0.83997305 +vn -0.20776698 -0.50130069 0.83995863 +vn -0.38390332 -0.38361016 0.83991755 +vn -0.50159386 -0.20747383 0.83985606 +vn -8.8253535e-16 -3.4906584e-4 -0.99999994 +vn 2.2439805e-15 -3.4906584e-4 -0.99999994 +vn 4.9144987e-15 -3.4906584e-4 -0.99999994 +vn 2.1211580e-15 -3.4906584e-4 -0.99999994 +vn -2.0801373e-15 -3.4906584e-4 -0.99999994 +vn 3.9443045e-31 -3.4906584e-4 -0.99999994 +vn 2.0801373e-15 -3.4906584e-4 -0.99999994 +vn -2.1211580e-15 -3.4906584e-4 -0.99999994 +vn -4.9144987e-15 -3.4906584e-4 -0.99999994 +vn -2.2439805e-15 -3.4906584e-4 -0.99999994 +vn 8.8253535e-16 -3.4906584e-4 -0.99999994 +vn -1.8497256e-15 -3.4906584e-4 -0.99999994 +vn -1.4817229e-15 -3.4906584e-4 -0.99999994 +vn 9.8607613e-32 -3.4906584e-4 -0.99999994 +vn 1.4817229e-15 -3.4906584e-4 -0.99999994 +vn 1.8497256e-15 -3.4906584e-4 -0.99999994 +g jet1_default +usemtl default +s 1 +f 33//33 81//81 96//96 48//48 +f 34//34 82//82 81//81 33//33 +f 35//35 83//83 82//82 34//34 +f 36//36 84//84 83//83 35//35 +f 37//37 85//85 84//84 36//36 +f 38//38 86//86 85//85 37//37 +f 39//39 87//87 86//86 38//38 +f 40//40 88//88 87//87 39//39 +f 41//41 89//89 88//88 40//40 +f 42//42 90//90 89//89 41//41 +f 43//43 91//91 90//90 42//42 +f 44//44 92//92 91//91 43//43 +f 45//45 93//93 92//92 44//44 +f 46//46 94//94 93//93 45//45 +f 47//47 95//95 94//94 46//46 +f 48//48 96//96 95//95 47//47 +g jet1_jet2_auv +usemtl jet2_auv +s 1 +f 1/128/1 17/147/17 32/149/32 16/133/16 +f 1/168/1 34/165/34 33/161/33 2/166/2 +f 2/132/2 18/148/18 17/147/17 1/128/1 +f 2/166/2 33/161/33 48/159/48 3/163/3 +f 3/8/3 19/22/19 18/18/18 2/4/2 +f 3/163/3 48/159/48 47/155/47 4/157/4 +f 4/12/4 20/26/20 19/22/19 3/8/3 +f 4/157/4 47/155/47 46/152/46 5/151/5 +f 5/103/5 21/104/21 20/98/20 4/91/4 +f 5/151/5 46/152/46 45/143/45 6/141/6 +f 6/116/6 22/110/22 21/104/21 5/103/5 +f 6/141/6 45/143/45 44/139/44 7/135/7 +f 7/52/7 23/38/23 22/34/22 6/48/6 +f 7/135/7 44/139/44 43/137/43 8/126/8 +f 8/60/8 24/42/24 23/38/23 7/52/7 +f 8/126/8 43/137/43 42/134/42 9/124/9 +f 9/87/9 25/64/25 24/63/24 8/83/8 +f 9/124/9 42/134/42 41/138/41 10/127/10 +f 10/82/10 26/62/26 25/64/25 9/87/9 +f 10/127/10 41/138/41 40/140/40 11/136/11 +f 11/50/11 27/37/27 26/41/26 10/56/10 +f 11/136/11 40/140/40 39/144/39 12/142/12 +f 12/46/12 28/33/28 27/37/27 11/50/11 +f 12/142/12 39/144/39 38/153/38 13/154/13 +f 13/99/13 29/100/29 28/96/28 12/89/12 +f 13/154/13 38/153/38 37/156/37 14/158/14 +f 14/114/14 30/111/30 29/100/29 13/99/13 +f 14/158/14 37/156/37 36/160/36 15/164/15 +f 15/6/15 31/21/31 30/25/30 14/10/14 +f 15/164/15 36/160/36 35/162/35 16/167/16 +f 16/1/16 32/17/32 31/21/31 15/6/15 +f 16/167/16 35/162/35 34/165/34 1/168/1 +f 18/18/18 19/22/19 20/26/20 21/30/21 22/34/22 23/38/23 24/42/24 25/44/25 26/41/26 27/37/27 28/33/28 29/29/29 30/25/30 31/21/31 32/17/32 17/14/17 +f 49/150/49 65/131/65 66/130/66 50/146/50 +f 49/53/49 82/68/82 83/71/83 64/57/64 +f 50/54/50 66/39/66 67/35/67 51/49/51 +f 50/58/50 81/72/81 82/68/82 49/53/49 +f 51/49/51 67/35/67 68/31/68 52/45/52 +f 51/70/51 96/76/96 81/72/81 50/58/50 +f 52/115/52 68/109/68 69/102/69 53/101/53 +f 52/78/52 95/81/95 96/76/96 51/70/51 +f 53/101/53 69/102/69 70/97/70 54/90/54 +f 53/95/53 94/94/94 95/81/95 52/78/52 +f 54/9/54 70/23/70 71/19/71 55/5/55 +f 54/108/54 93/106/93 94/94/94 53/95/53 +f 55/5/55 71/19/71 72/15/72 56/2/56 +f 55/120/55 92/113/92 93/106/93 54/108/54 +f 56/65/56 72/85/72 73/84/73 57/61/57 +f 56/123/56 91/118/91 92/113/92 55/120/55 +f 57/61/57 73/84/73 74/86/74 58/66/58 +f 57/125/57 90/121/90 91/118/91 56/123/56 +f 58/3/58 74/16/74 75/20/75 59/7/59 +f 58/122/58 89/117/89 90/121/90 57/125/57 +f 59/7/59 75/20/75 76/24/76 60/11/60 +f 59/119/59 88/112/88 89/117/89 58/122/58 +f 60/88/60 76/79/76 77/74/77 61/73/61 +f 60/107/60 87/105/87 88/112/88 59/119/59 +f 61/73/61 77/74/77 78/67/78 62/59/62 +f 61/92/61 86/93/86 87/105/87 60/107/60 +f 62/47/62 78/32/78 79/36/79 63/51/63 +f 62/77/62 85/80/85 86/93/86 61/92/61 +f 63/51/63 79/36/79 80/40/80 64/55/64 +f 63/69/63 84/75/84 85/80/85 62/77/62 +f 64/145/64 80/129/80 65/131/65 49/150/49 +f 64/57/64 83/71/83 84/75/84 63/69/63 +f 65/43/65 80/40/80 79/36/79 78/32/78 77/28/77 76/24/76 75/20/75 74/16/74 73/13/73 72/15/72 71/19/71 70/23/70 69/27/69 68/31/68 67/35/67 66/39/66 +o gun1 +#12 vertices, 8 faces +v 0.10512672 6.5541120e-3 -0.16283798 +v 0.11080275 3.2770560e-3 -0.16283798 +v 0.11080275 -3.2770560e-3 -0.16283798 +v 0.10512672 -6.5541120e-3 -0.16283798 +v 9.9450691e-2 -3.2770560e-3 -0.16283798 +v 9.9450691e-2 3.2770560e-3 -0.16283798 +v 0.10512672 6.5541120e-3 -0.24243289 +v 0.11080275 3.2770560e-3 -0.24243289 +v 0.11080275 -3.2770560e-3 -0.24243289 +v 0.10512672 -6.5541120e-3 -0.24243289 +v 9.9450691e-2 -3.2770560e-3 -0.24243289 +v 9.9450691e-2 3.2770560e-3 -0.24243289 +vt 0.28853100 0.99976852 +vt 0.28853100 0.14116852 +vt 0.35923100 0.99976852 +vt 0.35923100 0.14116852 +vt 0.42993100 0.99976852 +vt 0.42993100 0.14116852 +vt 0.42993100 0.14116852 +vt 0.42993100 0.99976852 +vt 0.43363741 7.2110828e-2 +vt 0.43364287 7.2103906e-2 +vt 0.46880558 0.13344344 +vt 0.46881105 0.13343652 +vt 0.46916892 1.0987987e-2 +vt 0.46917438 1.0981066e-2 +vt 0.50063100 0.14116852 +vt 0.50063100 0.99976852 +vt 0.53950527 0.13365321 +vt 0.53951073 0.13364629 +vt 0.53986861 1.1197758e-2 +vt 0.53987407 1.1190837e-2 +vt 0.57133100 0.14116852 +vt 0.57133100 0.99976852 +vt 0.57136822 0.14114293 +vt 0.57136822 0.99974293 +vt 0.57503678 7.2530370e-2 +vt 0.57504224 7.2523448e-2 +vt 0.64206822 0.14114293 +vt 0.64206822 0.99974293 +vt 0.64207524 0.99978364 +vt 0.64207524 0.14118364 +vt 0.71277524 0.99978364 +vt 0.71277524 0.14118364 +vn -3.3306691e-16 0.86602540 0.50000000 +vn 0.75000000 0.43301270 0.50000000 +vn 0.75000000 -0.43301270 0.50000000 +vn 3.0531133e-16 -0.86602540 0.50000000 +vn -0.75000000 -0.43301270 0.50000000 +vn -0.75000000 0.43301270 0.50000000 +vn -1.3045121e-15 0.86602540 -0.50000000 +vn 0.75000000 0.43301270 -0.50000000 +vn 0.75000000 -0.43301270 -0.50000000 +vn -6.9388939e-16 -0.86602540 -0.50000000 +vn -0.75000000 -0.43301270 -0.50000000 +vn -0.75000000 0.43301270 -0.50000000 +g gun1_gun_auv +usemtl gun_auv +s 1 +f 97/185/97 102/179/102 101/177/101 100/181/100 99/187/99 98/193/98 +f 97/172/97 103/171/103 108/169/108 102/170/102 +f 98/175/98 104/173/104 103/171/103 97/172/97 +f 99/195/99 105/196/105 104/192/104 98/191/98 +f 100/183/100 106/184/106 105/176/105 99/174/99 +f 101/189/101 107/190/107 106/184/106 100/183/100 +f 102/197/102 108/198/108 107/200/107 101/199/101 +f 104/180/104 105/178/105 106/182/106 107/188/107 108/194/108 103/186/103 +o gun2 +#12 vertices, 8 faces +v -0.10512672 6.5541120e-3 -0.16283798 +v -9.9450691e-2 3.2770560e-3 -0.16283798 +v -9.9450691e-2 -3.2770560e-3 -0.16283798 +v -0.10512672 -6.5541120e-3 -0.16283798 +v -0.11080275 -3.2770560e-3 -0.16283798 +v -0.11080275 3.2770560e-3 -0.16283798 +v -0.10512672 6.5541120e-3 -0.24243289 +v -9.9450691e-2 3.2770560e-3 -0.24243289 +v -9.9450691e-2 -3.2770560e-3 -0.24243289 +v -0.10512672 -6.5541120e-3 -0.24243289 +v -0.11080275 -3.2770560e-3 -0.24243289 +v -0.11080275 3.2770560e-3 -0.24243289 +vt 0.28853100 0.99976852 +vt 0.28853100 0.14116852 +vt 0.35923100 0.99976852 +vt 0.35923100 0.14116852 +vt 0.42993100 0.99976852 +vt 0.42993100 0.14116852 +vt 0.42993100 0.14116852 +vt 0.42993100 0.99976852 +vt 0.43363741 7.2110828e-2 +vt 0.43364287 7.2103906e-2 +vt 0.46880558 0.13344344 +vt 0.46881105 0.13343652 +vt 0.46916892 1.0987987e-2 +vt 0.46917438 1.0981066e-2 +vt 0.50063100 0.14116852 +vt 0.50063100 0.99976852 +vt 0.53950527 0.13365321 +vt 0.53951073 0.13364629 +vt 0.53986861 1.1197758e-2 +vt 0.53987407 1.1190837e-2 +vt 0.57133100 0.14116852 +vt 0.57133100 0.99976852 +vt 0.57136822 0.14114293 +vt 0.57136822 0.99974293 +vt 0.57503678 7.2530370e-2 +vt 0.57504224 7.2523448e-2 +vt 0.64206822 0.14114293 +vt 0.64206822 0.99974293 +vt 0.64207524 0.99978364 +vt 0.64207524 0.14118364 +vt 0.71277524 0.99978364 +vt 0.71277524 0.14118364 +vn -3.3306691e-16 0.86602540 0.50000000 +vn 0.75000000 0.43301270 0.50000000 +vn 0.75000000 -0.43301270 0.50000000 +vn 3.0531133e-16 -0.86602540 0.50000000 +vn -0.75000000 -0.43301270 0.50000000 +vn -0.75000000 0.43301270 0.50000000 +vn -1.3045121e-15 0.86602540 -0.50000000 +vn 0.75000000 0.43301270 -0.50000000 +vn 0.75000000 -0.43301270 -0.50000000 +vn -6.9388939e-16 -0.86602540 -0.50000000 +vn -0.75000000 -0.43301270 -0.50000000 +vn -0.75000000 0.43301270 -0.50000000 +g gun2_gun_auv +usemtl gun_auv +s 1 +f 109/217/109 114/211/114 113/209/113 112/213/112 111/219/111 110/225/110 +f 109/204/109 115/203/115 120/201/120 114/202/114 +f 110/207/110 116/205/116 115/203/115 109/204/109 +f 111/227/111 117/228/117 116/224/116 110/223/110 +f 112/215/112 118/216/118 117/208/117 111/206/111 +f 113/221/113 119/222/119 118/216/118 112/215/112 +f 114/229/114 120/230/120 119/232/119 113/231/113 +f 116/212/116 117/210/117 118/214/118 119/220/119 120/226/120 115/218/115 +o jet2 +#96 vertices, 82 faces +v 6.9999914e-2 -2.1033522e-17 0.17074745 +v 6.7792421e-2 -1.1097819e-2 0.17075132 +v 6.1506011e-2 -2.0506095e-2 0.17075460 +v 5.2097734e-2 -2.6792505e-2 0.17075680 +v 4.0999914e-2 -2.8999998e-2 0.17075757 +v 2.9902095e-2 -2.6792505e-2 0.17075680 +v 2.0493818e-2 -2.0506095e-2 0.17075460 +v 1.4207408e-2 -1.1097819e-2 0.17075132 +v 1.1999914e-2 -2.1033522e-17 0.17074745 +v 1.4207408e-2 1.1097819e-2 0.17074357 +v 2.0493818e-2 2.0506095e-2 0.17074029 +v 2.9902095e-2 2.6792505e-2 0.17073809 +v 4.0999914e-2 2.8999998e-2 0.17073732 +v 5.2097734e-2 2.6792505e-2 0.17073809 +v 6.1506011e-2 2.0506095e-2 0.17074029 +v 6.7792421e-2 1.1097819e-2 0.17074357 +v 5.6195914e-2 -5.5068627e-6 0.15497145 +v 5.5039188e-2 -5.8207639e-3 0.15497348 +v 5.1745109e-2 -1.0750701e-2 0.15497520 +v 4.6815172e-2 -1.4044779e-2 0.15497635 +v 4.0999914e-2 -1.5201506e-2 0.15497675 +v 3.5184657e-2 -1.4044779e-2 0.15497635 +v 3.0254720e-2 -1.0750701e-2 0.15497520 +v 2.6960641e-2 -5.8207639e-3 0.15497348 +v 2.5803914e-2 -5.5068627e-6 0.15497145 +v 2.6960641e-2 5.8097502e-3 0.15496942 +v 3.0254720e-2 1.0739687e-2 0.15496770 +v 3.5184657e-2 1.4033766e-2 0.15496655 +v 4.0999914e-2 1.5190492e-2 0.15496614 +v 4.6815172e-2 1.4033766e-2 0.15496655 +v 5.1745109e-2 1.0739687e-2 0.15496770 +v 5.5039188e-2 5.8097502e-3 0.15496942 +v 6.0558444e-2 -8.1014078e-3 0.17075027 +v 6.2169914e-2 -2.1033522e-17 0.17074745 +v 6.0558444e-2 8.1014078e-3 0.17074462 +v 5.5969365e-2 1.4969450e-2 0.17074222 +v 4.9101323e-2 1.9558529e-2 0.17074062 +v 4.0999914e-2 2.1169999e-2 0.17074006 +v 3.2898506e-2 1.9558529e-2 0.17074062 +v 2.6030464e-2 1.4969450e-2 0.17074222 +v 2.1441385e-2 8.1014078e-3 0.17074462 +v 1.9829914e-2 -2.1033522e-17 0.17074745 +v 2.1441385e-2 -8.1014078e-3 0.17075027 +v 2.6030464e-2 -1.4969450e-2 0.17075267 +v 3.2898506e-2 -1.9558529e-2 0.17075427 +v 4.0999914e-2 -2.1169999e-2 0.17075484 +v 4.9101323e-2 -1.9558529e-2 0.17075427 +v 5.5969365e-2 -1.4969450e-2 0.17075267 +v 6.9999914e-2 -2.1033522e-17 0.17074745 +v 6.7792421e-2 -1.1097819e-2 0.17075132 +v 6.1506011e-2 -2.0506095e-2 0.17075460 +v 5.2097734e-2 -2.6792505e-2 0.17075680 +v 4.0999914e-2 -2.8999998e-2 0.17075757 +v 2.9902095e-2 -2.6792505e-2 0.17075680 +v 2.0493818e-2 -2.0506095e-2 0.17075460 +v 1.4207408e-2 -1.1097819e-2 0.17075132 +v 1.1999914e-2 -2.1033522e-17 0.17074745 +v 1.4207408e-2 1.1097819e-2 0.17074357 +v 2.0493818e-2 2.0506095e-2 0.17074029 +v 2.9902095e-2 2.6792505e-2 0.17073809 +v 4.0999914e-2 2.8999998e-2 0.17073732 +v 5.2097734e-2 2.6792505e-2 0.17073809 +v 6.1506011e-2 2.0506095e-2 0.17074029 +v 6.7792421e-2 1.1097819e-2 0.17074357 +v 5.6195914e-2 -5.5068627e-6 0.15497145 +v 5.5039188e-2 -5.8207639e-3 0.15497348 +v 5.1745109e-2 -1.0750701e-2 0.15497520 +v 4.6815172e-2 -1.4044779e-2 0.15497635 +v 4.0999914e-2 -1.5201506e-2 0.15497675 +v 3.5184657e-2 -1.4044779e-2 0.15497635 +v 3.0254720e-2 -1.0750701e-2 0.15497520 +v 2.6960641e-2 -5.8207639e-3 0.15497348 +v 2.5803914e-2 -5.5068627e-6 0.15497145 +v 2.6960641e-2 5.8097502e-3 0.15496942 +v 3.0254720e-2 1.0739687e-2 0.15496770 +v 3.5184657e-2 1.4033766e-2 0.15496655 +v 4.0999914e-2 1.5190492e-2 0.15496614 +v 4.6815172e-2 1.4033766e-2 0.15496655 +v 5.1745109e-2 1.0739687e-2 0.15496770 +v 5.5039188e-2 5.8097502e-3 0.15496942 +v 6.0558444e-2 -8.1014078e-3 0.17075027 +v 6.2169914e-2 -2.1033522e-17 0.17074745 +v 6.0558444e-2 8.1014078e-3 0.17074462 +v 5.5969365e-2 1.4969450e-2 0.17074222 +v 4.9101323e-2 1.9558529e-2 0.17074062 +v 4.0999914e-2 2.1169999e-2 0.17074006 +v 3.2898506e-2 1.9558529e-2 0.17074062 +v 2.6030464e-2 1.4969450e-2 0.17074222 +v 2.1441385e-2 8.1014078e-3 0.17074462 +v 1.9829914e-2 -2.1033522e-17 0.17074745 +v 2.1441385e-2 -8.1014078e-3 0.17075027 +v 2.6030464e-2 -1.4969450e-2 0.17075267 +v 3.2898506e-2 -1.9558529e-2 0.17075427 +v 4.0999914e-2 -2.1169999e-2 0.17075484 +v 4.9101323e-2 -1.9558529e-2 0.17075427 +v 5.5969365e-2 -1.4969450e-2 0.17075267 +vt 4.7666667e-3 0.44566491 +vt 4.7666667e-3 0.62369430 +vt 4.7666667e-3 0.80473932 +vt 5.9808969e-3 0.26462397 +vt 4.2711951e-2 0.57370190 +vt 4.2996524e-2 0.49584691 +vt 4.3332224e-2 0.85466379 +vt 4.4260617e-2 0.21488718 +vt 9.2450696e-2 0.53542471 +vt 9.3029052e-2 0.53421233 +vt 9.3620936e-2 0.89269279 +vt 9.4254959e-2 0.17694444 +vt 9.9327166e-2 0.71371715 +vt 9.9935505e-2 0.35527899 +vt 0.10564629 0.68151116 +vt 0.10581376 0.74588984 +vt 0.10620618 0.38749446 +vt 0.10647049 0.32311610 +vt 0.12440718 0.65485518 +vt 0.12479371 0.77247752 +vt 0.12500739 0.41420883 +vt 0.12540973 0.29658655 +vt 0.15093770 0.63591729 +vt 0.15152107 0.79124886 +vt 0.15160825 0.43315900 +vt 0.15206667 0.27782702 +vt 0.18310092 0.62938395 +vt 0.18373622 0.79752117 +vt 0.18378061 0.43964724 +vt 0.18427298 0.27150954 +vt 0.21531607 0.63565627 +vt 0.21589945 0.79098783 +vt 0.21598693 0.43332976 +vt 0.21644534 0.27799777 +vt 0.24204343 0.65442761 +vt 0.24242997 0.77204994 +vt 0.24264386 0.41457023 +vt 0.24304620 0.29694795 +vt 0.26102339 0.68101528 +vt 0.26119086 0.74539396 +vt 0.26158311 0.38804068 +vt 0.26184741 0.32366232 +vt 0.26750998 0.71318797 +vt 0.26811809 0.35587778 +vt 0.27321621 0.53421233 +vt 0.27379863 0.53421233 +vt 0.27438645 0.89148041 +vt 0.27502454 0.17694444 +vt 0.32350492 0.57224133 +vt 0.32379297 0.49626960 +vt 0.32412519 0.85320323 +vt 0.32505707 0.21530986 +vt 0.35100915 0.33731438 +vt 0.36207048 0.62216580 +vt 0.36207048 0.80321082 +vt 0.36207269 0.44653281 +vt 0.36321658 0.39868530 +vt 0.36321658 0.27594346 +vt 0.36328692 0.50572297 +vt 0.36328692 0.26549187 +vt 0.36328692 0.67987843 +vt 0.36328692 0.83644886 +vt 0.36331709 0.77141550 +vt 0.36751426 0.80393413 +vt 0.37129679 0.61781996 +vt 0.37135436 0.74192944 +vt 0.39282498 0.61781996 +vt 0.39430903 0.33731438 +vt 0.39798041 0.45071305 +vt 0.39798041 0.22391571 +vt 0.40322046 0.38211515 +vt 0.40322046 0.29251361 +vt 0.42534167 0.49768432 +vt 0.42534167 0.61360771 +vt 0.42859805 0.42009541 +vt 0.42859805 0.25453335 +vt 0.45000816 0.48547688 +vt 0.45000816 0.18915188 +vt 0.45785835 0.61781996 +vt 0.46657831 0.44547301 +vt 0.46657831 0.22915575 +vt 0.47537021 0.86603891 +vt 0.47542777 0.74192944 +vt 0.47921031 0.67982466 +vt 0.48340748 0.64730602 +vt 0.48343764 0.71233939 +vt 0.48343764 0.80398790 +vt 0.48739641 0.50572297 +vt 0.48739641 0.50572297 +vt 0.48739641 0.62585862 +vt 0.48739641 0.74599426 +vt 0.51137908 0.49768432 +vt 0.51137908 0.45438443 +vt 0.51137908 0.22024433 +vt 0.51137908 0.17694444 +vt 0.51693447 0.61781996 +vt 0.51693447 0.73795561 +vt 0.51693447 0.85809126 +vt 0.54945115 0.49768432 +vt 0.54945115 0.61360771 +vt 0.54945115 0.61781996 +vt 0.54945115 0.73374336 +vt 0.54945115 0.73795561 +vt 0.54945115 0.85387901 +vt 0.55617985 0.44547301 +vt 0.55617985 0.22915575 +vt 0.57275000 0.48547688 +vt 0.57275000 0.18915188 +vt 0.58196784 0.73795561 +vt 0.58196784 0.85809126 +vt 0.58196784 0.61781996 +vt 0.59416011 0.42009541 +vt 0.59416011 0.25453335 +vt 0.61150589 0.50572297 +vt 0.61150589 0.62585862 +vt 0.61150589 0.74599426 +vt 0.61953771 0.38211515 +vt 0.61953771 0.29251361 +vt 0.62477775 0.45071305 +vt 0.62477775 0.22391571 +vt 0.62844913 0.33731438 +vt 0.65954158 0.39868530 +vt 0.65954158 0.27594346 +vt 0.67174902 0.33731438 +vt 0.67174902 0.33731438 +vt 0.68395645 0.27594346 +vt 0.68395645 0.39868530 +vt 0.68402680 0.55974278 +vt 0.68402680 0.71631321 +vt 0.68405696 0.65127985 +vt 0.68825413 0.68379848 +vt 0.69203666 0.49768432 +vt 0.69209423 0.62179379 +vt 0.71504890 0.33731438 +vt 0.71872028 0.22391571 +vt 0.71872028 0.45071305 +vt 0.72396033 0.29251361 +vt 0.72396033 0.38211515 +vt 0.74933792 0.25453335 +vt 0.74933792 0.42009541 +vt 0.77074804 0.18915188 +vt 0.77074804 0.48547688 +vt 0.78731818 0.22915575 +vt 0.78731818 0.44547301 +vt 0.79611008 0.74590326 +vt 0.79616764 0.62179379 +vt 0.79995018 0.55968901 +vt 0.80414735 0.52717038 +vt 0.80417751 0.59220374 +vt 0.80417751 0.68385225 +vt 0.83211895 0.17694444 +vt 0.83211895 0.22024433 +vt 0.83211895 0.45438443 +vt 0.83211895 0.49768432 +vt 0.87691972 0.22915575 +vt 0.87691972 0.44547301 +vt 0.89348987 0.18915188 +vt 0.89348987 0.48547688 +vt 0.91489998 0.25453335 +vt 0.91489998 0.42009541 +vt 0.94027758 0.29251361 +vt 0.94027758 0.38211515 +vt 0.94551762 0.22391571 +vt 0.94551762 0.45071305 +vt 0.94918901 0.33731438 +vt 0.98028145 0.27594346 +vt 0.98028145 0.39868530 +vt 0.99248889 0.33731438 +vn 0.90552017 1.4810976e-4 0.42430319 +vn 0.83659155 -0.34637944 0.42442416 +vn 0.64029945 -0.64015130 0.42452670 +vn 0.34652757 -0.83644339 0.42459522 +vn 0.0000000e+0 -0.90537200 0.42461928 +vn -0.34652757 -0.83644339 0.42459522 +vn -0.64029945 -0.64015130 0.42452670 +vn -0.83659155 -0.34637944 0.42442416 +vn -0.90552017 1.4810976e-4 0.42430319 +vn -0.83659155 0.34667566 0.42418223 +vn -0.64029945 0.64044752 0.42407969 +vn -0.34652757 0.83673961 0.42401117 +vn 0.0000000e+0 0.90566822 0.42398711 +vn 0.34652757 0.83673961 0.42401117 +vn 0.64029945 0.64044752 0.42407969 +vn 0.83659155 0.34667566 0.42418223 +vn 0.54292129 -2.9313977e-4 -0.83978354 +vn 0.50159386 -0.20806011 -0.83971101 +vn 0.38390332 -0.38419644 -0.83964953 +vn 0.20776698 -0.50188697 -0.83960845 +vn -1.7209475e-16 -0.54321439 -0.83959402 +vn -0.20776698 -0.50188697 -0.83960845 +vn -0.38390332 -0.38419644 -0.83964953 +vn -0.50159386 -0.20806011 -0.83971101 +vn -0.54292129 -2.9313977e-4 -0.83978354 +vn -0.50159386 0.20747383 -0.83985606 +vn -0.38390332 0.38361016 -0.83991755 +vn -0.20776698 0.50130069 -0.83995863 +vn -1.7209475e-16 0.54262811 -0.83997305 +vn 0.20776698 0.50130069 -0.83995863 +vn 0.38390332 0.38361016 -0.83991755 +vn 0.50159386 0.20747383 -0.83985606 +vn 8.8253535e-16 3.4906584e-4 0.99999994 +vn -2.2439805e-15 3.4906584e-4 0.99999994 +vn -4.9144987e-15 3.4906584e-4 0.99999994 +vn -2.1211580e-15 3.4906584e-4 0.99999994 +vn 2.0801373e-15 3.4906584e-4 0.99999994 +vn 0.0000000e+0 3.4906584e-4 0.99999994 +vn -2.0801373e-15 3.4906584e-4 0.99999994 +vn 2.1211580e-15 3.4906584e-4 0.99999994 +vn 4.9144987e-15 3.4906584e-4 0.99999994 +vn 2.2439805e-15 3.4906584e-4 0.99999994 +vn -8.8253535e-16 3.4906584e-4 0.99999994 +vn 1.8497256e-15 3.4906584e-4 0.99999994 +vn 1.4817229e-15 3.4906584e-4 0.99999994 +vn 0.0000000e+0 3.4906584e-4 0.99999994 +vn -1.4817229e-15 3.4906584e-4 0.99999994 +vn -1.8497256e-15 3.4906584e-4 0.99999994 +vn -0.90552017 -1.4810976e-4 -0.42430319 +vn -0.83659155 0.34637944 -0.42442416 +vn -0.64029945 0.64015130 -0.42452670 +vn -0.34652757 0.83644339 -0.42459522 +vn 0.0000000e+0 0.90537200 -0.42461928 +vn 0.34652757 0.83644339 -0.42459522 +vn 0.64029945 0.64015130 -0.42452670 +vn 0.83659155 0.34637944 -0.42442416 +vn 0.90552017 -1.4810976e-4 -0.42430319 +vn 0.83659155 -0.34667566 -0.42418223 +vn 0.64029945 -0.64044752 -0.42407969 +vn 0.34652757 -0.83673961 -0.42401117 +vn 0.0000000e+0 -0.90566822 -0.42398711 +vn -0.34652757 -0.83673961 -0.42401117 +vn -0.64029945 -0.64044752 -0.42407969 +vn -0.83659155 -0.34667566 -0.42418223 +vn -0.54292129 2.9313977e-4 0.83978354 +vn -0.50159386 0.20806011 0.83971101 +vn -0.38390332 0.38419644 0.83964953 +vn -0.20776698 0.50188697 0.83960845 +vn -2.8345018e-16 0.54321439 0.83959402 +vn 0.20776698 0.50188697 0.83960845 +vn 0.38390332 0.38419644 0.83964953 +vn 0.50159386 0.20806011 0.83971101 +vn 0.54292129 2.9313977e-4 0.83978354 +vn 0.50159386 -0.20747383 0.83985606 +vn 0.38390332 -0.38361016 0.83991755 +vn 0.20776698 -0.50130069 0.83995863 +vn -2.8345018e-16 -0.54262811 0.83997305 +vn -0.20776698 -0.50130069 0.83995863 +vn -0.38390332 -0.38361016 0.83991755 +vn -0.50159386 -0.20747383 0.83985606 +vn -8.8253535e-16 -3.4906584e-4 -0.99999994 +vn 2.2439805e-15 -3.4906584e-4 -0.99999994 +vn 4.9144987e-15 -3.4906584e-4 -0.99999994 +vn 2.1211580e-15 -3.4906584e-4 -0.99999994 +vn -2.0801373e-15 -3.4906584e-4 -0.99999994 +vn 0.0000000e+0 -3.4906584e-4 -0.99999994 +vn 2.0801373e-15 -3.4906584e-4 -0.99999994 +vn -2.1211580e-15 -3.4906584e-4 -0.99999994 +vn -4.9144987e-15 -3.4906584e-4 -0.99999994 +vn -2.2439805e-15 -3.4906584e-4 -0.99999994 +vn 8.8253535e-16 -3.4906584e-4 -0.99999994 +vn -1.8497256e-15 -3.4906584e-4 -0.99999994 +vn -1.4817229e-15 -3.4906584e-4 -0.99999994 +vn 0.0000000e+0 -3.4906584e-4 -0.99999994 +vn 1.4817229e-15 -3.4906584e-4 -0.99999994 +vn 1.8497256e-15 -3.4906584e-4 -0.99999994 +g jet2_default +usemtl default +s 1 +f 153//153 201//201 216//216 168//168 +f 154//154 202//202 201//201 153//153 +f 155//155 203//203 202//202 154//154 +f 156//156 204//204 203//203 155//155 +f 157//157 205//205 204//204 156//156 +f 158//158 206//206 205//205 157//157 +f 159//159 207//207 206//206 158//158 +f 160//160 208//208 207//207 159//159 +f 161//161 209//209 208//208 160//160 +f 162//162 210//210 209//209 161//161 +f 163//163 211//211 210//210 162//162 +f 164//164 212//212 211//211 163//163 +f 165//165 213//213 212//212 164//164 +f 166//166 214//214 213//213 165//165 +f 167//167 215//215 214//214 166//166 +f 168//168 216//216 215//215 167//167 +g jet2_jet2_auv +usemtl jet2_auv +s 1 +f 121/360/121 137/379/137 152/381/152 136/365/136 +f 121/400/121 154/397/154 153/393/153 122/398/122 +f 122/364/122 138/380/138 137/379/137 121/360/121 +f 122/398/122 153/393/153 168/391/168 123/395/123 +f 123/240/123 139/254/139 138/250/138 122/236/122 +f 123/395/123 168/391/168 167/387/167 124/389/124 +f 124/244/124 140/258/140 139/254/139 123/240/123 +f 124/389/124 167/387/167 166/384/166 125/383/125 +f 125/335/125 141/336/141 140/330/140 124/323/124 +f 125/383/125 166/384/166 165/375/165 126/373/126 +f 126/348/126 142/342/142 141/336/141 125/335/125 +f 126/373/126 165/375/165 164/371/164 127/367/127 +f 127/284/127 143/270/143 142/266/142 126/280/126 +f 127/367/127 164/371/164 163/369/163 128/358/128 +f 128/292/128 144/274/144 143/270/143 127/284/127 +f 128/358/128 163/369/163 162/366/162 129/356/129 +f 129/319/129 145/296/145 144/295/144 128/315/128 +f 129/356/129 162/366/162 161/370/161 130/359/130 +f 130/314/130 146/294/146 145/296/145 129/319/129 +f 130/359/130 161/370/161 160/372/160 131/368/131 +f 131/282/131 147/269/147 146/273/146 130/288/130 +f 131/368/131 160/372/160 159/376/159 132/374/132 +f 132/278/132 148/265/148 147/269/147 131/282/131 +f 132/374/132 159/376/159 158/385/158 133/386/133 +f 133/331/133 149/332/149 148/328/148 132/321/132 +f 133/386/133 158/385/158 157/388/157 134/390/134 +f 134/346/134 150/343/150 149/332/149 133/331/133 +f 134/390/134 157/388/157 156/392/156 135/396/135 +f 135/238/135 151/253/151 150/257/150 134/242/134 +f 135/396/135 156/392/156 155/394/155 136/399/136 +f 136/233/136 152/249/152 151/253/151 135/238/135 +f 136/399/136 155/394/155 154/397/154 121/400/121 +f 138/250/138 139/254/139 140/258/140 141/262/141 142/266/142 143/270/143 144/274/144 145/276/145 146/273/146 147/269/147 148/265/148 149/261/149 150/257/150 151/253/151 152/249/152 137/246/137 +f 169/382/169 185/363/185 186/362/186 170/378/170 +f 169/285/169 202/300/202 203/303/203 184/289/184 +f 170/286/170 186/271/186 187/267/187 171/281/171 +f 170/290/170 201/304/201 202/300/202 169/285/169 +f 171/281/171 187/267/187 188/263/188 172/277/172 +f 171/302/171 216/308/216 201/304/201 170/290/170 +f 172/347/172 188/341/188 189/334/189 173/333/173 +f 172/310/172 215/313/215 216/308/216 171/302/171 +f 173/333/173 189/334/189 190/329/190 174/322/174 +f 173/327/173 214/326/214 215/313/215 172/310/172 +f 174/241/174 190/255/190 191/251/191 175/237/175 +f 174/340/174 213/338/213 214/326/214 173/327/173 +f 175/237/175 191/251/191 192/247/192 176/234/176 +f 175/352/175 212/345/212 213/338/213 174/340/174 +f 176/297/176 192/317/192 193/316/193 177/293/177 +f 176/355/176 211/350/211 212/345/212 175/352/175 +f 177/293/177 193/316/193 194/318/194 178/298/178 +f 177/357/177 210/353/210 211/350/211 176/355/176 +f 178/235/178 194/248/194 195/252/195 179/239/179 +f 178/354/178 209/349/209 210/353/210 177/357/177 +f 179/239/179 195/252/195 196/256/196 180/243/180 +f 179/351/179 208/344/208 209/349/209 178/354/178 +f 180/320/180 196/311/196 197/306/197 181/305/181 +f 180/339/180 207/337/207 208/344/208 179/351/179 +f 181/305/181 197/306/197 198/299/198 182/291/182 +f 181/324/181 206/325/206 207/337/207 180/339/180 +f 182/279/182 198/264/198 199/268/199 183/283/183 +f 182/309/182 205/312/205 206/325/206 181/324/181 +f 183/283/183 199/268/199 200/272/200 184/287/184 +f 183/301/183 204/307/204 205/312/205 182/309/182 +f 184/377/184 200/361/200 185/363/185 169/382/169 +f 184/289/184 203/303/203 204/307/204 183/301/183 +f 185/275/185 200/272/200 199/268/199 198/264/198 197/260/197 196/256/196 195/252/195 194/248/194 193/245/193 192/247/192 191/251/191 190/255/190 189/259/189 188/263/188 187/267/187 186/271/186 +o body +#48 vertices, 50 faces +v -9.4860443e-2 5.3364443e-2 0.16032129 +v -9.4860443e-2 -5.3364443e-2 0.16032129 +v 9.4860443e-2 -5.3364443e-2 0.16032129 +v 9.4860443e-2 5.3364443e-2 0.16032129 +v -0.22349685 -1.0993075e-2 0.18137335 +v -0.22349685 1.0993075e-2 0.18137335 +v -0.22349685 1.0993075e-2 8.0714592e-2 +v -0.22349685 -1.0993075e-2 8.0714592e-2 +v -9.4860443e-2 5.9085936e-2 9.2109734e-2 +v 9.4860443e-2 5.9085936e-2 9.2109734e-2 +v 9.4860443e-2 5.9085936e-2 -9.7611151e-2 +v -9.4860443e-2 5.9085936e-2 -9.7611151e-2 +v -4.8758267e-2 -6.0344512e-3 -0.27382534 +v -4.8758267e-2 6.0344512e-3 -0.27382534 +v 4.8758267e-2 6.0344512e-3 -0.27382534 +v 4.8758267e-2 -6.0344512e-3 -0.27382534 +v 0.22349685 1.0993075e-2 0.18137335 +v 0.22349685 -1.0993075e-2 0.18137335 +v 0.22349685 -1.0993075e-2 8.0714592e-2 +v 0.22349685 1.0993075e-2 8.0714592e-2 +v 9.4860443e-2 -5.9085936e-2 9.2109734e-2 +v -9.4860443e-2 -5.9085936e-2 9.2109734e-2 +v -9.4860443e-2 -5.9085936e-2 -9.7611151e-2 +v 9.4860443e-2 -5.9085936e-2 -9.7611151e-2 +v -0.12896622 -1.0993075e-2 0.12621551 +v -0.12896622 -2.8690233e-2 9.2109734e-2 +v -0.12896622 1.0993075e-2 0.12621551 +v -0.12896622 2.8690233e-2 9.2109734e-2 +v -0.12896622 2.8690233e-2 -9.7611151e-2 +v -0.12896622 1.0993075e-2 -0.13171693 +v -0.12896622 -1.0993075e-2 -0.13171693 +v -0.12896622 -2.8690233e-2 -9.7611151e-2 +v 0.12896622 1.0993075e-2 0.12621551 +v 0.12896622 2.8690233e-2 9.2109734e-2 +v 0.12896622 -1.0993075e-2 0.12621551 +v 0.12896622 -2.8690233e-2 9.2109734e-2 +v 0.12896622 -2.8690233e-2 -9.7611151e-2 +v 0.12896622 -1.0993075e-2 -0.13171693 +v 0.12896622 1.0993075e-2 -0.13171693 +v 0.12896622 2.8690233e-2 -9.7611151e-2 +v -7.5329057e-2 3.3833057e-2 0.16032129 +v -7.5329057e-2 -3.3833057e-2 0.16032129 +v 7.5329057e-2 -3.3833057e-2 0.16032129 +v 7.5329057e-2 3.3833057e-2 0.16032129 +v -7.5329057e-2 3.3833057e-2 0.15433266 +v -7.5329057e-2 -3.3833057e-2 0.15433266 +v 7.5329057e-2 -3.3833057e-2 0.15433266 +v 7.5329057e-2 3.3833057e-2 0.15433266 +vt 2.4871151e-2 9.7239149e-2 +vt 2.4871151e-2 0.19901442 +vt 0.12071851 0.37797675 +vt 0.12071851 0.18615149 +vt 0.12071851 0.41380223 +vt 0.12071851 0.15300880 +vt 0.15529935 0.37567285 +vt 0.15529935 0.11531309 +vt 0.15529935 0.18384758 +vt 0.20204369 0.55786276 +vt 0.23732473 0.84395303 +vt 0.23732473 0.86624543 +vt 0.26346201 0.65483096 +vt 0.26346201 0.67712336 +vt 0.26350786 0.65488074 +vt 0.26350786 0.67717314 +vt 0.30091854 0.55786276 +vt 0.31804732 0.89004545 +vt 0.31806370 0.82011475 +vt 0.33240213 0.93361723 +vt 0.33249454 0.77656809 +vt 0.34766288 0.11531309 +vt 0.34766288 0.18384758 +vt 0.34766288 0.37567285 +vt 0.34829522 0.84395303 +vt 0.34829522 0.86624543 +vt 0.34833362 0.84378861 +vt 0.34835852 0.86642446 +vt 0.35849189 0.65483096 +vt 0.35849189 0.67712336 +vt 0.35853774 0.65488074 +vt 0.35853774 0.67717314 +vt 0.38224372 0.15300880 +vt 0.38224372 0.41380223 +vt 0.38224372 0.18615149 +vt 0.38224372 0.37797675 +vt 0.39703853 0.90916240 +vt 0.39708815 0.80113570 +vt 0.39719991 0.80099147 +vt 0.39719991 0.90920699 +vt 0.41700335 0.88940355 +vt 0.41700335 0.82079491 +vt 0.41703086 0.91833002 +vt 0.41703086 0.92440207 +vt 0.41708626 0.91823204 +vt 0.41708626 0.92430409 +vt 0.41708940 0.82085428 +vt 0.41708940 0.88946292 +vt 0.47809107 9.7239149e-2 +vt 0.47809107 0.19901442 +vt 0.51509025 9.8000748e-2 +vt 0.51509025 0.19977602 +vt 0.56180480 0.63688730 +vt 0.56180480 0.69506702 +vt 0.56185064 0.63693708 +vt 0.56185064 0.69511680 +vt 0.56976000 0.88940355 +vt 0.56976000 0.82079491 +vt 0.56978751 0.91833002 +vt 0.56978751 0.92440207 +vt 0.56984291 0.91823204 +vt 0.56984291 0.92430409 +vt 0.56984605 0.82085428 +vt 0.56984605 0.88946292 +vt 0.58956344 0.80099147 +vt 0.58956344 0.90920699 +vt 0.58965524 0.80133049 +vt 0.58965524 0.90899657 +vt 0.59400336 0.65483096 +vt 0.59400336 0.67712336 +vt 0.59404921 0.65488074 +vt 0.59404921 0.67717314 +vt 0.61093761 0.18691309 +vt 0.61093761 0.37873835 +vt 0.61093761 0.15377040 +vt 0.61093761 0.41456383 +vt 0.63831163 0.84407392 +vt 0.63831163 0.86625313 +vt 0.63835079 0.84398237 +vt 0.63835079 0.86627477 +vt 0.64551845 0.11607469 +vt 0.64551845 0.18460918 +vt 0.64551845 0.37643445 +vt 0.65386286 0.93440491 +vt 0.65437936 0.77726828 +vt 0.66841122 0.89067548 +vt 0.66934917 0.82085523 +vt 0.67881975 0.87631297 +vt 0.67881975 0.94492161 +vt 0.67903330 0.87642634 +vt 0.67903330 0.94503499 +vt 0.68489180 0.87631297 +vt 0.68489180 0.94492161 +vt 0.68510535 0.87642634 +vt 0.68510535 0.94503499 +vt 0.69219128 0.55862903 +vt 0.69219128 0.57086605 +vt 0.69226279 0.55862436 +vt 0.74932127 0.84398237 +vt 0.74932127 0.86627477 +vt 0.75782743 0.65985866 +vt 0.75782743 0.67209567 +vt 0.75787328 0.65990843 +vt 0.75787328 0.67214545 +vt 0.79106614 0.55862903 +vt 0.79106614 0.57086605 +vt 0.79113764 0.55862436 +vt 0.83788198 0.11607469 +vt 0.83788198 0.18460918 +vt 0.83788198 0.37643445 +vt 0.87246282 0.15377040 +vt 0.87246282 0.41456383 +vt 0.87246282 0.18691309 +vt 0.87246282 0.37873835 +vt 0.96831018 9.8000748e-2 +vt 0.96831018 0.19977602 +vn -0.39883900 0.44618227 0.80115469 +vn -0.39883900 -0.44618227 0.80115469 +vn 0.39883900 -0.44618227 0.80115469 +vn 0.39883900 0.44618227 0.80115469 +vn -0.18308687 -0.80118426 0.56972184 +vn -0.18308687 0.80118426 0.56972184 +vn -0.84847910 0.48185367 -0.21886126 +vn -0.84847910 -0.48185367 -0.21886126 +vn -0.38643169 0.92019501 6.2543534e-2 +vn 0.38643169 0.92019501 6.2543534e-2 +vn 0.34645750 0.92101624 -0.17803449 +vn -0.34645750 0.92101624 -0.17803449 +vn -0.48023682 -0.53517897 -0.69495041 +vn -0.48023682 0.53517897 -0.69495041 +vn 0.48023682 0.53517897 -0.69495041 +vn 0.48023682 -0.53517897 -0.69495041 +vn 0.18308687 0.80118426 0.56972184 +vn 0.18308687 -0.80118426 0.56972184 +vn 0.84847910 -0.48185367 -0.21886126 +vn 0.84847910 0.48185367 -0.21886126 +vn 0.38643169 -0.92019501 6.2543534e-2 +vn -0.38643169 -0.92019501 6.2543534e-2 +vn -0.34645750 -0.92101624 -0.17803449 +vn 0.34645750 -0.92101624 -0.17803449 +vn -0.25679642 -0.55004001 0.79467703 +vn -0.37940402 -0.91007910 0.16675917 +vn -0.25679642 0.55004001 0.79467703 +vn -0.37940402 0.91007910 0.16675917 +vn -0.57314968 0.79921336 -0.18099018 +vn -0.83424379 0.35163310 -0.42472516 +vn -0.83424379 -0.35163310 -0.42472516 +vn -0.57314968 -0.79921336 -0.18099018 +vn 0.25679642 0.55004001 0.79467703 +vn 0.37940402 0.91007910 0.16675917 +vn 0.25679642 -0.55004001 0.79467703 +vn 0.37940402 -0.91007910 0.16675917 +vn 0.57314968 -0.79921336 -0.18099018 +vn 0.83424379 -0.35163310 -0.42472516 +vn 0.83424379 0.35163310 -0.42472516 +vn 0.57314968 0.79921336 -0.18099018 +vn 0.40824829 -0.40824829 0.81649658 +vn 0.40824829 0.40824829 0.81649658 +vn -0.40824829 0.40824829 0.81649658 +vn -0.40824829 -0.40824829 0.81649658 +vn 0.57735027 -0.57735027 0.57735027 +vn 0.57735027 0.57735027 0.57735027 +vn -0.57735027 0.57735027 0.57735027 +vn -0.57735027 -0.57735027 0.57735027 +g body_body_auv +usemtl body_auv +s 1 +f 217/440/217 243/426/243 241/425/241 218/439/218 +f 217/440/217 257/441/257 260/457/260 220/466/220 +f 218/422/218 238/423/238 237/409/237 219/408/219 +f 218/438/218 241/427/241 242/419/242 238/421/238 +f 218/439/218 258/442/258 257/441/257 217/440/217 +f 219/467/219 251/477/251 249/478/249 220/468/220 +f 219/465/219 259/458/259 258/442/258 218/439/218 +f 220/508/220 226/509/226 225/482/225 217/481/217 +f 220/466/220 260/457/260 259/458/259 219/465/219 +f 221/411/221 241/425/241 243/426/243 222/412/222 +f 222/415/222 223/431/223 224/432/224 221/416/221 +f 222/451/222 244/473/244 245/474/245 223/452/223 +f 223/431/223 246/471/246 247/472/247 224/432/224 +f 224/450/224 248/436/248 242/435/242 221/449/221 +f 225/420/225 244/418/244 243/428/243 217/437/217 +f 226/509/226 227/510/227 228/483/228 225/482/225 +f 226/509/226 250/513/250 256/514/256 227/510/227 +f 227/510/227 231/507/231 230/498/230 228/483/228 +f 228/483/228 245/474/245 244/473/244 225/482/225 +f 229/504/229 247/472/247 246/471/246 230/503/230 +f 230/496/230 231/505/231 232/506/232 229/497/229 +f 231/502/231 255/470/255 254/469/254 232/501/232 +f 232/410/232 240/407/240 239/424/239 229/417/229 +f 233/500/233 249/480/249 251/479/251 234/499/234 +f 234/413/234 235/429/235 236/430/236 233/414/233 +f 234/401/234 252/404/252 253/403/253 235/402/235 +f 235/429/235 254/469/254 255/470/255 236/430/236 +f 236/516/236 256/514/256 250/513/250 233/515/233 +f 237/485/237 252/487/252 251/477/251 219/467/219 +f 238/423/238 239/424/239 240/407/240 237/409/237 +f 238/423/238 242/435/242 248/436/248 239/424/239 +f 240/407/240 253/403/253 252/404/252 237/409/237 +f 242/435/242 241/433/241 221/449/221 +f 243/475/243 244/473/244 222/451/222 +f 245/455/245 246/471/246 223/431/223 +f 246/476/246 245/474/245 228/483/228 230/498/230 +f 247/472/247 248/456/248 224/432/224 +f 248/436/248 247/434/247 229/417/229 239/424/239 +f 249/478/249 250/486/250 226/484/226 220/468/220 +f 250/513/250 249/511/249 233/515/233 +f 251/406/251 252/404/252 234/401/234 +f 253/453/253 254/469/254 235/429/235 +f 254/405/254 253/403/253 240/407/240 232/410/232 +f 255/470/255 256/454/256 236/430/236 +f 256/514/256 255/512/255 231/507/231 227/510/227 +f 257/446/257 261/445/261 264/461/264 260/462/260 +f 258/490/258 262/494/262 261/495/261 257/491/257 +f 259/459/259 263/460/263 262/444/262 258/443/258 +f 260/493/260 264/489/264 263/488/263 259/492/259 +f 262/447/262 263/463/263 264/464/264 261/448/261 diff --git a/res/models/ships/fighter/starship1_body.png b/res/models/ships/fighter/starship1_body.png new file mode 100644 index 0000000..0202067 Binary files /dev/null and b/res/models/ships/fighter/starship1_body.png differ diff --git a/res/models/ships/fighter/starship1_engine.png b/res/models/ships/fighter/starship1_engine.png new file mode 100644 index 0000000..dadf95a Binary files /dev/null and b/res/models/ships/fighter/starship1_engine.png differ diff --git a/res/models/ships/fighter/starship1_gun.png b/res/models/ships/fighter/starship1_gun.png new file mode 100644 index 0000000..0936a42 Binary files /dev/null and b/res/models/ships/fighter/starship1_gun.png differ diff --git a/res/models/ships/mine/mine.mtl b/res/models/ships/mine/mine.mtl new file mode 100644 index 0000000..48d1f66 --- /dev/null +++ b/res/models/ships/mine/mine.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl mine +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd mine.png + diff --git a/res/models/ships/mine/mine.obj b/res/models/ships/mine/mine.obj new file mode 100644 index 0000000..94da120 --- /dev/null +++ b/res/models/ships/mine/mine.obj @@ -0,0 +1,1442 @@ +# Exported from Wings 3D 1.4.1 +mtllib mine.mtl +o mine +#334 vertices, 318 faces +v 1.71421356 4.1201610e-18 0.0000000e+0 +v 1.38682790 4.1201610e-18 1.00758945 +v 1.00758945 4.1201610e-18 1.38682790 +v 0.52972112 4.1201610e-18 1.63031398 +v -0.52972112 4.1201610e-18 1.63031398 +v -1.00758945 4.1201610e-18 1.38682790 +v -1.38682790 4.1201610e-18 1.00758945 +v -1.71421356 4.1201610e-18 2.0992368e-16 +v -1.63031398 4.1201610e-18 -0.52972112 +v -1.38682790 4.1201610e-18 -1.00758945 +v -0.52972112 4.1201610e-18 -1.63031398 +v -3.1488552e-16 4.1201610e-18 -1.71421356 +v 0.52972112 4.1201610e-18 -1.63031398 +v 1.38682790 4.1201610e-18 -1.00758945 +v 1.63031398 4.1201610e-18 -0.52972112 +v 1.65691866 0.29412774 0.0000000e+0 +v 1.57582329 0.29412774 0.51201602 +v 1.34047535 0.29412774 0.97391235 +v 0.97391235 0.29412774 1.34047535 +v 0.51201602 0.29412774 1.57582329 +v 1.0145366e-16 0.29412774 1.65691866 +v -0.51201602 0.29412774 1.57582329 +v -0.97391235 0.29412774 1.34047535 +v -1.34047535 0.29412774 0.97391235 +v -1.57582329 0.29412774 0.51201602 +v -1.65691866 0.29412774 2.0290731e-16 +v -1.57582329 0.29412774 -0.51201602 +v -1.34047535 0.29412774 -0.97391235 +v -0.97391235 0.29412774 -1.34047535 +v -0.51201602 0.29412774 -1.57582329 +v -3.0436097e-16 0.29412774 -1.65691866 +v 0.51201602 0.29412774 -1.57582329 +v 0.97391235 0.29412774 -1.34047535 +v 1.34047535 0.29412774 -0.97391235 +v 1.57582329 0.29412774 -0.51201602 +v 1.50691866 0.47590868 0.0000000e+0 +v 1.43316481 0.47590868 0.46566348 +v 1.21912281 0.47590868 0.88574457 +v 0.88574457 0.47590868 1.21912281 +v 0.46566348 0.47590868 1.43316481 +v 9.2269108e-17 0.47590868 1.50691866 +v -0.46566348 0.47590868 1.43316481 +v -0.88574457 0.47590868 1.21912281 +v -1.21912281 0.47590868 0.88574457 +v -1.43316481 0.47590868 0.46566348 +v -1.50691866 0.47590868 1.8453822e-16 +v -1.43316481 0.47590868 -0.46566348 +v -1.21912281 0.47590868 -0.88574457 +v -0.88574457 0.47590868 -1.21912281 +v -0.46566348 0.47590868 -1.43316481 +v -2.7680732e-16 0.47590868 -1.50691866 +v 0.46566348 0.47590868 -1.43316481 +v 0.88574457 0.47590868 -1.21912281 +v 1.21912281 0.47590868 -0.88574457 +v 1.43316481 0.47590868 -0.46566348 +v 1.32150846 0.47590868 0.0000000e+0 +v 1.25682924 0.47590868 0.40836857 +v 1.06912281 0.47590868 0.77676319 +v 0.77676319 0.47590868 1.06912281 +v 0.40836857 0.47590868 1.25682924 +v 8.0916383e-17 0.47590868 1.32150846 +v -0.40836857 0.47590868 1.25682924 +v -0.77676319 0.47590868 1.06912281 +v -1.06912281 0.47590868 0.77676319 +v -1.25682924 0.47590868 0.40836857 +v -1.32150846 0.47590868 1.6183277e-16 +v -1.25682924 0.47590868 -0.40836857 +v -1.06912281 0.47590868 -0.77676319 +v -0.77676319 0.47590868 -1.06912281 +v -0.40836857 0.47590868 -1.25682924 +v -2.4274915e-16 0.47590868 -1.32150846 +v 0.40836857 0.47590868 -1.25682924 +v 0.77676319 0.47590868 -1.06912281 +v 1.06912281 0.47590868 -0.77676319 +v 1.25682924 0.47590868 -0.40836857 +v 1.15717404 0.29412774 -3.4694470e-17 +v 1.10053791 0.29412774 0.35758644 +v 0.93617346 0.29412774 0.68016983 +v 0.68016983 0.29412774 0.93617346 +v 0.35758644 0.29412774 1.10053791 +v 7.6327833e-17 0.29412774 1.15717404 +v -0.35758644 0.29412774 1.10053791 +v -0.68016983 0.29412774 0.93617346 +v -0.93617346 0.29412774 0.68016983 +v -1.10053791 0.29412774 0.35758644 +v -1.15717404 0.29412774 1.4571677e-16 +v -1.10053791 0.29412774 -0.35758644 +v -0.93617346 0.29412774 -0.68016983 +v -0.68016983 0.29412774 -0.93617346 +v -0.35758644 0.29412774 -1.10053791 +v -2.0816682e-16 0.29412774 -1.15717404 +v 0.35758644 0.29412774 -1.10053791 +v 0.68016983 0.29412774 -0.93617346 +v 0.93617346 0.29412774 -0.68016983 +v 1.10053791 0.29412774 -0.35758644 +v 1.15717404 -0.29412774 -3.4694470e-17 +v 1.10053791 -0.29412774 0.35758644 +v 0.93617346 -0.29412774 0.68016983 +v 0.68016983 -0.29412774 0.93617346 +v 0.35758644 -0.29412774 1.10053791 +v 6.9388939e-17 -0.29412774 1.15717404 +v -0.35758644 -0.29412774 1.10053791 +v -0.68016983 -0.29412774 0.93617346 +v -0.93617346 -0.29412774 0.68016983 +v -1.10053791 -0.29412774 0.35758644 +v -1.15717404 -0.29412774 1.4571677e-16 +v -1.10053791 -0.29412774 -0.35758644 +v -0.93617346 -0.29412774 -0.68016983 +v -0.68016983 -0.29412774 -0.93617346 +v -0.35758644 -0.29412774 -1.10053791 +v -2.0816682e-16 -0.29412774 -1.15717404 +v 0.35758644 -0.29412774 -1.10053791 +v 0.68016983 -0.29412774 -0.93617346 +v 0.93617346 -0.29412774 -0.68016983 +v 1.10053791 -0.29412774 -0.35758644 +v 1.32150846 -0.47590868 0.0000000e+0 +v 1.25682924 -0.47590868 0.40836857 +v 1.06912281 -0.47590868 0.77676319 +v 0.77676319 -0.47590868 1.06912281 +v 0.40836857 -0.47590868 1.25682924 +v 8.0916383e-17 -0.47590868 1.32150846 +v -0.40836857 -0.47590868 1.25682924 +v -0.77676319 -0.47590868 1.06912281 +v -1.06912281 -0.47590868 0.77676319 +v -1.25682924 -0.47590868 0.40836857 +v -1.32150846 -0.47590868 1.6183277e-16 +v -1.25682924 -0.47590868 -0.40836857 +v -1.06912281 -0.47590868 -0.77676319 +v -0.77676319 -0.47590868 -1.06912281 +v -0.40836857 -0.47590868 -1.25682924 +v -2.4274915e-16 -0.47590868 -1.32150846 +v 0.40836857 -0.47590868 -1.25682924 +v 0.77676319 -0.47590868 -1.06912281 +v 1.06912281 -0.47590868 -0.77676319 +v 1.25682924 -0.47590868 -0.40836857 +v 1.50691866 -0.47590868 0.0000000e+0 +v 1.43316481 -0.47590868 0.46566348 +v 1.21912281 -0.47590868 0.88574457 +v 0.88574457 -0.47590868 1.21912281 +v 0.46566348 -0.47590868 1.43316481 +v 9.2269108e-17 -0.47590868 1.50691866 +v -0.46566348 -0.47590868 1.43316481 +v -0.88574457 -0.47590868 1.21912281 +v -1.21912281 -0.47590868 0.88574457 +v -1.43316481 -0.47590868 0.46566348 +v -1.50691866 -0.47590868 1.8453822e-16 +v -1.43316481 -0.47590868 -0.46566348 +v -1.21912281 -0.47590868 -0.88574457 +v -0.88574457 -0.47590868 -1.21912281 +v -0.46566348 -0.47590868 -1.43316481 +v -2.7680732e-16 -0.47590868 -1.50691866 +v 0.46566348 -0.47590868 -1.43316481 +v 0.88574457 -0.47590868 -1.21912281 +v 1.21912281 -0.47590868 -0.88574457 +v 1.43316481 -0.47590868 -0.46566348 +v 1.65691866 -0.29412774 0.0000000e+0 +v 1.57582329 -0.29412774 0.51201602 +v 1.34047535 -0.29412774 0.97391235 +v 0.97391235 -0.29412774 1.34047535 +v 0.51201602 -0.29412774 1.57582329 +v 1.0145366e-16 -0.29412774 1.65691866 +v -0.51201602 -0.29412774 1.57582329 +v -0.97391235 -0.29412774 1.34047535 +v -1.34047535 -0.29412774 0.97391235 +v -1.57582329 -0.29412774 0.51201602 +v -1.65691866 -0.29412774 2.0290731e-16 +v -1.57582329 -0.29412774 -0.51201602 +v -1.34047535 -0.29412774 -0.97391235 +v -0.97391235 -0.29412774 -1.34047535 +v -0.51201602 -0.29412774 -1.57582329 +v -3.0436097e-16 -0.29412774 -1.65691866 +v 0.51201602 -0.29412774 -1.57582329 +v 0.97391235 -0.29412774 -1.34047535 +v 1.34047535 -0.29412774 -0.97391235 +v 1.57582329 -0.29412774 -0.51201602 +v 2.39155571 -0.13706353 0.52618523 +v 2.41825513 -9.1961130e-18 0.52618523 +v 2.39155571 0.13706353 0.52618523 +v 2.35376526 0.13706353 0.76478469 +v 2.24409312 0.13706353 0.98002838 +v 2.26569341 -9.1961130e-18 0.99572191 +v 2.24409312 -0.13706353 0.98002838 +v 2.35376526 -0.13706353 0.76478469 +v 0.23859947 -0.13706353 2.43710481 +v 0.24685004 -9.1961130e-18 2.46249748 +v 0.23859947 0.13706353 2.43710481 +v 9.1741836e-17 0.13706353 2.47489526 +v -0.23859947 0.13706353 2.43710481 +v -0.24685004 -9.1961130e-18 2.46249748 +v -0.23859947 -0.13706353 2.43710481 +v 9.1741836e-17 -0.13706353 2.47489526 +v -2.24409312 -0.13706353 0.98002838 +v -2.26569341 -1.6560530e-16 0.99572191 +v -2.24409312 0.13706353 0.98002838 +v -2.35376526 0.13706353 0.76478469 +v -2.39155571 0.13706353 0.52618523 +v -2.41825513 -1.6560530e-16 0.52618523 +v -2.39155571 -0.13706353 0.52618523 +v -2.35376526 -0.13706353 0.76478469 +v -1.62552529 -0.13706353 -1.83141396 +v -1.64712558 -7.8137283e-17 -1.84710749 +v -1.62552529 0.13706353 -1.83141396 +v -1.45470693 0.13706353 -2.00223232 +v -1.23946324 0.13706353 -2.11190446 +v -1.24771382 -7.8137283e-17 -2.13729712 +v -1.23946324 -0.13706353 -2.11190446 +v -1.45470693 -0.13706353 -2.00223232 +v 1.23946324 -0.13706353 -2.11190446 +v 1.24771382 3.4537896e-17 -2.13729712 +v 1.23946324 0.13706353 -2.11190446 +v 1.45470693 0.13706353 -2.00223232 +v 1.62552529 0.13706353 -1.83141396 +v 1.64712558 3.4537896e-17 -1.84710749 +v 1.62552529 -0.13706353 -1.83141396 +v 1.45470693 -0.13706353 -2.00223232 +v 0.88107107 -0.54394023 -0.32300223 +v 0.88107107 -0.54394023 0.32300223 +v 0.75760853 -0.54394023 0.56531111 +v 0.56531111 -0.54394023 0.75760853 +v 0.32300223 -0.54394023 0.88107107 +v -0.32300223 -0.54394023 0.88107107 +v -0.56531111 -0.54394023 0.75760853 +v -0.75760853 -0.54394023 0.56531111 +v -0.88107107 -0.54394023 0.32300223 +v -0.88107107 -0.54394023 -0.32300223 +v -0.75760853 -0.54394023 -0.56531111 +v -0.56531111 -0.54394023 -0.75760853 +v -0.32300223 -0.54394023 -0.88107107 +v 0.32300223 -0.54394023 -0.88107107 +v 0.56531111 -0.54394023 -0.75760853 +v 0.75760853 -0.54394023 -0.56531111 +v 0.88107107 0.54394023 0.32300223 +v 0.88107107 0.54394023 -0.32300223 +v 0.75760853 0.54394023 -0.56531111 +v 0.56531111 0.54394023 -0.75760853 +v 0.32300223 0.54394023 -0.88107107 +v -0.32300223 0.54394023 -0.88107107 +v -0.56531111 0.54394023 -0.75760853 +v -0.75760853 0.54394023 -0.56531111 +v -0.88107107 0.54394023 -0.32300223 +v -0.88107107 0.54394023 0.32300223 +v -0.75760853 0.54394023 0.56531111 +v -0.56531111 0.54394023 0.75760853 +v -0.32300223 0.54394023 0.88107107 +v 0.32300223 0.54394023 0.88107107 +v 0.56531111 0.54394023 0.75760853 +v 0.75760853 0.54394023 0.56531111 +v 0.83667650 -0.57516680 -0.23553175 +v 0.99048412 -0.45472149 -0.32182780 +v 0.83667650 -0.57516680 0.23553175 +v 1.04145663 -0.45472149 -2.7755576e-17 +v 0.76675831 -0.57516680 0.45071781 +v 0.99048412 -0.45472149 0.32182780 +v 0.63376601 -0.57516680 0.63376601 +v 0.84255612 -0.45472149 0.61215285 +v 0.45071781 -0.57516680 0.76675831 +v 0.61215285 -0.45472149 0.84255612 +v 0.23553175 -0.57516680 0.83667650 +v 0.32182780 -0.45472149 0.99048412 +v -0.23553175 -0.57516680 0.83667650 +v 6.9388939e-17 -0.45472149 1.04145663 +v -0.45071781 -0.57516680 0.76675831 +v -0.32182780 -0.45472149 0.99048412 +v -0.63376601 -0.57516680 0.63376601 +v -0.61215285 -0.45472149 0.84255612 +v -0.76675831 -0.57516680 0.45071781 +v -0.84255612 -0.45472149 0.61215285 +v -0.83667650 -0.57516680 0.23553175 +v -0.99048412 -0.45472149 0.32182780 +v -0.83667650 -0.57516680 -0.23553175 +v -0.76675831 -0.57516680 -0.45071781 +v -0.99048412 -0.45472149 -0.32182780 +v -0.63376601 -0.57516680 -0.63376601 +v -0.84255612 -0.45472149 -0.61215285 +v -0.45071781 -0.57516680 -0.76675831 +v -0.61215285 -0.45472149 -0.84255612 +v -0.23553175 -0.57516680 -0.83667650 +v -0.32182780 -0.45472149 -0.99048412 +v 0.23553175 -0.57516680 -0.83667650 +v -2.0816682e-16 -0.45472149 -1.04145663 +v 0.45071781 -0.57516680 -0.76675831 +v 0.32182780 -0.45472149 -0.99048412 +v 0.63376601 -0.57516680 -0.63376601 +v 0.61215285 -0.45472149 -0.84255612 +v 0.76675831 -0.57516680 -0.45071781 +v 0.84255612 -0.45472149 -0.61215285 +v 0.48960696 -0.61531523 -0.48960696 +v -0.48960696 -0.61531523 0.48960696 +v 0.48960696 -0.61531523 0.48960696 +v -0.48960696 -0.61531523 -0.48960696 +v 0.83667650 0.57516680 0.23553175 +v 0.99048412 0.45472149 0.32182780 +v 0.83667650 0.57516680 -0.23553175 +v 1.04145663 0.45472149 -3.4694470e-17 +v 0.76675831 0.57516680 -0.45071781 +v 0.99048412 0.45472149 -0.32182780 +v 0.63376601 0.57516680 -0.63376601 +v 0.84255612 0.45472149 -0.61215285 +v 0.45071781 0.57516680 -0.76675831 +v 0.61215285 0.45472149 -0.84255612 +v 0.23553175 0.57516680 -0.83667650 +v 0.32182780 0.45472149 -0.99048412 +v -0.23553175 0.57516680 -0.83667650 +v -2.0122792e-16 0.45472149 -1.04145663 +v -0.45071781 0.57516680 -0.76675831 +v -0.32182780 0.45472149 -0.99048412 +v -0.63376601 0.57516680 -0.63376601 +v -0.61215285 0.45472149 -0.84255612 +v -0.76675831 0.57516680 -0.45071781 +v -0.84255612 0.45472149 -0.61215285 +v -0.83667650 0.57516680 -0.23553175 +v -0.99048412 0.45472149 -0.32182780 +v -0.83667650 0.57516680 0.23553175 +v -1.04145663 0.45472149 1.3877788e-16 +v -0.76675831 0.57516680 0.45071781 +v -0.99048412 0.45472149 0.32182780 +v -0.63376601 0.57516680 0.63376601 +v -0.84255612 0.45472149 0.61215285 +v -0.45071781 0.57516680 0.76675831 +v -0.61215285 0.45472149 0.84255612 +v -0.23553175 0.57516680 0.83667650 +v -0.32182780 0.45472149 0.99048412 +v 0.23553175 0.57516680 0.83667650 +v 8.3266727e-17 0.45472149 1.04145663 +v 0.45071781 0.57516680 0.76675831 +v 0.32182780 0.45472149 0.99048412 +v 0.63376601 0.57516680 0.63376601 +v 0.61215285 0.45472149 0.84255612 +v 0.76675831 0.57516680 0.45071781 +v 0.84255612 0.45472149 0.61215285 +v 0.48960696 0.61531523 0.48960696 +v -0.48960696 0.61531523 -0.48960696 +v 0.48960696 0.61531523 -0.48960696 +v -0.48960696 0.61531523 0.48960696 +vt 1.3402991e-2 0.40280523 +vt 1.5337863e-2 0.40474218 +vt 1.8660066e-2 0.43763773 +vt 2.0817178e-2 0.43953875 +vt 3.4236653e-2 0.46923003 +vt 3.6590060e-2 0.47098513 +vt 7.4799002e-2 0.88674330 +vt 7.4871005e-2 0.88819381 +vt 7.4871005e-2 0.88762464 +vt 7.4871362e-2 0.88679027 +vt 7.4899506e-2 0.92532912 +vt 7.4942204e-2 0.92502715 +vt 7.4999875e-2 0.88731656 +vt 7.5037006e-2 0.84908613 +vt 7.5037006e-2 0.84965531 +vt 7.5246191e-2 0.92547348 +vt 7.5531630e-2 0.84844897 +vt 7.5620110e-2 0.92652524 +vt 7.5620110e-2 0.92595606 +vt 7.5639747e-2 0.84925364 +vt 7.5757577e-2 0.84846177 +vt 0.12313852 5.8661794e-2 +vt 0.12327086 0.32653445 +vt 0.12328769 5.7852252e-2 +vt 0.12470189 0.32788862 +vt 0.13456982 0.40127278 +vt 0.13491913 0.25181020 +vt 0.13588464 0.25300933 +vt 0.13645676 0.40255277 +vt 0.14116864 0.92681747 +vt 0.14136293 0.92670792 +vt 0.14149137 0.84839056 +vt 0.14151012 0.92681714 +vt 0.14165252 0.84783639 +vt 0.14165252 0.84840557 +vt 0.14180691 0.84780880 +vt 0.14186696 0.92673137 +vt 0.14186696 0.92730055 +vt 0.14200678 0.84792343 +vt 0.14556012 0.88753207 +vt 0.14571786 0.88732559 +vt 0.14591508 0.88734787 +vt 0.14591626 0.88732117 +vt 0.14591626 0.88789034 +vt 0.14769432 3.3084871e-2 +vt 0.14784178 3.2507091e-2 +vt 0.15674190 0.32661469 +vt 0.15820179 0.32773383 +vt 0.16652515 0.39125054 +vt 0.16683485 0.26191572 +vt 0.16791577 0.26296969 +vt 0.16795516 0.46909123 +vt 0.16831319 0.39237050 +vt 0.16849630 0.18396084 +vt 0.16916986 0.18487051 +vt 0.17019361 0.47009258 +vt 0.17877285 1.6213259e-2 +vt 0.17893871 1.5821326e-2 +vt 0.18252821 0.32666788 +vt 0.18400466 0.32769010 +vt 0.19110893 0.38357133 +vt 0.19140981 0.26968179 +vt 0.19258746 0.27064484 +vt 0.19284524 0.38461497 +vt 0.19530419 0.44989655 +vt 0.19584224 0.20322819 +vt 0.19669887 0.20402098 +vt 0.19736854 0.45077236 +vt 0.21565311 0.32673809 +vt 0.21633814 0.43516564 +vt 0.21686119 0.21802518 +vt 0.21710616 0.32760122 +vt 0.21780931 0.21876760 +vt 0.21829805 0.43598936 +vt 0.22037869 0.52358303 +vt 0.22116491 0.12961291 +vt 0.22162349 0.13010499 +vt 0.22265917 0.37377437 +vt 0.22272759 0.52415604 +vt 0.22297790 0.27961746 +vt 0.22426819 0.28043221 +vt 0.22431435 0.37464347 +vt 0.24055455 0.49685988 +vt 0.24125650 0.15631238 +vt 0.24190841 0.15674547 +vt 0.24274739 0.49745269 +vt 0.24330700 0.41635917 +vt 0.24383004 0.23691361 +vt 0.24491209 0.23761816 +vt 0.24513516 0.41704731 +vt 0.25602091 0.47638082 +vt 0.25666668 0.17678966 +vt 0.25743607 0.17721457 +vt 0.25810290 0.47698747 +vt 0.25861888 0.90546045 +vt 0.25862291 0.86973145 +vt 0.25983258 0.90583130 +vt 0.25983827 0.90518819 +vt 0.25983827 0.90575737 +vt 0.25989915 0.86924536 +vt 0.25989915 0.86981453 +vt 0.25990027 0.86988847 +vt 0.25996457 0.90602306 +vt 0.26012097 0.86992999 +vt 0.26059403 0.88759245 +vt 0.26185180 0.88786432 +vt 0.26185408 0.88721944 +vt 0.26185408 0.88778861 +vt 0.26204384 0.88797775 +vt 0.27575881 0.45026891 +vt 0.27640700 0.20286056 +vt 0.27743379 0.20327322 +vt 0.27768882 0.45085035 +vt 0.28744121 0.55945930 +vt 0.28789335 9.3855039e-2 +vt 0.28845240 9.3967255e-2 +vt 0.28967523 0.55964668 +vt 0.29175752 0.86899020 +vt 0.29179587 0.90610827 +vt 0.29299021 0.90640794 +vt 0.29302142 0.90583335 +vt 0.29302142 0.90640253 +vt 0.29305863 0.86878732 +vt 0.29305863 0.86935650 +vt 0.29308552 0.86936202 +vt 0.29343342 0.86935260 +vt 0.29347359 0.90662001 +vt 0.29832431 0.52752956 +vt 0.29869286 0.12557810 +vt 0.29941332 0.12573339 +vt 0.30042492 0.52776103 +vt 0.30660067 0.50317731 +vt 0.30693481 0.14985791 +vt 0.30777535 0.15001008 +vt 0.30859791 0.50343698 +vt 0.31706029 0.47219348 +vt 0.31744457 0.18068018 +vt 0.31846470 0.18083165 +vt 0.31891571 0.47254878 +vt 0.32295936 0.88750602 +vt 0.32409901 0.88787956 +vt 0.32410095 0.88742686 +vt 0.32410095 0.88799604 +vt 0.32472815 0.88793252 +vt 0.32493048 0.90536703 +vt 0.32493451 0.86963802 +vt 0.32599234 0.90512529 +vt 0.32599234 0.90569447 +vt 0.32605369 0.87018801 +vt 0.32606835 0.90557556 +vt 0.32613359 0.86973802 +vt 0.32613359 0.87030720 +vt 0.32667368 0.87018434 +vt 0.32672889 0.90566279 +vt 0.32766529 0.69005013 +vt 0.32994424 0.68956496 +vt 0.36310527 8.0965951e-2 +vt 0.36311116 0.11469559 +vt 0.36311565 0.14040473 +vt 0.36312132 0.17293912 +vt 0.36317487 0.47972232 +vt 0.36318057 0.51239233 +vt 0.36318505 0.53806767 +vt 0.36319092 0.57171565 +vt 0.36321257 0.69573117 +vt 0.36389447 8.0733698e-2 +vt 0.36397833 0.11465181 +vt 0.36404207 0.14043212 +vt 0.36412243 0.17293345 +vt 0.36488151 0.47995123 +vt 0.36496200 0.51250722 +vt 0.36502533 0.53812089 +vt 0.36510828 0.57167232 +vt 0.36541342 0.69508998 +vt 0.39875787 0.69003772 +vt 0.40085484 0.68938964 +vt 0.40880078 0.18066424 +vt 0.40928682 0.47217739 +vt 0.40981866 0.18060578 +vt 0.41081014 0.47232158 +vt 0.41929978 0.14983830 +vt 0.41975725 0.50315756 +vt 0.42035547 0.14973174 +vt 0.42128055 0.50315838 +vt 0.42753326 0.12555561 +vt 0.42804211 0.52750692 +vt 0.42859736 0.12541400 +vt 0.42957372 0.52744172 +vt 0.43799327 0.88756640 +vt 0.43819017 0.88791287 +vt 0.43819151 0.88780167 +vt 0.43819151 0.88837085 +vt 0.43832169 9.3828784e-2 +vt 0.43893635 0.55943286 +vt 0.43897805 0.88797963 +vt 0.43940106 9.3594047e-2 +vt 0.44048094 0.55927383 +vt 0.44206202 0.92670792 +vt 0.44219046 0.84839056 +vt 0.44219386 0.92730055 +vt 0.44219386 0.92673137 +vt 0.44222871 0.92681714 +vt 0.44233176 0.84899773 +vt 0.44236918 0.84891209 +vt 0.44236918 0.84948127 +vt 0.44301872 0.92681747 +vt 0.44322870 0.84913511 +vt 0.44984609 0.20283029 +vt 0.45058064 0.45023840 +vt 0.45096003 0.20284419 +vt 0.45192923 0.45041955 +vt 0.46957731 0.17675250 +vt 0.47032765 0.47634342 +vt 0.47082866 0.17668697 +vt 0.47164415 0.47645950 +vt 0.48243493 0.23687197 +vt 0.48302062 0.41631733 +vt 0.48365117 0.23702790 +vt 0.48431534 0.41645595 +vt 0.48498033 0.15626985 +vt 0.48580116 0.49681707 +vt 0.48625491 0.15614134 +vt 0.48710067 0.49684855 +vt 0.50330197 0.27956853 +vt 0.50365358 0.37372533 +vt 0.50450652 0.27973935 +vt 0.50492622 0.37394968 +vt 0.50506260 0.12956336 +vt 0.50598635 0.52353318 +vt 0.50640785 0.12940088 +vt 0.50725226 0.52345257 +vt 0.50780413 0.92588672 +vt 0.50788237 0.92632224 +vt 0.50788237 0.92575306 +vt 0.50791364 0.92584483 +vt 0.50794085 0.85007707 +vt 0.50794085 0.85064625 +vt 0.50801635 0.85021101 +vt 0.50818660 0.92582381 +vt 0.50830274 0.85057921 +vt 0.50830720 0.84962499 +vt 0.50834799 0.88802515 +vt 0.50834928 0.88850952 +vt 0.50834928 0.88794035 +vt 0.50855351 0.88778192 +vt 0.50867117 0.88817207 +vt 0.50939719 0.21797413 +vt 0.50999604 0.43511439 +vt 0.51064322 0.32668661 +vt 0.51066040 0.21804355 +vt 0.51124578 0.43526507 +vt 0.51190170 0.32687236 +vt 0.53041097 0.20316979 +vt 0.53103512 0.44983795 +vt 0.53169766 0.20319273 +vt 0.53224814 0.44994439 +vt 0.53486660 0.26962185 +vt 0.53520723 0.38351127 +vt 0.53613846 0.26979544 +vt 0.53644425 0.38376545 +vt 0.54376809 0.32660484 +vt 0.54500324 0.32679756 +vt 0.54724909 1.5757043e-2 +vt 0.54869480 1.5298658e-2 +vt 0.55775018 0.18389291 +vt 0.55839086 0.46902309 +vt 0.55913165 0.18390637 +vt 0.55943884 0.26184720 +vt 0.55951827 0.46913001 +vt 0.55979369 0.39118190 +vt 0.56077190 0.26199839 +vt 0.56101435 0.39139958 +vt 0.56955438 0.32654264 +vt 0.57080601 0.32671370 +vt 0.57835183 3.2431953e-2 +vt 0.57911447 0.74189736 +vt 0.57937295 0.73976445 +vt 0.57985637 3.2016387e-2 +vt 0.58473349 0.68964711 +vt 0.58631800 0.68804879 +vt 0.58792332 0.79160673 +vt 0.58921618 0.79330376 +vt 0.59135103 0.25173053 +vt 0.59175252 0.40119298 +vt 0.59275339 0.25187976 +vt 0.59292074 0.40142420 +vt 0.60291477 5.7768541e-2 +vt 0.60302539 0.32645071 +vt 0.60430626 0.32670284 +vt 0.60453834 5.7471573e-2 +vt 0.60638005 0.64094608 +vt 0.60676482 0.74075313 +vt 0.60699934 0.73928962 +vt 0.60863130 0.64072264 +vt 0.61156647 0.69700640 +vt 0.61233241 0.83951227 +vt 0.61267959 0.69584968 +vt 0.61440248 0.78268141 +vt 0.61462649 0.83933445 +vt 0.61513290 0.78384005 +vt 0.62972583 0.65655296 +vt 0.63044832 0.69743987 +vt 0.63126583 0.65620038 +vt 0.63133590 0.69658717 +vt 0.63327330 0.78111524 +vt 0.63372210 0.78193821 +vt 0.63511721 0.82224103 +vt 0.63634469 0.82232236 +vt 0.63738527 0.70887553 +vt 0.63803399 0.70804642 +vt 0.63965841 0.76929557 +vt 0.63980854 0.77009002 +vt 0.64312846 0.60218284 +vt 0.64462210 0.60278018 +vt 0.64525315 0.66507238 +vt 0.64543874 0.68048545 +vt 0.64640944 0.67990154 +vt 0.64643880 0.66468331 +vt 0.64964773 0.79704690 +vt 0.65013288 0.79747087 +vt 0.65029585 0.81263878 +vt 0.65101551 0.81282177 +vt 0.65246938 0.87643240 +vt 0.65317598 0.87507063 +vt 0.66008400 0.62425410 +vt 0.66131356 0.62451268 +vt 0.66187274 0.65625420 +vt 0.66293625 0.65606563 +vt 0.66780972 0.82030483 +vt 0.66811622 0.85284554 +vt 0.66818113 0.82027349 +vt 0.66849136 0.85215270 +vt 0.66955646 0.63910693 +vt 0.67061219 0.63914467 +vt 0.67667229 0.83719623 +vt 0.67688552 0.83685128 +vt 0.68145880 0.67452139 +vt 0.68221104 0.67421291 +vt 0.68488473 0.63822123 +vt 0.68579005 0.63825424 +vt 0.68620352 0.80087680 +vt 0.68622863 0.80068315 +vt 0.68974788 0.57731455 +vt 0.69049070 0.57798685 +vt 0.69210940 0.46911521 +vt 0.69222323 0.83658912 +vt 0.69231041 0.83685714 +vt 0.69312460 0.46936190 +vt 0.69894283 0.60339907 +vt 0.69973423 0.60374721 +vt 0.70071937 0.62211690 +vt 0.70089180 0.89694006 +vt 0.70153747 0.62225951 +vt 0.70153921 0.89823458 +vt 0.70767496 0.43751748 +vt 0.70839758 0.87043839 +vt 0.70874180 0.43783791 +vt 0.70891496 0.87118858 +vt 0.70892745 0.85179339 +vt 0.70931703 0.85221296 +vt 0.71258206 0.62818815 +vt 0.71291988 0.40268315 +vt 0.71329637 0.62822137 +vt 0.71404898 0.40301467 +vt 0.72029224 0.84485812 +vt 0.72075952 0.84506865 +vt 0.74121548 0.56786345 +vt 0.74147696 0.56818020 +vt 0.74208650 0.59542524 +vt 0.74253078 0.59555237 +vt 0.75193833 0.87557455 +vt 0.75280935 0.90313633 +vt 0.75299446 0.87592544 +vt 0.75428083 0.90380332 +vt 0.77373259 0.62614166 +vt 0.77413029 0.62593778 +vt 0.78144278 0.84281163 +vt 0.78232128 0.84258834 +vt 0.78509738 0.61920640 +vt 0.78539467 0.61897577 +vt 0.78562726 0.60056140 +vt 0.78582005 0.60038974 +vt 0.79309760 0.57396171 +vt 0.79313303 0.57405972 +vt 0.79330546 0.84888289 +vt 0.79434964 0.84854592 +vt 0.79508200 0.86760072 +vt 0.79641618 0.86731963 +vt 0.80180160 0.63441067 +vt 0.80208695 0.63403707 +vt 0.80427695 0.89368523 +vt 0.80611023 0.89341894 +vt 0.80782131 0.67012298 +vt 0.80815783 0.66962980 +vt 0.80914010 0.83277856 +vt 0.81004160 0.83221618 +vt 0.81256603 0.79647840 +vt 0.81306996 0.79588163 +vt 0.81713931 0.63414850 +vt 0.81741161 0.63369016 +vt 0.82446837 0.83189285 +vt 0.82539155 0.83110295 +vt 0.82553347 0.61884708 +vt 0.82570184 0.61836678 +vt 0.82584370 0.65072629 +vt 0.82617057 0.65020871 +vt 0.83215209 0.81474558 +vt 0.83280886 0.81389209 +vt 0.83394083 0.84674568 +vt 0.83509201 0.84573968 +vt 0.84084885 0.59592915 +vt 0.84087578 0.59538937 +vt 0.84300932 0.65817802 +vt 0.84333305 0.65761526 +vt 0.84389195 0.67352891 +vt 0.84414777 0.67293574 +vt 0.84858609 0.79051433 +vt 0.84877168 0.80592740 +vt 0.84894036 0.78962009 +vt 0.84926825 0.80490094 +vt 0.85089637 0.86881694 +vt 0.85244291 0.86743784 +vt 0.85421629 0.70090977 +vt 0.85427011 0.70014494 +vt 0.85663956 0.76212425 +vt 0.85668947 0.76142404 +vt 0.85768014 0.64867743 +vt 0.85799556 0.64809964 +vt 0.86030274 0.68906157 +vt 0.86049977 0.68846213 +vt 0.86357651 0.77355992 +vt 0.86371191 0.77261743 +vt 0.86429900 0.81444683 +vt 0.86476125 0.81305059 +vt 0.87889193 0.68715974 +vt 0.87919459 0.68679543 +vt 0.87939834 0.63166533 +vt 0.87976477 0.63101046 +vt 0.88245836 0.77399339 +vt 0.88254569 0.77269249 +vt 0.88726002 0.73024665 +vt 0.88764478 0.83005370 +vt 0.88802797 0.82802776 +vt 0.90480865 0.67769602 +vt 0.90491763 0.67770987 +vt 0.90890135 0.77957146 +vt 0.90929134 0.78135267 +vt 0.91326561 0.72845965 +vt 0.91491036 0.72910242 +vn 0.85494701 2.6542682e-17 -0.51871535 +vn 0.38677342 1.1375435e-17 0.92217478 +vn 0.58778525 3.5771178e-17 0.80901699 +vn 0.75752077 4.1709930e-17 0.65281106 +vn -0.75752077 2.2750871e-17 0.65281106 +vn -0.58778525 2.1462707e-17 0.80901699 +vn -0.38677342 1.5167247e-17 0.92217478 +vn -0.85494701 2.2750871e-17 -0.51871535 +vn -0.95105652 3.5771178e-17 -0.30901699 +vn -0.99655989 3.4126306e-17 -8.2875708e-2 +vn 0.22913446 7.5836236e-18 -0.97339478 +vn -1.1446777e-16 1.4308471e-17 -1.00000000 +vn -0.22913446 3.0334494e-17 -0.97339478 +vn 0.99655989 1.1375435e-17 -8.2875708e-2 +vn 0.95105652 1.4308471e-17 -0.30901699 +vn 0.77124774 0.59880222 -0.21590003 +vn 0.48410853 0.86075361 0.15729640 +vn 0.49704968 0.59880222 0.62799484 +vn 0.53136841 0.42749455 0.73136587 +vn 0.44366179 0.59880222 0.66678341 +vn 1.0643115e-16 0.86075361 0.50902183 +vn -0.44366179 0.59880222 0.66678341 +vn -0.53136841 0.42749455 0.73136587 +vn -0.49704968 0.59880222 0.62799484 +vn -0.48410853 0.86075361 0.15729640 +vn -0.77124774 0.59880222 -0.21590003 +vn -0.85977214 0.42749455 -0.27935690 +vn -0.75085538 0.59880222 -0.27866126 +vn -0.29919553 0.86075361 -0.41180731 +vn -3.2995529e-2 0.59880222 -0.80021697 +vn -1.4096227e-16 0.42749455 -0.90401793 +vn 3.2995529e-2 0.59880222 -0.80021697 +vn 0.29919553 0.86075361 -0.41180731 +vn 0.75085538 0.59880222 -0.27866126 +vn 0.85977214 0.42749455 -0.27935690 +vn 0.42476506 0.90530362 2.6947920e-17 +vn 0.40397558 0.90530362 0.13125962 +vn 0.34364215 0.90530362 0.24967064 +vn 0.24967064 0.90530362 0.34364215 +vn 0.13125962 0.90530362 0.40397558 +vn 1.0009228e-16 0.90530362 0.42476506 +vn -0.13125962 0.90530362 0.40397558 +vn -0.24967064 0.90530362 0.34364215 +vn -0.34364215 0.90530362 0.24967064 +vn -0.40397558 0.90530362 0.13125962 +vn -0.42476506 0.90530362 1.0394198e-16 +vn -0.40397558 0.90530362 -0.13125962 +vn -0.34364215 0.90530362 -0.24967064 +vn -0.24967064 0.90530362 -0.34364215 +vn -0.13125962 0.90530362 -0.40397558 +vn -9.6242572e-17 0.90530362 -0.42476506 +vn 0.13125962 0.90530362 -0.40397558 +vn 0.24967064 0.90530362 -0.34364215 +vn 0.34364215 0.90530362 -0.24967064 +vn 0.40397558 0.90530362 -0.13125962 +vn -0.40443339 0.91456746 -1.9045521e-17 +vn -0.38463901 0.91456746 -0.12497679 +vn -0.32719349 0.91456746 -0.23771998 +vn -0.23771998 0.91456746 -0.32719349 +vn -0.12497679 0.91456746 -0.38463901 +vn 3.8091041e-18 0.91456746 -0.40443339 +vn 0.12497679 0.91456746 -0.38463901 +vn 0.23771998 0.91456746 -0.32719349 +vn 0.32719349 0.91456746 -0.23771998 +vn 0.38463901 0.91456746 -0.12497679 +vn 0.40443339 0.91456746 -1.1427312e-17 +vn 0.38463901 0.91456746 0.12497679 +vn 0.32719349 0.91456746 0.23771998 +vn 0.23771998 0.91456746 0.32719349 +vn 0.12497679 0.91456746 0.38463901 +vn 3.8091041e-18 0.91456746 0.40443339 +vn -0.12497679 0.91456746 0.38463901 +vn -0.23771998 0.91456746 0.32719349 +vn -0.32719349 0.91456746 0.23771998 +vn -0.38463901 0.91456746 0.12497679 +vn 5.4469034e-2 0.99851546 -1.6683780e-17 +vn 5.1803129e-2 0.99851546 1.6831857e-2 +vn 4.4066374e-2 0.99851546 3.2016095e-2 +vn 3.2016095e-2 0.99851546 4.4066374e-2 +vn 1.6831857e-2 0.99851546 5.1803129e-2 +vn 5.5612600e-18 0.99851546 5.4469034e-2 +vn -1.6831857e-2 0.99851546 5.1803129e-2 +vn -3.2016095e-2 0.99851546 4.4066374e-2 +vn -4.4066374e-2 0.99851546 3.2016095e-2 +vn -5.1803129e-2 0.99851546 1.6831857e-2 +vn -5.4469034e-2 0.99851546 1.6683780e-17 +vn -5.1803129e-2 0.99851546 -1.6831857e-2 +vn -4.4066374e-2 0.99851546 -3.2016095e-2 +vn -3.2016095e-2 0.99851546 -4.4066374e-2 +vn -1.6831857e-2 0.99851546 -5.1803129e-2 +vn -3.8928820e-17 0.99851546 -5.4469034e-2 +vn 1.6831857e-2 0.99851546 -5.1803129e-2 +vn 3.2016095e-2 0.99851546 -4.4066374e-2 +vn 4.4066374e-2 0.99851546 -3.2016095e-2 +vn 5.1803129e-2 0.99851546 -1.6831857e-2 +vn 5.4469034e-2 -0.99851546 1.1122520e-17 +vn 5.1803129e-2 -0.99851546 1.6831857e-2 +vn 4.4066374e-2 -0.99851546 3.2016095e-2 +vn 3.2016095e-2 -0.99851546 4.4066374e-2 +vn 1.6831857e-2 -0.99851546 5.1803129e-2 +vn 0.0000000e+0 -0.99851546 5.4469034e-2 +vn -1.6831857e-2 -0.99851546 5.1803129e-2 +vn -3.2016095e-2 -0.99851546 4.4066374e-2 +vn -4.4066374e-2 -0.99851546 3.2016095e-2 +vn -3.0596981e-2 -0.99897920 -3.3232284e-2 +vn 0.34014316 -0.94037367 -3.2809212e-17 +vn -3.0596981e-2 -0.99897920 3.3232284e-2 +vn -4.4066374e-2 -0.99851546 -3.2016095e-2 +vn -3.2016095e-2 -0.99851546 -4.4066374e-2 +vn -1.6831857e-2 -0.99851546 -5.1803129e-2 +vn -3.8928820e-17 -0.99851546 -5.4469034e-2 +vn 1.6831857e-2 -0.99851546 -5.1803129e-2 +vn 3.2016095e-2 -0.99851546 -4.4066374e-2 +vn 4.4066374e-2 -0.99851546 -3.2016095e-2 +vn 5.1803129e-2 -0.99851546 -1.6831857e-2 +vn -0.40443339 -0.91456746 -1.5236416e-17 +vn -0.38463901 -0.91456746 -0.12497679 +vn -0.32719349 -0.91456746 -0.23771998 +vn -0.23771998 -0.91456746 -0.32719349 +vn -0.12497679 -0.91456746 -0.38463901 +vn 0.0000000e+0 -0.91456746 -0.40443339 +vn 0.12497679 -0.91456746 -0.38463901 +vn 0.23771998 -0.91456746 -0.32719349 +vn 0.32719349 -0.91456746 -0.23771998 +vn 0.38463901 -0.91456746 -0.12497679 +vn 0.40443339 -0.91456746 -5.7136562e-17 +vn 0.38463901 -0.91456746 0.12497679 +vn 0.32719349 -0.91456746 0.23771998 +vn 0.23771998 -0.91456746 0.32719349 +vn 0.12497679 -0.91456746 0.38463901 +vn 5.7136562e-17 -0.91456746 0.40443339 +vn -0.12497679 -0.91456746 0.38463901 +vn -0.23771998 -0.91456746 0.32719349 +vn -0.32719349 -0.91456746 0.23771998 +vn -0.38463901 -0.91456746 0.12497679 +vn 0.42476506 -0.90530362 1.9248514e-17 +vn 0.40397558 -0.90530362 0.13125962 +vn 0.34364215 -0.90530362 0.24967064 +vn 0.24967064 -0.90530362 0.34364215 +vn 0.13125962 -0.90530362 0.40397558 +vn 8.0843761e-17 -0.90530362 0.42476506 +vn -0.13125962 -0.90530362 0.40397558 +vn -0.24967064 -0.90530362 0.34364215 +vn -0.34364215 -0.90530362 0.24967064 +vn -0.40397558 -0.90530362 0.13125962 +vn -0.42476506 -0.90530362 8.4693463e-17 +vn -0.40397558 -0.90530362 -0.13125962 +vn -0.34364215 -0.90530362 -0.24967064 +vn -0.24967064 -0.90530362 -0.34364215 +vn -0.13125962 -0.90530362 -0.40397558 +vn -7.6994058e-17 -0.90530362 -0.42476506 +vn 0.13125962 -0.90530362 -0.40397558 +vn 0.24967064 -0.90530362 -0.34364215 +vn 0.34364215 -0.90530362 -0.24967064 +vn 0.40397558 -0.90530362 -0.13125962 +vn 0.77124774 -0.59880222 -0.21590003 +vn 0.48410853 -0.86075361 0.15729640 +vn 0.49704968 -0.59880222 0.62799484 +vn 0.53136841 -0.42749455 0.73136587 +vn 0.44366179 -0.59880222 0.66678341 +vn 8.7921383e-17 -0.86075361 0.50902183 +vn -0.44366179 -0.59880222 0.66678341 +vn -0.53136841 -0.42749455 0.73136587 +vn -0.49704968 -0.59880222 0.62799484 +vn -0.48410853 -0.86075361 0.15729640 +vn -0.77124774 -0.59880222 -0.21590003 +vn -0.85977214 -0.42749455 -0.27935690 +vn -0.75085538 -0.59880222 -0.27866126 +vn -0.29919553 -0.86075361 -0.41180731 +vn -3.2995529e-2 -0.59880222 -0.80021697 +vn -1.3734785e-16 -0.42749455 -0.90401793 +vn 3.2995529e-2 -0.59880222 -0.80021697 +vn 0.29919553 -0.86075361 -0.41180731 +vn 0.75085538 -0.59880222 -0.27866126 +vn 0.85977214 -0.42749455 -0.27935690 +vn 0.77605210 -0.56947802 -0.27099432 +vn 0.97261654 -2.6465509e-17 -0.23241574 +vn 0.77605210 0.56947802 -0.27099432 +vn 0.77699837 0.57665972 0.25246208 +vn 0.46855288 0.56947802 0.67539099 +vn 0.65025276 -3.0435335e-16 0.75971794 +vn 0.46855288 -0.56947802 0.67539099 +vn 0.77699837 -0.57665972 0.25246208 +vn 0.49754420 -0.56947802 0.65432756 +vn 0.52159554 5.2931018e-17 0.85319288 +vn 0.49754420 0.56947802 0.65432756 +vn 6.8367264e-18 0.57665972 0.81698444 +vn -0.49754420 0.56947802 0.65432756 +vn -0.52159554 3.9698263e-17 0.85319288 +vn -0.49754420 -0.56947802 0.65432756 +vn 0.0000000e+0 -0.57665972 0.81698444 +vn -0.46855288 -0.56947802 0.67539099 +vn -0.65025276 1.3232754e-17 0.75971794 +vn -0.46855288 0.56947802 0.67539099 +vn -0.77699837 0.57665972 0.25246208 +vn -0.77605210 0.56947802 -0.27099432 +vn -0.97261654 3.9698263e-17 -0.23241574 +vn -0.77605210 -0.56947802 -0.27099432 +vn -0.77699837 -0.57665972 0.25246208 +vn -0.78712580 -0.56947802 -0.23691297 +vn -0.92347385 0.0000000e+0 -0.38366138 +vn -0.78712580 0.56947802 -0.23691297 +vn -0.48021140 0.57665972 -0.66095429 +vn 1.7917621e-2 0.56947802 -0.82181126 +vn -7.9514538e-2 -1.7864219e-16 -0.99683371 +vn 1.7917621e-2 -0.56947802 -0.82181126 +vn -0.48021140 -0.57665972 -0.66095429 +vn -1.7917621e-2 -0.56947802 -0.82181126 +vn 7.9514538e-2 0.0000000e+0 -0.99683371 +vn -1.7917621e-2 0.56947802 -0.82181126 +vn 0.48021140 0.57665972 -0.66095429 +vn 0.78712580 0.56947802 -0.23691297 +vn 0.92347385 -3.3081886e-17 -0.38366138 +vn 0.78712580 -0.56947802 -0.23691297 +vn 0.48021140 -0.57665972 -0.66095429 +vn 0.46443426 -0.87657025 -0.12619597 +vn 0.46443426 -0.87657025 0.12619597 +vn 0.44064271 -0.83816979 0.32141158 +vn 0.32141158 -0.83816979 0.44064271 +vn 0.12619597 -0.87657025 0.46443426 +vn -0.12619597 -0.87657025 0.46443426 +vn -0.32141158 -0.83816979 0.44064271 +vn -0.44064271 -0.83816979 0.32141158 +vn -0.48695350 -0.86420233 0.12661207 +vn -0.48695350 -0.86420233 -0.12661207 +vn -0.44064271 -0.83816979 -0.32141158 +vn -0.32141158 -0.83816979 -0.44064271 +vn -0.12619597 -0.87657025 -0.46443426 +vn 0.12619597 -0.87657025 -0.46443426 +vn 0.32141158 -0.83816979 -0.44064271 +vn 0.44064271 -0.83816979 -0.32141158 +vn 0.46443426 0.87657025 0.12619597 +vn 0.46443426 0.87657025 -0.12619597 +vn 0.44064271 0.83816979 -0.32141158 +vn 0.32141158 0.83816979 -0.44064271 +vn 0.12619597 0.87657025 -0.46443426 +vn -0.12619597 0.87657025 -0.46443426 +vn -0.32141158 0.83816979 -0.44064271 +vn -0.44064271 0.83816979 -0.32141158 +vn -0.46443426 0.87657025 -0.12619597 +vn -0.46443426 0.87657025 0.12619597 +vn -0.44064271 0.83816979 0.32141158 +vn -0.32141158 0.83816979 0.44064271 +vn -0.12619597 0.87657025 0.46443426 +vn 0.12619597 0.87657025 0.46443426 +vn 0.32141158 0.83816979 0.44064271 +vn 0.44064271 0.83816979 0.32141158 +vn 0.29930879 -0.95388236 -2.2862353e-2 +vn 0.68440514 -0.69999042 -0.20396818 +vn 0.29930879 -0.95388236 2.2862353e-2 +vn 0.73645440 -0.67648719 3.7739254e-17 +vn 0.34586984 -0.92104723 0.17901414 +vn 0.68440514 -0.69999042 0.20396818 +vn 0.29112228 -0.91131533 0.29112228 +vn 0.60120703 -0.66853265 0.43773760 +vn 0.17901414 -0.92104723 0.34586984 +vn 0.43773760 -0.66853265 0.60120703 +vn 2.2862353e-2 -0.95388236 0.29930879 +vn 0.20396818 -0.69999042 0.68440514 +vn -2.2862353e-2 -0.95388236 0.29930879 +vn 0.0000000e+0 -0.67648719 0.73645440 +vn -0.17901414 -0.92104723 0.34586984 +vn -0.20396818 -0.69999042 0.68440514 +vn -0.29112228 -0.91131533 0.29112228 +vn -0.43773760 -0.66853265 0.60120703 +vn -0.34586984 -0.92104723 0.17901414 +vn -0.60120703 -0.66853265 0.43773760 +vn -0.32263165 -0.94624404 2.3044190e-2 +vn -0.68598359 -0.70720685 0.17112855 +vn -0.32263165 -0.94624404 -2.3044190e-2 +vn -0.34586984 -0.92104723 -0.17901414 +vn -0.68598359 -0.70720685 -0.17112855 +vn -0.29112228 -0.91131533 -0.29112228 +vn -0.60120703 -0.66853265 -0.43773760 +vn -0.17901414 -0.92104723 -0.34586984 +vn -0.43773760 -0.66853265 -0.60120703 +vn -2.2862353e-2 -0.95388236 -0.29930879 +vn -0.20396818 -0.69999042 -0.68440514 +vn 2.2862353e-2 -0.95388236 -0.29930879 +vn -1.0378295e-16 -0.67648719 -0.73645440 +vn 0.17901414 -0.92104723 -0.34586984 +vn 0.20396818 -0.69999042 -0.68440514 +vn 0.29112228 -0.91131533 -0.29112228 +vn 0.43773760 -0.66853265 -0.60120703 +vn 0.34586984 -0.92104723 -0.17901414 +vn 0.60120703 -0.66853265 -0.43773760 +vn 0.10884394 -0.98808198 -0.10884394 +vn -0.10884394 -0.98808198 0.10884394 +vn 0.10884394 -0.98808198 0.10884394 +vn -0.10884394 -0.98808198 -0.10884394 +vn 0.29930879 0.95388236 2.2862353e-2 +vn 0.68440514 0.69999042 0.20396818 +vn 0.29930879 0.95388236 -2.2862353e-2 +vn 0.73645440 0.67648719 0.0000000e+0 +vn 0.34586984 0.92104723 -0.17901414 +vn 0.68440514 0.69999042 -0.20396818 +vn 0.29112228 0.91131533 -0.29112228 +vn 0.60120703 0.66853265 -0.43773760 +vn 0.17901414 0.92104723 -0.34586984 +vn 0.43773760 0.66853265 -0.60120703 +vn 2.2862353e-2 0.95388236 -0.29930879 +vn 0.20396818 0.69999042 -0.68440514 +vn -2.2862353e-2 0.95388236 -0.29930879 +vn -7.5478508e-17 0.67648719 -0.73645440 +vn -0.17901414 0.92104723 -0.34586984 +vn -0.20396818 0.69999042 -0.68440514 +vn -0.29112228 0.91131533 -0.29112228 +vn -0.43773760 0.66853265 -0.60120703 +vn -0.34586984 0.92104723 -0.17901414 +vn -0.60120703 0.66853265 -0.43773760 +vn -0.29930879 0.95388236 -2.2862353e-2 +vn -0.68440514 0.69999042 -0.20396818 +vn -0.29930879 0.95388236 2.2862353e-2 +vn -0.73645440 0.67648719 3.7739254e-17 +vn -0.34586984 0.92104723 0.17901414 +vn -0.68440514 0.69999042 0.20396818 +vn -0.29112228 0.91131533 0.29112228 +vn -0.60120703 0.66853265 0.43773760 +vn -0.17901414 0.92104723 0.34586984 +vn -0.43773760 0.66853265 0.60120703 +vn -2.2862353e-2 0.95388236 0.29930879 +vn -0.20396818 0.69999042 0.68440514 +vn 2.2862353e-2 0.95388236 0.29930879 +vn 0.0000000e+0 0.67648719 0.73645440 +vn 0.17901414 0.92104723 0.34586984 +vn 0.20396818 0.69999042 0.68440514 +vn 0.29112228 0.91131533 0.29112228 +vn 0.43773760 0.66853265 0.60120703 +vn 0.34586984 0.92104723 0.17901414 +vn 0.60120703 0.66853265 0.43773760 +vn 0.10884394 0.98808198 0.10884394 +vn -0.10884394 0.98808198 -0.10884394 +vn 0.10884394 0.98808198 -0.10884394 +vn -0.10884394 0.98808198 0.10884394 +g mine_mine +usemtl mine +s 1 +f 1/189/1 156/199/156 175/241/175 15/245/15 +f 1/189/1 177/140/177 176/146/176 156/199/156 +f 2/40/2 18/31/18 19/16/19 3/13/3 +f 2/40/2 181/105/181 180/95/180 18/31/18 +f 3/246/3 19/239/19 20/206/20 4/195/4 +f 3/13/3 159/20/159 158/32/158 2/40/2 +f 4/195/4 160/207/160 159/240/159 3/246/3 +f 4/195/4 185/144/185 184/153/184 160/207/160 +f 5/41/5 22/30/22 23/12/23 6/7/6 +f 5/41/5 189/109/189 188/103/188 22/30/22 +f 6/243/6 23/233/23 24/200/24 7/192/7 +f 6/7/6 163/17/163 162/36/162 5/41/5 +f 7/192/7 164/205/164 163/237/163 6/243/6 +f 7/192/7 193/143/193 192/152/192 164/205/164 +f 8/44/8 26/38/26 27/18/27 9/8/9 +f 8/44/8 197/108/197 196/99/196 26/38/26 +f 9/242/9 27/232/27 28/202/28 10/190/10 +f 9/8/9 167/15/167 166/35/166 8/44/8 +f 10/190/10 168/203/168 167/238/167 9/242/9 +f 10/190/10 201/141/201 200/149/200 168/203/168 +f 11/42/11 30/33/30 31/11/31 12/10/12 +f 11/42/11 205/106/205 204/97/204 30/33/30 +f 12/244/12 31/234/31 32/201/32 13/191/13 +f 12/10/12 171/21/171 170/39/170 11/42/11 +f 13/191/13 172/204/172 171/236/171 12/244/12 +f 13/191/13 209/142/209 208/151/208 172/204/172 +f 14/43/14 34/37/34 35/19/35 15/9/15 +f 14/43/14 213/107/213 212/98/212 34/37/34 +f 15/245/15 35/235/35 16/198/16 1/189/1 +f 15/9/15 175/14/175 174/34/174 14/43/14 +f 16/269/16 36/256/36 37/272/37 17/286/17 +f 16/198/16 178/145/178 177/140/177 1/189/1 +f 17/286/17 37/272/37 38/274/38 18/289/18 +f 17/286/17 179/357/179 178/348/178 16/269/16 +f 18/289/18 38/274/38 39/271/39 19/285/19 +f 18/289/18 180/364/180 179/357/179 17/286/17 +f 19/285/19 39/271/39 40/255/40 20/267/20 +f 20/267/20 40/255/40 41/222/41 21/230/21 +f 20/206/20 186/154/186 185/144/185 4/195/4 +f 21/230/21 41/222/41 42/187/42 22/196/22 +f 21/230/21 187/278/187 186/290/186 20/267/20 +f 22/196/22 42/187/42 43/167/43 23/166/23 +f 22/196/22 188/264/188 187/278/187 21/230/21 +f 23/166/23 43/167/43 44/130/44 24/116/24 +f 24/116/24 44/130/44 45/85/45 25/77/25 +f 24/200/24 194/148/194 193/143/193 7/192/7 +f 25/77/25 45/85/45 46/67/46 26/55/26 +f 25/77/25 195/45/195 194/57/194 24/116/24 +f 26/55/26 46/67/46 47/51/47 27/28/27 +f 26/55/26 196/22/196 195/45/195 25/77/25 +f 27/28/27 47/51/47 48/48/48 28/25/28 +f 28/25/28 48/48/48 49/53/49 29/29/29 +f 28/202/28 202/150/202 201/141/201 10/190/10 +f 29/29/29 49/53/49 50/68/50 30/56/30 +f 29/29/29 203/4/203 202/2/202 28/25/28 +f 30/56/30 50/68/50 51/86/51 31/79/31 +f 30/56/30 204/6/204 203/4/203 29/29/29 +f 31/79/31 51/86/51 52/131/52 32/117/32 +f 32/117/32 52/131/52 53/172/53 33/173/33 +f 32/201/32 210/147/210 209/142/209 13/191/13 +f 33/173/33 53/172/53 54/188/54 34/197/34 +f 33/173/33 211/174/211 210/156/210 32/117/32 +f 34/197/34 54/188/54 55/223/55 35/231/35 +f 34/197/34 212/176/212 211/174/211 33/173/33 +f 35/231/35 55/223/55 36/256/36 16/269/16 +f 36/256/36 56/251/56 57/260/57 37/272/37 +f 37/272/37 57/260/57 58/262/58 38/274/38 +f 38/274/38 58/262/58 59/259/59 39/271/39 +f 39/271/39 59/259/59 60/250/60 40/255/40 +f 40/255/40 60/250/60 61/214/61 41/222/41 +f 41/222/41 61/214/61 62/183/62 42/187/42 +f 42/187/42 62/183/62 63/168/63 43/167/43 +f 43/167/43 63/168/63 64/134/64 44/130/44 +f 44/130/44 64/134/64 65/93/65 45/85/45 +f 45/85/45 65/93/65 66/73/66 46/67/46 +f 46/67/46 66/73/66 67/63/67 47/51/47 +f 47/51/47 67/63/67 68/60/68 48/48/48 +f 48/48/48 68/60/68 69/64/69 49/53/49 +f 49/53/49 69/64/69 70/74/70 50/68/50 +f 50/68/50 70/74/70 71/94/71 51/86/51 +f 51/86/51 71/94/71 72/135/72 52/131/52 +f 52/131/52 72/135/72 73/171/73 53/172/53 +f 53/172/53 73/171/73 74/184/74 54/188/54 +f 54/188/54 74/184/74 75/215/75 55/223/55 +f 55/223/55 75/215/75 56/251/56 36/256/36 +f 56/251/56 75/215/75 95/211/95 76/219/76 +f 56/251/56 76/219/76 77/227/77 57/260/57 +f 57/260/57 77/227/77 78/252/78 58/262/58 +f 58/262/58 78/252/78 79/226/79 59/259/59 +f 59/259/59 79/226/79 80/218/80 60/250/60 +f 60/250/60 80/218/80 81/210/81 61/214/61 +f 61/214/61 81/210/81 82/179/82 62/183/62 +f 62/183/62 82/179/82 83/169/83 63/168/63 +f 63/168/63 83/169/83 84/138/84 64/134/64 +f 64/134/64 84/138/84 85/112/85 65/93/65 +f 65/93/65 85/112/85 86/89/86 66/73/66 +f 66/73/66 86/89/86 87/81/87 67/63/67 +f 67/63/67 87/81/87 88/72/88 68/60/68 +f 68/60/68 88/72/88 89/82/89 69/64/69 +f 69/64/69 89/82/89 90/90/90 70/74/70 +f 70/74/70 90/90/90 91/113/91 71/94/71 +f 71/94/71 91/113/91 92/139/92 72/135/72 +f 72/135/72 92/139/92 93/170/93 73/171/73 +f 73/171/73 93/170/93 94/180/94 74/184/74 +f 74/184/74 94/180/94 95/211/95 75/215/75 +f 76/449/76 95/447/95 296/439/296 294/441/294 +f 76/449/76 294/441/294 292/435/292 77/444/77 +f 77/444/77 292/435/292 330/427/330 78/437/78 +f 78/437/78 330/427/330 328/403/328 79/411/79 +f 79/411/79 328/403/328 326/381/326 80/384/80 +f 80/384/80 326/381/326 324/369/324 81/367/81 +f 81/367/81 324/369/324 322/349/322 82/343/82 +f 82/343/82 322/349/322 320/325/320 83/313/83 +f 83/313/83 320/325/320 318/301/318 84/291/84 +f 84/291/84 318/301/318 316/295/316 85/279/85 +f 85/279/85 316/295/316 314/292/314 86/276/86 +f 86/276/86 314/292/314 312/300/312 87/282/87 +f 87/282/87 312/300/312 310/308/310 88/299/88 +f 88/299/88 310/308/310 308/332/308 89/324/89 +f 89/324/89 308/332/308 306/356/306 90/352/90 +f 90/352/90 306/356/306 304/371/304 91/372/91 +f 91/372/91 304/371/304 302/387/302 92/391/92 +f 92/391/92 302/387/302 300/409/300 93/421/93 +f 93/421/93 300/409/300 298/433/298 94/442/94 +f 94/442/94 298/433/298 296/439/296 95/447/95 +f 96/277/96 97/280/97 253/297/253 251/293/251 +f 96/277/96 251/293/251 249/298/249 115/281/115 +f 97/280/97 98/294/98 255/303/255 253/297/253 +f 98/294/98 99/314/99 257/326/257 255/303/255 +f 99/314/99 100/344/100 259/350/259 257/326/257 +f 100/344/100 101/368/101 261/370/261 259/350/259 +f 101/368/101 102/383/102 263/382/263 261/370/261 +f 102/383/102 103/412/103 265/404/265 263/382/263 +f 103/412/103 104/438/104 267/428/267 265/404/265 +f 104/438/104 105/445/105 269/436/269 267/428/267 +f 105/445/105 106/448/106 107/446/107 272/440/272 269/436/269 +f 107/446/107 108/443/108 274/434/274 272/440/272 +f 108/443/108 109/422/109 276/410/276 274/434/274 +f 109/422/109 110/392/110 278/388/278 276/410/276 +f 110/392/110 111/374/111 280/373/280 278/388/278 +f 111/374/111 112/354/112 282/358/282 280/373/280 +f 112/354/112 113/323/113 284/330/284 282/358/282 +f 113/323/113 114/296/114 286/307/286 284/330/284 +f 115/80/115 135/62/135 116/71/116 96/88/96 +f 116/71/116 117/92/117 97/111/97 96/88/96 +f 117/92/117 118/133/118 98/137/98 97/111/97 +f 118/133/118 119/159/119 99/160/99 98/137/98 +f 119/159/119 120/181/120 100/177/100 99/160/99 +f 120/181/120 121/212/121 101/208/101 100/177/100 +f 121/212/121 122/247/122 102/216/102 101/208/101 +f 122/247/122 123/257/123 103/224/103 102/216/102 +f 123/257/123 124/261/124 104/249/104 103/224/103 +f 124/261/124 125/258/125 105/225/105 104/249/104 +f 125/258/125 126/248/126 106/217/106 105/225/105 +f 126/248/126 127/213/127 107/209/107 106/217/106 +f 127/213/127 128/182/128 108/178/108 107/209/107 +f 128/182/128 129/162/129 109/161/109 108/178/108 +f 129/162/129 130/132/130 110/136/110 109/161/109 +f 130/132/130 131/91/131 111/110/111 110/136/110 +f 131/91/131 132/70/132 112/87/112 111/110/111 +f 132/70/132 133/61/133 113/78/113 112/87/112 +f 133/61/133 134/59/134 114/69/114 113/78/113 +f 134/59/134 135/62/135 115/80/115 114/69/114 +f 135/62/135 155/50/155 136/66/136 116/71/116 +f 136/66/136 137/84/137 117/92/117 116/71/116 +f 136/66/136 156/54/156 157/76/157 137/84/137 +f 137/84/137 138/129/138 118/133/118 117/92/117 +f 137/84/137 157/76/157 158/115/158 138/129/138 +f 138/129/138 139/158/139 119/159/119 118/133/118 +f 138/129/138 158/115/158 159/157/159 139/158/139 +f 139/158/139 140/185/140 120/181/120 119/159/119 +f 139/158/139 159/157/159 160/193/160 140/185/140 +f 140/185/140 141/220/141 121/212/121 120/181/120 +f 140/185/140 160/193/160 161/228/161 141/220/141 +f 141/220/141 142/253/142 122/247/122 121/212/121 +f 141/220/141 161/228/161 162/265/162 142/253/142 +f 142/253/142 143/268/143 123/257/123 122/247/122 +f 142/253/142 162/265/162 163/283/163 143/268/143 +f 143/268/143 144/273/144 124/261/124 123/257/123 +f 143/268/143 163/283/163 164/288/164 144/273/144 +f 144/273/144 145/270/145 125/258/125 124/261/124 +f 144/273/144 164/288/164 165/284/165 145/270/145 +f 145/270/145 146/254/146 126/248/126 125/258/125 +f 145/270/145 165/284/165 166/266/166 146/254/146 +f 146/254/146 147/221/147 127/213/127 126/248/126 +f 146/254/146 166/266/166 167/229/167 147/221/147 +f 147/221/147 148/186/148 128/182/128 127/213/127 +f 147/221/147 167/229/167 168/194/168 148/186/148 +f 148/186/148 149/163/149 129/162/129 128/182/128 +f 148/186/148 168/194/168 169/164/169 149/163/149 +f 149/163/149 150/128/150 130/132/130 129/162/129 +f 149/163/149 169/164/169 170/114/170 150/128/150 +f 150/128/150 151/83/151 131/91/131 130/132/130 +f 150/128/150 170/114/170 171/75/171 151/83/151 +f 151/83/151 152/65/152 132/70/132 131/91/131 +f 151/83/151 171/75/171 172/52/172 152/65/152 +f 152/65/152 153/49/153 133/61/133 132/70/132 +f 152/65/152 172/52/172 173/26/173 153/49/153 +f 153/49/153 154/47/154 134/59/134 133/61/133 +f 153/49/153 173/26/173 174/23/174 154/47/154 +f 154/47/154 155/50/155 135/62/135 134/59/134 +f 154/47/154 174/23/174 175/27/175 155/50/155 +f 155/50/155 175/27/175 156/54/156 136/66/136 +f 156/54/156 176/24/176 183/46/183 157/76/157 +f 157/76/157 183/46/183 182/58/182 158/115/158 +f 158/32/158 182/96/182 181/105/181 2/40/2 +f 160/193/160 184/263/184 191/275/191 161/228/161 +f 161/228/161 191/275/191 190/287/190 162/265/162 +f 162/36/162 190/104/190 189/109/189 5/41/5 +f 164/288/164 192/362/192 199/355/199 165/284/165 +f 165/284/165 199/355/199 198/345/198 166/266/166 +f 166/35/166 198/101/198 197/108/197 8/44/8 +f 168/194/168 200/175/200 207/165/207 169/164/169 +f 169/164/169 207/165/207 206/155/206 170/114/170 +f 170/39/170 206/102/206 205/106/205 11/42/11 +f 172/52/172 208/5/208 215/3/215 173/26/173 +f 173/26/173 215/3/215 214/1/214 174/23/174 +f 174/34/174 214/100/214 213/107/213 14/43/14 +f 177/140/177 183/118/183 176/146/176 +f 178/145/178 179/119/179 177/140/177 +f 180/95/180 181/105/181 179/119/179 +f 181/105/181 183/118/183 177/140/177 179/119/179 +f 182/96/182 183/118/183 181/105/181 +f 185/144/185 191/126/191 184/153/184 +f 186/154/186 187/127/187 185/144/185 +f 188/103/188 189/109/189 187/127/187 +f 189/109/189 191/126/191 185/144/185 187/127/187 +f 190/104/190 191/126/191 189/109/189 +f 193/143/193 199/124/199 192/152/192 +f 194/148/194 195/122/195 193/143/193 +f 196/99/196 197/108/197 195/122/195 +f 197/108/197 199/124/199 193/143/193 195/122/195 +f 198/101/198 199/124/199 197/108/197 +f 201/141/201 207/125/207 200/149/200 +f 202/150/202 203/120/203 201/141/201 +f 204/97/204 205/106/205 203/120/203 +f 205/106/205 207/125/207 201/141/201 203/120/203 +f 206/102/206 207/125/207 205/106/205 +f 209/142/209 215/123/215 208/151/208 +f 210/147/210 211/121/211 209/142/209 +f 212/98/212 213/107/213 211/121/211 +f 213/107/213 215/123/215 209/142/209 211/121/211 +f 214/100/214 215/123/215 213/107/213 +f 216/305/216 248/311/248 287/342/287 285/319/285 +f 217/304/217 252/317/252 289/338/289 250/310/250 +f 218/318/218 254/328/254 289/338/289 252/317/252 +f 219/334/219 256/340/256 289/338/289 254/328/254 +f 220/353/220 258/363/258 289/338/289 256/340/256 +f 221/380/221 262/390/262 288/394/288 260/376/260 +f 222/400/222 264/406/264 288/394/288 262/390/262 +f 223/414/223 266/416/266 288/394/288 264/406/264 +f 224/430/224 268/424/268 288/394/288 266/416/266 +f 225/432/225 271/419/271 290/398/290 270/426/270 +f 226/420/226 273/408/273 290/398/290 271/419/271 +f 227/402/227 275/396/275 290/398/290 273/408/273 +f 228/386/228 277/378/277 290/398/290 275/396/275 +f 229/360/229 281/347/281 287/342/287 279/366/279 +f 230/335/230 283/329/283 287/342/287 281/347/281 +f 231/321/231 285/319/285 287/342/287 283/329/283 +f 232/429/232 291/423/291 331/393/331 329/415/329 +f 233/431/233 295/417/295 333/397/333 293/425/293 +f 234/418/234 297/407/297 333/397/333 295/417/295 +f 235/401/235 299/395/299 333/397/333 297/407/297 +f 236/385/236 301/377/301 333/397/333 299/395/299 +f 237/359/237 305/346/305 332/341/332 303/365/303 +f 238/336/238 307/331/307 332/341/332 305/346/305 +f 239/322/239 309/320/309 332/341/332 307/331/307 +f 240/306/240 311/312/311 332/341/332 309/320/309 +f 241/302/241 315/316/315 334/337/334 313/309/313 +f 242/315/242 317/327/317 334/337/334 315/316/315 +f 243/333/243 319/339/319 334/337/334 317/327/317 +f 244/351/244 321/361/321 334/337/334 319/339/319 +f 245/379/245 325/389/325 331/393/331 323/375/323 +f 246/399/246 327/405/327 331/393/331 325/389/325 +f 247/413/247 329/415/329 331/393/331 327/405/327 +f 249/298/249 286/307/286 114/296/114 115/281/115 +f 250/310/250 248/311/248 216/305/216 249/298/249 251/293/251 253/297/253 217/304/217 +f 250/310/250 289/338/289 287/342/287 248/311/248 +f 252/317/252 217/304/217 253/297/253 255/303/255 218/318/218 +f 254/328/254 218/318/218 255/303/255 257/326/257 219/334/219 +f 256/340/256 219/334/219 257/326/257 259/350/259 220/353/220 +f 260/376/260 258/363/258 220/353/220 259/350/259 261/370/261 263/382/263 221/380/221 +f 260/376/260 288/394/288 289/338/289 258/363/258 +f 262/390/262 221/380/221 263/382/263 265/404/265 222/400/222 +f 264/406/264 222/400/222 265/404/265 267/428/267 223/414/223 +f 266/416/266 223/414/223 267/428/267 269/436/269 224/430/224 +f 270/426/270 268/424/268 224/430/224 269/436/269 272/440/272 225/432/225 +f 270/426/270 290/398/290 288/394/288 268/424/268 +f 271/419/271 225/432/225 272/440/272 274/434/274 226/420/226 +f 273/408/273 226/420/226 274/434/274 276/410/276 227/402/227 +f 275/396/275 227/402/227 276/410/276 278/388/278 228/386/228 +f 277/378/277 228/386/228 278/388/278 280/373/280 282/358/282 229/360/229 279/366/279 +f 279/366/279 287/342/287 290/398/290 277/378/277 +f 281/347/281 229/360/229 282/358/282 284/330/284 230/335/230 +f 283/329/283 230/335/230 284/330/284 286/307/286 231/321/231 +f 285/319/285 231/321/231 286/307/286 249/298/249 216/305/216 +f 289/338/289 288/394/288 290/398/290 287/342/287 +f 293/425/293 291/423/291 232/429/232 292/435/292 294/441/294 296/439/296 233/431/233 +f 293/425/293 333/397/333 331/393/331 291/423/291 +f 295/417/295 233/431/233 296/439/296 298/433/298 234/418/234 +f 297/407/297 234/418/234 298/433/298 300/409/300 235/401/235 +f 299/395/299 235/401/235 300/409/300 302/387/302 236/385/236 +f 303/365/303 301/377/301 236/385/236 302/387/302 304/371/304 306/356/306 237/359/237 +f 303/365/303 332/341/332 333/397/333 301/377/301 +f 305/346/305 237/359/237 306/356/306 308/332/308 238/336/238 +f 307/331/307 238/336/238 308/332/308 310/308/310 239/322/239 +f 309/320/309 239/322/239 310/308/310 312/300/312 240/306/240 +f 313/309/313 311/312/311 240/306/240 312/300/312 314/292/314 316/295/316 241/302/241 +f 313/309/313 334/337/334 332/341/332 311/312/311 +f 315/316/315 241/302/241 316/295/316 318/301/318 242/315/242 +f 317/327/317 242/315/242 318/301/318 320/325/320 243/333/243 +f 319/339/319 243/333/243 320/325/320 322/349/322 244/351/244 +f 321/361/321 244/351/244 322/349/322 324/369/324 326/381/326 245/379/245 323/375/323 +f 323/375/323 331/393/331 334/337/334 321/361/321 +f 325/389/325 245/379/245 326/381/326 328/403/328 246/399/246 +f 327/405/327 246/399/246 328/403/328 330/427/330 247/413/247 +f 329/415/329 247/413/247 330/427/330 292/435/292 232/429/232 +f 333/397/333 332/341/332 334/337/334 331/393/331 diff --git a/res/models/ships/mine/mine.png b/res/models/ships/mine/mine.png new file mode 100644 index 0000000..396075b Binary files /dev/null and b/res/models/ships/mine/mine.png differ diff --git a/res/models/ships/shark/shark.mtl b/res/models/ships/shark/shark.mtl new file mode 100644 index 0000000..966ed43 --- /dev/null +++ b/res/models/ships/shark/shark.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl shark +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd shark.png + diff --git a/res/models/ships/shark/shark.obj b/res/models/ships/shark/shark.obj new file mode 100644 index 0000000..bdd5184 --- /dev/null +++ b/res/models/ships/shark/shark.obj @@ -0,0 +1,607 @@ +# Exported from Wings 3D 1.4.1 +mtllib shark.mtl +o shark +#130 vertices, 116 faces +v -0.53744481 0.24812321 0.94229707 +v -0.53744481 -0.21356641 0.94229707 +v 0.53744481 -0.21356641 0.94229707 +v 0.53744481 0.24812321 0.94229707 +v -0.65700000 -0.21356641 0.82274187 +v -0.65700000 0.24812321 0.82274187 +v -0.65700000 0.32049955 -0.62066442 +v -0.65700000 -0.22300344 -0.68600841 +v -0.53744481 0.36767840 0.82274187 +v 0.53744481 0.36767840 0.82274187 +v 0.53744481 0.43796048 -0.59838501 +v -0.53744481 0.43796048 -0.59838501 +v -0.49982367 -0.17968513 -0.87911549 +v -0.49982367 0.23863698 -0.81746586 +v 0.49982367 0.23863698 -0.81746586 +v 0.49982367 -0.17968513 -0.87911549 +v 0.65700000 0.24812321 0.82274187 +v 0.65700000 -0.21356641 0.82274187 +v 0.65700000 -0.22300344 -0.68600841 +v 0.65700000 0.32049955 -0.62066442 +v 0.53744481 -0.33312160 0.82274187 +v -0.53744481 -0.33312160 0.82274187 +v -0.53744481 -0.34140672 -0.70256462 +v 0.53744481 -0.34140672 -0.70256462 +v -0.81913802 0.29406532 -0.32801631 +v -1.04843581 0.29406532 -0.32801631 +v -1.21057383 0.13192729 -0.32801631 +v -1.21057383 -9.7370496e-2 -0.32801631 +v -1.04843581 -0.25950852 -0.32801631 +v -0.81913802 -0.25950852 -0.32801631 +v -0.65700000 -9.7370496e-2 -0.32801631 +v -0.65700000 0.13192729 -0.32801631 +v 1.04843581 0.29406532 -0.32801631 +v 0.81913802 0.29406532 -0.32801631 +v 0.65700000 0.13192729 -0.32801631 +v 0.65700000 -9.7370496e-2 -0.32801631 +v 0.81913802 -0.25950852 -0.32801631 +v 1.04843581 -0.25950852 -0.32801631 +v 1.21057383 -9.7370496e-2 -0.32801631 +v 1.21057383 0.13192729 -0.32801631 +v -1.02550603 0.23870793 -0.32801631 +v -0.84206780 0.23870793 -0.32801631 +v -0.71235738 0.10899751 -0.32801631 +v -0.71235738 -7.4440717e-2 -0.32801631 +v -0.84206780 -0.20415113 -0.32801631 +v -1.02550603 -0.20415113 -0.32801631 +v -1.15521645 -7.4440717e-2 -0.32801631 +v -1.15521645 0.10899751 -0.32801631 +v 0.84206780 0.23870793 -0.32801631 +v 1.02550603 0.23870793 -0.32801631 +v 1.15521645 0.10899751 -0.32801631 +v 1.15521645 -7.4440717e-2 -0.32801631 +v 1.02550603 -0.20415113 -0.32801631 +v 0.84206780 -0.20415113 -0.32801631 +v 0.71235738 -7.4440717e-2 -0.32801631 +v 0.71235738 0.10899751 -0.32801631 +v -0.99799030 0.17227907 -0.19950398 +v -0.86958354 0.17227907 -0.19950398 +v -0.77878624 8.1481780e-2 -0.19950398 +v -0.77878624 -4.6924982e-2 -0.19950398 +v -0.86958354 -0.13772227 -0.19950398 +v -0.99799030 -0.13772227 -0.19950398 +v -1.08878759 -4.6924982e-2 -0.19950398 +v -1.08878759 8.1481780e-2 -0.19950398 +v 0.86958354 0.17227907 -0.19950398 +v 0.99799030 0.17227907 -0.19950398 +v 1.08878759 8.1481780e-2 -0.19950398 +v 1.08878759 -4.6924982e-2 -0.19950398 +v 0.99799030 -0.13772227 -0.19950398 +v 0.86958354 -0.13772227 -0.19950398 +v 0.77878624 -4.6924982e-2 -0.19950398 +v 0.77878624 8.1481780e-2 -0.19950398 +v -0.81913802 0.29406532 0.61874489 +v -1.04843581 0.29406532 0.61874489 +v -1.21057383 0.13192729 0.61874489 +v -1.21057383 -9.7370496e-2 0.61874489 +v -1.04843581 -0.25950852 0.61874489 +v -0.81913802 -0.25950852 0.61874489 +v -0.65700000 -9.7370496e-2 0.61874489 +v -0.65700000 0.13192729 0.61874489 +v 1.04843581 0.29406532 0.61874489 +v 0.81913802 0.29406532 0.61874489 +v 0.65700000 0.13192729 0.61874489 +v 0.65700000 -9.7370496e-2 0.61874489 +v 0.81913802 -0.25950852 0.61874489 +v 1.04843581 -0.25950852 0.61874489 +v 1.21057383 -9.7370496e-2 0.61874489 +v 1.21057383 0.13192729 0.61874489 +v -0.85441526 0.20889852 0.70391169 +v -1.01315857 0.20889852 0.70391169 +v -1.12540704 9.6650052e-2 0.70391169 +v -1.12540704 -6.2093255e-2 0.70391169 +v -1.01315857 -0.17434172 0.70391169 +v -0.85441526 -0.17434172 0.70391169 +v -0.74216679 -6.2093255e-2 0.70391169 +v -0.74216679 9.6650052e-2 0.70391169 +v 1.01315857 0.20889852 0.70391169 +v 0.85441526 0.20889852 0.70391169 +v 0.74216679 9.6650052e-2 0.70391169 +v 0.74216679 -6.2093255e-2 0.70391169 +v 0.85441526 -0.17434172 0.70391169 +v 1.01315857 -0.17434172 0.70391169 +v 1.12540704 -6.2093255e-2 0.70391169 +v 1.12540704 9.6650052e-2 0.70391169 +v -5.5894260e-2 0.36767840 0.82265668 +v 5.5894260e-2 0.36767840 0.82265668 +v 5.5894260e-2 0.36767840 0.22043497 +v -5.5894260e-2 0.36767840 0.22043497 +v -5.5894260e-2 0.68210707 1.22011570 +v 5.5894260e-2 0.68210707 1.22011570 +v -5.5894260e-2 0.78171466 0.63533905 +v 5.5894260e-2 0.78171466 0.63533905 +v 5.5894260e-2 0.78363132 0.92772737 +v -5.5894260e-2 0.78363132 0.92772737 +v -5.5894260e-2 0.59063645 0.34295073 +v 5.5894260e-2 0.59063645 0.34295073 +v 5.5894260e-2 0.72759035 0.48914489 +v -5.5894260e-2 0.72759035 0.48914489 +v -5.5894260e-2 0.74207636 1.07392153 +v 5.5894260e-2 0.74207636 1.07392153 +v 5.5894260e-2 0.80020706 0.78153321 +v -5.5894260e-2 0.80020706 0.78153321 +v -5.5894260e-2 0.46971311 0.26659306 +v 5.5894260e-2 0.46971311 0.26659306 +v 5.5894260e-2 0.57360807 0.99749135 +v -5.5894260e-2 0.57360807 0.99749135 +v -5.5894257e-2 0.64232202 1.12075094 +v 5.5894262e-2 0.64232202 1.12075094 +v 5.5894260e-2 0.48045384 0.88319232 +v -5.5894260e-2 0.48045384 0.88319232 +vt 2.0212770e-2 4.6984671e-2 +vt 2.0212770e-2 0.41995034 +vt 2.0601993e-2 0.79769987 +vt 2.0601993e-2 0.44051811 +vt 4.9766450e-2 4.2730939e-2 +vt 4.9766450e-2 0.41978762 +vt 5.0155673e-2 0.79681336 +vt 5.0155673e-2 0.44515205 +vt 0.16919350 0.81966945 +vt 0.16919350 0.78342405 +vt 0.16919350 0.85610008 +vt 0.16919350 0.74743869 +vt 0.16919350 0.89266724 +vt 0.16919350 0.71171753 +vt 0.16919350 0.67661057 +vt 0.16919350 0.65864033 +vt 0.16919350 0.79679231 +vt 0.16919350 0.64799192 +vt 0.19682728 0.81966945 +vt 0.19682728 0.78342405 +vt 0.19682728 0.85610008 +vt 0.19682728 0.74743869 +vt 0.19682728 0.89266724 +vt 0.19682728 0.71171753 +vt 0.19682728 0.67661057 +vt 0.19682728 0.65864033 +vt 0.19682728 0.79679231 +vt 0.19682728 0.64799192 +vt 0.23747117 0.82969981 +vt 0.23756317 0.82969981 +vt 0.25362400 0.96405209 +vt 0.25371600 0.96405209 +vt 0.31547589 4.2730939e-2 +vt 0.31547589 0.41978762 +vt 0.31586511 0.79681336 +vt 0.31586511 0.44515205 +vt 0.32596572 0.86075589 +vt 0.32596572 0.91743761 +vt 0.32605773 0.86075589 +vt 0.32605773 0.91743761 +vt 0.34502957 4.6984671e-2 +vt 0.34502957 0.41995034 +vt 0.34541879 0.79769987 +vt 0.34541879 0.44051811 +vt 0.37694351 0.67675783 +vt 0.37960912 0.61822845 +vt 0.38835365 0.70198050 +vt 0.40417178 0.60839371 +vt 0.40722903 0.73187238 +vt 0.41574787 0.63305268 +vt 0.43464118 0.59140783 +vt 0.44336778 0.76572697 +vt 0.45188662 0.64332494 +vt 0.46289555 0.56838039 +vt 0.47785978 0.54050264 +vt 0.47950653 0.77910633 +vt 0.48802537 0.64742241 +vt 0.51564528 0.78367760 +vt 0.52416412 0.64285114 +vt 0.52581088 0.67675783 +vt 0.54077511 0.70463557 +vt 0.55178404 0.77958013 +vt 0.56000221 0.86075589 +vt 0.56000221 0.91743761 +vt 0.56009421 0.86075589 +vt 0.56009421 0.91743761 +vt 0.56030288 0.62947178 +vt 0.56902948 0.72766302 +vt 0.58792279 0.76930787 +vt 0.59644163 0.59561719 +vt 0.59949887 0.74464890 +vt 0.61042964 0.83203262 +vt 0.61042964 0.94616088 +vt 0.61052165 0.83203262 +vt 0.61052165 0.94616088 +vt 0.61531701 0.56572531 +vt 0.62406154 0.75448364 +vt 0.62672715 0.54050264 +vt 0.65763790 0.74440845 +vt 0.65763790 0.85840626 +vt 0.65859043 0.49879909 +vt 0.65859043 0.63410854 +vt 0.65905977 0.36703214 +vt 0.65905977 0.31035043 +vt 0.65907710 0.31036202 +vt 0.65907710 0.36704373 +vt 0.66644990 0.20990718 +vt 0.66649345 3.6828035e-2 +vt 0.66651970 3.6962338e-2 +vt 0.66656325 0.21004148 +vt 0.67274394 0.31601860 +vt 0.67274394 0.36136397 +vt 0.67276127 0.31603019 +vt 0.67276127 0.36137556 +vt 0.68719158 0.71488855 +vt 0.68719158 0.74582110 +vt 0.68719158 0.85981891 +vt 0.68719158 0.88792616 +vt 0.68814411 0.66361684 +vt 0.68814411 0.46924611 +vt 0.68916496 0.35456217 +vt 0.68916496 0.32282041 +vt 0.68918228 0.32283199 +vt 0.68918228 0.35457375 +vt 0.69744394 0.60764439 +vt 0.69744394 0.50313019 +vt 0.69913979 0.27027040 +vt 0.69913979 0.40711217 +vt 0.69915712 0.27028199 +vt 0.69915712 0.40712376 +vt 0.70480797 0.28395458 +vt 0.70480797 0.39342799 +vt 0.70482529 0.28396617 +vt 0.70482529 0.39343958 +vt 0.70836825 0.20991772 +vt 0.70841179 3.6838581e-2 +vt 0.70843805 3.6951791e-2 +vt 0.70848159 0.21003093 +vt 0.71160977 0.30037559 +vt 0.71160977 0.37700698 +vt 0.71162710 0.30038718 +vt 0.71162710 0.37701857 +vt 0.74335153 0.30037559 +vt 0.74335153 0.37700698 +vt 0.74336886 0.30038718 +vt 0.74336886 0.37701857 +vt 0.75015334 0.28395458 +vt 0.75015334 0.39342799 +vt 0.75017067 0.28396617 +vt 0.75017067 0.39343958 +vt 0.75028660 0.20992827 +vt 0.75033014 3.6849128e-2 +vt 0.75035640 3.6941245e-2 +vt 0.75039994 0.21002039 +vt 0.75582151 0.27027040 +vt 0.75582151 0.40711217 +vt 0.75583884 0.27028199 +vt 0.75583884 0.40712376 +vt 0.76579635 0.32282041 +vt 0.76579635 0.35456217 +vt 0.76581367 0.32283199 +vt 0.76581367 0.35457375 +vt 0.78221736 0.31601860 +vt 0.78221736 0.36136397 +vt 0.78223469 0.31603019 +vt 0.78223469 0.36137556 +vt 0.79220494 0.20993882 +vt 0.79224849 3.6859674e-2 +vt 0.79227474 3.6930699e-2 +vt 0.79231829 0.21000984 +vt 0.79590153 0.31035043 +vt 0.79590153 0.36703214 +vt 0.79591886 0.31036202 +vt 0.79591886 0.36704373 +vt 0.80622941 0.97025846 +vt 0.80622941 0.88792515 +vt 0.80622941 0.91648631 +vt 0.80622941 0.94083799 +vt 0.80622941 0.95926088 +vt 0.81795794 0.31132337 +vt 0.81795794 0.36800508 +vt 0.81797790 0.31131555 +vt 0.81797790 0.36799727 +vt 0.83386319 0.97025846 +vt 0.83386319 0.88792515 +vt 0.83386319 0.91648631 +vt 0.83386319 0.94083799 +vt 0.83386319 0.95926088 +vt 0.83412329 0.20994936 +vt 0.83416684 3.6870220e-2 +vt 0.83419309 3.6920153e-2 +vt 0.83423664 0.20999929 +vt 0.83901092 0.32004379 +vt 0.83901092 0.35928465 +vt 0.83903088 0.32003598 +vt 0.83903088 0.35927684 +vt 0.85803797 0.27124334 +vt 0.85803797 0.40808511 +vt 0.85805793 0.27123552 +vt 0.85805793 0.40807729 +vt 0.86675840 0.29229631 +vt 0.86675840 0.38703213 +vt 0.86677836 0.29228850 +vt 0.86677836 0.38702432 +vt 0.87604164 0.20995991 +vt 0.87608518 3.6880766e-2 +vt 0.87611144 3.6909607e-2 +vt 0.87615498 0.20998875 +vt 0.90599926 0.29229631 +vt 0.90599926 0.38703213 +vt 0.90601922 0.29228850 +vt 0.90601922 0.38702432 +vt 0.91471969 0.27124334 +vt 0.91471969 0.40808511 +vt 0.91473965 0.27123552 +vt 0.91473965 0.40807729 +vt 0.91795998 0.20997045 +vt 0.91800353 3.6891312e-2 +vt 0.91802978 3.6899061e-2 +vt 0.91807333 0.20997820 +vt 0.93374674 0.32004379 +vt 0.93374674 0.35928465 +vt 0.93376670 0.35927684 +vt 0.93376670 0.32003598 +vt 0.94455372 0.50313019 +vt 0.94455372 0.60764439 +vt 0.95290102 0.71488855 +vt 0.95290102 0.74582110 +vt 0.95290102 0.85981891 +vt 0.95290102 0.88792616 +vt 0.95385355 0.66361684 +vt 0.95385355 0.46924611 +vt 0.95479971 0.31132337 +vt 0.95479971 0.36800508 +vt 0.95481967 0.36799727 +vt 0.95481967 0.31131555 +vt 0.95987833 0.20998100 +vt 0.95992188 3.6901858e-2 +vt 0.95994813 3.6888515e-2 +vt 0.95999168 0.20996766 +vt 0.98245470 0.74440845 +vt 0.98245470 0.85840626 +vt 0.98340723 0.49879909 +vt 0.98340723 0.63410854 +vn -0.29238382 0.45344559 0.84196128 +vn -0.36700100 -0.36700100 0.85476344 +vn 0.36700100 -0.36700100 0.85476344 +vn 0.29238382 0.45344559 0.84196128 +vn -0.90974471 -0.29330602 0.29383012 +vn -0.90787904 0.29251952 0.30031314 +vn -0.90473325 0.31990038 -0.28128543 +vn -0.92430334 -0.26009715 -0.27930773 +vn -0.35306591 0.85229024 0.38593499 +vn 0.35306591 0.85229024 0.38593499 +vn 0.26136826 0.92840526 -0.26410282 +vn -0.26136826 0.92840526 -0.26410282 +vn -0.40715876 -0.30560932 -0.86071173 +vn -0.35195148 0.44369019 -0.82417788 +vn 0.35195148 0.44369019 -0.82417788 +vn 0.40715876 -0.30560932 -0.86071173 +vn 0.90787904 0.29251952 0.30031314 +vn 0.90974471 -0.29330602 0.29383012 +vn 0.92430334 -0.26009715 -0.27930773 +vn 0.90473325 0.31990038 -0.28128543 +vn 0.36600909 -0.85421071 0.36927146 +vn -0.36600909 -0.85421071 0.36927146 +vn -0.37490916 -0.85213056 -0.36512549 +vn 0.37490916 -0.85213056 -0.36512549 +vn 0.25968834 0.62694312 -0.73450956 +vn -0.25968834 0.62694312 -0.73450956 +vn -0.62694312 0.25968834 -0.73450956 +vn -0.62694312 -0.25968834 -0.73450956 +vn -0.25968834 -0.62694312 -0.73450956 +vn 0.25968834 -0.62694312 -0.73450956 +vn -0.52043288 -0.28463419 -0.80506707 +vn -0.52043288 0.28463419 -0.80506707 +vn 0.25968834 0.62694312 -0.73450956 +vn -0.25968834 0.62694312 -0.73450956 +vn 0.52043288 0.28463419 -0.80506707 +vn 0.52043288 -0.28463419 -0.80506707 +vn -0.25968834 -0.62694312 -0.73450956 +vn 0.25968834 -0.62694312 -0.73450956 +vn 0.62694312 -0.25968834 -0.73450956 +vn 0.62694312 0.25968834 -0.73450956 +vn 0.18760181 -0.45291083 -0.87159471 +vn -0.18760181 -0.45291083 -0.87159471 +vn -0.45291083 -0.18760181 -0.87159471 +vn -0.45291083 0.18760181 -0.87159471 +vn -0.18760181 0.45291083 -0.87159471 +vn 0.18760181 0.45291083 -0.87159471 +vn 0.45291083 0.18760181 -0.87159471 +vn 0.45291083 -0.18760181 -0.87159471 +vn 0.18760181 -0.45291083 -0.87159471 +vn -0.18760181 -0.45291083 -0.87159471 +vn -0.45291083 -0.18760181 -0.87159471 +vn -0.45291083 0.18760181 -0.87159471 +vn -0.18760181 0.45291083 -0.87159471 +vn 0.18760181 0.45291083 -0.87159471 +vn 0.45291083 0.18760181 -0.87159471 +vn 0.45291083 -0.18760181 -0.87159471 +vn 0.24879480 -0.60064378 -0.75982117 +vn -0.24879480 -0.60064378 -0.75982117 +vn -0.60064378 -0.24879480 -0.75982117 +vn -0.60064378 0.24879480 -0.75982117 +vn -0.24879480 0.60064378 -0.75982117 +vn 0.24879480 0.60064378 -0.75982117 +vn 0.60064378 0.24879480 -0.75982117 +vn 0.60064378 -0.24879480 -0.75982117 +vn 0.24879480 -0.60064378 -0.75982117 +vn -0.24879480 -0.60064378 -0.75982117 +vn -0.60064378 -0.24879480 -0.75982117 +vn -0.60064378 0.24879480 -0.75982117 +vn -0.24879480 0.60064378 -0.75982117 +vn 0.24879480 0.60064378 -0.75982117 +vn 0.60064378 0.24879480 -0.75982117 +vn 0.60064378 -0.24879480 -0.75982117 +vn 0.34919364 0.84302802 0.40910580 +vn -0.34919364 0.84302802 0.40910580 +vn -0.84302802 0.34919364 0.40910580 +vn -0.84302802 -0.34919364 0.40910580 +vn -0.34919364 -0.84302802 0.40910580 +vn 0.34919364 -0.84302802 0.40910580 +vn -4.6089339e-2 -0.64852621 0.75979572 +vn -4.6089339e-2 0.64852621 0.75979572 +vn 0.34919364 0.84302802 0.40910580 +vn -0.34919364 0.84302802 0.40910580 +vn 4.6089339e-2 0.64852621 0.75979572 +vn 4.6089339e-2 -0.64852621 0.75979572 +vn -0.34919364 -0.84302802 0.40910580 +vn 0.34919364 -0.84302802 0.40910580 +vn 0.84302802 -0.34919364 0.40910580 +vn 0.84302802 0.34919364 0.40910580 +vn 0.18214321 0.43973261 0.87946522 +vn -0.18214321 0.43973261 0.87946522 +vn -0.43973261 0.18214321 0.87946522 +vn -0.43973261 -0.18214321 0.87946522 +vn -0.18214321 -0.43973261 0.87946522 +vn 0.18214321 -0.43973261 0.87946522 +vn 0.43973261 -0.18214321 0.87946522 +vn 0.43973261 0.18214321 0.87946522 +vn 0.18214321 0.43973261 0.87946522 +vn -0.18214321 0.43973261 0.87946522 +vn -0.43973261 0.18214321 0.87946522 +vn -0.43973261 -0.18214321 0.87946522 +vn -0.18214321 -0.43973261 0.87946522 +vn 0.18214321 -0.43973261 0.87946522 +vn 0.43973261 -0.18214321 0.87946522 +vn 0.43973261 0.18214321 0.87946522 +vn -0.30087977 0.61024613 0.73285130 +vn 0.30087977 0.61024613 0.73285130 +vn 0.35323715 0.88878122 -0.29204700 +vn -0.35323715 0.88878122 -0.29204700 +vn -0.79952898 -2.5301766e-3 0.60062219 +vn 0.79952898 -2.5301749e-3 0.60062218 +vn -0.44956192 0.86760445 -0.21250082 +vn 0.44956192 0.86760445 -0.21250082 +vn 0.44841919 0.87689717 0.17312303 +vn -0.44841919 0.87689717 0.17312303 +vn -0.45012948 0.56883410 -0.68833947 +vn 0.45012948 0.56883410 -0.68833947 +vn 0.45438023 0.75771904 -0.46840202 +vn -0.45438023 0.75771904 -0.46840202 +vn -0.44777837 0.84499465 0.29236719 +vn 0.44777837 0.84499465 0.29236719 +vn 0.44977192 0.89312480 -5.7716013e-3 +vn -0.44977192 0.89312480 -5.7716008e-3 +vn -0.44807130 0.42391246 -0.78710249 +vn 0.44807130 0.42391246 -0.78710249 +vn 0.44859008 -0.73954925 0.50183050 +vn -0.44859008 -0.73954925 0.50183050 +vn -0.44794387 -0.80710333 0.38461734 +vn 0.44794387 -0.80710333 0.38461734 +vn 0.45424036 -0.56694378 0.68719753 +vn -0.45424036 -0.56694378 0.68719753 +g shark_shark +usemtl shark +s 1 +f 1/97/1 6/80/6 5/79/5 2/96/2 +f 1/97/1 105/156/105 9/98/9 +f 2/96/2 3/208/3 4/209/4 1/97/1 +f 2/96/2 5/79/5 22/95/22 +f 2/96/2 22/95/22 21/207/21 3/208/3 +f 3/208/3 18/221/18 17/222/17 4/209/4 +f 4/209/4 106/165/106 105/156/105 1/97/1 +f 5/72/5 79/63/79 31/37/31 8/29/8 +f 6/3/6 9/7/9 12/8/12 7/4/7 +f 6/73/6 80/64/80 79/63/79 5/72/5 +f 7/224/7 14/206/14 13/205/13 8/223/8 +f 7/31/7 32/38/32 80/64/80 6/73/6 +f 8/1/8 23/5/23 22/6/22 5/2/5 +f 8/29/8 31/37/31 32/38/32 7/31/7 +f 9/98/9 6/80/6 1/97/1 +f 9/7/9 105/17/105 108/18/108 12/8/12 +f 10/35/10 17/43/17 20/44/20 11/36/11 +f 10/210/10 106/165/106 4/209/4 +f 11/99/11 15/105/15 14/206/14 12/211/12 +f 11/36/11 107/28/107 106/27/106 10/35/10 +f 12/211/12 14/206/14 7/224/7 +f 12/8/12 108/18/108 107/28/107 11/36/11 +f 13/205/13 23/212/23 8/223/8 +f 14/206/14 15/105/15 16/106/16 13/205/13 +f 15/105/15 20/82/20 19/81/19 16/106/16 +f 16/106/16 24/100/24 23/212/23 13/205/13 +f 17/222/17 10/210/10 4/209/4 +f 17/75/17 83/66/83 35/40/35 20/32/20 +f 18/42/18 21/34/21 24/33/24 19/41/19 +f 18/74/18 84/65/84 83/66/83 17/75/17 +f 19/81/19 24/100/24 16/106/16 +f 19/30/19 36/39/36 84/65/84 18/74/18 +f 20/82/20 15/105/15 11/99/11 +f 20/32/20 35/40/35 36/39/36 19/30/19 +f 21/207/21 18/221/18 3/208/3 +f 22/6/22 23/5/23 24/33/24 21/34/21 +f 25/138/25 42/130/42 41/114/41 26/110/26 +f 25/200/25 73/199/73 80/219/80 32/220/32 +f 26/110/26 41/114/41 48/94/48 27/86/27 +f 26/188/26 74/187/74 73/199/73 25/200/25 +f 27/86/27 48/94/48 47/93/47 28/85/28 +f 27/172/27 75/171/75 74/187/74 26/188/26 +f 28/85/28 47/93/47 46/113/46 29/109/29 +f 28/150/28 76/149/76 75/171/75 27/172/27 +f 29/109/29 46/113/46 45/129/45 30/137/30 +f 29/134/29 77/133/77 76/149/76 28/150/28 +f 30/137/30 45/129/45 44/145/44 31/153/31 +f 30/118/30 78/117/78 77/133/77 29/134/29 +f 31/153/31 44/145/44 43/146/43 32/154/32 +f 31/90/31 79/89/79 78/117/78 30/118/30 +f 32/154/32 43/146/43 42/130/42 25/138/25 +f 33/108/33 50/112/50 49/128/49 34/136/34 +f 33/185/33 81/186/81 88/170/88 40/169/40 +f 34/136/34 49/128/49 56/144/56 35/152/35 +f 34/197/34 82/198/82 81/186/81 33/185/33 +f 35/152/35 56/144/56 55/143/55 36/151/36 +f 35/217/35 83/218/83 82/198/82 34/197/34 +f 36/151/36 55/143/55 54/127/54 37/135/37 +f 37/135/37 54/127/54 53/111/53 38/107/38 +f 37/115/37 85/116/85 84/88/84 36/87/36 +f 38/107/38 53/111/53 52/91/52 39/84/39 +f 38/131/38 86/132/86 85/116/85 37/115/37 +f 39/84/39 52/91/52 51/92/51 40/83/40 +f 39/147/39 87/148/87 86/132/86 38/131/38 +f 40/83/40 51/92/51 50/112/50 33/108/33 +f 40/169/40 88/170/88 87/148/87 39/147/39 +f 41/114/41 57/122/57 64/104/64 48/94/48 +f 42/130/42 58/126/58 57/122/57 41/114/41 +f 43/146/43 59/142/59 58/126/58 42/130/42 +f 44/145/44 60/141/60 59/142/59 43/146/43 +f 45/129/45 61/125/61 60/141/60 44/145/44 +f 46/113/46 62/121/62 61/125/61 45/129/45 +f 47/93/47 63/103/63 62/121/62 46/113/46 +f 48/94/48 64/104/64 63/103/63 47/93/47 +f 49/128/49 65/124/65 72/140/72 56/144/56 +f 50/112/50 66/120/66 65/124/65 49/128/49 +f 51/92/51 67/101/67 66/120/66 50/112/50 +f 52/91/52 68/102/68 67/101/67 51/92/51 +f 53/111/53 69/119/69 68/102/68 52/91/52 +f 54/127/54 70/123/70 69/119/69 53/111/53 +f 55/143/55 71/139/71 70/123/70 54/127/54 +f 56/144/56 72/140/72 71/139/71 55/143/55 +f 58/126/58 59/142/59 60/141/60 61/125/61 62/121/62 63/103/63 64/104/64 57/122/57 +f 66/120/66 67/101/67 68/102/68 69/119/69 70/123/70 71/139/71 72/140/72 65/124/65 +f 73/196/73 89/192/89 96/203/96 80/215/80 +f 74/180/74 90/184/90 89/192/89 73/196/73 +f 75/163/75 91/176/91 90/184/90 74/180/74 +f 76/162/76 92/175/92 91/176/91 75/163/75 +f 77/179/77 93/183/93 92/175/92 76/162/76 +f 78/195/78 94/191/94 93/183/93 77/179/77 +f 79/216/79 95/204/95 94/191/94 78/195/78 +f 81/178/81 97/182/97 104/174/104 88/161/88 +f 82/194/82 98/190/98 97/182/97 81/178/81 +f 83/214/83 99/202/99 98/190/98 82/194/82 +f 85/193/85 101/189/101 100/201/100 84/213/84 +f 86/177/86 102/181/102 101/189/101 85/193/85 +f 87/160/87 103/173/103 102/181/102 86/177/86 +f 88/161/88 104/174/104 103/173/103 87/160/87 +f 90/184/90 91/176/91 92/175/92 93/183/93 94/191/94 95/204/95 96/203/96 89/192/89 +f 95/204/95 79/216/79 80/215/80 96/203/96 +f 98/190/98 99/202/99 100/201/100 101/189/101 102/181/102 103/173/103 104/174/104 97/182/97 +f 99/202/99 83/214/83 84/213/84 100/201/100 +f 105/60/105 130/61/130 126/68/126 127/71/127 109/77/109 119/69/119 114/62/114 122/58/122 111/56/111 118/52/118 115/49/115 123/47/123 108/45/108 +f 106/165/106 129/166/129 130/157/130 105/156/105 +f 107/78/107 124/76/124 116/70/116 117/67/117 112/59/112 121/57/121 113/53/113 120/50/120 110/46/110 128/48/128 125/51/125 129/54/129 106/55/106 +f 108/18/108 123/16/123 124/26/124 107/28/107 +f 109/155/109 127/159/127 128/168/128 110/164/110 +f 110/23/110 120/21/120 119/11/119 109/13/109 +f 112/22/112 117/24/117 118/14/118 111/12/111 +f 113/19/113 114/9/114 119/11/119 120/21/120 +f 113/19/113 121/20/121 122/10/122 114/9/114 +f 116/25/116 124/26/124 123/16/123 115/15/115 +f 118/14/118 117/24/117 116/25/116 115/15/115 +f 122/10/122 121/20/121 112/22/112 111/12/111 +f 126/158/126 130/157/130 129/166/129 125/167/125 +f 128/168/128 127/159/127 126/158/126 125/167/125 diff --git a/res/models/ships/shark/shark.png b/res/models/ships/shark/shark.png new file mode 100644 index 0000000..6ea44b5 Binary files /dev/null and b/res/models/ships/shark/shark.png differ diff --git a/res/models/shots/rocket_fat.mtl b/res/models/shots/rocket_fat.mtl new file mode 100644 index 0000000..2f45f85 --- /dev/null +++ b/res/models/shots/rocket_fat.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl rocket_fat_auv +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd rocket_fat.png + diff --git a/res/models/shots/rocket_fat.obj b/res/models/shots/rocket_fat.obj new file mode 100644 index 0000000..587f014 --- /dev/null +++ b/res/models/shots/rocket_fat.obj @@ -0,0 +1,228 @@ +# Exported from Wings 3D 1.4.1 +mtllib rocket_fat.mtl +o rocket_fat +#43 vertices, 43 faces +v 0.55914646 -2.3905325e-4 -0.22969640 +v 0.27957323 0.48399598 -0.22969640 +v -0.27957323 0.48399598 -0.22969640 +v -0.55914646 -2.3905325e-4 -0.22969640 +v -0.27957323 -0.48447409 -0.22969640 +v 0.27957323 -0.48447409 -0.22969640 +v 0.23036834 0.39877062 -0.82969640 +v 0.46073668 -2.3905325e-4 -0.82969640 +v 0.23036834 -0.39924872 -0.82969640 +v -0.23036834 -0.39924872 -0.82969640 +v -0.46073668 -2.3905325e-4 -0.82969640 +v -0.23036834 0.39877062 -0.82969640 +v 0.44027280 -2.3905325e-4 0.37030360 +v 0.22013640 0.38104838 0.37030360 +v -0.22013640 0.38104838 0.37030360 +v -0.44027280 -2.3905325e-4 0.37030360 +v -0.22013640 -0.38152648 0.37030360 +v 0.22013640 -0.38152648 0.37030360 +v -1.1231246e-16 -2.3905325e-4 -1.42969640 +v 0.45327027 0.15122738 -0.13668841 +v 0.35780891 0.31657130 -0.13668841 +v 0.31679908 0.24554019 0.27729561 +v 0.37125061 0.15122738 0.27729561 +v -0.35780891 0.31657130 -0.13668841 +v -0.45327027 0.15122738 -0.13668841 +v -0.37125061 0.15122738 0.27729561 +v -0.31679908 0.24554019 0.27729561 +v -9.5461358e-2 -0.46851584 -0.13668841 +v 9.5461358e-2 -0.46851584 -0.13668841 +v 5.4451530e-2 -0.39748473 0.27729561 +v -5.4451530e-2 -0.39748473 0.27729561 +v -8.7633527e-2 -0.83697321 0.18639037 +v 8.7633527e-2 -0.83697321 0.18639037 +v 5.4451530e-2 -0.84068306 0.60037438 +v -5.4451530e-2 -0.84068306 0.60037438 +v -0.68081627 0.49402088 0.18639037 +v -0.76844980 0.34223516 0.18639037 +v -0.75507162 0.37282654 0.60037438 +v -0.70062009 0.46713936 0.60037438 +v 0.76844980 0.34223516 0.18639037 +v 0.68081627 0.49402088 0.18639037 +v 0.70062009 0.46713936 0.60037438 +v 0.75507162 0.37282654 0.60037438 +vt 1.8094707e-2 0.31926714 +vt 1.9519439e-2 0.32017007 +vt 4.5376702e-2 2.2576842e-2 +vt 4.5421939e-2 2.1374624e-2 +vt 9.9079118e-2 0.27348985 +vt 0.11341294 0.58463550 +vt 0.11369462 0.58585698 +vt 0.12613448 7.0866030e-2 +vt 0.14395469 0.69594580 +vt 0.14409955 0.69588557 +vt 0.14415900 0.69583581 +vt 0.16072769 0.86755827 +vt 0.16075228 0.86746575 +vt 0.16081265 0.86750388 +vt 0.17858301 0.25669308 +vt 0.18162683 7.2333743e-2 +vt 0.25532982 0.28983862 +vt 0.25542021 0.28875410 +vt 0.26507498 3.4567653e-2 +vt 0.26507884 3.2868622e-2 +vt 0.28181506 0.51465606 +vt 0.28248641 0.51565351 +vt 0.32501825 0.98754405 +vt 0.32511931 0.98746449 +vt 0.32516241 0.98746747 +vt 0.32805685 0.25163998 +vt 0.33381580 7.0952969e-2 +vt 0.33936607 0.81283175 +vt 0.33944787 0.81292633 +vt 0.33947012 0.81283972 +vt 0.36512050 0.80056878 +vt 0.36558309 0.80164942 +vt 0.38318602 0.81396811 +vt 0.38323567 0.81388948 +vt 0.38352861 0.81387247 +vt 0.39130551 0.98891270 +vt 0.39137915 0.98891303 +vt 0.39163496 0.98897719 +vt 0.39402478 7.0881126e-2 +vt 0.39865440 0.25157830 +vt 0.44799973 0.51485222 +vt 0.44863305 0.51563075 +vt 0.46568562 3.4463893e-2 +vt 0.46607826 3.3491687e-2 +vt 0.47531293 0.28867904 +vt 0.47574380 0.28975905 +vt 0.54905946 7.2534363e-2 +vt 0.55260358 0.25633696 +vt 0.55985530 0.87481705 +vt 0.55991172 0.87458733 +vt 0.56002025 0.87516982 +vt 0.58236534 0.70362532 +vt 0.58260727 0.70389449 +vt 0.58313015 0.70429529 +vt 0.60468563 7.1158079e-2 +vt 0.60551640 0.81188945 +vt 0.61695521 0.58404519 +vt 0.61744167 0.58581754 +vt 0.63229996 0.27322448 +vt 0.68552088 2.1520061e-2 +vt 0.68583201 2.2576842e-2 +vt 0.69691036 0.65359047 +vt 0.69691036 0.97018843 +vt 0.70754711 0.32044389 +vt 0.70794634 0.32129042 +vt 0.87969828 0.65359047 +vt 0.87969828 0.97018843 +vt 0.90754097 1.1472884e-2 +vt 0.90793426 1.1818698e-2 +vt 0.90838914 1.1162916e-2 +vt 0.91061257 0.21492605 +vt 0.91100585 0.21527187 +vt 0.91146074 0.21461609 +vt 0.92403856 0.61452105 +vt 0.92423810 0.38681858 +vt 0.92443185 0.61486686 +vt 0.92463139 0.38716439 +vt 0.92488673 0.61421108 +vt 0.92508627 0.38650861 +vt 0.96925180 0.61456067 +vt 0.96945133 0.38685820 +vt 0.96964509 0.61490648 +vt 0.96984462 0.38720401 +vt 0.97009997 0.61425070 +vt 0.97029950 0.38654823 +vt 0.97109224 0.81188945 +vt 0.98337811 0.21498982 +vt 0.98377139 0.21533563 +vt 0.98422628 0.21467985 +vt 0.98680627 1.1542344e-2 +vt 0.98719956 1.1888158e-2 +vt 0.98765444 1.1232376e-2 +vn 0.99205528 0.11434549 5.2454074e-2 +vn 0.59505374 0.80197233 5.2454074e-2 +vn -0.59505374 0.80197233 5.2454074e-2 +vn -0.99205528 0.11434549 5.2454074e-2 +vn -0.39700154 -0.91631782 5.2454074e-2 +vn 0.39700154 -0.91631782 5.2454074e-2 +vn 0.45767681 0.79271950 -0.40265089 +vn 0.91535363 -1.4485211e-16 -0.40265089 +vn 0.45767681 -0.79271950 -0.40265089 +vn -0.45767681 -0.79271950 -0.40265089 +vn -0.91535363 2.0923082e-16 -0.40265089 +vn -0.45767681 0.79271950 -0.40265089 +vn 0.85016591 0.16361451 0.50044802 +vn 0.56677727 0.65445802 0.50044802 +vn -0.56677727 0.65445802 0.50044802 +vn -0.85016591 0.16361451 0.50044802 +vn -0.28338864 -0.81807253 0.50044802 +vn 0.28338864 -0.81807253 0.50044802 +vn -1.3192670e-16 1.0024617e-16 -1.00000000 +vn 0.98110035 0.15296296 -0.11850925 +vn 0.62301998 0.77317635 -0.11850925 +vn 0.31481495 0.73837475 0.59640110 +vn 0.79685877 -9.6549636e-2 0.59640110 +vn -0.62301998 0.77317635 -0.11850925 +vn -0.98110035 0.15296296 -0.11850925 +vn -0.79685877 -9.6549636e-2 0.59640110 +vn -0.31481495 0.73837475 0.59640110 +vn -0.35808037 -0.92613930 -0.11850925 +vn 0.35808037 -0.92613930 -0.11850925 +vn 0.48204382 -0.64182512 0.59640110 +vn -0.48204382 -0.64182512 0.59640110 +vn -0.49662161 -0.79958496 -0.33768457 +vn 0.49662161 -0.79958496 -0.33768457 +vn 0.72261903 -0.25661239 0.64185032 +vn -0.72261903 -0.25661239 0.64185032 +vn -0.44415009 0.82987941 -0.33768457 +vn -0.94077169 -3.0294445e-2 -0.33768457 +vn -0.58354236 -0.49750024 0.64185032 +vn 0.13907667 0.75411263 0.64185032 +vn 0.94077169 -3.0294445e-2 -0.33768457 +vn 0.44415009 0.82987941 -0.33768457 +vn -0.13907667 0.75411263 0.64185032 +vn 0.58354236 -0.49750024 0.64185032 +g rocket_fat_rocket_fat_auv +usemtl rocket_fat_auv +s 1 +f 1/65/1 8/58/8 7/42/7 2/46/2 +f 1/2/1 13/4/13 18/20/18 6/18/6 +f 1/65/1 20/59/20 23/55/23 13/61/13 +f 2/46/2 7/42/7 12/22/12 3/17/3 +f 2/46/2 21/48/21 20/59/20 1/65/1 +f 3/17/3 12/22/12 11/7/11 4/1/4 +f 3/17/3 15/19/15 14/43/14 2/46/2 +f 3/17/3 24/15/24 27/16/27 15/19/15 +f 4/64/4 11/57/11 10/41/10 5/45/5 +f 4/1/4 25/5/25 24/15/24 3/17/3 +f 5/45/5 10/41/10 9/21/9 6/18/6 +f 5/45/5 17/44/17 16/60/16 4/64/4 +f 5/45/5 28/40/28 31/39/31 17/44/17 +f 6/18/6 9/21/9 8/6/8 1/2/1 +f 6/18/6 29/26/29 28/40/28 5/45/5 +f 7/42/7 19/32/19 12/22/12 +f 8/58/8 19/32/19 7/42/7 +f 9/21/9 19/31/19 8/6/8 +f 10/41/10 19/31/19 9/21/9 +f 11/57/11 19/31/19 10/41/10 +f 12/22/12 19/32/19 11/7/11 +f 13/61/13 23/55/23 22/47/22 14/43/14 +f 14/67/14 15/63/15 16/56/16 17/62/17 18/66/18 13/86/13 +f 14/43/14 22/47/22 21/48/21 2/46/2 +f 15/19/15 27/16/27 26/8/26 16/3/16 +f 16/3/16 26/8/26 25/5/25 4/1/4 +f 17/44/17 31/39/31 30/27/30 18/20/18 +f 18/20/18 30/27/30 29/26/29 6/18/6 +f 20/24/20 40/12/40 43/9/43 23/28/23 +f 21/91/21 41/88/41 40/72/40 20/69/20 +f 22/33/22 42/52/42 41/50/41 21/38/21 +f 23/76/23 43/77/43 42/83/42 22/82/22 +f 24/23/24 36/13/36 39/11/39 27/29/27 +f 25/90/25 37/87/37 36/71/36 24/68/24 +f 26/34/26 38/53/38 37/49/37 25/37/25 +f 27/74/27 39/75/39 38/81/38 26/80/26 +f 28/25/28 32/14/32 35/10/35 31/30/31 +f 29/92/29 33/89/33 32/73/32 28/70/28 +f 30/35/30 34/54/34 33/51/33 29/36/29 +f 31/78/31 35/79/35 34/85/34 30/84/30 +f 33/89/33 34/85/34 35/79/35 32/73/32 +f 37/87/37 38/81/38 39/75/39 36/71/36 +f 41/88/41 42/83/42 43/77/43 40/72/40 diff --git a/res/models/shots/rocket_fat.png b/res/models/shots/rocket_fat.png new file mode 100644 index 0000000..6b99bb0 Binary files /dev/null and b/res/models/shots/rocket_fat.png differ diff --git a/res/models/shots/rocket_thin.mtl b/res/models/shots/rocket_thin.mtl new file mode 100644 index 0000000..2f45f85 --- /dev/null +++ b/res/models/shots/rocket_thin.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 1.4.1 +newmtl rocket_fat_auv +Ns 100.0 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 1.0 1.0 1.0 +Ks 1.0 1.0 1.0 +Ke 0.0 0.0 0.0 +map_Kd rocket_fat.png + diff --git a/res/models/shots/rocket_thin.obj b/res/models/shots/rocket_thin.obj new file mode 100644 index 0000000..ccc9cf2 --- /dev/null +++ b/res/models/shots/rocket_thin.obj @@ -0,0 +1,228 @@ +# Exported from Wings 3D 1.4.1 +mtllib rocket_thin.mtl +o rocket_thin +#43 vertices, 43 faces +v 0.20800248 -2.3905325e-4 -0.22969640 +v 0.10400124 0.17989638 -0.22969640 +v -0.10400124 0.17989638 -0.22969640 +v -0.20800248 -2.3905325e-4 -0.22969640 +v -0.10400124 -0.18037449 -0.22969640 +v 0.10400124 -0.18037449 -0.22969640 +v 8.5697022e-2 0.14819254 -0.82969640 +v 0.17139404 -2.3905325e-4 -0.82969640 +v 8.5697022e-2 -0.14867065 -0.82969640 +v -8.5697022e-2 -0.14867065 -0.82969640 +v -0.17139404 -2.3905325e-4 -0.82969640 +v -8.5697022e-2 0.14819254 -0.82969640 +v 0.16378148 -2.3905325e-4 0.37030360 +v 8.1890741e-2 0.14159987 0.37030360 +v -8.1890741e-2 0.14159987 0.37030360 +v -0.16378148 -2.3905325e-4 0.37030360 +v -8.1890741e-2 -0.14207798 0.37030360 +v 8.1890741e-2 -0.14207798 0.37030360 +v -1.1960945e-16 -2.3905325e-4 -1.42969640 +v 0.16861654 5.6106459e-2 -0.13668841 +v 0.13310492 0.11761440 -0.13668841 +v 0.11784926 9.1190827e-2 0.27729561 +v 0.13810523 5.6106459e-2 0.27729561 +v -0.13310492 0.11761440 -0.13668841 +v -0.16861654 5.6106459e-2 -0.13668841 +v -0.13810523 5.6106459e-2 0.27729561 +v -0.11784926 9.1190827e-2 0.27729561 +v -3.5511625e-2 -0.17443802 -0.13668841 +v 3.5511625e-2 -0.17443802 -0.13668841 +v 2.0255969e-2 -0.14801445 0.27729561 +v -2.0255969e-2 -0.14801445 0.27729561 +v -3.2599672e-2 -0.31150416 0.18639037 +v 3.2599672e-2 -0.31150416 0.18639037 +v 2.0255969e-2 -0.31288422 0.60037438 +v -2.0255969e-2 -0.31288422 0.60037438 +v -0.25326365 0.18362564 0.18639037 +v -0.28586332 0.12716135 0.18639037 +v -0.28088664 0.13854135 0.60037438 +v -0.26063067 0.17362572 0.60037438 +v 0.28586332 0.12716135 0.18639037 +v 0.25326365 0.18362564 0.18639037 +v 0.26063067 0.17362572 0.60037438 +v 0.28088664 0.13854135 0.60037438 +vt 1.8094707e-2 0.31926714 +vt 1.9519439e-2 0.32017007 +vt 4.5376702e-2 2.2576842e-2 +vt 4.5421939e-2 2.1374624e-2 +vt 9.9079118e-2 0.27348985 +vt 0.11341294 0.58463550 +vt 0.11369462 0.58585698 +vt 0.12613448 7.0866030e-2 +vt 0.14395469 0.69594580 +vt 0.14409955 0.69588557 +vt 0.14415900 0.69583581 +vt 0.16072769 0.86755827 +vt 0.16075228 0.86746575 +vt 0.16081265 0.86750388 +vt 0.17858301 0.25669308 +vt 0.18162683 7.2333743e-2 +vt 0.25532982 0.28983862 +vt 0.25542021 0.28875410 +vt 0.26507498 3.4567653e-2 +vt 0.26507884 3.2868622e-2 +vt 0.28181506 0.51465606 +vt 0.28248641 0.51565351 +vt 0.32501825 0.98754405 +vt 0.32511931 0.98746449 +vt 0.32516241 0.98746747 +vt 0.32805685 0.25163998 +vt 0.33381580 7.0952969e-2 +vt 0.33936607 0.81283175 +vt 0.33944787 0.81292633 +vt 0.33947012 0.81283972 +vt 0.36512050 0.80056878 +vt 0.36558309 0.80164942 +vt 0.38318602 0.81396811 +vt 0.38323567 0.81388948 +vt 0.38352861 0.81387247 +vt 0.39130551 0.98891270 +vt 0.39137915 0.98891303 +vt 0.39163496 0.98897719 +vt 0.39402478 7.0881126e-2 +vt 0.39865440 0.25157830 +vt 0.44799973 0.51485222 +vt 0.44863305 0.51563075 +vt 0.46568562 3.4463893e-2 +vt 0.46607826 3.3491687e-2 +vt 0.47531293 0.28867904 +vt 0.47574380 0.28975905 +vt 0.54905946 7.2534363e-2 +vt 0.55260358 0.25633696 +vt 0.55985530 0.87481705 +vt 0.55991172 0.87458733 +vt 0.56002025 0.87516982 +vt 0.58236534 0.70362532 +vt 0.58260727 0.70389449 +vt 0.58313015 0.70429529 +vt 0.60468563 7.1158079e-2 +vt 0.60551640 0.81188945 +vt 0.61695521 0.58404519 +vt 0.61744167 0.58581754 +vt 0.63229996 0.27322448 +vt 0.68552088 2.1520061e-2 +vt 0.68583201 2.2576842e-2 +vt 0.69691036 0.65359047 +vt 0.69691036 0.97018843 +vt 0.70754711 0.32044389 +vt 0.70794634 0.32129042 +vt 0.87969828 0.65359047 +vt 0.87969828 0.97018843 +vt 0.90754097 1.1472884e-2 +vt 0.90793426 1.1818698e-2 +vt 0.90838914 1.1162916e-2 +vt 0.91061257 0.21492605 +vt 0.91100585 0.21527187 +vt 0.91146074 0.21461609 +vt 0.92403856 0.61452105 +vt 0.92423810 0.38681858 +vt 0.92443185 0.61486686 +vt 0.92463139 0.38716439 +vt 0.92488673 0.61421108 +vt 0.92508627 0.38650861 +vt 0.96925180 0.61456067 +vt 0.96945133 0.38685820 +vt 0.96964509 0.61490648 +vt 0.96984462 0.38720401 +vt 0.97009997 0.61425070 +vt 0.97029950 0.38654823 +vt 0.97109224 0.81188945 +vt 0.98337811 0.21498982 +vt 0.98377139 0.21533563 +vt 0.98422628 0.21467985 +vt 0.98680627 1.1542344e-2 +vt 0.98719956 1.1888158e-2 +vt 0.98765444 1.1232376e-2 +vn 0.99321060 0.11465678 1.9660328e-2 +vn 0.59590098 0.80281722 1.9660328e-2 +vn -0.59590098 0.80281722 1.9660328e-2 +vn -0.99321060 0.11465678 1.9660328e-2 +vn -0.39730962 -0.91747400 1.9660328e-2 +vn 0.39730962 -0.91747400 1.9660328e-2 +vn 0.49278507 0.85352878 -0.16926755 +vn 0.98557014 -4.8117928e-17 -0.16926755 +vn 0.49278507 -0.85352878 -0.16926755 +vn -0.49278507 -0.85352878 -0.16926755 +vn -0.98557014 2.5662895e-16 -0.16926755 +vn -0.49278507 0.85352878 -0.16926755 +vn 0.89511788 0.17226552 0.41120380 +vn 0.59674526 0.68906207 0.41120380 +vn -0.59674526 0.68906207 0.41120380 +vn -0.89511788 0.17226552 0.41120380 +vn -0.29837263 -0.86132758 0.41120380 +vn 0.29837263 -0.86132758 0.41120380 +vn -8.9292169e-16 3.8525870e-16 -1.00000000 +vn 0.97956028 0.18612524 -7.6282700e-2 +vn 0.65096932 0.75526147 -7.6282700e-2 +vn 0.25975621 0.88323785 0.39040699 +vn 0.89478452 -0.21666345 0.39040699 +vn -0.65096932 0.75526147 -7.6282700e-2 +vn -0.97956028 0.18612524 -7.6282700e-2 +vn -0.89478452 -0.21666345 0.39040699 +vn -0.25975621 0.88323785 0.39040699 +vn -0.32859096 -0.94138671 -7.6282700e-2 +vn 0.32859096 -0.94138671 -7.6282700e-2 +vn 0.63502831 -0.66657440 0.39040699 +vn -0.63502831 -0.66657440 0.39040699 +vn -0.46539995 -0.86881310 -0.16901682 +vn 0.46539995 -0.86881310 -0.16901682 +vn 0.89922551 -4.6369968e-2 0.43502105 +vn -0.89922551 -4.6369968e-2 0.43502105 +vn -0.51971424 0.83745473 -0.16901682 +vn -0.98511419 3.1358367e-2 -0.16901682 +vn -0.48977032 -0.75556715 0.43502105 +vn 0.40945518 0.80193712 0.43502105 +vn 0.98511419 3.1358367e-2 -0.16901682 +vn 0.51971424 0.83745473 -0.16901682 +vn -0.40945518 0.80193712 0.43502105 +vn 0.48977032 -0.75556715 0.43502105 +g rocket_thin_rocket_fat_auv +usemtl rocket_fat_auv +s 1 +f 1/65/1 8/58/8 7/42/7 2/46/2 +f 1/2/1 13/4/13 18/20/18 6/18/6 +f 1/65/1 20/59/20 23/55/23 13/61/13 +f 2/46/2 7/42/7 12/22/12 3/17/3 +f 2/46/2 21/48/21 20/59/20 1/65/1 +f 3/17/3 12/22/12 11/7/11 4/1/4 +f 3/17/3 15/19/15 14/43/14 2/46/2 +f 3/17/3 24/15/24 27/16/27 15/19/15 +f 4/64/4 11/57/11 10/41/10 5/45/5 +f 4/1/4 25/5/25 24/15/24 3/17/3 +f 5/45/5 10/41/10 9/21/9 6/18/6 +f 5/45/5 17/44/17 16/60/16 4/64/4 +f 5/45/5 28/40/28 31/39/31 17/44/17 +f 6/18/6 9/21/9 8/6/8 1/2/1 +f 6/18/6 29/26/29 28/40/28 5/45/5 +f 7/42/7 19/32/19 12/22/12 +f 8/58/8 19/32/19 7/42/7 +f 9/21/9 19/31/19 8/6/8 +f 10/41/10 19/31/19 9/21/9 +f 11/57/11 19/31/19 10/41/10 +f 12/22/12 19/32/19 11/7/11 +f 13/61/13 23/55/23 22/47/22 14/43/14 +f 14/67/14 15/63/15 16/56/16 17/62/17 18/66/18 13/86/13 +f 14/43/14 22/47/22 21/48/21 2/46/2 +f 15/19/15 27/16/27 26/8/26 16/3/16 +f 16/3/16 26/8/26 25/5/25 4/1/4 +f 17/44/17 31/39/31 30/27/30 18/20/18 +f 18/20/18 30/27/30 29/26/29 6/18/6 +f 20/24/20 40/12/40 43/9/43 23/28/23 +f 21/91/21 41/88/41 40/72/40 20/69/20 +f 22/33/22 42/52/42 41/50/41 21/38/21 +f 23/76/23 43/77/43 42/83/42 22/82/22 +f 24/23/24 36/13/36 39/11/39 27/29/27 +f 25/90/25 37/87/37 36/71/36 24/68/24 +f 26/34/26 38/53/38 37/49/37 25/37/25 +f 27/74/27 39/75/39 38/81/38 26/80/26 +f 28/25/28 32/14/32 35/10/35 31/30/31 +f 29/92/29 33/89/33 32/73/32 28/70/28 +f 30/35/30 34/54/34 33/51/33 29/36/29 +f 31/78/31 35/79/35 34/85/34 30/84/30 +f 33/89/33 34/85/34 35/79/35 32/73/32 +f 37/87/37 38/81/38 39/75/39 36/71/36 +f 41/88/41 42/83/42 43/77/43 40/72/40 diff --git a/res/sounds/effect/appear.ogg b/res/sounds/effect/appear.ogg new file mode 100644 index 0000000..ae2342f Binary files /dev/null and b/res/sounds/effect/appear.ogg differ diff --git a/res/sounds/effect/beep-des-leveldown.ogg b/res/sounds/effect/beep-des-leveldown.ogg new file mode 100644 index 0000000..ff3242b Binary files /dev/null and b/res/sounds/effect/beep-des-leveldown.ogg differ diff --git a/res/sounds/effect/beep-des-levelup.ogg b/res/sounds/effect/beep-des-levelup.ogg new file mode 100644 index 0000000..e6370cf Binary files /dev/null and b/res/sounds/effect/beep-des-levelup.ogg differ diff --git a/res/sounds/effect/beep-des-repair.ogg b/res/sounds/effect/beep-des-repair.ogg new file mode 100644 index 0000000..6004461 Binary files /dev/null and b/res/sounds/effect/beep-des-repair.ogg differ diff --git a/res/sounds/effect/beep-popup.ogg b/res/sounds/effect/beep-popup.ogg new file mode 100644 index 0000000..a4bf8cd Binary files /dev/null and b/res/sounds/effect/beep-popup.ogg differ diff --git a/res/sounds/effect/beep-slow1.ogg b/res/sounds/effect/beep-slow1.ogg new file mode 100644 index 0000000..e226347 Binary files /dev/null and b/res/sounds/effect/beep-slow1.ogg differ diff --git a/res/sounds/effect/beep-slow2.ogg b/res/sounds/effect/beep-slow2.ogg new file mode 100644 index 0000000..599c0c4 Binary files /dev/null and b/res/sounds/effect/beep-slow2.ogg differ diff --git a/res/sounds/effect/beep-soft-short.ogg b/res/sounds/effect/beep-soft-short.ogg new file mode 100644 index 0000000..8a9cf6b Binary files /dev/null and b/res/sounds/effect/beep-soft-short.ogg differ diff --git a/res/sounds/effect/beep-soft.ogg b/res/sounds/effect/beep-soft.ogg new file mode 100644 index 0000000..9471138 Binary files /dev/null and b/res/sounds/effect/beep-soft.ogg differ diff --git a/res/sounds/effect/click1.ogg b/res/sounds/effect/click1.ogg new file mode 100644 index 0000000..1121ae4 Binary files /dev/null and b/res/sounds/effect/click1.ogg differ diff --git a/res/sounds/effect/click2.ogg b/res/sounds/effect/click2.ogg new file mode 100644 index 0000000..712f439 Binary files /dev/null and b/res/sounds/effect/click2.ogg differ diff --git a/res/sounds/effect/explode1.ogg b/res/sounds/effect/explode1.ogg new file mode 100644 index 0000000..ef0a776 Binary files /dev/null and b/res/sounds/effect/explode1.ogg differ diff --git a/res/sounds/effect/explode2.ogg b/res/sounds/effect/explode2.ogg new file mode 100644 index 0000000..af6cc8b Binary files /dev/null and b/res/sounds/effect/explode2.ogg differ diff --git a/res/sounds/effect/explode3.ogg b/res/sounds/effect/explode3.ogg new file mode 100644 index 0000000..b47f6c3 Binary files /dev/null and b/res/sounds/effect/explode3.ogg differ diff --git a/res/sounds/effect/explode4.ogg b/res/sounds/effect/explode4.ogg new file mode 100644 index 0000000..1b7a180 Binary files /dev/null and b/res/sounds/effect/explode4.ogg differ diff --git a/res/sounds/effect/explode5.ogg b/res/sounds/effect/explode5.ogg new file mode 100644 index 0000000..437f412 Binary files /dev/null and b/res/sounds/effect/explode5.ogg differ diff --git a/res/sounds/effect/powerdown.ogg b/res/sounds/effect/powerdown.ogg new file mode 100644 index 0000000..646b4c9 Binary files /dev/null and b/res/sounds/effect/powerdown.ogg differ diff --git a/res/sounds/effect/powerup.ogg b/res/sounds/effect/powerup.ogg new file mode 100644 index 0000000..34312c3 Binary files /dev/null and b/res/sounds/effect/powerup.ogg differ diff --git a/res/sounds/effect/powerup2.ogg b/res/sounds/effect/powerup2.ogg new file mode 100644 index 0000000..0a204d3 Binary files /dev/null and b/res/sounds/effect/powerup2.ogg differ diff --git a/res/sounds/effect/shield-hit.ogg b/res/sounds/effect/shield-hit.ogg new file mode 100644 index 0000000..0d88d35 Binary files /dev/null and b/res/sounds/effect/shield-hit.ogg differ diff --git a/res/sounds/effect/shield-loop.ogg b/res/sounds/effect/shield-loop.ogg new file mode 100644 index 0000000..40b9251 Binary files /dev/null and b/res/sounds/effect/shield-loop.ogg differ diff --git a/res/sounds/effect/shot-emp-sparks.ogg b/res/sounds/effect/shot-emp-sparks.ogg new file mode 100644 index 0000000..9c19101 Binary files /dev/null and b/res/sounds/effect/shot-emp-sparks.ogg differ diff --git a/res/sounds/effect/shot-emp.ogg b/res/sounds/effect/shot-emp.ogg new file mode 100644 index 0000000..7192ce9 Binary files /dev/null and b/res/sounds/effect/shot-emp.ogg differ diff --git a/res/sounds/effect/shot-fireball1.ogg b/res/sounds/effect/shot-fireball1.ogg new file mode 100644 index 0000000..3b04ca0 Binary files /dev/null and b/res/sounds/effect/shot-fireball1.ogg differ diff --git a/res/sounds/effect/shot-fireball2.ogg b/res/sounds/effect/shot-fireball2.ogg new file mode 100644 index 0000000..dd6fcac Binary files /dev/null and b/res/sounds/effect/shot-fireball2.ogg differ diff --git a/res/sounds/effect/shot-gun1.ogg b/res/sounds/effect/shot-gun1.ogg new file mode 100644 index 0000000..fb98c2a Binary files /dev/null and b/res/sounds/effect/shot-gun1.ogg differ diff --git a/res/sounds/effect/shot-gun2.ogg b/res/sounds/effect/shot-gun2.ogg new file mode 100644 index 0000000..4e56075 Binary files /dev/null and b/res/sounds/effect/shot-gun2.ogg differ diff --git a/res/sounds/effect/shot-gun3.ogg b/res/sounds/effect/shot-gun3.ogg new file mode 100644 index 0000000..135af4e Binary files /dev/null and b/res/sounds/effect/shot-gun3.ogg differ diff --git a/res/sounds/effect/shot-laser-acid.ogg b/res/sounds/effect/shot-laser-acid.ogg new file mode 100644 index 0000000..f27ea3c Binary files /dev/null and b/res/sounds/effect/shot-laser-acid.ogg differ diff --git a/res/sounds/effect/shot-laser.ogg b/res/sounds/effect/shot-laser.ogg new file mode 100644 index 0000000..ee0300b Binary files /dev/null and b/res/sounds/effect/shot-laser.ogg differ diff --git a/res/sounds/effect/shot-phaser.ogg b/res/sounds/effect/shot-phaser.ogg new file mode 100644 index 0000000..8a0e320 Binary files /dev/null and b/res/sounds/effect/shot-phaser.ogg differ diff --git a/res/sounds/effect/shot-plasma1.ogg b/res/sounds/effect/shot-plasma1.ogg new file mode 100644 index 0000000..fca6648 Binary files /dev/null and b/res/sounds/effect/shot-plasma1.ogg differ diff --git a/res/sounds/effect/shot-plasma2.ogg b/res/sounds/effect/shot-plasma2.ogg new file mode 100644 index 0000000..66379a6 Binary files /dev/null and b/res/sounds/effect/shot-plasma2.ogg differ diff --git a/res/sounds/effect/shot-rocket.ogg b/res/sounds/effect/shot-rocket.ogg new file mode 100644 index 0000000..deacea8 Binary files /dev/null and b/res/sounds/effect/shot-rocket.ogg differ diff --git a/res/sounds/effect/shutter.ogg b/res/sounds/effect/shutter.ogg new file mode 100644 index 0000000..c54d622 Binary files /dev/null and b/res/sounds/effect/shutter.ogg differ diff --git a/res/sounds/effect/timer-end.ogg b/res/sounds/effect/timer-end.ogg new file mode 100644 index 0000000..44e052b Binary files /dev/null and b/res/sounds/effect/timer-end.ogg differ diff --git a/res/sounds/effect/timer-loop.ogg b/res/sounds/effect/timer-loop.ogg new file mode 100644 index 0000000..85d0e2d Binary files /dev/null and b/res/sounds/effect/timer-loop.ogg differ diff --git a/res/sounds/music/cosmic-journey.ogg b/res/sounds/music/cosmic-journey.ogg new file mode 100644 index 0000000..7928b4c Binary files /dev/null and b/res/sounds/music/cosmic-journey.ogg differ diff --git a/res/sounds/music/dust-loop.ogg b/res/sounds/music/dust-loop.ogg new file mode 100644 index 0000000..4bd73e3 Binary files /dev/null and b/res/sounds/music/dust-loop.ogg differ diff --git a/res/sounds/music/intro-nosplash.ogg b/res/sounds/music/intro-nosplash.ogg new file mode 100644 index 0000000..19380ec Binary files /dev/null and b/res/sounds/music/intro-nosplash.ogg differ diff --git a/res/sounds/music/intro.ogg b/res/sounds/music/intro.ogg new file mode 100644 index 0000000..9d295de Binary files /dev/null and b/res/sounds/music/intro.ogg differ diff --git a/res/sounds/music/random-loop.ogg b/res/sounds/music/random-loop.ogg new file mode 100644 index 0000000..aa8ea5c Binary files /dev/null and b/res/sounds/music/random-loop.ogg differ diff --git a/src/com/porcupine/color/HSV.java b/src/com/porcupine/color/HSV.java new file mode 100644 index 0000000..3be4cee --- /dev/null +++ b/src/com/porcupine/color/HSV.java @@ -0,0 +1,151 @@ +package com.porcupine.color; + + +import java.awt.Color; + +import com.porcupine.math.Calc; + + +/** + * HSV color + * + * @author MightyPork + */ +public class HSV { + + /** H */ + public double h; + /** S */ + public double s; + /** V */ + public double v; + + /** + * Create black color 0,0,0 + */ + public HSV() {} + + /** + * Color from HSV 0-1 + * + * @param h + * @param s + * @param v + */ + public HSV(Number h, Number s, Number v) { + this.h = h.doubleValue(); + this.s = s.doubleValue(); + this.v = v.doubleValue(); + norm(); + } + + /** + * @return hue 0-1 + */ + public double h() { + return h; + } + + /** + * @return saturation 0-1 + */ + public double s() { + return s; + } + + /** + * @return value/brightness 0-1 + */ + public double v() { + return v; + } + + /** + * Set color to other color + * + * @param copied copied color + * @return this + */ + public HSV setTo(HSV copied) { + + h = copied.h; + s = copied.s; + v = copied.v; + + norm(); + return this; + } + + /** + * Set to H,S,V 0-1 + * + * @param h hue + * @param s saturation + * @param v value + * @return this + */ + public HSV setTo(Number h, Number s, Number v) { + this.h = h.doubleValue(); + this.s = s.doubleValue(); + this.v = v.doubleValue(); + norm(); + return this; + } + + /** + * Fix numbers out of range 0-1 + */ + public void norm() { + h = Calc.clampd(h, 0, 1); + s = Calc.clampd(s, 0, 1); + v = Calc.clampd(v, 0, 1); + } + + /** + * Convert to RGB + * + * @return RGB representation + */ + public RGB toRGB() { + + int rgb = Color.HSBtoRGB((float) h, (float) s, (float) v); + + return RGB.fromHex(rgb); + } + + /** + * Make from RGB + * + * @param color RGB + * @return HSV + */ + public static HSV fromRGB(RGB color) { + return color.toHSV(); + } + + @Override + public String toString() { + return "HSV[" + h + ";" + s + ";" + v + "]"; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (!(obj instanceof HSV)) return false; + return ((HSV) obj).h == h && ((HSV) obj).s == s && ((HSV) obj).v == v; + } + + @Override + public int hashCode() { + return Double.valueOf(h).hashCode() ^ Double.valueOf(s).hashCode() ^ Double.valueOf(v).hashCode(); + } + + /** + * Get a copy + * + * @return copy + */ + public HSV copy() { + return new HSV().setTo(this); + } +} diff --git a/src/com/porcupine/color/RGB.java b/src/com/porcupine/color/RGB.java new file mode 100644 index 0000000..6652c7b --- /dev/null +++ b/src/com/porcupine/color/RGB.java @@ -0,0 +1,334 @@ +package com.porcupine.color; + + +import java.awt.Color; + +import com.porcupine.math.Calc; + + +/** + * RGB color + * + * @author MightyPork + */ +public class RGB { + + /** White */ + public static final RGB WHITE = new RGB(1, 1, 1); + /** Black */ + public static final RGB BLACK = new RGB(0, 0, 0); + /** Red */ + public static final RGB RED = new RGB(1, 0, 0); + /** Lime green */ + public static final RGB GREEN = new RGB(0, 1, 0); + /** Blue */ + public static final RGB BLUE = new RGB(0, 0, 1); + /** Yellow */ + public static final RGB YELLOW = new RGB(1, 1, 0); + /** Purple */ + public static final RGB PURPLE = new RGB(1, 0, 1); + /** Cyan */ + public static final RGB CYAN = new RGB(0, 1, 1); + /** orange */ + public static final RGB ORANGE = new RGB(1, 0.6, 0); + + /** R */ + public double r; + /** G */ + public double g; + /** B */ + public double b; + /** ALPHA */ + public double a = 1; + + /** + * Create black color 0,0,0 + */ + public RGB() {} + + /** + * Get copy with custom alpha + * + * @param alpha alpha to set + * @return copy w/ alpha + */ + public RGB setAlpha(double alpha) { + return copy().setAlpha_ip(alpha); + } + + /** + * set alpha IP + * + * @param alpha alpha to set + * @return this + */ + public RGB setAlpha_ip(double alpha) { + a = alpha; + norm(); + return this; + } + + /** + * Get copy. + * + * @return copy + */ + public RGB copy() { + return new RGB(r, g, b, a); + } + + /** + * Get copy with alpha multiplied by custom value + * + * @param alpha alpha to set + * @return copy w/ alpha + */ + public RGB mulAlpha(double alpha) { + return copy().mulAlpha_ip(alpha); + } + + /** + * Multiply alpha by given number + * + * @param alpha alpha multiplier + * @return this + */ + public RGB mulAlpha_ip(double alpha) { + a *= alpha; + norm(); + return this; + } + + /** + * Color from RGB 0-1 + * + * @param r red + * @param g green + * @param b blue + */ + public RGB(Number r, Number g, Number b) { + this.r = r.doubleValue(); + this.g = g.doubleValue(); + this.b = b.doubleValue(); + norm(); + } + + /** + * Color from RGB 0-1 + * + * @param r red + * @param g green + * @param b blue + * @param a alpha + */ + public RGB(Number r, Number g, Number b, Number a) { + this.r = r.doubleValue(); + this.g = g.doubleValue(); + this.b = b.doubleValue(); + this.a = a.doubleValue(); + norm(); + } + + /** + * Color from hex 0xRRGGBB + * + * @param hex hex integer + */ + public RGB(int hex) { + setTo(RGB.fromHex(hex)); + norm(); + } + + /** + * Color from hex 0xRRGGBB + * + * @param hex hex integer + * @param alpha alpha color + */ + public RGB(int hex, double alpha) { + setTo(RGB.fromHex(hex)); + a = alpha; + norm(); + } + + /** + * Color from other RGB and alpha channel + * + * @param color other RGB color + * @param alpha new alpha channel + */ + public RGB(RGB color, double alpha) { + setTo(color); + setAlpha_ip(alpha); + } + + /** + * @return red channel 0-1 + */ + public double r() { + return r; + } + + /** + * @return green channel 0-1 + */ + public double g() { + return g; + } + + /** + * @return blue channel 0-1 + */ + public double b() { + return b; + } + + /** + * @return alpha 0-1 + */ + public double a() { + return a; + } + + /** + * Set color to other color + * + * @param copied copied color + * @return this + */ + public RGB setTo(RGB copied) { + + r = copied.r; + g = copied.g; + b = copied.b; + a = copied.a; + + norm(); + return this; + } + + /** + * Set to represent hex color + * + * @param hex hex integer RRGGBB + * @return this + */ + public RGB setTo(int hex) { + setTo(RGB.fromHex(hex)); + norm(); + return this; + } + + /** + * Set to R,G,B 0-1 + * + * @param r red + * @param g green + * @param b blue + * @param a alpha + * @return this + */ + public RGB setTo(Number r, Number g, Number b, Number a) { + this.r = r.doubleValue(); + this.g = g.doubleValue(); + this.b = b.doubleValue(); + this.a = a.doubleValue(); + norm(); + return this; + } + + /** + * Set to R,G,B 0-1 + * + * @param r red + * @param g green + * @param b blue + * @return this + */ + public RGB setTo(Number r, Number g, Number b) { + this.r = r.doubleValue(); + this.g = g.doubleValue(); + this.b = b.doubleValue(); + this.a = 1; + norm(); + return this; + } + + /** + * Fix numbers out of range 0-1 + * + * @return this + */ + public RGB norm() { + r = Calc.clampd(r, 0, 1); + g = Calc.clampd(g, 0, 1); + b = Calc.clampd(b, 0, 1); + a = Calc.clampd(a, 0, 1); + return this; + } + + /** + * Get hex value 0xRRGGBB + * + * @return hex value RRGGBB + */ + public int getHex() { + int ri = (int) Math.round(r * 255); + int gi = (int) Math.round(g * 255); + int bi = (int) Math.round(b * 255); + return (ri << 16) | (gi << 8) | bi; + } + + /** + * Convert to HSV + * + * @return HSV representation + */ + public HSV toHSV() { + float[] hsv = { 0, 0, 0 }; + Color.RGBtoHSB((int) (r * 255), (int) (g * 255), (int) (b * 255), hsv); + return new HSV(hsv[0], hsv[1], hsv[2]); + } + + /** + * Create color from hex 0xRRGGBB + * + * @param hex hex RRGGBB + * @return the new color + */ + public static RGB fromHex(int hex) { + int bi = hex & 0xff; + int gi = (hex >> 8) & 0xff; + int ri = (hex >> 16) & 0xff; + return new RGB(ri / 255D, gi / 255D, bi / 255D); + } + + + /** + * Make from HSV + * + * @param color HSV color + * @return RGB + */ + public static RGB fromHSV(HSV color) { + return color.toRGB(); + } + + @Override + public String toString() { + return "RGB[" + r + ";" + g + ";" + b + ";" + a + "]"; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (!(obj instanceof RGB)) return false; + return ((RGB) obj).r == r && ((RGB) obj).g == g && ((RGB) obj).b == b && ((RGB) obj).a == a; + } + + @Override + public int hashCode() { + return Double.valueOf(r).hashCode() ^ Double.valueOf(g).hashCode() ^ Double.valueOf(b).hashCode() ^ Double.valueOf(a).hashCode(); + } + +} diff --git a/src/com/porcupine/coord/Coord.java b/src/com/porcupine/coord/Coord.java new file mode 100644 index 0000000..bba85ca --- /dev/null +++ b/src/com/porcupine/coord/Coord.java @@ -0,0 +1,684 @@ +package com.porcupine.coord; + + +import java.util.Random; + +import com.porcupine.math.Calc; + + +/** + * Coordinate class, object with three or two double coordinates.
+ * + * @author MightyPork + */ +public class Coord { + /** Zero Coord */ + public static final Coord ZERO = new Coord(0, 0); + /** RNG */ + protected static Random rand = new Random(); + /** X coordinate */ + public double x = 0; + + /** Y coordinate */ + public double y = 0; + + /** Z coordinate */ + public double z = 0; + + /** + * Create zero coord + */ + public Coord() {} + + /** + * Create 2D coord + * + * @param x x coordinate + * @param y y coordinate + */ + public Coord(Number x, Number y) { + setTo(x, y); + } + + /** + * Create 3D coord + * + * @param x x coordinate + * @param y y coordinate + * @param z z coordinate + */ + public Coord(Number x, Number y, Number z) { + setTo(x, y, z); + } + + /** + * Create coord as a copy of another + * + * @param copied copied coord + */ + public Coord(Coord copied) { + this.x = copied.x; + this.y = copied.y; + this.z = copied.z; + } + + /** + * Convert X and Y coordinates of this coord to a new CoordI. + * + * @return the new CoordI + */ + public CoordI toCoordI() { + return new CoordI((int) Math.round(x), (int) Math.round(y)); + } + + /** + * Generate random coord (gaussian) + * + * @param max max distance from 0 + * @return new coord + */ + public static Coord random(double max) { + return new Coord(Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2), Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2), + Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2)); + } + + /** + * Generate random coord (min-max) + * + * @param min min offset + * @param max max offset + * @return new coord + */ + public static Coord random(double min, double max) { + return new Coord((rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min)), (rand.nextBoolean() ? -1 : 1) + * (min + rand.nextDouble() * (max - min)), (rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min))); + } + + /** + * offset randomly in place + * + * @param max max +- offset + * @return this + */ + public Coord random_offset_ip(double max) { + return add(random(max)); + } + + /** + * offset randomly in place + * + * @param min min offset + * @param max max offset + * @return this + */ + public Coord random_offset_ip(double min, double max) { + add(random(min, max)); + return this; + } + + /** + * offset randomly + * + * @param max max +- offset + * @return offset coord + */ + public Coord random_offset(double max) { + Coord r = random(1); + Vec v = new Vec(r); + v.norm_ip(0.00001 + rand.nextDouble() * max); + return copy().add_ip(v); + } + + /** + * offset randomly + * + * @param min min offset + * @param max max offset + * @return offset coord + */ + public Coord random_offset(double min, double max) { + return copy().add_ip(random(min, max)); + } + + /** + * @return X as double + */ + public double x() { + return x; + } + + /** + * @return Y as double + */ + public double y() { + return y; + } + + /** + * @return Z as double + */ + public double z() { + return z; + } + + /** + * @return X as double + */ + public double xd() { + return x; + } + + /** + * @return Y as double + */ + public double yd() { + return y; + } + + /** + * @return Z as double + */ + public double zd() { + return z; + } + + /** + * @return X as double + */ + public float xf() { + return (float) x; + } + + /** + * @return Y as double + */ + public float yf() { + return (float) y; + } + + /** + * @return Z as double + */ + public float zf() { + return (float) z; + } + + + /** + * @return X as double + */ + public int xi() { + return (int) Math.round(x); + } + + /** + * @return Y as double + */ + public int yi() { + return (int) Math.round(y); + } + + /** + * @return Z as double + */ + public int zi() { + return (int) Math.round(z); + } + + /** + * Set 3D coordinates to + * + * @param x x coordinate + * @param y y coordinate + * @param z z coordinate + * @return this + */ + public Coord setTo(Number x, Number y, Number z) { + this.x = x.doubleValue(); + this.y = y.doubleValue(); + this.z = z.doubleValue(); + return this; + } + + /** + * Set 2D coordinates to + * + * @param x x coordinate + * @param y y coordinate + * @return this + */ + public Coord setTo(Number x, Number y) { + setTo(x, y, 0); + return this; + } + + /** + * Set coordinates to match other coord + * + * @param copied coord whose coordinates are used + * @return this + */ + public Coord setTo(Coord copied) { + setTo(copied.x, copied.y, copied.z); + return this; + } + + /** + * Set X coordinate in place + * + * @param x x coordinate + * @return this + */ + public Coord setX_ip(Number x) { + this.x = x.doubleValue(); + return this; + } + + /** + * Set Y coordinate in place + * + * @param y y coordinate + * @return this + */ + public Coord setY_ip(Number y) { + this.y = y.doubleValue(); + return this; + } + + /** + * Set Z coordinate in place + * + * @param z z coordinate + * @return this + */ + public Coord setZ_ip(Number z) { + this.z = z.doubleValue(); + return this; + } + + /** + * Set X coordinate in a copy + * + * @param x x coordinate + * @return copy with set coordinate + */ + public Coord setX(Number x) { + return copy().setX_ip(x); + } + + /** + * Set Y coordinate in a copy + * + * @param y y coordinate + * @return copy with set coordinate + */ + public Coord setY(Number y) { + return copy().setY_ip(y); + } + + /** + * Set Z coordinate in a copy + * + * @param z z coordinate + * @return copy with set coordinate + */ + public Coord setZ(Number z) { + return copy().setZ_ip(z); + } + + + + /** + * Get a copy subtracted by 3D coordinate + * + * @param x x offset + * @param y y offset + * @param z z offset + * @return the offset copy + */ + public Coord sub(Number x, Number y, Number z) { + return copy().sub_ip(x, y, z); + } + + /** + * Get a copy subtracted by 2D coordinate + * + * @param x x offset + * @param y y offset + * @return the offset copy + */ + public Coord sub(Number x, Number y) { + return copy().sub_ip(x, y); + } + + /** + * Get a copy subtracted by vector + * + * @param vec offset + * @return the offset copy + */ + public Coord sub(Coord vec) { + return copy().sub_ip(vec); + } + + /** + * Offset by 3D coordinate in place + * + * @param x x offset + * @param y y offset + * @param z z offset + * @return this + */ + public Coord sub_ip(Number x, Number y, Number z) { + this.x -= x.doubleValue(); + this.y -= y.doubleValue(); + this.z -= z.doubleValue(); + return this; + } + + /** + * Offset by 2D coordinate in place + * + * @param x x offset + * @param y y offset + * @return this + */ + public Coord sub_ip(Number x, Number y) { + this.x -= x.doubleValue(); + this.y -= y.doubleValue(); + return this; + } + + /** + * Offset by vector in place + * + * @param vec offset + * @return this + */ + public Coord sub_ip(Coord vec) { + this.x -= vec.x; + this.y -= vec.y; + this.z -= vec.z; + return this; + } + + /** + * Get a copy offset by 3D coordinate + * + * @param x x offset + * @param y y offset + * @param z z offset + * @return the offset copy + */ + public Coord add(Number x, Number y, Number z) { + return copy().add_ip(x, y, z); + } + + /** + * Get a copy offset by 2D coordinate + * + * @param x x offset + * @param y y offset + * @return the offset copy + */ + public Coord add(Number x, Number y) { + return copy().add_ip(x, y); + } + + /** + * Get a copy offset by vector + * + * @param vec offset + * @return the offset copy + */ + public Coord add(Coord vec) { + return copy().add_ip(vec); + } + + /** + * Offset by 3D coordinate in place + * + * @param x x offset + * @param y y offset + * @param z z offset + * @return this + */ + public Coord add_ip(Number x, Number y, Number z) { + this.x += x.doubleValue(); + this.y += y.doubleValue(); + this.z += z.doubleValue(); + return this; + } + + /** + * Offset by 2D coordinate in place + * + * @param x x offset + * @param y y offset + * @return this + */ + public Coord add_ip(Number x, Number y) { + this.x += x.doubleValue(); + this.y += y.doubleValue(); + return this; + } + + /** + * Offset by vector in place + * + * @param vec offset + * @return this + */ + public Coord add_ip(Coord vec) { + this.x += vec.x; + this.y += vec.y; + this.z += vec.z; + return this; + } + + /** + * @return copy of this vector + */ + public Coord copy() { + return new Coord(x, y, z); + } + + + /** + * Get distance to other point + * + * @param point other point + * @return distance in units + */ + public double distTo(Coord point) { + return Math.sqrt((point.x - x) * (point.x - x) + (point.y - y) * (point.y - y) + (point.z - z) * (point.z - z)); + } + + /** + * Create vector from this point to other point + * + * @param point second point + * @return vector + */ + public Vec vecTo(Coord point) { + return (Vec) (new Vec(point)).add(new Vec(this).neg()); + } + + /** + * Get distance to other point + * + * @param a point a + * @param b point b + * @return distance in units + */ + public static double dist(Coord a, Coord b) { + return a.distTo(b); + } + + /** + * Get middle of line to other point + * + * @param other other point + * @return middle + */ + public Coord midTo(Coord other) { + return add(vecTo(other).scale(0.5)); + } + + private Coord last; + private Vec offs; + + /** + * Store current value as LAST + */ + public void pushLast() { + if (last == null) last = new Coord(); + if (offs == null) offs = new Vec(); + last.setTo(this); + } + + /** + * Apply coordinates change for delta time + */ + public void update() { + if (last == null) last = new Coord(); + if (offs == null) offs = new Vec(); + offs = last.vecTo(this); + } + + /** + * Get coordinate at delta time since LAST + * + * @param delta delta time 0-1 + * @return delta pos + */ + public Coord getDelta(double delta) { + if (last == null) last = new Coord(); + if (offs == null) offs = new Vec(); + return new Coord(this.add(offs.scale(delta))); + } + + @Override + public String toString() { + return "[ " + x + " ; " + y + " ; " + z + " ]"; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (!obj.getClass().isAssignableFrom(Vec.class)) return false; + Vec other = (Vec) obj; + return x == other.x && y == other.y && z == other.z; + } + + @Override + public int hashCode() { + return Double.valueOf(x).hashCode() ^ Double.valueOf(y).hashCode() ^ Double.valueOf(z).hashCode(); + } + + /** + * Multiply by number + * + * @param d number + * @return multiplied copy + */ + public Coord mul(double d) { + return copy().mul_ip(d); + } + + /** + * Multiply by number in place + * + * @param d multiplier + * @return this + */ + public Coord mul_ip(double d) { + x *= d; + y *= d; + z *= d; + return this; + } + + /** + * Multiply coords by number + * + * @param xd x multiplier + * @param yd y multiplier + * @param zd z multiplier + * @return multiplied copy + */ + public Coord mul(double xd, double yd, double zd) { + return copy().mul_ip(xd, yd, zd); + } + + /** + * Multiply coords by number in place + * + * @param xd x multiplier + * @param yd y multiplier + * @param zd z multiplier + * @return this + */ + public Coord mul_ip(double xd, double yd, double zd) { + x *= xd; + y *= yd; + z *= zd; + return this; + } + + /** + * Divide by number in place + * + * @param d number to divide by + * @return this + */ + public Coord div_ip(double d) { + x /= d; + y /= d; + z /= d; + return this; + } + + /** + * Get copy divided by number + * + * @param d number to divide by + * @return divided copy + */ + public Coord div(double d) { + return copy().div_ip(d); + } + + /** + * Round in place + * + * @return this + */ + public Coord round_ip() { + x = Math.round(x); + y = Math.round(y); + z = Math.round(z); + return this; + } + + + /** + * Get a copy with rounded coords + * + * @return rounded copy + */ + public Coord round() { + return copy().round_ip(); + } + + /** + * Check if this rectangle in inside a rectangular zone + * + * @param min min coord + * @param max max coord + * @return is inside + */ + public boolean isInRect(Coord min, Coord max) { + return (x >= min.x && x <= max.x) && (y >= min.y && y <= max.y) && (z >= min.z && z <= max.z); + } +} diff --git a/src/com/porcupine/coord/CoordI.java b/src/com/porcupine/coord/CoordI.java new file mode 100644 index 0000000..399394b --- /dev/null +++ b/src/com/porcupine/coord/CoordI.java @@ -0,0 +1,159 @@ +package com.porcupine.coord; + + +/** + * Simple integer coordinate class
+ * Unlike Coord, this is suitable for using in array indices etc. + * + * @author MightyPork + */ +public class CoordI { + + /** X coordinate */ + public int x = 0; + /** Y coordinate */ + public int y = 0; + + /** + * Integer 2D Coord + * + * @param x x coord + * @param y y coord + */ + public CoordI(int x, int y) { + this.x = x; + this.y = y; + } + + /** + * Create CoordI as copy of other + * + * @param other coord to copy + */ + public CoordI(CoordI other) { + setTo(other); + } + + /** + * Get copy + * + * @return copy + */ + public CoordI copy() { + return new CoordI(x, y); + } + + /** + * Set coords to + * + * @param x x coord to set + * @param y y coord to set + */ + public void setTo(int x, int y) { + this.x = x; + this.y = y; + } + + /** + * Set to coords from other coord + * + * @param other source coord + */ + public void setTo(CoordI other) { + this.x = other.x; + this.y = other.y; + } + + /** + * Convert to double Coord + * + * @return coord with X and y from this CoordI + */ + public Coord toCoord() { + return new Coord(x, y); + } + + @Override + public String toString() { + return "[ " + x + " ; " + y + " ]"; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (obj instanceof CoordI) return ((CoordI) obj).x == x && ((CoordI) obj).y == y; + return false; + } + + @Override + public int hashCode() { + return x ^ y; + } + + /** + * Add other coordI coordinates in place + * + * @param move coordI to add + * @return this + */ + public CoordI add_ip(CoordI move) { + x += move.x; + y += move.y; + return this; + } + + /** + * Subtract other coordI coordinates in place + * + * @param move coordI to subtract + * @return this + */ + public CoordI sub_ip(CoordI move) { + x -= move.x; + y -= move.y; + return this; + } + + /** + * Middle of this and other coordinate, rounded to CoordI - integers + * + * @param other other coordI + * @return middle CoordI + */ + public CoordI midTo(CoordI other) { + return new CoordI((x + other.x) / 2, (y + other.y) / 2); + } + + /** + * Subtract x,y in a copy + * + * @param x x to subtract + * @param y y to subtract + * @return copy subtracted + */ + public CoordI sub(int x, int y) { + return copy().sub_ip(new CoordI(x, y)); + } + + /** + * Subtract other coordI coordinates in a copy + * + * @param other coordI to subtract + * @return copy subtracted + */ + public CoordI sub(CoordI other) { + return copy().sub_ip(other); + } + + /** + * Add other coordI coordinates in a copy + * + * @param other coordI to add + * @return copy modified + */ + public CoordI add(CoordI other) { + return copy().add_ip(other); + } + + +} diff --git a/src/com/porcupine/coord/Rect.java b/src/com/porcupine/coord/Rect.java new file mode 100644 index 0000000..43fe3d0 --- /dev/null +++ b/src/com/porcupine/coord/Rect.java @@ -0,0 +1,291 @@ +package com.porcupine.coord; + + +import com.porcupine.math.Calc; + + +/** + * Rectangle determined by two coordinates - min and max. + * + * @author MightyPork + */ +public class Rect { + + /** Lowest coordinates xy */ + protected Coord min = new Coord(); + /** Highest coordinates xy */ + protected Coord max = new Coord(); + + /** + * New Rect + */ + public Rect() { + this(0, 0, 0, 0); + } + + /** + * New Rect + * + * @param x1 lower x + * @param y1 lower y + * @param x2 upper x + * @param y2 upper y + */ + public Rect(double x1, double y1, double x2, double y2) { + setTo(x1, y1, x2, y2); + } + + /** + * New rect of two coords + * + * @param c1 coord 1 + * @param c2 coord 2 + */ + public Rect(Coord c1, Coord c2) { + this(c1.x, c1.y, c2.x, c2.y); + } + + /** + * New rect as a copy of other rect + * + * @param r other rect + */ + public Rect(Rect r) { + this(r.min.x, r.min.y, r.max.x, r.max.y); + } + + /** + * Get a copy + * + * @return copy + */ + public Rect copy() { + return new Rect(this); + } + + /** + * Offset in place (add) + * + * @param move offset vector + * @return this + */ + public Rect add_ip(Vec move) { + min.add_ip(move); + max.add_ip(move); + return this; + } + + /** + * Get offset copy (add) + * + * @param move offset vector + * @return offset copy + */ + public Rect add(Vec move) { + return copy().add_ip(move); + } + + /** + * Offset in place (subtract) + * + * @param move offset vector + * @return this + */ + public Rect sub_ip(Vec move) { + min.sub_ip(move); + max.sub_ip(move); + return this; + } + + /** + * Get offset copy (subtract) + * + * @param move offset vector + * @return offset copy + */ + public Rect sub(Vec move) { + return copy().sub_ip(move); + } + + /** + * @return lowest coordinates xy + */ + public Coord getMin() { + return min; + } + + /** + * @return highjest coordinates xy + */ + public Coord getMax() { + return max; + } + + /** + * Check if point is inside this rectangle + * + * @param point point to test + * @return is inside + */ + public boolean isInside(Coord point) { + return Calc.inRange(point.x, min.x, max.x) && Calc.inRange(point.y, min.y, max.y); + } + + /** + * Get size (width, height) as (x,y) + * + * @return coord of width,height + */ + public Coord getSize() { + return new Coord(Math.abs(min.x - max.x), Math.abs(min.y - max.y)); + } + + /** + * Get rect center + * + * @return center + */ + public Coord getCenter() { + return min.midTo(max); + } + + /** + * Get center of the lower edge. + * + * @return center + */ + public Coord getCenterDown() { + return new Coord((max.x + min.x) / 2, min.y); + } + + /** + * Get center of the left edge. + * + * @return center + */ + public Coord getCenterLeft() { + return new Coord(min.x, (max.y + min.y) / 2); + } + + /** + * Get center of the top edge. + * + * @return center + */ + public Coord getCenterTop() { + return new Coord((max.x + min.x) / 2, max.y); + } + + /** + * Get center of the right edge. + * + * @return center + */ + public Coord getCenterRight() { + return new Coord(max.x, (max.y + min.y) / 2); + } + + /** + * @return lower x + */ + public double x1() { + return min.x; + } + + /** + * @return lower y + */ + public double y1() { + return min.y; + } + + /** + * @return upper x + */ + public double x2() { + return max.x; + } + + /** + * @return upper y + */ + public double y2() { + return max.y; + } + + /** + * Set to other rect's coordinates + * + * @param r other rect + */ + public void setTo(Rect r) { + min.setTo(r.min); + max.setTo(r.max); + } + + + /** + * Set to coordinates + * + * @param x1 lower x + * @param y1 lower y + * @param x2 upper x + * @param y2 upper y + */ + public void setTo(double x1, double y1, double x2, double y2) { + min.x = Calc.min(x1, x2); + min.y = Calc.min(y1, y2); + max.x = Calc.max(x1, x2); + max.y = Calc.max(y1, y2); + } + + @Override + public String toString() { + return "rect{ " + min + " - " + max + " }"; + } + + /** + * Add X and Y to all coordinates in place + * + * @param x x to add + * @param y y to add + * @return this + */ + public Rect add_ip(double x, double y) { + return add_ip(new Vec(x, y)); + } + + + /** + * Subtract X and Y from all coordinates in place + * + * @param x x to subtract + * @param y y to subtract + * @return this + */ + public Rect sub_ip(double x, double y) { + return sub_ip(new Vec(x, y)); + } + + /** + * Add X and Y to all coordinates in a copy + * + * @param x x to add + * @param y y to add + * @return copy changed + */ + public Rect add(double x, double y) { + return add(new Vec(x, y)); + } + + /** + * Subtract X and Y from all coordinates in a copy + * + * @param x x to subtract + * @param y y to subtract + * @return copy changed + */ + public Rect sub(double x, double y) { + return sub(new Vec(x, y)); + } +} diff --git a/src/com/porcupine/coord/Vec.java b/src/com/porcupine/coord/Vec.java new file mode 100644 index 0000000..e879d25 --- /dev/null +++ b/src/com/porcupine/coord/Vec.java @@ -0,0 +1,279 @@ +package com.porcupine.coord; + + +/** + * Vector in 2D/3D space. + * + * @author MightyPork + */ +public class Vec extends Coord { + + /** Zero vector */ + @SuppressWarnings("hiding") + public static final Vec ZERO = new Vec(0, 0, 0); + + /** + * Create zero vector + */ + public Vec() { + super(); + } + + /** + * Create 2D vector + * + * @param x x coordinate + * @param y y coordinate + */ + public Vec(Number x, Number y) { + super(x, y); + } + + /** + * Create 3D vector + * + * @param x x coordinate + * @param y y coordinate + * @param z z coordinate + */ + public Vec(Number x, Number y, Number z) { + super(x, y, z); + } + + /** + * Create vector as a copy of another + * + * @param copied copied vector + */ + public Vec(Coord copied) { + super(copied); + } + + + + /** + * Negate all coordinates (* -1) + * + * @return negated coordinate + */ + public Vec neg() { + return copy().neg_ip(); + } + + /** + * Negate all coordinates (* -1), in place + * + * @return this + */ + public Vec neg_ip() { + scale_ip(-1); + return this; + } + + /** + * Multiply all coordinates by factor; scalar multiplication + * + * @param factor multiplier + * @return copy multiplied + */ + public Vec scale(double factor) { + return copy().scale_ip(factor); + } + + /** + * Multiply all coordinates by factor, in place + * + * @param factor multiplier + * @return this + */ + public Vec scale_ip(double factor) { + return (Vec) mul_ip(factor); + } + + /** + * Multiply by other vector, vector multiplication + * + * @param vec other vector + * @return copy multiplied + */ + public Vec cross(Vec vec) { + return copy().cross_ip(vec); + } + + /** + * Multiply by other vector, vector multiplication; in place + * + * @param vec other vector + * @return this + */ + public Vec cross_ip(Vec vec) { + setTo(y * vec.z - z * vec.y, z * vec.x - x * vec.z, x * vec.y - y * vec.x); + return this; + } + + /** + * Get dot product + * + * @param vec other vector + * @return dot product + */ + public double dot(Vec vec) { + return x * vec.x + y * vec.y + z * vec.z; + } + + /** + * Get vector size + * + * @return vector size in units + */ + public double size() { + return Math.sqrt(x * x + y * y + z * z); + } + + /** + * Scale vector to given size + * + * @param size size we need + * @return scaled vector + */ + public Vec norm(double size) { + return copy().norm_ip(size); + } + + /** + * Scale vector to given size, in place + * + * @param size size we need + * @return scaled vector + */ + public Vec norm_ip(double size) { + if (size() == 0) { + z = -1; + } + if (size == 0) { + setTo(0, 0, 0); + return this; + } + double k = size / size(); + scale_ip(k); + return this; + } + + + // STATIC + + /** + * Get vector size + * + * @param vec vector to get size of + * @return size in units + */ + public static double size(Vec vec) { + return vec.size(); + } + + /** + * Get dot product of two vectors + * + * @param a 1st vector + * @param b 2nd vector + * @return dot product + */ + public static double dot(Vec a, Vec b) { + return a.dot(b); + } + + /** + * Get cross product of two vectors + * + * @param a 1st vector + * @param b 2nd vector + * @return cross product + */ + public static Vec cross(Vec a, Vec b) { + return a.cross(b); + } + + /** + * Scale vector + * + * @param a vector + * @param scale + * @return scaled copy + */ + public static Vec scale(Vec a, double scale) { + return a.scale(scale); + } + + @Override + public Vec copy() { + return new Vec(this); + } + + /** + * Generate random coord (gaussian) + * + * @param max max distance from 0 + * @return new coord + */ + public static Vec random(double max) { + return new Vec(Coord.random(max)); + } + + /** + * Generate random coord (min-max) + * + * @param max max distance from 0 + * @return new coord + */ + public static Vec random(double min, double max) { + return new Vec(Coord.random(min, max)); + } + + /** + * offset randomly in place + * + * @param max max +- offset + * @return this + */ + @Override + public Vec random_offset_ip(double max) { + return (Vec) super.random_offset_ip(max); + } + + /** + * offset randomly in place + * + * @param min min offset + * @param max max offset + * @return this + */ + @Override + public Vec random_offset_ip(double min, double max) { + return (Vec) super.random_offset_ip(min, max); + } + + /** + * offset randomly + * + * @param max max +- offset + * @return offset coord + */ + @Override + public Vec random_offset(double max) { + return (Vec) super.random_offset(max); + } + + /** + * offset randomly + * + * @param min min offset + * @param max max offset + * @return offset coord + */ + @Override + public Vec random_offset(double min, double max) { + return (Vec) super.random_offset(min, max); + } + +} diff --git a/src/com/porcupine/ion/AbstractIonList.java b/src/com/porcupine/ion/AbstractIonList.java new file mode 100644 index 0000000..537d987 --- /dev/null +++ b/src/com/porcupine/ion/AbstractIonList.java @@ -0,0 +1,64 @@ +package com.porcupine.ion; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; + + +/** + * Ionizable Arraylist + * + * @author MightyPork + * @param + */ +public abstract class AbstractIonList extends ArrayList implements Ionizable { + + @Override + public void ionRead(InputStream in) throws IOException { + while (true) { + byte b = StreamUtils.readByte(in); + + if (b == IonMarks.ENTRY) { + T value = (T) Ion.readObject(in); + add(value); + } else if (b == IonMarks.END) { + break; + } else { + throw new RuntimeException("Unexpected mark in AbstractIonList: " + Integer.toHexString(b)); + } + } + ionReadCustomData(in); + } + + @Override + public void ionWrite(OutputStream out) throws IOException { + for (T entry : this) { + if (entry instanceof IonizableOptional && !((IonizableOptional) entry).ionShouldSave()) continue; + StreamUtils.writeByte(out, IonMarks.ENTRY); + Ion.writeObject(out, entry); + } + StreamUtils.writeByte(out, IonMarks.END); + ionWriteCustomData(out); + } + + /** + * Read custom data of this AbstractIonList implementation + * + * @param in input stream + */ + public void ionReadCustomData(InputStream in) {} + + /** + * Write custom data of this AbstractIonList implementation + * + * @param out output stream + */ + public void ionWriteCustomData(OutputStream out) {} + + + @Override + public abstract byte ionMark(); + +} diff --git a/src/com/porcupine/ion/AbstractIonMap.java b/src/com/porcupine/ion/AbstractIonMap.java new file mode 100644 index 0000000..4857726 --- /dev/null +++ b/src/com/porcupine/ion/AbstractIonMap.java @@ -0,0 +1,75 @@ +package com.porcupine.ion; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.LinkedHashMap; + + +/** + * Ionizable HashMap + * + * @author MightyPork + * @param + */ +public abstract class AbstractIonMap extends LinkedHashMap implements Ionizable { + + @Override + public V get(Object key) { + return super.get(key); + } + + @Override + public V put(String key, V value) { + return super.put(key, value); + } + + @Override + public void ionRead(InputStream in) throws IOException { + while (true) { + byte b = StreamUtils.readByte(in); + if (b == IonMarks.ENTRY) { + String key = StreamUtils.readStringBytes(in); + V value = (V) Ion.readObject(in); + put(key, value); + } else if (b == IonMarks.END) { + break; + } else { + throw new RuntimeException("Unexpected mark in IonMap: " + Integer.toHexString(b)); + } + } + ionReadCustomData(in); + } + + @Override + public void ionWrite(OutputStream out) throws IOException { + for (java.util.Map.Entry entry : entrySet()) { + StreamUtils.writeByte(out, IonMarks.ENTRY); + StreamUtils.writeStringBytes(out, entry.getKey()); + Ion.writeObject(out, entry.getValue()); + } + StreamUtils.writeByte(out, IonMarks.END); + ionWriteCustomData(out); + } + + /** + * Read custom data of this AbstractIonMap implementation + * + * @param in input stream + */ + public void ionReadCustomData(InputStream in) {} + + /** + * Write custom data of this AbstractIonMap implementation + * + * @param out output stream + */ + public void ionWriteCustomData(OutputStream out) {} + + @Override + public byte ionMark() { + return IonMarks.MAP; + } + +} diff --git a/src/com/porcupine/ion/Ion.java b/src/com/porcupine/ion/Ion.java new file mode 100644 index 0000000..6fff06d --- /dev/null +++ b/src/com/porcupine/ion/Ion.java @@ -0,0 +1,261 @@ +package com.porcupine.ion; + + +import java.io.*; +import java.util.HashMap; +import java.util.Map; + +import com.porcupine.math.Calc; + + +/** + * Universal data storage system + * + * @author MightyPork + */ +public class Ion { + + /** Ionizables */ + private static Map> customIonizables = new HashMap>(); + + // register default ionizables + static { + registerIonizable(IonMarks.MAP, IonMap.class); + registerIonizable(IonMarks.LIST, IonList.class); + } + + /** + * Register new Ionizable for direct reconstructing. + * + * @param mark byte mark to be used, see {@link IonMarks} for reference. + * @param objClass class of the registered Ionizable + */ + public static void registerIonizable(byte mark, Class objClass) { + if (customIonizables.containsKey(mark)) { + throw new RuntimeException("IonMark " + mark + " is already used @ " + objClass.getSimpleName()); + } + customIonizables.put(mark, objClass); + } + + + + /** + * Load Ion object from file. + * + * @param file file path + * @return the loaded object + */ + public static Object fromFile(String file) { + return fromFile(new File(file)); + } + + + /** + * Load Ion object from file. + * + * @param file file + * @return the loaded object + */ + public static Object fromFile(File file) { + try { + InputStream in = new FileInputStream(file); + + Object obj = fromStream(in); + + in.close(); + return obj; + } catch (FileNotFoundException e) { + System.err.println("Could not find ION file " + file); + return null; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Load Ion object from stream. + * + * @param in input stream + * @return the loaded object + */ + public static Object fromStream(InputStream in) { + try { + return readObject(in); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Store Ion object to file. + * + * @param path file path + * @param obj object to store + */ + public static void toFile(String path, Object obj) { + toFile(new File(path), obj); + } + + /** + * Store Ion object to file. + * + * @param path file path + * @param obj object to store + */ + public static void toFile(File path, Object obj) { + try { + String f = path.toString(); + File dir = new File(f.substring(0, f.lastIndexOf(File.separator))); + + dir.mkdirs(); + + OutputStream out = new FileOutputStream(path); + + toStream(out, obj); + + out.flush(); + out.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Store Ion object to output stream. + * + * @param out output stream * + * @param obj object to store + */ + public static void toStream(OutputStream out, Object obj) { + try { + writeObject(out, obj); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + /** + * Read single ionizable or primitive object from input stream + * + * @param in input stream + * @return the loaded object + */ + public static Object readObject(InputStream in) { + try { + int bi = in.read(); + if (bi == -1) throw new RuntimeException("Unexpected end of stream."); + byte b = (byte) bi; + if (customIonizables.containsKey(b)) { + Ionizable ion = ((Ionizable) customIonizables.get(b).newInstance()); + ion.ionRead(in); + return ion; + } + + switch (b) { + case IonMarks.BOOLEAN: + return StreamUtils.readBoolean(in); + case IonMarks.BYTE: + return StreamUtils.readByte(in); + case IonMarks.CHAR: + return StreamUtils.readChar(in); + case IonMarks.SHORT: + return StreamUtils.readShort(in); + case IonMarks.INT: + return StreamUtils.readInt(in); + case IonMarks.LONG: + return StreamUtils.readLong(in); + case IonMarks.FLOAT: + return StreamUtils.readFloat(in); + case IonMarks.DOUBLE: + return StreamUtils.readDouble(in); + case IonMarks.STRING: + String s = StreamUtils.readString(in); + return s; + default: + throw new RuntimeException("Invalid Ion mark " + Integer.toHexString(bi)); + } + + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + + + /** + * Write single ionizable or primitive object to output stream + * + * @param out output stream + * @param obj stored object + */ + public static void writeObject(OutputStream out, Object obj) { + try { + if (obj instanceof Ionizable) { + out.write(((Ionizable) obj).ionMark()); + ((Ionizable) obj).ionWrite(out); + return; + } + + if (obj instanceof Boolean) { + out.write(IonMarks.BOOLEAN); + StreamUtils.writeBoolean(out, (Boolean) obj); + return; + } + + if (obj instanceof Byte) { + out.write(IonMarks.BYTE); + StreamUtils.writeByte(out, (Byte) obj); + return; + } + + if (obj instanceof Character) { + out.write(IonMarks.CHAR); + StreamUtils.writeChar(out, (Character) obj); + return; + } + + if (obj instanceof Short) { + out.write(IonMarks.SHORT); + StreamUtils.writeShort(out, (Short) obj); + return; + } + + if (obj instanceof Integer) { + out.write(IonMarks.INT); + StreamUtils.writeInt(out, (Integer) obj); + return; + } + + if (obj instanceof Long) { + out.write(IonMarks.LONG); + StreamUtils.writeLong(out, (Long) obj); + return; + } + + if (obj instanceof Float) { + out.write(IonMarks.FLOAT); + StreamUtils.writeFloat(out, (Float) obj); + return; + } + + if (obj instanceof Double) { + out.write(IonMarks.DOUBLE); + StreamUtils.writeDouble(out, (Double) obj); + return; + } + + if (obj instanceof String) { + out.write(IonMarks.STRING); + StreamUtils.writeString(out, (String) obj); + return; + } + + throw new RuntimeException(Calc.className(obj) + " can't be stored to Ion storage."); + + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + + +} diff --git a/src/com/porcupine/ion/IonList.java b/src/com/porcupine/ion/IonList.java new file mode 100644 index 0000000..d40b998 --- /dev/null +++ b/src/com/porcupine/ion/IonList.java @@ -0,0 +1,144 @@ +package com.porcupine.ion; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; + + +/** + * Ionizable Arraylist + * + * @author MightyPork + */ +@SuppressWarnings("javadoc") +public class IonList extends ArrayList implements Ionizable { + + public boolean getBoolean(int index) { + return (Boolean) get(index); + } + + public boolean getBool(int index) { + return (Boolean) get(index); + } + + public byte getByte(int index) { + return (Byte) get(index); + } + + public char getChar(int index) { + return (Character) get(index); + } + + public char getCharacter(int index) { + return (Character) get(index); + } + + public short getShort(int index) { + return (Short) get(index); + } + + public int getInteger(int index) { + return (Integer) get(index); + } + + public int getInt(int index) { + return (Integer) get(index); + } + + public long getLong(int index) { + return (Long) get(index); + } + + public float getFloat(int index) { + return (Float) get(index); + } + + public double getDouble(int index) { + return (Double) get(index); + } + + public String getString(int index) { + return (String) get(index); + } + + @Override + public Object get(int index) { + return super.get(index); + } + + public void addBoolean(boolean num) { + add(num); + } + + public void addBool(boolean num) { + add(num); + } + + public void addByte(int num) { + add((byte) num); + } + + public void addChar(char num) { + add(num); + } + + public void addShort(int num) { + add((short) num); + } + + public void addInteger(int num) { + add(num); + } + + public void addInt(int num) { + add(num); + } + + public void addLong(long num) { + add(num); + } + + public void addFloat(double num) { + add((float) num); + } + + public void addDouble(double num) { + add(num); + } + + public void addString(String num) { + add(num); + } + + @Override + public void ionRead(InputStream in) throws IOException { + while (true) { + byte b = StreamUtils.readByte(in); + if (b == IonMarks.ENTRY) { + Object value = Ion.readObject(in); + add(value); + } else if (b == IonMarks.END) { + break; + } else { + throw new RuntimeException("Unexpected mark in IonList: " + Integer.toHexString(b)); + } + } + } + + @Override + public void ionWrite(OutputStream out) throws IOException { + for (Object entry : this) { + StreamUtils.writeByte(out, IonMarks.ENTRY); + Ion.writeObject(out, entry); + } + StreamUtils.writeByte(out, IonMarks.END); + } + + @Override + public byte ionMark() { + return IonMarks.LIST; + } + +} diff --git a/src/com/porcupine/ion/IonMap.java b/src/com/porcupine/ion/IonMap.java new file mode 100644 index 0000000..f679743 --- /dev/null +++ b/src/com/porcupine/ion/IonMap.java @@ -0,0 +1,143 @@ +package com.porcupine.ion; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + + +/** + * Ionizable HashMap + * + * @author MightyPork + */ +@SuppressWarnings("javadoc") +public class IonMap extends LinkedHashMap implements Ionizable { + + public boolean getBoolean(String key) { + return (Boolean) get(key); + } + + public boolean getBool(String key) { + return (Boolean) get(key); + } + + public byte getByte(String key) { + return (Byte) get(key); + } + + public char getChar(String key) { + return (Character) get(key); + } + + public short getShort(String key) { + return (Short) get(key); + } + + public int getInt(String key) { + return (Integer) get(key); + } + + public long getLong(String key) { + return (Long) get(key); + } + + public float getFloat(String key) { + return (Float) get(key); + } + + public double getDouble(String key) { + return (Double) get(key); + } + + public String getString(String key) { + return (String) get(key); + } + + @Override + public Object get(Object arg0) { + return super.get(arg0); + } + + public void putBoolean(String key, boolean num) { + put(key, num); + } + + public void putBool(String key, boolean num) { + put(key, num); + } + + public void putByte(String key, int num) { + put(key, (byte) num); + } + + public void putChar(String key, char num) { + put(key, num); + } + + public void putCharacter(String key, char num) { + put(key, num); + } + + public void putShort(String key, int num) { + put(key, num); + } + + public void putInt(String key, int num) { + put(key, num); + } + + public void putInteger(String key, int num) { + put(key, num); + } + + public void putLong(String key, long num) { + put(key, num); + } + + public void putFloat(String key, double num) { + put(key, (float) num); + } + + public void putDouble(String key, double num) { + put(key, num); + } + + public void putString(String key, String num) { + put(key, num); + } + + @Override + public void ionRead(InputStream in) throws IOException { + while (true) { + byte b = StreamUtils.readByte(in); + if (b == IonMarks.ENTRY) { + String key = StreamUtils.readStringBytes(in); + Object value = Ion.readObject(in); + put(key, value); + } else if (b == IonMarks.END) { + break; + } else { + throw new RuntimeException("Unexpected mark in IonMap: " + Integer.toHexString(b)); + } + } + } + + @Override + public void ionWrite(OutputStream out) throws IOException { + for (Entry entry : entrySet()) { + StreamUtils.writeByte(out, IonMarks.ENTRY); + StreamUtils.writeStringBytes(out, entry.getKey()); + Ion.writeObject(out, entry.getValue()); + } + StreamUtils.writeByte(out, IonMarks.END); + } + + @Override + public byte ionMark() { + return IonMarks.MAP; + } + +} diff --git a/src/com/porcupine/ion/IonMarks.java b/src/com/porcupine/ion/IonMarks.java new file mode 100644 index 0000000..1fb018f --- /dev/null +++ b/src/com/porcupine/ion/IonMarks.java @@ -0,0 +1,57 @@ +package com.porcupine.ion; + + +/** + * Byte marks used to structure data in Ion files. + * + * @author MightyPork + */ +public class IonMarks { + + /** Null value */ + public static final byte NULL = 0; + + /** Boolean value */ + public static final byte BOOLEAN = 1; + + /** Byte value */ + public static final byte BYTE = 2; + + /** Character value */ + public static final byte CHAR = 3; + + /** Short value */ + public static final byte SHORT = 4; + + /** Integer value */ + public static final byte INT = 5; + + /** Long value */ + public static final byte LONG = 6; + + /** Float value */ + public static final byte FLOAT = 7; + + /** Double value */ + public static final byte DOUBLE = 8; + + /** String value */ + public static final byte STRING = 9; + + /** List value (begin) - contains entries, ends with END */ + public static final byte LIST = 10; + + /** Map value (begin) - contains entries, ends with END */ + public static final byte MAP = 11; + + /** + * List / Map entry
+ * In list directly followed by entry value. In map followed by (string) key + * and the entry value. + */ + public static final byte ENTRY = 12; + + /** End of List / Map */ + public static final byte END = 13; + +} diff --git a/src/com/porcupine/ion/Ionizable.java b/src/com/porcupine/ion/Ionizable.java new file mode 100644 index 0000000..7a5f3c0 --- /dev/null +++ b/src/com/porcupine/ion/Ionizable.java @@ -0,0 +1,41 @@ +package com.porcupine.ion; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +/** + * Object that can be saved to and loaded from Ion file.
+ * All classes implementing Ionizable must be registered to {@link Ion} using + * Ion.registerIonizable(obj.class). + * + * @author MightyPork + */ +public interface Ionizable { + /** + * Load data from the input stream. Mark has already been read, begin + * reading right after it. + * + * @param in input stream + * @throws IOException at IO error + */ + public void ionRead(InputStream in) throws IOException; + + /** + * Store data to output stream. mark has already been written, begin right + * after it. + * + * @param out Output stream + * @throws IOException at IO error + */ + public void ionWrite(OutputStream out) throws IOException; + + /** + * Get Ion mark byte. + * + * @return Ion mark byte. + */ + public byte ionMark(); +} diff --git a/src/com/porcupine/ion/IonizableOptional.java b/src/com/porcupine/ion/IonizableOptional.java new file mode 100644 index 0000000..ef70f46 --- /dev/null +++ b/src/com/porcupine/ion/IonizableOptional.java @@ -0,0 +1,16 @@ +package com.porcupine.ion; + + +/** + * Optional ionizable + * + * @author MightyPork + */ +public interface IonizableOptional extends Ionizable { + /** + * Get if this ionizable should be saved to a list + * + * @return should save + */ + public boolean ionShouldSave(); +} diff --git a/src/com/porcupine/ion/StreamUtils.java b/src/com/porcupine/ion/StreamUtils.java new file mode 100644 index 0000000..a773180 --- /dev/null +++ b/src/com/porcupine/ion/StreamUtils.java @@ -0,0 +1,208 @@ +package com.porcupine.ion; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; + + +/** + * Utilities to store and load objects to streams. + * + * @author MightyPork + */ + +@SuppressWarnings("javadoc") +public class StreamUtils { + + private static ByteBuffer bi = ByteBuffer.allocate(Integer.SIZE / 8); + private static ByteBuffer bd = ByteBuffer.allocate(Double.SIZE / 8); + private static ByteBuffer bf = ByteBuffer.allocate(Float.SIZE / 8); + private static ByteBuffer bc = ByteBuffer.allocate(Character.SIZE / 8); + private static ByteBuffer bl = ByteBuffer.allocate(Long.SIZE / 8); + private static ByteBuffer bs = ByteBuffer.allocate(Short.SIZE / 8); + + private static byte[] ai = new byte[Integer.SIZE / 8]; + private static byte[] ad = new byte[Double.SIZE / 8]; + private static byte[] af = new byte[Float.SIZE / 8]; + private static byte[] ac = new byte[Character.SIZE / 8]; + private static byte[] al = new byte[Long.SIZE / 8]; + private static byte[] as = new byte[Short.SIZE / 8]; + + // CONVERSIONS + + private static byte[] convBool(boolean bool) { + return new byte[] { (byte) (bool ? 1 : 0) }; + } + + private static byte[] convByte(byte num) { + return new byte[] { num }; + } + + private static byte[] convChar(char num) { + bc.clear(); + bc.putChar(num); + return bc.array(); + } + + private static byte[] convShort(short num) { + bs.clear(); + bs.putShort(num); + return bs.array(); + } + + private static byte[] convInt(int num) { + bi.clear(); + bi.putInt(num); + return bi.array(); + } + + private static byte[] convLong(long num) { + bl.clear(); + bl.putLong(num); + return bl.array(); + } + + private static byte[] convFloat(float num) { + bf.clear(); + bf.putFloat(num); + return bf.array(); + } + + private static byte[] convDouble(double num) { + bd.clear(); + bd.putDouble(num); + return bd.array(); + } + + private static byte[] convString(String str) { + char[] chars = str.toCharArray(); + + ByteBuffer bstr = ByteBuffer.allocate((Character.SIZE / 8) * chars.length + (Character.SIZE / 8)); + for (char c : chars) { + bstr.putChar(c); + } + + bstr.putChar((char) 0); + + return bstr.array(); + } + + private static byte[] convString_b(String str) { + char[] chars = str.toCharArray(); + ByteBuffer bstr = ByteBuffer.allocate((Byte.SIZE / 8) * chars.length + 1); + for (char c : chars) { + bstr.put((byte) c); + } + bstr.put((byte) 0); + + return bstr.array(); + } + + public static void writeBoolean(OutputStream out, boolean num) throws IOException { + out.write(convBool(num)); + } + + public static void writeByte(OutputStream out, byte num) throws IOException { + out.write(convByte(num)); + } + + public static void writeChar(OutputStream out, char num) throws IOException { + out.write(convChar(num)); + } + + public static void writeShort(OutputStream out, short num) throws IOException { + out.write(convShort(num)); + } + + public static void writeInt(OutputStream out, int num) throws IOException { + out.write(convInt(num)); + } + + public static void writeLong(OutputStream out, long num) throws IOException { + out.write(convLong(num)); + } + + public static void writeFloat(OutputStream out, float num) throws IOException { + out.write(convFloat(num)); + } + + public static void writeDouble(OutputStream out, double num) throws IOException { + out.write(convDouble(num)); + } + + public static void writeString(OutputStream out, String str) throws IOException { + out.write(convString(str)); + } + + public static void writeStringBytes(OutputStream out, String str) throws IOException { + out.write(convString_b(str)); + } + + + // READING + + public static boolean readBoolean(InputStream in) throws IOException { + return in.read() > 0; + } + + public static byte readByte(InputStream in) throws IOException { + return (byte) in.read(); + } + + public static char readChar(InputStream in) throws IOException { + in.read(ac, 0, ac.length); + ByteBuffer buf = ByteBuffer.wrap(ac); + return buf.getChar(); + } + + public static short readShort(InputStream in) throws IOException { + in.read(as, 0, as.length); + ByteBuffer buf = ByteBuffer.wrap(as); + return buf.getShort(); + } + + public static long readLong(InputStream in) throws IOException { + in.read(al, 0, al.length); + ByteBuffer buf = ByteBuffer.wrap(al); + return buf.getLong(); + } + + public static int readInt(InputStream in) throws IOException { + in.read(ai, 0, ai.length); + ByteBuffer buf = ByteBuffer.wrap(ai); + return buf.getInt(); + } + + public static float readFloat(InputStream in) throws IOException { + in.read(af, 0, af.length); + ByteBuffer buf = ByteBuffer.wrap(af); + return buf.getFloat(); + } + + public static double readDouble(InputStream in) throws IOException { + in.read(ad, 0, ad.length); + ByteBuffer buf = ByteBuffer.wrap(ad); + return buf.getDouble(); + } + + public static String readString(InputStream in) throws IOException { + String s = ""; + char c; + while ((c = readChar(in)) > 0) { + s += c; + } + return s; + } + + public static String readStringBytes(InputStream in) throws IOException { + String s = ""; + byte b; + while ((b = readByte(in)) > 0) { + s += (char) b; + } + return s; + } + +} diff --git a/src/com/porcupine/math/Calc.java b/src/com/porcupine/math/Calc.java new file mode 100644 index 0000000..954efa5 --- /dev/null +++ b/src/com/porcupine/math/Calc.java @@ -0,0 +1,811 @@ +package com.porcupine.math; + + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.lwjgl.BufferUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Math helper + * + * @author MightyPork + */ +public class Calc { + + /** Square root of two */ + public static final double SQ2 = 1.41421356237; + + public static double fixNan(double toFix, double replace) { + if(Double.isNaN(toFix)) return replace; + return toFix; + } + + /** + * Get distance from 2D line to 2D point [X,Y] + * + * @param lineDirVec line directional vector + * @param linePoint point of line + * @param point point coordinate + * @return distance + */ + public static double linePointDist(Vec lineDirVec, Coord linePoint, Coord point) { + // line point L[lx,ly] + double lx = linePoint.x; + double ly = linePoint.y; + + // line equation ax+by+c=0 + double a = -lineDirVec.y; + double b = lineDirVec.x; + double c = -a * lx - b * ly; + + // checked point P[x,y] + double x = point.x; + double y = point.y; + + // distance + return Math.abs(a * x + b * y + c) / Math.sqrt(a * a + b * b); + } + + /** + * Get distance from 2D line to 2D point [X,Z] + * + * @param lineDirVec line directional vector + * @param linePoint point of line + * @param point point coordinate + * @return distance + */ + public static double linePointDistXZ(Vec lineDirVec, Coord linePoint, Coord point) { + return linePointDist(new Vec(lineDirVec.x, lineDirVec.z), new Coord(linePoint.x, linePoint.z), new Coord(point.x, point.z)); + } + + /** + * Get longest side of a right-angled triangle + * + * @param a side a (opposite) + * @param b side b (adjacent) + * @return longest side (hypotenuse) + */ + public static double pythC(double a, double b) { + return Math.sqrt(square(a) + square(b)); + } + + /** + * Get adjacent side of a right-angled triangle + * + * @param a side a (opposite) + * @param c side c (hypotenuse) + * @return side b (adjacent) + */ + public static double pythB(double a, double c) { + return Math.sqrt(square(c) - square(a)); + } + + /** + * Get opposite side of a right-angled triangle + * + * @param b side b (adjacent) + * @param c side c (hypotenuse) + * @return side a (opposite) + */ + public static double pythA(double b, double c) { + return Math.sqrt(square(c) - square(b)); + } + + private static class Angles { + + public static double delta(double alpha, double beta, double a360) { + + while (Math.abs(alpha - beta) > a360 / 2D) { + alpha = norm(alpha + a360 / 2D, a360); + beta = norm(beta + a360 / 2D, a360); + } + + return beta - alpha; + } + + public static double norm(double angle, double a360) { + while (angle < 0) + angle += a360; + while (angle > a360) + angle -= a360; + return angle; + } + } + + /** + * Calc subclass with buffer utils. + * + * @author MightyPork + */ + public static class Buffers { + + /** + * Create java.nio.FloatBuffer of given floats, and flip it. + * + * @param obj floats or float array + * @return float buffer + */ + public static FloatBuffer fBuff(float... obj) { + return (FloatBuffer) BufferUtils.createFloatBuffer(obj.length).put(obj).flip(); + } + + /** + * Fill java.nio.FloatBuffer with floats or float array + * + * @param buff + * @param obj + */ + public static void fillBuff(FloatBuffer buff, float... obj) { + buff.put(obj); + buff.flip(); + } + + /** + * Create new java.nio.FloatBuffer of given length + * + * @param count elements + * @return the new java.nio.FloatBuffer + */ + public static FloatBuffer mkBuff(int count) { + return BufferUtils.createFloatBuffer(count); + } + + } + + /** + * Angle calculations for degrees. + * + * @author MightyPork + */ + public static class Deg { + /** 180° in degrees */ + public static final double a180 = 180; + /** 270° in degrees */ + public static final double a270 = 270; + /** 360° in degrees */ + public static final double a360 = 360; + /** 45° in degrees */ + public static final double a45 = 45; + /** 90° in degrees */ + public static final double a90 = 90; + + /** + * Subtract two angles alpha - beta + * + * @param alpha first angle + * @param beta second angle + * @return (alpha - beta) in degrees + */ + public static double delta(double alpha, double beta) { + return Angles.delta(alpha, beta, a360); + } + + /** + * Difference of two angles (absolute value of delta) + * + * @param alpha first angle + * @param beta second angle + * @return difference in radians + */ + public static double diff(double alpha, double beta) { + return Math.abs(Angles.delta(alpha, beta, a360)); + } + + /** + * Cosinus in degrees + * + * @param deg angle in degrees + * @return cosinus + */ + public static double cos(double deg) { + return Math.cos(toRad(deg)); + } + + /** + * Sinus in degrees + * + * @param deg angle in degrees + * @return sinus + */ + public static double sin(double deg) { + return Math.sin(toRad(deg)); + } + + /** + * Tangents in degrees + * + * @param deg angle in degrees + * @return tangents + */ + public static double tan(double deg) { + return Math.tan(toRad(deg)); + } + + /** + * Angle normalized to 0-360 range + * + * @param angle angle to normalize + * @return normalized angle + */ + public static double norm(double angle) { + return Angles.norm(angle, a360); + } + + /** + * Convert to radians + * + * @param deg degrees + * @return radians + */ + public static double toRad(double deg) { + return Math.toRadians(deg); + } + + /** + * Round angle to 0,45,90,135... + * + * @param deg angle in deg. to round + * @param x rounding increment (45 - round to 0,45,90...) + * @return rounded + */ + public static int roundX(double deg, double x) { + double half = x / 2d; + deg += half; + deg = norm(deg); + int times = (int) Math.floor(deg / x); + double a = times * x; + if (a == 360) a = 0; + return (int) Math.round(a); + } + + /** + * Round angle to 0,45,90,135... + * + * @param deg angle in deg. to round + * @return rounded + */ + public static int round45(double deg) { + return roundX(deg, 45); + } + + /** + * Round angle to 0,90,180,270 + * + * @param deg angle in deg. to round + * @return rounded + */ + public static int round90(double deg) { + return roundX(deg, 90); + } + + /** + * Round angle to 0,15,30,45,60,75,90... + * + * @param deg angle in deg to round + * @return rounded + */ + public static int round15(double deg) { + return roundX(deg, 15); + } + } + + /** + * Angle calculations for radians. + * + * @author MightyPork + */ + public static class Rad { + /** 180° in radians */ + public static final double a180 = Math.PI; + /** 270° in radians */ + public static final double a270 = Math.PI * 1.5D; + /** 360° in radians */ + public static final double a360 = Math.PI * 2D; + /** 45° in radians */ + public static final double a45 = Math.PI / 4D; + /** 90° in radians */ + public static final double a90 = Math.PI / 2D; + + /** + * Subtract two angles alpha - beta + * + * @param alpha first angle + * @param beta second angle + * @return (alpha - beta) in radians + */ + public static double delta(double alpha, double beta) { + return Angles.delta(alpha, beta, a360); + } + + /** + * Difference of two angles (absolute value of delta) + * + * @param alpha first angle + * @param beta second angle + * @return difference in radians + */ + public static double diff(double alpha, double beta) { + return Math.abs(Angles.delta(alpha, beta, a360)); + } + + /** + * Cos + * + * @param rad angle in rads + * @return cos + */ + public static double cos(double rad) { + return Math.cos(rad); + } + + /** + * Sin + * + * @param rad angle in rads + * @return sin + */ + public static double sin(double rad) { + return Math.sin(rad); + } + + /** + * Tan + * + * @param rad angle in rads + * @return tan + */ + public static double tan(double rad) { + return Math.tan(rad); + } + + /** + * Angle normalized to 0-2*PI range + * + * @param angle angle to normalize + * @return normalized angle + */ + public static double norm(double angle) { + return Angles.norm(angle, a360); + } + + /** + * Convert to degrees + * + * @param rad radians + * @return degrees + */ + public static double toDeg(double rad) { + return Math.toDegrees(rad); + } + } + + private static Random rand = new Random(); + + + /** + * Get volume of a sphere + * + * @param radius sphere radius + * @return volume in cubic units + */ + public static double sphereGetVolume(double radius) { + return (4D / 3D) * Math.PI * cube(radius); + } + + /** + * Get radius of a sphere + * + * @param volume sphere volume + * @return radius in units + */ + public static double sphereGetRadius(double volume) { + return Math.cbrt((3D * volume) / (4 * Math.PI)); + } + + /** + * Get surface of a circle + * + * @param radius circle radius + * @return volume in square units + */ + public static double circleGetSurface(double radius) { + return Math.PI * square(radius); + } + + /** + * Get radius of a circle + * + * @param surface circle volume + * @return radius in units + */ + public static double circleGetRadius(double surface) { + return Math.sqrt(surface / Math.PI); + } + + /** + * Check if objects are equal (for equals function) + * + * @param a + * @param b + * @return are equal + */ + public static boolean areObjectsEqual(Object a, Object b) { + return a == null ? b == null : a.equals(b); + } + + /** + * Private clamping helper. + * + * @param number number to be clamped + * @param min min value + * @param max max value + * @return clamped double + */ + private static double clamp_double(Number number, Number min, Number max) { + double n = number.doubleValue(); + double mind = min.doubleValue(); + double maxd = max.doubleValue(); + if (n > maxd) n = maxd; + if (n < mind) n = mind; + if(Double.isNaN(number.doubleValue())) n = mind; + return n; + } + + /** + * Private clamping helper. + * + * @param number number to be clamped + * @param min min value + * @return clamped double + */ + private static double clamp_double(Number number, Number min) { + double n = number.doubleValue(); + double mind = min.doubleValue(); + if (n < mind) n = mind; + if(Double.isNaN(number.doubleValue())) n = mind; + return n; + } + + /** + * Clamp number to min and max bounds, inclusive.
+ * DOUBLE version + * + * @param number clamped number + * @param min minimal allowed value + * @param max maximal allowed value + * @return result + */ + public static double clampd(Number number, Number min, Number max) { + return clamp_double(number, min, max); + } + + /** + * Clamp number to min and max bounds, inclusive.
+ * FLOAT version + * + * @param number clamped number + * @param min minimal allowed value + * @param max maximal allowed value + * @return result + */ + public static float clampf(Number number, Number min, Number max) { + return (float) clamp_double(number, min, max); + } + + /** + * Clamp number to min and max bounds, inclusive.
+ * INTEGER version + * + * @param number clamped number + * @param min minimal allowed value + * @param max maximal allowed value + * @return result + */ + public static int clampi(Number number, Number min, Number max) { + return (int) Math.round(clamp_double(number, min, max)); + } + + /** + * Clamp number to min and max bounds, inclusive.
+ * INTEGER version + * + * @param number clamped number + * @param range range + * @return result + */ + public static int clampi(Number number, Range range) { + return (int) Math.round(clamp_double(number, range.getMin(), range.getMax())); + } + + /** + * Clamp number to min and max bounds, inclusive.
+ * DOUBLE version + * + * @param number clamped number + * @param range range + * @return result + */ + public static double clampd(Number number, Range range) { + return clamp_double(number, range.getMin(), range.getMax()); + } + + /** + * Clamp number to min and max bounds, inclusive.
+ * FLOAT version + * + * @param number clamped number + * @param range range + * @return result + */ + public static float clampf(Number number, Range range) { + return (float) clamp_double(number, range.getMin(), range.getMax()); + } + + /** + * Clamp number to min and infinite bounds, inclusive.
+ * DOUBLE version + * + * @param number clamped number + * @param min minimal allowed value + * @return result + */ + public static double clampd(Number number, Number min) { + return clamp_double(number, min); + } + + /** + * Clamp number to min and infinite bounds, inclusive.
+ * FLOAT version + * + * @param number clamped number + * @param min minimal allowed value + * @return result + */ + public static float clampf(Number number, Number min) { + return (float) clamp_double(number, min); + } + + /** + * Clamp number to min and infinite bounds, inclusive.
+ * INTEGER version + * + * @param number clamped number + * @param min minimal allowed value + * @return result + */ + public static int clampi(Number number, Number min) { + return (int) Math.round(clamp_double(number, min)); + } + + /** + * Get class simple name + * + * @param obj object + * @return simple name + */ + public static String className(Object obj) { + if (obj == null) return "NULL"; + return obj.getClass().getSimpleName(); + } + + /** + * Cube a double + * + * @param a squared double + * @return square + */ + public static double cube(double a) { + return a * a * a; + } + + /** + * Convert double to string, remove the mess at the end. + * + * @param d double + * @return string + */ + public static String doubleToString(double d) { + String s = Double.toString(d); + s = s.replaceAll("([0-9]+\\.[0-9]+)00+[0-9]+", "$1"); + s = s.replaceAll("0+$", ""); + s = s.replaceAll("\\.$", ""); + return s; + } + + /** + * Convert float to string, remove the mess at the end. + * + * @param f float + * @return string + */ + public static String floatToString(float f) { + String s = Float.toString(f); + s = s.replaceAll("([0-9]+\\.[0-9]+)00+[0-9]+", "$1"); + s = s.replaceAll("0+$", ""); + s = s.replaceAll("\\.$", ""); + return s; + } + + /** + * Check if number is in range + * + * @param number checked + * @param left lower end + * @param right upper end + * @return is in range + */ + public static boolean inRange(double number, double left, double right) { + return number >= left && number <= right; + } + + /** + * Get number from A to B at delta time (tween A to B) + * + * @param last last number + * @param now new number + * @param dtime delta time + * @return current number to render + */ + public static double interpolate(double last, double now, double dtime) { + return last + (now - last) * dtime; + } + + /** + * Get angle [degrees] from A to B at delta time (tween A to B) + * + * @param last last angle + * @param now new angle + * @param delta delta time + * @return current angle to render + */ + public static double interpolateDeg(double last, double now, double delta) { + return Deg.norm(last + Deg.delta(now, last) * delta); + } + + /** + * Get highest number of a list + * + * @param numbers numbers + * @return lowest + */ + public static double max(double... numbers) { + double highest = numbers[0]; + for (double num : numbers) { + if (num > highest) highest = num; + } + return highest; + } + + /** + * Get highest number of a list + * + * @param numbers numbers + * @return lowest + */ + public static float max(float... numbers) { + float highest = numbers[0]; + for (float num : numbers) { + if (num > highest) highest = num; + } + return highest; + } + + /** + * Get highest number of a list + * + * @param numbers numbers + * @return lowest + */ + public static int max(int... numbers) { + int highest = numbers[0]; + for (int num : numbers) { + if (num > highest) highest = num; + } + return highest; + } + + /** + * Get lowest number of a list + * + * @param numbers numbers + * @return lowest + */ + public static double min(double... numbers) { + double lowest = numbers[0]; + for (double num : numbers) { + if (num < lowest) lowest = num; + } + return lowest; + } + + /** + * Get lowest number of a list + * + * @param numbers numbers + * @return lowest + */ + public static float min(float... numbers) { + float lowest = numbers[0]; + for (float num : numbers) { + if (num < lowest) lowest = num; + } + return lowest; + } + + /** + * Get lowest number of a list + * + * @param numbers numbers + * @return lowest + */ + public static int min(int... numbers) { + int lowest = numbers[0]; + for (int num : numbers) { + if (num < lowest) lowest = num; + } + return lowest; + } + + /** + * Split comma separated list of integers. + * + * @param list String containing the list. + * @return array of integers or null. + */ + public static List parseIntList(String list) { + if (list == null) { + return null; + } + String[] parts = list.split(","); + + ArrayList intList = new ArrayList(); + + for (String part : parts) { + try { + intList.add(Integer.parseInt(part)); + } catch (NumberFormatException e) {} + } + + return intList; + + } + + /** + * Pick random element from a given list. + * + * @param list list of choices + * @return picked element + */ + public static Object pick(List list) { + if (list.size() == 0) return null; + return list.get(rand.nextInt(list.size())); + } + + /** + * Square a double + * + * @param a squared double + * @return square + */ + public static double square(double a) { + return a * a; + } + + /** + * Signum. + * + * @param number + * @return sign, -1,0,1 + */ + public static int sgn(double number) { + return number > 0 ? 1 : number < 0 ? -1 : 0; + } + +} diff --git a/src/com/porcupine/math/Polar.java b/src/com/porcupine/math/Polar.java new file mode 100644 index 0000000..b1b202d --- /dev/null +++ b/src/com/porcupine/math/Polar.java @@ -0,0 +1,91 @@ +package com.porcupine.math; + + +import com.porcupine.coord.Coord; + + +/** + * Polar coordinate + * + * @author MightyPork + */ +public class Polar { + /** angle in radians */ + public double angle = 0; + /** distance in units */ + public double distance = 0; + + /** + * @param angle angle in radians + * @param distance distance from origin + */ + public Polar(double angle, double distance) { + this.angle = angle; + this.distance = distance; + } + + /** + * Make polar from coord + * + * @param coord coord + * @return polar + */ + public static Polar fromCoord(Coord coord) { + return new Polar(Math.atan2(coord.y, coord.x), Math.sqrt(Calc.square(coord.x) + Calc.square(coord.y))); + } + + /** + * Make polar from coords + * + * @param x x coord + * @param y y coord + * @return polar + */ + public static Polar fromCoord(double x, double y) { + return Polar.fromCoord(new Coord(x, y)); + } + + /** + * Make polar from coords + * + * @param x x coord + * @param z z coord + * @return polar + */ + public static Polar fromCoordXZ(double x, double z) { + return Polar.fromCoordXZ(new Coord(x, 0, z)); + } + + /** + * Get coord from polar + * + * @return coord + */ + public Coord toCoord() { + return new Coord(distance * Math.cos(angle), distance * Math.sin(angle)); + } + + /** + * Get X,0,Y coord from polar + * + * @return coord + */ + public Coord toCoordXZ() { + return new Coord(distance * Math.cos(angle), 0, distance * Math.sin(angle)); + } + + @Override + public String toString() { + return "Polar(theta=" + angle + ", r=" + distance + ")"; + } + + /** + * Build polar from X,Z instead of X,Y + * + * @param coord cpprd with X,Z + * @return polar + */ + public static Polar fromCoordXZ(Coord coord) { + return fromCoord(coord.x, coord.z); + } +} diff --git a/src/com/porcupine/math/PolarDeg.java b/src/com/porcupine/math/PolarDeg.java new file mode 100644 index 0000000..34c2d18 --- /dev/null +++ b/src/com/porcupine/math/PolarDeg.java @@ -0,0 +1,95 @@ +package com.porcupine.math; + + +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc.Deg; +import com.porcupine.math.Calc.Rad; + + +/** + * Polar coordinate in degrees + * + * @author MightyPork + */ +public class PolarDeg { + /** angle in degrees */ + public double angle = 0; + /** distance in units */ + public double distance = 0; + + /** + * Polar coordinate in degrees + * + * @param angle angle in degrees + * @param distance distance from origin + */ + public PolarDeg(double angle, double distance) { + this.angle = angle; + this.distance = distance; + } + + /** + * Make polar from coord + * + * @param coord coord + * @return polar + */ + public static PolarDeg fromCoord(Coord coord) { + return new PolarDeg(Rad.toDeg(Math.atan2(coord.y, coord.x)), Math.sqrt(Calc.square(coord.x) + Calc.square(coord.y))); + } + + /** + * Make polar from coords + * + * @param x x coord + * @param y y coord + * @return polar + */ + public static PolarDeg fromCoord(double x, double y) { + return PolarDeg.fromCoord(new Coord(x, y)); + } + + /** + * Make polar from coords + * + * @param x x coord + * @param z y coord + * @return polar + */ + public static PolarDeg fromCoordXZ(double x, double z) { + return PolarDeg.fromCoordXZ(new Coord(x, 0, z)); + } + + /** + * Get coord from polar + * + * @return coord + */ + public Coord toCoord() { + return new Coord(distance * Math.cos(Deg.toRad(angle)), distance * Math.sin(Deg.toRad(angle))); + } + + /** + * Get X,0,Y coord from polar + * + * @return coord + */ + public Coord toCoordXZ() { + return new Coord(distance * Math.cos(Deg.toRad(angle)), 0, distance * Math.sin(Deg.toRad(angle))); + } + + @Override + public String toString() { + return "Polar(theta=" + angle + ", r=" + distance + ")"; + } + + /** + * Build polar from X,Z instead of X,Y + * + * @param coord cpprd with X,Z + * @return polar + */ + public static PolarDeg fromCoordXZ(Coord coord) { + return fromCoord(coord.x, coord.z); + } +} diff --git a/src/com/porcupine/math/Range.java b/src/com/porcupine/math/Range.java new file mode 100644 index 0000000..5900f0c --- /dev/null +++ b/src/com/porcupine/math/Range.java @@ -0,0 +1,174 @@ +package com.porcupine.math; + + +import java.util.Random; + + +/** + * Numeric range, able to generate random numbers and give min/max values. + * + * @author MightyPork + */ +public class Range { + private double min = 0; + private double max = 1; + + private static Random rand = new Random(); + + /** + * Implicit range constructor 0-1 + */ + public Range() {} + + + /** + * Create new range + * + * @param min min number + * @param max max number + */ + public Range(double min, double max) { + if (min > max) { + double t = min; + min = max; + max = t; + } + this.min = min; + this.max = max; + } + + /** + * Create new range + * + * @param minmax min = max number + */ + public Range(double minmax) { + this.min = minmax; + this.max = minmax; + } + + /** + * Get random integer from range + * + * @return random int + */ + public int randInt() { + return (int) (Math.round(min) + rand.nextInt((int) (Math.round(max) - Math.round(min)) + 1)); + } + + /** + * Get random double from this range + * + * @return random double + */ + public double randDouble() { + return min + rand.nextDouble() * (max - min); + } + + /** + * Get min + * + * @return min number + */ + public double getMin() { + return min; + } + + /** + * Get max + * + * @return max number + */ + public double getMax() { + return max; + } + + /** + * Get min + * + * @return min number + */ + public int getMinI() { + return (int) min; + } + + /** + * Get max + * + * @return max number + */ + public int getMaxI() { + return (int) max; + } + + /** + * Set min + * + * @param min min value + */ + public void setMin(double min) { + this.min = min; + } + + /** + * Set max + * + * @param max max value + */ + public void setMax(double max) { + this.max = max; + } + + @Override + public String toString() { + return "Range(" + min + ";" + max + ")"; + } + + + /** + * Get identical copy + * + * @return copy + */ + public Range copy() { + return new Range(min, max); + } + + + /** + * Set to value of other range + * + * @param other copied range + */ + public void setTo(Range other) { + if (other == null) return; + min = other.min; + max = other.max; + + if (min > max) { + double t = min; + min = max; + max = t; + } + } + + + /** + * Set to min-max values + * + * @param min min value + * @param max max value + */ + public void setTo(double min, double max) { + + if (min > max) { + double t = min; + min = max; + max = t; + } + + this.min = min; + this.max = max; + } + +} diff --git a/src/com/porcupine/mutable/AbstractMutable.java b/src/com/porcupine/mutable/AbstractMutable.java new file mode 100644 index 0000000..aea5e2f --- /dev/null +++ b/src/com/porcupine/mutable/AbstractMutable.java @@ -0,0 +1,52 @@ +package com.porcupine.mutable; + + +/** + * Mutable object + * + * @author MightyPork + * @param type + */ +public abstract class AbstractMutable { + /** The wrapped value */ + public T o = getDefault(); + + /** + * Implicint constructor + */ + public AbstractMutable() {} + + /** + * new mutable object + * + * @param o value + */ + public AbstractMutable(T o) { + this.o = o; + } + + /** + * Get the wrapped value + * + * @return value + */ + public T get() { + return o; + } + + /** + * Set value + * + * @param o new value to set + */ + public void set(T o) { + this.o = o; + } + + /** + * Get default value + * + * @return default value + */ + protected abstract T getDefault(); +} diff --git a/src/com/porcupine/mutable/MBoolean.java b/src/com/porcupine/mutable/MBoolean.java new file mode 100644 index 0000000..46fc99d --- /dev/null +++ b/src/com/porcupine/mutable/MBoolean.java @@ -0,0 +1,28 @@ +package com.porcupine.mutable; + + +/** + * Mutable boolean + * + * @author MightyPork + */ +public class MBoolean extends AbstractMutable { + /** + * Mutable boolean + * + * @param o value + */ + public MBoolean(Boolean o) { + super(o); + } + + /** + * Imp.c. + */ + public MBoolean() {} + + @Override + protected Boolean getDefault() { + return false; + } +} diff --git a/src/com/porcupine/mutable/MDouble.java b/src/com/porcupine/mutable/MDouble.java new file mode 100644 index 0000000..cbaf818 --- /dev/null +++ b/src/com/porcupine/mutable/MDouble.java @@ -0,0 +1,28 @@ +package com.porcupine.mutable; + + +/** + * Mutable double + * + * @author MightyPork + */ +public class MDouble extends AbstractMutable { + /** + * Mutable double + * + * @param o value + */ + public MDouble(Double o) { + super(o); + } + + /** + * Imp.c. + */ + public MDouble() {} + + @Override + protected Double getDefault() { + return 0d; + } +} diff --git a/src/com/porcupine/mutable/MFloat.java b/src/com/porcupine/mutable/MFloat.java new file mode 100644 index 0000000..41b015a --- /dev/null +++ b/src/com/porcupine/mutable/MFloat.java @@ -0,0 +1,29 @@ +package com.porcupine.mutable; + + +/** + * Mutable float + * + * @author MightyPork + */ +public class MFloat extends AbstractMutable { + /** + * Mutable float + * + * @param o value + */ + public MFloat(Float o) { + super(o); + } + + + /** + * Imp.c. + */ + public MFloat() {} + + @Override + protected Float getDefault() { + return 0f; + } +} diff --git a/src/com/porcupine/mutable/MInt.java b/src/com/porcupine/mutable/MInt.java new file mode 100644 index 0000000..f30a2d7 --- /dev/null +++ b/src/com/porcupine/mutable/MInt.java @@ -0,0 +1,28 @@ +package com.porcupine.mutable; + + +/** + * Mutable integer + * + * @author MightyPork + */ +public class MInt extends AbstractMutable { + /** + * Mutable int + * + * @param o value + */ + public MInt(Integer o) { + super(o); + } + + /** + * Imp.c. + */ + public MInt() {} + + @Override + protected Integer getDefault() { + return 0; + } +} diff --git a/src/com/porcupine/mutable/MString.java b/src/com/porcupine/mutable/MString.java new file mode 100644 index 0000000..45bfa61 --- /dev/null +++ b/src/com/porcupine/mutable/MString.java @@ -0,0 +1,28 @@ +package com.porcupine.mutable; + + +/** + * Mutable string + * + * @author MightyPork + */ +public class MString extends AbstractMutable { + /** + * Mutable string + * + * @param o value + */ + public MString(String o) { + super(o); + } + + /** + * Imp.c. + */ + public MString() {} + + @Override + protected String getDefault() { + return ""; + } +} diff --git a/src/com/porcupine/struct/Struct2.java b/src/com/porcupine/struct/Struct2.java new file mode 100644 index 0000000..26b5d86 --- /dev/null +++ b/src/com/porcupine/struct/Struct2.java @@ -0,0 +1,132 @@ +package com.porcupine.struct; + + +import com.porcupine.math.Calc; + + +/** + * Structure of 2 objects. + * + * @author MightyPork + * @copy (c) 2012 + * @param 1st object class + * @param 2nd object class + */ +public class Struct2 { + /** + * 1st object + */ + public T1 a; + + /** + * 2nd object + */ + public T2 b; + + /** + * Make structure of 2 objects + * + * @param objA 1st object + * @param objB 2nd object + */ + public Struct2(T1 objA, T2 objB) { + a = objA; + b = objB; + } + + /** + * @return 1st object + */ + public T1 getA() { + return a; + } + + /** + * @return 2nd object + */ + public T2 getB() { + return b; + } + + /** + * @return 1st object + */ + public T1 get1() { + return a; + } + + /** + * @return 2nd object + */ + public T2 get2() { + return b; + } + + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void setA(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void setB(T2 obj) { + b = obj; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void set1(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void set2(T2 obj) { + b = obj; + } + + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!this.getClass().equals(obj.getClass())) { + return false; + } + + Struct2 t = (Struct2) obj; + + return Calc.areObjectsEqual(a, t.a) && Calc.areObjectsEqual(b, t.b); + + } + + @Override + public int hashCode() { + int hash = 0; + hash += (a == null ? 0 : a.hashCode()); + hash += (b == null ? 0 : b.hashCode()); + return hash; + } + + @Override + public String toString() { + return "STRUCT {" + a + "," + b + "}"; + } + +} diff --git a/src/com/porcupine/struct/Struct3.java b/src/com/porcupine/struct/Struct3.java new file mode 100644 index 0000000..331d4a1 --- /dev/null +++ b/src/com/porcupine/struct/Struct3.java @@ -0,0 +1,172 @@ +package com.porcupine.struct; + + +import com.porcupine.math.Calc; + + +/** + * Structure of 3 objects. + * + * @author MightyPork + * @copy (c) 2012 + * @param 1st object class + * @param 2nd object class + * @param 3rd object class + */ +public class Struct3 { + /** + * 1st object + */ + public T1 a; + + /** + * 2nd object + */ + public T2 b; + + /** + * 3rd object + */ + public T3 c; + + /** + * Make structure of 3 objects + * + * @param objA 1st object + * @param objB 2nd object + * @param objC 3rd object + */ + public Struct3(T1 objA, T2 objB, T3 objC) { + a = objA; + b = objB; + c = objC; + } + + /** + * @return 1st object + */ + public T1 getA() { + return a; + } + + /** + * @return 2nd object + */ + public T2 getB() { + return b; + } + + /** + * @return 3rd object + */ + public T3 getC() { + return c; + } + + /** + * @return 1st object + */ + public T1 get1() { + return a; + } + + /** + * @return 2nd object + */ + public T2 get2() { + return b; + } + + /** + * @return 3rd object + */ + public T3 get3() { + return c; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void setA(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void setB(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void setC(T3 obj) { + c = obj; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void set1(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void set2(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void set3(T3 obj) { + c = obj; + } + + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!this.getClass().equals(obj.getClass())) { + return false; + } + + Struct3 t = (Struct3) obj; + + return Calc.areObjectsEqual(a, t.a) && Calc.areObjectsEqual(b, t.b) && Calc.areObjectsEqual(c, t.c); + + } + + @Override + public int hashCode() { + int hash = 0; + hash += (a == null ? 0 : a.hashCode()); + hash += (b == null ? 0 : b.hashCode()); + hash += (c == null ? 0 : c.hashCode()); + return hash; + } + + @Override + public String toString() { + return "STRUCT {" + a + "," + b + "," + c + "}"; + } + +} diff --git a/src/com/porcupine/struct/Struct4.java b/src/com/porcupine/struct/Struct4.java new file mode 100644 index 0000000..6ea6ede --- /dev/null +++ b/src/com/porcupine/struct/Struct4.java @@ -0,0 +1,213 @@ +package com.porcupine.struct; + + +import com.porcupine.math.Calc; + + +/** + * Structure of 4 objects. + * + * @author MightyPork + * @copy (c) 2012 + * @param 1st object class + * @param 2nd object class + * @param 3rd object class + * @param 4th object class + */ +public class Struct4 { + /** + * 1st object + */ + public T1 a; + + /** + * 2nd object + */ + public T2 b; + + /** + * 3rd object + */ + public T3 c; + + /** + * 4th object + */ + public T4 d; + + /** + * Make structure of 4 objects + * + * @param objA 1st object + * @param objB 2nd object + * @param objC 3rd object + * @param objD 4th object + */ + public Struct4(T1 objA, T2 objB, T3 objC, T4 objD) { + a = objA; + b = objB; + c = objC; + d = objD; + } + + /** + * @return 1st object + */ + public T1 getA() { + return a; + } + + /** + * @return 2nd object + */ + public T2 getB() { + return b; + } + + /** + * @return 3rd object + */ + public T3 getC() { + return c; + } + + /** + * @return 4th object + */ + public T4 getD() { + return d; + } + + /** + * @return 1st object + */ + public T1 get1() { + return a; + } + + /** + * @return 2nd object + */ + public T2 get2() { + return b; + } + + /** + * @return 3rd object + */ + public T3 get3() { + return c; + } + + /** + * @return 4th object + */ + public T4 get4() { + return d; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void setA(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void setB(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void setC(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void setD(T4 obj) { + d = obj; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void set1(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void set2(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void set3(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void set4(T4 obj) { + d = obj; + } + + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!this.getClass().equals(obj.getClass())) { + return false; + } + + Struct4 t = (Struct4) obj; + + return Calc.areObjectsEqual(a, t.a) && Calc.areObjectsEqual(b, t.b) && Calc.areObjectsEqual(c, t.c) && Calc.areObjectsEqual(d, t.d); + + } + + @Override + public int hashCode() { + int hash = 0; + hash += (a == null ? 0 : a.hashCode()); + hash += (b == null ? 0 : b.hashCode()); + hash += (c == null ? 0 : c.hashCode()); + hash += (d == null ? 0 : d.hashCode()); + return hash; + } + + @Override + public String toString() { + return "STRUCT {" + a + "," + b + "," + c + "," + d + "}"; + } + +} diff --git a/src/com/porcupine/struct/Struct5.java b/src/com/porcupine/struct/Struct5.java new file mode 100644 index 0000000..790c76d --- /dev/null +++ b/src/com/porcupine/struct/Struct5.java @@ -0,0 +1,256 @@ +package com.porcupine.struct; + + +import com.porcupine.math.Calc; + + +/** + * Structure of 5 objects. + * + * @author MightyPork + * @copy (c) 2012 + * @param 1st object class + * @param 2nd object class + * @param 3rd object class + * @param 4th object class + * @param 5th object class + */ +public class Struct5 { + /** + * 1st object + */ + public T1 a; + + /** + * 2nd object + */ + public T2 b; + + /** + * 3rd object + */ + public T3 c; + + /** + * 4th object + */ + public T4 d; + + /** + * 5th object + */ + public T5 e; + + /** + * Make structure of 4 objects + * + * @param objA 1st object + * @param objB 2nd object + * @param objC 3rd object + * @param objD 4th object + * @param objE 5th object + */ + public Struct5(T1 objA, T2 objB, T3 objC, T4 objD, T5 objE) { + a = objA; + b = objB; + c = objC; + d = objD; + e = objE; + } + + /** + * @return 1st object + */ + public T1 getA() { + return a; + } + + /** + * @return 2nd object + */ + public T2 getB() { + return b; + } + + /** + * @return 3rd object + */ + public T3 getC() { + return c; + } + + /** + * @return 4th object + */ + public T4 getD() { + return d; + } + + /** + * @return 5th object + */ + public T5 getE() { + return e; + } + + /** + * @return 1st object + */ + public T1 get1() { + return a; + } + + /** + * @return 2nd object + */ + public T2 get2() { + return b; + } + + /** + * @return 3rd object + */ + public T3 get3() { + return c; + } + + /** + * @return 4th object + */ + public T4 get4() { + return d; + } + + /** + * @return 5th object + */ + public T5 get5() { + return e; + } + + + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void setA(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void setB(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void setC(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void setD(T4 obj) { + d = obj; + } + + /** + * Set 5th object + * + * @param obj 5th object + */ + public void setE(T5 obj) { + e = obj; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void set1(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void set2(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void set3(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void set4(T4 obj) { + d = obj; + } + + /** + * Set 5th object + * + * @param obj 5th object + */ + public void set5(T5 obj) { + e = obj; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!this.getClass().equals(obj.getClass())) { + return false; + } + + Struct5 t = (Struct5) obj; + + return Calc.areObjectsEqual(a, t.a) && Calc.areObjectsEqual(b, t.b) && Calc.areObjectsEqual(c, t.c) && Calc.areObjectsEqual(d, t.d) + && Calc.areObjectsEqual(e, t.e); + + } + + @Override + public int hashCode() { + int hash = 0; + hash += (a == null ? 0 : a.hashCode()); + hash += (b == null ? 0 : b.hashCode()); + hash += (c == null ? 0 : c.hashCode()); + hash += (d == null ? 0 : d.hashCode()); + hash += (e == null ? 0 : e.hashCode()); + return hash; + } + + @Override + public String toString() { + return "STRUCT {" + a + "," + b + "," + c + "," + d + "," + e + "}"; + } + +} diff --git a/src/com/porcupine/struct/Struct6.java b/src/com/porcupine/struct/Struct6.java new file mode 100644 index 0000000..33f17a5 --- /dev/null +++ b/src/com/porcupine/struct/Struct6.java @@ -0,0 +1,295 @@ +package com.porcupine.struct; + + +import com.porcupine.math.Calc; + + +/** + * Structure of 6 objects. + * + * @author MightyPork + * @copy (c) 2012 + * @param 1st object class + * @param 2nd object class + * @param 3rd object class + * @param 4th object class + * @param 5th object class + * @param 6th object class + */ +public class Struct6 { + /** + * 1st object + */ + public T1 a; + + /** + * 2nd object + */ + public T2 b; + + /** + * 3rd object + */ + public T3 c; + + /** + * 4th object + */ + public T4 d; + + /** + * 5th object + */ + public T5 e; + + /** + * 6th object + */ + public T6 f; + + /** + * Make structure of 4 objects + * + * @param objA 1st object + * @param objB 2nd object + * @param objC 3rd object + * @param objD 4th object + * @param objE 5th object + * @param objF 6th object + */ + public Struct6(T1 objA, T2 objB, T3 objC, T4 objD, T5 objE, T6 objF) { + a = objA; + b = objB; + c = objC; + d = objD; + e = objE; + f = objF; + } + + /** + * @return 1st object + */ + public T1 getA() { + return a; + } + + /** + * @return 2nd object + */ + public T2 getB() { + return b; + } + + /** + * @return 3rd object + */ + public T3 getC() { + return c; + } + + /** + * @return 4th object + */ + public T4 getD() { + return d; + } + + /** + * @return 5th object + */ + public T5 getE() { + return e; + } + + /** + * @return 6th object + */ + public T6 getF() { + return f; + } + + /** + * @return 1st object + */ + public T1 get1() { + return a; + } + + /** + * @return 2nd object + */ + public T2 get2() { + return b; + } + + /** + * @return 3rd object + */ + public T3 get3() { + return c; + } + + /** + * @return 4th object + */ + public T4 get4() { + return d; + } + + /** + * @return 5th object + */ + public T5 get5() { + return e; + } + + /** + * @return 6th object + */ + public T6 get6() { + return f; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void setA(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void setB(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void setC(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void setD(T4 obj) { + d = obj; + } + + /** + * Set 5th object + * + * @param obj 5th object + */ + public void setE(T5 obj) { + e = obj; + } + + /** + * Set 6th object + * + * @param obj 6th object + */ + public void setF(T6 obj) { + f = obj; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void set1(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void set2(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void set3(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void set4(T4 obj) { + d = obj; + } + + /** + * Set 5th object + * + * @param obj 5th object + */ + public void set5(T5 obj) { + e = obj; + } + + /** + * Set 6th object + * + * @param obj 6th object + */ + public void set6(T6 obj) { + f = obj; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!this.getClass().equals(obj.getClass())) { + return false; + } + + Struct6 t = (Struct6) obj; + + return Calc.areObjectsEqual(a, t.a) && Calc.areObjectsEqual(b, t.b) && Calc.areObjectsEqual(c, t.c) && Calc.areObjectsEqual(d, t.d) + && Calc.areObjectsEqual(e, t.e) && Calc.areObjectsEqual(f, t.f); + + } + + @Override + public int hashCode() { + int hash = 0; + hash += (a == null ? 0 : a.hashCode()); + hash += (b == null ? 0 : b.hashCode()); + hash += (c == null ? 0 : c.hashCode()); + hash += (d == null ? 0 : d.hashCode()); + hash += (e == null ? 0 : e.hashCode()); + hash += (f == null ? 0 : f.hashCode()); + return hash; + } + + @Override + public String toString() { + return "STRUCT {" + a + "," + b + "," + c + "," + d + "," + e + "," + f + "}"; + } + +} diff --git a/src/com/porcupine/struct/Struct7.java b/src/com/porcupine/struct/Struct7.java new file mode 100644 index 0000000..6be3a48 --- /dev/null +++ b/src/com/porcupine/struct/Struct7.java @@ -0,0 +1,336 @@ +package com.porcupine.struct; + + +import com.porcupine.math.Calc; + + +/** + * Structure of 7 objects. + * + * @author MightyPork + * @copy (c) 2012 + * @param 1st object class + * @param 2nd object class + * @param 3rd object class + * @param 4th object class + * @param 5th object class + * @param 6th object class + * @param 7th object class + */ +public class Struct7 { + /** + * 1st object + */ + public T1 a; + + /** + * 2nd object + */ + public T2 b; + + /** + * 3rd object + */ + public T3 c; + + /** + * 4th object + */ + public T4 d; + + /** + * 5th object + */ + public T5 e; + + /** + * 6th object + */ + public T6 f; + + /** + * 7th object + */ + public T7 g; + + /** + * Make structure of 4 objects + * + * @param objA 1st object + * @param objB 2nd object + * @param objC 3rd object + * @param objD 4th object + * @param objE 5th object + * @param objF 6th object + * @param objG 7th object + */ + public Struct7(T1 objA, T2 objB, T3 objC, T4 objD, T5 objE, T6 objF, T7 objG) { + a = objA; + b = objB; + c = objC; + d = objD; + e = objE; + f = objF; + g = objG; + } + + /** + * @return 1st object + */ + public T1 getA() { + return a; + } + + /** + * @return 2nd object + */ + public T2 getB() { + return b; + } + + /** + * @return 3rd object + */ + public T3 getC() { + return c; + } + + /** + * @return 4th object + */ + public T4 getD() { + return d; + } + + /** + * @return 5th object + */ + public T5 getE() { + return e; + } + + /** + * @return 6th object + */ + public T6 getF() { + return f; + } + + /** + * @return 7th object + */ + public T7 getG() { + return g; + } + + /** + * @return 1st object + */ + public T1 get1() { + return a; + } + + /** + * @return 2nd object + */ + public T2 get2() { + return b; + } + + /** + * @return 3rd object + */ + public T3 get3() { + return c; + } + + /** + * @return 4th object + */ + public T4 get4() { + return d; + } + + /** + * @return 5th object + */ + public T5 get5() { + return e; + } + + /** + * @return 6th object + */ + public T6 get6() { + return f; + } + + /** + * @return 7th object + */ + public T7 get7() { + return g; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void setA(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void setB(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void setC(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void setD(T4 obj) { + d = obj; + } + + /** + * Set 5th object + * + * @param obj 5th object + */ + public void setE(T5 obj) { + e = obj; + } + + /** + * Set 6th object + * + * @param obj 6th object + */ + public void setF(T6 obj) { + f = obj; + } + + /** + * Set 7th object + * + * @param obj 6th object + */ + public void setG(T7 obj) { + g = obj; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void set1(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void set2(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void set3(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void set4(T4 obj) { + d = obj; + } + + /** + * Set 5th object + * + * @param obj 5th object + */ + public void set5(T5 obj) { + e = obj; + } + + /** + * Set 6th object + * + * @param obj 6th object + */ + public void set6(T6 obj) { + f = obj; + } + + /** + * Set 7th object + * + * @param obj 6th object + */ + public void set7(T7 obj) { + g = obj; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!this.getClass().equals(obj.getClass())) { + return false; + } + + Struct7 t = (Struct7) obj; + + return Calc.areObjectsEqual(a, t.a) && Calc.areObjectsEqual(b, t.b) && Calc.areObjectsEqual(c, t.c) && Calc.areObjectsEqual(d, t.d) + && Calc.areObjectsEqual(e, t.e) && Calc.areObjectsEqual(f, t.f) && Calc.areObjectsEqual(g, t.g); + + } + + @Override + public int hashCode() { + int hash = 0; + hash += (a == null ? 0 : a.hashCode()); + hash += (b == null ? 0 : b.hashCode()); + hash += (c == null ? 0 : c.hashCode()); + hash += (d == null ? 0 : d.hashCode()); + hash += (e == null ? 0 : e.hashCode()); + hash += (f == null ? 0 : f.hashCode()); + hash += (g == null ? 0 : g.hashCode()); + return hash; + } + + @Override + public String toString() { + return "STRUCT {" + a + "," + b + "," + c + "," + d + "," + e + "," + f + "," + g + "}"; + } + +} diff --git a/src/com/porcupine/struct/Struct8.java b/src/com/porcupine/struct/Struct8.java new file mode 100644 index 0000000..dd9ad56 --- /dev/null +++ b/src/com/porcupine/struct/Struct8.java @@ -0,0 +1,377 @@ +package com.porcupine.struct; + + +import com.porcupine.math.Calc; + + +/** + * Structure of 7 objects. + * + * @author MightyPork + * @copy (c) 2012 + * @param 1st object class + * @param 2nd object class + * @param 3rd object class + * @param 4th object class + * @param 5th object class + * @param 6th object class + * @param 7th object class + * @param 8th object class + */ +public class Struct8 { + /** + * 1st object + */ + public T1 a; + + /** + * 2nd object + */ + public T2 b; + + /** + * 3rd object + */ + public T3 c; + + /** + * 4th object + */ + public T4 d; + + /** + * 5th object + */ + public T5 e; + + /** + * 6th object + */ + public T6 f; + + /** + * 7th object + */ + public T7 g; + + /** + * 8th object + */ + public T8 h; + + /** + * Make structure of 4 objects + * + * @param objA 1st object + * @param objB 2nd object + * @param objC 3rd object + * @param objD 4th object + * @param objE 5th object + * @param objF 6th object + * @param objG 7th object + * @param objH 8th object + */ + public Struct8(T1 objA, T2 objB, T3 objC, T4 objD, T5 objE, T6 objF, T7 objG, T8 objH) { + a = objA; + b = objB; + c = objC; + d = objD; + e = objE; + f = objF; + g = objG; + h = objH; + } + + /** + * @return 1st object + */ + public T1 getA() { + return a; + } + + /** + * @return 2nd object + */ + public T2 getB() { + return b; + } + + /** + * @return 3rd object + */ + public T3 getC() { + return c; + } + + /** + * @return 4th object + */ + public T4 getD() { + return d; + } + + /** + * @return 5th object + */ + public T5 getE() { + return e; + } + + /** + * @return 6th object + */ + public T6 getF() { + return f; + } + + /** + * @return 7th object + */ + public T7 getG() { + return g; + } + + /** + * @return 8th object + */ + public T8 getH() { + return h; + } + + /** + * @return 1st object + */ + public T1 get1() { + return a; + } + + /** + * @return 2nd object + */ + public T2 get2() { + return b; + } + + /** + * @return 3rd object + */ + public T3 get3() { + return c; + } + + /** + * @return 4th object + */ + public T4 get4() { + return d; + } + + /** + * @return 5th object + */ + public T5 get5() { + return e; + } + + /** + * @return 6th object + */ + public T6 get6() { + return f; + } + + /** + * @return 7th object + */ + public T7 get7() { + return g; + } + + /** + * @return 8th object + */ + public T8 get8() { + return h; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void setA(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void setB(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void setC(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void setD(T4 obj) { + d = obj; + } + + /** + * Set 5th object + * + * @param obj 5th object + */ + public void setE(T5 obj) { + e = obj; + } + + /** + * Set 6th object + * + * @param obj 6th object + */ + public void setF(T6 obj) { + f = obj; + } + + /** + * Set 7th object + * + * @param obj 6th object + */ + public void setG(T7 obj) { + g = obj; + } + + /** + * Set 8th object + * + * @param obj 6th object + */ + public void setH(T8 obj) { + h = obj; + } + + /** + * Set 1st object + * + * @param obj 1st object + */ + public void set1(T1 obj) { + a = obj; + } + + /** + * Set 2nd object + * + * @param obj 2nd object + */ + public void set2(T2 obj) { + b = obj; + } + + /** + * Set 3rd object + * + * @param obj 3rd object + */ + public void set3(T3 obj) { + c = obj; + } + + /** + * Set 4th object + * + * @param obj 4th object + */ + public void set4(T4 obj) { + d = obj; + } + + /** + * Set 5th object + * + * @param obj 5th object + */ + public void set5(T5 obj) { + e = obj; + } + + /** + * Set 6th object + * + * @param obj 6th object + */ + public void set6(T6 obj) { + f = obj; + } + + /** + * Set 7th object + * + * @param obj 6th object + */ + public void set7(T7 obj) { + g = obj; + } + + /** + * Set 8th object + * + * @param obj 6th object + */ + public void set8(T8 obj) { + h = obj; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!this.getClass().equals(obj.getClass())) { + return false; + } + + Struct8 t = (Struct8) obj; + + return Calc.areObjectsEqual(a, t.a) && Calc.areObjectsEqual(b, t.b) && Calc.areObjectsEqual(c, t.c) && Calc.areObjectsEqual(d, t.d) + && Calc.areObjectsEqual(e, t.e) && Calc.areObjectsEqual(f, t.f) && Calc.areObjectsEqual(g, t.g) && Calc.areObjectsEqual(h, t.h); + + } + + @Override + public int hashCode() { + int hash = 0; + hash += (a == null ? 0 : a.hashCode()); + hash += (b == null ? 0 : b.hashCode()); + hash += (c == null ? 0 : c.hashCode()); + hash += (d == null ? 0 : d.hashCode()); + hash += (e == null ? 0 : e.hashCode()); + hash += (f == null ? 0 : f.hashCode()); + hash += (g == null ? 0 : g.hashCode()); + hash += (h == null ? 0 : h.hashCode()); + return hash; + } + + @Override + public String toString() { + return "STRUCT {" + a + "," + b + "," + c + "," + d + "," + e + "," + f + "," + g + "," + h + "}"; + } + +} diff --git a/src/com/porcupine/time/FpsMeter.java b/src/com/porcupine/time/FpsMeter.java new file mode 100644 index 0000000..1af2de0 --- /dev/null +++ b/src/com/porcupine/time/FpsMeter.java @@ -0,0 +1,54 @@ +package com.porcupine.time; + + +/** + * Class for counting FPS in games.
+ * This class can be used also as a simple frequency meter - output is in Hz. + * + * @author MightyPork + */ +public class FpsMeter { + + private long frames = 0; + private long drops = 0; + private long lastTimeMillis = System.currentTimeMillis(); + private long lastSecFPS = 0; + private long lastSecDrop = 0; + + /** + * @return current second's FPS + */ + public long getFPS() { + return lastSecFPS; + } + + /** + * Notification that frame was rendered + */ + public void frame() { + if (System.currentTimeMillis() - lastTimeMillis > 1000) { + lastSecFPS = frames; + lastSecDrop = drops; + frames = 0; + drops = 0; + lastTimeMillis = System.currentTimeMillis(); + } + frames++; + } + + /** + * Notification that some frames have been dropped + * + * @param dropped dropped frames + */ + public void drop(int dropped) { + drops += dropped; + } + + /** + * @return current second's dropped frames + */ + public long getDropped() { + return lastSecDrop; + } +} diff --git a/src/com/porcupine/time/Timer.java b/src/com/porcupine/time/Timer.java new file mode 100644 index 0000000..b87c9b9 --- /dev/null +++ b/src/com/porcupine/time/Timer.java @@ -0,0 +1,130 @@ +package com.porcupine.time; + + +import com.porcupine.math.Calc; + + +/** + * Precise game timer + */ +public class Timer { + + /** + * Ticks elapsed since last updateTimer().
+ * Used to count how many frames to skip. + */ + public int ticksMissed; + + + /** Speed multiplier. */ + public float timerSpeedMultiplier; + + + /** + * How much of the next tick has already elapsed. + */ + public float renderDeltaTime; + + + /** + * How many update ticks are to be run since last time + * + * @return update ticks needed + */ + public int getTicksMissed() { + return ticksMissed; + } + + /** + * Get render delta time, 0-1 + * + * @return delta time + */ + public double getDeltaTime() { + return renderDeltaTime; + } + + /** + * @return speed multiplier + */ + public double getSpeed() { + return timerSpeedMultiplier; + } + + /** + * Set speed multiplier + * + * @param speed new speed multiplier + */ + public void setSpeed(double speed) { + timerSpeedMultiplier = (float) speed; + } + + + + private float ticksPerSecond; + private double lastUpdateSecs; + private long lastUpdateMillis; + private long lastSyncMillis; + private long syncCounter; + private double timeSyncAdjustment; + + + /** + * init timer + * + * @param ticksPerSecond logic update ticks per second + */ + public Timer(float ticksPerSecond) { + timerSpeedMultiplier = 1.0F; + renderDeltaTime = 0.0F; + timeSyncAdjustment = 1.0D; + this.ticksPerSecond = ticksPerSecond; + + lastUpdateMillis = System.currentTimeMillis(); + lastSyncMillis = System.nanoTime() / 1000000; + } + + /** + * Updates all fields of the Timer using the current time + */ + public void update() { + long l = System.currentTimeMillis(); + long deltaMillis = l - lastUpdateMillis; + long millis = System.nanoTime() / 1000000; + double secs = millis / 1000D; + + if (deltaMillis > 1000L) { + lastUpdateSecs = secs; + } else if (deltaMillis < 0L) { + lastUpdateSecs = secs; + } else { + syncCounter += deltaMillis; + + if (syncCounter > 1000L) { + long d1 = millis - lastSyncMillis; + double d2 = (double) syncCounter / (double) d1; + timeSyncAdjustment += (d2 - timeSyncAdjustment) * 0.2D; + lastSyncMillis = millis; + syncCounter = 0L; + } + + if (syncCounter < 0L) { + lastSyncMillis = millis; + } + } + + lastUpdateMillis = l; + + double delta = (secs - lastUpdateSecs) * timeSyncAdjustment; + lastUpdateSecs = secs; + + delta = Calc.clampd(delta, 0, 1); + + renderDeltaTime += delta * timerSpeedMultiplier * ticksPerSecond; + ticksMissed = (int) renderDeltaTime; + renderDeltaTime -= ticksMissed; + + ticksMissed = Calc.clampi(ticksMissed, 0, 10); + } +} diff --git a/src/com/porcupine/util/FileSuffixFilter.java b/src/com/porcupine/util/FileSuffixFilter.java new file mode 100644 index 0000000..8fe85fd --- /dev/null +++ b/src/com/porcupine/util/FileSuffixFilter.java @@ -0,0 +1,36 @@ +package com.porcupine.util; + + +import java.io.File; +import java.io.FileFilter; + + +/** + * File filter for certain suffixes + * + * @author MightyPork + */ +public class FileSuffixFilter implements FileFilter { + + /** Array of allowed suffixes */ + private String[] suffixes = null; + + /** + * Suffix filter + * + * @param suffixes var-args allowed suffixes, case insensitive + */ + public FileSuffixFilter(String... suffixes) { + this.suffixes = suffixes; + } + + @Override + public boolean accept(File pathname) { + //System.out.println(pathname); + for (String suffix : suffixes) { + return pathname.isFile() && pathname.getName().toLowerCase().trim().endsWith(suffix.toLowerCase().trim()); + } + return false; + } + +} diff --git a/src/com/porcupine/util/FileUtils.java b/src/com/porcupine/util/FileUtils.java new file mode 100644 index 0000000..8ab4312 --- /dev/null +++ b/src/com/porcupine/util/FileUtils.java @@ -0,0 +1,182 @@ +package com.porcupine.util; + + +import java.io.DataInputStream; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import net.sector.util.Log; + + +/** + * Utilities for filesystem + * + * @author MightyPork + */ +public class FileUtils { + + private enum EnumOS { + linux, solaris, windows, macos, unknown; + } + + /** + * get working directory path ending with slash + * + * @param dirname name of the directory, dot will be added automatically + * @return File path to the folder + */ + public static File getAppDir(String dirname) { + String s = System.getProperty("user.home", "."); + File file; + + switch (getOs()) { + case linux: + case solaris: + file = new File(s, "." + dirname + '/'); + break; + + case windows: + String s1 = System.getenv("APPDATA"); + + if (s1 != null) { + file = new File(s1, "." + dirname + '/'); + } else { + file = new File(s, "." + dirname + '/'); + } + + break; + + case macos: + file = new File(s, "Library/Application Support/" + dirname); + break; + + default: + file = new File(s, dirname + "/"); + break; + } + + if (!file.exists() && !file.mkdirs()) { + throw new RuntimeException((new StringBuilder()).append("The working directory could not be created: ").append(file).toString()); + } else { + return file; + } + } + + private static EnumOS getOs() { + String s = System.getProperty("os.name").toLowerCase(); + + if (s.contains("win")) { + return EnumOS.windows; + } + + if (s.contains("mac")) { + return EnumOS.macos; + } + + if (s.contains("solaris")) { + return EnumOS.solaris; + } + + if (s.contains("sunos")) { + return EnumOS.solaris; + } + + if (s.contains("linux")) { + return EnumOS.linux; + } + + if (s.contains("unix")) { + return EnumOS.linux; + } else { + return EnumOS.unknown; + } + } + + /** + * Get files in a folder (create folder if needed) + * + * @param dir folder + * @param filter file filter + * @return list of files + */ + public static List listFolder(File dir, FileFilter filter) { + try { + dir.mkdir(); + } catch (RuntimeException e) { + Log.e("Error creating folder " + dir, e); + } + + List list = new ArrayList(); + + try { + for (File f : dir.listFiles(filter)) { + list.add(f); + } + } catch (Exception e) { + Log.e("Error listing folder " + dir, e); + } + + return list; + } + + /** + * Get files in a folder (create folder if needed) + * + * @param dir folder + * @return list of files + */ + public static List listFolder(File dir) { + return listFolder(dir, null); + } + + /** + * Remove extension. + * + * @param file file + * @return filename without extension + */ + public static String removeExtension(File file) { + return removeExtension(file.getName()); + } + + /** + * Remove extension. + * + * @param filename + * @return filename without extension + */ + public static String removeExtension(String filename) { + String[] parts = filename.split("[.]"); + String out = ""; + for (int i = 0; i < parts.length - 1; i++) { + out += parts[i]; + } + + return out; + } + + /** + * Read entire file to a string. + * + * @param file file + * @return file contents + * @throws IOException + */ + public static String fileToString(File file) throws IOException { + String result = null; + DataInputStream in = null; + + byte[] buffer = new byte[(int) file.length()]; + in = new DataInputStream(new FileInputStream(file)); + in.readFully(buffer); + result = new String(buffer); + in.close(); + + return result; + } + +} diff --git a/src/com/porcupine/util/PropertyManager.java b/src/com/porcupine/util/PropertyManager.java new file mode 100644 index 0000000..0bf251f --- /dev/null +++ b/src/com/porcupine/util/PropertyManager.java @@ -0,0 +1,997 @@ +package com.porcupine.util; + + +import java.io.*; +import java.util.*; +import java.util.Map.Entry; + +import org.lwjgl.input.Keyboard; + + +/** + * Property manager with advanced formatting and value checking.
+ * Methods starting with put are for filling. Most of the others are shortcuts + * to getters. + * + * @author MightyPork + */ +public class PropertyManager { + /** + * Properties stored in file, alphabetically sorted.
+ * Property file is much cleaner than the normal java.util.Properties, + * newlines can be inserted to separate categories, and individual keys can + * have their own inline comments. + * + * @author MightyPork + * @copy (c) 2012 + */ + private static class PC_SortedProperties extends Properties { + + /** A table of hex digits */ + private static final char[] hexDigit_custom = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + /** + * this is here because the original method is private. + * + * @param nibble + * @return hex char. + */ + private static char toHex_custom(int nibble) { + return hexDigit_custom[(nibble & 0xF)]; + } + + private static void writeComments_custom(BufferedWriter bw, String comm) throws IOException { + + String comments = comm.replace("\n\n", "\n \n"); + + int len = comments.length(); + int current = 0; + int last = 0; + char[] uu = new char[6]; + uu[0] = '\\'; + uu[1] = 'u'; + while (current < len) { + char c = comments.charAt(current); + if (c > '\u00ff' || c == '\n' || c == '\r') { + if (last != current) { + bw.write("# " + comments.substring(last, current)); + } + + + + if (c > '\u00ff') { + uu[2] = toHex_custom((c >> 12) & 0xf); + uu[3] = toHex_custom((c >> 8) & 0xf); + uu[4] = toHex_custom((c >> 4) & 0xf); + uu[5] = toHex_custom(c & 0xf); + bw.write(new String(uu)); + } else { + bw.newLine(); + if (c == '\r' && current != len - 1 && comments.charAt(current + 1) == '\n') { + current++; + } + // if (current == len - 1 || (comments.charAt(current + 1) != '#' && comments.charAt(current + 1) != '!')) + // bw.write("#"); + } + last = current + 1; + } + current++; + } + if (last != current) { + bw.write("# " + comments.substring(last, current)); + } + bw.newLine(); + bw.newLine(); + bw.newLine(); + } + + /** Option: put empty line before each comment. */ + public boolean cfgEmptyLineBeforeComment = true; + /** + * Option: Separate sections by newline
+ * Section = string before first dot in key. + */ + public boolean cfgSeparateSectionsByEmptyLine = true; + + private boolean firstEntry = true; + + private Hashtable keyComments = new Hashtable(); + + private String lastSectionBeginning = ""; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public synchronized Enumeration keys() { + Enumeration keysEnum = super.keys(); + Vector keyList = new Vector(); + while (keysEnum.hasMoreElements()) { + keyList.add(keysEnum.nextElement()); + } + Collections.sort(keyList); + return keyList.elements(); + } + + private String saveConvert_custom(String theString, boolean escapeSpace, boolean escapeUnicode) { + + int len = theString.length(); + int bufLen = len * 2; + if (bufLen < 0) { + bufLen = Integer.MAX_VALUE; + } + StringBuffer outBuffer = new StringBuffer(bufLen); + + for (int x = 0; x < len; x++) { + char aChar = theString.charAt(x); + // Handle common case first, selecting largest block that + // avoids the specials below + if ((aChar > 61) && (aChar < 127)) { + if (aChar == '\\') { + outBuffer.append('\\'); + outBuffer.append('\\'); + continue; + } + outBuffer.append(aChar); + continue; + } + switch (aChar) { + case ' ': + if (x == 0 || escapeSpace) { + outBuffer.append('\\'); + } + outBuffer.append(' '); + break; + case '\t': + outBuffer.append('\\'); + outBuffer.append('t'); + break; + case '\n': + outBuffer.append('\\'); + outBuffer.append('n'); + break; + case '\r': + outBuffer.append('\\'); + outBuffer.append('r'); + break; + case '\f': + outBuffer.append('\\'); + outBuffer.append('f'); + break; + case '=': // Fall through + case ':': // Fall through + case '#': // Fall through + case '!': + outBuffer.append('\\'); + outBuffer.append(aChar); + break; + default: + if (((aChar < 0x0020) || (aChar > 0x007e)) & escapeUnicode) { + outBuffer.append('\\'); + outBuffer.append('u'); + outBuffer.append(toHex_custom((aChar >> 12) & 0xF)); + outBuffer.append(toHex_custom((aChar >> 8) & 0xF)); + outBuffer.append(toHex_custom((aChar >> 4) & 0xF)); + outBuffer.append(toHex_custom(aChar & 0xF)); + } else { + outBuffer.append(aChar); + } + } + } + return outBuffer.toString(); + } + + /** + * Set additional comment to a key + * + * @param key key for comment + * @param comment the comment + */ + public void setKeyComment(String key, String comment) { + keyComments.put(key, comment); + } + + @Override + public void store(OutputStream out, String comments) throws IOException { + store_custom(new BufferedWriter(new OutputStreamWriter(out, "UTF-8")), comments, false); + } + + @SuppressWarnings("rawtypes") + private void store_custom(BufferedWriter bw, String comments, boolean escUnicode) throws IOException { + if (comments != null) { + writeComments_custom(bw, comments); + } + synchronized (this) { + for (Enumeration e = keys(); e.hasMoreElements();) { + + boolean wasNewLine = false; + + String key = (String) e.nextElement(); + String val = (String) get(key); + key = saveConvert_custom(key, true, escUnicode); + val = saveConvert_custom(val, false, escUnicode); + + if (cfgSeparateSectionsByEmptyLine && !lastSectionBeginning.equals(key.split("[.]")[0])) { + + if (!firstEntry) { + bw.newLine(); + bw.newLine(); + } + + wasNewLine = true; + lastSectionBeginning = key.split("[.]")[0]; + } + + if (keyComments.containsKey(key)) { + String cm = keyComments.get(key); + cm = cm.replace("\r", "\n"); + cm = cm.replace("\r\n", "\n"); + cm = cm.replace("\n\n", "\n \n"); + + String[] cmlines = cm.split("\n"); + + if (!wasNewLine && !firstEntry && cfgEmptyLineBeforeComment) { + bw.newLine(); + } + for (String cmline : cmlines) { + bw.write("# " + cmline); + bw.newLine(); + } + } + + bw.write(key + " = " + val); + bw.newLine(); + + firstEntry = false; + } + } + bw.flush(); + } + } + + /** + * Helper class which loads Properties from UTF-8 file (Properties use + * "ISO-8859-1" by default) + * + * @author Itay Maman + */ + private static class PropertiesLoader { + private static String escapifyStr(String str) { + StringBuilder result = new StringBuilder(); + + int len = str.length(); + for (int x = 0; x < len; x++) { + char ch = str.charAt(x); + if (ch <= 0x007e) { + result.append(ch); + continue; + } + + result.append('\\'); + result.append('u'); + result.append(hexDigit(ch, 12)); + result.append(hexDigit(ch, 8)); + result.append(hexDigit(ch, 4)); + result.append(hexDigit(ch, 0)); + } + return result.toString(); + } + + private static char hexDigit(char ch, int offset) { + int val = (ch >> offset) & 0xF; + if (val <= 9) { + return (char) ('0' + val); + } + + return (char) ('A' + val - 10); + } + + public static PC_SortedProperties loadProperties(PC_SortedProperties props, InputStream is) throws IOException { + return loadProperties(props, is, "utf-8"); + } + + + public static PC_SortedProperties loadProperties(PC_SortedProperties props, InputStream is, String encoding) throws IOException { + StringBuilder sb = new StringBuilder(); + InputStreamReader isr = new InputStreamReader(is, encoding); + while (true) { + int temp = isr.read(); + if (temp < 0) { + break; + } + + char c = (char) temp; + sb.append(c); + } + + String read = sb.toString(); + + String inputString = escapifyStr(read); + byte[] bs = inputString.getBytes("ISO-8859-1"); + ByteArrayInputStream bais = new ByteArrayInputStream(bs); + + PC_SortedProperties ps = props; + ps.load(bais); + return ps; + } + } + + /** + * Property entry in Property manager. + * + * @author MightyPork + * @copy (c) 2012 + */ + private class Property { + public boolean bool = false; + public String entryComment; + public boolean defbool = false; + public int defnum = -1; + + public String defstr = ""; + public String name; + public int num = -1; + public String str = ""; + public PropertyType type; + + /** + * Property + * + * @param key key + * @param default_value default value + * @param entry_type type + * @param entry_comment entry comment + */ + public Property(String key, boolean default_value, PropertyType entry_type, String entry_comment) { + name = key; + defbool = default_value; + type = entry_type; + entryComment = entry_comment; + } + + /** + * Property entry + * + * @param key property key + * @param default_value default value + * @param entry_type property type from enum + * @param entry_comment property comment or null + */ + public Property(String key, int default_value, PropertyType entry_type, String entry_comment) { + name = key; + defnum = default_value; + type = entry_type; + entryComment = entry_comment; + } + + /** + * Property + * + * @param key key + * @param default_value default value + * @param entry_type type + * @param entry_comment entry comment + */ + public Property(String key, String default_value, PropertyType entry_type, String entry_comment) { + name = key; + defstr = default_value; + type = entry_type; + entryComment = entry_comment; + } + + /** + * Get boolean + * + * @return the boolean + */ + public boolean getBoolean() { + return bool; + } + + /** + * Get number + * + * @return the number + */ + public int getInteger() { + return num; + } + + /** + * Get string + * + * @return the string + */ + public String getString() { + return str; + } + + /** + * is this key pressed? + * + * @return pressed state + */ + public boolean isKeyDown() { + return type == PropertyType.KEY && Keyboard.isKeyDown(num); + } + + /** + * Is this entry valid? + * + * @return is valid + */ + public boolean isValid() { + if (type == PropertyType.KEY) { + return Keyboard.getKeyName(num) != null; + } + if (type == PropertyType.STRING) { + return str != null; + } + if (type == PropertyType.BOOLEAN || type == PropertyType.INT) { + return true; + } + return false; + } + + /** + * Load property value from a file + * + * @param string the string loaded + * @return this entry + */ + public boolean parse(String string) { + if (type == PropertyType.INT) { + if (string == null) { + //Log.finest("* Numeric property \"" + name + "\" not set, setting to default \"" + defnum + "\""); + num = defnum; + return false; + } + try { + num = Integer.parseInt(string.trim()); + } catch (NumberFormatException e) { + //Log.warning("Numeric property \"" + name + "\" has invalid value \"" + string + "\". Falling back to default \"" + defnum + "\""); + num = defnum; + } + } + + if (type == PropertyType.KEY) { + if (string == null) { + //Log.finest("* Key property \"" + name + "\" not set, setting to default \"" + Keyboard.getKeyName(defnum) + "\""); + num = defnum; + return false; + } + num = Keyboard.getKeyIndex(string); + if (num == Keyboard.KEY_NONE) { + //Log.warning("Key property \"" + name + "\" has invalid value \"" + string + "\". Falling back to default \"" + // + Keyboard.getKeyName(defnum) + "\""); + num = defnum; + } + } + + if (type == PropertyType.STRING) { + if (string == null) { + //Log.finest("* String property \"" + name + "\" not set, setting to default \"" + defstr + "\""); + str = defstr; + return false; + } + this.str = string; + } + + if (type == PropertyType.BOOLEAN) { + if (string == null) { + //Log.finest("* Boolean property \"" + name + "\" not set, setting to default \"" + defbool + "\""); + bool = defbool; + return false; + } + String string2 = string.toLowerCase(); + bool = string2.equals("yes") || string2.equals("true") || string2.equals("on") || string2.equals("enabled") + || string2.equals("enable"); + } + + return true; + } + + /** + * prepare the contents for insertion into Properties + * + * @return the string prepared, or null if type is invalid + */ + @Override + public String toString() { + if (!isValid()) { + if (type == PropertyType.INT) { + num = defnum; + } + } + if (type == PropertyType.INT) { + return Integer.toString(num); + } + if (type == PropertyType.STRING) { + return str; + } + if (type == PropertyType.KEY) { + return Keyboard.getKeyName(num) == null ? "none" : Keyboard.getKeyName(num); + } + if (type == PropertyType.BOOLEAN) { + return bool ? "True" : "False"; + } + return null; + } + + /** + * If this entry is not valid, change it to the dafault value. + */ + public void validate() { + if (!isValid()) { + if (type == PropertyType.KEY) { + //Log.warning("Key property \"" + name + "\" has invalid value (unknown key name). Falling back to default value \"" + // + Keyboard.getKeyName(defnum) + "\""); + num = defnum; + } + if (type == PropertyType.STRING) { + //Log.warning("String property \"" + name + "\" has invalid value (NULL). Falling back to default value \"" + defstr + "\""); + str = defstr; + } + } + } + } + + /** + * Property type enum. + * + * @author MightyPork + * @copy (c) 2012 + */ + private enum PropertyType { + BOOLEAN, INT, KEY, STRING; + } + + /** + * Option to put newline before inline comments + */ + private boolean cfgNewlineBeforeComments = true; + /** Disable entry validation */ + private boolean cfgNoValidate = true; + + /** + * Option to put newline between sections.
+ * Sections are detected by text before first dot in identifier. + */ + private boolean cfgSeparateSections = true; + + /** + * Disables enter-leave logging. + */ + private boolean cfgSilent = false; + + private String comment = ""; + + private TreeMap entries; + + + private String filename; + + private TreeMap keyRename; + + private PC_SortedProperties pr = new PC_SortedProperties(); + + private TreeMap setValues; + + /** + * Create property manager from file path and an initial comment. + * + * @param filename file with the props + * @param comment the initial comment. Use \n in it if you want. + */ + public PropertyManager(String filename, String comment) { + this.filename = filename; + this.entries = new TreeMap(); + this.setValues = new TreeMap(); + this.keyRename = new TreeMap(); + this.comment = comment; + } + + /** + * Load, fix and write to file. + */ + public void apply() { + + if (!cfgSilent) { + //Log.finest("Loading configuration from file \"" + filename + "\""); + } + + boolean needsSave = false; + try { + + new File((new File(filename)).getParent()).mkdirs(); + + pr = PropertiesLoader.loadProperties(pr, new FileInputStream(filename)); + + } catch (IOException e) { + needsSave = true; + pr = new PC_SortedProperties(); + } + + pr.cfgSeparateSectionsByEmptyLine = cfgSeparateSections; + pr.cfgEmptyLineBeforeComment = cfgNewlineBeforeComments; + + ArrayList keyList = new ArrayList(); + + // rename keys + for (Entry entry : keyRename.entrySet()) { + if (pr.getProperty(entry.getKey()) == null) { + continue; + } + pr.setProperty(entry.getValue(), pr.getProperty(entry.getKey())); + pr.remove(entry.getKey()); + needsSave = true; + } + + // set the override values into the freshly loaded properties file + for (Entry entry : setValues.entrySet()) { + pr.setProperty(entry.getKey(), entry.getValue()); + needsSave = true; + } + + + // validate entries one by one, replace with default when needed + for (Property entry : entries.values()) { + + keyList.add(entry.name); + + String propOrig = pr.getProperty(entry.name); + if (!entry.parse(propOrig)) needsSave = true; + if (!cfgNoValidate) { + entry.validate(); + } + + if (entry.entryComment != null) { + pr.setKeyComment(entry.name, entry.entryComment); + } + + if (propOrig == null || !entry.toString().equals(propOrig)) { + + pr.setProperty(entry.name, entry.toString()); + + needsSave = true; + } + } + + // removed unused props + for (String propname : pr.keySet().toArray(new String[pr.size()])) { + + if (!keyList.contains(propname)) { + pr.remove(propname); + //Log.finest("* Removing unused property \"" + propname + "\" from config file " + filename); + needsSave = true; + } + + } + + // save if needed + if (needsSave) { + try { + //Log.finest("* Saving modified property file " + filename); + pr.store(new FileOutputStream(filename), comment); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + + if (!cfgSilent) { + //Log.finest("Configuration loaded."); + } + + setValues.clear(); + keyRename.clear(); + } + + /** + * Get boolean property + * + * @param n key + * @return the boolean found, or false + */ + public Boolean bool(String n) { + return getBoolean(n); + } + + /** + * @param newlineBeforeComments put newline before comments + */ + public void cfgNewlineBeforeComments(boolean newlineBeforeComments) { + this.cfgNewlineBeforeComments = newlineBeforeComments; + } + + /** + * @param separateSections do separate sections by newline + */ + public void cfgSeparateSections(boolean separateSections) { + this.cfgSeparateSections = separateSections; + } + + /** + * @param silent the cfgSilent to set + */ + public void cfgSilent(boolean silent) { + this.cfgSilent = silent; + } + + /** + * @param validate enable validation + */ + public void enableValidation(boolean validate) { + this.cfgNoValidate = !validate; + } + + /** + * Get boolean property + * + * @param n key + * @return the boolean found, or false + */ + public Boolean flag(String n) { + return getBoolean(n); + } + + /** + * Get a property entry (rarely used) + * + * @param n key + * @return the entry + */ + private Property get(String n) { + try { + return entries.get(n); + } catch (Throwable t) { + return null; + } + } + + /** + * Get boolean property + * + * @param n key + * @return the boolean found, or false + */ + public Boolean getBoolean(String n) { + try { + return entries.get(n).getBoolean(); + } catch (Throwable t) { + return false; + } + } + + /** + * Get numeric property + * + * @param n key + * @return the int found, or null + */ + public Integer getInt(String n) { + return getInteger(n); + } + + /** + * Get numeric property + * + * @param n key + * @return the int found, or null + */ + public Integer getInteger(String n) { + try { + return get(n).getInteger(); + } catch (Throwable t) { + return -1; + } + } + + /** + * Get numeric property + * + * @param n key + * @return the int found, or null + */ + public Integer getNum(String n) { + return getInteger(n); + } + + /** + * Get string property + * + * @param n key + * @return the string found, or null + */ + public String getString(String n) { + try { + return get(n).getString(); + } catch (Throwable t) { + return null; + } + } + + /** + * Get numeric property + * + * @param n key + * @return the int found, or null + */ + public Integer integer(String n) { + try { + return get(n).getInteger(); + } catch (Throwable t) { + return -1; + } + } + + /** + * Is the key pressed? (works only for properties of type KEY) + * + * @param n key of the key property + * @return is pressed + */ + public Boolean isKeyDown(String n) { + try { + return entries.get(n).isKeyDown(); + } catch (Throwable t) { + return false; + } + } + + /** + * Get numeric property + * + * @param n key + * @return the int found, or null + */ + public Integer num(String n) { + return getInteger(n); + } + + /** + * Add a boolean property + * + * @param n key + * @param d default value + */ + public void putBoolean(String n, boolean d) { + entries.put(n, new Property(n, d, PropertyType.BOOLEAN, null)); + return; + } + + /** + * Add a boolean property + * + * @param n key + * @param d default value + * @param comment the in-file comment + */ + public void putBoolean(String n, boolean d, String comment) { + entries.put(n, new Property(n, d, PropertyType.BOOLEAN, comment)); + return; + } + + /** + * Add a numeric property + * + * @param n key + * @param d default value + */ + public void putInteger(String n, int d) { + entries.put(n, new Property(n, d, PropertyType.INT, null)); + return; + } + + /** + * Add a numeric property + * + * @param n key + * @param d default value + * @param comment the in-file comment + */ + public void putInteger(String n, int d, String comment) { + entries.put(n, new Property(n, d, PropertyType.INT, comment)); + return; + } + + /** + * Add a numeric property + * + * @param n key + * @param d default value + */ + public void putKey(String n, int d) { + entries.put(n, new Property(n, d, PropertyType.KEY, null)); + return; + } + + /** + * Add a numeric property + * + * @param n key + * @param d default value + * @param comment the in-file comment + */ + public void putKey(String n, int d, String comment) { + entries.put(n, new Property(n, d, PropertyType.KEY, comment)); + return; + } + + /** + * Add a string property + * + * @param n key + * @param d default value + */ + public void putString(String n, String d) { + entries.put(n, new Property(n, d, PropertyType.STRING, null)); + return; + } + + /** + * Add a string property + * + * @param n key + * @param d default value + * @param comment the in-file comment + */ + public void putString(String n, String d, String comment) { + entries.put(n, new Property(n, d, PropertyType.STRING, comment)); + return; + } + + + + /** + * Rename key before doing "apply"; value is preserved + * + * @param oldKey old key + * @param newKey new key + */ + public void renameKey(String oldKey, String newKey) { + keyRename.put(oldKey, newKey); + return; + } + + + + /** + * Set value saved to certain key; use to save runtime-changed configuration + * values. + * + * @param key key + * @param value the saved value + */ + public void setValue(String key, Object value) { + setValues.put(key, value.toString()); + return; + } + + /** + * Get string property + * + * @param n key + * @return the string found, or null + */ + public String str(String n) { + try { + return get(n).getString(); + } catch (Throwable t) { + return null; + } + } + + + + /** + * Get string property + * + * @param n key + * @return the string found, or null + */ + public String string(String n) { + try { + return get(n).getString(); + } catch (Throwable t) { + return null; + } + } +} \ No newline at end of file diff --git a/src/com/porcupine/util/StringUtils.java b/src/com/porcupine/util/StringUtils.java new file mode 100644 index 0000000..bfa1000 --- /dev/null +++ b/src/com/porcupine/util/StringUtils.java @@ -0,0 +1,104 @@ +package com.porcupine.util; + + +/** + * General purpose string utilities + * + * @author MightyPork + */ +public class StringUtils { + + /** + * Get if string is in array + * + * @param needle checked string + * @param case_sensitive case sensitive comparision + * @param haystack array of possible values + * @return is in array + */ + public static boolean isInArray(String needle, boolean case_sensitive, String... haystack) { + if (case_sensitive) { + for (String s : haystack) { + if (needle.equals(s)) return true; + } + return false; + } else { + for (String s : haystack) { + if (needle.equalsIgnoreCase(s)) return true; + } + return false; + } + } + + /** + * Repeat a string + * + * @param repeated string + * @param count + * @return output + */ + public static String repeat(String repeated, int count) { + String s = ""; + for (int i = 0; i < count; i++) + s += repeated; + return s; + } + + /** + * convert string to a same-length sequence of # marks + * + * @param password password + * @return encoded + */ + public static String passwordify(String password) { + return passwordify(password, "#"); + } + + + /** + * convert string to a same-length sequence of chars + * + * @param password password + * @param replacing character used in output + * @return encoded + */ + public static String passwordify(String password, String replacing) { + return repeat(replacing, password.length()); + } + + /** + * Get ordinal version of numbers (1 = 1st, 5 = 5th etc.) + * + * @param number number + * @return ordinal, string + */ + public static String numberToOrdinal(int number) { + if (number % 100 < 4 || number % 100 > 13) { + if (number % 10 == 1) return number + "st"; + if (number % 10 == 2) return number + "nd"; + if (number % 10 == 3) return number + "rd"; + } + return number + "th"; + } + + /** + * Format number with thousands separated by a dot. + * + * @param number number + * @return string 12.004.225 + */ + public static String formatInt(long number) { + String num = number + ""; + String out = ""; + String dot = "."; + int cnt = 1; + for (int i = num.length() - 1; i >= 0; i--) { + out = num.charAt(i) + out; + if (cnt % 3 == 0 && i > 0) out = dot + out; + cnt++; + } + + return out; + } + +} diff --git a/src/com/porcupine/util/VarargsParser.java b/src/com/porcupine/util/VarargsParser.java new file mode 100644 index 0000000..54d1e46 --- /dev/null +++ b/src/com/porcupine/util/VarargsParser.java @@ -0,0 +1,51 @@ +package com.porcupine.util; + + +import java.util.LinkedHashMap; + + +/** + * Varargs parser
+ * Converts an array of repeated "key, value" pairs to a LinkedHashMap.
+ * example: + * + *
+ * Object[] array = { "one", 1, "two", 4, "three", 9, "four", 16 };
+ * Map<String, Integer> args = new VarargsParser<String, Integer>().parse(array);
+ * 
+ * + * @author MightyPork + * @param Type for Map keys + * @param Type for Map values + */ +public class VarargsParser { + /** + * Parse array of vararg key, value pairs to a LinkedHashMap. + * + * @param args varargs + * @return LinkedHashMap + * @throws ClassCastException in case of incompatible type in the array + * @throws IllegalArgumentException in case of invalid array length (odd) + */ + @SuppressWarnings("unchecked") + public LinkedHashMap parse(Object... args) throws ClassCastException, IllegalArgumentException { + LinkedHashMap attrs = new LinkedHashMap(); + + if (args.length % 2 != 0) { + throw new IllegalArgumentException("Odd number of elements in varargs map!"); + } + + K key = null; + for (Object o : args) { + if (key == null) { + if (o == null) throw new RuntimeException("Key cannot be NULL in varargs map."); + key = (K) o; + } else { + attrs.put(key, (V) o); + key = null; + } + } + + return attrs; + } +} diff --git a/src/net/sector/App.java b/src/net/sector/App.java new file mode 100644 index 0000000..29344f3 --- /dev/null +++ b/src/net/sector/App.java @@ -0,0 +1,556 @@ +package net.sector; + + +import static org.lwjgl.opengl.GL11.*; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.PrintWriter; +import java.io.RandomAccessFile; +import java.io.StringWriter; +import java.nio.ByteBuffer; +import java.nio.channels.FileLock; + +import javax.swing.*; + +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenMenuMain; +import net.sector.gui.screens.ScreenSplash; +import net.sector.input.Keys; +import net.sector.level.SuperContext; +import net.sector.sounds.Sounds; +import net.sector.threads.ThreadSaveScreenshot; +import net.sector.util.Log; +import net.sector.util.Utils; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.openal.AL; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.PixelFormat; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; +import com.porcupine.time.FpsMeter; +import com.porcupine.time.Timer; +import com.porcupine.util.FileUtils; + + + +/** + * SECTOR main class + * + * @author MightyPork + */ +public class App { + + /** Flag indicating that network threads failed to load. */ + public static boolean offlineMode = false; + + /** instance */ + public static App inst; + + private static DisplayMode windowDisplayMode = null; + + /** current screen */ + public static Screen screen = null; + + private static boolean lockInstance() { + final File lockFile = new File(Utils.getGameFolder(), ".lock"); + try { + final RandomAccessFile randomAccessFile = new RandomAccessFile(lockFile, "rw"); + final FileLock fileLock = randomAccessFile.getChannel().tryLock(); + if (fileLock != null) { + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + try { + fileLock.release(); + randomAccessFile.close(); + lockFile.delete(); + } catch (Exception e) { + System.out.println("Unable to remove lock file."); + e.printStackTrace(); + } + } + }); + return true; + } + } catch (Exception e) { + System.out.println("Unable to create and/or lock file."); + e.printStackTrace(); + } + return false; + } + + /** + * Is if FS + * + * @return is in fs + */ + public static boolean isFullscreen() { + return Display.isFullscreen(); + } + + + /** + * @param args + */ + public static void main(String[] args) { + + inst = new App(); + try { + inst.start(); + } catch (Throwable t) { + showCrashReport(t); + } + + } + + /** + * Show crash report dialog with error stack trace. + * + * @param error + */ + public static void showCrashReport(Throwable error) { + + + Log.e(error); + + try { + inst.deinit(); + } catch (Throwable t) {} + + JFrame f = new JFrame("SECTOR has crashed!"); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + f.getContentPane().setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS)); + + + StringWriter sw = new StringWriter(); + error.printStackTrace(new PrintWriter(sw)); + String exceptionAsString = sw.toString(); + + String errorLogAsString = "Not found."; + String wholeLogAsString = "Not found."; + + try { + wholeLogAsString = FileUtils.fileToString(Utils.getGameSubfolder(Constants.FILE_LOG)); + } catch (Exception e) { + e.printStackTrace(); + } + + try { + errorLogAsString = FileUtils.fileToString(Utils.getGameSubfolder(Constants.FILE_LOG_E)); + } catch (Exception e) { + e.printStackTrace(); + } + + String txt = ""; + txt = ""; + txt += "SECTOR HAS CRASHED!\n"; + txt += "\n"; + txt += "Please report it to MightyPork:\n"; + txt += "\tE-mail: ondra@ondrovo.com\n"; + txt += "\tTwitter: #MightyPork (post log via pastebin.com)\n"; + txt += "\n"; + txt += "\n"; + txt += "Version: " + Constants.VERSION_NAME + "\n"; + txt += "\n"; + txt += "\n"; + txt += "### STACK TRACE ###\n"; + txt += "\n"; + txt += exceptionAsString + "\n"; + txt += "\n"; + txt += "\n"; + txt += "### ERROR LOG ###\n"; + txt += "\n"; + txt += errorLogAsString + "\n"; + txt += "\n"; + txt += "\n"; + txt += "### FULL LOG ###\n"; + txt += "\n"; + txt += wholeLogAsString + "\n"; + + + // Create Scrolling Text Area in Swing + JTextArea ta = new JTextArea(txt, 20, 70); + ta.setFont(new Font("Courier", 0, 16)); + ta.setMargin(new Insets(10, 10, 10, 10)); + ta.setEditable(false); + ta.setLineWrap(false); + JScrollPane sbrText = new JScrollPane(ta); + sbrText.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10), BorderFactory.createEtchedBorder())); + sbrText.setWheelScrollingEnabled(true); + sbrText.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + sbrText.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + + // Create Quit Button + JButton btnQuit = new JButton("Quit"); + btnQuit.setAlignmentX(Component.CENTER_ALIGNMENT); + + btnQuit.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + + JPanel buttonPane = new JPanel(); + buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); + buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); + buttonPane.add(btnQuit); + + + f.getContentPane().add(sbrText); + f.getContentPane().add(buttonPane); + + // Close when the close button is clicked + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + + + //Display Frame + f.pack(); // Adjusts frame to size of components + + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + f.setLocation((dim.width - f.getWidth()) / 2, (dim.height - f.getHeight()) / 2); + + f.setVisible(true); + + while (true) {} + } + + + + private void deinit() { + Display.destroy(); + Mouse.destroy(); + Keyboard.destroy(); + Sounds.soundManager.clear(); + AL.destroy(); + } + + /** + * Quit to OS + */ + public void exit() { + deinit(); + System.exit(0); + } + + /** + * Get current screen + * + * @return screen + */ + public Screen getScreen() { + return screen; + } + + /** + * Get screen size + * + * @return size + */ + public Coord getSize() { + return new Coord(Display.getWidth(), Display.getHeight()); + } + +// INIT + + private void init() throws LWJGLException { + + GameConfig.initLoad(); + + Log.enable(GameConfig.logEnabled); + Log.setPrintToStdout(GameConfig.logStdOut); + + Log.i("Game version: " + Constants.VERSION_NAME); + + // init display + Display.setDisplayMode(windowDisplayMode = new DisplayMode(Constants.WINDOW_SIZE_X, Constants.WINDOW_SIZE_Y)); + Display.setResizable(GameConfig.enableResize); + Display.setVSyncEnabled(GameConfig.enableVsync); + Display.setTitle(Constants.TITLEBAR); + + int samples = GameConfig.antialiasing; + while (true) { + try { + Display.create(new PixelFormat().withSamples(samples).withAlphaBits(4)); + Log.i("Created display with " + samples + "x multisampling."); + break; + } catch (LWJGLException e) { + Log.w("Failed to create display with " + samples + "x multisampling, trying " + samples / 2 + "x."); + if (samples >= 2) { + samples /= 2; + } else if (samples == 1) { + samples = 0; + } else if (samples == 0) { + Log.e("Could not create display.", e); + exit(); + } + } + } + + + Sounds.soundManager.setMaxSources(256); + Sounds.soundManager.init(); + Sounds.setListener(Constants.LISTENER_POS); + applySoundConfig(); + Mouse.create(); + Keyboard.create(); + Keyboard.enableRepeatEvents(false); + Keys.init(); + + LoadingManager.loadForSplash(); + + StaticInitializer.initOnStartup(); + + + //Display.update(); + if (GameConfig.startInFullscreen) { + switchFullscreen(); + Display.update(); + } + } + + /** + * Apply sounds configuration (from config) + */ + public void applySoundConfig() { + Sounds.soundManager.setSoundVolume(Calc.clampf(GameConfig.audioVolumeSound / 100f, 0, 1)); + Sounds.soundManager.setMusicVolume(Calc.clampf(GameConfig.audioVolumeMusic / 100f, 0, 1)); + } + + private void start() throws LWJGLException { + + if (!lockInstance()) { + System.out.println("No more than 1 instance of Sector can be running at a time."); + + JOptionPane.showMessageDialog(null, "SECTOR is already running.", "Instance error", JOptionPane.ERROR_MESSAGE); + + exit(); + return; + } + + Log.enable(true); + Log.setPrintToStdout(true); + + init(); + mainLoop(); + deinit(); + } + +// INIT END + + +// UPDATE LOOP + + /** fps meter */ + public FpsMeter fpsMeter; + + /** timer */ + public Timer timer; + + private long timerAfterResize; + + private void mainLoop() { + screen = new ScreenSplash(); + + screen.init(); + + timer = new Timer(Constants.FPS_UPDATE); + fpsMeter = new FpsMeter(); + + while (!Display.isCloseRequested()) { + glLoadIdentity(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + int j = timer.ticksMissed; + + if (j > 1) fpsMeter.drop(j - 1); + timer.update(); + + for (int i = 0; i < j; i++) { + screen.update(); + } + + fpsMeter.frame(); + float delta = timer.renderDeltaTime; + if (!screen.deltaEnabled()) delta = 0; + screen.render(delta); + Display.update(); + +// boolean fs2 = Display.isFullscreen(); +// if (fs != fs2) { +// screen.onFullscreenChange(); +// fs = fs2; +// } + + if (Keys.justPressed(Keyboard.KEY_F11)) { + Log.f2("F11, toggle fullscreen."); + switchFullscreen(); + screen.onFullscreenChange(); + Keys.destroyChangeState(Keyboard.KEY_F11); + } + + if (Keys.justPressed(Keyboard.KEY_F2)) { + Log.f2("F2, taking screenshot."); + takeScreenshot(); + Keys.destroyChangeState(Keyboard.KEY_F2); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)) { + if (Keyboard.isKeyDown(Keyboard.KEY_Q)) { + Log.f2("Ctrl+Q, force quit."); + Keys.destroyChangeState(Keyboard.KEY_Q); + exit(); + return; + } + + if (Keyboard.isKeyDown(Keyboard.KEY_M)) { + Log.f2("Ctrl+M, go to main menu."); + Keys.destroyChangeState(Keyboard.KEY_M); + screen.rootPanel.onClose(); + screen.rootPanel.onBlur(); + replaceScreen(new ScreenMenuMain()); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_F)) { + Log.f2("Ctrl+F, switch fullscreen."); + Keys.destroyChangeState(Keyboard.KEY_F); + switchFullscreen(); + screen.onFullscreenChange(); + } + } + + if (Display.wasResized()) { + screen.onWindowResize(); + timerAfterResize = 0; + } else { + timerAfterResize++; + if (timerAfterResize > Constants.FPS_UPDATE * 0.3) { + timerAfterResize = 0; + int x = Display.getX(); + int y = Display.getY(); + + int w = Display.getWidth(); + int h = Display.getHeight(); + if (w % 2 != 0 || h % 2 != 0) { + try { + Display.setDisplayMode(windowDisplayMode = new DisplayMode(w - w % 2, h - h % 2)); + screen.onWindowResize(); + Display.setLocation(x, y); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + } + } + + try { + Display.sync(Constants.FPS_RENDER); + } catch (Throwable t) { + Log.e("Your graphics card driver does not support fullscreen properly.", t); + + try { + Display.setDisplayMode(windowDisplayMode); + } catch (LWJGLException e) { + Log.e("Error going back from corrupted fullscreen."); + showCrashReport(e); + } + } + } + + SuperContext.saveUserList(); // just to make sure nothing gets lost. + } + +// UPDATE LOOP END + + + private void takeScreenshot() { + Sounds.shutter.playEffect(1, 1f, false); + glReadBuffer(GL_FRONT); + int width = Display.getDisplayMode().getWidth(); + int height = Display.getDisplayMode().getHeight(); + int bpp = 4; // Assuming a 32-bit display with a byte each for red, green, blue, and alpha. + ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * bpp); + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + + new ThreadSaveScreenshot(buffer, width, height, bpp).start(); + } + + /** + * Replace screen + * + * @param newScreen new screen + */ + public void replaceScreen(Screen newScreen) { + screen = newScreen; + screen.init(); + } + + /** + * Replace screen, don't init it + * + * @param newScreen new screen + */ + public void replaceScreenNoInit(Screen newScreen) { + screen = newScreen; + } + + /** + * Toggle FS if possible + */ + public void switchFullscreen() { + try { + if (!Display.isFullscreen()) { + Log.f3("Entering fullscreen."); + // save window resize + windowDisplayMode = new DisplayMode(Display.getWidth(), Display.getHeight()); + + Display.setDisplayMode(Display.getDesktopDisplayMode()); + Display.setFullscreen(true); + Display.update(); +// +// +// DisplayMode mode = Display.getDesktopDisplayMode(); //findDisplayMode(WIDTH, HEIGHT); +// Display.setDisplayModeAndFullscreen(mode); + } else { + Log.f3("Leaving fullscreen."); + Display.setDisplayMode(windowDisplayMode); + Display.update(); + } + } catch (Throwable t) { + Log.e("Failed to toggle fullscreen mode.", t); + try { + Display.setDisplayMode(windowDisplayMode); + Display.update(); + } catch (Throwable t1) { + showCrashReport(t1); + } + } + } + + /** + * Get 1 for window, 2 for fullscreen. + * + * @return 1 or 2 + */ + public static int fs2() { + return isFullscreen() ? 2 : 1; + } + + +} diff --git a/src/net/sector/Constants.java b/src/net/sector/Constants.java new file mode 100644 index 0000000..61641d1 --- /dev/null +++ b/src/net/sector/Constants.java @@ -0,0 +1,92 @@ +package net.sector; + + +import com.porcupine.coord.Coord; + + +/** + * Sector constants + * + * @author MightyPork + */ +@SuppressWarnings("javadoc") +public class Constants { + + // STRINGS + public static final int VERSION_NUMBER = 18; + public static final String VERSION_NAME = "1.8"; + public static final String TITLEBAR = "SECTOR " + VERSION_NAME + " - Game by MightyPork - www.ondrovo.com/sector"; + + // FILES+DIRS + public static final String APP_DIR = "sector"; + + public static final String DIR_LEVELS_SHARED = "levels/shared"; + public static final String DIR_LEVELS_LOCAL = "levels/local"; + + public static final String DIR_LASTSHIP_LOCAL = "last_ship/local"; + public static final String DIR_LASTSHIP_SHARED = "last_ship/shared"; + public static final String DIR_LASTSHIP_INTERNAL = "last_ship/internal"; + + public static final String DIR_HIGHSCORE_LOCAL = "highscore/local"; + public static final String DIR_HIGHSCORE_SHARED = "highscore/shared"; + public static final String DIR_HIGHSCORE_INTERNAL = "highscore/internal"; + + public static final String SUFFIX_SHIP = "ship"; + public static final String DIR_SHIPS = "ships"; + + public static final String DIR_SCREENSHOTS = "screenshots"; + + public static final String FILE_CONFIG = "users.ion"; + public static final String FILE_LOG = "Sector.log"; + public static final String FILE_LOG_E = "Sector_errors.log"; + + // NETWORK + public static final String WEB_URL = "http://www.ondrovo.com/sector/download"; + public static final String SERVER_URL = "http://www.ondrovo.com/sector/api/server.php"; + + // LIGHT + public static final float LIGHT_AMBIENT = 0.3F; + public static final float LIGHT_SPECULAR = 0.3F; + public static final float LIGHT_DIFFUSE = 0.3F; + public static final Coord LIGHT_POS = new Coord(-3, 5, 5); + public static final float LIGHT_ATTR = 1; + + public static final float SCENE_MAT_AMBIENT = 0.15F; + public static final float SCENE_MAT_SPECULAR = 0.4F; + public static final float SCENE_MAT_DIFFUSE = 0.3F; + + // CAMERA & SCENE + public static final Coord CAM_POS = new Coord(0, 3.3, 5); + public static final Coord CAM_LOOKAT = new Coord(0, 2.3, 0); + public static final float CAM_ANGLE = 45; + public static final double CAM_NEAR = 0.1; + public static final double FOG_START = 80; + public static final double CAM_FAR = 100; + + // AUDIO + public static final Coord LISTENER_POS = new Coord(0, 5, 0); + + // TIMING + public static final int FPS_UPDATE = 55; + public static final double SPEED_MUL = 100D / FPS_UPDATE; + + public static final int FPS_RENDER = 200; // max + + // LOGGING GROUPS + public static final boolean LOG_DRIVERS = false; + public static final boolean LOG_FONTS = false; + public static final boolean LOG_MODELS = false; + public static final boolean LOG_TEXTURES = false; + public static final boolean LOG_SOUNDS = false; + public static final boolean LOG_XML_LOADING = false; + public static final boolean LOG_COUNTRIES = false; + public static final boolean LOG_ZONES = false; + + // INITIAL WINDOW SIZE (later loaded from config file) + public static final int WINDOW_SIZE_X = 800; + public static final int WINDOW_SIZE_Y = 600; + + public static final int PARTICLE_COUNT_LIMIT = 3000; + + +} diff --git a/src/net/sector/CustomIonMarks.java b/src/net/sector/CustomIonMarks.java new file mode 100644 index 0000000..fcdf833 --- /dev/null +++ b/src/net/sector/CustomIonMarks.java @@ -0,0 +1,41 @@ +package net.sector; + + +import net.sector.level.highscore.HighscoreEntry; +import net.sector.level.highscore.HighscoreTable; +import net.sector.network.ProfileList; +import net.sector.network.UserProfile; + +import com.porcupine.ion.Ion; + + +/** + * Class adding ION marks for custom ionizable objects + * + * @author MightyPork + */ +@SuppressWarnings("javadoc") +public class CustomIonMarks { + + // ION + public static final byte HIGHSCORE_TABLE = 20; + public static final byte HIGHSCORE_ENTRY = 21; + public static final byte USER_PROFILE_LIST = 22; + public static final byte USER_PROFILE = 23; + +// public static final byte LEVEL_LIST = 24; +// public static final byte LEVEL_CONTAINER = 25; + + /** + * Register ion marks + */ + public static void init() { + Ion.registerIonizable(HIGHSCORE_ENTRY, HighscoreEntry.class); + Ion.registerIonizable(HIGHSCORE_TABLE, HighscoreTable.class); + Ion.registerIonizable(USER_PROFILE_LIST, ProfileList.class); + Ion.registerIonizable(USER_PROFILE, UserProfile.class); +// Ion.registerIonizable(LEVEL_LIST, NetLevelList.class); +// Ion.registerIonizable(LEVEL_CONTAINER, NetLevelContainer.class); + } + +} diff --git a/src/net/sector/GameConfig.java b/src/net/sector/GameConfig.java new file mode 100644 index 0000000..036d64a --- /dev/null +++ b/src/net/sector/GameConfig.java @@ -0,0 +1,127 @@ +package net.sector; + + +import net.sector.util.Utils; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.util.PropertyManager; + + +/** + * Configuration + * + * @author MightyPork + */ +@SuppressWarnings("javadoc") +public class GameConfig { + + public static final String pk_win_resize = "window.resizable"; + public static final String pk_splash = "window.splash"; + public static final String pk_win_fs = "window.start.fullscreen"; + + public static final String pk_antialiasing = "graphics.antialiasing"; + public static final String pk_vsync = "graphics.vsync"; + + public static final String pk_in_mouse = "input.mouse.sensitivity"; + + public static final String pk_sound_volume = "audio.volume.sound"; + public static final String pk_music_volume = "audio.volume.music"; + + public static final String pk_log = "log.enable"; + public static final String pk_log_stdout = "log.toStdOut"; + + + public static final String pk_key_shield = "key.shield"; + + public static final String pk_update_notifications = "feature.update_alerts"; + + + + public static boolean enableUpdateAlerts; + public static boolean startInFullscreen; + public static boolean enableVsync; + public static boolean enableSplash; + public static boolean enableResize; + public static int mouseSensitivity; + public static int audioVolumeSound; + public static int audioVolumeMusic; + public static int antialiasing; + public static boolean logEnabled; + public static boolean logStdOut; + + public static int keyShield = Keyboard.KEY_LCONTROL; + + public static boolean colliderWireframe = false; + private static PropertyManager p; + + /** + * Init property manager and load from file. + */ + public static void initLoad() { + p = new PropertyManager(Utils.getGameFolder() + "/config.ini", "Main SECTOR's configuration file."); + + p.cfgSeparateSections(true); + p.cfgNewlineBeforeComments(false); + + p.putBoolean(pk_win_fs, false, "Start in fullscreen."); + p.putBoolean(pk_update_notifications, true, "Show update notifications."); + p.putInteger(pk_antialiasing, 4, "Antialiasing 0, 2, 4, 8; Depends of graphic card."); + p.putBoolean(pk_splash, true, "Enable splash animation"); + p.putBoolean(pk_vsync, true, "Enable vsync"); + p.putBoolean(pk_win_resize, true, "Make window resizable"); + + p.putInteger(pk_in_mouse, 1000, "Mouse sensitivity for ship movement. 1000 is the default sensitivity."); + + p.putInteger(pk_sound_volume, 100, "Sound volume, 0-100."); + p.putInteger(pk_music_volume, 100, "Music volume, 0-100."); + + p.putBoolean(pk_log, true, "Enable logging."); + p.putBoolean(pk_log_stdout, false, "Print log messages also to stdout."); + + p.putKey(pk_key_shield, Keyboard.KEY_LCONTROL); + + saveLoad(); + useLoaded(); + } + + /** + * Set property value (call saveLoad and useLoaded afterwards) + * + * @param key key to set + * @param newValue new value assigned + */ + public static void setNewProp(String key, Object newValue) { + p.setValue(key, newValue); + } + + /** + * Save changes and load from file. + */ + public static void saveLoad() { + p.apply(); + } + + /** + * Store loaded config to fields + */ + public static void useLoaded() { + startInFullscreen = p.getBoolean(pk_win_fs); + enableSplash = p.getBoolean(pk_splash); + enableVsync = p.getBoolean(pk_vsync); + enableResize = p.getBoolean(pk_win_resize); + + mouseSensitivity = p.getInteger(pk_in_mouse); + + antialiasing = p.getInteger(pk_antialiasing); + audioVolumeSound = p.getInteger(pk_sound_volume); + audioVolumeMusic = p.getInteger(pk_music_volume); + + logEnabled = p.getBoolean(pk_log); + logStdOut = p.getBoolean(pk_log_stdout); + + keyShield = p.getInt(pk_key_shield); + + enableUpdateAlerts = p.getBoolean(pk_update_notifications); + } +} diff --git a/src/net/sector/LoadingManager.java b/src/net/sector/LoadingManager.java new file mode 100644 index 0000000..aa25621 --- /dev/null +++ b/src/net/sector/LoadingManager.java @@ -0,0 +1,130 @@ +package net.sector; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.fonts.Fonts; +import net.sector.models.Models; +import net.sector.sounds.Sounds; +import net.sector.textures.Textures; +import net.sector.util.Log; + + +/** + * Class responsible for resource loading. + * + * @author MightyPork + */ +public class LoadingManager { + + private static final int groups = 4; + + private static int lastloaded = -1; + private static long beginTime; + + private static void timerStart() { + beginTime = System.currentTimeMillis(); + } + + private static double timerGet() { + return (System.currentTimeMillis() - beginTime) / 1000D; + } + + /** + * Load resources needed to animate splash + */ + public static void loadForSplash() { + Log.f1("Loading resources needed for Splash screen."); + + timerStart(); + Fonts.loadForSplash(); + Log.i("LOADING: Fonts for Splash loaded in " + timerGet() + "s"); + + timerStart(); + Sounds.loadForSplash(); + Log.i("LOADING: Sounds for Splash loaded in " + timerGet() + "s"); + + timerStart(); + Textures.loadForSplash(); + Log.i("LOADING: Textures for Splash loaded in " + timerGet() + "s"); + } + + /** + * Get info text for resource group (eg. Loading sounds...) + * + * @return text + */ + public static String getSplashInfo() { + switch (lastloaded + 1) { + case 0: + return "Loading fonts..."; + case 1: + return "Loading textures..."; + case 2: + return "Loading models..."; + case 3: + return "Loading sounds..."; + } + return "Loading..."; + } + + /** + * Load next resource group + */ + public static void loadGroup() { + + switch (lastloaded + 1) { + case 0: + timerStart(); + Fonts.load(); + Log.i("LOADING: Fonts loaded in " + timerGet() + "s"); + break; + + case 1: + timerStart(); + Textures.load(); + Log.i("LOADING: Textures loaded in " + timerGet() + "s"); + break; + + case 2: + timerStart(); + + // something may change while loading models + glPushAttrib(GL_ENABLE_BIT); + glPushMatrix(); + + Models.load(); + + glPopMatrix(); + glPopAttrib(); + + Log.i("LOADING: Models loaded in " + timerGet() + "s"); + break; + + case 3: + timerStart(); + Sounds.load(); + Log.i("LOADING: Sounds loaded in " + timerGet() + "s"); + break; + } + + lastloaded++; + } + + /** + * Check if has more resource groups to load + * + * @return has more + */ + public static boolean hasMoreGroups() { + return lastloaded < groups; + } + + /** + * Called after all resources have been loaded. + */ + public static void onResourcesLoaded() { + Log.i("LOADING: All resources loaded."); + + StaticInitializer.initPostLoad(); + } +} diff --git a/src/net/sector/NullDamageSource.java b/src/net/sector/NullDamageSource.java new file mode 100644 index 0000000..f2a8527 --- /dev/null +++ b/src/net/sector/NullDamageSource.java @@ -0,0 +1,33 @@ +package net.sector; + + +import net.sector.entities.EEntity; +import net.sector.entities.IDamageable; + + +public class NullDamageSource implements IDamageable { + + @Override + public void addDamage(IDamageable source, double points) {} + + @Override + public boolean isDead() { + return false; + } + + @Override + public double getHealth() { + return 0; + } + + @Override + public EEntity getType() { + return EEntity.NONE; + } + + @Override + public double getHealthMax() { + return 0; + } + +} diff --git a/src/net/sector/StaticInitializer.java b/src/net/sector/StaticInitializer.java new file mode 100644 index 0000000..6a49340 --- /dev/null +++ b/src/net/sector/StaticInitializer.java @@ -0,0 +1,123 @@ +package net.sector; + + +import javax.naming.TimeLimitExceededException; + +import net.sector.gui.widgets.ColorScheme; +import net.sector.level.drivers.FunctorRegistry; +import net.sector.level.sequence.LevelNodeRegistry; +import net.sector.level.ship.DiscoveryRegistry; +import net.sector.level.ship.PieceRegistry; +import net.sector.level.spawners.EntityRegistry; +import net.sector.network.CountryList; +import net.sector.threads.*; +import net.sector.util.Log; + + +/** + * Initialization utility, initializing all the static stuff that is needed + * before starting main loop. + * + * @author MightyPork + */ +public class StaticInitializer { + + /** + * Init static things and start threads.
+ * This is called on startup, even before the splash screen. + */ + public static void initOnStartup() { + + CustomIonMarks.init(); + + DiscoveryRegistry.init(); + FunctorRegistry.init(); + LevelNodeRegistry.init(); + + CountryList.init(); + ColorScheme.init(); + EntityRegistry.init(); + + // load user profiles + new ThreadLoadAndActivateProfiles().start(); + + // check latest version. + new ThreadCheckLatestVersion().start(); + + // download new levels. + new ThreadDownloadNewLevels().start(); + + // load local and internal levels + new ThreadLoadOfflineLevels().start(); + + // load drivers. + new ThreadLoadBasicDrivers().start(); + + } + + private static void logThreadStatus() { + Log.f2("\nLOADING THREADS:"); + Log.f2("\tThreadLoadBasicDrivers: " + ThreadLoadBasicDrivers.status); + Log.f2("\tThreadLoadOfflineLevels: " + ThreadLoadOfflineLevels.status); + Log.f2("\tThreadDownloadNewLevels: " + ThreadDownloadNewLevels.status); + Log.f2("\tThreadCheckLatestVersion: " + ThreadCheckLatestVersion.status); + Log.f2("\tThreadLoadAndActivateProfiles: " + ThreadLoadAndActivateProfiles.status); + Log.f2("\n\n"); + + } + + /** + * Initialize all. + */ + public static void initPostLoad() { + + // initialize piece and discovery registry + // put here, so that ThreadUnpackLevels can build ship bundles. + PieceRegistry.init(); + + Log.f1("Waiting for loading threads to finish..."); + + logThreadStatus(); + + long beginTime = System.currentTimeMillis(); + + // wait for threads. + while (true) { + if (System.currentTimeMillis() - beginTime > 8000) { + Log.w("Loading time limit exceeded."); + logThreadStatus(); + + if (ThreadLoadBasicDrivers.status == EThreadStatus.WORKING || ThreadLoadOfflineLevels.status == EThreadStatus.WORKING) { + Log.w("Cannot continue, aborting startup."); + App.showCrashReport(new TimeLimitExceededException("Resource loading thread(s) timed out.")); + } else { + // network problem.. + Log.w("Could not connect to server, entering offline mode."); + App.offlineMode = true; + break; + } + } + + if (ThreadLoadBasicDrivers.status == EThreadStatus.WORKING) continue; + if (ThreadLoadOfflineLevels.status == EThreadStatus.WORKING) continue; + if (ThreadDownloadNewLevels.status == EThreadStatus.WORKING) continue; + if (ThreadCheckLatestVersion.status == EThreadStatus.WORKING) continue; + if (ThreadLoadAndActivateProfiles.status == EThreadStatus.WORKING) continue; + break; + + } + + if (ThreadDownloadNewLevels.status == EThreadStatus.FAILURE + || ThreadCheckLatestVersion.status == EThreadStatus.FAILURE + || ThreadLoadAndActivateProfiles.status == EThreadStatus.FAILURE) { + + Log.w("Could not connect to server, entering offline mode."); + App.offlineMode = true; + + } + + Log.f1("Unpacking level containers..."); + new ThreadUnpackLevels().start(); + } + +} diff --git a/src/net/sector/annotations/Internal.java b/src/net/sector/annotations/Internal.java new file mode 100644 index 0000000..a2b6ef9 --- /dev/null +++ b/src/net/sector/annotations/Internal.java @@ -0,0 +1,13 @@ +package net.sector.annotations; + + +/** + * Describes internal method or field which should not be accessed from outside.
+ * Used where private is not possible, but public does not mean available for + * anyone. + * + * @author MightyPork + */ +public @interface Internal { + +} diff --git a/src/net/sector/annotations/Unused.java b/src/net/sector/annotations/Unused.java new file mode 100644 index 0000000..263b308 --- /dev/null +++ b/src/net/sector/annotations/Unused.java @@ -0,0 +1,12 @@ +package net.sector.annotations; + + +/** + * Annotation for apparently unused methods, to indicate that they can be safely + * removed when preparing the game for final release + * + * @author MightyPork + */ +public @interface Unused { + +} diff --git a/src/net/sector/collision/Collider.java b/src/net/sector/collision/Collider.java new file mode 100644 index 0000000..0cc7cc4 --- /dev/null +++ b/src/net/sector/collision/Collider.java @@ -0,0 +1,29 @@ +package net.sector.collision; + + +import com.porcupine.coord.Coord; + + +/** + * Collider object, used to hold information about object positions, rotations + * and to detect their collisions. + * + * @author MightyPork + */ +public abstract class Collider { + /** Central point */ + public Coord pos = new Coord(); + + /** + * Check if collides with other collider + * + * @param other other collider + * @return collides + */ + public abstract boolean collidesWith(Collider other); + + /** + * Render debug sphere + */ + public abstract void render(); +} diff --git a/src/net/sector/collision/ColliderPlayerShip.java b/src/net/sector/collision/ColliderPlayerShip.java new file mode 100644 index 0000000..237b076 --- /dev/null +++ b/src/net/sector/collision/ColliderPlayerShip.java @@ -0,0 +1,117 @@ +package net.sector.collision; + + +import java.util.ArrayList; + +import net.sector.entities.Entity; +import net.sector.level.ship.modules.ShipBody; +import net.sector.level.ship.modules.pieces.Piece; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; + + +/** + * Player ship collider (made up of pieces) + * + * @author MightyPork + */ +public class ColliderPlayerShip extends ColliderSphere { + + /** Ship entity */ + public Entity entity; + /** Entity scene */ + public Scene scene; + + /** + * Player ship collider + * + * @param center central coord + * @param shipBody ship body. + */ + public ColliderPlayerShip(Coord center, ShipBody shipBody) { + super(center, Calc.pythC(shipBody.sizeX * ShipBody.pieceDist, shipBody.sizeX * ShipBody.pieceDist) / 2d); + body = shipBody; + body.setCollider(this); + } + + /** + * Player ship collider + * + * @param center central coord + * @param width body width [x] + * @param height body height [z] + */ + public ColliderPlayerShip(Coord center, int width, int height) { + super(center, 0); + body = new ShipBody(width, height); + this.radius = Calc.pythC(width * ShipBody.pieceDist, height * ShipBody.pieceDist) / 2d; + body.setCollider(this); + } + + /** + * Hook called when the ship was added to scene + * + * @param entity ship entity + */ + public void onAddedToScene(Entity entity) { + this.entity = entity; + this.scene = entity.scene; + body.onReady(); + } + + /** + * Get rotation around Y in delta time + * + * @param delta delta time + * @return Y rot. + */ + public double getRotY(double delta) { + return entity.rotAngle.delta(delta); + } + + /** + * Get rotation around Z in delta time + * + * @param delta delta time + * @return Z rot. + */ + public double getRotZ(double delta) { + return Calc.clampd((-entity.getMotion().x) * 150, -25, 25); + } + + /** Ship body */ + public ShipBody body; + /** Colliders collided during the last impact */ + public ArrayList lastCollided = null; + /** Last impact was caused by shield. */ + public boolean collidingShield = false; + + @Override + public boolean collidesWith(Collider other) { + if (other instanceof ColliderSphere) { + ColliderSphere otherSphere = (ColliderSphere) other; + if (pos.distTo(otherSphere.pos) < radius + otherSphere.radius) { + // collides with the outer sphere + if (body.isShieldRunning()) { + lastCollided = null; + collidingShield = true; + return true; + } + + collidingShield = false; + + ArrayList colliding = body.getCollidingPieces(other); + if (colliding.size() == 0) colliding = null; + if (colliding != null) { + lastCollided = colliding; + return true; + } + } + lastCollided = null; + return false; + } + throw new RuntimeException("Collision test not implemented for " + Calc.className(this) + " and " + Calc.className(other)); + } + +} diff --git a/src/net/sector/collision/ColliderSphere.java b/src/net/sector/collision/ColliderSphere.java new file mode 100644 index 0000000..6a5be62 --- /dev/null +++ b/src/net/sector/collision/ColliderSphere.java @@ -0,0 +1,74 @@ +package net.sector.collision; + + +import static org.lwjgl.opengl.GL11.*; + +import org.lwjgl.util.glu.Sphere; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; + + +/** + * Simple spheric collider + * + * @author MightyPork + */ +public class ColliderSphere extends Collider { + + /** sphere radius */ + public double radius = 1.0; + + /** + * Sphere collider + * + * @param center central point + * @param radius sphere radius + */ + public ColliderSphere(Coord center, double radius) { + pos.setTo(center); + this.radius = radius; + } + + @Override + public boolean collidesWith(Collider other) { + if (other instanceof ColliderSphere) { + ColliderSphere otherSphere = (ColliderSphere) other; + return pos.distTo(otherSphere.pos) < radius + otherSphere.radius; + } + + throw new RuntimeException("Collision test not implemented for " + Calc.className(this) + " and " + Calc.className(other)); + } + + @Override + public void render() { + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + glLoadIdentity(); + glTranslated(pos.x, pos.y, -pos.z); + glColor4f(1.0f, 0.0f, 0.0f, 0.5f); + + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glDisable(GL_TEXTURE_2D); + + Sphere sp = new Sphere(); + sp.draw((float) this.radius, 6, 6); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glPopAttrib(); + glPopMatrix(); + } + + /** + * Get coord + * + * @return pos coord + */ + public Coord getPos() { + return pos; + } + + + +} diff --git a/src/net/sector/collision/ColliderSphereFake.java b/src/net/sector/collision/ColliderSphereFake.java new file mode 100644 index 0000000..b4db555 --- /dev/null +++ b/src/net/sector/collision/ColliderSphereFake.java @@ -0,0 +1,28 @@ +package net.sector.collision; + + +import com.porcupine.coord.Coord; + + +/** + * Sphere collider, never colliding + * + * @author MightyPork + */ +public class ColliderSphereFake extends ColliderSphere { + + /** + * Sphere collider + * + * @param center center + * @param radius sphere radius + */ + public ColliderSphereFake(Coord center, double radius) { + super(center, radius); + } + + @Override + public boolean collidesWith(Collider other) { + return false; + } +} diff --git a/src/net/sector/collision/Scene.java b/src/net/sector/collision/Scene.java new file mode 100644 index 0000000..399f543 --- /dev/null +++ b/src/net/sector/collision/Scene.java @@ -0,0 +1,393 @@ +package net.sector.collision; + + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import net.sector.Constants; +import net.sector.GameConfig; +import net.sector.effects.ParticleManager; +import net.sector.effects.particles.Particle; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.player.EntityPlayerShip; +import net.sector.entities.shots.EntityShotBase; +import net.sector.models.Models; +import net.sector.util.Utils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.util.StringUtils; + + +/** + * 2D collider map with Z-axis zones + * + * @author MightyPork + */ +public class Scene { + + // number of zones + private static final int ZONES = 18; + // size of one zone in GL units + private static final double ZONE_WIDTH = 6; + + /** collision zones */ + protected ColliderZone[] zones = new ColliderZone[ZONES]; + + /** set of all entities in this map */ + public ArrayList allEntities = new ArrayList(); + + /** set of all entities to add when we can */ + public ArrayList toAdd = new ArrayList(); + + /** Particle manager */ + public ParticleManager particles = new ParticleManager(); + + /** Current player ship instance */ + public EntityPlayerShip playerShip = null; + private long lastt; + + /** + * Add effect to particle manager + * + * @param particle particle added + */ + public void addEffect(Particle particle) { + particles.add(particle); + } + + /** + * Make new collider map + */ + public Scene() { + for (int i = 0; i < ZONES; i++) { + zones[i] = new ColliderZone(i * ZONE_WIDTH, (i + 1) * ZONE_WIDTH, (i == 0 ? -1 : i == ZONES - 1 ? 1 : 0)); + } + } + + /** + * Zone of entities within this collider. + * + * @author MightyPork + */ + private class ColliderZone extends HashSet { + + public double zFrom = 0; + public double zTo = 10; + + /** + * Collider zone + * + * @param zFrom starting z index + * @param zTo ending z index + * @param position position. -1 first, 0 middle, 1 last; + */ + public ColliderZone(double zFrom, double zTo, int position) { + this.zFrom = zFrom; + this.zTo = zTo; + if (position == -1) this.zFrom = -20; + if (position == 1) this.zTo = ZONE_WIDTH * (ZONES + 20); + } + + /** + * Make sure all entities are in the proper zones. + */ + public void arrangeEntities() { + + // move entities that no longer belong to this zone to other zones + // remove dead entities + Iterator i = this.iterator(); + while (i.hasNext()) { + Entity e = i.next(); + + if (e.isDead()) { + allEntities.remove(e); + i.remove(); + continue; + } + } + } + + /** + * Check all entities for collisions + */ + public void collideAndReact() { + + Iterator i = this.iterator(); + loop1: + while (i.hasNext()) { + + Entity entity1 = i.next(); + if (entity1.isDead()) { + allEntities.remove(entity1); + i.remove(); + continue; + } + + if (entity1.isDead()) continue loop1; + + Iterator i2 = this.iterator(); + loop2: + while (i2.hasNext()) { + Entity entity2 = i2.next(); + if (entity2.isDead()) continue loop2; + + if (entity1 != entity2) { + if (entity1.collidesWith(entity2) && entity2.collidesWith(entity1)) { + if (entity1.collidePriority > entity2.collidePriority) { + entity1.react(entity2); + } else { + entity2.react(entity1); + } + } + } + } + } + } + } + + /** + * Add new entity to the correct zones and to global list + * + * @param added added entity + */ + public void add(Entity added) { + if (added.getType() == EEntity.PLAYER) playerShip = (EntityPlayerShip) added; + toAdd.add(added); + } + + private void addAllWaiting() { + for (Entity added : toAdd) { + added.setScene(this); + allEntities.add(added); + added.onAddedToScene(); + for (ColliderZone zone : zones) { + if (added.belongsToZone(zone.zFrom, zone.zTo)) { + zone.add(added); + } + } + } + + toAdd.clear(); + } + + /** + * Remove entity from all lists and zones + * + * @param removed removed entity + */ + public void remove(Entity removed) { + //remove(removed, false); + removed.setDead(); + } + + +// List removeList = new ArrayList(); +// +// public void remove(Entity removed, boolean now) { +// if(now) { +// if(removeList==null||removeList.isEmpty()) return; +// for(Entity nowRemoved:removeList) { +// allEntities.remove(nowRemoved); +// for (ColliderZone zone : zones) { +// zone.remove(nowRemoved); +// } +// } +// removeList.clear(); +// }else { +// removeList.add(removed); +// } +// } + + + + /** + * Render all contained entities + * + * @param delta + */ + public void render(float delta) { + Collections.sort(allEntities); + + Models.renderBegin(); + + for (Entity entity : allEntities) { + if (entity.isDead()) continue; + if (!Utils.canSkipRendering(entity.getPos())) { + + entity.render(delta); + + if (GameConfig.colliderWireframe) { + entity.collider.render(); + } + } + } + + Models.renderEnd(); + particles.render(delta); + } + + /** + * Get global movement vector + * + * @return global movement vector + */ + public Vec getGlobalMovement() { + return globalMovement; + } + + /** + * Set global movement vector + * + * @param newMovement new global movement + */ + public void setGlobalMovement(Vec newMovement) { + globalMovement.setTo(newMovement); + } + + /** + * Update all contained entities + */ + public void update() { + + particles.moveAllParticles(globalMovement.scale(Constants.SPEED_MUL)); + + particles.update(); + + // add entities waiting to be added + addAllWaiting(); + + for (Entity entity : allEntities) { + if (entity.isDead()) continue; + + entity.update(); + + // assign to zone. + for (ColliderZone zone : zones) { + if(!zone.contains(entity)) { + if (entity.belongsToZone(zone.zFrom, zone.zTo)) { + zone.add(entity); + } + }else { + if (!entity.belongsToZone(zone.zFrom, zone.zTo)) { + zone.remove(entity); + } + } + } + + if (entity instanceof EntityPlayerShip) continue; + + if (entity.getPos().x < -60) { + if (entity instanceof EntityShotBase) { + entity.setDead(); + } else { + entity.getMotion().x *= -1; + } + } + if (entity.getPos().x > 60) { + if (entity instanceof EntityShotBase) { + entity.setDead(); + } else { + entity.getMotion().x *= -1; + } + } + + if (entity.getPos().z < -15) entity.setDead(); + if (entity.getPos().z > 160) entity.setDead(); + + + } + + // remove dead and other entities + for (ColliderZone zone : zones) { + zone.arrangeEntities(); + } + + for (ColliderZone zone : zones) { + // check for collisions, do reactions if needed + zone.collideAndReact(); + } + + if(Constants.LOG_ZONES) { + long newt; + if((newt = System.currentTimeMillis())-lastt > 1000) { + lastt = newt; + System.out.println("\n### ZONE MAP"); + for(ColliderZone zone: zones) { + System.out.println("Zone[ "+(int)zone.zFrom+" , "+(int)zone.zTo+" ] = "+StringUtils.repeat("(#)", zone.size())); + } + + System.out.println("### ZONE MAP\n"); + } + } + } + + /** + * Get set of entities in given range. Their center points may be outside + * the range, only their colliders are checked. + * + * @param center central point + * @param range radius of collision sphere to get entities from + * @return set of the entities + */ + public Set getEntitiesInRange(Coord center, double range) { + Set buffer = new HashSet(); + Collider rangeCol = new ColliderSphere(center, range); + + for (Entity entity : allEntities) { + if (entity.isDead()) continue; + if (entity.collider.collidesWith(rangeCol)) { + buffer.add(entity); + } + } + + return buffer; + } + + /** + * Get entities in line of sight (can be hit by weapon) + * + * @param origin observer pos + * @param direction look direction + * @param maxDistanceFromLine max distance to side from direct line + * @param lengthOfSight max distance from observer + * @return set of matching entities + */ + public Set getEntitiesInLineOfSight(Coord origin, Vec direction, double maxDistanceFromLine, double lengthOfSight) { + Set buffer = new HashSet(); + + for (Entity entity : allEntities) { + if (entity.isDead()) continue; + + // too far? + if (entity.getPos().distTo(origin) > lengthOfSight) continue; + + double dist = Calc.linePointDistXZ(direction, origin, entity.getPos()); + dist -= entity.collider.radius; + if (dist < 0) dist = 0; + + if (dist <= maxDistanceFromLine) buffer.add(entity); + } + + return buffer; + } + + /** Global movement vector */ + private Vec globalMovement = new Vec(0, 0, -0.1); + + /** + * Get player ship instance (if any) + * + * @return player ship + */ + public EntityPlayerShip getPlayerShip() { + return playerShip; + } + + +} diff --git a/src/net/sector/effects/EParticle.java b/src/net/sector/effects/EParticle.java new file mode 100644 index 0000000..39532cc --- /dev/null +++ b/src/net/sector/effects/EParticle.java @@ -0,0 +1,24 @@ +package net.sector.effects; + + +/** + * Enum particle types + * + * @author MightyPork + */ +public enum EParticle { + /** fire */ + FIRE, + /** smoke */ + SMOKE, + /** shard */ + SHARD, + /** star */ + STAR, + /** binary */ + BINARY, + /** EMP hit */ + EMP, + /** Special spawned when orb is collected */ + ORB; +} diff --git a/src/net/sector/effects/Effects.java b/src/net/sector/effects/Effects.java new file mode 100644 index 0000000..31497ba --- /dev/null +++ b/src/net/sector/effects/Effects.java @@ -0,0 +1,273 @@ +package net.sector.effects; + + +import java.util.Random; + +import net.sector.Constants; +import net.sector.effects.particles.*; +import net.sector.sounds.Sounds; +import net.sector.util.Utils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +/** + * Effects helper + * + * @author MightyPork + */ +public class Effects { + /** RNG */ + private static Random rand = new Random(); + + /** + * Add fire from jet engine (rocket) + * + * @param manager particle manager + * @param center engine pos + * @param motion engine motion + * @param repeatCount repeat count + */ + public static void addEngineFire(ParticleManager manager, Coord center, Vec motion, int repeatCount) { + addEngineFire(manager, center, motion, repeatCount, 0); + } + + /** + * Add fire from jet engine (rocket) + * + * @param manager particle manager + * @param center engine pos + * @param motion engine motion + * @param repeatCount repeat count + * @param type 0 red, 1 blue + */ + public static void addEngineFire(ParticleManager manager, Coord center, Vec motion, int repeatCount, int type) { + addEngineFire(manager, center, motion, repeatCount, type, 1); + } + + /** + * Add fire from jet engine (rocket) + * + * @param manager particle manager + * @param center engine pos + * @param motion engine motion + * @param repeatCount repeat count + * @param type 0 red, 1 blue + * @param size particle max size + */ + public static void addEngineFire(ParticleManager manager, Coord center, Vec motion, int repeatCount, int type, double size) { + Coord pos; + Vec pmotion; + double rotSpeed; + + for (int i = 0; i < repeatCount; i++) { + pos = center.random_offset(0.02); + pmotion = motion.copy(); + rotSpeed = 0; + ParticleFire p; + manager.add(p = (ParticleFire) new ParticleFire(pos, pmotion, rotSpeed, (0.2 + rand.nextDouble() * 0.2) * size, false) + .setGlobalMovement(false)); + p.maxAge = (int) (Constants.FPS_UPDATE * 0.3 * size); + p.setType(type); + } + + } + + /** + * Add orb effect + * + * @param manager particle manager + * @param center center + * @param motionSource velocity of explosion source + * @param radius burst radius (3D units) + * @param particles number of particles + * @param color particle average color (0 blue, 1 red, 2 green) + * @param globalMovement should the particles move with "asteroid shift"? + */ + public static void addOrbBurst(ParticleManager manager, Coord center, Vec motionSource, double radius, int particles, int color, + boolean globalMovement, boolean gaussian) { + + if (!Utils.canCoordBeSeen(center, 20)) return; + + Coord pos; + Vec motion; + + for (int i = 0; i < particles; i++) { + + pos = center.random_offset(gaussian ? Math.abs(Calc.clampd(rand.nextGaussian() * radius, 0, radius * 1.2)) : radius); + motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.005, 0.005)); + + manager.add(new ParticleOrb(pos, motion, 0.2 + (0.2 + rand.nextDouble()) * 0.3, color).setGlobalMovement(globalMovement)); + } + } + + /** + * Add fire burst + * + * @param manager particle manager + * @param center center + * @param motionSource velocity of explosion source + * @param radius burst radius (3D units) + * @param particles number of particles + * @param globalMovement should the particles move with "asteroid shift"? + */ + public static void addFireBurst(ParticleManager manager, Coord center, Vec motionSource, double radius, int particles, boolean globalMovement, + boolean gaussian) { + + if (!Utils.canCoordBeSeen(center, 20)) return; + + Coord pos; + Vec motion; + + for (int i = 0; i < particles; i++) { + + pos = center.random_offset(gaussian ? Math.abs(Calc.clampd(rand.nextGaussian() * radius, 0, radius * 1.2)) : radius); + motion = (Vec) motionSource.mul(0.8).add(Vec.random(-0.005, 0.005)); + double rotSpeed = -10 + rand.nextDouble() * 20; + + manager.add(new ParticleFire(pos, motion, rotSpeed, true).setGlobalMovement(globalMovement)); + + } + } + + /** + * Add explosion + * + * @param manager particle manager + * @param center center + * @param motionSource velocity of explosion source + * @param strength explosion strength + * @param globalMovement should the particles move with "asteroid shift"? + * @param sound make sound + */ + public static void addEMPExplosion(ParticleManager manager, Coord center, Vec motionSource, double strength, boolean globalMovement, boolean sound) { + + if (!Utils.canCoordBeSeen(center, 20)) return; + + Coord pos; + Vec motion; + + for (int i = 0; i < strength * 5; i++) { + pos = center.random_offset(0.02 * strength); + motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.005, 0.005)); + + manager.add(new ParticleEMP(pos, motion, 0.3 + (0.2 + rand.nextDouble()) * 0.3 * strength).setGlobalMovement(globalMovement)); + } + + if (sound && center.distTo(new Coord(0, 0, 0)) < 80 /*25*/) { + float pitch = 0.3f + rand.nextFloat() * 0.6f; + float gain = Calc.clampf((float) strength * 0.12f, 0, 1.5f) * 0.3f; + Sounds.explosion().playEffectLinearZ(pitch, gain, 60, false, center); + Sounds.shot_emp_hit.playEffectLinearZ(pitch, gain, 60, false, center); + } + } + + /** + * Add explosion + * + * @param manager particle manager + * @param center center + * @param motionSource velocity of explosion source + * @param strength explosion strength + * @param shards add shards + * @param globalMovement should the particles move with "asteroid shift"? + */ + public static void addExplosion(ParticleManager manager, Coord center, Vec motionSource, double strength, boolean shards, boolean globalMovement) { + addExplosion(manager, center, motionSource, strength, shards, globalMovement, true); + } + + /** + * Add explosion + * + * @param manager particle manager + * @param center center + * @param motionSource velocity of explosion source + * @param strength explosion strength + * @param shards add shards + * @param globalMovement should the particles move with "asteroid shift"? + * @param sound enable sounds + */ + public static void addExplosion(ParticleManager manager, Coord center, Vec motionSource, double strength, boolean shards, boolean globalMovement, + boolean sound) { + + if (!Utils.canCoordBeSeen(center, 20)) return; + + Coord pos; + Vec motion; + double rotSpeed; + + for (int i = 0; i < strength * 5; i++) { + pos = center.random_offset(0.01 * strength); + motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.005, 0.005)); + rotSpeed = -10 + rand.nextDouble() * 20; + + manager.add(new ParticleFire(pos, motion, rotSpeed, 0.6 + (0.7 + rand.nextDouble()) * 0.6 * strength).setGlobalMovement(globalMovement)); + + if (i < strength * 3 && shards) { + pos = center.random_offset(0.04); + + motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.02, 0.02)); + rotSpeed = -10 + rand.nextDouble() * 20; + manager.add(new ParticleSmoke(pos, motion, rotSpeed).setGlobalMovement(globalMovement)); + } + + if (i < strength * 2 && shards) { + pos = center.random_offset(0.04); + motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.02, 0.02)); + rotSpeed = -10 + rand.nextDouble() * 20; + manager.add(new ParticleShard(pos, motion, rotSpeed).setGlobalMovement(globalMovement)); + } + } + + if (sound && center.distTo(new Coord(0, 0, 0)) < 80 /*25*/) { + float pitch = 0.6f + rand.nextFloat() * 1.7f; + float gain = Calc.clampf((float) strength * 0.09f, 0, 1.5f) * 0.3f; + Sounds.explosion().playEffectLinearZ(pitch, gain, 60, false, center); + } + } + +// +// /** +// * Add stars +// * +// * @param manager particle manager +// * @param center stars center +// * @param count stars count +// */ +// public static void addStar(ParticleManager manager, Coord center, int count) { +// Coord pos; +// Vec motion; +// double rotSpeed; +// +// for (int i = 0; i < count; i++) { +// pos = center.random_offset(0.3); +// motion = Vec.random(-0.005, 0.005); +// rotSpeed = -5 + rand.nextDouble() * 10; +// +// manager.add(new ParticleStar(pos, motion, rotSpeed, 0.3 + (0.1 + rand.nextDouble()) * 0.8)); +// } +// } + + /** + * Add binary particles for splash + * + * @param manager particle manager + * @param center center + * @param count binaries count + */ + public static void addBinaries(ParticleManager manager, Coord center, int count) { + Coord pos; + Vec motion; + double rotSpeed; + + for (int i = 0; i < count; i++) { + pos = center.random_offset(0.3); + motion = Vec.random(-0.005, 0.005); + rotSpeed = -3 + rand.nextDouble() * 6; + + manager.add(new ParticleBinary(pos, motion, rotSpeed, 0.1 + (rand.nextDouble()) * 0.35)); + } + } +} diff --git a/src/net/sector/effects/ParticleManager.java b/src/net/sector/effects/ParticleManager.java new file mode 100644 index 0000000..5590ca2 --- /dev/null +++ b/src/net/sector/effects/ParticleManager.java @@ -0,0 +1,132 @@ +package net.sector.effects; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; + +import net.sector.Constants; +import net.sector.effects.particles.Particle; +import net.sector.effects.renderers.*; +import net.sector.util.Utils; + +import com.porcupine.coord.Vec; + + +/** + * Particle manager, container and animator of particles.
+ * It extends HashSet, so you can simply use add(particle) to add new effect. + * + * @author MightyPork + */ +public class ParticleManager extends ArrayList { + + @Override + public boolean add(Particle e) { + if (size() > Constants.PARTICLE_COUNT_LIMIT) return false; + return super.add(e); + } + + //@formatter:off + /** particle renderers */ + public static ParticleRenderer[] renderers = { + new ParticleSmokeRenderer(), + new ParticleShardRenderer(), + new ParticleFireRenderer(), + new ParticleStarRenderer(), + new ParticleBinaryRenderer(), + new ParticleEMPRenderer(), + new ParticleOrbRenderer() + }; + //@formatter:on + + /** + * Update all particles in this manager + */ + public void update() { + Iterator i = this.iterator(); + while (i.hasNext()) { + Particle p = i.next(); + p.update(); + if (p.isDead) { + i.remove(); + } + } + Collections.sort(this); + } + + /** + * Render all particles in this manager + * + * @param delta delta time + */ + public void render(double delta) { + glPushMatrix(); + glDisable(GL_LIGHTING); + glDisable(GL_FOG); + glDepthMask(false); + + glLoadIdentity(); + + for (Particle p : this) { + + if (Utils.canSkipRendering(p.pos)) continue; + + EParticle pt = p.getType(); + + + for (ParticleRenderer pr : renderers) { + + if (pr.getType() == pt) { + + pr.prepareRender(); + pr.renderParticle(p, delta); + pr.finishRender(); + + } else { + continue; + } + } + } + + glDepthMask(true); +// for (ParticleRenderer pr : renderers) { +// +// pr.prepareRender(); +// +// ParticleType pt = pr.getType(); +// +// for (Particle p : this) { +// +// if (p.getType() == pt) { +// pr.renderParticle(p); +// } +// } +// +// pr.finishRender(); +// +// } + + glEnable(GL_LIGHTING); + glEnable(GL_FOG); + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + //glEnable(GL_DEPTH_TEST); + + glPopMatrix(); + } + + /** + * move all particles (same as move all entities) + * + * @param motion + */ + public void moveAllParticles(Vec motion) { + for (Particle p : this) { + if (p.hasGlobalMovement()) p.pos.add_ip(motion).update(); + } + } + +} diff --git a/src/net/sector/effects/particles/Particle.java b/src/net/sector/effects/particles/Particle.java new file mode 100644 index 0000000..02dbd24 --- /dev/null +++ b/src/net/sector/effects/particles/Particle.java @@ -0,0 +1,141 @@ +package net.sector.effects.particles; + + +import java.util.Random; + +import net.sector.Constants; +import net.sector.effects.EParticle; +import net.sector.util.DeltaDoubleDeg; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Particle pseudo-entity + * + * @author MightyPork + */ +public abstract class Particle implements Comparable { + + private boolean hasGlobalMovement = false; + + /** + * Set whether particle should move together with asteroids (global + * movement) + * + * @param state + * @return this + */ + public Particle setGlobalMovement(boolean state) { + hasGlobalMovement = state; + return this; + } + + /** + * Should move with asteroids? (global movement) + * + * @return has global movement + */ + public boolean hasGlobalMovement() { + return hasGlobalMovement; + } + + /** RNG */ + public static Random rand = new Random(); + + /** particle quad size when rendered */ + public double size = 1; + + /** size of a new particle. */ + public double sizeOrig = 1; + + /** position in 3D space */ + public Coord pos = new Coord(0, 0, 0); + + /** Motion, added each tick to position */ + public Vec motion = new Vec(0, 0, 0); + + /** Angle (deg) of Z-axis rotation */ + public DeltaDoubleDeg rotAngle = new DeltaDoubleDeg(0); + + /** Rotation speed, added each tick to rotAngle */ + public double rotSpeed = 2; + + /** Particle age */ + public long age = 0; + + /** Max particle age */ + public long maxAge = 100; + + /** Flag that this particle should be removed from manager next tick. */ + public boolean isDead = false; + + /** Color multiplier for the particle rendering */ + public RGB renderColor = new RGB(1, 1, 1); + + /** Particle alpha 0-1 */ + public double renderAlpha = 1.0; + + /** + * @return particle ID, from ParticleType. + */ + public abstract EParticle getType(); + + /** + * Set particle dead → will be removed from manager next update tick. + */ + public void setDead() { + isDead = true; + } + + /** + * Create new particle + * + * @param pos position + * @param motion motion + */ + public Particle(Coord pos, Vec motion) { + this.pos.setTo(pos); + this.motion.setTo(motion); + } + + /** + * Update the particle + */ + public final void update() { + if (isDead) return; + + pos.pushLast(); + rotAngle.pushLast(); + + pos.add_ip(motion.mul(Constants.SPEED_MUL)); + rotAngle.add(rotSpeed * Constants.SPEED_MUL); + + age++; + if (age >= maxAge) { + setDead(); + return; + } + + onUpdate(); + + pos.update(); + } + + /** + * Called each update tick. You can check age and set isDead here, do some + * additional animation etc. + */ + public abstract void onUpdate(); + + @Override + public int compareTo(Particle o) { + if (this == o) return 0; + return Double.compare(new Double(o.pos.z), new Double(pos.z)); +// if(o.pos.z > pos.z) return -1; +// if(o.pos.z < pos.z) return 1; +// return 0; + } +} diff --git a/src/net/sector/effects/particles/ParticleBinary.java b/src/net/sector/effects/particles/ParticleBinary.java new file mode 100644 index 0000000..306ad18 --- /dev/null +++ b/src/net/sector/effects/particles/ParticleBinary.java @@ -0,0 +1,95 @@ +package net.sector.effects.particles; + + +import net.sector.Constants; +import net.sector.effects.EParticle; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + + +/** + * "Binary" particle (animated green 0s and 1s in splash screen) + * + * @author MightyPork + */ +public class ParticleBinary extends Particle { + + private Vec origMotion = null; + private boolean slow = false; + + /** Type (0,1) */ + public int type = 0; + + /** + * Binary particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param slowDown can slow down gradually + */ + public ParticleBinary(Coord pos, Vec motion, double rotSpeed, boolean slowDown) { + super(pos, motion); + origMotion = motion.copy(); + slow = slowDown; + this.rotAngle.set(rand.nextDouble() * 360); + this.rotSpeed = rotSpeed; + this.maxAge = (long) (Constants.FPS_UPDATE * (0.4 + rand.nextDouble() * 1.5)); + this.size = this.sizeOrig = 0.6 + rand.nextDouble(); + this.renderColor.setTo(new RGB(rand.nextDouble() * 0.3, 0.7 + rand.nextDouble() * 0.3, rand.nextDouble() * 0.3)); + this.renderAlpha = 1; + type = rand.nextInt(2); + } + + /** + * Binary particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param scale render size 0.001-2 + */ + public ParticleBinary(Coord pos, Vec motion, double rotSpeed, double scale) { + this(pos, motion, rotSpeed, true); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 2); + } + + /** + * Binary particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param scale render size 0.001-2 + * @param slowDown can slow down gradually + */ + public ParticleBinary(Coord pos, Vec motion, double rotSpeed, double scale, boolean slowDown) { + this(pos, motion, rotSpeed, slowDown); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 2); + } + + @Override + public EParticle getType() { + return EParticle.BINARY; + } + + @Override + public void onUpdate() { + renderAlpha = Calc.square(1F - (float) age / (float) maxAge); + + //size = Calc.square(1F - Calc.clampd( ((float) age / ((float) maxAge)) , 0, 1))*sizeOrig; + + if (slow) { + motion.setTo(origMotion.scale(Calc.square(1 - (float) age / (float) maxAge))); + //if(size < sizeOrig*0.2) setDead(); + } else { + motion.scale_ip(0.90); + //if(size < 0.2) setDead(); + } + } + +} diff --git a/src/net/sector/effects/particles/ParticleEMP.java b/src/net/sector/effects/particles/ParticleEMP.java new file mode 100644 index 0000000..55675dc --- /dev/null +++ b/src/net/sector/effects/particles/ParticleEMP.java @@ -0,0 +1,89 @@ +package net.sector.effects.particles; + + +import net.sector.Constants; +import net.sector.effects.EParticle; + +import com.porcupine.color.HSV; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + + +/** + * "EMP" particle + * + * @author MightyPork + */ +public class ParticleEMP extends Particle { + + private Vec origMotion = null; + private boolean slow = false; + + /** Type (0-5) */ + public int type = 0; + + /** + * EMP particle + * + * @param pos position + * @param motion motion + * @param slowDown can slow down gradually + */ + public ParticleEMP(Coord pos, Vec motion, boolean slowDown) { + super(pos, motion); + origMotion = motion.copy(); + slow = slowDown; + this.rotAngle.set(rand.nextDouble() * 360); + this.rotSpeed = -10 + rand.nextDouble() * 20; + this.maxAge = (long) (Constants.FPS_UPDATE * (0.2 + rand.nextDouble() * 1)); + this.size = this.sizeOrig = 0.6 + rand.nextDouble(); + this.renderColor.setTo(new HSV(0.7 - 0.2 + rand.nextDouble() * 0.4, 0.8 - 0.2 + rand.nextDouble() * 0.4, 1).toRGB()); + this.renderAlpha = 1; + type = rand.nextInt(6); + } + + /** + * EMP particle + * + * @param pos position + * @param motion motion + * @param scale render size 0.001-2 + */ + public ParticleEMP(Coord pos, Vec motion, double scale) { + this(pos, motion, true); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 2); + } + + /** + * EMP particle + * + * @param pos position + * @param motion motion + * @param scale render size 0.001-2 + * @param slowDown can slow down gradually + */ + public ParticleEMP(Coord pos, Vec motion, double scale, boolean slowDown) { + this(pos, motion, slowDown); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 2); + } + + @Override + public EParticle getType() { + return EParticle.EMP; + } + + @Override + public void onUpdate() { + size = Calc.square(1F - ((float) age / (float) maxAge)) * sizeOrig; + + if (slow) { + motion.setTo(origMotion.scale(Calc.square(1 - (float) age / (float) maxAge))); + if (size < sizeOrig * 0.2) setDead(); + } else { + motion.scale_ip(0.90); + if (size < 0.2) setDead(); + } + } +} diff --git a/src/net/sector/effects/particles/ParticleFire.java b/src/net/sector/effects/particles/ParticleFire.java new file mode 100644 index 0000000..e7fe3c6 --- /dev/null +++ b/src/net/sector/effects/particles/ParticleFire.java @@ -0,0 +1,95 @@ +package net.sector.effects.particles; + + +import net.sector.Constants; +import net.sector.effects.EParticle; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + + +/** + * Fire / explode particle + * + * @author MightyPork + */ +public class ParticleFire extends Particle { + + private Vec origMotion = null; + private boolean slow = false; + public int type = 0; + + public ParticleFire setType(int type) { + this.type = type; + return this; + } + + /** + * Fire particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param slowDown can slow down gradually + */ + public ParticleFire(Coord pos, Vec motion, double rotSpeed, boolean slowDown) { + super(pos, motion); + origMotion = motion.copy(); + slow = slowDown; + this.rotAngle.set(rand.nextDouble() * 360); + this.rotSpeed = rotSpeed; + this.maxAge = (long) (Constants.FPS_UPDATE * (0.2 + rand.nextDouble() * 1)); + this.size = this.sizeOrig = 0.6 + rand.nextDouble(); + this.renderColor.setTo(new RGB(1, 1, 1)); + this.renderAlpha = 1; + } + + /** + * Fire particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param scale render size 0.001-2 + */ + public ParticleFire(Coord pos, Vec motion, double rotSpeed, double scale) { + this(pos, motion, rotSpeed, true); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 2); + } + + /** + * Fire particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param scale render size 0.001-2 + * @param slowDown can slow down gradually + */ + public ParticleFire(Coord pos, Vec motion, double rotSpeed, double scale, boolean slowDown) { + this(pos, motion, rotSpeed, slowDown); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 2); + } + + @Override + public EParticle getType() { + return EParticle.FIRE; + } + + @Override + public void onUpdate() { + size = Calc.square(1F - ((float) age / (float) maxAge)) * sizeOrig; + + if (slow) { + motion.setTo(origMotion.scale(Calc.square(1 - (float) age / (float) maxAge))); + if (size < sizeOrig * 0.2) setDead(); + } else { + motion.scale_ip(0.90); + if (size < 0.2) setDead(); + } + } + +} diff --git a/src/net/sector/effects/particles/ParticleOrb.java b/src/net/sector/effects/particles/ParticleOrb.java new file mode 100644 index 0000000..6d52cec --- /dev/null +++ b/src/net/sector/effects/particles/ParticleOrb.java @@ -0,0 +1,95 @@ +package net.sector.effects.particles; + + +import net.sector.Constants; +import net.sector.effects.EParticle; + +import com.porcupine.color.HSV; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + + +/** + * "EMP" particle + * + * @author MightyPork + */ +public class ParticleOrb extends Particle { + + private Vec origMotion = null; + private boolean slow = false; + + /** Type (0-5) */ + public int type = 0; + + /** + * EMP particle + * + * @param pos position + * @param motion motion + * @param slowDown can slow down gradually + */ + public ParticleOrb(Coord pos, Vec motion, boolean slowDown, int color) { + super(pos, motion); + origMotion = motion.copy(); + slow = slowDown; + this.rotAngle.set(rand.nextDouble() * 360); + this.rotSpeed = -10 + rand.nextDouble() * 20; + this.maxAge = (long) (Constants.FPS_UPDATE * (0.2 + rand.nextDouble() * 1)); + this.size = this.sizeOrig = 0.6 + rand.nextDouble(); + double h = 0; + + if (color == 0) h = 0.5 + rand.nextDouble() * 0.3; + if (color == 1) h = rand.nextBoolean() ? rand.nextDouble() * 0.1 : 1 - rand.nextDouble() * 0.1; + if (color == 2) h = 0.2 + rand.nextDouble() * 0.3; + + this.renderColor.setTo(new HSV(h, 0.6 + rand.nextDouble() * 0.4, 1).toRGB()); + this.renderAlpha = 1; + type = rand.nextInt(6); + } + + /** + * EMP particle + * + * @param pos position + * @param motion motion + * @param scale render size 0.001-2 + */ + public ParticleOrb(Coord pos, Vec motion, double scale, int color) { + this(pos, motion, true, color); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 1); + } + + /** + * EMP particle + * + * @param pos position + * @param motion motion + * @param scale render size 0.001-2 + * @param slowDown can slow down gradually + */ + public ParticleOrb(Coord pos, Vec motion, double scale, boolean slowDown, int color) { + this(pos, motion, slowDown, color); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 1); + } + + @Override + public EParticle getType() { + return EParticle.ORB; + } + + @Override + public void onUpdate() { + size = Calc.square(1F - ((float) age / (float) maxAge)) * sizeOrig; + + if (slow) { + motion.setTo(origMotion.scale(Calc.square(1 - (float) age / (float) maxAge))); + if (size < sizeOrig * 0.2) setDead(); + } else { + motion.scale_ip(0.90); + if (size < 0.2) setDead(); + } + } +} diff --git a/src/net/sector/effects/particles/ParticleShard.java b/src/net/sector/effects/particles/ParticleShard.java new file mode 100644 index 0000000..1a816d2 --- /dev/null +++ b/src/net/sector/effects/particles/ParticleShard.java @@ -0,0 +1,52 @@ +package net.sector.effects.particles; + + +import net.sector.Constants; +import net.sector.effects.EParticle; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + + +/** + * Shard (explosion) particle + * + * @author MightyPork + */ +public class ParticleShard extends Particle { + + /** shard texture type */ + public int type = 0; + + /** + * Shard particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + */ + public ParticleShard(Coord pos, Vec motion, double rotSpeed) { + super(pos, motion); + this.rotAngle.set(rand.nextDouble() * 360); + this.rotSpeed = rotSpeed; + this.maxAge = (long) (Constants.FPS_UPDATE * (0.6 + rand.nextDouble() * 1)); + this.size = this.sizeOrig = rand.nextDouble() * 0.5; + this.renderColor.setTo(new RGB(1, 1, 1)); + this.renderAlpha = 1; + type = rand.nextInt(2); + } + + @Override + public EParticle getType() { + return EParticle.SHARD; + } + + @Override + public void onUpdate() { + renderAlpha = Calc.square(1F - (float) age / (float) maxAge); + } + +} diff --git a/src/net/sector/effects/particles/ParticleSmoke.java b/src/net/sector/effects/particles/ParticleSmoke.java new file mode 100644 index 0000000..3adcb24 --- /dev/null +++ b/src/net/sector/effects/particles/ParticleSmoke.java @@ -0,0 +1,52 @@ +package net.sector.effects.particles; + + +import net.sector.Constants; +import net.sector.effects.EParticle; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + + +/** + * Smoke particle + * + * @author MightyPork + */ +public class ParticleSmoke extends Particle { + + /** Texture type */ + public int type = 0; + + /** + * Smoke particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + */ + public ParticleSmoke(Coord pos, Vec motion, double rotSpeed) { + super(pos, motion); + this.rotAngle.set(rand.nextDouble() * 360); + this.rotSpeed = rotSpeed; + this.maxAge = (long) (Constants.FPS_UPDATE * (0.6 + rand.nextDouble() * 1)); + this.size = this.sizeOrig = rand.nextDouble() * 0.5; + this.renderColor.setTo(new RGB(1, 1, 1)); + this.renderAlpha = 1; + type = rand.nextInt(2); + } + + @Override + public EParticle getType() { + return EParticle.SMOKE; + } + + @Override + public void onUpdate() { + renderAlpha = 0.5 * Calc.square(1F - (float) age / (float) maxAge); + } + +} diff --git a/src/net/sector/effects/particles/ParticleStar.java b/src/net/sector/effects/particles/ParticleStar.java new file mode 100644 index 0000000..6561063 --- /dev/null +++ b/src/net/sector/effects/particles/ParticleStar.java @@ -0,0 +1,98 @@ +package net.sector.effects.particles; + + +import net.sector.Constants; +import net.sector.effects.EParticle; + +import com.porcupine.color.HSV; +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + + +/** + * Experimental (= ugly) star particle + * + * @author MightyPork + */ +public class ParticleStar extends Particle { + + private Vec origMotion = null; + private boolean slow = false; + + private HSV hsv = new HSV(0, 1, 1); + + /** + * Star particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param slowDown can slow down gradually + */ + public ParticleStar(Coord pos, Vec motion, double rotSpeed, boolean slowDown) { + super(pos, motion); + origMotion = motion.copy(); + slow = slowDown; + this.rotAngle.set(rand.nextDouble() * 360); + this.rotSpeed = rotSpeed; + this.maxAge = (long) (Constants.FPS_UPDATE * (0.4 + rand.nextDouble() * 1.5)); + this.size = this.sizeOrig = 0.6 + rand.nextDouble(); + this.renderColor.setTo(new RGB(1, 1, 1)); + this.renderAlpha = 1; + } + + /** + * Star particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param scale render size 0.001-2 + */ + public ParticleStar(Coord pos, Vec motion, double rotSpeed, double scale) { + this(pos, motion, rotSpeed, true); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 2); + } + + /** + * Star particle + * + * @param pos position + * @param motion motion + * @param rotSpeed rotation speed + * @param scale render size 0.001-2 + * @param slowDown can slow down gradually + */ + public ParticleStar(Coord pos, Vec motion, double rotSpeed, double scale, boolean slowDown) { + this(pos, motion, rotSpeed, slowDown); + this.size = this.sizeOrig = Calc.clampd(scale, 0.001, 2); + } + + @Override + public EParticle getType() { + return EParticle.STAR; + } + + @Override + public void onUpdate() { + renderAlpha = Calc.square(1F - (float) age / (float) maxAge); + + this.renderColor.setTo(hsv.toRGB()); + hsv.h -= 0.005; + if (hsv.h < 0) hsv.h = 1 - hsv.h; + + size = Calc.square(1F - Calc.clampd((age / ((float) maxAge + 1)), 0, 1)) * sizeOrig; + + if (slow) { + motion.setTo(origMotion.scale(Calc.square(1 - (float) age / (float) maxAge))); + //if(size < sizeOrig*0.2) setDead(); + } else { + motion.scale_ip(0.90); + //if(size < 0.2) setDead(); + } + } + +} diff --git a/src/net/sector/effects/renderers/ParticleBinaryRenderer.java b/src/net/sector/effects/renderers/ParticleBinaryRenderer.java new file mode 100644 index 0000000..fe3f795 --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleBinaryRenderer.java @@ -0,0 +1,34 @@ +package net.sector.effects.renderers; + + +import net.sector.effects.EParticle; +import net.sector.effects.particles.Particle; +import net.sector.effects.particles.ParticleBinary; + +import com.porcupine.coord.Coord; + + +/** + * Binary particle renderer + * + * @author MightyPork + */ +public class ParticleBinaryRenderer extends ParticleRendererPlain { + /** + * Binary particle renderer + */ + public ParticleBinaryRenderer() { + super(new Coord(0, 1)); + } + + @Override + public void renderParticle(Particle part, double delta) { + texCoord.x = 1 + ((ParticleBinary) part).type; + super.renderParticle(part, delta); + } + + @Override + public EParticle getType() { + return EParticle.BINARY; + } +} diff --git a/src/net/sector/effects/renderers/ParticleEMPRenderer.java b/src/net/sector/effects/renderers/ParticleEMPRenderer.java new file mode 100644 index 0000000..af4c3d7 --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleEMPRenderer.java @@ -0,0 +1,35 @@ +package net.sector.effects.renderers; + + +import net.sector.effects.EParticle; +import net.sector.effects.particles.Particle; +import net.sector.effects.particles.ParticleEMP; + +import com.porcupine.coord.Coord; + + +/** + * Fire particle renderer + * + * @author MightyPork + */ +public class ParticleEMPRenderer extends ParticleRendererBlend { + /** + * Fire particle renderer + */ + public ParticleEMPRenderer() { + super(new Coord(1, 1)); + } + + @Override + public void renderParticle(Particle part, double delta) { + texCoord.x = 1 + ((ParticleEMP) part).type % 2; + texCoord.y = 1 + ((ParticleEMP) part).type / 2; + super.renderParticle(part, delta); + } + + @Override + public EParticle getType() { + return EParticle.EMP; + } +} diff --git a/src/net/sector/effects/renderers/ParticleFireRenderer.java b/src/net/sector/effects/renderers/ParticleFireRenderer.java new file mode 100644 index 0000000..76a7c42 --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleFireRenderer.java @@ -0,0 +1,40 @@ +package net.sector.effects.renderers; + + +import net.sector.effects.EParticle; +import net.sector.effects.particles.Particle; +import net.sector.effects.particles.ParticleFire; + +import com.porcupine.coord.Coord; + + +/** + * Fire particle renderer + * + * @author MightyPork + */ +public class ParticleFireRenderer extends ParticleRendererBlend { + /** + * Fire particle renderer + */ + public ParticleFireRenderer() { + super(new Coord(0, 0)); + } + + @Override + public void renderParticle(Particle part, double delta) { + switch (((ParticleFire) part).type) { + case 0: + texCoord.setTo(0, 0); + break; + case 1: + texCoord.setTo(4, 1); + } + super.renderParticle(part, delta); + } + + @Override + public EParticle getType() { + return EParticle.FIRE; + } +} diff --git a/src/net/sector/effects/renderers/ParticleOrbRenderer.java b/src/net/sector/effects/renderers/ParticleOrbRenderer.java new file mode 100644 index 0000000..215efa1 --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleOrbRenderer.java @@ -0,0 +1,35 @@ +package net.sector.effects.renderers; + + +import net.sector.effects.EParticle; +import net.sector.effects.particles.Particle; +import net.sector.effects.particles.ParticleOrb; + +import com.porcupine.coord.Coord; + + +/** + * orb particle renderer + * + * @author MightyPork + */ +public class ParticleOrbRenderer extends ParticleRendererBlend { + /** + * Fire particle renderer + */ + public ParticleOrbRenderer() { + super(new Coord(1, 1)); + } + + @Override + public void renderParticle(Particle part, double delta) { + texCoord.x = 1 + ((ParticleOrb) part).type % 2; + texCoord.y = 1 + ((ParticleOrb) part).type / 2; + super.renderParticle(part, delta); + } + + @Override + public EParticle getType() { + return EParticle.ORB; + } +} diff --git a/src/net/sector/effects/renderers/ParticleRenderer.java b/src/net/sector/effects/renderers/ParticleRenderer.java new file mode 100644 index 0000000..af5b2db --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleRenderer.java @@ -0,0 +1,93 @@ +package net.sector.effects.renderers; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.effects.EParticle; +import net.sector.effects.particles.Particle; + +import com.porcupine.coord.Coord; + + + +/** + * Particle renderer.
+ * Only one instance of this renderer is made, and is later held in + * ParticleManager.renderers + * + * @author MightyPork + */ +public abstract class ParticleRenderer { + + /** + * coordinates 0-7,0-7 in texture, allowing having multiple particles in + * single file + */ + public Coord texCoord; + + /** + * New particle renderer + * + * @param textureCoords new float[]{left, top, right, bottom} coordinates in + * texture, 0-1 + */ + public ParticleRenderer(Coord textureCoords) { + this.texCoord = textureCoords; + } + + /** + * Render the particle. You should load identity, translate and rotate and + * do the rendering using texture.bind().
+ * Don't forget to add MINUS sign before z axis in translation. + * + * @param part the particle + * @param delta delta time + */ + public void renderParticle(Particle part, double delta) { + + double left = (texCoord.x) * 0.125; + double top = (texCoord.y) * 0.125; + double right = (texCoord.x + 1) * 0.125; + double bottom = (texCoord.y + 1) * 0.125; + + Coord pos = part.pos.getDelta(delta); + double scale = part.size * 1.4142414 * 0.5; + + double sx1 = Math.cos(Math.toRadians(part.rotAngle.delta(delta))) * scale; + double sy1 = Math.sin(Math.toRadians(part.rotAngle.delta(delta))) * scale; + double sx2 = -sy1; + double sy2 = sx1; + + glColor4d(part.renderColor.r, part.renderColor.g, part.renderColor.b, part.renderAlpha); + + glTexCoord2d(left, top); + glVertex3d(pos.x + sx1, pos.y + sy1, -pos.z); + + glTexCoord2d(right, top); + glVertex3d(pos.x + sx2, pos.y + sy2, -pos.z); + + glTexCoord2d(right, bottom); + glVertex3d(pos.x - sx1, pos.y - sy1, -pos.z); + + glTexCoord2d(left, bottom); + glVertex3d(pos.x - sx2, pos.y - sy2, -pos.z); + + } + + /** + * Prepare for rendering + */ + public abstract void prepareRender(); + + /** + * Finish the rendering + */ + public abstract void finishRender(); + + /** + * Get particle type this renderer can render + * + * @return type + */ + public abstract EParticle getType(); + +} diff --git a/src/net/sector/effects/renderers/ParticleRendererBlend.java b/src/net/sector/effects/renderers/ParticleRendererBlend.java new file mode 100644 index 0000000..ba81d6b --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleRendererBlend.java @@ -0,0 +1,48 @@ +package net.sector.effects.renderers; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.textures.TextureManager; + +import com.porcupine.coord.Coord; + + + +/** + * Particle renderer BLEND (black image with colors). + * + * @author MightyPork + */ +public abstract class ParticleRendererBlend extends ParticleRenderer { + + /** + * Blend renderer + * + * @param textureCoords texture coords for texture + */ + public ParticleRendererBlend(Coord textureCoords) { + super(textureCoords); + } + + @Override + public void prepareRender() { + glPushMatrix(); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + //glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_DST_ALPHA); + glBlendFunc(GL_ONE, GL_ONE); + TextureManager.bind("particles_blend"); + glBegin(GL_QUADS); + } + + @Override + public void finishRender() { + + glEnd(); + TextureManager.unbind(); + glDisable(GL_BLEND); + glPopMatrix(); + + } + +} diff --git a/src/net/sector/effects/renderers/ParticleRendererPlain.java b/src/net/sector/effects/renderers/ParticleRendererPlain.java new file mode 100644 index 0000000..6fe12c6 --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleRendererPlain.java @@ -0,0 +1,47 @@ +package net.sector.effects.renderers; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.textures.TextureManager; + +import com.porcupine.coord.Coord; + + + +/** + * Particle renderer PLAIN. + * + * @author MightyPork + */ +public abstract class ParticleRendererPlain extends ParticleRenderer { + + /** + * Plain renderer + * + * @param textureCoords texture coords + */ + public ParticleRendererPlain(Coord textureCoords) { + super(textureCoords); + } + + @Override + public void prepareRender() { + glPushMatrix(); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + TextureManager.bind("particles_plain"); + glBegin(GL_QUADS); + + } + + @Override + public void finishRender() { + + glEnd(); + TextureManager.unbind(); + glDisable(GL_BLEND); + glPopMatrix(); + + } +} diff --git a/src/net/sector/effects/renderers/ParticleShardRenderer.java b/src/net/sector/effects/renderers/ParticleShardRenderer.java new file mode 100644 index 0000000..0406324 --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleShardRenderer.java @@ -0,0 +1,36 @@ +package net.sector.effects.renderers; + + +import net.sector.effects.EParticle; +import net.sector.effects.particles.Particle; +import net.sector.effects.particles.ParticleShard; + +import com.porcupine.coord.Coord; + + +/** + * Shard particle renderer + * + * @author MightyPork + */ +public class ParticleShardRenderer extends ParticleRendererPlain { + /** + * Shard particle renderer + */ + public ParticleShardRenderer() { + super(new Coord(0, 0)); + } + + @Override + public void renderParticle(Particle part, double delta) { + texCoord.x = 2 + ((ParticleShard) part).type; + //glEnable(GL_LIGHTING); + super.renderParticle(part, delta); + //glDisable(GL_LIGHTING); + } + + @Override + public EParticle getType() { + return EParticle.SHARD; + } +} \ No newline at end of file diff --git a/src/net/sector/effects/renderers/ParticleSmokeRenderer.java b/src/net/sector/effects/renderers/ParticleSmokeRenderer.java new file mode 100644 index 0000000..75fbd0e --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleSmokeRenderer.java @@ -0,0 +1,35 @@ +package net.sector.effects.renderers; + + +import net.sector.effects.EParticle; +import net.sector.effects.particles.Particle; +import net.sector.effects.particles.ParticleSmoke; + +import com.porcupine.coord.Coord; + + +/** + * Smoke particle renderer + * + * @author MightyPork + */ +public class ParticleSmokeRenderer extends ParticleRendererPlain { + /** + * Smoke particle renderer + */ + public ParticleSmokeRenderer() { + super(new Coord(0, 0)); + } + + @Override + public void renderParticle(Particle part, double delta) { + texCoord.x = ((ParticleSmoke) part).type; + + super.renderParticle(part, delta); + } + + @Override + public EParticle getType() { + return EParticle.SMOKE; + } +} diff --git a/src/net/sector/effects/renderers/ParticleStarRenderer.java b/src/net/sector/effects/renderers/ParticleStarRenderer.java new file mode 100644 index 0000000..5004756 --- /dev/null +++ b/src/net/sector/effects/renderers/ParticleStarRenderer.java @@ -0,0 +1,26 @@ +package net.sector.effects.renderers; + + +import net.sector.effects.EParticle; + +import com.porcupine.coord.Coord; + + +/** + * Star particle renderer + * + * @author MightyPork + */ +public class ParticleStarRenderer extends ParticleRendererPlain { + /** + * Star particle renderer + */ + public ParticleStarRenderer() { + super(new Coord(0, 1)); + } + + @Override + public EParticle getType() { + return EParticle.STAR; + } +} diff --git a/src/net/sector/entities/EEntity.java b/src/net/sector/entities/EEntity.java new file mode 100644 index 0000000..479c609 --- /dev/null +++ b/src/net/sector/entities/EEntity.java @@ -0,0 +1,26 @@ +package net.sector.entities; + + +/** + * Entity type + * + * @author MightyPork + */ +public enum EEntity { + /** Shot, bullet, rocket etc. by aliens */ + SHOT_BAD, + /** Player shot */ + SHOT_GOOD, + /** Player ship */ + PLAYER, + /** Enemy ship / space craft */ + ENEMY, + /** Natural = rocks etc. */ + NATURAL, + /** Power up */ + BONUS, + /** MINE */ + MINE, + /** NONE (fake damage source) */ + NONE; +} diff --git a/src/net/sector/entities/EFormation.java b/src/net/sector/entities/EFormation.java new file mode 100644 index 0000000..644ee90 --- /dev/null +++ b/src/net/sector/entities/EFormation.java @@ -0,0 +1,6 @@ +package net.sector.entities; + + +public enum EFormation { + SNAKE, SWARM, SHAPE, NONE +} diff --git a/src/net/sector/entities/Entity.java b/src/net/sector/entities/Entity.java new file mode 100644 index 0000000..d992ea9 --- /dev/null +++ b/src/net/sector/entities/Entity.java @@ -0,0 +1,664 @@ +package net.sector.entities; + + +import java.util.Random; + +import net.sector.Constants; +import net.sector.NullDamageSource; +import net.sector.collision.Collider; +import net.sector.collision.ColliderSphere; +import net.sector.collision.Scene; +import net.sector.effects.Effects; +import net.sector.entities.orbs.EntityOrbArtifact; +import net.sector.entities.player.EntityPlayerShip; +import net.sector.util.DeltaDoubleDeg; +import net.sector.util.Log; +import net.sector.util.Utils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +/** + * Entity object: something that moves, reacts to collisions and does other cool + * stuff. + * + * @author MightyPork + */ +public abstract class Entity implements IPhysEntity, Comparable { + + public static final IDamageable NO_SOURCE = new NullDamageSource(); + + private int artifacts = 0; + + /** Delay before two following explosions. */ + protected static final long ExplodeCooldown = Constants.FPS_UPDATE / 3; + + /** Counts down until next explosion can be added == 0 */ + public long explodeCooldown = 0; + + public double healthMul = 1; + + /** Global movement disabled */ + private boolean globalMovement = true; + + /** Collide priority, entity with higher number handles collision. */ + public int collidePriority = 0; + + /** Speed limit */ + public double MAX_SPEED = 0.3; + + /** points added to counter when killed by player */ + public int scoreValue = 0; + + /** health used to add damage */ + public double health = 1; + + /** time left before death (in update ticks) */ + public int lifetime = Constants.FPS_UPDATE * 5; + + /** flag that entity is dead */ + protected boolean isDead = false; + + /** Motion - number of units to move per update tick */ + public Vec motion = new Vec(); + + /** rotation vector for glRotate - the axis */ + public Vec rotDir = new Vec(); + + /** Y rot angle */ + public DeltaDoubleDeg rotAngle = new DeltaDoubleDeg(0); + + /** Entity mass, to be used in reaction calculations */ + public double mass = 1.0; + + /** the scene */ + public Scene scene; + + /** Primary entity collider */ + public ColliderSphere collider; + + public double effectEmpTicks; + public double effectFireTicks; + public IDamageable fireSource = NO_SOURCE; + + /** RNG */ + public static Random rand = new Random(); + + /** + * Get entity type + * + * @return entity type + */ + @Override + public abstract EEntity getType(); + + /** + * Add artifact to this entity, dropped on death. + * + * @param artifacts artifacts + */ + public final void addArtifacts(int artifacts) { + this.artifacts += artifacts; + } + + /** + * Get if entity has an artifact. + * + * @return has artifact. + */ + public final int getArtifacts() { + return artifacts; + } + + /** + * Remove artifact, if any, from this entity. + */ + public final void removeArtifacts() { + artifacts = 0; + } + + /** + * Set global movement + * + * @param flag global movement enabled; False if entity is player ship / + * player's shot / boss + * @return this + */ + public final Entity setGlobalMovement(boolean flag) { + globalMovement = flag; + return this; + } + + /** + * Get if has global movement + * + * @return + */ + public boolean hasGlobalMovement() { + return globalMovement; + } + + @Override + public final Coord getPos() { + return collider.pos; + } + + @Override + public final Vec getMotion() { + return motion; + } + + @Override + public final double getMass() { + return mass; + } + + @Override + public boolean isDead() { + return isDead; + } + + @Override + public final double getSpeed() { + return motion.size(); + } + + @Override + public final void setMotion(Vec newMotion) { + motion.setTo(newMotion); + } + + /** + * Set entity dead + */ + @Override + public final void setDead() { + isDead = true; + } + + /** + * Assign scene to entity. Called when entity is added to scene. + * + * @param scene the scene assigned + */ + @Override + public final void setScene(Scene scene) { + this.scene = scene; + onAddedToScene(); + } + + /** + * Check if this entity collides with other entity + * + * @param other the other entity + * @return does collide + */ + public boolean collidesWith(Entity other) { + ColliderSphere c = getColliderFor(other.collider); + if (c == null) return false; + return c.collidesWith(other.collider); + } + + /** + * React to collision with other entity (eg. bullet hitting asteroid) + * + * @param hitBy + */ + public final void react(Entity hitBy) { + onImpact(hitBy); + } + + /** + * Called right after entity was added to scene. + */ + public void onAddedToScene() {} + + /** + * Handle collision and do reaction here. + * + * @param hitBy + */ + public abstract void onImpact(Entity hitBy); + + /** + * Default reaction on impact. + * + * @param hitBy + */ + public final void defaultOnImpact(Entity hitBy) { + try { + if (hitBy.isDead()) return; + + ColliderSphere mycol = getColliderFor(hitBy.collider); + ColliderSphere ocol = hitBy.getColliderFor(this.collider); + if (mycol == null || ocol == null) return; + + Vec move = getPos().vecTo(hitBy.getPos()); + + Coord midpoint = getPos().add(move.norm(mycol.radius)); + + if (hitBy.getType() == EEntity.PLAYER && !((EntityPlayerShip) hitBy).body.isShieldRunning()) { + + //move.scale_ip(0.2); + + } + + + move.norm_ip((mycol.radius + ocol.radius) - mycol.getPos().distTo(ocol.getPos())); + + hitBy.getPos().add_ip(move.scale(0.3)); + getPos().add_ip(move.scale(0.3).neg()); + + //this.motion.offset_ip(move.neg().scale(40)); + + Vec added = move.scale(1 / hitBy.mass); + + + hitBy.getMotion().add_ip(added); + getMotion().add_ip(move.neg().scale(1 / mass)); + + hitBy.getMotion().add_ip(getMotion().scale((1 / hitBy.mass) * 0.1)); + getMotion().add_ip(hitBy.getMotion().scale((1 / mass) * 0.1)); + + double damageGot = hitBy.mass * hitBy.getSpeed(); + if (!Double.isNaN(damageGot)) addDamage(hitBy, damageGot); + double damageGiven = mass * getSpeed(); + if (!Double.isNaN(damageGiven)) hitBy.addDamage(this, damageGiven); + + + if (!isDead) { + explode(midpoint, 0.01, false); + } + } catch (Throwable t) { + Log.e(t); + } + } + + /** + * Explode, if not cooled down yet, do nothing. + * + * @param pos position of explosion + * @param strength strength of explosion + * @param shards has shards + */ + public final void explode(Coord pos, double strength, boolean shards) { + if (!Utils.canSkipRendering(pos) && explodeCooldown == 0) { + Effects.addExplosion(scene.particles, pos, getMotion(), strength, shards, hasGlobalMovement()); + explodeCooldown = ExplodeCooldown; + } + } + + /** + * Explode, ignore explodeCooldown + * + * @param pos position of explosion + * @param strength strength of explosion + * @param shards has shards + */ + public final void explodeForce(Coord pos, double strength, boolean shards) { + if (!Utils.canSkipRendering(pos)) { + Effects.addExplosion(scene.particles, pos, getMotion(), strength, shards, hasGlobalMovement()); + explodeCooldown += ExplodeCooldown; + } + } + + public boolean allowVerticalMovement() { + return false; + } + + private Coord posBackup = null; + private Vec motionBackup = null; + + /** + * Update entity position and other things. Called each update tick. + */ + public final void update() { + + if (posBackup == null) posBackup = getPos().copy(); + if (motionBackup == null) motionBackup = getMotion().copy(); + + if (!allowVerticalMovement()) { + getPos().setY_ip(0); + getMotion().setY_ip(0); + } + + + if (effectEmpTicks > 0) effectEmpTicks -= 1 * Constants.SPEED_MUL; + if (effectFireTicks > 0) effectFireTicks -= 1 * Constants.SPEED_MUL; + + + getPos().pushLast(); + rotAngle.pushLast(); + + fixNans(); + + if (explodeCooldown > 0) explodeCooldown--; + getPos().add_ip(motion.mul(Constants.SPEED_MUL)); + + if (hasGlobalMovement()) { +// if(!(this instanceof EntityAsteroid))System.out.println("Global movement of: "+getClass().getSimpleName()); + getPos().add_ip(scene.getGlobalMovement().mul(Constants.SPEED_MUL)); + } + + if (lifetime > 0) { + lifetime--; + if (lifetime == 0) { + setDead(); + return; + } + } + + if (isEmpParalyzed()) { + if (rand.nextInt(5) == 0) + Effects.addEMPExplosion(scene.particles, getPos(), getMotion(), 1.6 * collider.radius, hasGlobalMovement(), false); + } + + if (isOnFire()) { + if (rand.nextInt(3) == 0) { + Effects.addFireBurst(scene.particles, getPos(), getMotion(), collider.radius * 0.9, 6, hasGlobalMovement(), false); + } + + addDamage(fireSource, 0.09 * Constants.SPEED_MUL * getFireSensitivity()); + } + + if (!isDead) onUpdate(); + + double sp = getSpeed(); + if (sp > MAX_SPEED) getMotion().norm_ip(MAX_SPEED); + + fixNans(); + + getPos().update(); + + } + + private void fixNans() { + boolean correction = false; + Coord pos = getPos().copy(); + + if (Double.isNaN(pos.x) || Double.isNaN(pos.y) || Double.isNaN(pos.z)) { + correction = true; + + getPos().x = Calc.fixNan(pos.x, posBackup.x); + getPos().y = Calc.fixNan(pos.y, posBackup.y); + getPos().z = Calc.fixNan(pos.z, posBackup.z); + + getPos().pushLast(); + getPos().update(); + } + + if (correction) { + Log.f3("\n!!! Correction: position of " + Calc.className(this) + ":\n" + pos + " -> " + getPos()); + } + + + + correction = false; + + Vec motion = getMotion().copy(); + + if (Double.isNaN(motion.x) || Double.isNaN(motion.y) || Double.isNaN(motion.z)) { + correction = true; + + getMotion().x = Calc.fixNan(motion.x, motionBackup.x); + getMotion().y = Calc.fixNan(motion.y, motionBackup.y); + getMotion().z = Calc.fixNan(motion.z, motionBackup.z); + + getMotion().pushLast(); + getMotion().update(); + } + + if (correction) { + Log.f3("\n!!! Correction: motion of " + Calc.className(this) + ":\n" + motion + " -> " + getMotion()); + } + + posBackup.setTo(getPos()); + motionBackup.setTo(getMotion()); + } + + /** + * Get if is EMP paralyzed (unable to move,shootm etc) + * + * @return is emp paralyzed + */ + public final boolean isEmpParalyzed() { + return effectEmpTicks > 0; + } + + /** + * Get if is on fire + * + * @return is on fire + */ + public final boolean isOnFire() { + return effectFireTicks > 0; + } + +// /** +// * Get if this entity is electronic and affected by EMP missiles +// * +// * @return is EMP sensitive +// */ +// public abstract boolean isEmpSensitive(); + + /** + * Get EMP sensitivity (1 is normal, 0 is EMP-protected) + * + * @return EMP sensitivity + */ + public abstract double getEmpSensitivity(); + + /** + * Get fire sensitivity (1 is full, 0 is fire-protected) + * + * @return fire sensitivity + */ + public abstract double getFireSensitivity(); + + /** + * Get fire flammability (1 is full, 0 is fire-protected) - how much fire + * can be added by a fireball. + * + * @return fire sensitivity + */ + public abstract double getFireFlammability(); + + /** + * Add EMP ticks + * + * @param ticks + */ + public final void addEmp(double ticks) { + effectEmpTicks += ticks * getEmpSensitivity(); + } + + /** + * Add fire ticks + * + * @param ticks + */ + public final void addFire(IDamageable source, double ticks) { + effectFireTicks += ticks * getFireFlammability(); + fireSource = source; + } + + /** + * Called each update tick, for position update and AI. + */ + public abstract void onUpdate(); + + /** + * Called when entity dies - for explosion effects etc. + */ + public abstract void onDeath(); + + /** + * Render this entity + * + * @param delta + */ + public abstract void render(double delta); + + /** Entity which gave last damage (for scoring) */ + protected IDamageable lastDamageSource = null; + + + @Override + public void addDamage(IDamageable source, double points) { + if (isDead()) return; + lastDamageSource = source; + health -= points / healthMul; + if (health <= 0) { + setDead(); + health = 0; + + if (artifacts > 0) { + spawnArtifact(artifacts); + removeArtifacts(); + } + + onDeath(); + } + } + + /** + * Do spawn artifact at ship pos (on death) + */ + public void spawnArtifact(int points) { + scene.add(new EntityOrbArtifact(getPos(), points)); + } + + + /** + * Check if this entity belongs to a zone in Scene - zone map.
+ * Typically done by calculating lowest and highest Z coordinate of the + * entity and comparing them to the boundaries. + * + * @param zFrom start z + * @param zTo end z + * @return belongs to zone (at least partially) + */ + public boolean belongsToZone(double zFrom, double zTo) { + return Calc.inRange(collider.pos.z, zFrom - collider.radius - 0.5, zTo + collider.radius + 0.5); + } + + @Override + public void setPos(Coord pos) { + collider.pos.setTo(pos); + } + + @Override + public void setMaxSpeed(double maxSpeed) { + MAX_SPEED = maxSpeed; + } + + @Override + public Scene getScene() { + return scene; + } + + @Override + public double getRadius() { + return collider.radius; + } + + @Override + public ColliderSphere getColliderFor(Collider hitBy) { + return collider; + } + + /** + * Get score value when killed by player + * + * @return score points + */ + public int getScoreValue() { + return scoreValue; + } + + /** + * Set entity score value + * + * @param scoreValue score value + */ + public void setScoreValue(int scoreValue) { + this.scoreValue = scoreValue; + } + + /** + * Get health remaining + * + * @return points of health remaining + */ + @Override + public double getHealth() { + return health; + } + + /** + * Get health max + * + * @return points of health remaining + */ + @Override + public abstract double getHealthMax(); + + /** + * Set health - if used to count damage.
+ * Modular ships don't use this. + * + * @param health + */ + public void setHealth(double health) { + this.health = health; + } + + /** + * Get remaining life in update ticks + * + * @return lifetime life time remaining + */ + public int getLifetime() { + return lifetime; + } + + /** + * Set initial life time + * + * @param lifetime ticks of life + */ + public void setLifetime(int lifetime) { + this.lifetime = lifetime; + } + + @Override + public Vec getRotDir() { + return rotDir; + } + + @Override + public DeltaDoubleDeg getRotAngle() { + return rotAngle; + } + + + /** + * Compare by Z position, sorting for particle rendering. + */ + @Override + public int compareTo(Entity o) { + if (this == o) return 0; + return Double.valueOf(getPos().z).compareTo(o.getPos().z); + } + + /** + * heal this entity + * + * @param add health points to add + */ + public void addHealth(double add) { + this.health = Calc.clampd(this.health + add, 0, getHealthMax()); + } +} diff --git a/src/net/sector/entities/EntityNavigable.java b/src/net/sector/entities/EntityNavigable.java new file mode 100644 index 0000000..51f354e --- /dev/null +++ b/src/net/sector/entities/EntityNavigable.java @@ -0,0 +1,531 @@ +package net.sector.entities; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.Random; +import java.util.Set; + +import net.sector.collision.ColliderSphere; +import net.sector.level.drivers.INavigated; +import net.sector.level.drivers.Navigator; +import net.sector.level.drivers.TaskList; +import net.sector.models.PhysModel; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Polar; +import com.porcupine.math.PolarDeg; + + +/** + * Navigable entity + * + * @author MightyPork + */ +public abstract class EntityNavigable extends Entity implements INavigated { + + /** Velocity multiplier */ + public double speedMul1 = 1; + + /** Stable speed multiplier, set when spawning entity */ + public double speedMulStable = 1; + + /** Ship driver */ + public Navigator nav = new Navigator(this); + + /** scale (relative, 1 default) */ + public double scale = 1; + + /** render scale (how much is the model enlarged) */ + public double scaleRender = 1; + + /** Phys model */ + public PhysModel model = null; + + /** Desired motion speed */ + public double fullMoveSpeed = 0.04; + + private Entity[] fleet; + + private Entity cachedLeader = null; + + private EFormation formation = EFormation.NONE; + + private Entity targetEntity = null; + + @Override + public void spawnArtifact(int num) { + // if in formation, only the last one drops artifact. + + if (formation == EFormation.SHAPE) { + for (Entity e : fleet) { + if (e == this) continue; + if (e.isDead()) continue; + return; + } + + super.spawnArtifact(num); + + return; + } + + + if (formation != EFormation.NONE) { + if (formationIsLeader() && formationIsTail()) { + super.spawnArtifact(num); + } + return; + } + super.spawnArtifact(num); + } + + @Override + public Entity getTargetEntity() { + return targetEntity; + } + + @Override + public void setTargetEntity(Entity targetEntity) { + this.targetEntity = targetEntity; + } + + @Override + public void setFormation(Entity[] fleet, EFormation formation) { + this.fleet = fleet; + this.formation = formation; + } + + @Override + public Entity getFormationLeader() { + if (formation == EFormation.NONE) return null; + if (cachedLeader == null || cachedLeader.isDead() || cachedLeader.getPos().z < -1) { + cachedLeader = null; + if (formation == EFormation.SNAKE) cachedLeader = formationSnakeGetLeader(); + if (formation == EFormation.SWARM) cachedLeader = formationSwarmGetLeader(); + } + + return cachedLeader; + } + + @Override + public boolean formationIsTail() { + if (formation == EFormation.NONE) return false; + if (formation == EFormation.SNAKE) { + for (int i = 0; i < fleet.length; i++) { + if (fleet[i] == null || fleet[i].isDead()) continue; + return fleet[i] == this; + } + } + if (formation == EFormation.SWARM) return false; + return true; + } + + @Override + public boolean formationIsLeader() { + return getFormationLeader() == null; + } + + private Entity formationSnakeGetLeader() { + boolean finding = false; + int leader = -1; + for (int i = 0; i < fleet.length; i++) { + Entity e = fleet[i]; + if (e == null) continue; + if (e == this) { + finding = true; + continue; + } + if (e.isDead()) continue; + + if (finding) { + leader = i; + break; + } + } + + if (leader != -1) { + return fleet[leader]; + } else { + return null; + } + } + + private Entity formationSwarmGetLeader() { + int leader = -1; + + for (int i = fleet.length - 1; i >= 0; i--) { + Entity e = fleet[i]; + if (e == null) continue; + if (e.isDead()) continue; + leader = i; + break; + } + + if (leader != -1) { + return fleet[leader]; + } else { + return null; + } + } + + + + public boolean formationContains(Entity drone) { + if (fleet != null) { + for (Entity e : fleet) + if (e == drone) return true; + } + return false; + } + + /** + * @param model + * @param desiredSpeed + * @param scale + * @param pos + */ + protected EntityNavigable(PhysModel model, double desiredSpeed, double scale, Coord pos) { + this.fullMoveSpeed = desiredSpeed; + this.collidePriority = 1; + + this.scale = scale; + + collider = new ColliderSphere(pos, model.colliderRadius * scale); + + this.motion.setTo(0, 0, -desiredSpeed); + + this.lifetime = -1; + + this.MAX_SPEED = 0.3; + + // rotateable around Y axis + this.rotDir.setTo(0, 1, 0); + // rotate towards the player + this.rotAngle.set(270); + + setModel(model); + } + + /** + * Set the model (alter entity) + * + * @param model + */ + public void setModel(PhysModel model) { + this.model = model; + + this.scaleRender = model.renderScale * scale; + + this.mass = model.getMass(scale); + this.collider.radius = model.colliderRadius * scale; + + this.health = model.getHealth(scale); + + this.scoreValue = (int) (model.getScore(scale)); + } + + /** + * Adjust strength, radius, score and mass for scale + * + * @param scale relative scale (1 = normal) + * @return this + */ + public EntityNavigable adjustForScale(double scale) { + this.scale = scale; + this.scaleRender = model.renderScale * scale; + + this.mass = model.getMass(scale); + collider.radius = model.colliderRadius * scale; + + this.health = model.getHealth(scale); + + this.scoreValue = (int) (model.getScore(scale)); + + return this; + } + + /** + * Get direction based on entity rotation + * + * @return direction vector + */ + public Vec getRotateAimVector() { + double deg = getRotAngle().get(); + PolarDeg pl = new PolarDeg(deg + 90, 1); + return new Vec(pl.toCoordXZ()); + } + + /** + * Get direction based on entity rotation with random deviation + * + * @param deviationDeg max angular deviation (degrees) + * @return direction vector + */ + public Vec getRotateAimVector(double deviationDeg) { + double deg = getRotAngle().get(); + PolarDeg pl = new PolarDeg(deg + 90 - deviationDeg + rand.nextDouble() * deviationDeg * 2, 1); + return new Vec(pl.toCoordXZ()); + } + + /** + * Get direction based on entity rotation with degrees deviation + * + * @param addAngle angle added + * @return direction vector + */ + public Vec getRotateAimVectorPlusDeg(double addAngle) { + double deg = getRotAngle().get(); + PolarDeg pl = new PolarDeg(deg + addAngle, 1); + return new Vec(pl.toCoordXZ()); + } + + /** + * Get vector from this entity to player + * + * @return vector to player + */ + public Vec getVectorToPlayer() { + return getPos().vecTo(getScene().getPlayerShip().getPos()); + } + + /** + * Get vector from this entity to player + * + * @param deviationDeg max angular deviation (degrees) + * @return vector to player + */ + public Vec getVectorToPlayer(double deviationDeg) { + Vec v = getVectorToPlayer(); + PolarDeg p = PolarDeg.fromCoord(v.x, v.z); + PolarDeg p2 = new PolarDeg(p.angle - deviationDeg + rand.nextDouble() * deviationDeg * 2, p.distance); + return new Vec(p2.toCoordXZ()); + } + + /** + * Get vector to closest asteroid, or null if no target found. + * + * @return vector to player + */ + public Vec getVectorToClosestAsteroid() { + Set ents = getScene().getEntitiesInRange(getPos(), 6); + double shortest = 100; + Coord shortestPos = null; + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e.getType() == EEntity.NATURAL) { + double d; + + if ((d = getPos().vecTo(e.getPos()).size()) < shortest) { + shortest = d; + shortestPos = e.getPos(); + } + } + } + + if (shortestPos != null) { + return getPos().vecTo(shortestPos); + } + } + + return null; + } + + /** + * MUST BE OVERRIDEN AND USED + * + * @param scale scale 1 = normal + * @param pos coord center + */ + //public EntityNavigable(double scale, Coord pos) {} + + /** + * Constructor without model.
+ * !!! You must define things like score, health, lifetime and mass + * yourself. + * + * @param desiredSpeed desired motion speed for AI + * @param pos position + * @param radius collider radius + */ + public EntityNavigable(double desiredSpeed, Coord pos, double radius) { + this.fullMoveSpeed = desiredSpeed; + this.collidePriority = 1; + + collider = new ColliderSphere(pos, radius * scale); + + this.motion.setTo(0, 0, -desiredSpeed); + + this.lifetime = -1; + + // rotateable around Y axis + this.rotDir.setTo(0, 1, 0); + // rotate towards the player + this.rotAngle.set(270); + } + + /** + * Constructor without model.
+ * !!! You must define things like score, collider, rotDir, rotAngle, + * collider priority, health, lifetime and mass yourself. + * + * @param pos position + */ + public EntityNavigable(Coord pos) { + this.fullMoveSpeed = 0.001; + this.collidePriority = 1; + + collider = new ColliderSphere(pos, 0.5); + + this.motion.setTo(0, 0, -fullMoveSpeed); + + this.lifetime = -1; + + // rotateable around Y axis + this.rotDir.setTo(0, 1, 0); + // rotate towards the player + this.rotAngle.set(270); + } + + @Override + public void setDriver(TaskList driver) { + this.nav.setDriver(driver); + } + + @Override + public Navigator getNavigator() { + return nav; + } + + @Override + public double getDesiredSpeed() { + return fullMoveSpeed * speedMul1 * speedMulStable; + } + + @Override + public void setDesiredSpeed(double speed) { + fullMoveSpeed = speed; + } + + @Override + public void setShipLevel(int level) {} + + @Override + public abstract void shootOnce(int gunIndex); + + @Override + public abstract Vec getGunShotDir(int gunIndex); + + /** + * Get data for shot - position and direction. + * + * @param x relative X coordinate (affected by scale factor) + * @param z relative Z coordinate (affected by scale factor) + * @return struct of (real position, motion vector) + */ + protected Coord getShotPos(double x, double z) { + Vec zplus = motion.norm(z * scale); + Coord mtn = motion.norm(x * scale); + Polar pr = Polar.fromCoord(mtn.x, mtn.z); + pr.angle += Math.PI / 2; + + Vec ro = new Vec(pr.toCoord()); + + Coord pos = getPos().add(ro.x, 0, ro.z).add(zplus); + + return pos; + } + + @Override + public double getHealMultiplier() { + return 1; + } + + @Override + public EEntity getType() { + return EEntity.ENEMY; + } + + @Override + public abstract void onImpact(Entity hitBy); + + @Override + public double getEmpSensitivity() { + return 1; + } + + @Override + public double getFireFlammability() { + return 1; + } + + @Override + public double getFireSensitivity() { + return 0.85; + } + + @Override + public void onUpdate() { + if (nav != null && !isDead) nav.onUpdate(); + } + + @Override + public abstract void onDeath(); + + @Override + public void render(double delta) { + if (isDead) return; + if (model != null) { + glLoadIdentity(); + + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glRotated(rotAngle.delta(delta), rotDir.x, rotDir.y, rotDir.z); + glScaled(scaleRender, scaleRender, scaleRender); + + model.render(); + } + } + + @Override + public abstract double getHealthMax(); + + @Override + public double getHealthPercent() { + return Math.round((getHealth() / getHealthMax()) * 100); + } + + @Override + public boolean hasGlobalMovement() { + return false; + } + + /** + * Set ship variant - used for level building. + * + * @param variant variant number + */ + public void setShipVariant(int variant) {} + + + public double getSpeedMultiplier() { + return speedMulStable; + } + + public void setSpeedMultiplier(double speedMul) { + this.speedMulStable = speedMul; + } + + public void setStableSpeedMultiplier(double speed) { + this.speedMul1 = speed; + } + + public double getStableSpeedMultiplier() { + return speedMul1; + } + + public double getSpeedMultiplierTotal() { + return getSpeedMultiplier() * getStableSpeedMultiplier(); + } + +} diff --git a/src/net/sector/entities/IDamageable.java b/src/net/sector/entities/IDamageable.java new file mode 100644 index 0000000..2fae663 --- /dev/null +++ b/src/net/sector/entities/IDamageable.java @@ -0,0 +1,14 @@ +package net.sector.entities; + + +public interface IDamageable { + public void addDamage(IDamageable source, double points); + + public boolean isDead(); + + public double getHealth(); + + public EEntity getType(); + + double getHealthMax(); +} diff --git a/src/net/sector/entities/IPhysEntity.java b/src/net/sector/entities/IPhysEntity.java new file mode 100644 index 0000000..388f7be --- /dev/null +++ b/src/net/sector/entities/IPhysEntity.java @@ -0,0 +1,55 @@ +package net.sector.entities; + + +import net.sector.collision.Collider; +import net.sector.collision.ColliderSphere; +import net.sector.collision.Scene; +import net.sector.util.DeltaDoubleDeg; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Entity interface for physics calculations + * + * @author MightyPork + */ +public interface IPhysEntity extends IDamageable { + public Coord getPos(); + + public Vec getMotion(); + + public void setMotion(Vec motion); + + public void setPos(Coord pos); + + public void setMaxSpeed(double maxSpeed); + + public double getSpeed(); + + public void setDead(); + + @Override + public boolean isDead(); + + @Override + public double getHealth(); + + public double getMass(); + + @Override + public void addDamage(IDamageable source, double damage); + + public Scene getScene(); + + public void setScene(Scene scene); + + public double getRadius(); + + public Vec getRotDir(); + + public DeltaDoubleDeg getRotAngle(); + + public ColliderSphere getColliderFor(Collider hitBy); +} diff --git a/src/net/sector/entities/IScoreCounter.java b/src/net/sector/entities/IScoreCounter.java new file mode 100644 index 0000000..a49f53c --- /dev/null +++ b/src/net/sector/entities/IScoreCounter.java @@ -0,0 +1,16 @@ +package net.sector.entities; + + +/** + * This be an interface for player's ship, which counts score. + * + * @author MightyPork + */ +public interface IScoreCounter { + /** + * Add score to counter. + * + * @param points points to add. + */ + public void addScore(int points); +} diff --git a/src/net/sector/entities/enemies/EntityMine.java b/src/net/sector/entities/enemies/EntityMine.java new file mode 100644 index 0000000..9086778 --- /dev/null +++ b/src/net/sector/entities/enemies/EntityMine.java @@ -0,0 +1,176 @@ +package net.sector.entities.enemies; + + +import java.util.Set; + +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.orbs.EntityOrbShield; +import net.sector.entities.player.EntityPlayerShip; +import net.sector.entities.shots.EntityShotBase; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.models.PhysModel; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + + +/** + * Mine entity + * + * @author MightyPork + */ +public class EntityMine extends EntityNavigable { + + private double scale = 1; + private double healthMax; + + private static PhysModel shipModel = Models.spaceMine; + + private static final double mMoveSpeed = 0.00001; + + @Override + public boolean hasGlobalMovement() { + return true; + } + + /** + * Enemy ship + * + * @param scale + * @param pos + */ + public EntityMine(double scale, Coord pos) { + super(shipModel, mMoveSpeed, scale, pos); + setDefaultDriver(); + this.rotDir.setTo(0, 1, 0); + this.rotAngle.set(rand.nextDouble() * 360); + this.collidePriority = 2000; + this.lifetime = -1; + this.MAX_SPEED = 0.2 * (0.3 / mass); + } + + /** + * Enemy ship, scale=1 + * + * @param pos + */ + public EntityMine(Coord pos) { + super(shipModel, mMoveSpeed, 1, pos); + setDefaultDriver(); + this.rotDir.setTo(0, 1, 0); + this.rotAngle.set(rand.nextDouble() * 360); + this.collidePriority = 2000; + this.lifetime = -1; + this.MAX_SPEED = 0.2 * (0.3 / mass); + } + + private void setDefaultDriver() { + setDriver(SuperContext.basicDrivers.getDriver("mine")); + } + + + @Override + public double getHealthMax() { + return healthMax; + } + + @Override + public void onImpact(Entity hitBy) { + if (hitBy == null) return; + + boolean dead = false; + if (hitBy.getType() == EEntity.SHOT_BAD || hitBy.getType() == EEntity.SHOT_GOOD) { + if (rand.nextInt(2) == 0) { + dead = true; + if (((EntityShotBase) hitBy).scoreCounter != null) { + ((EntityShotBase) hitBy).scoreCounter.addScore(scoreValue); + } + + boom(hitBy); + + } + + + } else { + dead = true; + boom(hitBy); + } + + if (!hitBy.isDead()) defaultOnImpact(hitBy); + + if (dead) setDead(); + } + + public void boom(Entity hitBy) { + explodeForce(getPos(), 30 * scale, true); + + double range = 6; + double distMultiplier = 7; // to make it fade away faster + + double damage = 50 * scale; + + if (hitBy != null) { + if (!(hitBy instanceof EntityPlayerShip)) { + hitBy.addDamage(this, damage); + } else { + ((EntityPlayerShip) hitBy).piecesAddDamageSquare(collider, damage, distMultiplier, range); + } + } + + Set ents = getScene().getEntitiesInRange(getPos(), range); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == this) continue; + if (e.isDead()) continue; + if (e instanceof EntityMine) continue; + if (e == hitBy) continue; + + double dist = e.getPos().distTo(getPos()) - e.getRadius() - getRadius(); + + dist *= distMultiplier; + + if (dist < 1) dist = 1; + + if (e.getType() == EEntity.PLAYER) { + ((EntityPlayerShip) e).piecesAddDamageSquare(collider, damage, distMultiplier, range); + } + + e.addDamage(this, damage / (dist * dist)); + e.getMotion().add_ip(getPos().vecTo(e.getPos()).norm(0.1 / (dist * dist))); + } + } + } + + @Override + public void addDamage(IDamageable source, double points) { + super.addDamage(source, points); + } + + @Override + public void onDeath() { + if (lastDamageSource.getType() == EEntity.SHOT_GOOD && rand.nextInt(4) == 0) { + if (scene.playerShip.body.shieldSystem.getLoadRatio() < 1) { + scene.add(new EntityOrbShield(getPos(), 400 * (0.6 + rand.nextDouble() * 0.7))); + } + } + } + + @Override + public EEntity getType() { + return EEntity.MINE; + } + + @Override + public void shootOnce(int gunIndex) {} + + @Override + public Vec getGunShotDir(int gunIndex) { + return getMotion(); + } + +} diff --git a/src/net/sector/entities/enemies/EntityShipBird.java b/src/net/sector/entities/enemies/EntityShipBird.java new file mode 100644 index 0000000..283c6ef --- /dev/null +++ b/src/net/sector/entities/enemies/EntityShipBird.java @@ -0,0 +1,126 @@ +package net.sector.entities.enemies; + + +import net.sector.effects.Effects; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.orbs.EntityOrbShield; +import net.sector.entities.shots.EntityLaser2; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.models.PhysModel; +import net.sector.util.Utils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Enemy ship entity + * + * @author MightyPork + */ +public class EntityShipBird extends EntityNavigable { + + private static PhysModel shipModel = Models.enemyBird; + + private static final double mMoveSpeed = 0.11; + + /** + * Enemy ship + * + * @param scale + * @param pos + */ + public EntityShipBird(double scale, Coord pos) { + super(shipModel, mMoveSpeed, scale, pos); + setDefaultDriver(); + } + + /** + * Enemy ship, scale=1 + * + * @param pos + */ + public EntityShipBird(Coord pos) { + super(shipModel, mMoveSpeed, 1, pos); + setDefaultDriver(); + } + + + private void setDefaultDriver() { + setDriver(SuperContext.basicDrivers.getDriver("bird")); + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if (!Utils.canSkipRendering(getPos())) { + Vec back = getRotateAimVector().neg(); + Coord pos = getShotPos(0, -0.45); + Effects.addEngineFire(getScene().particles, pos, back.norm(0.025), 2, 0, scale); + } + } + +// @Override +// public void setShipLevel(int level) { +// this.level = level; +// super.adjustForScale(1 + level * 0.5); +// } + + @Override + public void shootOnce(int gunIndex) { + if (Utils.canSkipRendering(getPos())) return; + + + Coord pos = getShotPos(0, 1); + + Vec motion = getGunShotDir(gunIndex); + + if (collider.pos.z > 0) { + scene.add(new EntityLaser2(pos, motion, this, 1)); + } + } + + @Override + public Vec getGunShotDir(int gunIndex) { + return getVectorToPlayer(); + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + @Override + public void onDeath() { + explodeForce(getPos(), mass, true); + + if (lastDamageSource.getType() == EEntity.SHOT_GOOD && rand.nextInt(4) == 0) { + if (scene.playerShip.body.shieldSystem.getLoadRatio() < 1) { + scene.add(new EntityOrbShield(getPos(), 500 * (0.6 + rand.nextDouble() * 0.7))); + } + } + } + + @Override + public double getHealthMax() { + return model.getHealth(scale); + } + + @Override + public void addDamage(IDamageable source, double points) { + if (!isEmpParalyzed()) { + if (source.getType() == EEntity.ENEMY) return; + if (source.getType() == EEntity.NATURAL) return; + if (source.getType() == EEntity.SHOT_BAD) return; + if (source.getType() == EEntity.MINE) return; + } + + super.addDamage(source, points); + } + +} diff --git a/src/net/sector/entities/enemies/EntityShipBurger.java b/src/net/sector/entities/enemies/EntityShipBurger.java new file mode 100644 index 0000000..8711124 --- /dev/null +++ b/src/net/sector/entities/enemies/EntityShipBurger.java @@ -0,0 +1,115 @@ +package net.sector.entities.enemies; + + +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.shots.EntityPlasma; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.models.PhysModel; +import net.sector.util.Utils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Enemy burger entity + * + * @author MightyPork + */ +public class EntityShipBurger extends EntityNavigable { + private static PhysModel burgerModel = Models.enemyBurger; + + + private static final double mMoveSpeed = 0.075; + + /** + * Enemy Burger + * + * @param scale scale (1) + * @param pos center pos + */ + public EntityShipBurger(double scale, Coord pos) { + super(burgerModel, mMoveSpeed, scale, pos); + setDefaultDriver(); + } + + /** + * Enemy Burger scale=1 + * + * @param pos center pos + */ + public EntityShipBurger(Coord pos) { + super(burgerModel, mMoveSpeed, 1, pos); + setDefaultDriver(); + } + + private void setDefaultDriver() { + setDriver(SuperContext.basicDrivers.getDriver("burger_zone")); + } + + @Override + public double getFireSensitivity() { + return 0.8; + } + +// @Override +// public void setShipLevel(int level) { +// this.level = level; +// super.adjustForScale(1 + level * 0.5); +// } + + @Override + public void shootOnce(int gunIndex) { + if (Utils.canSkipRendering(getPos())) return; + Vec dir = getGunShotDir(gunIndex); + if (dir == null) return; + double slevel = 1 + 0.3 * scale; + EntityPlasma shot = new EntityPlasma(getPos(), dir, this, gunIndex == 100 ? 3 : slevel); + shot.setColor(new RGB(1, 0.6, 0.6, 1)).setScale(0.1 + 0.05 * scale); + //shot.getMotion().add_ip(getMotion()); + scene.add(shot); + } + + @Override + public Vec getGunShotDir(int gunIndex) { + // 0 to player + // 1 in direction of rotation + // other in dir of motion + if (gunIndex == 0) return getVectorToPlayer(); + if (gunIndex == 1) return getRotateAimVector(); + if (gunIndex == 100) return getVectorToClosestAsteroid(); + + return getMotion(); + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + @Override + public void onDeath() { + explodeForce(getPos(), mass, true); + } + + @Override + public double getHealthMax() { + return model.getHealth(scale); + } + + @Override + public void addDamage(IDamageable source, double points) { + if (!isEmpParalyzed()) { + if (source.getType() == EEntity.ENEMY) return; + if (source.getType() == EEntity.NATURAL) return; + if (source.getType() == EEntity.SHOT_BAD) return; + if (source.getType() == EEntity.MINE) return; + } + super.addDamage(source, points); + } +} diff --git a/src/net/sector/entities/enemies/EntityShipBurgerKing.java b/src/net/sector/entities/enemies/EntityShipBurgerKing.java new file mode 100644 index 0000000..e604e61 --- /dev/null +++ b/src/net/sector/entities/enemies/EntityShipBurgerKing.java @@ -0,0 +1,120 @@ +package net.sector.entities.enemies; + + +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.shots.EntityPlasma; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.models.PhysModel; +import net.sector.util.Utils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Enemy burger entity + * + * @author MightyPork + */ +public class EntityShipBurgerKing extends EntityNavigable { + private static PhysModel burgerModel = Models.enemyBurgerKing; + + + private static final double mMoveSpeed = 0.08; + + /** + * Enemy Burger + * + * @param scale scale (1) + * @param pos center pos + */ + public EntityShipBurgerKing(double scale, Coord pos) { + super(burgerModel, mMoveSpeed, scale, pos); + setDefaultDriver(); + } + + /** + * Enemy Burger scale=1 + * + * @param pos center pos + */ + public EntityShipBurgerKing(Coord pos) { + super(burgerModel, mMoveSpeed, 1, pos); + setDefaultDriver(); + } + + private void setDefaultDriver() { + setDriver(SuperContext.basicDrivers.getDriver("shark")); + } + + @Override + public double getEmpSensitivity() { + return 0.05; + } + +// @Override +// public void setShipLevel(int level) { +// this.level = level; +// super.adjustForScale(1 + level * 0.5); +// } + + @Override + public void shootOnce(int gunIndex) { + if (Utils.canSkipRendering(getPos())) return; + Vec dir = getGunShotDir(gunIndex); + if (dir == null) return; + double slevel = 4 + 0.3 * scale; + EntityPlasma shot = new EntityPlasma(getPos(), dir, this, gunIndex == 100 ? 3 : slevel); + shot.setColor(new RGB(1, 0.6, 0.6, 1)).setScale(0.1 + 0.05 * scale); + //shot.getMotion().add_ip(getMotion()); + scene.add(shot); + } + + @Override + public Vec getGunShotDir(int gunIndex) { + // 0 to player + // 1 in direction of rotation + // other in dir of motion + if (gunIndex == 0) return getVectorToPlayer(15); + if (gunIndex == 1) return getRotateAimVector(); + if (gunIndex == 100) return getVectorToClosestAsteroid(); + + return getMotion(); + } + + @Override + public double getFireSensitivity() { + return 0.7; + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + @Override + public void onDeath() { + explodeForce(getPos(), mass, true); + } + + @Override + public double getHealthMax() { + return model.getHealth(scale); + } + + @Override + public void addDamage(IDamageable source, double points) { + if (!isEmpParalyzed()) { + if (source.getType() == EEntity.ENEMY) return; + if (source.getType() == EEntity.NATURAL) return; + if (source.getType() == EEntity.SHOT_BAD) return; + if (source.getType() == EEntity.MINE) return; + } + super.addDamage(source, points); + } +} diff --git a/src/net/sector/entities/enemies/EntityShipCube.java b/src/net/sector/entities/enemies/EntityShipCube.java new file mode 100644 index 0000000..43f1168 --- /dev/null +++ b/src/net/sector/entities/enemies/EntityShipCube.java @@ -0,0 +1,143 @@ +package net.sector.entities.enemies; + + +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.shots.EntityPlasma; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.util.Utils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +/** + * Enemy cube entity + * + * @author MightyPork + */ +public class EntityShipCube extends EntityNavigable { + + private int type = 0; + + private static final double mMoveSpeed = 0.07; + + /** + * Enemy Cube + * + * @param scale scale (1) + * @param pos center pos + * @param texture texture index 0-4 + */ + public EntityShipCube(double scale, Coord pos, int texture) { + super(Models.enemyCube[Calc.clampi(texture, 0, Models.enemyCube.length - 1)], mMoveSpeed, scale, pos); + type = Calc.clampi(texture, 0, Models.enemyCube.length - 1); + setDefaultDriver(); + } + + /** + * Enemy Cube scale=1 + * + * @param pos center pos + * @param texture texture index 0-4 + */ + public EntityShipCube(Coord pos, int texture) { + super(Models.enemyCube[Calc.clampi(texture, 0, Models.enemyCube.length - 1)], mMoveSpeed, 1, pos); + type = Calc.clampi(texture, 0, Models.enemyCube.length - 1); + setDefaultDriver(); + } + + + /** + * Enemy Cube scale=1 + * + * @param pos center pos + * @param texture texture index 0-4 + */ + public EntityShipCube(Coord pos) { + this(pos, 0); + } + + @Override + public void setShipVariant(int variant) { + type = Calc.clampi(variant, 0, Models.enemyCube.length - 1); + setModel(Models.enemyCube[Calc.clampi(type, 0, Models.enemyCube.length - 1)]); + } + + private void setDefaultDriver() { + setDriver(SuperContext.basicDrivers.getDriver("cube_snake")); + } + +// @Override +// public void setShipLevel(int level) { +// this.level = level; +// super.adjustForScale(1 + level * 0.5); +// } + + @Override + public void shootOnce(int gunIndex) { + if (Utils.canSkipRendering(getPos())) return; + + Coord pos; + Vec dir = getGunShotDir(gunIndex); + if (dir == null) return; + + pos = getPos(); + + + EntityPlasma shot = new EntityPlasma(pos, dir, this, gunIndex == 100 ? 3 : 1 + 0.3 * scale); + shot.setColor(colors[type]).setScale(0.1 + 0.05 * scale); + scene.add(shot); + } + + RGB[] colors = { new RGB(0.0, 1.0, 0.0), new RGB(1.0, 0.0, 0.0), new RGB(0.2, 0.5, 1.0), new RGB(0.6, 0.0, 1.0), new RGB(1.0, 1.0, 0.0), }; + + + @Override + public Vec getGunShotDir(int gunIndex) { + if (gunIndex == 0) return getVectorToPlayer(); + if (gunIndex == 100) return getVectorToClosestAsteroid(); + return getRotateAimVector(); + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + @Override + public void onDeath() { + explodeForce(getPos(), mass, true); + } + + @Override + public double getHealthMax() { + return model.getHealth(scale); + } + + @Override + public void addDamage(IDamageable source, double points) { + if (!isEmpParalyzed()) { + if (source.getType() == EEntity.ENEMY) return; + if (source.getType() == EEntity.NATURAL) return; + if (source.getType() == EEntity.SHOT_BAD) return; + if (source.getType() == EEntity.MINE) return; + } + super.addDamage(source, points); + } + + @Override + public double getEmpSensitivity() { + return 0.7; + } + + @Override + public double getFireSensitivity() { + return 0.6; + } +} diff --git a/src/net/sector/entities/enemies/EntityShipFalcon.java b/src/net/sector/entities/enemies/EntityShipFalcon.java new file mode 100644 index 0000000..1a8e0ed --- /dev/null +++ b/src/net/sector/entities/enemies/EntityShipFalcon.java @@ -0,0 +1,125 @@ +package net.sector.entities.enemies; + + +import net.sector.effects.Effects; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.shots.EntityLaser; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.models.PhysModel; +import net.sector.util.Utils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Enemy ship entity + * + * @author MightyPork + */ +public class EntityShipFalcon extends EntityNavigable { + + private static PhysModel shipModel = Models.enemyFalcon; + + private static final double mMoveSpeed = 0.15; + + /** + * Enemy ship + * + * @param scale + * @param pos + */ + public EntityShipFalcon(double scale, Coord pos) { + super(shipModel, mMoveSpeed, scale, pos); + setDefaultDriver(); + } + + @Override + public double getEmpSensitivity() { + return 0.3; + } + + @Override + public double getFireSensitivity() { + return 0.8; + } + + /** + * Enemy ship, scale=1 + * + * @param pos + */ + public EntityShipFalcon(Coord pos) { + super(shipModel, mMoveSpeed, 1, pos); + setDefaultDriver(); + } + + @Override + public void addDamage(IDamageable source, double points) { + if (!isEmpParalyzed()) { + if (source.getType() == EEntity.ENEMY) return; + if (source.getType() == EEntity.NATURAL) return; + if (source.getType() == EEntity.SHOT_BAD) return; + if (source.getType() == EEntity.MINE) return; + } + super.addDamage(source, points); + } + + + private void setDefaultDriver() { + setDriver(SuperContext.basicDrivers.getDriver("falcon")); + } + +// @Override +// public void setShipLevel(int level) { +// this.level = level; +// super.adjustForScale(1 + level * 0.5); +// } + + @Override + public void shootOnce(int gunIndex) { + if (Utils.canSkipRendering(getPos())) return; + + Coord left = getShotPos(-2, 2); + Coord right = getShotPos(2, 2); + + Vec motion = getGunShotDir(gunIndex); + RGB red = RGB.PURPLE; + + if (collider.pos.z > 0) { + scene.add(new EntityLaser(left, motion, this, red, 5)); + scene.add(new EntityLaser(right, motion, this, red, 5)); + } + } + + @Override + public Vec getGunShotDir(int gunIndex) { + return getRotateAimVector(); + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + @Override + public void onDeath() { + explodeForce(getPos(), mass*2, true); + } + + @Override + public double getHealthMax() { + return model.getHealth(scale); + } + + @Override + public void onUpdate() { + super.onUpdate(); + } + +} diff --git a/src/net/sector/entities/enemies/EntityShipFighter.java b/src/net/sector/entities/enemies/EntityShipFighter.java new file mode 100644 index 0000000..c2dc38a --- /dev/null +++ b/src/net/sector/entities/enemies/EntityShipFighter.java @@ -0,0 +1,124 @@ +package net.sector.entities.enemies; + + +import net.sector.effects.Effects; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.shots.EntityLaser; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.models.PhysModel; +import net.sector.util.Utils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Enemy ship entity + * + * @author MightyPork + */ +public class EntityShipFighter extends EntityNavigable { + + private static PhysModel shipModel = Models.enemyFighter; + private int level = 1; + + private static final double mMoveSpeed = 0.1; + + /** + * Enemy ship + * + * @param scale + * @param pos + */ + public EntityShipFighter(double scale, Coord pos) { + super(shipModel, mMoveSpeed, scale, pos); + setDefaultDriver(); + } + + /** + * Enemy ship, scale=1 + * + * @param pos + */ + public EntityShipFighter(Coord pos) { + super(shipModel, mMoveSpeed, 1, pos); + setDefaultDriver(); + } + + + private void setDefaultDriver() { + setDriver(SuperContext.basicDrivers.getDriver("fighter")); + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if (!Utils.canSkipRendering(getPos())) { + Vec back = getRotateAimVector().neg(); + Coord pos = getShotPos(-0.23, -0.55); + Effects.addEngineFire(getScene().particles, pos, back.norm(0.025), 2, 0, scale); + pos = getShotPos(0.23, -0.55); + Effects.addEngineFire(getScene().particles, pos, back.norm(0.025), 2, 0, scale); + } + } + +// @Override +// public void setShipLevel(int level) { +// this.level = level; +// super.adjustForScale(1 + level * 0.5); +// } + + @Override + public void shootOnce(int gunIndex) { + if (Utils.canSkipRendering(getPos())) return; + + Coord left = getShotPos(-0.3, 2); + Coord right = getShotPos(0.3, 2); + + Vec motion = getGunShotDir(gunIndex); + RGB red = RGB.RED; + + if (collider.pos.z > 0) { + scene.add(new EntityLaser(left, motion, this, red, level)); + scene.add(new EntityLaser(right, motion, this, red, level)); + } + } + + @Override + public Vec getGunShotDir(int gunIndex) { + return getRotateAimVector(); + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + @Override + public void onDeath() { + explodeForce(getPos(), mass, true); + } + + @Override + public double getHealthMax() { + return model.getHealth(scale); + } + + @Override + public void addDamage(IDamageable source, double points) { + if (!isEmpParalyzed()) { + if (source.getType() == EEntity.ENEMY) return; + if (source.getType() == EEntity.NATURAL) return; + if (source.getType() == EEntity.SHOT_BAD) return; + if (source.getType() == EEntity.MINE) return; + } + super.addDamage(source, points); + } + +} diff --git a/src/net/sector/entities/enemies/EntityShipShark.java b/src/net/sector/entities/enemies/EntityShipShark.java new file mode 100644 index 0000000..21b9173 --- /dev/null +++ b/src/net/sector/entities/enemies/EntityShipShark.java @@ -0,0 +1,126 @@ +package net.sector.entities.enemies; + + +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.shots.EntityLaser2; +import net.sector.entities.shots.EntityPlasma; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.models.PhysModel; +import net.sector.util.Utils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Enemy ship entity + * + * @author MightyPork + */ +public class EntityShipShark extends EntityNavigable { + + private static PhysModel shipModel = Models.enemyShark; + + private static final double mMoveSpeed = 0.14; + + /** + * Enemy ship + * + * @param scale + * @param pos + */ + public EntityShipShark(double scale, Coord pos) { + super(shipModel, mMoveSpeed, scale, pos); + setDefaultDriver(); + } + + @Override + public double getEmpSensitivity() { + return 0.1; + } + + @Override + public double getFireSensitivity() { + return 0.7; + } + + /** + * Enemy ship, scale=1 + * + * @param pos + */ + public EntityShipShark(Coord pos) { + super(shipModel, mMoveSpeed, 1, pos); + setDefaultDriver(); + } + + @Override + public void addDamage(IDamageable source, double points) { + if (!isEmpParalyzed()) { + if (source.getType() == EEntity.ENEMY) return; + if (source.getType() == EEntity.NATURAL) return; + if (source.getType() == EEntity.SHOT_BAD) return; + if (source.getType() == EEntity.MINE) return; + } + super.addDamage(source, points); + } + + + private void setDefaultDriver() { + setDriver(SuperContext.basicDrivers.getDriver("shark")); + } + +// @Override +// public void setShipLevel(int level) { +// this.level = level; +// super.adjustForScale(1 + level * 0.5); +// } + + @Override + public void shootOnce(int gunIndex) { + if (Utils.canSkipRendering(getPos())) return; + + Coord left = getShotPos(-2, 1); + Coord right = getShotPos(2, 1); + + Vec motion = getGunShotDir(gunIndex); + + if (collider.pos.z > 0) { + if (gunIndex == 0) { + scene.add(new EntityPlasma(left, motion, this, 3 + 0.3 * scale).setGlobalMovement(false)); + scene.add(new EntityPlasma(right, motion, this, 3 + 0.3 * scale).setGlobalMovement(false)); + } + if (gunIndex == 1) { + scene.add(new EntityLaser2(left, motion, this, 3).setGlobalMovement(false)); + scene.add(new EntityLaser2(right, motion, this, 3).setGlobalMovement(false)); + } + } + } + + @Override + public Vec getGunShotDir(int gunIndex) { + if (gunIndex == 0) return getRotateAimVector(15); + if (gunIndex == 1) return getRotateAimVector(10); + return getMotion(); + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + @Override + public void onDeath() { + explodeForce(getPos(), mass * 6, true); + } + + @Override + public double getHealthMax() { + return model.getHealth(scale); + } + +} diff --git a/src/net/sector/entities/natural/EntityAsteroid.java b/src/net/sector/entities/natural/EntityAsteroid.java new file mode 100644 index 0000000..31e6134 --- /dev/null +++ b/src/net/sector/entities/natural/EntityAsteroid.java @@ -0,0 +1,184 @@ +package net.sector.entities.natural; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.Constants; +import net.sector.collision.ColliderSphere; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.orbs.EntityOrbShield; +import net.sector.models.Models; +import net.sector.models.PhysModel; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + + +/** + * Asteroid entity + * + * @author MightyPork + */ +public class EntityAsteroid extends EntityNatural { + + + private int texture = 0; + /** Rotation speed */ + protected double rotSpeed = 0; + + private PhysModel rock; + + private double renderScale = 0; + private double scale = 1; + private double healthMax; + + /** + * Asteroid entity + * + * @param scale asteroid scale + * @param pos asteroid center position + * @param motion asteroid motion + * @param texture asteroid texture index + */ + public EntityAsteroid(double scale, Coord pos, Vec motion, int texture) { + + this.texture = texture; + this.rotDir.setTo(-1 + rand.nextDouble() * 2, -1 + rand.nextDouble() * 2, -1 + rand.nextDouble() * 2); + this.rotAngle.set(rand.nextDouble() * 360); + this.rotSpeed = -5 + rand.nextDouble() * 10; + + this.collidePriority = 0; + + this.scale = scale; + rock = Models.pickAsteroidOfType(texture); + + this.renderScale = rock.renderScale * scale; + + this.healthMax = this.health = rock.health * scale; + this.lifetime = -1; + this.mass = rock.getMass(scale); + collider = new ColliderSphere(pos, rock.colliderRadius * scale); + this.motion.setTo(motion); + this.scoreValue = (int) Math.round(rock.getScore(scale)); + + this.MAX_SPEED = 0.2 * (0.3 / mass); + + setGlobalMovement(true); + } + + @Override + public double getHealthMax() { + return healthMax; + } + + //private static Object3D model = new Object3D("res/models/asteroid03.obj", true); + /** + * Asteroid entity + * + * @param scale asteroid scale + * @param pos asteroid position + * @param motion asteroid motion + */ + public EntityAsteroid(double scale, Coord pos, Vec motion) { + this(scale, pos, motion, rand.nextInt(Models.rockTypes.length)); + } + + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + this.rotSpeed = Calc.clampd(this.rotSpeed + rand.nextGaussian(), -5, 5); + + if (hitBy instanceof EntityAsteroid) { + ((EntityAsteroid) hitBy).rotSpeed = Calc.clampd(((EntityAsteroid) hitBy).rotSpeed + rand.nextGaussian(), -5, 5); + } + } + + @Override + public void onUpdate() { + rotAngle.add(rotSpeed * Constants.SPEED_MUL); + } + + @Override + public void render(double delta) { + glPushMatrix(); + + glLoadIdentity(); + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glRotated(rotAngle.delta(delta), rotDir.x, rotDir.y, rotDir.z); + glScaled(renderScale, renderScale, renderScale); + rock.model.render(); + + glPopMatrix(); + + } + + @Override + public boolean belongsToZone(double zFrom, double zTo) { + return Calc.inRange(collider.pos.z, zFrom - collider.radius, zTo + collider.radius); + } + + @Override + public void onDeath() { + explodeForce(getPos(), getRadius() * 14, true); + + //explodeForce(getPos(), mass / 2, true); + + if (scale > 0.4) { + int pieces = 2 + rand.nextInt(7); + + double vol = Calc.sphereGetVolume(scale) * 0.4; + + double approxPerPart = vol / pieces; + + double[] volumes = new double[pieces]; + + for (int i = 0; i < pieces; i++) { + double v = 0.05 + ((rand.nextDouble() + rand.nextDouble()) / 2) * approxPerPart; + if (v > vol) v = vol; + vol -= v; + if (v < 0) v = Calc.sphereGetVolume(0.05 + rand.nextDouble() * 0.1); + volumes[i] = v; + } + + + for (int i = 0; i < pieces; i++) { + double newScale = Calc.sphereGetRadius(volumes[i]); + + if (newScale < 0.05) newScale = 0.05; + + Coord apos = this.getPos(); + + double r = getRadius() * 0.6; + + apos.add_ip(-r + rand.nextDouble() * (r) * 2, 0, -r + rand.nextDouble() * (r) * 2); + + Vec amotion = getPos().vecTo(apos).norm(0.05 + rand.nextDouble() * 0.1); + Entity e; + scene.add(e = new EntityAsteroid(newScale, apos, amotion, texture)); + e.health *= 0.1; + e.scoreValue *= 0.6; + e.healthMul = healthMul * 0.8; + + // tiny rocks will eventually disappear. + if (newScale < 0.15) e.lifetime = (int) (Constants.FPS_UPDATE * (0.3 + rand.nextDouble() * 5)); + } + } + + if (lastDamageSource.getType() == EEntity.SHOT_GOOD && rand.nextInt(3) == 0 && scale > 0.5) { + if (scene.playerShip.body.shieldSystem.getLoadRatio() < 1) { + scene.add(new EntityOrbShield(getPos(), scale * 600 * (0.6 + rand.nextDouble() * 0.7))); + } + } + + } + + @Override + public EEntity getType() { + return EEntity.NATURAL; + } + +} diff --git a/src/net/sector/entities/natural/EntityNatural.java b/src/net/sector/entities/natural/EntityNatural.java new file mode 100644 index 0000000..8613aee --- /dev/null +++ b/src/net/sector/entities/natural/EntityNatural.java @@ -0,0 +1,45 @@ +package net.sector.entities.natural; + + +import net.sector.entities.EEntity; +import net.sector.entities.Entity; + + +public abstract class EntityNatural extends Entity { + + @Override + public EEntity getType() { + return EEntity.NATURAL; + } + + @Override + public abstract void onImpact(Entity hitBy); + + @Override + public double getEmpSensitivity() { + return 0; + } + + @Override + public double getFireFlammability() { + return 0.3; + } + + @Override + public double getFireSensitivity() { + return 0.08; + } + + @Override + public abstract void onUpdate(); + + @Override + public abstract void onDeath(); + + @Override + public abstract void render(double delta); + + @Override + public abstract double getHealthMax(); + +} diff --git a/src/net/sector/entities/orbs/EntityOrbArtifact.java b/src/net/sector/entities/orbs/EntityOrbArtifact.java new file mode 100644 index 0000000..e1d75cf --- /dev/null +++ b/src/net/sector/entities/orbs/EntityOrbArtifact.java @@ -0,0 +1,191 @@ +package net.sector.entities.orbs; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.Set; + +import net.sector.Constants; +import net.sector.collision.ColliderSphereFake; +import net.sector.effects.Effects; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.player.EntityPlayerShip; +import net.sector.level.SuperContext; +import net.sector.level.ship.modules.pieces.Piece; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; +import net.sector.util.Log; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +public class EntityOrbArtifact extends EntityNavigable { + + private double scale = 0.25; +// protected double rotSpeed = 2; + + private static RenderModel model = Models.orbArtifact; + private double scaleRender = 0.5; + + private Coord target; + + private int discoveryPoints; + + + public EntityOrbArtifact(Coord pos, int artifacts) { + super(pos); + this.discoveryPoints = artifacts; + + setDriver(SuperContext.basicDrivers.getDriver("powerup_artifact")); + + fullMoveSpeed = 0.06; + + this.target = new Coord(-1 + rand.nextDouble() * 2, 0, -1); + + this.scoreValue = 0; + this.health = 1000; + this.mass = 0.6; + this.collidePriority = 2003; + + this.lifetime = Constants.FPS_UPDATE * 5000; + this.motion.setTo(0, 0, -0.003); + + this.rotDir.setTo(-1 + rand.nextDouble() * 2, -1 + rand.nextDouble() * 2, -1 + rand.nextDouble() * 2); + this.rotAngle.set(rand.nextDouble() * 360); + //this.rotSpeed = -3 + rand.nextDouble() * 6; + + this.collider = new ColliderSphereFake(pos, scale); + } + + @Override + public void onUpdate() { + super.onUpdate(); + + motion.norm_ip(fullMoveSpeed); + addEffect(); + + + Set ents = scene.getEntitiesInRange(getPos(), 1); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == scene.playerShip) { + EntityPlayerShip sh = (EntityPlayerShip) e; + Log.f3("Adding artifact to player."); + if (discoveryPoints > 0) { + sh.cursor.addArtifact(discoveryPoints); + discoveryPoints = 0; + } + + + sh.body.energySystem.fill(); + sh.body.shieldSystem.fill(); + + for (Piece p : sh.body.allPieces) { + if (!p.isDead) { + p.addHealth(p.getHealthMax() / 3); + } + } + + + Sounds.powerup2.playEffect(1f, 0.5f, false); + Effects.addOrbBurst(scene.particles, getPos(), getMotion(), scaleRender * 1.5, 200, 1, false, true); + setDead(); + return; + } + } + } + } + + + @Override + public void onAddedToScene() { + Sounds.appear.playEffect(1f, 0.2f, false); + } + + public void addEffect() { + Effects.addOrbBurst(scene.particles, getPos(), getMotion(), scaleRender * 1.5, 20, 1, false, false); + } + + @Override + public void render(double delta) { + glLoadIdentity(); + + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glRotated(rotAngle.delta(delta), rotDir.x, rotDir.y, rotDir.z); + glScaled(scaleRender, scaleRender, scaleRender); + + model.render(); + TextureManager.unbind(); + } + + @Override + public void addDamage(IDamageable source, double points) { + // dont add damage + } + + @Override + public EEntity getType() { + return EEntity.BONUS; + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + + @Override + public void onDeath() { + System.out.println("Artifact died. That sucks."); + } + + @Override + public boolean belongsToZone(double zFrom, double zTo) { + return Calc.inRange(collider.pos.z, zFrom - 2 * collider.radius, zTo + 2 * collider.radius); + } + + @Override + public double getEmpSensitivity() { + return 0; + } + + @Override + public double getFireFlammability() { + return 0; + } + + @Override + public double getFireSensitivity() { + return 0; + } + + @Override + public double getHealthMax() { + return 10; + } + + @Override + public void setShipLevel(int level) {} + + @Override + public void shootOnce(int gunIndex) {} + + @Override + public Vec getGunShotDir(int gunIndex) { + return getMotion(); + } + + @Override + public double getHealthPercent() { + return 100; + } + +} diff --git a/src/net/sector/entities/orbs/EntityOrbShield.java b/src/net/sector/entities/orbs/EntityOrbShield.java new file mode 100644 index 0000000..0287cef --- /dev/null +++ b/src/net/sector/entities/orbs/EntityOrbShield.java @@ -0,0 +1,179 @@ +package net.sector.entities.orbs; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.Set; + +import net.sector.Constants; +import net.sector.collision.ColliderSphereFake; +import net.sector.effects.Effects; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.IDamageable; +import net.sector.entities.player.EntityPlayerShip; +import net.sector.level.SuperContext; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +public class EntityOrbShield extends EntityNavigable { + + private double scale = 0.25; +// protected double rotSpeed = 2; + + private static RenderModel model = Models.orbShield; + private double scaleRender = 0.25; + + private Coord target; + + private double shieldPoints = 100; + + + public EntityOrbShield(Coord pos, double shieldPoints) { + super(pos); + + shieldPoints = Calc.clampd(shieldPoints, 0, 650); + + setDriver(SuperContext.basicDrivers.getDriver("powerup_shield")); + + fullMoveSpeed = 0.06; + + this.target = new Coord(-1 + rand.nextDouble() * 2, 0, -1); + + this.scaleRender *= (shieldPoints / 700); + + this.scoreValue = 0; + this.health = 1000; + this.mass = 0.6; + this.collidePriority = 2002; + + this.lifetime = Constants.FPS_UPDATE * 500; + this.motion.setTo(0, 0, -0.003); + + this.rotDir.setTo(-1 + rand.nextDouble() * 2, -1 + rand.nextDouble() * 2, -1 + rand.nextDouble() * 2); + this.rotAngle.set(rand.nextDouble() * 360); + //this.rotSpeed = -3 + rand.nextDouble() * 6; + + this.collider = new ColliderSphereFake(pos, scale); + + this.shieldPoints = shieldPoints; + } + + @Override + public void onUpdate() { + super.onUpdate(); + + motion.norm_ip(fullMoveSpeed); + addEffect(); + + + Set ents = scene.getEntitiesInRange(getPos(), 1); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == scene.playerShip) { + EntityPlayerShip sh = (EntityPlayerShip) e; + sh.body.shieldSystem.addShieldPoints(shieldPoints); + Sounds.powerup1.playEffect(1f, 0.4f, false); + Effects.addOrbBurst(scene.particles, getPos(), getMotion(), 0.4, 60, 0, false, true); + setDead(); + return; + } + } + } + } + + + @Override + public void onAddedToScene() {} + + public void addEffect() { + Effects.addOrbBurst(scene.particles, getPos(), getMotion(), scaleRender, 4, 0, false, false); + } + + @Override + public void render(double delta) { + glLoadIdentity(); + + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glRotated(rotAngle.delta(delta), rotDir.x, rotDir.y, rotDir.z); + glScaled(scaleRender, scaleRender, scaleRender); + + model.render(); + TextureManager.unbind(); + } + + @Override + public void addDamage(IDamageable source, double points) {} + + @Override + public EEntity getType() { + return EEntity.BONUS; + } + + @Override + public void onImpact(Entity hitBy) { + defaultOnImpact(hitBy); + } + + + @Override + public void onDeath() { + System.out.println("Bonus died."); + } + + @Override + public boolean belongsToZone(double zFrom, double zTo) { + return Calc.inRange(collider.pos.z, zFrom - 2 * collider.radius, zTo + 2 * collider.radius); + } + + @Override + public double getEmpSensitivity() { + return 0; + } + + @Override + public double getFireFlammability() { + return 0; + } + + @Override + public double getFireSensitivity() { + return 0; + } + + @Override + public double getHealthMax() { + return 10; + } + + @Override + public void setShipLevel(int level) {} + + @Override + public void shootOnce(int gunIndex) {} + + @Override + public Vec getGunShotDir(int gunIndex) { + return getMotion(); + } + + @Override + public double getHealthPercent() { + return 100; + } + + @Override + public boolean hasGlobalMovement() { + return true; + } + +} diff --git a/src/net/sector/entities/player/EntityPlayerShip.java b/src/net/sector/entities/player/EntityPlayerShip.java new file mode 100644 index 0000000..9ef1301 --- /dev/null +++ b/src/net/sector/entities/player/EntityPlayerShip.java @@ -0,0 +1,330 @@ +package net.sector.entities.player; + + +import java.util.ArrayList; + +import net.sector.Constants; +import net.sector.collision.Collider; +import net.sector.collision.ColliderPlayerShip; +import net.sector.collision.ColliderSphere; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.IDamageable; +import net.sector.entities.IPhysEntity; +import net.sector.entities.IScoreCounter; +import net.sector.input.IInputHandler; +import net.sector.level.GameCursor; +import net.sector.level.ship.ShipBundle; +import net.sector.level.ship.modules.ShipBody; +import net.sector.level.ship.modules.pieces.Piece; +import net.sector.sounds.Sounds; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +/** + * Player ship entity + * + * @author MightyPork + */ +public class EntityPlayerShip extends Entity implements IScoreCounter, IInputHandler { + + public static final int MAXROT = 85; + + + /** Ship body piece store + shield + energy system */ + public ShipBody body; + + public GameCursor cursor; + + /** Collider as player ship collider */ + private ColliderPlayerShip colliderBody; + + /** Flag indicating that ship should rotate back to Z- direction gradually. */ + public boolean rotationCenterRequested = false; + + /** Degrees player wants to add to ship rotation - added gradually. */ + public int angleInc = 0; + + + /** + * Create ship bundle from current state (damaged ship body, new scores + * etc.) + * + * @return new context + */ + public ShipBundle createNewShipBundle() { + return new ShipBundle(body.toTable(), body.shieldSystem.level, body.energySystem.level); + } + + /** + * Player ship
+ * + * @param pos center in 3D space + * @param cursor game cursor + */ + public EntityPlayerShip(Coord pos, GameCursor cursor) { + + this.cursor = cursor; + + this.collidePriority = -1; + + int X = cursor.shipBundle.ship[0].length, Z = cursor.shipBundle.ship.length; + + collider = colliderBody = new ColliderPlayerShip(pos, X, Z); + body = colliderBody.body; + + + body.setCenterCoord(X / 2, Z / 2); + + double massSum = 0; + + for (int z = 0; z < Z; z++) { + for (int x = 0; x < X; x++) { + if (cursor.shipBundle.ship[z][x] != null) { + Piece p; + body.setPiece(x, z, p = cursor.shipBundle.ship[z][x].toPiece()); + massSum += p.getPieceMass(); + } + } + } + this.mass = 5 * massSum; + + body.energyLevel = cursor.shipBundle.energyLevel; + body.shieldLevel = cursor.shipBundle.shieldLevel; + + setHealth(100000); + + this.motion.setTo(0, 0, 0); + + this.lifetime = -1; + this.MAX_SPEED = 0.3; + this.rotDir.setTo(0, 1, 0); + setGlobalMovement(false); + + } + + @Override + public ColliderSphere getColliderFor(Collider hitBy) { + if (colliderBody.collidesWith(hitBy)) { + if (colliderBody.lastCollided == null) { + if (colliderBody.collidingShield) { + return colliderBody; + } + } else { + return colliderBody.lastCollided.get(0).pieceCollider; + } + } + + return null; + } + + @Override + public void onAddedToScene() { + colliderBody.onAddedToScene(this); + } + + /** + * Add damage to pieces, weakening with square of distance + * + * @param source source of damage + * @param damage damage at full strength + * @param distMultiplier distance multiplier + * @param range max distance of destruction + */ + public void piecesAddDamageSquare(ColliderSphere source, double damage, double distMultiplier, double range) { + if (body.shieldSystem.forceFieldActive) damage *= 0.3; + for (Piece p : body.allPieces) { + if (p.isDead) continue; + + double dist = p.getPieceCollider().getPos().distTo(source.getPos()); + dist -= source.radius; + dist -= p.getPieceCollider().radius; + + if (dist < 0) dist = 0; + + if (dist > range) continue; + + dist *= distMultiplier; + + if (dist < 1) dist = 1; + + p.addDamage((damage) / (dist * dist)); + } + body.checkIntegrity(); + + if (body.isDead) { + setDead(); + onDeath(); + } + } + + @Override + public void addDamage(IDamageable source, double points) { + if (Double.isNaN(points)) return; + ArrayList p = colliderBody.lastCollided; + if (p != null) { + for (Piece pp : p) { + pp.addDamage(points / p.size()); + } + + if (body.isDead) { + setDead(); + onDeath(); + } + + } else if (colliderBody.collidingShield) { + if (source != this && (!source.isDead() || source.getType() == EEntity.SHOT_BAD)) { + Sounds.shield_hit.playEffect(0.6f + rand.nextFloat() * 0.6f, 0.12f, false, getPos()); + + double energy = body.shieldSystem.shieldEnergy; + + double neededToKill = source.getHealth(); + + double killCost = neededToKill * 100; // - body.shieldSystem.level * 10); + + if (energy >= killCost) { + body.shieldSystem.shieldEnergy -= killCost; + source.addDamage(this, neededToKill); + } else { + double consumed = energy; + + source.addDamage(this, neededToKill * (consumed / killCost) * 0.5); + } + + IPhysEntity hit = (IPhysEntity) source; + + Vec move = getPos().vecTo(hit.getPos()); + + Coord midpoint = getPos().add(move.norm(collider.radius)); + + if (!hit.isDead()) { + explodeForce(midpoint, 0.02, false); + } + } + } + + if (body.isDead) { + setDead(); + onDeath(); + } + } + + @Override + public void onImpact(Entity hitBy) {} + + @Override + public void onUpdate() { + body.update(); + + if (angleInc != 0) { + double inc = Math.min(1, Math.abs(angleInc)) * Constants.SPEED_MUL; + if (Math.abs(rotAngle.d) > MAXROT) { + rotAngle.d = Calc.clampd(rotAngle.d, -MAXROT, MAXROT); + angleInc = 0; + rotAngle.pushLast(); + } else { + rotAngle.d += Calc.sgn(angleInc) * inc; + angleInc -= Calc.sgn(angleInc) * inc; + } + } + + if (rotationCenterRequested) { + if (Math.abs(rotAngle.d) > 2) { + rotAngle.d += Calc.sgn(0 - rotAngle.d) * 1 * Constants.SPEED_MUL; + } else { + rotAngle.d = 0; + rotationCenterRequested = false; + } + } + + + } + + + @Override + public void render(double delta) { + body.render(delta); + } + + @Override + public boolean belongsToZone(double zFrom, double zTo) { + return Calc.inRange(collider.pos.z, zFrom - collider.radius, zTo + collider.radius); + } + + @Override + public void onDeath() { + explodeForce(getPos(), 20, true); + } + + @Override + public EEntity getType() { + return EEntity.PLAYER; + } + + @Override + public void addScore(int points) { + cursor.addScore(points); + } + + @Override + public void onMouseMove(Coord pos, Vec move, int wheelDelta) { + body.onMouseMove(pos, move, wheelDelta); + } + + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + body.onMouseButton(button, down, wheelDelta, pos, deltaPos); + } + + @Override + public void onKey(int key, char c, boolean down) { + body.onKey(key, c, down); + } + + @Override + public void handleStaticInputs() { + body.handleStaticInputs(); + } + + /** + * Get acceleration for GUI, based on number of engines and their level. + * + * @return acceleration + */ + public double getAcceleration() { + return 0.05 * body.countEnginesSq() / (mass / 16); + } + + /** + * Get deceleration for GUI, based on number of engines and their level. + * + * @return deceleration + */ + public double getDecelerate() { + return 0.015 * (1 + body.countEnginesSq() / (mass / 16)); + } + + @Override + public double getEmpSensitivity() { + return 0; + } + + @Override + public double getFireFlammability() { + return 0; + } + + @Override + public double getFireSensitivity() { + return 0; + } + + @Override + public double getHealthMax() { + return 1; + } + +} diff --git a/src/net/sector/entities/shots/EntityEMP.java b/src/net/sector/entities/shots/EntityEMP.java new file mode 100644 index 0000000..919c7d5 --- /dev/null +++ b/src/net/sector/entities/shots/EntityEMP.java @@ -0,0 +1,182 @@ +package net.sector.entities.shots; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.Set; + +import net.sector.Constants; +import net.sector.collision.ColliderSphere; +import net.sector.effects.Effects; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +public class EntityEMP extends EntityShotBase { + + protected RGB color = new RGB(0.75, 0.5, 1); + + private static final double SPEED = 0.3; + + protected static int renderlist = -1; + + private double scale = 0.25; + + private Entity target; + + private Vec origDirection = null; + + private int level; + + static { + renderlist = glGenLists(1); + + glNewList(renderlist, GL_COMPILE); + + glPushAttrib(GL_ENABLE_BIT); + + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_COLOR_MATERIAL); + + glEnable(GL_TEXTURE_2D); + //glDisable(GL_FOG); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + TextureManager.bind("particles_blend"); + + Coord texCoord = new Coord(0, 1); + + double left = (texCoord.x) * 0.125; + double top = (texCoord.y) * 0.125; + double right = (texCoord.x + 1) * 0.125; + double bottom = (texCoord.y + 1) * 0.125; + + glBegin(GL_QUADS); + double sh = 1; + glTexCoord2d(left, top); + glVertex3d(-sh, +sh, 0); + glTexCoord2d(right, top); + glVertex3d(+sh, +sh, 0); + glTexCoord2d(right, bottom); + glVertex3d(+sh, -sh, 0); + glTexCoord2d(left, bottom); + glVertex3d(-sh, -sh, 0); + glEnd(); + + TextureManager.unbind(); + + + glDepthMask(true); + + glPopAttrib(); + + glEndList(); + + } + + public EntityEMP(Coord pos, Vec speed, Entity origin, int level) { + super(pos, speed, origin, SPEED); + + this.shotDamage = 0; + this.collidePriority = 1004; + this.mass = 0.002; + this.scoreValue = 0; + this.health = 0.17 * level * level; + this.lifetime = Constants.FPS_UPDATE * 5; + this.scale = Calc.clampd(0.06 * level, 0.1, 0.4); + this.collider = new ColliderSphere(pos, scale); + + origDirection = speed.copy(); + + this.level = level; + } + + private static long lastSoundTime = 0; + + @Override + public void onAddedToScene() { + if (System.currentTimeMillis() - lastSoundTime > 50) { + Sounds.shot_emp.playEffect(1f, 1.5f, false, getPos().setY(Constants.LISTENER_POS.y - 3)); + lastSoundTime = System.currentTimeMillis(); + } + } + + public EntityEMP setColor(RGB clr) { + color = clr; + return this; + } + + + @Override + public void onUpdate() { + + motion.add_ip(origDirection.norm(0.05)); + motion.norm_ip(shotSpeed); + + // magnetic + Set ents = scene.getEntitiesInRange(getPos(), 6); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == this) continue; + if (e.getType() == EEntity.ENEMY) { + double dist = e.getPos().distTo(getPos()) - e.getRadius(); + if (dist < 0) dist = 0.00001; + double move = 0.4 / dist; + move = Calc.clampd(move, 0, 0.2); + motion.add_ip(((Vec) getPos().vecTo(e.getPos()).setY(0)).norm(move)); + motion.norm_ip(shotSpeed); + } + } + } + + + motion.norm_ip(shotSpeed); + } + + @Override + public void render(double delta) { + glPushMatrix(); + glLoadIdentity(); + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glScaled(scale, scale, scale); + + RenderUtils.setColor(color); + glCallList(renderlist); + glPopMatrix(); + } + + @Override + public void onDeath() { + onHitTarget(null); + } + + + @Override + public void onHitTarget(Entity target) { + Effects.addEMPExplosion(scene.particles, getPos(), getMotion(), Calc.clampi(4 * level, 4, 12), hasGlobalMovement(), true); + + + Set ents = scene.getEntitiesInRange(getPos(), 3 + 2 * level); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == this) continue; + if (e.getType() == EEntity.ENEMY) { + e.addEmp(level * 250); + + Effects.addEMPExplosion(scene.particles, e.getPos(), e.getMotion(), Calc.clampi(4 * level, 4, 12), e.hasGlobalMovement(), true); + } + } + } + } +} \ No newline at end of file diff --git a/src/net/sector/entities/shots/EntityFireball.java b/src/net/sector/entities/shots/EntityFireball.java new file mode 100644 index 0000000..164f093 --- /dev/null +++ b/src/net/sector/entities/shots/EntityFireball.java @@ -0,0 +1,82 @@ +package net.sector.entities.shots; + + +import java.util.Set; + +import net.sector.Constants; +import net.sector.collision.ColliderSphere; +import net.sector.effects.Effects; +import net.sector.entities.Entity; +import net.sector.sounds.Sounds; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.PolarDeg; + + +public class EntityFireball extends EntityShotBase { + + private static final double SPEED = 0.35; + + private int level = 1; + + public EntityFireball(Coord pos, Vec speed, Entity origin, int techLevel) { + super(pos, speed, origin, SPEED); + this.collidePriority = 1001; + this.mass = 0.3; + this.lifetime = Constants.FPS_UPDATE * 7; + this.collider = new ColliderSphere(pos, 0.30); + this.health = 0.4 * techLevel * techLevel; + + this.shotDamage = 0.1 * Math.pow(techLevel, 1.2); + this.level = techLevel; + } + + @Override + public void onUpdate() { + PolarDeg polar = PolarDeg.fromCoordXZ(motion); + polar.angle += -0.2 + rand.nextDouble() * 0.4; + motion.setTo(polar.toCoordXZ()); + motion.norm_ip(shotSpeed); + addEffect(); + } + + private static long lastSoundTime = 0; + private static long lastExplTime = 0; + + @Override + public void onAddedToScene() { + if (System.currentTimeMillis() - lastSoundTime > 100) { + Sounds.shot_fireball.playEffect(1f, 0.2f, false, getPos().setY(Constants.LISTENER_POS.y - 2)); + lastSoundTime = System.currentTimeMillis(); + } + } + + public void addEffect() { + if (rand.nextInt(6) == 0) {//+0.03*(level) + Effects.addExplosion(scene.particles, getPos(), getMotion(), 0.02 + 0.03 * (level), false, false, false); + } + } + + @Override + public void render(double delta) {} + + @Override + public void onHitTarget(Entity target) { + if (System.currentTimeMillis() - lastExplTime > 150) { + Effects.addExplosion(scene.particles, collider.pos, target.getMotion(), 6 * level, true, target.hasGlobalMovement()); + lastExplTime = System.currentTimeMillis(); + } + + + Set ents = scene.getEntitiesInRange(getPos(), 0.8 * level); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == this) continue; + if (e != target) e.addDamage(this, shotDamage); + e.addFire(origin, level * Constants.FPS_UPDATE * 0.3); + } + } + } + +} diff --git a/src/net/sector/entities/shots/EntityLaser.java b/src/net/sector/entities/shots/EntityLaser.java new file mode 100644 index 0000000..0b0fc93 --- /dev/null +++ b/src/net/sector/entities/shots/EntityLaser.java @@ -0,0 +1,144 @@ +package net.sector.entities.shots; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.Constants; +import net.sector.collision.ColliderSphere; +import net.sector.entities.Entity; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.math.Calc.Rad; +import com.porcupine.math.Polar; + + +public class EntityLaser extends EntityShotBase { + + private static final double SPEED = 0.5; + + private static int renderlist = -1; + private double scale = 0.1; + private RGB color = new RGB(0, 1, 0); + + static { + renderlist = glGenLists(1); + + glNewList(renderlist, GL_COMPILE); + + glPushAttrib(GL_ENABLE_BIT); + + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_COLOR_MATERIAL); + + glEnable(GL_TEXTURE_2D); + //glDisable(GL_FOG); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + TextureManager.bind("particles_blend"); + + Coord texCoord = new Coord(3, 1); + + double left = (texCoord.x) * 0.125; + double top = (texCoord.y) * 0.125; + double right = (texCoord.x + 1) * 0.125; + double bottom = (texCoord.y + 1) * 0.125; + + glBegin(GL_QUADS); + double sh = 0.05; + + glTexCoord2d(left, top); + glVertex3d(-sh, 0, -1); + glTexCoord2d(right, top); + glVertex3d(+sh, 0, -1); + glTexCoord2d(right, bottom); + glVertex3d(+sh, 0, 0); + glTexCoord2d(left, bottom); + glVertex3d(-sh, 0, 0); + + glTexCoord2d(left, top); + glVertex3d(0, -sh, -0.9); + glTexCoord2d(right, top); + glVertex3d(0, +sh, -0.9); + glTexCoord2d(right, bottom); + glVertex3d(0, +sh, -0.1); + glTexCoord2d(left, bottom); + glVertex3d(0, -sh, -0.1); + glEnd(); + + TextureManager.unbind(); + + glDepthMask(true); + glPopAttrib(); + + glEndList(); + + } + + public EntityLaser(Coord pos, Vec speed, Entity origin) { + super(pos, speed, origin, SPEED); + this.shotDamage = 0.8; + this.collidePriority = 1000; + this.mass = 0.01; + this.lifetime = Constants.FPS_UPDATE * 6; + this.collider = new ColliderSphere(pos, scale); + this.health = 0.005; + } + + public EntityLaser(Coord pos, Vec speed, Entity origin, RGB color) { + this(pos, speed, origin); + this.color.setTo(color); + } + + public EntityLaser(Coord pos, Vec speed, Entity origin, RGB color, int level) { + this(pos, speed, origin, color); + this.shotDamage = 0.8 * level; + this.shotDamage = Calc.clampd(this.shotDamage, 1.3); + this.health = 0.1 * level * level; + } + + private static long lastSoundTime = 0; + + @Override + public void onAddedToScene() { + if (System.currentTimeMillis() - lastSoundTime > 50) { + Sounds.shot_laser.playEffect(1f, 0.4f, false, getPos().setY(Constants.LISTENER_POS.y - 3)); + lastSoundTime = System.currentTimeMillis(); + } + } + + + public Entity setDamage(double dmg) { + this.shotDamage = dmg; + return this; + } + + + @Override + public void onUpdate() { + //collider.pos.add_ip(motion); + + motion.norm_ip(shotSpeed); + + Polar p = Polar.fromCoord(motion.x, motion.z); + rotAngle.set(-90 + Rad.toDeg(p.angle)); + } + + @Override + public void render(double delta) { + glPushMatrix(); + glLoadIdentity(); + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glRotated(rotAngle.delta(delta), rotDir.x, rotDir.y, rotDir.z); + glColor4d(color.r, color.g, color.b, 1); + + glCallList(renderlist); + glPopMatrix(); + } +} diff --git a/src/net/sector/entities/shots/EntityLaser2.java b/src/net/sector/entities/shots/EntityLaser2.java new file mode 100644 index 0000000..95c80a0 --- /dev/null +++ b/src/net/sector/entities/shots/EntityLaser2.java @@ -0,0 +1,149 @@ +package net.sector.entities.shots; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.Constants; +import net.sector.collision.ColliderSphere; +import net.sector.entities.Entity; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.math.Calc.Rad; +import com.porcupine.math.Polar; + + +public class EntityLaser2 extends EntityShotBase { + + private static final double SPEED = 0.3; + + private static int renderlist = -1; + private double scale = 0.1; + private static RGB defColor = new RGB(1, 0.6, 0); + private RGB color = defColor; + + static { + renderlist = glGenLists(1); + + glNewList(renderlist, GL_COMPILE); + + glPushAttrib(GL_ENABLE_BIT); + + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_COLOR_MATERIAL); + + glEnable(GL_TEXTURE_2D); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + TextureManager.bind("particles_blend"); + + Coord texCoord = new Coord(4, 2); + + double left = (texCoord.x) * 0.125; + double top = (texCoord.y) * 0.125; + double right = (texCoord.x + 1) * 0.125; + double bottom = (texCoord.y + 1) * 0.125; + + glBegin(GL_QUADS); + double sh = 0.15; + + glTexCoord2d(left, top); + glVertex3d(-sh, 0, -1); + glTexCoord2d(right, top); + glVertex3d(+sh, 0, -1); + glTexCoord2d(right, bottom); + glVertex3d(+sh, 0, 0); + glTexCoord2d(left, bottom); + glVertex3d(-sh, 0, 0); + + sh = 0.07; + glTexCoord2d(left, top); + glVertex3d(0, -sh, -0.8); + glTexCoord2d(right, top); + glVertex3d(0, +sh, -0.8); + glTexCoord2d(right, bottom); + glVertex3d(0, +sh, -0.2); + glTexCoord2d(left, bottom); + glVertex3d(0, -sh, -0.2); + glEnd(); + + TextureManager.unbind(); + + glDepthMask(true); + glPopAttrib(); + + glEndList(); + + } + + public EntityLaser2(Coord pos, Vec speed, Entity origin) { + super(pos, speed, origin, SPEED); + this.shotDamage = 2; + this.collidePriority = 1000; + this.mass = 0.01; + this.lifetime = Constants.FPS_UPDATE * 6; + this.collider = new ColliderSphere(pos, scale); + this.health = 0.005; + } + + public EntityLaser2(Coord pos, Vec speed, Entity origin, RGB color) { + this(pos, speed, origin); + this.color.setTo(color); + } + + public EntityLaser2(Coord pos, Vec speed, Entity origin, RGB color, int level) { + this(pos, speed, origin, color); + this.shotDamage = 2 * level; + this.shotDamage = Calc.clampd(this.shotDamage, 1.5); + this.health = 0.1 * level * level; + } + + public EntityLaser2(Coord pos, Vec speed, Entity origin, int level) { + this(pos, speed, origin, defColor, level); + } + + private static long lastSoundTime = 0; + + @Override + public void onAddedToScene() { + if (System.currentTimeMillis() - lastSoundTime > 50) { + Sounds.shot_laser_acid.playEffect(1f, 0.4f, false, getPos().setY(Constants.LISTENER_POS.y - 3)); + lastSoundTime = System.currentTimeMillis(); + } + } + + + public Entity setDamage(double dmg) { + this.shotDamage = dmg; + return this; + } + + + @Override + public void onUpdate() { + //collider.pos.add_ip(motion); + + motion.norm_ip(shotSpeed); + + Polar p = Polar.fromCoord(motion.x, motion.z); + rotAngle.set(-90 + Rad.toDeg(p.angle)); + } + + @Override + public void render(double delta) { + glPushMatrix(); + glLoadIdentity(); + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glRotated(rotAngle.delta(delta), rotDir.x, rotDir.y, rotDir.z); + glColor4d(color.r, color.g, color.b, 1); + + glCallList(renderlist); + glPopMatrix(); + } +} diff --git a/src/net/sector/entities/shots/EntityMissileDirect.java b/src/net/sector/entities/shots/EntityMissileDirect.java new file mode 100644 index 0000000..b5015fe --- /dev/null +++ b/src/net/sector/entities/shots/EntityMissileDirect.java @@ -0,0 +1,109 @@ +package net.sector.entities.shots; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.Set; + +import net.sector.Constants; +import net.sector.collision.ColliderSphere; +import net.sector.effects.Effects; +import net.sector.entities.Entity; +import net.sector.models.Models; +import net.sector.models.PhysModel; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; +import net.sector.util.DeltaDoubleDeg; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +public class EntityMissileDirect extends EntityShotBase { + + private static final double SPEED = 0.4; + + private double scale = 0.25; + protected DeltaDoubleDeg rot = new DeltaDoubleDeg(0); + protected double rotSpeed = 2; + + protected static PhysModel model = Models.rocketThin; + protected double scaleRender = model.renderScale; + + private int level; + + + public EntityMissileDirect(Coord pos, Vec speed, Entity origin, int techLevel) { + super(pos, speed, origin, SPEED); + this.collidePriority = 1001; + this.mass = 0.3; + this.lifetime = Constants.FPS_UPDATE * 7; + this.collider = new ColliderSphere(pos, scale); + this.health = 0.4 * techLevel * techLevel; + + this.shotDamage = 4 * Math.pow(techLevel, 1.5); + this.level = techLevel; + } + + @Override + public void onUpdate() { + motion.norm_ip(shotSpeed); + rot.pushLast(); + rot.add(rotSpeed); + //collider.pos.add_ip(motion); + addEffect(); + + } + + private static long lastSoundTime = 0; + + @Override + public void onAddedToScene() { + if (System.currentTimeMillis() - lastSoundTime > 50) { + Sounds.rocket.playEffect(1f, 0.4f, false, getPos().setY(Constants.LISTENER_POS.y - 2)); + lastSoundTime = System.currentTimeMillis(); + } + } + + public void addEffect() { + Coord firePos = getPos().add(getMotion().neg().norm(collider.radius)); + motion.norm_ip(shotSpeed); + + Effects.addEngineFire(scene.particles, firePos, getMotion(), 2); + } + + @Override + public void render(double delta) { + glLoadIdentity(); + + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glRotated(rotAngle.delta(delta), rotDir.x, rotDir.y, rotDir.z); + glRotated(rot.delta(delta), 0, 0, 1); + glScaled(scaleRender, scaleRender, scaleRender); + + model.render(); + TextureManager.unbind(); + } + + @Override + public void onHitTarget(Entity target) { + Effects.addExplosion(scene.particles, collider.pos, target.getMotion(), 10 * level, true, target.hasGlobalMovement()); + + Set ents = scene.getEntitiesInRange(getPos(), 3); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == this) continue; + if (e != target) { + e.addDamage(this, shotDamage); + e.getMotion().add_ip(motion.scale(Calc.clampd(mass, 0, 1))); + if (e.isDead() && scoreCounter != null) scoreCounter.addScore(e.scoreValue); + } + + e.addFire(origin, level * Constants.FPS_UPDATE * 0.5); + } + } + } + +} diff --git a/src/net/sector/entities/shots/EntityMissileGuided.java b/src/net/sector/entities/shots/EntityMissileGuided.java new file mode 100644 index 0000000..cc7c4cd --- /dev/null +++ b/src/net/sector/entities/shots/EntityMissileGuided.java @@ -0,0 +1,88 @@ +package net.sector.entities.shots; + + +import java.util.Set; + +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.models.Models; +import net.sector.util.Utils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +public class EntityMissileGuided extends EntityMissileDirect { + + + public EntityMissileGuided(Coord pos, Vec speed, Entity origin, int techLevel) { + super(pos, speed, origin, techLevel); + this.model = Models.rocketFat; + this.scaleRender = model.renderScale; + this.shotDamage = 6 * Math.pow(techLevel, 1.5); + this.health = 0.4 * techLevel * techLevel; + } + + private Entity target = null; + + @Override + public void onUpdate() { + rot.pushLast(); + rot.add(rotSpeed); + + if (target == null || target.isDead()) { + Set entities = scene.getEntitiesInRange(getPos(), 60); + double mini = 180; + double mind = 1000; + for (Entity entity : entities) { + if (entity.getType() != EEntity.ENEMY) continue; + if (entity == this) continue; + double i = 0; + double d = entity.getPos().distTo(getPos()); + i = Utils.observerAngleToCoord(getPos(), entity.getPos(), motion); + if (i < 70 && i < mini && d < mind) { + target = entity; + mini = i; + mind = d; + } + } + } + + if (target != null) { + Vec direction = collider.pos.vecTo(target.getPos()); + direction.norm_ip(shotSpeed); + double dist = target.getPos().distTo(getPos()) - target.getRadius(); + if (dist < 0) dist = 0.00001; + double spd = 0.2 / dist; + if (spd < 0.05) spd = 0.05; + motion.add_ip(direction.norm(spd)); + motion.norm_ip(shotSpeed); + +// //getPos().add_ip(motion); +// Vec toTg = getPos().vecTo(target.getPos()).norm(0.06); +// motion.add_ip(toTg); + } + + // avoid obstacles + Set ents = scene.getEntitiesInRange(getPos(), collider.radius + 3); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == this) continue; + if (e.getType() == EEntity.NATURAL) { + double dist = e.getPos().distTo(getPos()) - e.getRadius(); + if (dist < 0) dist = 0.00001; + double move = 0.05 / dist; + move = Calc.clampd(move, 0.001, 0.2); + motion.add_ip(((Vec) e.getPos().vecTo(getPos()).setY(0)).norm(move)); + motion.norm_ip(shotSpeed); + } + } + } + + + motion.norm_ip(shotSpeed); + addEffect(); + } + +} \ No newline at end of file diff --git a/src/net/sector/entities/shots/EntityPlasma.java b/src/net/sector/entities/shots/EntityPlasma.java new file mode 100644 index 0000000..813464d --- /dev/null +++ b/src/net/sector/entities/shots/EntityPlasma.java @@ -0,0 +1,140 @@ +package net.sector.entities.shots; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.Constants; +import net.sector.collision.ColliderSphere; +import net.sector.entities.Entity; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +public class EntityPlasma extends EntityShotBase { + + protected RGB color = RGB.WHITE; + + private static final double SPEED = 0.3; + + protected static int renderlist = -1; + + private double scale = 0.25; + + static { + renderlist = glGenLists(1); + + glNewList(renderlist, GL_COMPILE); + + glPushAttrib(GL_ENABLE_BIT); + + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_COLOR_MATERIAL); + + glEnable(GL_TEXTURE_2D); + //glDisable(GL_FOG); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + TextureManager.bind("particles_blend"); + + Coord texCoord = new Coord(1, 0); + + double left = (texCoord.x) * 0.125; + double top = (texCoord.y) * 0.125; + double right = (texCoord.x + 1) * 0.125; + double bottom = (texCoord.y + 1) * 0.125; + + glBegin(GL_QUADS); + double sh = 1; + glTexCoord2d(left, top); + glVertex3d(-sh, +sh, 0); + glTexCoord2d(right, top); + glVertex3d(+sh, +sh, 0); + glTexCoord2d(right, bottom); + glVertex3d(+sh, -sh, 0); + glTexCoord2d(left, bottom); + glVertex3d(-sh, -sh, 0); + glEnd(); + + TextureManager.unbind(); + + glDepthMask(true); + + glPopAttrib(); + + glEndList(); + + } + + public EntityPlasma(Coord pos, Vec speed, Entity origin, double level) { + super(pos, speed, origin, SPEED); + + this.shotDamage = 3 * level; + this.collidePriority = 1003; + this.mass = 0.002; + this.scoreValue = 0; + this.health = 0.15 * level * level; + this.lifetime = Constants.FPS_UPDATE * 7; + this.scale = Calc.clampd(0.05 * level, 0.1, 0.3); + this.collider = new ColliderSphere(pos, scale); + } + + /** + * Scale set + * + * @param scale0.1-0.3 + * @return this + */ + public EntityPlasma setScale(double scale) { + this.scale = Calc.clampd(scale, 0.1, 0.3); + return this; + } + + private static long lastSoundTime = 0; + + @Override + public void onAddedToScene() { + if (System.currentTimeMillis() - lastSoundTime > 50) { + Sounds.shot_plasma1.playEffect(1f, 0.04f, false, getPos().setY(Constants.LISTENER_POS.y - 3)); + lastSoundTime = System.currentTimeMillis(); + } + } + + public EntityPlasma setColor(RGB clr) { + color = clr; + return this; + } + + + @Override + public void onUpdate() { + motion.norm_ip(shotSpeed); + //getPos().add_ip(motion); + + + } + + @Override + public void render(double delta) { + glPushMatrix(); + glLoadIdentity(); + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glScaled(scale, scale, scale); + + RenderUtils.setColor(color); + glCallList(renderlist); + glPopMatrix(); + } + + @Override + public double getHealthMax() { + return getHealth(); + } +} diff --git a/src/net/sector/entities/shots/EntityShell.java b/src/net/sector/entities/shots/EntityShell.java new file mode 100644 index 0000000..57ecef5 --- /dev/null +++ b/src/net/sector/entities/shots/EntityShell.java @@ -0,0 +1,124 @@ +package net.sector.entities.shots; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.Constants; +import net.sector.collision.ColliderSphere; +import net.sector.entities.Entity; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc.Rad; +import com.porcupine.math.Polar; + + +public class EntityShell extends EntityShotBase { + + private static final double SPEED = 0.5; + + private static int renderlist = -1; + private double scale = 0.1; + private RGB color = new RGB(0.8, 0.8, 0.8); + + static { + renderlist = glGenLists(1); + + glNewList(renderlist, GL_COMPILE); + + glPushAttrib(GL_ENABLE_BIT); + + glEnable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_COLOR_MATERIAL); + + glEnable(GL_TEXTURE_2D); + //glDisable(GL_FOG); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + TextureManager.bind("particles_plain"); + + Coord texCoord = new Coord(3, 1); + + double left = (texCoord.x) * 0.125; + double top = (texCoord.y) * 0.125; + double right = (texCoord.x + 1) * 0.125; + double bottom = (texCoord.y + 1) * 0.125; + + glBegin(GL_QUADS); + double sh = 0.03; + double len = 0.2; + + glTexCoord2d(left, top); + glVertex3d(-sh, 0, -len); + glTexCoord2d(right, top); + glVertex3d(+sh, 0, -len); + glTexCoord2d(right, bottom); + glVertex3d(+sh, 0, 0); + glTexCoord2d(left, bottom); + glVertex3d(-sh, 0, 0); + + glTexCoord2d(left, top); + glVertex3d(0, -sh, -len + 0.01); + glTexCoord2d(right, top); + glVertex3d(0, +sh, -len + 0.01); + glTexCoord2d(right, bottom); + glVertex3d(0, +sh, 0 - 0.01); + glTexCoord2d(left, bottom); + glVertex3d(0, -sh, 0 - 0.01); + glEnd(); + TextureManager.unbind(); + + glDepthMask(true); + glPopAttrib(); + + glEndList(); + + } + + public EntityShell(Coord pos, Vec speed, Entity origin, int level) { + super(pos, speed, origin, SPEED); + this.shotDamage = 0.3 + 0.5 * level; + this.collidePriority = 1000; + this.mass = 0.01; + this.health = 0.2 * level * level; + this.lifetime = Constants.FPS_UPDATE * 4; + this.collider = new ColliderSphere(pos, scale); + } + + private static long lastSoundTime = 0; + + @Override + public void onAddedToScene() { + if (System.currentTimeMillis() - lastSoundTime > 50) { + Sounds.shot_gun2.playEffect(0.4f, 0.07f, false, getPos().setY(Constants.LISTENER_POS.y - 3)); + lastSoundTime = System.currentTimeMillis(); + } + } + + + @Override + public void onUpdate() { + motion.norm_ip(shotSpeed); + + // rotate to match motion + Polar p = Polar.fromCoord(motion.x, motion.z); + rotAngle.set(-90 + Rad.toDeg(p.angle)); + } + + @Override + public void render(double delta) { + glPushMatrix(); + glLoadIdentity(); + Coord p = getPos().getDelta(delta); + glTranslated(p.x, p.y, -p.z); + glRotated(rotAngle.delta(delta), rotDir.x, rotDir.y, rotDir.z); + glColor4d(color.r, color.g, color.b, 1); + + glCallList(renderlist); + glPopMatrix(); + } +} diff --git a/src/net/sector/entities/shots/EntityShotBase.java b/src/net/sector/entities/shots/EntityShotBase.java new file mode 100644 index 0000000..44df42e --- /dev/null +++ b/src/net/sector/entities/shots/EntityShotBase.java @@ -0,0 +1,111 @@ +package net.sector.entities.shots; + + +import net.sector.Constants; +import net.sector.effects.particles.ParticleFire; +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.IScoreCounter; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.math.Calc.Rad; +import com.porcupine.math.Polar; + + +/** + * Base for all shots + * + * @author MightyPork + */ +public abstract class EntityShotBase extends Entity { + + public double shotDamage = 0.8; + public double colliderScale = 0.1; + public Entity origin = null; + public IScoreCounter scoreCounter = null; + public double shotSpeed = 0.5; + + public EntityShotBase(Coord pos, Vec motion, Entity origin, double shotSpeed) { + this.shotSpeed = shotSpeed; + this.scoreValue = 0; + this.health = 5; + this.lifetime = Constants.FPS_UPDATE * 10; + this.motion.setTo(motion.norm(shotSpeed)); + + Polar p = Polar.fromCoord(motion.x, motion.z); + rotAngle.set(-90 + Rad.toDeg(p.angle)); + rotDir.setTo(0, 1, 0); + + this.origin = origin; + + if (origin instanceof IScoreCounter) this.scoreCounter = (IScoreCounter) origin; + } + + @Override + public final EEntity getType() { + return (origin != null && origin.getType() == EEntity.PLAYER) ? EEntity.SHOT_GOOD : EEntity.SHOT_BAD; + } + + @Override + public void onImpact(Entity hitBy) { + if (hitBy == origin) return; + EEntity type = hitBy.getType(); + if (type != EEntity.SHOT_BAD && type != EEntity.SHOT_GOOD) { + + hitBy.addDamage(this, shotDamage); + onHitTarget(hitBy); + + hitBy.getMotion().add_ip(motion.scale(Calc.clampd(mass, 0, 1))); + + if (hitBy.isDead() && scoreCounter != null) scoreCounter.addScore(hitBy.scoreValue); + + setDead(); + } + } + + @Override + public void onDeath() {} + + @Override + public final boolean belongsToZone(double zFrom, double zTo) { + return Calc.inRange(collider.pos.z, zFrom - 2 * collider.radius, zTo + 2 * collider.radius); + } + + /** + * On target hit + * + * @param target + */ + public void onHitTarget(Entity target) { + scene.particles.add(new ParticleFire(collider.pos, target.motion, 0, false).setGlobalMovement(target.hasGlobalMovement())); + } + + @Override + public double getEmpSensitivity() { + return 0; + } + + @Override + public double getFireFlammability() { + return 0; + } + + @Override + public double getFireSensitivity() { + return 0; + } + + @Override + public abstract void onUpdate(); + + @Override + public abstract void render(double delta); + + @Override + public double getHealthMax() { + return 100; + } + +} diff --git a/src/net/sector/fonts/FontManager.java b/src/net/sector/fonts/FontManager.java new file mode 100644 index 0000000..5f157da --- /dev/null +++ b/src/net/sector/fonts/FontManager.java @@ -0,0 +1,976 @@ +package net.sector.fonts; + + +import static org.lwjgl.opengl.GL11.*; + +import java.awt.Font; +import java.io.InputStream; +import java.util.HashMap; + +import net.sector.App; +import net.sector.Constants; +import net.sector.util.Log; + +import org.newdawn.slick.util.ResourceLoader; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Remade universal font manager for Sector. + * + * @author MightyPork + */ +public class FontManager { + + private static final boolean DEBUG = Constants.LOG_FONTS; + + /** + * Glyph tables. + * + * @author MightyPork + */ + public static class Glyphs { + //@formatter:off + /** all glyphs */ + public static final String all = + " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]" + + "^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤" + + "¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäå" + + "æçèéêëìíîïðñòóôõö÷øùúûüýþÿ"; + + /** letters and numbers, sufficient for basic messages etc. NO SPACE */ + public static final String alnum_nospace = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + /** letters and numbers, sufficient for basic messages etc. */ + public static final String alnum = + " "+alnum_nospace; + + /** letters and numbers with the most basic punctuation signs */ + public static final String basic_text = + " .-,.?!:;_"+alnum_nospace; + + /** letters */ + public static final String alpha = + " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + /** numbers */ + public static final String numbers = + " 0123456789.-,:"; + + /** non-standard variants of alnum */ + public static final String alnum_extra = + " ŒÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜŸÝßàáâãäåæçèéêëìíîïðñòóôõöøùúû" + + "üýþÿĚŠČŘŽŤŇĎŮěščřžťňďůŁłđ"; + + /** signs and punctuation */ + public static final String signs = + " !\"#$%&§'()*+,-./:;<=>?@[\\]^_{|}~"; + + /** extra signs and punctuation */ + public static final String signs_extra = + " ¥€£¢`ƒ„…†‡ˆ‰‹‘’“”•›¡¤¦¨ª«¬­¯°±²³´µ¶·¸¹º»¼½¾¿÷™©­®→↓←↑"; + + + /** basic character set. */ + public static final String basic = alnum + signs; + //@formatter:on + } + + /** + * Font style + * + * @author MightyPork + */ + public static enum Style { + /** Normal */ + NORMAL, + /** Italic */ + ITALIC, + /** Stronger italic to left. */ + LEFT, + /** Stronger italic to right */ + RIGHT, + /** Monospace type */ + MONO, + /** Bold */ + BOLD, + /** Bold & Italic */ + BOLD_I, + /** Bold & Left */ + BOLD_L, + /** Bold & Right */ + BOLD_R, + /** Heavy style, stronger than bold. */ + HEAVY, + /** Light (lighter than normal) */ + LIGHT, + /** narrow style, similar to Light */ + NARROW, + /** Wide style, like Bold but with thinner lines */ + WIDE, + /** Outline variant of normal */ + OUTLINE; + } + + /** + * Preloaded font identifier [name, size, style] + * + * @author MightyPork + */ + public static class FontId { + /** font size (pt) */ + public float size = 24; + /** font name, registered with registerFile */ + public String name = ""; + /** font style. The given style must be in a file. */ + public Style style; + + /** Set of glyphs in this ID */ + public String glyphs = ""; + + /** Index for faster comparision of glyph ids. */ + public int glyphset_id = 0; + + /** + * Preloaded font identifier + * + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + * @param glyphs glyphs to load + */ + public FontId(String name, double size, Style style, String glyphs) { + this.name = name; + this.size = (float) size; + this.style = style; + + if (glyphs.equals(Glyphs.basic)) { + glyphset_id = 1; + } else if (glyphs.equals(Glyphs.alnum)) { + glyphset_id = 2; + } else if (glyphs.equals(Glyphs.basic_text)) { + glyphset_id = 3; + } else if (glyphs.equals(Glyphs.numbers)) { + glyphset_id = 4; + } else if (glyphs.equals(Glyphs.alpha)) { + glyphset_id = 5; + } else if (glyphs.equals(Glyphs.all)) { + glyphset_id = 6; + } else if (glyphs.equals(Glyphs.alnum_extra)) { + glyphset_id = 7; + } else if (glyphs.equals(Glyphs.signs)) { + glyphset_id = 8; + } else if (glyphs.equals(Glyphs.signs_extra)) { + glyphset_id = 9; + } else { + this.glyphs = glyphs; + } + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (!(obj.getClass().isAssignableFrom(getClass()))) return false; + if (obj instanceof FontId) { + if (obj == this) return true; + FontId id2 = ((FontId) obj); + boolean flag = true; + flag &= id2.size == size; + flag &= id2.name.equals(name); + flag &= id2.style == style; + flag &= ((id2.glyphset_id != -1 && id2.glyphset_id == glyphset_id) || id2.glyphs.equals(glyphs)); + return flag; + } + return false; + } + + @Override + public int hashCode() { + return (new Float(size).hashCode()) ^ name.hashCode() ^ style.hashCode() ^ glyphset_id; + } + + @Override + public String toString() { + return "[" + name + ", " + size + ", " + style + (glyphset_id > 0 ? ", g=" + glyphset_id : ", g=custom") + "]"; + } + } + + /** + * Group of styles of one font. + * + * @author MightyPork + */ + public static class FontFamily extends HashMap {} + + + /** + * Table of font files. name → {style:file,style:file,style:file...} + */ + private static HashMap fontFiles = new HashMap(); + + private static HashMap loadedFonts = new HashMap(); + + private static HashMap aliases = new HashMap(); + + private static boolean FULLSCREEN_DOUBLE_SIZE = false; + + /** + * Decide whether fonts in fullscreen should be twice larger or not. + * + * @param state switch state + */ + public static void setFullscreenDoubleSize(boolean state) { + FULLSCREEN_DOUBLE_SIZE = state; + } + + + /** + * Register font file. + * + * @param path resource path (res/fonts/...) + * @param name font name (for binding) + * @param style font style in this file + */ + public static void registerFile(String path, String name, Style style) { + if (fontFiles.containsKey(name)) { + if (fontFiles.get(name) != null) { + fontFiles.get(name).put(style, path); + //Log.finest("Registered font file \""+path+"\" as ["+name+", "+style+"]."); + return; + } + } + + // insert new table of styles to font name. + FontFamily family = new FontFamily(); + family.put(style, path); + fontFiles.put(name, family); + //Log.finest("Registered font file \""+path+"\" as ["+name+", "+style+"]."); + } + + public static int loadedFontCounter = 0; + + /** + * Preload font if needed, get preloaded font.
+ * If needed file is not available, throws runtime exception. + * + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + * @param glyphs glyphs needed + * @return the loaded font. + */ + public static LoadedFont preloadFont(String name, double size, Style style, String glyphs) { + FontId id = new FontId(name, size, style, glyphs); + if (loadedFonts.containsKey(id)) { + return loadedFonts.get(id); + } + + String resourcePath; + try { + resourcePath = fontFiles.get(name).get(style); + if (resourcePath == null) { + Log.w("Font [" + name + "] does not have variant " + style + ".\nUsing NORMAL instead."); + resourcePath = fontFiles.get(name).get(Style.NORMAL); + if (resourcePath == null) { + throw new NullPointerException(); + } + } + } catch (NullPointerException npe) { + throw new RuntimeException("Font loading failed: no font file registered for name \"" + name + "\"."); + } + + InputStream in = ResourceLoader.getResourceAsStream(resourcePath); + + Font awtFont; + try { + awtFont = Font.createFont(Font.TRUETYPE_FONT, in); + } catch (Exception e) { + Log.e("Loading of font " + resourcePath + " failed.", e); + throw new RuntimeException(e); + } + awtFont = awtFont.deriveFont((float) size); // set font size + LoadedFont font = new LoadedFont(awtFont, true, glyphs); + + font.setCorrection(correctionLeft, correctionRight); + + loadedFonts.put(id, font); + loadedFontCounter++; + + if (DEBUG) Log.f3("Font from file \"" + resourcePath + "\" preloaded as " + id + "."); + + return font; + } + + /** + * Get font from parameters, preload if needed + * + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + * @return the font + */ + public static LoadedFont getFont(String name, double size, Style style) { + return getFont(name, size, style, Glyphs.basic); + } + + + /** + * Get font from parameters, preload if needed + * + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + * @param glyphs glyphs requested + * @return the font + */ + public static LoadedFont getFont(String name, double size, Style style, String glyphs) { + FontId id = new FontId(name, size, style, glyphs); + if (loadedFonts.containsKey(id)) { + return loadedFonts.get(id); + } + return preloadFont(name, size, style, glyphs); + } + + /** + * Get font by alias + * + * @param alias font alias + * @return the font + */ + public static LoadedFont getFont(String alias) { + alias = fs(alias); + FontId id = aliases.get(alias); + if (id == null) throw new RuntimeException("Font alias \"" + alias + "\" undefined."); + return loadedFonts.get(id); + } + + private static double clipVt = 0; + private static double clipVb = 0; + private static Coord scale = new Coord(1, 1); + private static int correctionLeft = 9; + private static int correctionRight = 8; + + /** + * Set vertical clip for next loaded font + * + * @param clipT clip top (0-1) + * @param clipB vlip bottom (0-1) + */ + public static void nextLoadedClipV(double clipT, double clipB) { + FontManager.clipVt = clipT; + FontManager.clipVb = clipB; + } + + /** + * Set relative scale for next loaded font + * + * @param scale scale + */ + public static void nextLoadedScale(Coord scale) { + FontManager.scale = scale; + } + + /** + * Set spacing correction for next loaded font + * + * @param left left + * @param right right + */ + public static void nextLoadedCorrection(int left, int right) { + correctionLeft = left; + correctionRight = right; + } + + /** + * Reset settings for "next loaded font" + */ + public static void resetNextLoadedSettings() { + clipVt = 0; + clipVb = 0; + scale = new Coord(1, 1); + correctionLeft = 9; + correctionRight = 8; + } + + /** + * Register font alias and preload. + * + * @param alias alias to add + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + */ + public static void addAlias(String alias, String name, double size, Style style) { + addAlias(alias, name, size, style, Glyphs.basic, scale, clipVt, clipVb); + } + + + /** + * Register font alias and preload. Preloads also fulscreen variant with + * twice larger size. + * + * @param alias alias to add + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + * @param glyphs glyphs needed + */ + public static void addAlias(String alias, String name, double size, Style style, String glyphs) { + addAlias(alias, name, size, style, glyphs, scale, clipVt, clipVb); + } + + /** + * Register font alias and preload. Preloads also fulscreen variant with + * twice larger size. + * + * @param alias alias to add + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + * @param glyphs glyphs needed + * @param scale font scale + */ + public static void addAlias(String alias, String name, double size, Style style, String glyphs, Coord scale) { + addAlias(alias, name, size, style, glyphs, scale, clipVt, clipVb); + } + + + + /** + * Register font alias and preload. Preloads also fulscreen variant with + * twice larger size. + * + * @param alias alias to add + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + * @param glyphs glyphs needed + * @param scale font scale + * @param clipT vertical clip 0-1 (up) + * @param clipB vertical clip 0-1 (bottom) + */ + public static void addAlias(String alias, String name, double size, Style style, String glyphs, Coord scale, double clipT, double clipB) { + + FontId id; + + preloadFont(name, size, style, glyphs).setScale(scale.x, scale.y).setClip(clipT, clipB); + id = new FontId(name, size, style, glyphs); + aliases.put(alias, id); + + preloadFont(name, size * 2, style, glyphs).setScale(scale.x, scale.y).setClip(clipT, clipB); + id = new FontId(name, size * 2, style, glyphs); + aliases.put(alias + "_fs", id); + + if (DEBUG) Log.f3("Font " + id + " connected to alias " + alias + "(_fs)."); + + } + + /** + * Register font alias and preload. Preloads also fulscreen variant with + * twice larger size. + * + * @param alias alias to add + * @param name font name (registerFile) + * @param size font size (pt) + * @param style font style + * @param glyphs glyphs needed + * @param clipT clip top + * @param clipB clip bottom + */ + public static void addAlias(String alias, String name, double size, Style style, String glyphs, double clipT, double clipB) { + + FontId id; + + preloadFont(name, size, style, glyphs).setClip(clipT, clipB); + id = new FontId(name, size, style, glyphs); + aliases.put(alias, id); + + preloadFont(name, size * 2, style, glyphs).setClip(clipT, clipB); + id = new FontId(name, size * 2, style, glyphs); + aliases.put(alias + "_fs", id); + + if (DEBUG) Log.f3("Font " + id + " connected to alias " + alias + "(_fs)."); + + } + + /** + * Destroy font data + * + * @param alias font alias + */ + public static void destroyFont(String alias) { + if (aliases.containsKey(alias)) { + FontId fontId = aliases.get(alias); + aliases.remove(alias); + LoadedFont fontData = loadedFonts.get(fontId); + if (fontData != null) { + fontData.destroy(); + loadedFonts.remove(fontId); + } + } + } + + /** + * Get string width + * + * @param fontAlias font alias + * @param text text + * @return size (px) + */ + public static float width(String fontAlias, String text) { + return getFont(fontAlias).getWidth(text); + } + + /** + * Get string width + * + * @param name font name + * @param size font size (pt) + * @param style font style + * @param text text + * @return size (px) + */ + public static float width(String name, double size, Style style, String text) { + return getFont(name, size, style).getWidth(text); + } + + private static LoadedFont getCurrentFont() { + return getFont(fontName, fontSize, fontStyle); + } + + /** + * Get string width (currently binded with default set calls) + * + * @param text text + * @return size (px) + */ + public static float width(String text) { + return getCurrentFont().getWidth(text); + } + + private static String fs(String alias) { + if (!FULLSCREEN_DOUBLE_SIZE) return alias; + return alias += (App.isFullscreen() ? "_fs" : ""); + } + + /** + * Get font height + * + * @param alias font alias + * @return height (px) + */ + public static float height(String alias) { + return getFont(alias).getLineHeight(); + } + + /** + * Get font height (currently binded with default set calls) + * + * @return height (px) + */ + public static float height() { + return getCurrentFont().getLineHeight(); + } + + /** + * Get font height + * + * @param name font name + * @param size font size (pt) + * @param style font style + * @return height (px) + */ + public static float height(String name, double size, Style style) { + return getFont(name, size, style).getLineHeight(); + } + + + // Draw by alias. + + private static RGB fontColor = new RGB(1, 1, 1); + private static int fontAlign = -1; + private static String fontName = "default"; + private static double fontSize = 24; + private static Style fontStyle = Style.NORMAL; + + /** + * Set default render color + * + * @param color new color + */ + public static void setColor(RGB color) { + fontColor.setTo(color); + } + + /** + * Set default render align + * + * @param align align (-1,0,1) + */ + public static void setAlign(int align) { + fontAlign = align; + } + + /** + * Set default font alias + * + * @param fontAlias font alias + */ + public static void setFont(String fontAlias) { + FontId id = aliases.get(fs(fontAlias)); + fontName = id.name; + fontSize = id.size; + fontStyle = id.style; + } + + /** + * Set default font alias and color + * + * @param fontAlias font alias + * @param color color + */ + public static void setFont(String fontAlias, RGB color) { + setFont(fontAlias); + setColor(color); + } + + /** + * Set default font alias and color + * + * @param fontAlias font alias + * @param align font align (-1,0,1) + */ + public static void setFont(String fontAlias, int align) { + setFont(fontAlias); + fontAlign = align; + } + + /** + * Set default font alias, color, align + * + * @param fontAlias alias + * @param color color + * @param align font align -1,0,1 + */ + public static void setFont(String fontAlias, RGB color, int align) { + setFont(fontAlias, color); + fontAlign = align; + } + +// +// /** +// * Set default font name,size,style and color +// * +// * @param name font name +// * @param size font size (pt) +// * @param style font style +// * @param color color +// */ +// public static void setFont(String name, double size, Style style, RGB color) { +// setFont(name, size * App.fs12(), style); +// setColor(color); +// } +// +// /** +// * Set default font name,size,style and color +// * +// * @param name font name +// * @param size font size (pt) +// * @param style font style +// */ +// public static void setFont(String name, double size, Style style) { +// fontName = name; +// fontSize = size * App.fs12(); +// fontStyle = style; +// } +// +// /** +// * Set default font name,size,style and color +// * +// * @param name font name +// * @param size font size (pt) +// * @param style font style +// * @param color color +// * @param align font align -1,0,1 +// */ +// public static void setFont(String name, double size, Style style, RGB color, int align) { +// setFont(name, size, style); +// setColor(color); +// fontAlign = align; +// } + +// /** +// * Set default font name,size,style and color +// * +// * @param name font name +// * @param size font size (pt) +// * @param style font style +// * @param align font align -1,0,1 +// */ +// public static void setFont(String name, double size, Style style, int align) { +// fontName = name; +// fontSize = size * App.fs12(); +// fontStyle = style; +// fontAlign = align; +// } + + /** + * Draw string with font. + * + * @param pos position + * @param text text to draw + */ + public static void draw(Coord pos, String text) { + draw(pos.x, pos.y, text, fontName, fontSize, fontStyle, fontColor, fontAlign); + } + + /** + * Draw string with font. + * + * @param pos position + * @param text text to draw + * @param color render color + */ + public static void draw(Coord pos, String text, RGB color) { + draw(pos.x, pos.y, text, fontName, fontSize, fontStyle, color, fontAlign); + } + + /** + * Draw string with font. + * + * @param pos position + * @param text text to draw + * @param fontAlias font alias + * @param color render color + */ + public static void draw(Coord pos, String text, String fontAlias, RGB color) { + draw(pos.x, pos.y, text, fontAlias, color, fontAlign); + } + + /** + * Draw string with font. + * + * @param pos position + * @param text text to draw + * @param fontAlias font alias + */ + public static void draw(Coord pos, String text, String fontAlias) { + draw(pos.x, pos.y, text, fontAlias, fontColor, fontAlign); + } + + /** + * Draw string with font. + * + * @param pos position + * @param text text to draw + * @param align (-1,0,1) + */ + public static void draw(Coord pos, String text, int align) { + draw(pos.x, pos.y, text, fontName, fontSize, fontStyle, fontColor, align); + } + + /** + * Draw string with font. + * + * @param pos position + * @param text text to draw + * @param color render color + * @param align (-1,0,1) + */ + public static void draw(Coord pos, String text, RGB color, int align) { + draw(pos.x, pos.y, text, fontName, fontSize, fontStyle, color, align); + } + + /** + * Draw string with font. + * + * @param pos position + * @param text text to draw + * @param fontAlias font alias + * @param color render color + * @param align (-1,0,1) + */ + public static void draw(Coord pos, String text, String fontAlias, RGB color, int align) { + draw(pos.x, pos.y, text, fontAlias, color, align); + } + + /** + * Draw string with font. + * + * @param pos position + * @param text text to draw + * @param fontAlias font alias + * @param align (-1,0,1) + */ + public static void draw(Coord pos, String text, String fontAlias, int align) { + draw(pos.x, pos.y, text, fontAlias, fontColor, align); + } + + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + */ + public static void draw(double x, double y, String text) { + draw(x, y, text, fontName, fontSize, fontStyle, fontColor, fontAlign); + } + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + * @param color render color + */ + public static void draw(double x, double y, String text, RGB color) { + draw(x, y, text, fontName, fontSize, fontStyle, color, fontAlign); + } + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + * @param fontAlias font alias + * @param color render color + */ + public static void draw(double x, double y, String text, String fontAlias, RGB color) { + draw(x, y, text, fontAlias, color, fontAlign); + } + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + * @param fontAlias font alias + */ + public static void draw(double x, double y, String text, String fontAlias) { + draw(x, y, text, fontAlias, fontColor, fontAlign); + } + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + * @param align (-1,0,1) + */ + public static void draw(double x, double y, String text, int align) { + draw(x, y, text, fontName, fontSize, fontStyle, fontColor, align); + } + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + * @param color render color + * @param align (-1,0,1) + */ + public static void draw(double x, double y, String text, RGB color, int align) { + draw(x, y, text, fontName, fontSize, fontStyle, color, align); + } + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + * @param fontAlias font alias + * @param align (-1,0,1) + */ + public static void draw(double x, double y, String text, String fontAlias, int align) { + draw(x, y, text, fontAlias, fontColor, align); + } + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + * @param fontAlias font alias + * @param color render color + * @param align (-1,0,1) + */ + public static void draw(double x, double y, String text, String fontAlias, RGB color, int align) { + getFont(fontAlias).drawString(x, y, text, 1, 1, color, align); + } + + + /** + * Draw string with font. + * + * @param x x coord + * @param y y coord + * @param text text to draw + * @param name font name + * @param size font size + * @param style font style + * @param color font color + * @param align align (-1,0,1) + */ + public static void draw(double x, double y, String text, String name, double size, Style style, RGB color, int align) { + getFont(name, size, style).drawString(x, y, text, 1, 1, color, align); + } + + + public static void drawFuzzy(Coord pos, String text, String font, RGB blurColor, RGB textColor, int blurSize, int align) { + FontManager.drawFuzzy(pos, text, font, blurColor, textColor, blurSize, align, true); + } + + + public static void drawFuzzy(Coord pos, String text, String font, RGB blurColor, RGB textColor, int blurSize, int align, boolean smooth) { + + glPushMatrix(); + + glTranslated(pos.x, pos.y, pos.z); + + glEnable(GL_TEXTURE_2D); + + //shadow + int sh = blurSize; + + int l = glGenLists(1); + + setColor(blurColor); + glNewList(l, GL_COMPILE); + draw(0, 0, text, font, align); + glEndList(); + + + for (int xx = -sh; xx <= sh; xx += (smooth ? 1 : sh)) { + for (int yy = -sh; yy <= sh; yy += (smooth ? 1 : sh)) { + if (xx == 0 && yy == 0) continue; + glPushMatrix(); + glTranslated(xx, yy, 0); + glCallList(l); + glPopMatrix(); + } + } + + glDeleteLists(l, 1); + + draw(0, 0, text, font, textColor, align); + + glDisable(GL_TEXTURE_2D); + + glPopMatrix(); + } + + + +} diff --git a/src/net/sector/fonts/Fonts.java b/src/net/sector/fonts/Fonts.java new file mode 100644 index 0000000..01f408b --- /dev/null +++ b/src/net/sector/fonts/Fonts.java @@ -0,0 +1,132 @@ +package net.sector.fonts; + + +import static net.sector.fonts.FontManager.Style.*; +import net.sector.fonts.FontManager.Glyphs; +import net.sector.util.Log; + +import com.porcupine.coord.Coord; + + +/** + * Global font preloader + * + * @author Rapus + */ +public class Fonts { + + private static void registerFileNames() { + // simple + FontManager.registerFile("res/fonts/simple/normal.ttf", "simple", NORMAL); + FontManager.registerFile("res/fonts/simple/wide.ttf", "simple", WIDE); + FontManager.registerFile("res/fonts/simple/narrow.ttf", "simple", NARROW); + FontManager.registerFile("res/fonts/simple/outline.ttf", "simple", OUTLINE); + + /// lcd_a / prop + FontManager.registerFile("res/fonts/lcd_a/prop/normal.ttf", "lcd1", NORMAL); + FontManager.registerFile("res/fonts/lcd_a/prop/bold.ttf", "lcd1", BOLD); + FontManager.registerFile("res/fonts/lcd_a/prop/heavy.ttf", "lcd1", HEAVY); + FontManager.registerFile("res/fonts/lcd_a/prop/light.ttf", "lcd1", LIGHT); + + // lcd_a-dense / mono + FontManager.registerFile("res/fonts/lcd_a/mono/normal.ttf", "lcd1_mono", NORMAL); + FontManager.registerFile("res/fonts/lcd_a/mono/bold.ttf", "lcd1_mono", BOLD); + FontManager.registerFile("res/fonts/lcd_a/mono/heavy.ttf", "lcd1_mono", HEAVY); + FontManager.registerFile("res/fonts/lcd_a/mono/light.ttf", "lcd1_mono", LIGHT); + + // lcd_b + FontManager.registerFile("res/fonts/lcd_b/normal.ttf", "lcd2", NORMAL); + FontManager.registerFile("res/fonts/lcd_b/bold.ttf", "lcd2", BOLD); + FontManager.registerFile("res/fonts/lcd_b/boldi.ttf", "lcd2", BOLD_I); + FontManager.registerFile("res/fonts/lcd_b/italic.ttf", "lcd2", ITALIC); + + + FontManager.registerFile("res/fonts/digital_dream/normal.ttf", "dd_r", NORMAL); + FontManager.registerFile("res/fonts/digital_dream/bold.ttf", "dd_r", BOLD); + FontManager.registerFile("res/fonts/digital_dream/italic.ttf", "dd_r", ITALIC); + FontManager.registerFile("res/fonts/digital_dream/bold_italic.ttf", "dd_r", BOLD_I); + + FontManager.registerFile("res/fonts/digital_dream/narrow.ttf", "dd_n", NORMAL); + FontManager.registerFile("res/fonts/digital_dream/narrow_bold.ttf", "dd_n", BOLD); + FontManager.registerFile("res/fonts/digital_dream/narrow_italic.ttf", "dd_n", ITALIC); + FontManager.registerFile("res/fonts/digital_dream/narrow_italic_bold.ttf", "dd_n", BOLD_I); + + FontManager.registerFile("res/fonts/atomic_clock_radio.ttf", "atomic", NORMAL); + + // spaceage + FontManager.registerFile("res/fonts/spaceage.ttf", "spaceage", NORMAL); + } + + /** + * Load fonts needed for splash. + */ + public static void loadForSplash() { + registerFileNames(); + + FontManager.addAlias("splash", "lcd1", 128, HEAVY, " SECTOR_"); + FontManager.addAlias("subsplash", "lcd2", 40, BOLD_I, Glyphs.basic_text); + } + + /** + * Preload all fonts we will use in the game + */ + public static void load() { + + // it is in general better to load one larger + // glyphs set than multiple smaller ones. + + FontManager.nextLoadedClipV(0.2, 0.2); + FontManager.nextLoadedScale(new Coord(0.6, 1)); + + FontManager.addAlias("menu_title", "spaceage", 52, NORMAL, Glyphs.basic_text); + + FontManager.addAlias("gameover", "spaceage", 50, NORMAL, Glyphs.basic_text); + + + FontManager.resetNextLoadedSettings(); + + FontManager.addAlias("hud", "atomic", 32, NORMAL, Glyphs.basic); + + + FontManager.addAlias("score", "lcd1", 48, BOLD, Glyphs.numbers); + FontManager.addAlias("timer", "dd_n", 32, BOLD_I, Glyphs.numbers); + FontManager.addAlias("score_small", "lcd1", 26, BOLD, Glyphs.numbers); + + FontManager.nextLoadedCorrection(6, 6); + FontManager.addAlias("gameover_score", "simple", 40, NORMAL, Glyphs.basic_text); + FontManager.addAlias("highscore_level_name", "simple", 40, NORMAL, Glyphs.basic_text); + FontManager.addAlias("small_heading", "simple", 45, NORMAL, Glyphs.basic_text); + FontManager.addAlias("dialog_heading", "simple", 40, NORMAL, Glyphs.basic_text); + FontManager.addAlias("small_menu", "simple", 28, NORMAL); + FontManager.addAlias("login_display1", "simple", 28, NORMAL); + FontManager.addAlias("login_display2", "simple", 30, NORMAL); + FontManager.addAlias("larger_text", "simple", 30, NORMAL); + + + FontManager.nextLoadedClipV(0.15, 0); + FontManager.addAlias("small_text", "simple", 28, NORMAL); + FontManager.addAlias("level_title", "simple", 28, NORMAL); + FontManager.addAlias("level_subtitle", "simple", 22, NORMAL); + FontManager.addAlias("small_button", "simple", 26, NORMAL); + FontManager.nextLoadedCorrection(7, 7); + FontManager.addAlias("menu", "simple", 64, NORMAL, Glyphs.basic_text); + FontManager.addAlias("designer_info", "simple", 26, NORMAL); + FontManager.addAlias("smaller_text", "simple", 22, NORMAL); + FontManager.addAlias("designer_tooltip", "simple", 24, NORMAL); + FontManager.addAlias("designer_infopanel", "simple", 18, NORMAL); + FontManager.addAlias("designer_level", "simple", 18, NORMAL); + FontManager.resetNextLoadedSettings(); + + FontManager.nextLoadedCorrection(7, 7); + FontManager.addAlias("default", "simple", 24, NORMAL); + FontManager.addAlias("debug_info", "simple", 24, NORMAL); + FontManager.resetNextLoadedSettings(); + + + + FontManager.addAlias("score_label", "lcd2", 24, NORMAL); + + Log.i("Fonts loaded = " + FontManager.loadedFontCounter); + + } +} diff --git a/src/net/sector/fonts/LoadedFont.java b/src/net/sector/fonts/LoadedFont.java new file mode 100644 index 0000000..cfa5a84 --- /dev/null +++ b/src/net/sector/fonts/LoadedFont.java @@ -0,0 +1,536 @@ +package net.sector.fonts; + + +import static net.sector.util.Align.*; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferByte; +import java.awt.image.DataBufferInt; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sector.Constants; +import net.sector.util.Log; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.GLU; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * A TrueType font implementation originally for Slick, edited for Bobjob's + * Engine + * + * @original author James Chambers (Jimmy) + * @original author Jeremy Adams (elias4444) + * @original author Kevin Glass (kevglass) + * @original author Peter Korzuszek (genail) + * @new version edited by David Aaron Muhar (bobjob) + * @new version edited by MightyPork + */ +@SuppressWarnings("javadoc") +public class LoadedFont { + + private static final boolean DEBUG = Constants.LOG_FONTS; + + /** Map of user defined font characters (Character <-> IntObject) */ + private Map chars = new HashMap(100); + + /** Boolean flag on whether AntiAliasing is enabled or not */ + private boolean antiAlias; + + /** Font's size */ + private int fontSize = 0; + + /** Font's height */ + private int fontHeight = 0; + + /** Texture used to cache the font 0-255 characters */ + private int fontTextureID; + + /** Default font texture width */ + private int textureWidth = 2048; + + /** Default font texture height */ + private int textureHeight = 2048; + + /** A reference to Java's AWT Font that we create our font texture from */ + private Font font; + + /** The font metrics for our Java AWT font */ + private FontMetrics fontMetrics; + + private int correctL = 9, correctR = 8; + + private double defScaleX = 1, defScaleY = 1; + private double clipVerticalT = 0; + private double clipVerticalB = 0; + + private class CharStorageEntry { + /** Character's width */ + public int width; + + /** Character's height */ + public int height; + + /** Character's stored x position */ + public int texPosX; + + /** Character's stored y position */ + public int texPosY; + } + + + public LoadedFont(Font font, boolean antiAlias, String charsNeeded) { + this.font = font; + this.fontSize = font.getSize() + 3; + this.antiAlias = antiAlias; + + createSet(charsNeeded.toCharArray()); + + fontHeight -= 1; + if (fontHeight <= 0) fontHeight = 1; + } + +// public TextureFont(Font font, boolean antiAlias) { +// this(font, antiAlias, null); +// } + + public void setCorrection(boolean on) { + if (on) { + correctL = 2; + correctR = 1; + } else { + correctL = 0; + correctR = 0; + } + } + + private BufferedImage getFontImage(char ch) { + // Create a temporary image to extract the character's size + BufferedImage tempfontImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = (Graphics2D) tempfontImage.getGraphics(); + if (antiAlias == true) { + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + } + g.setFont(font); + fontMetrics = g.getFontMetrics(); + int charwidth = fontMetrics.charWidth(ch) + 8; + + if (charwidth <= 0) { + charwidth = 7; + } + int charheight = fontMetrics.getHeight() + 3; + if (charheight <= 0) { + charheight = fontSize; + } + + // Create another image holding the character we are creating + BufferedImage fontImage; + fontImage = new BufferedImage(charwidth, charheight, BufferedImage.TYPE_INT_ARGB); + Graphics2D gt = (Graphics2D) fontImage.getGraphics(); + if (antiAlias == true) { + gt.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + } + gt.setFont(font); + + gt.setColor(Color.WHITE); + int charx = 3; + int chary = 1; + gt.drawString(String.valueOf(ch), (charx), (chary) + fontMetrics.getAscent()); + + return fontImage; + + } + + + private void createSet(char[] charsToLoad) { + + try { + class LoadedGlyph { + public char c; + public BufferedImage image; + public int width; + public int height; + + public LoadedGlyph(char c, BufferedImage image) { + this.image = image; + this.c = c; + this.width = image.getWidth(); + this.height = image.getHeight(); + } + } + + List glyphs = new ArrayList(); + List loaded = new ArrayList(); + for (char ch : charsToLoad) { + if (!loaded.contains(ch)) { + glyphs.add(new LoadedGlyph(ch, getFontImage(ch))); + loaded.add(ch); + } + } + + Coord canvas = new Coord(128, 128); + double lineHeight = 0; + Coord begin = new Coord(0, 0); + boolean needsLarger = false; + + while (true) { + + needsLarger = false; + + for (LoadedGlyph glyph : glyphs) { + if (begin.x + glyph.width > canvas.x) { + begin.y += lineHeight; + lineHeight = 0; + begin.x = 0; + } + + if (lineHeight < glyph.height) { + lineHeight = glyph.height; + } + + if (begin.y + lineHeight > canvas.y) { + needsLarger = true; + break; + } + + // draw. + begin.x += glyph.width; + } + + if (needsLarger) { + canvas.x *= 2; + canvas.y *= 2; + begin.setTo(0, 0); + lineHeight = 0; + } else { + if (DEBUG) Log.f3("Preparing texture " + canvas.x + "x" + canvas.y); + break; + } + } + + textureWidth = (int) canvas.x; + textureHeight = (int) canvas.y; + + BufferedImage imgTemp = new BufferedImage(textureWidth, textureHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = (Graphics2D) imgTemp.getGraphics(); + + g.setColor(new Color(0, 0, 0, 1)); + g.fillRect(0, 0, textureWidth, textureHeight); + + int rowHeight = 0; + int positionX = 0; + int positionY = 0; + + for (LoadedGlyph glyph : glyphs) { + + CharStorageEntry storedChar = new CharStorageEntry(); + + storedChar.width = glyph.width; + storedChar.height = glyph.height; + + if (positionX + storedChar.width >= textureWidth) { + positionX = 0; + positionY += rowHeight; + rowHeight = 0; + } + + storedChar.texPosX = positionX; + storedChar.texPosY = positionY; + + if (storedChar.height > fontHeight) { + fontHeight = storedChar.height; + } + + if (storedChar.height > rowHeight) { + rowHeight = storedChar.height; + } + + // Draw it here + g.drawImage(glyph.image, positionX, positionY, null); + + positionX += storedChar.width; + + chars.put(glyph.c, storedChar); + } + + fontTextureID = loadImage(imgTemp); + + imgTemp = null; + + } catch (Exception e) { + System.err.println("Failed to create font."); + e.printStackTrace(); + } + } + + private void drawQuad(double drawX, double drawY, double drawX2, double drawY2, CharStorageEntry charObj) { + double srcX = charObj.texPosX + charObj.width; + double srcY = charObj.texPosY + charObj.height; + double srcX2 = charObj.texPosX; + double srcY2 = charObj.texPosY; + double DrawWidth = drawX2 - drawX; + double DrawHeight = drawY2 - drawY; + double TextureSrcX = srcX / textureWidth; + double TextureSrcY = srcY / textureHeight; + double SrcWidth = srcX2 - srcX; + double SrcHeight = srcY2 - srcY; + double RenderWidth = (SrcWidth / textureWidth); + double RenderHeight = (SrcHeight / textureHeight); + + drawY -= DrawHeight * clipVerticalB; + + GL11.glTexCoord2d(TextureSrcX, TextureSrcY); + GL11.glVertex2d(drawX, drawY); + GL11.glTexCoord2d(TextureSrcX, TextureSrcY + RenderHeight); + GL11.glVertex2d(drawX, drawY + DrawHeight); + GL11.glTexCoord2d(TextureSrcX + RenderWidth, TextureSrcY + RenderHeight); + GL11.glVertex2d(drawX + DrawWidth, drawY + DrawHeight); + GL11.glTexCoord2d(TextureSrcX + RenderWidth, TextureSrcY); + GL11.glVertex2d(drawX + DrawWidth, drawY); + } + + public int getWidth(String whatchars) { + if (whatchars == null) whatchars = ""; + int totalwidth = 0; + CharStorageEntry charStorage = null; + char currentChar = 0; + for (int i = 0; i < whatchars.length(); i++) { + currentChar = whatchars.charAt(i); + + charStorage = chars.get(currentChar); + + if (charStorage != null) { + totalwidth += charStorage.width - correctL; + } + } + return (int) (totalwidth * defScaleX); + } + + public int getHeight() { + return (int) (fontHeight * defScaleY * (1 - clipVerticalT - clipVerticalB)); + } + + public int getLineHeight() { + return getHeight(); + } + + public void drawString(double x, double y, String text, double scaleX, double scaleY, RGB color) { + drawString(x, y, text, 0, text.length() - 1, scaleX, scaleY, color, LEFT); + } + + public void drawString(double x, double y, String text, double scaleX, double scaleY, RGB color, int align) { + drawString(x, y, text, 0, text.length() - 1, scaleX, scaleY, color, align); + } + + private void drawString(double x, double y, String text, int startIndex, int endIndex, double scaleX, double scaleY, RGB color, int align) { + + scaleX *= defScaleX; + scaleY *= defScaleY; + + CharStorageEntry charStorage = null; + int charCurrent; + + int totalwidth = 0; + int i = startIndex, d = 1, c = correctL; + float startY = 0; + + switch (align) { + case RIGHT: { + d = -1; + c = correctR; + + while (i < endIndex) { + if (text.charAt(i) == '\n') startY -= getHeight(); + i++; + } + break; + } + case CENTER: { + for (int l = startIndex; l <= endIndex; l++) { + charCurrent = text.charAt(l); + if (charCurrent == '\n') break; + + charStorage = chars.get((char) charCurrent); + if (charStorage != null) { + totalwidth += charStorage.width - correctL; + } + } + totalwidth /= -2; + break; + } + case LEFT: + default: { + d = 1; + c = correctL; + break; + } + + } + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, fontTextureID); + GL11.glColor4d(color.r, color.g, color.b, color.a); + GL11.glBegin(GL11.GL_QUADS); + + while (i >= startIndex && i <= endIndex) { + + charCurrent = text.charAt(i); + + charStorage = chars.get(new Character((char) charCurrent)); + + if (charStorage != null) { + if (d < 0) totalwidth += (charStorage.width - c) * d; + if (charCurrent == '\n') { + startY -= getHeight() * d; + totalwidth = 0; + if (align == CENTER) { + for (int l = i + 1; l <= endIndex; l++) { + charCurrent = text.charAt(l); + if (charCurrent == '\n') break; + + charStorage = chars.get((char) charCurrent); + + totalwidth += charStorage.width - correctL; + } + totalwidth /= -2; + } + //if center get next lines total width/2; + } else { + + //@formatter:off + drawQuad( + (totalwidth + charStorage.width) * scaleX + x, + startY * scaleY + y, totalwidth * scaleX + x, + (startY + charStorage.height) * scaleY + y, + charStorage + ); + //@formatter:on + + if (d > 0) totalwidth += (charStorage.width - c) * d; + } + + } + + i += d; + } + GL11.glEnd(); + } + + public static int loadImage(BufferedImage bufferedImage) { + try { + short width = (short) bufferedImage.getWidth(); + short height = (short) bufferedImage.getHeight(); + //textureLoader.bpp = bufferedImage.getColorModel().hasAlpha() ? (byte)32 : (byte)24; + int bpp = (byte) bufferedImage.getColorModel().getPixelSize(); + ByteBuffer byteBuffer; + DataBuffer db = bufferedImage.getData().getDataBuffer(); + if (db instanceof DataBufferInt) { + int intI[] = ((DataBufferInt) (bufferedImage.getData().getDataBuffer())).getData(); + byte newI[] = new byte[intI.length * 4]; + for (int i = 0; i < intI.length; i++) { + byte b[] = intToByteArray(intI[i]); + int newIndex = i * 4; + + newI[newIndex] = b[1]; + newI[newIndex + 1] = b[2]; + newI[newIndex + 2] = b[3]; + newI[newIndex + 3] = b[0]; + } + + byteBuffer = ByteBuffer.allocateDirect(width * height * (bpp / 8)).order(ByteOrder.nativeOrder()).put(newI); + } else { + byteBuffer = ByteBuffer.allocateDirect(width * height * (bpp / 8)).order(ByteOrder.nativeOrder()) + .put(((DataBufferByte) (bufferedImage.getData().getDataBuffer())).getData()); + } + byteBuffer.flip(); + + + int internalFormat = GL11.GL_RGBA8, format = GL11.GL_RGBA; + IntBuffer textureId = BufferUtils.createIntBuffer(1); + + GL11.glGenTextures(textureId); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId.get(0)); + + + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); + + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + + GL11.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); + + GLU.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, internalFormat, width, height, format, GL11.GL_UNSIGNED_BYTE, byteBuffer); + return textureId.get(0); + + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + + return -1; + } + + public static boolean isSupported(String fontname) { + Font font[] = getFonts(); + for (int i = font.length - 1; i >= 0; i--) { + if (font[i].getName().equalsIgnoreCase(fontname)) return true; + } + return false; + } + + public static Font[] getFonts() { + return GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); + } + + public static Font getFont(String fontname, int style, float size) { + Font result = null; + GraphicsEnvironment graphicsenvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); + for (Font font : graphicsenvironment.getAllFonts()) { + if (font.getName().equalsIgnoreCase(fontname)) { + result = font.deriveFont(style, size); + break; + } + } + return result; + } + + public static byte[] intToByteArray(int value) { + return new byte[] { (byte) (value >>> 24), (byte) (value >>> 16), (byte) (value >>> 8), (byte) value }; + } + + public void destroy() { + IntBuffer scratch = BufferUtils.createIntBuffer(1); + scratch.put(0, fontTextureID); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GL11.glDeleteTextures(scratch); + } + + public LoadedFont setScale(double x, double y) { + defScaleX = x; + defScaleY = y; + return this; + } + + public LoadedFont setClip(double clipRatioTop, double clipRatioBottom) { + clipVerticalT = clipRatioTop; + clipVerticalB = clipRatioBottom; + return this; + } + + public void setCorrection(int correctionLeft, int correctionRight) { + correctL = correctionLeft; + correctR = correctionRight; + } +} diff --git a/src/net/sector/gui/panels/HsColors.java b/src/net/sector/gui/panels/HsColors.java new file mode 100644 index 0000000..4bc1474 --- /dev/null +++ b/src/net/sector/gui/panels/HsColors.java @@ -0,0 +1,23 @@ +package net.sector.gui.panels; + + +import com.porcupine.color.RGB; + + +/** + * Colors used in all highscore tables + * + * @author MightyPork + */ +public class HsColors { + /** Score number */ + public static final RGB SCORE = RGB.GREEN; + /** Guest name */ + public static final RGB GUEST = RGB.WHITE; + /** User name (not active) */ + public static final RGB USER = new RGB(0x2EA8FF); + /** Active guest (just submitted) */ + public static final RGB GUEST_ACTIVE = new RGB(0xFFE100); + /** Active user (Just submitted, or in an overview table) */ + public static final RGB USER_ACTIVE = RGB.CYAN; +} diff --git a/src/net/sector/gui/panels/Panel.java b/src/net/sector/gui/panels/Panel.java new file mode 100644 index 0000000..1c14627 --- /dev/null +++ b/src/net/sector/gui/panels/Panel.java @@ -0,0 +1,327 @@ +package net.sector.gui.panels; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.Random; + +import net.sector.App; +import net.sector.collision.Scene; +import net.sector.gui.screens.Screen; +import net.sector.input.IInputHandler; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Panel class, control module for screen. + * + * @author MightyPork + */ +public abstract class Panel implements IInputHandler { + + /** The screen this panel belongs to */ + public Screen screen; + + /** The application instance */ + public App app = App.inst; + + private Panel below = null; + + private Panel above = null; + + /** RNG */ + public Random rand = new Random(); + + /** Scene from screen */ + public Scene scene; + + /** + * New panel + * + * @param screen parent screen + */ + public Panel(Screen screen) { + this.screen = screen; + this.scene = screen.scene; + } + + /** + * @return true if this panel has no parent + */ + public final boolean isRoot() { + return below == null; + } + + /** + * @return true if this panel is the topmost, focused + */ + public final boolean isTop() { + return above == null; + } + + /** + * @return true if this panel is focused, topmost + */ + public final boolean isFocused() { + return isTop(); + } + + /** + * @return topmost panel in the panel stack + */ + public final Panel getTop() { + if (isTop()) return this; + return above.getTop(); + } + + /** + * @return panel below this one, if any + */ + public final Panel getBelow() { + if (isRoot()) return null; + return below; + } + + /** + * Destroy all panels above this panel. + */ + public final void destroyAbove() { + if (!isTop()) { + above.destroyAbove(); + above.onBlur(); + above.onClose(); + above = null; + } + } + + /** + * Close this panel (if not root panel), and give focus to the panel below. + */ + public final void closePanel() { + if (!isRoot()) { + below.destroyAbove(); + onBlur(); + below.onFocus(); + } + } + + /** + * Add a panel to the stack and focus it. + * + * @param added added child + */ + public final void openPanel(Panel added) { + + above = added; + above.below = this; + this.onBlur(); + above.onCreate(); + above.onFocus(); + } + + /** + * Hook called when panel was openned + */ + public abstract void onCreate(); + + /** + * @return true if this panel has dark translucent background. + */ + public abstract boolean hasBackgroundLayer(); + + /** + * Get color of background layer + * + * @return color + */ + public RGB getBackgroundColor() { + return new RGB(0, 0.7); + } + + /** + * Called before the panel is closed. + */ + public abstract void onClose(); + + /** + * Called when this panel is focused. + */ + public void onFocus() {} + + /** + * Called when this panel loses focus. + */ + public void onBlur() {} + + /** + * Update this panel.
+ * In case of root panel, you should update scene here. + */ + public abstract void update(); + + /** + * Render directly rendered 3D stuff in all panels + */ + public final void render3D() { + renderDirect3D(); + if (!isTop()) { + getTop().render3D(); + } + } + + /** + * Render the inside elements of this panel + */ + protected abstract void renderPanel(); + + /** + * Render 3D stuff from this panel + */ + public void renderDirect3D() {} + + + /** + * Called each update tick, if the mouse position was changed. + * + * @param pos + * @param move + */ + @Override + public void onMouseMove(Coord pos, Vec move, int wheelDelta) {} + + + /** + * Mouse event handler. + * + * @param button button which caused this event + * @param down true = down, false = up + * @param wheelDelta number of steps the wheel turned since last event + * @param pos mouse position + * @param deltaPos delta maouse position + */ + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) {} + + + /** + * Key event handler. + * + * @param key key index, constant Keyboard.KEY_??? + * @param c character typed, if any + * @param down true = down, false = up + */ + @Override + public void onKey(int key, char c, boolean down) {} + + + /** + * In this method screen can handle static inputs, that is: + * Keyboard.isKeyDown, Mouse.isButtonDown etc. + */ + @Override + public void handleStaticInputs() {} + + + /** + * Render all the panels in the stack, if this is the root panel. + */ + public final void render() { + + if (!isRoot()) return; + + //@formatter:off + glMatrixMode(GL_PROJECTION); + + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + + glLoadIdentity(); + Coord s = app.getSize(); + glOrtho(0, s.x, 0, s.y, -1000, 1000); + + glMatrixMode(GL_MODELVIEW); + + glPushAttrib(GL_ENABLE_BIT); + glPushMatrix(); + + glLoadIdentity(); + + glDisable(GL_LIGHTING); + glDisable(GL_FOG); + glDisable(GL_COLOR_MATERIAL); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + renderThisAndChildren(); + + glPopMatrix(); + glPopAttrib(); + + glMatrixMode(GL_PROJECTION); + + glPopAttrib(); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + //@formatter:on + } + + private final void renderThisAndChildren() { + glDisable(GL_TEXTURE_2D); + + if (hasBackgroundLayer()) { + + Coord size = app.getSize(); + + RenderUtils.setColor(getBackgroundColor()); + //glColor4d(0, 0, 0, 0.6); + glBegin(GL_QUADS); + glVertex2d(0, size.y); + glVertex2d(size.x, size.y); + glVertex2d(size.x, 0); + glVertex2d(0, 0); + glEnd(); + } + + renderPanel(); + + // render any higher guis + if (!isTop()) { + glTranslated(0, 0, 50); + getAbove().renderThisAndChildren(); + } + } + + + private Panel getAbove() { + return above; + } + + /** + * On window resized + */ + public abstract void onWindowChanged(); + + /** + * On viewport changed (fullscreen etc) + */ + public final void onViewportChanged() { + onWindowChanged(); + if (!isTop()) { + getTop().onViewportChanged(); + } + } + + /** + * Return true if delta timing is enabled for scene. + * + * @return do delta timing + */ + public boolean isDeltaEnabled() { + return false; + } +} diff --git a/src/net/sector/gui/panels/PanelChallenges.java b/src/net/sector/gui/panels/PanelChallenges.java new file mode 100644 index 0000000..e43d285 --- /dev/null +++ b/src/net/sector/gui/panels/PanelChallenges.java @@ -0,0 +1,256 @@ +package net.sector.gui.panels; + + +import java.util.Collections; +import java.util.List; + +import net.sector.App; +import net.sector.gui.panels.profiles.PanelProfiles; +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenMenuMain; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.IWidgetFactory; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.composite.ListItemLevel; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.RadioButton; +import net.sector.gui.widgets.input.RadioButton.RadioGroup; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.input.Function; +import net.sector.level.LevelBundle; +import net.sector.level.LevelRegistry; +import net.sector.level.SuperContext; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +public class PanelChallenges extends PanelGui { + + private static final int MENU = 0; + private static final int CHANGE_PROFILE = 2; + private static final int RADIO = 1; + + private CompositeScrollBox scrollBox; + private Text txUser; + private Text txUserLabel; + private LayoutH topLayout; + private RadioButton ckLocal; + private RadioButton ckGlobal; + private RadioButton ckInternal; + private RadioButton ckAll; + private Button bnClose; + private Widget bnProfiles; + + private static int lastCheckbox = 3; + + + public PanelChallenges(Screen screen) { + super(screen); + } + + + private static class LevelListItemFactory implements IWidgetFactory { + @Override + public Widget getWidget() { + return getItem(); + } + + public ListItemLevel getItem() { + return getItem(null); + } + + public ListItemLevel getItem(LevelBundle level) { + return (ListItemLevel) new ListItemLevel(level).setMargins(4, 2, 4, 2); + } + } + + + private static LevelListItemFactory scrollBoxItemFactory = new LevelListItemFactory(); + + @Override + public void initGui(GuiRoot root) { + //@formatter:off + + LayoutV mainLayout = new LayoutV(Align.CENTER); + + topLayout = new LayoutH(Align.CENTER); + topLayout.add(bnClose = new Button(MENU, "Menu", "small_text")); + + LayoutV v1 = (LayoutV) new LayoutV(Align.CENTER).setMinWidth(350); + LayoutH h1 = new LayoutH(Align.CENTER); + + h1.add(txUserLabel = new Text("User: ", "login_display1")); + h1.add(txUser = new Text("username", "login_display1")); + + Function handler = new Function() { + @Override + public Boolean run(Object... args) { + if(App.offlineMode) return false; + actionPerformed(bnProfiles); + return true; + } + }; + + txUser.addOnClickHandler(handler); + txUserLabel.addOnClickHandler(handler); + + + RGB c1main = new RGB(0x0B74E3); + RGB c1blur = new RGB(0x003185, 0.2); + txUserLabel.setColorText(c1main).setBlur(c1blur, 2); + + RGB c2main = new RGB(0x0CADED); + RGB c2blur = new RGB(0x0C62A8, 0.1); + txUser.setColorText(c2main).setBlur(c2blur, 2); + + v1.add(h1); + topLayout.add(v1); + + topLayout.add(bnProfiles = new Button(CHANGE_PROFILE, "Profiles", "small_text").setEnabled(!App.offlineMode)); + + mainLayout.add(topLayout); + + WindowFrame frame = new WindowFrame(); + + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(false); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Challenge Levels", "small_heading").setMarginsV(10, 15)); + + LayoutH h = new LayoutH(Align.CENTER); + + RadioGroup group = RadioButton.newGroup(); + h.add(ckInternal = new RadioButton(RADIO, "Built-in", "small_text").setGroup(group)); + h.add(new Gap(10,0)); + h.add(ckLocal = new RadioButton(RADIO, "Local", "small_text").setGroup(group)); + h.add(new Gap(10,0)); + h.add(ckGlobal = new RadioButton(RADIO, "Shared", "small_text").setGroup(group)); + h.add(new Gap(10,0)); + h.add(ckAll = new RadioButton(RADIO, "All", "small_text").setGroup(group)); + ckAll.setChecked(true); + + v.add(h); + + scrollBox = new CompositeScrollBox(5, scrollBoxItemFactory); + + v.add(scrollBox); + + frame.add(v); + + mainLayout.add(frame); + + root.setRootWidget(mainLayout); + + updateProfileText(); + + switch(lastCheckbox) { + case 0: + ckInternal.setChecked(true); + insertLevels(LevelRegistry.internalLevels); + break; + + case 1: + ckLocal.setChecked(true); + insertLevels(LevelRegistry.localLevels); + break; + + case 2: + ckGlobal.setChecked(true); + insertLevels(LevelRegistry.netLevels); + break; + + case 3: + ckAll.setChecked(true); + insertLevels(LevelRegistry.getAllLevels()); + break; + } + + //@formatter:on + } + + public void updateProfileText() { + txUser.setMinWidth(10); + txUser.setText(SuperContext.selectedUser == null ? "Guest" : SuperContext.selectedUser.uname); + updateWidgetPositions(); + } + + public void insertLevels(List levels) { + + scrollBox.removeAll(); + Collections.sort(levels); + + for (LevelBundle level : levels) { + if (!level.isCompatible()) continue; + + scrollBox.addItem(scrollBoxItemFactory.getItem(level)); + } + + scrollBox.refresh(); + } + + @Override + public void onPostInit() { + gui.updatePositions(); + } + + @Override + public void onFocus() { + super.onFocus(); + updateProfileText(); + updateWidgetPositions(); + } + + @Override + public void actionPerformed(Widget widget) { + if (widget.id == MENU) { + app.replaceScreen(new ScreenMenuMain()); + return; + } + if (widget.id == CHANGE_PROFILE) { + openPanel(new PanelProfiles(screen)); + return; + } + if (widget.id == RADIO) { + + if (ckInternal.isChecked()) { + lastCheckbox = 0; + insertLevels(LevelRegistry.internalLevels); + } else if (ckLocal.isChecked()) { + lastCheckbox = 1; + insertLevels(LevelRegistry.localLevels); + } else if (ckGlobal.isChecked()) { + lastCheckbox = 2; + insertLevels(LevelRegistry.netLevels); + } else if (ckAll.isChecked()) { + lastCheckbox = 3; + insertLevels(LevelRegistry.getAllLevels()); + } + + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnClose); + } + } + + @Override + public boolean hasBackgroundLayer() { + return false; + } + + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/PanelConfig.java b/src/net/sector/gui/panels/PanelConfig.java new file mode 100644 index 0000000..4a2b782 --- /dev/null +++ b/src/net/sector/gui/panels/PanelConfig.java @@ -0,0 +1,187 @@ +package net.sector.gui.panels; + + +import net.sector.GameConfig; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.Checkbox; +import net.sector.gui.widgets.input.Slider; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.sounds.Music; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.Display; + +import com.porcupine.color.RGB; + + +/** + * Overlay panel for paused game. + * + * @author MightyPork + */ +public class PanelConfig extends PanelGui { + + private static final int SAVE = 0; + private static final int CANCEL = 1; + private Checkbox ckInitFullscreen; + private Checkbox ckVsync; + private Checkbox ckSplash; + private Checkbox ckUpdateAlerts; + + private int soundVol = GameConfig.audioVolumeSound; + private int musicVol = GameConfig.audioVolumeMusic; + private Slider sliderSound; + private Slider sliderMusic; + private Button bnCancel; + private Button bnSave; + private Checkbox ckResizable; + private int origin; + + + /** + * @param screen + * @param origin 0 = menu, 1 = pause screen + */ + public PanelConfig(Screen screen, int origin) { + super(screen); + this.origin = origin; + } + + @Override + public void initGui(GuiRoot root) { + WindowFrame frame = new WindowFrame(); + frame.setPadding(10, 10, 6, 6); + frame.enableShadow(true); + root.setRootWidget(frame); + + LayoutV v = new LayoutV(Align.CENTER); + v.add(new Text("Settings", "small_heading").setMarginsV(5, 10)); + v.add(new Gap(0, 5)); + + LayoutV v2 = new LayoutV(Align.LEFT); + + v2.add(ckSplash = (Checkbox) new Checkbox(-1, "animate splash screen").setFont("small_text")); + v2.add(ckInitFullscreen = (Checkbox) new Checkbox(-1, "start in fullscreen").setFont("small_text")); + v2.add(ckVsync = (Checkbox) new Checkbox(-1, "enable v-sync").setFont("small_text")); + v2.add(ckResizable = (Checkbox) new Checkbox(-1, "resizable window").setFont("small_text")); + v2.add(new Gap(0, 5)); + v2.add(ckUpdateAlerts = (Checkbox) new Checkbox(-1, "enable update alerts").setFont("small_text")); + + ckSplash.setChecked(GameConfig.enableSplash); + ckInitFullscreen.setChecked(GameConfig.startInFullscreen); + ckVsync.setChecked(GameConfig.enableVsync); + ckResizable.setChecked(GameConfig.enableResize); + ckUpdateAlerts.setChecked(GameConfig.enableUpdateAlerts); + + v2.add(new Gap(0, 15)); + + // TODO add sliders + LayoutH h2; + + h2 = new LayoutH(Align.CENTER); + h2.add(new Text("Sound", "small_text").setTextAlign(Align.RIGHT).setMinWidth(100)); + h2.add(new Gap(5, 0)); + h2.add(sliderSound = new Slider(250, soundVol / 100D)); + v2.add(h2); + + h2 = new LayoutH(Align.CENTER); + h2.add(new Text("Music", "small_text").setTextAlign(Align.RIGHT).setMinWidth(100)); + h2.add(new Gap(5, 0)); + h2.add(sliderMusic = new Slider(250, musicVol / 100D)); + v2.add(h2); + v2.add(new Gap(0, 20)); + + v.add(v2); + + + LayoutH h = new LayoutH(Align.CENTER); + h.add(bnCancel = new Button(CANCEL, "Cancel", "small_text")); + h.add(new Gap(10, 0)); + h.add(bnSave = new Button(SAVE, "Save", "small_text")); + v.add(h); + + frame.add(v); + } + + @Override + public void actionPerformed(Widget widget) { + + + if (widget.id == CANCEL) { + closePanel(); + return; + } + + if (widget.id == SAVE) { + GameConfig.setNewProp(GameConfig.pk_splash, ckSplash.isChecked()); + GameConfig.setNewProp(GameConfig.pk_win_fs, ckInitFullscreen.isChecked()); + GameConfig.setNewProp(GameConfig.pk_vsync, ckVsync.isChecked()); + GameConfig.setNewProp(GameConfig.pk_win_resize, ckResizable.isChecked()); + GameConfig.setNewProp(GameConfig.pk_update_notifications, ckUpdateAlerts.isChecked()); + + GameConfig.setNewProp(GameConfig.pk_music_volume, Math.round(sliderMusic.getValue() * 100)); + GameConfig.setNewProp(GameConfig.pk_sound_volume, Math.round(sliderSound.getValue() * 100)); + + GameConfig.saveLoad(); + GameConfig.useLoaded(); + + Music.pauseMusic(); + app.applySoundConfig(); + if (origin == 0) { + Music.playMenu(); + } else if (origin == 1) { + Music.playIngame(); + } + + Display.setResizable(GameConfig.enableResize); + + closePanel(); + return; + } + + } + + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnCancel); + } + + if (key == Keyboard.KEY_RETURN && down) { + actionPerformed(bnSave); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/PanelEmpty.java b/src/net/sector/gui/panels/PanelEmpty.java new file mode 100644 index 0000000..6ee6b50 --- /dev/null +++ b/src/net/sector/gui/panels/PanelEmpty.java @@ -0,0 +1,43 @@ +package net.sector.gui.panels; + + +import net.sector.gui.screens.Screen; + + + +/** + * Empty do-nothing panel, used in Screens with no Gui instead of NULL. + * + * @author MightyPork + */ +public class PanelEmpty extends Panel { + + /** + * New empty panel + * + * @param screen screen + */ + public PanelEmpty(Screen screen) { + super(screen); + } + + @Override + public void onCreate() {} + + @Override + public void onClose() {} + + @Override + public boolean hasBackgroundLayer() { + return false; + } + + @Override + public void update() {} + + @Override + protected void renderPanel() {} + + @Override + public void onWindowChanged() {} +} diff --git a/src/net/sector/gui/panels/PanelGui.java b/src/net/sector/gui/panels/PanelGui.java new file mode 100644 index 0000000..76d46f9 --- /dev/null +++ b/src/net/sector/gui/panels/PanelGui.java @@ -0,0 +1,88 @@ +package net.sector.gui.panels; + + +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.GuiRoot.EventListener; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.layout.LayoutV; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; + + +public abstract class PanelGui extends Panel implements EventListener { + + protected GuiRoot gui; + private LayoutV v; + + public PanelGui(Screen screen) { + super(screen); + gui = new GuiRoot(this, null); + } + + + @Override + public final void onCreate() { + initGui(gui); + gui.setParentPanel(this); + gui.updatePositions(); + onPostInit(); + } + + /** + * Called after panel is fully created + */ + public void onPostInit() {} + + @Override + public void onClose() {} + + public final void updateWidgetPositions() { + gui.updatePositions(); + } + + public final GuiRoot getRootWidget() { + return gui; + } + + public abstract void initGui(GuiRoot gui); + + @Override + public void onWindowChanged() { + gui.updatePositions(); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public void update() {} + + @Override + protected void renderPanel() { + gui.render(); + } + + @Override + public abstract void actionPerformed(Widget widget); + + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + if (button != -1) gui.onMouseButton(button, down); + if (wheelDelta != 0) gui.onScroll(Calc.clampi(wheelDelta, -1, 1)); + } + + @Override + public void onKey(int key, char c, boolean down) { + gui.onKeyDown(key, c, down); + } + + @Override + public void handleStaticInputs() { + gui.handleStaticInputs(); + } + +} diff --git a/src/net/sector/gui/panels/PanelMenu.java b/src/net/sector/gui/panels/PanelMenu.java new file mode 100644 index 0000000..e981e6d --- /dev/null +++ b/src/net/sector/gui/panels/PanelMenu.java @@ -0,0 +1,133 @@ +package net.sector.gui.panels; + + +import java.io.IOException; + +import net.sector.App; +import net.sector.Constants; +import net.sector.GameConfig; +import net.sector.gui.panels.dialogs.EDialogColor; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.dialogs.PanelDialogModal.IDialogListener; +import net.sector.gui.panels.profiles.PanelProfiles; +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenDesigner; +import net.sector.gui.screens.ScreenLevels; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.menu.MenuButton; +import net.sector.gui.widgets.menu.MenuLoginDisplay; +import net.sector.gui.widgets.menu.MenuTitle; +import net.sector.level.SuperContext; +import net.sector.util.Align; +import net.sector.util.Log; + + +/** + * Main menu panel + * + * @author MightyPork + */ +public class PanelMenu extends PanelGui { + private static final int EXIT = 0; + private static final int PLAY = 1; + private static final int CONFIG = 3; + private static final int USERS = 4; + private static final int LEVELS = 5; + + public PanelMenu(Screen screen) { + super(screen); + } + + @Override + public void initGui(GuiRoot root) { + LayoutV v = new LayoutV(Align.CENTER); + v.add(new MenuTitle("SECTOR")); + v.add(new Gap(0, 20)); + //v.add(new MenuButton(PLAY, "Start game")); + v.add(new MenuButton(LEVELS, "Challenges")); + //v.add(new MenuButton(HISCORE, "Highscore")); + v.add(new Gap(0, 15)); + v.add(new MenuLoginDisplay(USERS)); + v.add(new Gap(0, 15)); + v.add(new MenuButton(CONFIG, "Settings")); + v.add(new MenuButton(EXIT, "Quit game")); + root.setRootWidget(v); + } + + @Override + public void onPostInit() { + if (!App.offlineMode && !SuperContext.updateAlertShown && GameConfig.enableUpdateAlerts) { + if (SuperContext.latestVersionNumber > Constants.VERSION_NUMBER) { + SuperContext.updateAlertShown = true; + + String message = "Update your SECTOR!\n"; + message += "New version " + SuperContext.latestVersionName + " is available.\n"; + + IDialogListener listener = new IDialogListener() { + + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 0) { + try { + java.awt.Desktop.getDesktop().browse(java.net.URI.create(Constants.WEB_URL)); + } catch (IOException e) { + Log.e("Error openning website.", e); + } + } + } + }; + + + openPanel(new PanelDialogModal(screen, listener, -1, true, message, "Open website", "Close").setEnterButton(1).setColorTheme( + EDialogColor.GREEN)); + } + } + } + + @Override + public boolean hasBackgroundLayer() { + return false; + } + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + switch (widget.id) { + case EXIT: + PanelDialogModal p; + + IDialogListener listener = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 1) App.inst.exit(); + } + }; + + p = new PanelDialogModal(screen, listener, -1, true, "Do you really want to quit?", "No", "Yes").setEnterButton(1); + p.setColorTheme(EDialogColor.BLUE); + + openPanel(p); + break; + + case PLAY: + app.replaceScreen(new ScreenDesigner()); + break; + + case LEVELS: + app.replaceScreen(new ScreenLevels()); + break; + + case CONFIG: + openPanel(new PanelConfig(screen, 0)); + break; + + case USERS: + openPanel(new PanelProfiles(screen)); + break; + } + } +} diff --git a/src/net/sector/gui/panels/PanelSplash.java b/src/net/sector/gui/panels/PanelSplash.java new file mode 100644 index 0000000..5fcdd83 --- /dev/null +++ b/src/net/sector/gui/panels/PanelSplash.java @@ -0,0 +1,129 @@ +package net.sector.gui.panels; + + +import net.sector.App; +import net.sector.Constants; +import net.sector.GameConfig; +import net.sector.LoadingManager; +import net.sector.effects.Effects; +import net.sector.fonts.FontManager; +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenMenuMain; +import net.sector.util.Align; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Splash panel + * + * @author MightyPork + */ +public class PanelSplash extends Panel { + + private String shown = ""; + private String remains = "SECTOR"; + private String allOrig = remains; + private String subsplash = ""; + private long counter = 0, finishedTimer = -1, finishedTimerD = 0; + + /** + * @param screen + */ + public PanelSplash(Screen screen) { + super(screen); + } + + @Override + public boolean isDeltaEnabled() { + return true; + } + + @Override + public void onCreate() { + if (!GameConfig.enableSplash) { + shown = remains; + remains = ""; + finishedTimer = 0; + } + } + + @Override + public void onClose() {} + + @Override + public void onWindowChanged() {} + + @Override + public boolean hasBackgroundLayer() { + return false; + } + + @Override + protected void renderPanel() { + + FontManager.setFullscreenDoubleSize(true); + + Coord s = app.getSize(); + + + double left = s.x / 2 - FontManager.width("splash", allOrig) / 2; + double down = (s.y / 2) - FontManager.height("splash") / 3 + 20; + Coord pos = new Coord(left, down); + + boolean underscore = (counter % (Constants.FPS_UPDATE / 4) > (Constants.FPS_UPDATE / 4) / 2 && remains.length() > 0); + String txt = shown + (remains.length() == 0 ? "" : underscore ? "_" : " "); + + FontManager.drawFuzzy(pos, txt, "splash", new RGB(0x0033ff, 0.3), new RGB(0x00ff00, 1), 8 * App.fs2(), Align.LEFT, false); + + FontManager.drawFuzzy(new Coord(s.x / 2, down - FontManager.height("subsplash")), subsplash, "subsplash", new RGB(0x9999ff, 0.05), new RGB( + 0xffffff), 2 * App.fs2(), Align.CENTER); + + FontManager.setFullscreenDoubleSize(false); + } + + @Override + public void update() { + counter++; + if (finishedTimer >= 0) finishedTimer++; + if (counter % ((int) (Constants.FPS_UPDATE / 1.5)) == 0 && remains.length() > 0) { + shown += remains.charAt(0); + remains = remains.substring(1); + if (remains.length() == 0) { + finishedTimer = 0; + } + } + + if (finishedTimer == -1 && counter % (Constants.FPS_UPDATE / 10) == 0) { + //for(int i=0; i<5+rand.nextInt(5); i++) { + Effects.addBinaries(scene.particles, new Coord(-1.5 + rand.nextDouble() * 3, 2.2 + 0.8 * rand.nextDouble(), 0), 7); +// Effects.addExplosion(scene.particles, new Coord(-1.5 + rand.nextDouble() * 3, 2.3+0.6*rand.nextDouble(), 0), Vec.ZERO, 3, false, false, false); + //} + + //for(int i=0;i<10;i++) Effect.addStar(scene.particles, new Coord(-1 + rand.nextDouble() * 2, 2.6, 0)); + } + + if (finishedTimer == Constants.FPS_UPDATE * 1) { + subsplash = "Loading..."; + } + + + if (finishedTimer > Constants.FPS_UPDATE * 2 && (finishedTimer - finishedTimerD) > Constants.FPS_UPDATE * 0.2) { + if (LoadingManager.hasMoreGroups()) { + finishedTimerD = finishedTimer; + LoadingManager.loadGroup(); + } else { + LoadingManager.onResourcesLoaded(); + app.replaceScreen(new ScreenMenuMain()); + FontManager.destroyFont("splash"); + FontManager.destroyFont("subsplash"); + } + } + if (finishedTimer > Constants.FPS_UPDATE * 1.5) { + subsplash = LoadingManager.getSplashInfo(); + } + + scene.update(); + } +} diff --git a/src/net/sector/gui/panels/designer/PanelDesigner.java b/src/net/sector/gui/panels/designer/PanelDesigner.java new file mode 100644 index 0000000..a32ef61 --- /dev/null +++ b/src/net/sector/gui/panels/designer/PanelDesigner.java @@ -0,0 +1,939 @@ +package net.sector.gui.panels.designer; + + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.Map.Entry; + +import net.sector.App; +import net.sector.gui.panels.Panel; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.designer.PanelShipLoad.IShipLoadDialogListener; +import net.sector.gui.panels.designer.PanelShipSave.IShipSaveDialogListener; +import net.sector.gui.panels.dialogs.EDialogColor; +import net.sector.gui.panels.dialogs.PanelDialogCaptureInput; +import net.sector.gui.panels.dialogs.PanelDialogCaptureInput.ICaptureInputDialogListener; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.dialogs.PanelDialogModal.IDialogListener; +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenDesigner; +import net.sector.gui.screens.ScreenGame; +import net.sector.gui.screens.ScreenLevels; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.*; +import net.sector.gui.widgets.composite.ShipDesignerTable.EShipStructureError; +import net.sector.gui.widgets.composite.ShipDesignerTable.EdMode; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.display.TextDouble; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.ButtonIcon; +import net.sector.gui.widgets.input.ButtonVertical; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.input.TriggerBundle; +import net.sector.level.EBuildingMode; +import net.sector.level.GameContext; +import net.sector.level.GameCursor; +import net.sector.level.ship.DiscoveryTable; +import net.sector.level.ship.PieceBundle; +import net.sector.level.ship.PieceRegistry; +import net.sector.level.ship.ShipBundle; +import net.sector.level.ship.modules.EnergySystem; +import net.sector.level.ship.modules.Shield; +import net.sector.util.Align; +import net.sector.util.Log; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; +import com.porcupine.coord.CoordI; +import com.porcupine.struct.Struct3; +import com.porcupine.util.StringUtils; + + +/** + * Main menu panel + * + * @author MightyPork + */ +public class PanelDesigner extends PanelGui { + + private static final int id_BACK = 0, id_PLAY = 1, id_SHIELD_UP = 2, id_SHIELD_DOWN = 3, id_ENERGY_UP = 4, id_ENERGY_DOWN = 5; + + private ShipDesignerTable table; + private Text txDesignStatus; + private ShipDesignerController ctrl; + private ShipDesignerShop shop; + + private Button bnPlay, bnShUp, bnShDown, bnEnUp, bnEnDown, bnBack; + private ArrayList groupButtons = new ArrayList(); + + + private static final int id_ARRANGE = 30, id_SELECT = 31, id_UNSELECT = 32, id_LEVEL_UP = 33; + private static final int id_LEVEL_DOWN = 34, id_MOVE_UP = 35, id_MOVE_DOWN = 36, id_MOVE_LEFT = 37; + private static final int id_MOVE_RIGHT = 38, id_DELETE = 39, id_ROT_CW = 40, id_ROT_CCW = 41, id_CONTROLS = 42, id_SELECT_ALL = 23; + private static final int id_ANY_TAB = 53, id_SAVE = 54, id_LOAD = 55; + + @SuppressWarnings("unused") + private Button bnArrang, bnSel, bnUnsel, bnLvlUp, bnLvlDn, bnMvUp, bnMvDn, bnMvLt, bnMvRt, bnDel, bnRotCW, bnRotCCW, bnControls, bnSelAll, + bnSave, bnLoad; + + private Text txShLevel, txEnLevel; + + private TextDouble[] infoTexts; + + + private int shieldLevel = 1; + private int shieldLevelMax = Shield.getLevelMax(); + + private int energyLevel = 1; + private int energyLevelMax = EnergySystem.getLevelMax(); + + private RGB white = new RGB(1, 1, 1); + private RGB orange = new RGB(1, 0.7, 0); + private RGB red = new RGB(1, 0, 0); + private RGB green = new RGB(0, 1, 0); + private RGB blue = new RGB(0.4, 0.5, 1); + private RGB purple = new RGB(0.7, 0.3, 1); + + private GameContext context; + private GameCursor cursor; + private ShipBundle shipBundle; + private DiscoveryTable discoveries; + private Text txtControl; + + /** + * Create designer + * + * @param screen screen + * @param context game context + */ + public PanelDesigner(Screen screen, GameContext context) { + super(screen); + + context.restoreCursor(); + + this.context = context; + + this.cursor = context.getCursor(); + + this.discoveries = context.getCursor().discoveryTable; + this.shipBundle = context.getCursor().shipBundle; + + shieldLevelMax = discoveries.getDiscoveryLevel("shield"); + energyLevelMax = discoveries.getDiscoveryLevel("energy"); + + shieldLevel = shipBundle.shieldLevel; + energyLevel = shipBundle.energyLevel; + + if (shieldLevelMax > 0 && shieldLevel == 0) shieldLevel = 1; + if (energyLevelMax > 0 && energyLevel == 0) energyLevel = 1; + } + + @Override + public void onFocus() { + super.onFocus(); + Keyboard.enableRepeatEvents(false); + } + + @Override + public void onBlur() { + super.onBlur(); + } + + private ButtonVertical makeLeftTab(int id, String text) { + ButtonVertical bv = new ButtonVertical(id, text, "small_button"); + bv.setTheme(ETheme.DES_TAB_BUTTON); + bv.setMargins(0, 3, 0, 3); + bv.setPadding(0, 8); + bv.bdrs[0] = true; + bv.bdrs[1] = false; + bv.bdrs[2] = true; + bv.bdrs[3] = true; + bv.sndClick = true; + return bv; + } + + @Override + public void initGui(GuiRoot gui) { + LayoutH h1, h2; + LayoutV v1, v2; + WindowFrame frame, f2; + + frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(false); + + //@formatter:off + + v1 = new LayoutV(Align.CENTER); + + // TOP MENU BUTTONS + h1 = new LayoutH(Align.CENTER); + + bnBack = new Button(id_BACK, "Back"); + bnBack.setMinWidth(100); + h1.add(bnBack); + + txDesignStatus = (Text) new Text("", "designer_info").setTextAlign(Align.CENTER).setMinWidth(500); + h1.add(txDesignStatus); + + bnPlay = new Button(id_PLAY, "Play"); + bnPlay.setMinWidth(100); + h1.add(bnPlay); + + v1.add(h1); + + h1 = new LayoutH(Align.TOP); + + v2 = (LayoutV) new LayoutV(Align.CENTER).setMargins(0, 0, 0, 0); + + v2.add(new Gap(0, 10)); + + for(Entry g: PieceRegistry.groups.entrySet()) { + ButtonVertical bv; + String text = g.getValue(); + v2.add(bv = (ButtonVertical) makeLeftTab(id_ANY_TAB, text).setTag(g.getKey())); + groupButtons.add(bv); + } + + groupButtons.get(0).setSelected(true); + + h1.add(v2); + + table = new ShipDesignerTable(shipBundle.getShipDesign(), discoveries); + shop = new ShipDesignerShop(table, discoveries); + ctrl = new ShipDesignerController(cursor.money); + ctrl.buildMode = cursor.buildMode; + + if(ctrl.buildMode==EBuildingMode.LOCKED) { + for(Widget w: groupButtons) { + w.setEnabled(false); + } + } + + shop.setMarginsH(0, 5); + + ctrl.addTable(shop); + ctrl.addTable(table); + + table.setDesignerGui(this); + + h1.add(shop); + h1.add(table); + + f2 = new WindowFrame(); + f2.enableShadow(false); + f2.setPadding(10, 10, 10, 10); + f2.setMinHeight(380); + f2.setBorderSize(2); + f2.setTheme(ETheme.DES_PANEL); + f2.setAlignH(Align.CENTER); + f2.setAlignV(Align.TOP); + + v2 = new LayoutV(Align.CENTER); + infoTexts = new TextDouble[4]; + + // MONEY INDICATORS + v2.add(new Gap(0,4)); + v2.add(infoTexts[0] = mkSidebarTextDouble()); + v2.add(new Gap(0,10)); + + v2.add(infoTexts[1] = mkSidebarTextDouble()); + v2.add(new Gap(0,3)); + v2.add(infoTexts[2] = mkSidebarTextDouble()); + v2.add(new Gap(0,3)); + v2.add(infoTexts[3] = mkSidebarTextDouble()); + + // TRIGGER INDICATOR + v2.add(new Gap(0,20)); + v2.add(txtControl = mkSidebarTextSimple().setColorText(RGB.RED).setTextAlign(0)); + + v2.add(new Gap(0,50)); + + Widget w; + + // ENERGY + v2.add(w=new Text("Energy System", "designer_infopanel").setColorText(white).setMargins(0, 15, 0, -6)); + if(energyLevelMax==0) w.setVisible(false); + + h2 = new LayoutH(Align.CENTER); + h2.setMargins(0, -6, 0, 0); + h2.add(bnEnDown = new Button(id_ENERGY_DOWN, "<<", "designer_infopanel")); + h2.add(txEnLevel = (Text) new Text(energyLevel+"", "designer_infopanel").setTextAlign(Align.CENTER).setColorText(green).setMinWidth(20)); + h2.add(bnEnUp = new Button(id_ENERGY_UP, ">>", "designer_infopanel")); + v2.add(h2); + if(energyLevelMax==0) { + h2.setVisible(false); + w.setVisible(false); + } + + if(ctrl.buildMode==EBuildingMode.LOCKED) { + bnEnDown.setEnabled(false); + bnEnUp.setEnabled(false); + } + + // SHIELD + v2.add(w = new Text("Force Shield", "designer_infopanel").setColorText(white).setMargins(0, 15, 0, -6)); + if(shieldLevelMax==0) w.setVisible(false); + + h2 = new LayoutH(Align.CENTER); + h2.setMargins(0, -6, 0, 0); + h2.add(bnShDown = new Button(id_SHIELD_DOWN, "<<", "designer_infopanel")); + h2.add(txShLevel = (Text) new Text(shieldLevel+"", "designer_infopanel").setTextAlign(Align.CENTER).setColorText(green).setMinWidth(20)); + h2.add(bnShUp = new Button(id_SHIELD_UP, ">>", "designer_infopanel")); + v2.add(h2); + + if(shieldLevelMax==0) { + h2.setVisible(false); + w.setVisible(false); + } + + if(ctrl.buildMode==EBuildingMode.LOCKED) { + bnShDown.setEnabled(false); + bnShUp.setEnabled(false); + } + + bnShDown.sndClick = bnShUp.sndClick = bnEnDown.sndClick = bnEnUp.sndClick = true; + + f2.add(v2); + + h1.add(f2); + + v1.add(h1); + + // LOWER NAVBAR + h1 = new LayoutH(Align.CENTER); + String texture = "designer_icons"; + RGB color = RGB.WHITE; + h1.add(bnArrang = new ButtonIcon(id_ARRANGE, texture, 0, 0).setTooltip("Editing", color)); + h1.add(bnSel = new ButtonIcon(id_SELECT, texture, 1, 0).setTooltip("Selecting", color)); + h1.add(new Gap(4,0)); + h1.add(bnSelAll = new ButtonIcon(id_SELECT_ALL, texture, 7, 0).setTooltip("Select all", color)); + h1.add(bnUnsel = new ButtonIcon(id_UNSELECT, texture, 2, 0).setTooltip("Cancel selection", color)); + h1.add(bnDel = new ButtonIcon(id_DELETE, texture, 4, 1).setTooltip("Destroy", color)); + h1.add(new Gap(8,0)); + h1.add(bnLvlDn = new ButtonIcon(id_LEVEL_DOWN, texture, 4, 0).setTooltip("Level down", color)); + h1.add(bnLvlUp = new ButtonIcon(id_LEVEL_UP, texture, 3, 0).setTooltip("Level up", color)); + h1.add(new Gap(4,0)); + h1.add(bnRotCCW = new ButtonIcon(id_ROT_CCW, texture, 6, 0).setTooltip("Rotate", color)); + h1.add(bnRotCW = new ButtonIcon(id_ROT_CW, texture, 5, 0).setTooltip("Rotate", color)); + h1.add(new Gap(4,0)); + h1.add(bnMvLt = new ButtonIcon(id_MOVE_LEFT, texture, 3, 1).setTooltip("Move left", color)); + h1.add(bnMvRt = new ButtonIcon(id_MOVE_RIGHT, texture, 2, 1).setTooltip("Move right", color)); + h1.add(bnMvUp = new ButtonIcon(id_MOVE_UP, texture, 0, 1).setTooltip("Move up", color)); + h1.add(bnMvDn = new ButtonIcon(id_MOVE_DOWN, texture, 1, 1).setTooltip("Move down", color)); + h1.add(new Gap(4,0)); + h1.add(bnControls = new ButtonIcon(id_CONTROLS, texture, 5, 1).setTooltip("Controls", color)); + h1.add(new Gap(8,0)); + h1.add(bnSave = new ButtonIcon(id_SAVE, texture, 6, 1).setTooltip("Save", color)); + h1.add(bnLoad = new ButtonIcon(id_LOAD, texture, 7, 1).setTooltip("Load", color)); + + + if(ctrl.buildMode == EBuildingMode.LOCKED) { + bnDel.enabled = bnLvlUp.enabled = bnLvlDn.enabled = bnRotCCW.enabled = bnRotCW.enabled = false; + bnLoad.enabled = bnMvDn.enabled = bnMvLt.enabled = bnMvRt.enabled = bnMvUp.enabled = false; + } + + v1.add(h1); + + // size-less drag controlling widget. + v1.add(ctrl); + + frame.add(v1); + + gui.setRootWidget(frame); + + actionPerformed(frame); + + if(ctrl.buildMode==EBuildingMode.LOCKED) shop.clearSlots(); + + //@formatter:on + } + + private TextDouble mkSidebarTextDouble() { + return (TextDouble) new TextDouble(140).setFonts("designer_infopanel", "designer_infopanel").setMarginsH(2, 4).setMarginsV(-1, -1); + } + + private Text mkSidebarTextSimple() { + return (Text) new Text("", "smaller_text").setMinWidth(140).setMarginsH(2, 4).setMarginsV(-1, -1); + } + + @Override + public boolean hasBackgroundLayer() { + return false; + } + + @Override + protected void renderPanel() { + super.renderPanel(); + + if (!isTop()) return; + + txtControl.setText(ctrl.pieceTriggerDesc); + + // if not locked, show validity test. + if (ctrl.buildMode != EBuildingMode.LOCKED) { + txDesignStatus.setText(table.lastErrorFound.getString()); + if (!table.lastErrorFound.isValid()) { + txDesignStatus.setColorText(red); + } else { + txDesignStatus.setColorText(green); + } + } else { + txDesignStatus.setText("Design is locked."); + txDesignStatus.setColorText(orange); + } + + // if locked or free, hide all sidebar texts. + if (ctrl.buildMode == EBuildingMode.LOCKED || ctrl.buildMode == EBuildingMode.FREE) { + txDesignStatus.text = ""; + + for (int cnt = 0; cnt < infoTexts.length; cnt++) { + infoTexts[cnt].eraseTexts(); + } + + if (ctrl.buildMode == EBuildingMode.FREE) { + infoTexts[0].setTextLeft("Free building mode.", orange); + } + + return; + } + + + // update context info. + // label, text, color + ArrayList> infos = new ArrayList>(); + + + infos.add(new Struct3("Your Cash", StringUtils.formatInt(ctrl.getTotalMoney()), orange)); + + if (ctrl.infoIsBought) { + if (ctrl.infoValue) { + infos.add(new Struct3("Piece value", StringUtils.formatInt(ctrl.infoValueCost), green)); + } + + if (ctrl.infoRepair) { + infos.add(new Struct3("Repair", StringUtils.formatInt(ctrl.infoRepairCost), red)); + } else { + if (ctrl.infoUpgrade) { + infos.add(new Struct3("Upgrade", StringUtils.formatInt(ctrl.infoUpgradeCost), blue)); + } + if (ctrl.infoDowngrade) { + infos.add(new Struct3("Downgrade", StringUtils.formatInt(ctrl.infoDowngradeCost), purple)); + } + } + } else { + if (ctrl.infoBuy) { + infos.add(new Struct3("Price", StringUtils.formatInt(ctrl.infoBuyCost), blue)); + } + if (ctrl.infoUpgrade) { + infos.add(new Struct3("Upgrade", StringUtils.formatInt(ctrl.infoUpgradeCost), blue)); + } + if (ctrl.infoDowngrade) { + infos.add(new Struct3("Downgrade", StringUtils.formatInt(ctrl.infoDowngradeCost), purple)); + } + } + if (!ctrl.isDragging()) { + + if (bnEnUp.lastRenderHover && bnEnUp.isEnabled()) { + int n = PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), energyLevel, energyLevel + 1); + infos.add(new Struct3("Upgrade", StringUtils.formatInt(n), blue)); + } + + if (bnEnDown.lastRenderHover && bnEnDown.isEnabled()) { + int n = PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), energyLevel, energyLevel - 1); + infos.add(new Struct3("Downgrade", StringUtils.formatInt(n), purple)); + } + + if (bnShUp.lastRenderHover && bnShUp.isEnabled()) { + int n = PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), shieldLevel, shieldLevel + 1); + infos.add(new Struct3("Upgrade", StringUtils.formatInt(n), blue)); + } + + if (bnShDown.lastRenderHover && bnShDown.isEnabled()) { + int n = PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), shieldLevel, shieldLevel - 1); + infos.add(new Struct3("Downgrade", StringUtils.formatInt(n), purple)); + } + + } + + for (int cnt = 0; cnt < infoTexts.length; cnt++) { + if (cnt < infos.size()) { + Struct3 info = infos.get(cnt); + infoTexts[cnt].setTextLeft(info.a, white).setTextRight(info.b, info.c); + } else { + infoTexts[cnt].setTextLeft("", white).setTextRight("", white); + } + } + + } + + @Override + public void actionPerformed(Widget widget) { + + int id = widget.getId(); + + if (ctrl.buildMode == EBuildingMode.LOCKED && id == id_ANY_TAB) { + return; + } + + CoordI move; + + switch (id) { + case id_ANY_TAB: + String group = widget.getTag(); + shop.fillWithPieceGroup(group); + + for (ButtonVertical b : groupButtons) { + b.setSelected(false); + } + + ((ButtonVertical) widget).setSelected(true); + + break; + + case id_PLAY: + + EShipStructureError e = table.checkDesign(); + + if (e.isValid()) { + + PieceBundle[][] pieces = table.exportShipDesign(); + cursor.shipBundle = new ShipBundle(pieces, shieldLevel, energyLevel); + cursor.money = ctrl.getTotalMoney(); + if (!context.levelBundle.hadDefaultShip || cursor.buildMode == EBuildingMode.LOCKED) context.saveCursorInBundle(); + + context.saveShipToFile(); + + app.replaceScreen(new ScreenGame(context)); + + } else { + + PanelDialogModal p = new PanelDialogModal(screen, null, -1, true, e.getDescription(), "OK"); + openPanel(p); + + } + + break; + + case id_LOAD: + if (cursor.buildMode == EBuildingMode.LOCKED) { + break; + } + + openPanel(new PanelShipLoad(screen, new IShipLoadDialogListener() { + + @Override + public void onFileSelected(File inFile) { + + try { + + PieceBundle[][] pieces = table.exportShipDesign(); + int cost = new ShipBundle(pieces, shieldLevel, energyLevel).getTotalCost(); + + cursor.money = ctrl.getTotalMoney() + cost; + + if (inFile == null) { + // empty design requested... + cursor.shipBundle = new ShipBundle(new PieceBundle[1][1], 1, 1); + cursor.shipBundle.reduceForDiscoveryTable(cursor.discoveryTable); + } else { + // load ship + cursor.shipBundle.xmlFromStream(new FileInputStream(inFile)); + + // reduce for discovery table and cost + cursor.shipBundle.reduceForDiscoveryTable(cursor.discoveryTable); + + if (cursor.buildMode != EBuildingMode.FREE) { + cursor.shipBundle.reduceForTotalCost(cursor.money); + // pay for new ship + cursor.money -= cursor.shipBundle.getTotalCost(); + } + + } + + // save to context + context.saveCursor(); + + // reload designer + App.inst.replaceScreen(new ScreenDesigner()); + + } catch (Exception e) { + Log.e("Error loading file.", e); + + Panel p = new PanelDialogModal(screen, null, -1, true, "Loading failed.\n" + e.getMessage(), "OK"); + PanelDesigner.this.openPanel(p); + } + } + + })); + + break; + + case id_SAVE: + final ShipBundle currentShip = new ShipBundle(table.exportShipDesign(), shieldLevel, energyLevel); + + openPanel(new PanelShipSave(screen, new IShipSaveDialogListener() { + + @Override + public void onFileSelected(File outFile) { + try { + currentShip.xmlToStream(new FileOutputStream(outFile)); + } catch (Exception e) { + Log.e("Error saving file.", e); + + Panel p = new PanelDialogModal(screen, null, -1, true, "The ship could not be saved.\n" + e.getMessage(), "OK"); + openPanel(p); + } + } + + })); + + break; + + case id_BACK: + cursor.shipBundle = new ShipBundle(table.exportShipDesign(), shieldLevel, energyLevel); + cursor.money = ctrl.getTotalMoney(); + if (!context.levelBundle.hadDefaultShip || cursor.buildMode == EBuildingMode.LOCKED) context.saveCursorInBundle(); + app.replaceScreen(new ScreenLevels()); + break; + + case id_SHIELD_DOWN: + if (shieldLevel > 1) { + int mny = Math.abs(PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), shieldLevel, shieldLevel - 1)); + ctrl.addMoney(mny); + shieldLevel--; + txShLevel.setText(shieldLevel + ""); + + } + break; + + case id_SHIELD_UP: + if (shieldLevel < shieldLevelMax) { + int mny = Math.abs(PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), shieldLevel, shieldLevel + 1)); + if (ctrl.hasMoney(mny)) { + ctrl.consumeMoney(mny); + shieldLevel++; + txShLevel.setText(shieldLevel + ""); + } + } + break; + + case id_ENERGY_DOWN: + if (energyLevel > 1) { + int mny = Math.abs(PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), energyLevel, energyLevel - 1)); + ctrl.addMoney(mny); + energyLevel--; + txEnLevel.setText(energyLevel + ""); + } + break; + + case id_ENERGY_UP: + if (energyLevel < energyLevelMax) { + int mny = Math.abs(PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), energyLevel, energyLevel + 1)); + if (ctrl.hasMoney(mny)) { + ctrl.consumeMoney(mny); + energyLevel++; + txEnLevel.setText(energyLevel + ""); + } + } + break; + + case id_ARRANGE: + if (table.getEditMode() == EdMode.ARRANGE) break; + ctrl.cancelDrag(); + table.setEditMode(EdMode.ARRANGE); + bnArrang.setSelected(true); + bnSel.setSelected(false); + bnDel.setSelected(false); + break; + + case id_SELECT: + if (table.getEditMode() == EdMode.SELECT) break; + ctrl.cancelDrag(); + table.setEditMode(EdMode.SELECT); + bnArrang.setSelected(false); + bnSel.setSelected(true); + bnDel.setSelected(false); + break; + + case id_SELECT_ALL: + table.selectAll(); + break; + + case id_UNSELECT: + table.unselectAll(); + break; + + case id_LEVEL_UP: + if (ctrl.buildMode == EBuildingMode.LOCKED) break; + if (ctrl.isDragging()) { + table.levelChangeDragged(1); + } else { + table.levelChangeSelected(1); + } + break; + + case id_LEVEL_DOWN: + if (ctrl.buildMode == EBuildingMode.LOCKED) break; + if (ctrl.isDragging()) { + table.levelChangeDragged(-1); + } else { + table.levelChangeSelected(-1); + } + break; + + case id_ROT_CCW: + if (ctrl.buildMode == EBuildingMode.LOCKED) break; + if (ctrl.isDragging()) { + table.rotatePiece(ctrl.getDragged(), 1); + } else { + table.rotateSelected(1); + } + break; + + case id_ROT_CW: + if (ctrl.buildMode == EBuildingMode.LOCKED) break; + if (ctrl.isDragging()) { + table.rotatePiece(ctrl.getDragged(), -1); + } else { + table.rotateSelected(-1); + } + break; + + case id_MOVE_UP: + if (ctrl.buildMode == EBuildingMode.LOCKED) break; + move = new CoordI(0, -1); + if (table.isAnySelected()) { + table.moveSelected(move); + } else { + table.moveAll(move); + } + break; + + case id_MOVE_DOWN: + if (ctrl.buildMode == EBuildingMode.LOCKED) break; + move = new CoordI(0, 1); + if (table.isAnySelected()) { + table.moveSelected(move); + } else { + table.moveAll(move); + } + break; + + case id_MOVE_LEFT: + if (ctrl.buildMode == EBuildingMode.LOCKED) break; + move = new CoordI(-1, 0); + if (table.isAnySelected()) { + table.moveSelected(move); + } else { + table.moveAll(move); + } + break; + + case id_MOVE_RIGHT: + if (ctrl.buildMode == EBuildingMode.LOCKED) break; + move = new CoordI(1, 0); + if (table.isAnySelected()) { + table.moveSelected(move); + } else { + table.moveAll(move); + } + break; + + case id_DELETE: + if (ctrl.isDragging()) { + table.sellPiece(ctrl.getDragged()); + ctrl.resetDragInfo(); + break; + } else { + deleteSelectedAsk(); + } + break; + + case id_CONTROLS: + if (ctrl.isDragging()) { + // can't set controls of dragged piece + break; + } else if (table.isAnySelected()) { + // set controls of selected pieces + + editControlsSelected(); + + } else { + // let the table handle this event. + //openPanel(new PanelDialogModal(screen, this, dlg_INFO, true, "No pieces selected!", "OK")); + } + break; + } + + boolean locked = ctrl.buildMode == EBuildingMode.LOCKED; + bnShDown.setEnabled(shieldLevel > 1 && !locked); + bnShUp.setEnabled(shieldLevel < shieldLevelMax && !locked); + + bnEnDown.setEnabled(energyLevel > 1 && !locked); + bnEnUp.setEnabled(energyLevel < energyLevelMax && !locked); + + EdMode mode = table.getEditMode(); + bnArrang.setSelected(mode == EdMode.ARRANGE); + bnSel.setSelected(mode == EdMode.SELECT); + bnDel.setSelected(mode == EdMode.DELETE); + + getRootWidget().updatePositions(); + + table.checkDesign(); + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (down) { + switch (key) { + case Keyboard.KEY_ESCAPE: + actionPerformed(bnBack); + break; + + case Keyboard.KEY_RETURN: + case Keyboard.KEY_E: + actionPerformed(bnControls); + break; + + case Keyboard.KEY_LEFT: + actionPerformed(bnMvLt); + break; + + case Keyboard.KEY_RIGHT: + actionPerformed(bnMvRt); + break; + + case Keyboard.KEY_UP: + actionPerformed(bnMvUp); + break; + + case Keyboard.KEY_DOWN: + actionPerformed(bnMvDn); + break; + + case Keyboard.KEY_DELETE: + actionPerformed(bnDel); + break; + + case Keyboard.KEY_N: + actionPerformed(bnRotCCW); + break; + + case Keyboard.KEY_M: + actionPerformed(bnRotCW); + break; + } + } + + table.checkDesign(); + } + + + public void deleteSelectedAsk() { + if (ctrl.buildMode == EBuildingMode.LOCKED) return; + + if (table.isAnySelected()) { + int count = table.selectedSlots.size(); + String msg = ""; + if (count > 1) { + msg = "Really delete " + count + " selected pieces?"; + } else { + msg = "Really delete 1 selected piece?"; + } + + IDialogListener handler = new IDialogListener() { + @Override + public void onDialogButton(int id, int btn) { + + if (btn == 1) { + table.deleteSelected(); + } + + } + }; + + openPanel(new PanelDialogModal(screen, handler, -1, true, msg, "No", "Yes").setEnterButton(1)); + } + } + + public void editControlsSelected() { + if (table.isAnySelected()) { + // set controls of selected pieces + + boolean differentTriggers = false; + boolean differentPieces = false; + TriggerBundle trigger = null; + String pieceLabel = null; + + boolean anyTriggerPresent = false; + + for (CoordI tile : table.selectedSlots) { + DraggablePiece p = table.slots[tile.y][tile.x]; + if (p != null) { + if (p.hasTrigger()) { + if (trigger != null && !trigger.equals(p.getTrigger())) differentTriggers = true; + String name = PieceRegistry.getPieceLabel(p.id); + if (pieceLabel != null && !pieceLabel.equals(name)) differentPieces = true; + trigger = p.getTrigger(); + pieceLabel = name; + anyTriggerPresent = true; + } + } + } + + if (!anyTriggerPresent) { + openPanel(new PanelDialogModal(screen, null, -1, true, "Selected pieces are passive.\nTry with weapons.", "OK")); + return; + } + + String triggerName = ""; + + if (differentPieces) pieceLabel = "Various pieces"; + if (differentTriggers) { + triggerName = "Various triggers"; + } else if (trigger != null) { + triggerName = trigger.getLabel(false); + } + + ICaptureInputDialogListener handler = new ICaptureInputDialogListener() { + @Override + public void onCaptureInputDialogClosed(int dialogId, TriggerBundle newTrigger) { + if (newTrigger == null) { + table.unselectAll(); + return; + } + + for (CoordI tile : table.selectedSlots) { + DraggablePiece p = table.slots[tile.y][tile.x]; + if (p != null) { + if (p.hasTrigger()) { + p.setTrigger(newTrigger); + } + } + } + + table.unselectAll(); + + } + }; + + + PanelDialogCaptureInput p = new PanelDialogCaptureInput(screen, handler, -1, true, pieceLabel, triggerName); + p.setColorTheme(EDialogColor.BLUE); + openPanel(p); + + + } + } +} diff --git a/src/net/sector/gui/panels/designer/PanelShipLoad.java b/src/net/sector/gui/panels/designer/PanelShipLoad.java new file mode 100644 index 0000000..d7dbc5f --- /dev/null +++ b/src/net/sector/gui/panels/designer/PanelShipLoad.java @@ -0,0 +1,285 @@ +package net.sector.gui.panels.designer; + + +import java.io.File; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import net.sector.Constants; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.dialogs.PanelDialogModal.IDialogListener; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.IWidgetFactory; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.display.TextWithBackground; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.input.Function; +import net.sector.level.SuperContext; +import net.sector.util.Align; +import net.sector.util.Log; +import net.sector.util.Utils; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; +import com.porcupine.util.FileSuffixFilter; +import com.porcupine.util.FileUtils; + + + +public class PanelShipLoad extends PanelGui { + + public static interface IShipLoadDialogListener { + public void onFileSelected(File outFile); + } + + + private static final int CANCEL = 0; + + + private CompositeScrollBox scrollBox; + private Button bnCancel; + + private EntryFactory entryFactory = new EntryFactory(); + + private IShipLoadDialogListener listener = null; + + + /** + * Game over panel + * + * @param screen the screen + * @param listener listener + */ + public PanelShipLoad(Screen screen, IShipLoadDialogListener listener) { + super(screen); + this.listener = listener; + } + + private Function onClickHandler = new Function() { + + @Override + public Boolean run(Object... args) { + Widget w = (Widget) args[0]; + + String fname = w.getTag(); + + final File path = new File(getShipDir(), fname + "." + Constants.SUFFIX_SHIP); + + if (Keyboard.isKeyDown(Keyboard.KEY_DELETE)) { + if (path.exists()) { + // delete file. + PanelDialogModal p; + + IDialogListener dialoghandler = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 0) return; + if (button == 1) { + + try { + path.delete(); + loadFiles(); + } catch (Exception e) { + Log.e("Error deleting file.", e); + } + + } + } + }; + + String msg = "Delete ship design \"" + w.getText() + "\"?"; + + p = new PanelDialogModal(screen, dialoghandler, -1, true, msg, "Cancel", "Delete"); + p.setEnterButton(1); + openPanel(p); + } + + } else { + if (listener != null) { + + if (fname.equalsIgnoreCase("///EMPTY///")) { + Log.f3("Loading empty design."); + listener.onFileSelected(null); + closePanel(); + return true; + } + + if (fname.equalsIgnoreCase("///LAST_SHIP///")) { + File path2 = SuperContext.getGameContext().levelBundle.getLastShipFile(); + Log.f3("Loading ship from file: " + path2); + listener.onFileSelected(path2); + closePanel(); + return true; + } + + if (!path.exists()) { + Log.w("File does not exist: " + path); + PanelDialogModal p = new PanelDialogModal(screen, null, -1, true, "File not found.", "OK"); + openPanel(p); + + } else { + Log.f3("Loading ship from file: " + path); + listener.onFileSelected(path); + closePanel(); + } + } + } + return true; + } + + }; + + + + private class EntryFactory implements IWidgetFactory { + + @Override + public Widget getWidget() { + return getItem(null); + } + + public Text getItem(String text, String tag, RGB color) { + Text t = new TextWithBackground(text, "small_text").setBackgroundColor(new RGB(0x479EF5)).setColorText(color); + + t.addOnClickHandler(onClickHandler); + t.setPadding(6, 4); + t.setMargins(2, 1, 2, 1); + t.setTextAlign(Align.LEFT); + t.setMinWidth(400); + + t.setTag(tag); + + return t; + + } + + public Text getItem(File file) { + String text = ""; + String tag = ""; + RGB color = RGB.WHITE; + + if (file != null) { + text = FileUtils.removeExtension(file); + tag = FileUtils.removeExtension(file); + } + + return getItem(text, tag, color); + } + } + + + @Override + public void initGui(GuiRoot root) { + + + //@formatter:off + WindowFrame frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Load ship design", "dialog_heading").setMarginsV(10, 15)); + v.add(new Text("Click design to load.", "small_text")); + v.add(new Text("Delete+click to delete files.", "small_text").setColorText(new RGB(0xffffff,0.6))); + + + scrollBox = new CompositeScrollBox(8, entryFactory); + + v.add(scrollBox); + + LayoutH h = new LayoutH(Align.CENTER); + h.add(bnCancel = new Button(CANCEL, "Cancel", "small_text")); + v.add(h); + + frame.add(v); + + root.setRootWidget(frame); + + //@formatter:on + + loadFiles(); + } + + private File getShipDir() { + return Utils.getGameSubfolder(Constants.DIR_SHIPS); + } + + private void loadFiles() { + scrollBox.removeAll(); + + List files = FileUtils.listFolder(getShipDir(), new FileSuffixFilter(Constants.SUFFIX_SHIP)); + + Comparator fc = new Comparator() { + @Override + public int compare(File o1, File o2) { + return o1.getName().compareTo(o2.getName()); + } + }; + + Collections.sort(files, fc); + + // SuperContext.getGameContext().levelBundle.getLastShipFile() + if (SuperContext.getGameContext().levelBundle.getLastShipFile().exists()) { + scrollBox.addItem(entryFactory.getItem("[Last Used Ship]", "///LAST_SHIP///", RGB.ORANGE)); + } + scrollBox.addItem(entryFactory.getItem("[Empty]", "///EMPTY///", RGB.ORANGE)); + + for (File f : files) { + scrollBox.addItem(entryFactory.getItem(f)); + } + + scrollBox.refresh(); + } + + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + if (widget.id == CANCEL) { + closePanel(); + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnCancel); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/designer/PanelShipSave.java b/src/net/sector/gui/panels/designer/PanelShipSave.java new file mode 100644 index 0000000..2b20420 --- /dev/null +++ b/src/net/sector/gui/panels/designer/PanelShipSave.java @@ -0,0 +1,295 @@ +package net.sector.gui.panels.designer; + + +import java.io.File; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import net.sector.Constants; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.dialogs.PanelDialogModal.IDialogListener; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.IWidgetFactory; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.display.TextWithBackground; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.TextInput; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.input.Function; +import net.sector.util.Align; +import net.sector.util.Log; +import net.sector.util.Utils; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; +import com.porcupine.util.FileSuffixFilter; +import com.porcupine.util.FileUtils; + + + +public class PanelShipSave extends PanelGui { + + public static interface IShipSaveDialogListener { + public void onFileSelected(File outFile); + } + + + private static final int CANCEL = 0; + private static final int SAVE = 1; + private static final int EDIT = 2; + + + private CompositeScrollBox scrollBox; + private TextInput edFilename; + private Button bnCancel; + private Button bnSave; + private EntryFactory entryFactory = new EntryFactory(); + + private IShipSaveDialogListener listener = null; + + + /** + * Game over panel + * + * @param screen the screen + * @param listener listener + */ + public PanelShipSave(Screen screen, IShipSaveDialogListener listener) { + super(screen); + this.listener = listener; + } + + private File getShipDir() { + return Utils.getGameSubfolder(Constants.DIR_SHIPS); + } + + private Function onClickHandler = new Function() { + + @Override + public Boolean run(Object... args) { + Widget w = (Widget) args[0]; + String fname = w.getTag(); + + final File path = new File(getShipDir(), fname + ".xml"); + + if (path.exists() && Keyboard.isKeyDown(Keyboard.KEY_DELETE)) { + + // delete file. + PanelDialogModal p; + + IDialogListener dialoghandler = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 0) return; + if (button == 1) { + + try { + path.delete(); + loadFiles(); + } catch (Exception e) { + Log.e("Error deleting file.", e); + } + + } + } + }; + + String msg = "Delete ship design \"" + w.getText() + "\"?"; + + p = new PanelDialogModal(screen, dialoghandler, -1, true, msg, "Cancel", "Delete"); + p.setEnterButton(1); + openPanel(p); + + } else { + edFilename.setText(w.getTag()); + actionPerformed(edFilename); + } + return true; + } + + }; + + + + private class EntryFactory implements IWidgetFactory { + + @Override + public Widget getWidget() { + return getItem(null); + } + + public Text getItem(File file) { + Text t = new TextWithBackground("", "small_text").setBackgroundColor(new RGB(0x479EF5)); + + t.addOnClickHandler(onClickHandler); + t.setPadding(6, 4); + t.setMargins(2, 1, 2, 1); + t.setTextAlign(Align.LEFT); + t.setMinWidth(400); + + if (file != null) { + t.setText(FileUtils.removeExtension(file)); + t.setTag(FileUtils.removeExtension(file)); + } + return t; + + } + } + + + @Override + public void initGui(GuiRoot root) { + + + //@formatter:off + WindowFrame frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Save ship design", "dialog_heading").setMarginsV(10, 15)); + v.add(new Text("Delete+click to delete files.", "small_text").setColorText(new RGB(0xffffff,0.7))); + + scrollBox = new CompositeScrollBox(8, entryFactory); + + v.add(scrollBox); + v.add(edFilename = (TextInput) new TextInput(EDIT, "", "small_text").setMinWidth(440)); + + edFilename.setAllowedChars(TextInput.CHARS_FILENAME); + + LayoutV v2 = (LayoutV) new LayoutV(Align.RIGHT).setMinWidth(440); + LayoutH h = new LayoutH(Align.CENTER); + h.add(bnCancel = new Button(CANCEL, "Cancel", "small_text")); + h.add(new Gap(5,0)); + h.add(bnSave = new Button(SAVE, "OK", "small_text")); + bnSave.setEnabled(false); + h.add(new Gap(10,0)); + v2.add(h); + v.add(v2); + + frame.add(v); + + root.setRootWidget(frame); + + //@formatter:on + + loadFiles(); + } + + private void loadFiles() { + scrollBox.removeAll(); + + List files = FileUtils.listFolder(getShipDir(), new FileSuffixFilter(Constants.SUFFIX_SHIP)); + + Comparator fc = new Comparator() { + @Override + public int compare(File o1, File o2) { + return o1.getName().compareTo(o2.getName()); + } + }; + + Collections.sort(files, fc); + + for (File f : files) { + scrollBox.addItem(entryFactory.getItem(f)); + } + + scrollBox.refresh(); + } + + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + if (widget.id == EDIT) { + bnSave.setEnabled(widget.getText().length() > 0); + } + + if (widget.id == CANCEL) { + closePanel(); + return; + } + + if (widget.id == SAVE) { + String fname = edFilename.getText(); + + final File path = new File(getShipDir(), fname + "." + Constants.SUFFIX_SHIP); + + if (listener != null) { + if (path.exists()) { + + PanelDialogModal p; + + IDialogListener dialoghandler = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 0) return; + if (button == 1) { + + listener.onFileSelected(path); + closePanel(); + + } + } + }; + + String msg = "The file already exists!"; + + p = new PanelDialogModal(screen, dialoghandler, -1, true, msg, "Cancel", "Overwrite"); + p.setEnterButton(1); + openPanel(p); + + } else { + listener.onFileSelected(path); + closePanel(); + } + } + + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnCancel); + } + + if (key == Keyboard.KEY_RETURN && down) { + actionPerformed(bnSave); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/dialogs/EDialogColor.java b/src/net/sector/gui/panels/dialogs/EDialogColor.java new file mode 100644 index 0000000..cd26a98 --- /dev/null +++ b/src/net/sector/gui/panels/dialogs/EDialogColor.java @@ -0,0 +1,6 @@ +package net.sector.gui.panels.dialogs; + + +public enum EDialogColor { + GREEN, BLUE; +} diff --git a/src/net/sector/gui/panels/dialogs/PanelDialogCaptureInput.java b/src/net/sector/gui/panels/dialogs/PanelDialogCaptureInput.java new file mode 100644 index 0000000..3340827 --- /dev/null +++ b/src/net/sector/gui/panels/dialogs/PanelDialogCaptureInput.java @@ -0,0 +1,185 @@ +package net.sector.gui.panels.dialogs; + + +import net.sector.gui.panels.Panel; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.input.EInput; +import net.sector.input.TriggerBundle; +import net.sector.sounds.Sounds; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Capture input dialog - set controls + * + * @author MightyPork + */ +public class PanelDialogCaptureInput extends PanelGui { + /** + * Dialog click handler + * + * @author MightyPork + */ + public interface ICaptureInputDialogListener { + /** + * on dialog closed by button press + * + * @param dialogId id of the dialog used + * @param newTrigger new trigger, or null if ESC was pressed. + */ + public void onCaptureInputDialogClosed(int dialogId, TriggerBundle newTrigger); + } + + private ICaptureInputDialogListener listener; + private int id = -1; + private String curTriggerDescr; + private String txtSetFor; + private boolean isStatic = false; + private Text txWaiting; + + private boolean doneWaiting = false; + private long waitingStartTime = 0; + private TriggerBundle newTrigger; + + private EDialogColor color = EDialogColor.GREEN; + + /** + * Set color theme + * + * @param color color + * @return this + */ + public Panel setColorTheme(EDialogColor color) { + this.color = color; + return this; + } + + /** + * Create capture input dialog + * + * @param screen parent screen + * @param listener onButton listener (handles user input) + * @param id id + * @param isStatic trigger is static (not event, but analog) + * @param setFor name of what the trigger is set for + * @param curTriggerDescr current trigger description (getLabel) + */ + public PanelDialogCaptureInput(Screen screen, ICaptureInputDialogListener listener, int id, boolean isStatic, String setFor, + String curTriggerDescr) { + super(screen); + this.curTriggerDescr = curTriggerDescr; + this.listener = listener; + this.id = id; + this.txtSetFor = setFor; + this.isStatic = isStatic; + } + + @Override + public void initGui(GuiRoot gui) { + WindowFrame frame = (WindowFrame) new WindowFrame().setTheme(ETheme.BLUE_FRAME); + frame.setPadding(10, 10, 10, 10); + frame.enableShadow(true); + + switch (color) { + case GREEN: + frame.setTheme(ETheme.GREEN_FRAME); + break; + case BLUE: + frame.setTheme(ETheme.BLUE_FRAME); + break; + } + + LayoutV v = new LayoutV(Align.CENTER); + v.setMinWidth(350); + v.add(new Text("Set control trigger for:", "smaller_text").setColorText(RGB.WHITE)); + v.add(new Text(txtSetFor, "small_text").setColorText(RGB.GREEN)); + v.add(new Gap(0, 8)); + v.add(new Text("Current trigger:", "smaller_text").setColorText(RGB.WHITE)); + v.add(new Text(curTriggerDescr, "small_text").setColorText(RGB.YELLOW)); + v.add(new Gap(0, 12)); + v.add(new Text("Press button or key to set trigger.\nPress ESC to cancel.", "smaller_text").setColorText(RGB.WHITE)); + v.add(new Gap(0, 6)); + v.add(txWaiting = new Text("[waiting for input]", "small_text").setColorText(RGB.ORANGE)); + frame.add(v); + + gui.setRootWidget(frame); + + Sounds.beep_popup.playEffect(1.5f, 0.2f, false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + @Override + public void actionPerformed(Widget widget) {} + + + @Override + public void update() { + super.update(); + + if (doneWaiting && System.currentTimeMillis() > waitingStartTime + 700) { + closePanel(); + listener.onCaptureInputDialogClosed(id, newTrigger); + } + } + + @Override + public void onKey(int key, char c, boolean down) { + if (!down) return; + if (doneWaiting) return; + + if (key == Keyboard.KEY_ESCAPE) { + closePanel(); + listener.onCaptureInputDialogClosed(id, null); + return; + } + + if (isStatic) { + newTrigger = new TriggerBundle(EInput.KEY_DOWN, key); + } else { + newTrigger = new TriggerBundle(EInput.KEY_PRESS, key); + } + + doneWaiting = true; + waitingStartTime = System.currentTimeMillis(); + txWaiting.setText(newTrigger.getLabel(false)); + } + + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + if (!down) return; + if (button > 1) return; + if (doneWaiting) return; + + if (isStatic) { + newTrigger = new TriggerBundle(EInput.BTN_DOWN, button); + } else { + newTrigger = new TriggerBundle(EInput.BTN_PRESS, button); + } + + doneWaiting = true; + waitingStartTime = System.currentTimeMillis(); + txWaiting.setText(newTrigger.getLabel(false)); + } +} diff --git a/src/net/sector/gui/panels/dialogs/PanelDialogModal.java b/src/net/sector/gui/panels/dialogs/PanelDialogModal.java new file mode 100644 index 0000000..6da6abc --- /dev/null +++ b/src/net/sector/gui/panels/dialogs/PanelDialogModal.java @@ -0,0 +1,178 @@ +package net.sector.gui.panels.dialogs; + + +import net.sector.gui.panels.Panel; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.sounds.Sounds; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +/** + * Main menu panel + * + * @author MightyPork + */ +public class PanelDialogModal extends PanelGui { + + /** + * Dialog click handler + * + * @author MightyPork + */ + public interface IDialogListener { + /** + * on dialog closed by button press + * + * @param dialogId id of the dualog used + * @param button button index, or -1 on ESC + */ + public void onDialogButton(int dialogId, int button); + } + + private String text; + private String[] buttons; + private IDialogListener listener; + private boolean cancellable = true; + private int id = -1; + + private int enterIndex = -1; + + public PanelDialogModal setEnterButton(int index) { + enterIndex = index; + return this; + } + + private EDialogColor color = EDialogColor.BLUE; + + /** + * Set color theme + * + * @param index 0 = green, 1 = blue + * @return this + */ + public Panel setColorTheme(EDialogColor color) { + this.color = color; + return this; + } + + /** + * Create modal dialog + * + * @param screen parent screen + * @param listener onButton listenner (handles user input) + * @param id id + * @param cancellable can be cancelled by ESC (listener gets -1) + * @param text shown text + * @param buttons button texts, IDs 0,1,2... + */ + public PanelDialogModal(Screen screen, IDialogListener listener, int id, boolean cancellable, String text, String... buttons) { + super(screen); + this.text = text; + this.buttons = buttons; + this.listener = listener; + this.cancellable = cancellable; + this.id = id; + } + + @Override + public void initGui(GuiRoot gui) { + WindowFrame frame = new WindowFrame(); + + switch (color) { + case GREEN: + frame.setTheme(ETheme.GREEN_FRAME); + break; + case BLUE: + frame.setTheme(ETheme.BLUE_FRAME); + break; + } + + frame.setPadding(10, 10, 15, 15); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + v.add(new Text(text, "small_text")); + + LayoutH h = new LayoutH(Align.CENTER); + int i = 0; + for (String s : buttons) { + Button btn = new Button(i++, s, "small_menu"); + + switch (color) { + case GREEN: + btn.setTheme(ETheme.GREEN); + break; + case BLUE: + btn.setTheme(ETheme.BLUE); + break; + } + + btn.setMinWidth(80); + btn.setMarginsH(10, 10); + h.add(btn); + } + v.add(h); + + frame.add(v); + + gui.setRootWidget(frame); + + Sounds.beep_popup.playEffect(1, 0.2f, false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + + @Override + public void actionPerformed(Widget widget) { + if (widget instanceof Button) { + closePanel(); + if (listener != null) listener.onDialogButton(id, widget.getId()); + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (cancellable && down && key == Keyboard.KEY_ESCAPE) { + closePanel(); + if (listener != null) listener.onDialogButton(id, -1); + return; + } + + if ((enterIndex != -1 || buttons.length == 1) && down && (key == Keyboard.KEY_RETURN || key == Keyboard.KEY_NUMPADENTER)) { + closePanel(); + + if (listener != null) { + if (enterIndex != -1) { + listener.onDialogButton(id, enterIndex); + } else if (buttons.length == 1) { + listener.onDialogButton(id, 0); + } + } + return; + } + } +} diff --git a/src/net/sector/gui/panels/game/PanelGame.java b/src/net/sector/gui/panels/game/PanelGame.java new file mode 100644 index 0000000..037e476 --- /dev/null +++ b/src/net/sector/gui/panels/game/PanelGame.java @@ -0,0 +1,510 @@ +package net.sector.gui.panels.game; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.App; +import net.sector.Constants; +import net.sector.GameConfig; +import net.sector.entities.player.EntityPlayerShip; +import net.sector.fonts.FontManager; +import net.sector.gui.panels.Panel; +import net.sector.gui.screens.ScreenGame; +import net.sector.input.EInput; +import net.sector.input.InputTriggerGroup; +import net.sector.input.Routine; +import net.sector.level.ELevel; +import net.sector.level.GameContext; +import net.sector.level.GameCursor; +import net.sector.level.SuperContext; +import net.sector.level.sequence.HudMessage; +import net.sector.level.ship.PieceRegistry; +import net.sector.level.ship.modules.pieces.Piece; +import net.sector.sounds.Sounds; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.util.StringUtils; + + +/** + * panel animating the 3D game + * + * @author MightyPork + */ +public class PanelGame extends Panel { + + // soft area + private static final double moveZoneX = 6; + private static final double moveZoneZ = 6; + //border around soft area + private static final double moveBrd = 1.5; + // z offset of min Z coords + private static final double moveMinZ = 2; + + + private static final Coord SHIP_MIN_H = new Coord(-moveZoneX / 2 - moveBrd, 0, moveMinZ); + private static final Coord SHIP_MAX_H = new Coord(moveZoneX / 2 + moveBrd, 0, moveMinZ + moveZoneZ + 2 * moveBrd); + + private static final Coord SHIP_MIN_S = new Coord(-moveZoneX / 2, 0, moveMinZ + moveBrd); + private static final Coord SHIP_MAX_S = new Coord(moveZoneX / 2, 0, moveMinZ + moveZoneZ + moveBrd); + private static final double BORDER_SLOWDOWN = 0.25; + + private ScreenGame screenGame = null; + + private EntityPlayerShip ship; + + private static boolean enableOverlay = true; + private static boolean enableDamageDisplay = true; + private static boolean enableDebugOverlay = false; + + private GameContext context; + private GameCursor cursor; + + private String hudMessage = null; + private int hudTicks = 0; + private double hudAlpha = 0; + + private InputTriggerGroup triggers = new InputTriggerGroup(); + + // functions. + private class FnPause implements Routine { + @Override + public void run() { + PanelGame.this.openPanel(new PanelGamePause(screenGame)); + } + } + + private class FnToggleOverlay implements Routine { + @Override + public void run() { + enableOverlay ^= true; + } + } + + private class FnToggleDamageDisplay implements Routine { + @Override + public void run() { + enableDamageDisplay ^= true; + } + } + + private class FnToggleDebugOverlay implements Routine { + @Override + public void run() { + enableDebugOverlay ^= true; + } + } + + private class FnToggleColiderWireframe implements Routine { + @Override + public void run() { + GameConfig.colliderWireframe ^= true; + } + } + + private class FnAngleCenter implements Routine { + @Override + public void run() { + ship.rotationCenterRequested = true; + } + } + + private class FnAngleLeft implements Routine { + @Override + public void run() { + if (ship.rotAngle.get() < EntityPlayerShip.MAXROT) ship.angleInc += 5; + } + } + + private class FnAngleRight implements Routine { + @Override + public void run() { + if (ship.rotAngle.get() > -EntityPlayerShip.MAXROT) ship.angleInc += -5; + } + } + + + /** + * Panel for game + * + * @param screen container screen + * @param context ship bundle + */ + public PanelGame(ScreenGame screen, GameContext context) { + super(screen); + + this.context = context; + this.cursor = context.getCursor(); + + screenGame = screen; + ship = new EntityPlayerShip(new Coord(0, 0, moveMinZ + moveZoneZ / 2), cursor); + + Routine f = null; + + // pause key + triggers.addTrigger(f = new FnPause(), EInput.KEY_PRESS, Keyboard.KEY_ESCAPE); + triggers.addTrigger(f, EInput.KEY_PRESS, Keyboard.KEY_PAUSE); + triggers.addTrigger(f, EInput.KEY_PRESS, Keyboard.KEY_P); + + //toggle overlay + triggers.addTrigger(new FnToggleOverlay(), EInput.KEY_PRESS, Keyboard.KEY_F4); + triggers.addTrigger(new FnToggleDamageDisplay(), EInput.KEY_PRESS, Keyboard.KEY_F3); + triggers.addTrigger(new FnToggleColiderWireframe(), EInput.KEY_PRESS, Keyboard.KEY_F8); + triggers.addTrigger(new FnToggleDebugOverlay(), EInput.KEY_PRESS, Keyboard.KEY_F7); + + triggers.addTrigger(new FnAngleCenter(), EInput.BTN_DOWN, 2); + + triggers.addTrigger(new FnAngleLeft(), EInput.SCROLL, 1); + triggers.addTrigger(new FnAngleRight(), EInput.SCROLL, -1); + + + } + + @Override + public void onCreate() { + + scene.add(ship); + scene.update(); + + // init level controller, set scene. + cursor.getLevel().setScene(scene); + cursor.getLevel().reset(); + } + + @Override + public void onClose() {} + + @Override + public boolean hasBackgroundLayer() { + return false; + } + + @Override + public boolean isDeltaEnabled() { + return true; + } + + @Override + protected void renderPanel() { + if (!enableOverlay) return; + + double fs2 = App.isFullscreen() ? 2 : 1; + + FontManager.setFullscreenDoubleSize(true); + + int scoreW = (int) FontManager.width("score", "000000"); + int scoreH = (int) FontManager.height("score") + (int) FontManager.height("score_label"); + + double winW = App.inst.getSize().x; + double winH = App.inst.getSize().y; + + double barH = 10 * fs2; + double barMargin = 10 * fs2; + double barW = winW - barMargin * 2 - scoreW; + double barPadding = 2 * fs2; + + Coord barBoxMin = new Coord(barMargin, winH - barMargin - barH); + Coord barBoxMax = new Coord(barMargin + barW, winH - barMargin); + + + // energy line + glColor3d(0, 0.3, 0); + RenderUtils.quadCoord(barBoxMin, barBoxMax); + + RGB dark = new RGB(0, 0.6, 0); + RGB light = new RGB(0, 1, 0); + + double ratio = ship.body.energySystem.getStorageRatio(); + Coord lower = barBoxMin.add(barPadding, barPadding); + Coord higher = barBoxMin.add((barW - barPadding * 2) * ratio, barH - barPadding); + + RenderUtils.quadCoordGradVBilinear(lower, higher, dark, light); + + + // render shield bar only if shield is discovered. + if (ship.body.shieldSystem.level > 0 && ship.body.shieldSystem.getLoadRatio() > 0) { + + barBoxMin.sub_ip(0, barH + barPadding); + barBoxMax.sub_ip(0, barH + barPadding); + + // shield line + glColor3d(0, 0, 0.5); + RenderUtils.quadCoord(barBoxMin, barBoxMax); + + dark = new RGB(0.2, 0.2, 0.7); + light = new RGB(0.3, 0.3, 1); + + ratio = ship.body.shieldSystem.getLoadRatio(); + lower = barBoxMin.add(barPadding, barPadding); + higher = barBoxMin.add((barW - barPadding * 2) * ratio, barH - barPadding); + + RenderUtils.quadCoordGradVBilinear(lower, higher, dark, light); + } + + double dist = 12; + double size = 10; + double sizeSmall = 8; + + if (App.isFullscreen()) { + dist *= 2; + size *= 2; + sizeSmall *= 2; + } + + if (enableDamageDisplay && deathTimer == -1) { + glPushMatrix(); + glTranslated((winW - dist * 6), winH - (scoreH + 20 + dist * 6), 0); + glRotated(ship.rotAngle.d, 0, 0, 1); + for (Piece p : ship.body.allPieces) { + if (p.isDead) continue; + + Coord offset = p.getRelativeCoordToCenter(); + offset.y = offset.z; + offset.z = 0; + + RGB color = PieceRegistry.getDamageColor(p.getHealth(), p.getHealthMax()); + color.setAlpha_ip(0.7); + RenderUtils.setColor(color); + + double sz = (p.isBody() ? size : sizeSmall); + + glPushMatrix(); + RenderUtils.translate(offset.mul(dist)); + RenderUtils.quadCoord(new Coord(-sz / 2, -sz / 2), new Coord(sz / 2, sz / 2)); + glPopMatrix(); + } + glPopMatrix(); + } + + glColor3d(1, 1, 1); + + glEnable(GL_TEXTURE_2D); + + Coord s = app.getSize(); + Coord pos = s.copy(); + FontManager.setAlign(Align.RIGHT); + pos.x -= 10 * fs2; + pos.y -= FontManager.height("score_label"); + FontManager.draw(pos, "Score", "score_label", new RGB(1, 0, 0)); + pos.y -= FontManager.height("score"); + FontManager.draw(pos, StringUtils.formatInt(cursor.scoreTotal) + "", "score", new RGB(1, 0.9, 0)); + +// // Money display for campaign +// pos.x -= 10 * fs2; +// pos.y -= FontManager.height("score_small"); +// FontManager.draw(pos, Calc.formatDotThousand(cursor.money) + "", "score_small", new RGB(1, 0, 0.9)); + + if (cursor.getLevel().hasTimer()) { + pos.setTo(s); + pos.setX_ip(10 * fs2); + pos.add_ip(FontManager.width("timer", "99:99"), -50 * fs2 - FontManager.height("timer")); + FontManager.draw(pos, cursor.getLevel().getTimer().getRemainingTimeFormatted(), "timer", new RGB(1, 1, 1, 0.8), Align.RIGHT); + } + + if (hudMessage != null) { + pos.setTo(s); + pos.mul_ip(0.5); + pos.y *= 1.5; + pos.sub_ip(0, FontManager.height("hud") / 2); + FontManager.draw(pos, hudMessage, "hud", new RGB(0, 1, 0, hudAlpha), Align.CENTER); + } + + if (enableDebugOverlay) { + FontManager.setFullscreenDoubleSize(false); + FontManager.setFont("debug_info", -1); + double h = FontManager.height(); + + pos.setTo(5, 5 + h * 4 + 10); + FontManager.draw(pos, "FPS: " + app.fpsMeter.getFPS(), new RGB(1, 1, 1), -1); + pos.y -= h; + FontManager.draw(pos, "Dropped frames: " + app.fpsMeter.getDropped(), new RGB(1, 1, 1), -1); + pos.y -= h; + FontManager.draw(pos, "Particles: " + scene.particles.size(), new RGB(0, 1, 1), -1); + pos.y -= h; + FontManager.draw(pos, "Entities: " + scene.allEntities.size(), new RGB(0, 1, 0), -1); + } + + glDisable(GL_TEXTURE_2D); + FontManager.setFullscreenDoubleSize(false); + } + + @Override + public void onWindowChanged() { + Mouse.setGrabbed(false); + Mouse.poll(); + if (isTop()) Mouse.setGrabbed(true); + } + + @Override + public void onFocus() { + cursor.getLevel().resume(); + Mouse.setGrabbed(true); + Sounds.timer_loop.resumeLoop(); + Sounds.shield_loop.resumeLoop(); + } + + @Override + public void onBlur() { + cursor.getLevel().pause(); + Mouse.setGrabbed(false); + Sounds.timer_loop.pauseLoop(); + Sounds.shield_loop.pauseLoop(); + } + + @Override + public void onMouseMove(Coord pos, Vec move, int wheelDelta) { + ship.onMouseMove(pos, move, wheelDelta); + + double acceleration = ship.getAcceleration() * (GameConfig.mouseSensitivity / 1000d); + ship.getMotion().add_ip((move.x / app.getSize().x) * acceleration, 0, (move.y / app.getSize().y) * acceleration); + } + + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + if (!Mouse.isGrabbed()) Mouse.setGrabbed(true); + + ship.onMouseButton(button, down, wheelDelta, pos, deltaPos); + triggers.onMouseButton(button, down, wheelDelta, pos, deltaPos); + } + + @Override + public void onKey(int key, char c, boolean down) { + ship.onKey(key, c, down); + triggers.onKey(key, c, down); + } + + @Override + public void handleStaticInputs() { + ship.handleStaticInputs(); + triggers.handleStaticInputs(); + } + + private boolean timer_ending_sound = false; + private int deathTimer = -1; + + private void openGameOverScreen() { + if (SuperContext.selectedUser == null || App.offlineMode) { + openPanel(new PanelGameOver_Guest(screenGame)); + } else { + // registered active user + if (context.levelType == ELevel.NET) { + openPanel(new PanelGameOverShared_User(screenGame)); + } else { + openPanel(new PanelGameOver_User(screenGame)); + } + } + } + + @Override + public void update() { + if (!Display.isActive()) return; + + if (cursor.getLevel().hasTimer() && cursor.getLevel().getTimer().getRemainingTime() == 5) { + if (!timer_ending_sound) Sounds.timer_loop.playAsEffectLoop(1, 0.6f); + timer_ending_sound = true; + } + + if (cursor.getLevel().isEnded()) { + Sounds.timer_loop.stop(); + Sounds.timer_end.playAsSoundEffect(1, 0.5f, false); + openGameOverScreen(); + return; + } + + if (ship.isDead()) { + Sounds.timer_loop.stop(); + + if (deathTimer < Constants.FPS_UPDATE * 2) { + deathTimer++; + } else { + openGameOverScreen(); + } + } + + cursor.getLevel().onGameTick(); + scene.setGlobalMovement(cursor.getLevel().getGlobalMovement()); + + if (hudTicks <= 0 && hudAlpha <= 0) { + if (cursor.getLevel().hasHudMessage()) { + HudMessage hm = cursor.getLevel().getOneHudMessage(); + hudMessage = hm.text; + hudTicks = (int) (Constants.FPS_UPDATE * hm.secs); + } + } + + if (hudTicks > 0) { + hudTicks--; + if (hudAlpha < 1) hudAlpha += 0.03 * Constants.SPEED_MUL; + } else { + if (hudAlpha > 0) hudAlpha -= 0.05 * Constants.SPEED_MUL; + } + + if (hudAlpha < 0) hudAlpha = 0; + if (hudAlpha > 1) hudAlpha = 1; + + + + // limit ship movement. + + Coord pos = ship.getPos(); + pos.pushLast(); + Vec motion = ship.getMotion(); + + if (pos.x < SHIP_MIN_S.x) { + if (Calc.inRange(pos.x, SHIP_MIN_H.x, SHIP_MIN_S.x)) { + if (motion.x < 0) motion.x *= 1 - BORDER_SLOWDOWN; + } else { + pos.x = SHIP_MIN_H.x; + if (motion.x < 0) motion.x = 0; + } + } + + if (pos.x > SHIP_MAX_S.x) { + if (Calc.inRange(pos.x, SHIP_MAX_S.x, SHIP_MAX_H.x)) { + if (motion.x > 0) motion.x *= 1 - BORDER_SLOWDOWN; + } else { + pos.x = SHIP_MAX_H.x; + if (motion.x > 0) motion.x = 0; + } + } + + + if (pos.z < SHIP_MIN_S.z) { + if (Calc.inRange(pos.z, SHIP_MIN_H.z, SHIP_MIN_S.z)) { + if (motion.z < 0) motion.z *= 1 - BORDER_SLOWDOWN; + } else { + pos.z = SHIP_MIN_H.z; + if (motion.z < 0) motion.z = 0; + } + } + + if (pos.z > SHIP_MAX_S.z) { + if (Calc.inRange(pos.z, SHIP_MAX_S.z, SHIP_MAX_H.z)) { + if (motion.z > 0) motion.z *= 1 - BORDER_SLOWDOWN; + } else { + pos.z = SHIP_MAX_H.z; + if (motion.z > 0) motion.z = 0; + } + } + + pos.update(); + + scene.update(); + ship.getMotion().scale_ip(1D - ship.getDecelerate()); + + } + + + @Override + public void renderDirect3D() {} + + +} diff --git a/src/net/sector/gui/panels/game/PanelGameOverShared_User.java b/src/net/sector/gui/panels/game/PanelGameOverShared_User.java new file mode 100644 index 0000000..7d32fd0 --- /dev/null +++ b/src/net/sector/gui/panels/game/PanelGameOverShared_User.java @@ -0,0 +1,206 @@ +package net.sector.gui.panels.game; + + +import java.util.Collections; + +import net.sector.App; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.highscore.HighscoreEntryFactory; +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenDesigner; +import net.sector.gui.screens.ScreenLevels; +import net.sector.gui.screens.ScreenMenuMain; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.level.ELevel; +import net.sector.level.GameContext; +import net.sector.level.SuperContext; +import net.sector.network.communication.ServerError; +import net.sector.network.responses.ObjScoreInfo; +import net.sector.network.responses.ObjScoreList; +import net.sector.sounds.Music; +import net.sector.sounds.Sounds; +import net.sector.util.Align; +import net.sector.util.Log; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; +import com.porcupine.util.StringUtils; + + +/** + * Game over screen for Shared levels and registered user. + * + * @author MightyPork + */ +public class PanelGameOverShared_User extends PanelGui { + + private static final int RETRY = 0, GOTO_LEVELS = 1, GOTO_MAIN_MENU = 2; + + private int score; + + private CompositeScrollBox scrollBox; + + private ObjScoreList scores; + + private String lid; + + /** + * Game over panel + * + * @param screen the screen + */ + public PanelGameOverShared_User(Screen screen) { + super(screen); + GameContext ctx = SuperContext.getGameContext(); + + this.score = ctx.getCursor().scoreTotal; + + if (ctx.levelBundle.type != ELevel.NET) { + throw new RuntimeException("Cannot open PanelGameOverShared_User for local level."); + } + + if (SuperContext.selectedUser == null) { + throw new RuntimeException("Cannot open PanelGameOverShared_User for Guest user."); + } + + if (App.offlineMode) { + throw new RuntimeException("Cannot open PanelGameOverShared_User while offline."); + } + + lid = ctx.levelBundle.lid; + + scores = null; + try { + scores = SuperContext.selectedUser.submitScore(lid, score); + } catch (ServerError e) { + Log.e("Error loading scores from server.", e); + scores = new ObjScoreList(); + } + + Collections.sort(scores); + } + + + private static HighscoreEntryFactory entryFactory = HighscoreEntryFactory.instance; + + @Override + public void initGui(GuiRoot root) { + Sounds.shield_loop.stop(); + Sounds.timer_loop.stop(); + Music.playMenu(); + + + //@formatter:off + WindowFrame frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + v.add(new Text("Game over!", "gameover").setMarginsV(10, 5)); + v.add(new Text("Score: " + StringUtils.formatInt(score), "gameover_score").setColorText(new RGB(1, 0.8, 0))); + v.add(new Gap(0, 6)); + + String uid = SuperContext.selectedUser.uid; + + int position = scores.getUserPosition(uid); + + if(position == -1) { + v.add(new Text("Sorry, could not connect to highscore server.", "larger_text").setColorText(RGB.RED)); + }else { + v.add(new Text("You are "+StringUtils.numberToOrdinal(position)+" in the Universe!", "larger_text").setColorText(RGB.YELLOW)); + + if(scores.scoreImproved && scores.lastScore!=-1) { + v.add(new Text("You improved your record\n"+StringUtils.formatInt(scores.lastScore)+" to "+StringUtils.formatInt(score))); + }else if(scores.lastScore!=-1) { + v.add(new Text("You didn't beat your record: "+StringUtils.formatInt(scores.lastScore))); + } + } + + v.add(new Gap(0,10)); + + scrollBox = new CompositeScrollBox(9, entryFactory); + + v.add(scrollBox); + + LayoutH h = new LayoutH(Align.CENTER); + h.add(new Button(GOTO_MAIN_MENU, "Main menu", "small_text")); + h.add(new Gap(30, 0)); + h.add(new Button(RETRY, "Try again", "small_text")); + h.add(new Button(GOTO_LEVELS, "Select level", "small_text")); + v.add(h); + + frame.add(v); + root.setRootWidget(frame); + + printHiscore(); + //@formatter:on + } + + private void printHiscore() { + + scrollBox.removeAll(); + + Collections.sort(scores); + + int i = 1; + for (ObjScoreInfo sc : scores) { + scrollBox.addItem(entryFactory.getItem(i, sc)); + i++; + } + + scrollBox.refresh(); + } + + @Override + public void actionPerformed(Widget widget) { + if (widget.id == GOTO_LEVELS) { + app.replaceScreen(new ScreenLevels()); + return; + } + + if (widget.id == GOTO_MAIN_MENU) { + app.replaceScreen(new ScreenMenuMain()); + return; + } + + if (widget.id == RETRY) { + SuperContext.getGameContext().restoreCursor(); + app.replaceScreen(new ScreenDesigner()); + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.6); + } + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/game/PanelGameOver_Guest.java b/src/net/sector/gui/panels/game/PanelGameOver_Guest.java new file mode 100644 index 0000000..d46ccef --- /dev/null +++ b/src/net/sector/gui/panels/game/PanelGameOver_Guest.java @@ -0,0 +1,233 @@ +package net.sector.gui.panels.game; + + +import java.util.Collections; + +import net.sector.App; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.highscore.HighscoreEntryFactory; +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenDesigner; +import net.sector.gui.screens.ScreenLevels; +import net.sector.gui.screens.ScreenMenuMain; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.TextInput; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.level.ELevel; +import net.sector.level.GameContext; +import net.sector.level.SuperContext; +import net.sector.level.highscore.HighscoreEntry; +import net.sector.level.highscore.HighscoreTable; +import net.sector.network.UserProfile; +import net.sector.network.communication.LeaderboardClient; +import net.sector.network.communication.ServerError; +import net.sector.network.responses.ObjScoreList; +import net.sector.sounds.Music; +import net.sector.sounds.Sounds; +import net.sector.util.Align; +import net.sector.util.Log; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; +import com.porcupine.ion.Ion; +import com.porcupine.util.StringUtils; + + +/** + * Highscore panel for guests (net and local levels) + * + * @author MightyPork + */ +public class PanelGameOver_Guest extends PanelGui { + + private static final int OK = 0, RETRY = 1, GOTO_LEVELS = 2, GOTO_MAIN_MENU = 3; + + private int score; + + private Widget edName; + + private Button bnOk; + + private HighscoreTable table; + + private boolean hiscoreAdded = false; + + private CompositeScrollBox scrollBox; + + /** + * Game over panel + * + * @param screen the screen + */ + public PanelGameOver_Guest(Screen screen) { + super(screen); + GameContext ctx = SuperContext.getGameContext(); + + this.score = ctx.getCursor().scoreTotal; + this.table = ctx.levelBundle.getHighscoreTable(); + + if (!App.offlineMode && ctx.levelType == ELevel.NET) { + ObjScoreList netscores; + try { + netscores = LeaderboardClient.getLevelScores(ctx.levelBundle.lid); + + for (UserProfile user : SuperContext.userProfiles) { + if (user.isRemoved || !user.isLoggedIn) continue; + int userScore = netscores.getScoreForUid(user.uid); + + if (userScore != -1) { + HighscoreEntry he; + table.add(he = new HighscoreEntry(userScore, user.uname)); + he.isLocal = false; + } + } + } catch (ServerError e) { + Log.e("Error getting level scores.", e); + } + } + + } + + private static HighscoreEntryFactory scrollBoxItemFactory = HighscoreEntryFactory.instance; + + @Override + public void initGui(GuiRoot root) { + Sounds.shield_loop.stop(); + Sounds.timer_loop.stop(); + Music.playMenu(); + + //@formatter:off + WindowFrame frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + v.add(new Text("Game over!", "gameover").setMarginsV(10, 3)); + v.add(new Text("Score: " + StringUtils.formatInt(score), "gameover_score").setColorText(new RGB(1, 0.8, 0))); + v.add(new Gap(0, 4)); + + Collections.sort(table); + + int pos = 1; + for (HighscoreEntry entry : table) { + if (entry.score < score) { + break; + } + pos++; + } + + v.add(new Text("You are "+StringUtils.numberToOrdinal(pos)+" on this machine!", "larger_text").setColorText(RGB.YELLOW)); + + LayoutH h; + h = new LayoutH(Align.CENTER); + h.setMargins(5, 0, 5, 0); + h.add(new Text("Name:", "small_text")); + h.add(edName = new TextInput(-1, "", "small_text").setMinWidth(340)); + h.add(bnOk = (Button) new Button(OK, "OK", "small_text").setEnabled(false)); + v.add(h); + + if(SuperContext.selectedUser != null) { + edName.setText(SuperContext.selectedUser.uname); + bnOk.setEnabled(true); + } + + scrollBox = new CompositeScrollBox(9, scrollBoxItemFactory); + + v.add(scrollBox); + + h = new LayoutH(Align.CENTER); + h.add(new Button(GOTO_MAIN_MENU, "Main menu", "small_text")); + h.add(new Gap(30, 0)); + h.add(new Button(RETRY, "Try again", "small_text")); + h.add(new Button(GOTO_LEVELS, "Select level", "small_text")); + v.add(h); + + frame.add(v); + root.setRootWidget(frame); + + printHiscore(); + //@formatter:on + } + + private void printHiscore() { + + scrollBox.removeAll(); + + Collections.sort(table); + + int i = 1; + for (HighscoreEntry he : table) { + scrollBox.addItem(scrollBoxItemFactory.getItem(i, he)); + i++; + } + + scrollBox.refresh(); + } + + @Override + public void actionPerformed(Widget widget) { + if (!hiscoreAdded) bnOk.setEnabled(edName.getText().length() > 0); + + if (bnOk.isEnabled() && widget.id == OK) { + HighscoreEntry entry = table.addScore(score, edName.getText().trim()); + entry.justAdded = true; + table.sort(); + printHiscore(); + edName.setEnabled(false); + bnOk.setEnabled(false); + hiscoreAdded = true; + Ion.toFile(SuperContext.getGameContext().levelBundle.getHighscoreFile(), table); + return; + } + + if (widget.id == GOTO_LEVELS) { + app.replaceScreen(new ScreenLevels()); + return; + } + + if (widget.id == GOTO_MAIN_MENU) { + app.replaceScreen(new ScreenMenuMain()); + return; + } + + if (widget.id == RETRY) { + SuperContext.getGameContext().restoreCursor(); + app.replaceScreen(new ScreenDesigner()); + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.6); + } + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/game/PanelGameOver_User.java b/src/net/sector/gui/panels/game/PanelGameOver_User.java new file mode 100644 index 0000000..ff0a088 --- /dev/null +++ b/src/net/sector/gui/panels/game/PanelGameOver_User.java @@ -0,0 +1,237 @@ +package net.sector.gui.panels.game; + + +import java.util.Collections; + +import net.sector.App; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.highscore.HighscoreEntryFactory; +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenDesigner; +import net.sector.gui.screens.ScreenLevels; +import net.sector.gui.screens.ScreenMenuMain; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.level.ELevel; +import net.sector.level.GameContext; +import net.sector.level.SuperContext; +import net.sector.level.highscore.HighscoreEntry; +import net.sector.level.highscore.HighscoreTable; +import net.sector.sounds.Music; +import net.sector.sounds.Sounds; +import net.sector.util.Align; +import net.sector.util.Log; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; +import com.porcupine.ion.Ion; +import com.porcupine.util.StringUtils; + + + +/** + * Highscore panel for local levels and user. + * + * @author MightyPork + */ +public class PanelGameOver_User extends PanelGui { + + private static final int RETRY = 1, GOTO_LEVELS = 2, GOTO_MAIN_MENU = 3; + + private int score; + + private HighscoreTable table; + + private CompositeScrollBox scrollBox; + + private int lastScore; + + private boolean improvedScore; + + private int position; + + private boolean firstTime; + + /** + * Game over panel + * + * @param screen the screen + */ + public PanelGameOver_User(Screen screen) { + super(screen); + + GameContext ctx = SuperContext.getGameContext(); + + if (ctx.levelBundle.type == ELevel.NET) { + throw new RuntimeException("Cannot open PanelGameOver_User for shared level."); + } + + if (SuperContext.selectedUser == null) { + throw new RuntimeException("Cannot open PanelGameOver_User for Guest user."); + } + + if (App.offlineMode) { + Log.e("Cannot open PanelGameOver_User while offline."); + } + + this.score = ctx.getCursor().scoreTotal; + this.table = ctx.levelBundle.getHighscoreTable(); + + + String uid = SuperContext.selectedUser.uid; + + lastScore = -1; + firstTime = true; + position = -1; + + for (HighscoreEntry entry : table) { + if (entry.uid.equals(uid)) { + lastScore = entry.score; + + if (score > lastScore) { + entry.score = score; + } + + firstTime = false; + break; + } + } + + if (firstTime) { + HighscoreEntry entry = table.addScore(score, SuperContext.selectedUser.uname); + entry.uid = uid; + } + + Collections.sort(table); + + int pos = 1; + for (HighscoreEntry entry : table) { + if (entry.uid.equals(uid)) { + position = pos; + break; + } + pos++; + } + + Ion.toFile(ctx.levelBundle.getHighscoreFile(), table); + + improvedScore = score > lastScore; + } + + private static HighscoreEntryFactory scrollBoxItemFactory = HighscoreEntryFactory.instance; + + @Override + public void initGui(GuiRoot root) { + Sounds.shield_loop.stop(); + Sounds.timer_loop.stop(); + Music.playMenu(); + + //@formatter:off + WindowFrame frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + v.add(new Text("Game over!", "gameover").setMarginsV(10, 3)); + v.add(new Text("Score: " + StringUtils.formatInt(score), "gameover_score").setColorText(new RGB(1, 0.8, 0))); + v.add(new Gap(0, 6)); + + v.add(new Text("You are "+StringUtils.numberToOrdinal(position)+" on this machine!", "larger_text").setColorText(RGB.YELLOW)); + + if(!firstTime) { + if(improvedScore) { + v.add(new Text("You improved your record\n"+StringUtils.formatInt(lastScore)+" to "+StringUtils.formatInt(score))); + }else { + v.add(new Text("You didn't beat your record: "+StringUtils.formatInt(lastScore))); + } + } + + v.add(new Gap(0,6)); + + scrollBox = new CompositeScrollBox(9, scrollBoxItemFactory); + + v.add(scrollBox); + + LayoutH h = new LayoutH(Align.CENTER); + h.add(new Button(GOTO_MAIN_MENU, "Main menu", "small_text")); + h.add(new Gap(30, 0)); + h.add(new Button(RETRY, "Try again", "small_text")); + h.add(new Button(GOTO_LEVELS, "Select level", "small_text")); + v.add(h); + + frame.add(v); + root.setRootWidget(frame); + + printHiscore(); + //@formatter:on + } + + private void printHiscore() { + + scrollBox.removeAll(); + + Collections.sort(table); + + int i = 1; + for (HighscoreEntry he : table) { + scrollBox.addItem(scrollBoxItemFactory.getItem(i, he)); + i++; + } + + scrollBox.refresh(); + } + + @Override + public void actionPerformed(Widget widget) { + + if (widget.id == GOTO_LEVELS) { + app.replaceScreen(new ScreenLevels()); + return; + } + + if (widget.id == GOTO_MAIN_MENU) { + app.replaceScreen(new ScreenMenuMain()); + return; + } + + if (widget.id == RETRY) { + SuperContext.getGameContext().restoreCursor(); + app.replaceScreen(new ScreenDesigner()); + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.6); + } + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/game/PanelGamePause.java b/src/net/sector/gui/panels/game/PanelGamePause.java new file mode 100644 index 0000000..dd7eaa0 --- /dev/null +++ b/src/net/sector/gui/panels/game/PanelGamePause.java @@ -0,0 +1,181 @@ +package net.sector.gui.panels.game; + + + +import net.sector.App; +import net.sector.gui.panels.PanelConfig; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.dialogs.EDialogColor; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.dialogs.PanelDialogModal.IDialogListener; +import net.sector.gui.screens.Screen; +import net.sector.gui.screens.ScreenDesigner; +import net.sector.gui.screens.ScreenLevels; +import net.sector.gui.screens.ScreenMenuMain; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.menu.MenuButton; +import net.sector.gui.widgets.menu.MenuTitle; +import net.sector.level.SuperContext; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +/** + * Overlay panel for paused game. + * + * @author MightyPork + */ +public class PanelGamePause extends PanelGui { + + private static final int RESUME = 0; + private static final int RESTART = 1; + private static final int LEVEL_LIST = 2; + private static final int MAIN_MENU = 3; + private static final int EXIT = 4; + private static final int CFG = 5; + private MenuButton bnRestart; + private MenuButton bnResume; + + public PanelGamePause(Screen screen) { + super(screen); + } + + @Override + public void initGui(GuiRoot root) { + LayoutV v = new LayoutV(Align.CENTER); + root.setRootWidget(v); + v.add(new MenuTitle("Game paused").setMargins(0, 0, 0, 20)); + v.add(bnResume = new MenuButton(RESUME, "Resume")); + v.add(bnRestart = new MenuButton(RESTART, "Try again")); + v.add(new Gap(0, 20 * App.inst.fs2())); + v.add(new MenuButton(LEVEL_LIST, "Select level")); + v.add(new MenuButton(MAIN_MENU, "Main menu")); + v.add(new Gap(0, 20 * App.inst.fs2())); + v.add(new MenuButton(CFG, "Settings")); + v.add(new MenuButton(EXIT, "Quit")); + } + + @Override + public void actionPerformed(Widget widget) { + if (widget.id == MAIN_MENU) { + + PanelDialogModal p; + + IDialogListener listener = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 1) { + app.replaceScreen(new ScreenMenuMain()); + } + } + }; + + p = new PanelDialogModal(screen, listener, -1, true, "Abort current game\nand go to Main menu?", "No", "Yes").setEnterButton(1); + p.setColorTheme(EDialogColor.BLUE); + + openPanel(p); + return; + } + + if (widget.id == RESUME) { + closePanel(); + return; + } + + if (widget.id == RESTART) { + + PanelDialogModal p; + + IDialogListener listener = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 1) { + SuperContext.getGameContext().restoreCursor(); + app.replaceScreen(new ScreenDesigner()); + } + } + }; + + p = new PanelDialogModal(screen, listener, -1, true, "Abort current game\nand try again?", "No", "Yes").setEnterButton(1); + p.setColorTheme(EDialogColor.BLUE); + + openPanel(p); + + return; + } + + if (widget.id == LEVEL_LIST) { + + PanelDialogModal p; + + IDialogListener listener = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 1) { + app.replaceScreen(new ScreenLevels()); + } + } + }; + + p = new PanelDialogModal(screen, listener, -1, true, "Abort current game\nand go to level list?", "No", "Yes").setEnterButton(1); + p.setColorTheme(EDialogColor.BLUE); + + openPanel(p); + return; + } + + if (widget.id == CFG) { + openPanel(new PanelConfig(screen, 1)); + return; + } + + if (widget.id == EXIT) { + + PanelDialogModal p; + + IDialogListener listener = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 1) App.inst.exit(); + } + }; + + p = new PanelDialogModal(screen, listener, -1, true, "Do you really want to quit?", "No", "Yes").setEnterButton(1); + p.setColorTheme(EDialogColor.BLUE); + + openPanel(p); + + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnResume); + } + + if (key == Keyboard.KEY_R && down) { + actionPerformed(bnRestart); + } + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.7); + } + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/highscore/HighscoreEntryFactory.java b/src/net/sector/gui/panels/highscore/HighscoreEntryFactory.java new file mode 100644 index 0000000..9fbd742 --- /dev/null +++ b/src/net/sector/gui/panels/highscore/HighscoreEntryFactory.java @@ -0,0 +1,95 @@ +package net.sector.gui.panels.highscore; + + +import net.sector.gui.widgets.IWidgetFactory; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.ListItemHighscore; +import net.sector.level.SuperContext; +import net.sector.level.highscore.HighscoreEntry; +import net.sector.network.UserProfile; +import net.sector.network.responses.ObjScoreInfo; + + +/** + * Highscore entry factory + * + * @author MightyPork + */ +public class HighscoreEntryFactory implements IWidgetFactory { + + /** Instance of this factory */ + public static HighscoreEntryFactory instance = new HighscoreEntryFactory(); + + @Override + public Widget getWidget() { + return getItem(0, (HighscoreEntry) null); + } + + private ListItemHighscore getDefaultItem() { + return (ListItemHighscore) new ListItemHighscore(0, "", 0, false, false).setMargins(2, 1, 2, 1); + } + + private ListItemHighscore getItem(int position, String name, int score, boolean user, boolean active) { + return (ListItemHighscore) new ListItemHighscore(position, name, score, user, active).setMargins(2, 1, 2, 1); + } + + /** + * Get item from ObjScoreInfo + * + * @param position position in list + * @param sc ObjScoreInfo + * @return list item + */ + public ListItemHighscore getItem(int position, ObjScoreInfo sc) { + if (sc == null) { + return getDefaultItem(); + } else { + boolean active = false; + boolean user = true; + + if (SuperContext.selectedUser != null && sc.uid.equals(SuperContext.selectedUser.uid)) { + active = true; + } + + return getItem(position, sc.uname, sc.score, user, active); + } + } + + /** + * Get item from HighscoreEntry + * + * @param position position in list + * @param entry HighscoreEntry + * @return list item + */ + public ListItemHighscore getItem(int position, HighscoreEntry entry) { + if (entry == null) return getDefaultItem(); + + boolean active = false; + boolean user = false; + + // entry injected from net scores + if (!entry.isLocal) user = true; + + // check if this entry belongs to any active user + if (entry.uid.length() > 0) { + for (UserProfile user1 : SuperContext.userProfiles) { + if (user1.isRemoved || !user1.isLoggedIn) continue; + if (user1.uid.equals(entry.uid)) { + user = true; // is active user's score + break; + } + } + + // check if this score belongs to the selected user + if (SuperContext.selectedUser != null && entry.uid.equals(SuperContext.selectedUser.uid)) { + active = true; + } + } + + if (entry.justAdded) active = true; + + return getItem(position, entry.name, entry.score, user, active); + } + +} diff --git a/src/net/sector/gui/panels/highscore/PanelHiscoreLocal.java b/src/net/sector/gui/panels/highscore/PanelHiscoreLocal.java new file mode 100644 index 0000000..8254ae3 --- /dev/null +++ b/src/net/sector/gui/panels/highscore/PanelHiscoreLocal.java @@ -0,0 +1,134 @@ +package net.sector.gui.panels.highscore; + + +import net.sector.gui.panels.PanelGui; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.level.LevelBundle; +import net.sector.level.highscore.HighscoreEntry; +import net.sector.level.highscore.HighscoreTable; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +/** + * Highscore panel for local and internal levels + * + * @author MightyPork + */ +public class PanelHiscoreLocal extends PanelGui { + + private static final int BACK = 0; + + private HighscoreTable table; + + private CompositeScrollBox scrollBox; + + private LevelBundle level; + + private Button bnClose; + + /** + * Game over panel + * + * @param screen the screen + * @param level level bundle + */ + public PanelHiscoreLocal(Screen screen, LevelBundle level) { + super(screen); + this.level = level; + this.table = level.getHighscoreTable(); + if (table == null) table = new HighscoreTable(); + table.sort(); + } + + private static HighscoreEntryFactory entryFactory = HighscoreEntryFactory.instance; + + @Override + public void initGui(GuiRoot root) { + //@formatter:off + WindowFrame frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text(level.title, "highscore_level_name").setColorText(new RGB(0xFFFF00)).setMarginsV(10, 15)); + + scrollBox = new CompositeScrollBox(10, entryFactory); + + v.add(scrollBox); + + LayoutH h = new LayoutH(Align.CENTER); + h.add(bnClose = new Button(BACK, "Back", "small_text")); + v.add(h); + + frame.add(v); + + root.setRootWidget(frame); + + printHiscore(); + //@formatter:on + } + + private void printHiscore() { + + scrollBox.removeAll(); + + int i = 1; + for (HighscoreEntry he : table) { + scrollBox.addItem(entryFactory.getItem(i, he)); + i++; + } + + scrollBox.refresh(); + } + + @Override + public void actionPerformed(Widget widget) { + if (widget.id == BACK) { + closePanel(); + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnClose); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/highscore/PanelHiscoreShared.java b/src/net/sector/gui/panels/highscore/PanelHiscoreShared.java new file mode 100644 index 0000000..5eb4bfd --- /dev/null +++ b/src/net/sector/gui/panels/highscore/PanelHiscoreShared.java @@ -0,0 +1,216 @@ +package net.sector.gui.panels.highscore; + + +import java.util.Collections; + +import net.sector.App; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.RadioButton; +import net.sector.gui.widgets.input.RadioButton.RadioGroup; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.level.ELevel; +import net.sector.level.LevelBundle; +import net.sector.level.SuperContext; +import net.sector.level.highscore.HighscoreEntry; +import net.sector.level.highscore.HighscoreTable; +import net.sector.network.UserProfile; +import net.sector.network.communication.LeaderboardClient; +import net.sector.network.communication.ServerError; +import net.sector.network.responses.ObjScoreInfo; +import net.sector.network.responses.ObjScoreList; +import net.sector.util.Align; +import net.sector.util.Log; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +/** + * Highscore panel for shared levels + * + * @author MightyPork + */ +public class PanelHiscoreShared extends PanelGui { + + private static final int BACK = 0; + private static final int RADIO = 1; + + private HighscoreTable localTable; + + private CompositeScrollBox scrollBox; + + private LevelBundle level; + + private Button bnClose; + + private ObjScoreList netScores = new ObjScoreList(); + + private RadioButton ckLocal; + @SuppressWarnings("unused") + private RadioButton ckShared; + + /** + * Game over panel + * + * @param screen the screen + * @param level the level + */ + public PanelHiscoreShared(Screen screen, LevelBundle level) { + super(screen); + + if (level.type != ELevel.NET) { + throw new RuntimeException("Cannot open PanelHiscoreShowShared for local level."); + } + + if (App.offlineMode) { + Log.e("Cannot open PanelGameOverShared_User while offline."); + netScores = new ObjScoreList(); + } else { + try { + netScores = LeaderboardClient.getLevelScores(level.lid); + } catch (ServerError e) { + Log.e("Error getting leaderboard.", e); + Log.e("Error loading scores from server.", e); + netScores = new ObjScoreList(); + } + } + + this.level = level; + this.localTable = level.getHighscoreTable(); + if (localTable == null) localTable = new HighscoreTable(); + + + for (UserProfile user : SuperContext.userProfiles) { + if (user.isRemoved || !user.isLoggedIn) continue; + int userScore = netScores.getScoreForUid(user.uid); + + if (userScore != -1) { + HighscoreEntry he; + localTable.add(he = new HighscoreEntry(userScore, user.uname)); + he.isLocal = false; + he.uid = user.uid; + } + } + + localTable.sort(); + Collections.sort(netScores); + } + + + private static HighscoreEntryFactory entryFactory = HighscoreEntryFactory.instance; + + @Override + public void initGui(GuiRoot root) { + //@formatter:off + WindowFrame frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text(level.title, "highscore_level_name").setColorText(new RGB(0xFFFF00)).setMarginsV(10, 15)); + + scrollBox = new CompositeScrollBox(10, entryFactory); + + + LayoutH h = new LayoutH(Align.CENTER); + + RadioGroup group = RadioButton.newGroup(); + h.add(new Text("Scores: ", "small_text").setColorText(new RGB(RGB.WHITE, 0.6))); + h.add(new Gap(10,0)); + h.add(ckLocal = new RadioButton(RADIO, "Local", "small_text").setGroup(group)); + h.add(new Gap(10,0)); + h.add(ckShared = (RadioButton) new RadioButton(RADIO, "Global", "small_text").setGroup(group).setChecked(true)); + + v.add(h); + + v.add(scrollBox); + + h = new LayoutH(Align.CENTER); + h.add(bnClose = new Button(BACK, "Back", "small_text")); + v.add(h); + + frame.add(v); + + root.setRootWidget(frame); + + printHiscore(1); + //@formatter:on + } + + private void printHiscore(int page) { + + scrollBox.removeAll(); + + if (page == 0) { + + int i = 1; + for (HighscoreEntry entry : localTable) { + scrollBox.addItem(entryFactory.getItem(i, entry)); + i++; + } + + } else { + + int i = 1; + for (ObjScoreInfo entry : netScores) { + scrollBox.addItem(entryFactory.getItem(i, entry)); + i++; + } + + } + + scrollBox.refresh(); + } + + @Override + public void actionPerformed(Widget widget) { + if (widget.id == BACK) { + closePanel(); + return; + } + if (widget.id == RADIO) { + printHiscore(ckLocal.isChecked() ? 0 : 1); + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnClose); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/profiles/PanelProfileEdit.java b/src/net/sector/gui/panels/profiles/PanelProfileEdit.java new file mode 100644 index 0000000..2fbe0b9 --- /dev/null +++ b/src/net/sector/gui/panels/profiles/PanelProfileEdit.java @@ -0,0 +1,279 @@ +package net.sector.gui.panels.profiles; + + +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.dialogs.PanelDialogModal.IDialogListener; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.ListItemProfile; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.TextInput; +import net.sector.gui.widgets.input.TextInputCountry; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.network.UserProfile; +import net.sector.network.communication.ServerError; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +public class PanelProfileEdit extends PanelGui { + + private static final int CANCEL = 0; + private static final int SUBMIT = 1; + private static final int DELETE = 2; + + private static final int NAME_EDIT = 10; + private static final int PASSWORD_EDIT = 11; + private static final int COUNTRY_EDIT = 12; + private static final int EMAIL_EDIT = 13; + + + private Button bnSubmit; + private TextInput edName; + private TextInput edPassword; + private TextInputCountry edCountry; + private TextInput edEmail; + private TextInput edPassword2; + private UserProfile profile; + private TextInput edPasswordCurrent; + private ListItemProfile profileItem; + private Button bnDel; + private Button bnCancel; + + + public PanelProfileEdit(Screen screen, ListItemProfile profileItem) { + super(screen); + this.profile = profileItem.profile; + this.profileItem = profileItem; + } + + + + @Override + public void initGui(GuiRoot root) { + //@formatter:off + WindowFrame frame = new WindowFrame(); + //frame.setTheme(ETheme.GREEN_FRAME); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Edit Profile", "dialog_heading").setMarginsV(10, 15)); + + LayoutV v2 = new LayoutV(Align.LEFT); + Widget h; + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Username:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + h.add(edName = (TextInput) new TextInput(NAME_EDIT, profile.uname, "small_text").setMinWidth(300)); + v2.add(h); + + v2.add(new Gap(0, 10)); + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Password:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + edPassword = (TextInput) new TextInput(PASSWORD_EDIT, profile.password, "small_text").setPasswordMode(true).setMinWidth(300); + h.add(edPassword); + v2.add(h); + + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Repeat:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + edPassword2 = (TextInput) new TextInput(PASSWORD_EDIT, profile.password, "small_text").setPasswordMode(true).setMinWidth(300); + h.add(edPassword2); + v2.add(h); + v2.add(new Gap(0, 10)); + + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("E-mail:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + h.add(edEmail = (TextInput) new TextInput(EMAIL_EDIT, profile.email, "small_text").setMinWidth(400)); + v2.add(h); + + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Country:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + h.add(edCountry = (TextInputCountry) new TextInputCountry(COUNTRY_EDIT, "", "small_text").setMinWidth(400)); + edCountry.setCountry(profile.country); + v2.add(h); + + v2.add(new Gap(0, 15)); + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Gap(30,0)); + h.add(new Text("Enter current password", "small_text").setTextAlign(Align.LEFT).setColorText(new RGB(0xff3344)).setMinWidth(450)); + v2.add(h); + + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Password:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + edPasswordCurrent = (TextInput) new TextInput(PASSWORD_EDIT, "", "small_text").setPasswordMode(true).setMinWidth(300); + h.add(edPasswordCurrent); + v2.add(h); + + v2.add(new Gap(0, 15)); + + edName.setAllowedChars(TextInput.CHARS_USERNAME); + edEmail.setAllowedChars(TextInput.CHARS_EMAIL); + + v.add(v2); + + h = new LayoutH(Align.CENTER); + h.add(bnCancel = new Button(CANCEL, "Cancel", "small_text")); + h.add(new Gap(100,0)); + h.add(bnSubmit = (Button) new Button(SUBMIT, "Save changes", "small_text").setEnabled(false)); + h.add(new Gap(10,0)); + h.add(bnDel = (Button) new Button(DELETE, "Delete", "small_text").setEnabled(false)); + v.add(h); + + frame.add(v); + + root.setRootWidget(frame); +// +// ETheme theme = ETheme.GREEN; +// edName.setTheme(theme); +// edPassword.setTheme(theme); +// edPassword2.setTheme(theme); +// edCountry.setTheme(theme); +// edEmail.setTheme(theme); +// edPasswordCurrent.setTheme(theme); +// bnSubmit.setTheme(theme); +// bnCancel.setTheme(theme); +// bnDel.setTheme(theme); + + //@formatter:on + } + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + if (widget.id == NAME_EDIT || widget.id == PASSWORD_EDIT) { + + bnDel.setEnabled(true); + bnSubmit.setEnabled(true); + if (edName.getText().trim().length() == 0) { + bnSubmit.setEnabled(false); + } + + if (edPassword.getText().length() == 0) { + bnSubmit.setEnabled(false); + } + + if (!edPassword.getText().equals(edPassword2.getText())) { + bnSubmit.setEnabled(false); + } + + if (!edPasswordCurrent.getText().equals(profile.password)) { + bnSubmit.setEnabled(false); + bnDel.setEnabled(false); + } + + return; + } + + if (widget.id == CANCEL) { + closePanel(); + return; + } + + if (widget.id == DELETE) { + + PanelDialogModal p; + + IDialogListener listener = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 0) return; + if (button == 1) { + + try { + profile.deleteProfile(); + closePanel(); + } catch (ServerError e) { + openPanel(new PanelDialogModal(screen, null, -1, true, e.getMessage(), "OK")); + } + + } + } + }; + + String msg = "Do you really want to\ndelete this account?"; + + p = new PanelDialogModal(screen, listener, -1, true, msg, "No", "Yes"); + p.setEnterButton(1); + openPanel(p); + + return; + } + + if (widget.id == SUBMIT) { + + if (!edPasswordCurrent.getText().equals(profile.password)) { + openPanel(new PanelDialogModal(screen, null, -1, true, "Wrong password!", "OK")); + return; + } + + String uname = edName.getText().trim(); + String password = edPassword.getText().trim(); + String email = edEmail.getText().trim(); + String country = edCountry.getTag().trim(); + + try { + profile.editProfile(uname, password, email, country); + } catch (ServerError e) { + openPanel(new PanelDialogModal(screen, null, -1, true, e.getMessage(), "OK")); + return; + } + + profileItem.refreshAll(); + + closePanel(); + + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnCancel); + } + + if (key == Keyboard.KEY_RETURN && down) { + actionPerformed(bnSubmit); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/profiles/PanelProfileFixLogin.java b/src/net/sector/gui/panels/profiles/PanelProfileFixLogin.java new file mode 100644 index 0000000..c0ae26e --- /dev/null +++ b/src/net/sector/gui/panels/profiles/PanelProfileFixLogin.java @@ -0,0 +1,173 @@ +package net.sector.gui.panels.profiles; + + +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.profiles.PanelProfiles.IOnLoggedInHandler; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.TextInput; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.network.UserProfile; +import net.sector.network.communication.ServerError; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +public class PanelProfileFixLogin extends PanelGui { + + private static final int CANCEL = 0; + private static final int SUBMIT = 1; + private static final int NAME_EDIT = 10; + private static final int PASSWORD_EDIT = 11; + + + private Button bnSubmit; + private TextInput edName; + private TextInput edPassword; + private IOnLoggedInHandler handler; + private UserProfile profile; + private Button bnCancel; + + + public PanelProfileFixLogin(Screen screen, IOnLoggedInHandler handler, UserProfile profile) { + super(screen); + this.handler = handler; + this.profile = profile; + } + + + + @Override + public void initGui(GuiRoot root) { + //@formatter:off + WindowFrame frame = new WindowFrame(); + //frame.setTheme(ETheme.GREEN_FRAME); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Correct login", "dialog_heading").setMarginsV(10, 15)); + + LayoutH h; + h = new LayoutH(Align.CENTER); + h.add(new Text("Username:", "small_text").setMinWidth(130)); + h.add(new Gap(5,0)); + h.add(edName = (TextInput) new TextInput(NAME_EDIT, profile.uname, "small_text").setMinWidth(270)); + v.add(h); + + h = new LayoutH(Align.CENTER); + h.add(new Text("Password:", "small_text").setMinWidth(130)); + h.add(new Gap(5,0)); + edPassword = (TextInput) new TextInput(PASSWORD_EDIT, profile.password, "small_text").setMinWidth(270); + edPassword.setPasswordMode(true); + h.add(edPassword); + + v.add(h); + + v.add(new Gap(0, 15)); + + h = new LayoutH(Align.CENTER); + h.add(bnCancel = new Button(CANCEL, "Cancel", "small_text")); + h.add(new Gap(10,0)); + h.add(bnSubmit = new Button(SUBMIT, "Log in", "small_text")); + v.add(h); + + edName.setAllowedChars(TextInput.CHARS_USERNAME); + + frame.add(v); + + root.setRootWidget(frame); + + +// ETheme theme = ETheme.GREEN; +// edName.setTheme(theme); +// edPassword.setTheme(theme); +// bnSubmit.setTheme(theme); +// bnCancel.setTheme(theme); + + //@formatter:on + } + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + if (widget.id == NAME_EDIT || widget.id == PASSWORD_EDIT) { + bnSubmit.setEnabled(true); + if (edName.getText().trim().length() == 0) bnSubmit.setEnabled(false); + if (edPassword.getText().trim().length() == 0) bnSubmit.setEnabled(false); + return; + } + + if (widget.id == CANCEL) { + closePanel(); + return; + } + + if (widget.id == SUBMIT) { + String uname = edName.getText().trim(); + String password = edPassword.getText().trim(); + + try { + profile.setNamePassword(uname, password); + profile.logIn(); + } catch (ServerError e) { + PanelDialogModal p = new PanelDialogModal(screen, null, -1, true, e.getMessage(), "OK"); + openPanel(p); + return; + } + + closePanel(); + + if (handler != null) handler.onLoggedIn(profile); + + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnCancel); + } + + if (key == Keyboard.KEY_RETURN && down) { + actionPerformed(bnSubmit); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/profiles/PanelProfileLogIn.java b/src/net/sector/gui/panels/profiles/PanelProfileLogIn.java new file mode 100644 index 0000000..7b33ffe --- /dev/null +++ b/src/net/sector/gui/panels/profiles/PanelProfileLogIn.java @@ -0,0 +1,188 @@ +package net.sector.gui.panels.profiles; + + +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.profiles.PanelProfiles.IOnLoggedInHandler; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.TextInput; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.level.SuperContext; +import net.sector.network.UserProfile; +import net.sector.network.communication.LeaderboardClient; +import net.sector.network.communication.ServerError; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +public class PanelProfileLogIn extends PanelGui { + + private static final int CANCEL = 0; + private static final int SUBMIT = 1; + private static final int NAME_EDIT = 10; + private static final int PASSWORD_EDIT = 11; + + + private Button bnSubmit; + private TextInput edName; + private TextInput edPassword; + private IOnLoggedInHandler handler; + private Button bnCancel; + + + public PanelProfileLogIn(Screen screen, IOnLoggedInHandler handler) { + super(screen); + this.handler = handler; + } + + + + @Override + public void initGui(GuiRoot root) { + //@formatter:off + WindowFrame frame = new WindowFrame(); + //frame.setTheme(ETheme.GREEN_FRAME); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Log in", "dialog_heading").setMarginsV(10, 15)); + + LayoutH h; + h = new LayoutH(Align.CENTER); + h.add(new Text("Username:", "small_text").setMinWidth(130)); + h.add(new Gap(5,0)); + h.add(edName = (TextInput) new TextInput(NAME_EDIT, "", "small_text").setMinWidth(300)); + v.add(h); + + h = new LayoutH(Align.CENTER); + h.add(new Text("Password:", "small_text").setMinWidth(130)); + h.add(new Gap(5,0)); + edPassword = (TextInput) new TextInput(PASSWORD_EDIT, "", "small_text").setMinWidth(300); + edPassword.setPasswordMode(true); + h.add(edPassword); + + v.add(h); + + v.add(new Gap(0, 15)); + + h = new LayoutH(Align.CENTER); + h.add(bnCancel = new Button(CANCEL, "Cancel", "small_text")); + h.add(new Gap(10,0)); + h.add(bnSubmit = (Button) new Button(SUBMIT, "Log in", "small_text").setEnabled(false)); + v.add(h); + + edName.setAllowedChars(TextInput.CHARS_USERNAME); + + frame.add(v); + + root.setRootWidget(frame); + + +// ETheme theme = ETheme.GREEN; +// edName.setTheme(theme); +// edPassword.setTheme(theme); +// bnSubmit.setTheme(theme); +// bnCancel.setTheme(theme); + + //@formatter:on + } + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + if (widget.id == NAME_EDIT || widget.id == PASSWORD_EDIT) { + bnSubmit.setEnabled(true); + if (edName.getText().trim().length() == 0) bnSubmit.setEnabled(false); + if (edPassword.getText().trim().length() == 0) bnSubmit.setEnabled(false); + return; + } + + if (widget.id == CANCEL) { + closePanel(); + return; + } + + if (widget.id == SUBMIT) { + String uname = edName.getText().trim(); + String password = edPassword.getText().trim(); + + UserProfile up; + + try { + up = LeaderboardClient.createProfileLogIn(uname, password); + } catch (ServerError e) { + + PanelDialogModal p = new PanelDialogModal(screen, null, -1, true, e.getMessage(), "OK"); + openPanel(p); + + return; + } + + for (UserProfile profile : SuperContext.userProfiles) { + if (!profile.isRemoved() && profile.uid.equals(up.uid)) { + edName.setText(""); + edPassword.setText(""); + + PanelDialogModal p = new PanelDialogModal(screen, null, -1, true, "This profile is already added.", "OK"); + openPanel(p); + return; + } + } + + SuperContext.userProfiles.add(up); + closePanel(); + + if (handler != null) handler.onLoggedIn(up); + + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnCancel); + } + + if (key == Keyboard.KEY_RETURN && down) { + actionPerformed(bnSubmit); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/profiles/PanelProfileRegister.java b/src/net/sector/gui/panels/profiles/PanelProfileRegister.java new file mode 100644 index 0000000..3679e1c --- /dev/null +++ b/src/net/sector/gui/panels/profiles/PanelProfileRegister.java @@ -0,0 +1,228 @@ +package net.sector.gui.panels.profiles; + + +import net.sector.gui.panels.PanelGui; +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.profiles.PanelProfiles.IOnLoggedInHandler; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.TextInput; +import net.sector.gui.widgets.input.TextInputCountry; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.level.SuperContext; +import net.sector.network.UserProfile; +import net.sector.network.communication.LeaderboardClient; +import net.sector.network.communication.ServerError; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +public class PanelProfileRegister extends PanelGui { + + private static final int CANCEL = 0; + private static final int SUBMIT = 1; + + private static final int NAME_EDIT = 10; + private static final int PASSWORD_EDIT = 11; + private static final int COUNTRY_EDIT = 12; + private static final int EMAIL_EDIT = 13; + + + private Button bnSubmit; + private TextInput edName; + private TextInput edPassword; + private TextInput edCountry; + private TextInput edEmail; + private IOnLoggedInHandler handler; + private TextInput edPassword2; + private Button bnCancel; + + + public PanelProfileRegister(Screen screen, IOnLoggedInHandler handler) { + super(screen); + this.handler = handler; + } + + + + @Override + public void initGui(GuiRoot root) { + //@formatter:off + WindowFrame frame = new WindowFrame(); + //frame.setTheme(ETheme.GREEN_FRAME); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Create Profile", "dialog_heading").setMarginsV(10, 15)); + + LayoutV v2 = new LayoutV(Align.LEFT); + Widget h; + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Username:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + h.add(edName = (TextInput) new TextInput(NAME_EDIT, "", "small_text").setMinWidth(300)); + v2.add(h); + + v2.add(new Gap(0, 10)); + + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Password:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + edPassword = (TextInput) new TextInput(PASSWORD_EDIT, "", "small_text").setPasswordMode(true).setMinWidth(300); + h.add(edPassword); + v2.add(h); + + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Repeat:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + edPassword2 = (TextInput) new TextInput(PASSWORD_EDIT, "", "small_text").setPasswordMode(true).setMinWidth(300); + h.add(edPassword2); + v2.add(h); + + v2.add(new Gap(0, 10)); + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Gap(30,0)); + h.add(new Text("Optional", "small_text").setTextAlign(Align.LEFT).setColorText(new RGB(0x99ccff)).setMinWidth(450)); + v2.add(h); + + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("E-mail:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + h.add(edEmail = (TextInput) new TextInput(EMAIL_EDIT, "", "small_text").setMinWidth(400)); + v2.add(h); + + h = new LayoutH(Align.CENTER).setMarginsV(2, 2); + h.add(new Text("Country:", "small_text").setTextAlign(Align.RIGHT).setMinWidth(130)); + h.add(new Gap(5,0)); + h.add(edCountry = (TextInput) new TextInputCountry(COUNTRY_EDIT, "", "small_text").setMinWidth(400)); + v2.add(h); + + v2.add(new Gap(0, 15)); + + edName.setAllowedChars(TextInput.CHARS_USERNAME); + edEmail.setAllowedChars(TextInput.CHARS_EMAIL); + + v.add(v2); + + h = new LayoutH(Align.CENTER); + h.add(bnCancel = new Button(CANCEL, "Cancel", "small_text")); + h.add(new Gap(10,0)); + h.add(bnSubmit = (Button) new Button(SUBMIT, "Register", "small_text").setEnabled(false)); + v.add(h); + + frame.add(v); + + root.setRootWidget(frame); + + +// ETheme theme = ETheme.GREEN; +// edName.setTheme(theme); +// edPassword.setTheme(theme); +// edPassword2.setTheme(theme); +// edEmail.setTheme(theme); +// edCountry.setTheme(theme); +// bnSubmit.setTheme(theme); +// bnCancel.setTheme(theme); + + //@formatter:on + } + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + if (widget.id == NAME_EDIT || widget.id == PASSWORD_EDIT) { + + bnSubmit.setEnabled(true); + if (edName.getText().trim().length() == 0) { + bnSubmit.setEnabled(false); + } + + if (edPassword.getText().length() == 0) { + bnSubmit.setEnabled(false); + } + + if (!edPassword.getText().equals(edPassword2.getText())) { + bnSubmit.setEnabled(false); + } + + return; + } + + if (widget.id == CANCEL) { + closePanel(); + return; + } + + if (widget.id == SUBMIT) { + String uname = edName.getText().trim(); + String password = edPassword.getText().trim(); + String email = edEmail.getText().trim(); + String country = edCountry.getTag().trim(); + + UserProfile up; + try { + up = LeaderboardClient.createProfileRegister(uname, password, email, country); + } catch (ServerError e) { + + PanelDialogModal p = new PanelDialogModal(screen, null, -1, true, e.getMessage(), "OK"); + openPanel(p); + + return; + } + + SuperContext.userProfiles.add(up); + closePanel(); + + if (handler != null) handler.onLoggedIn(up); + + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnCancel); + } + + if (key == Keyboard.KEY_RETURN && down) { + actionPerformed(bnSubmit); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/profiles/PanelProfiles.java b/src/net/sector/gui/panels/profiles/PanelProfiles.java new file mode 100644 index 0000000..9ef2bd3 --- /dev/null +++ b/src/net/sector/gui/panels/profiles/PanelProfiles.java @@ -0,0 +1,171 @@ +package net.sector.gui.panels.profiles; + + +import java.util.Collections; + +import net.sector.gui.panels.PanelGui; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.IWidgetFactory; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.composite.ListItemProfile; +import net.sector.gui.widgets.composite.ListItemProfileGuest; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.level.SuperContext; +import net.sector.network.UserProfile; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +public class PanelProfiles extends PanelGui { + + public interface IOnLoggedInHandler { + /** + * Called when a profile was created and added to + * SuperContext.profileList + * + * @param profileCreated the new profile + */ + public void onLoggedIn(UserProfile profileCreated); + } + + private static final int BACK = 0; + private static final int LOG_IN = 1; + private static final int REGISTER = 2; + + private CompositeScrollBox scrollBox; + public IOnLoggedInHandler loginHandler = new IOnLoggedInHandler() { + @Override + public void onLoggedIn(UserProfile up) { + SuperContext.selectedUser = up; + insertProfiles(); + SuperContext.saveUserList(); + } + }; + private Button bnClose; + + + public PanelProfiles(Screen screen) { + super(screen); + } + + + private static class ProfileEntryFactory implements IWidgetFactory { + @Override + public Widget getWidget() { + return getItem(); + } + + public ListItemProfile getItem() { + return (ListItemProfile) new ListItemProfile().setMargins(4, 2, 4, 2); + } + + public ListItemProfile getItem(UserProfile profile) { + return (ListItemProfile) new ListItemProfile(profile).setMargins(4, 2, 4, 2); + } + } + + + private static ProfileEntryFactory scrollBoxItemFactory = new ProfileEntryFactory(); + + @Override + public void initGui(GuiRoot root) { + //@formatter:off + WindowFrame frame = new WindowFrame(); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Manage Profiles", "small_heading").setMarginsV(10, 15)); + + scrollBox = new CompositeScrollBox(5, scrollBoxItemFactory); + + v.add(scrollBox); + + LayoutH h = new LayoutH(Align.CENTER); + h.add(bnClose = new Button(BACK, "Close", "small_text")); + h.add(new Gap(100,0)); + h.add(new Button(LOG_IN, "Log in", "small_text")); + h.add(new Button(REGISTER, "Register", "small_text")); + v.add(h); + + frame.add(v); + + root.setRootWidget(frame); + + insertProfiles(); + //@formatter:on + } + + public void insertProfiles() { + + scrollBox.removeAll(); + Collections.sort(SuperContext.userProfiles); + + scrollBox.addItem(new ListItemProfileGuest().setScrollList(scrollBox.getItems()).setMargins(4, 2, 4, 2)); + + for (UserProfile profile : SuperContext.userProfiles) { + if (profile.isRemoved()) continue; + scrollBox.addItem(scrollBoxItemFactory.getItem(profile).setScrollList(scrollBox.getItems())); + } + + scrollBox.refresh(); + } + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + if (widget.id == BACK) { + SuperContext.saveUserList(); + closePanel(); + return; + } + if (widget.id == LOG_IN) { + SuperContext.saveUserList(); + openPanel(new PanelProfileLogIn(screen, loginHandler)); + return; + } + if (widget.id == REGISTER) { + SuperContext.saveUserList(); + openPanel(new PanelProfileRegister(screen, loginHandler)); + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnClose); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return false; + } + +} \ No newline at end of file diff --git a/src/net/sector/gui/panels/profiles/PanelSelectCountry.java b/src/net/sector/gui/panels/profiles/PanelSelectCountry.java new file mode 100644 index 0000000..a024ee4 --- /dev/null +++ b/src/net/sector/gui/panels/profiles/PanelSelectCountry.java @@ -0,0 +1,204 @@ +package net.sector.gui.panels.profiles; + + +import java.util.ArrayList; + +import net.sector.gui.panels.PanelGui; +import net.sector.gui.screens.Screen; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.IWidgetFactory; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.CompositeScrollBox; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.display.TextWithBackground; +import net.sector.gui.widgets.input.Button; +import net.sector.gui.widgets.input.Checkbox; +import net.sector.gui.widgets.input.TextInputCountry; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.gui.widgets.layout.WindowFrame; +import net.sector.input.Function; +import net.sector.network.CountryList; +import net.sector.network.CountryList.Country; +import net.sector.util.Align; + +import org.lwjgl.input.Keyboard; + +import com.porcupine.color.RGB; + + +/** + * Overlay panel for paused game. + * + * @author MightyPork + */ +public class PanelSelectCountry extends PanelGui { + + private static final int CANCEL = 0; + private static final int OK = 1; + private static final int CHECK_ALL = 2; + + + private CompositeScrollBox scrollBox; + private TextInputCountry countryEdit; + + + /** + * Game over panel + * + * @param screen the screen + * @param score player score + */ + public PanelSelectCountry(Screen screen, TextInputCountry countryEdit) { + super(screen); + this.countryEdit = countryEdit; + } + + private Function onClickHandler = new Function() { + + @Override + public Boolean run(Object... args) { + Widget w = (Widget) args[0]; + countryEdit.setCountry(w.getTag()); + closePanel(); + return true; + } + + }; + + + private class EntryFactory implements IWidgetFactory { + + @Override + public Widget getWidget() { + return getItem(new Country("", "")); + } + + public Text getItem(Country c) { + Text t = new TextWithBackground(c.name, "small_text").setBackgroundColor(new RGB(0x479EF5)); + t.addOnClickHandler(onClickHandler); + t.setPadding(6, 2); + t.setMargins(2, 1, 2, 1); + t.setTextAlign(Align.LEFT); + t.setMinWidth(400); + t.setTag(c.code); + + if (c.isSmall) t.setColorText(new RGB(0x999999)); + if (c.isFictional) t.setColorText(new RGB(0x55ffff)); + + return t; + + } + } + + private EntryFactory scrollBoxItemFactory = new EntryFactory(); + private ArrayList itemsBig; + private ArrayList itemsAll; + private Button bnCancel; + + @Override + public void initGui(GuiRoot root) { + + itemsBig = new ArrayList(); + itemsAll = new ArrayList(); + + for (Country c : CountryList.big) { + itemsBig.add(scrollBoxItemFactory.getItem(c)); + } + + for (Country c : CountryList.all) { + itemsAll.add(scrollBoxItemFactory.getItem(c)); + } + + //@formatter:off + WindowFrame frame = new WindowFrame(); + //frame.setTheme(ETheme.GREEN_FRAME); + frame.setPadding(5, 5, 5, 5); + frame.enableShadow(true); + + LayoutV v = new LayoutV(Align.CENTER); + + v.add(new Text("Country list", "dialog_heading").setMarginsV(10, 15)); + + v.add(new Checkbox(CHECK_ALL, "Show all countries", "small_text").setChecked(false)); + + scrollBox = new CompositeScrollBox(10, scrollBoxItemFactory); + + v.add(scrollBox); + + LayoutH h = new LayoutH(Align.CENTER); + h.add(bnCancel = new Button(CANCEL, "Cancel", "small_text")); + v.add(h); + + frame.add(v); + + root.setRootWidget(frame); + + //bnCancel.setTheme(ETheme.GREEN); + + //@formatter:on + + loadCountriesToList(true); + } + + private void loadCountriesToList(boolean bigOnly) { + scrollBox.removeAll(); + + scrollBox.addItem(scrollBoxItemFactory.getItem(new Country("", "(no country)"))); + + if (bigOnly) { + for (Widget w : itemsBig) + scrollBox.addItem(w); + } else { + for (Widget w : itemsAll) + scrollBox.addItem(w); + } + + scrollBox.refresh(); + } + + + @Override + public void actionPerformed(Widget widget) { + if (!widget.isEnabled()) return; + + if (widget.id == CHECK_ALL) { + loadCountriesToList(!((Checkbox) widget).isChecked()); + return; + } + if (widget.id == CANCEL) { + closePanel(); + return; + } + } + + @Override + public void onKey(int key, char c, boolean down) { + super.onKey(key, c, down); + + if (key == Keyboard.KEY_ESCAPE && down) { + actionPerformed(bnCancel); + } + } + + @Override + public void onFocus() { + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onBlur() { + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean hasBackgroundLayer() { + return true; + } + + @Override + public RGB getBackgroundColor() { + return new RGB(0, 0.4); + } + +} \ No newline at end of file diff --git a/src/net/sector/gui/screens/Screen.java b/src/net/sector/gui/screens/Screen.java new file mode 100644 index 0000000..fc18091 --- /dev/null +++ b/src/net/sector/gui/screens/Screen.java @@ -0,0 +1,320 @@ +package net.sector.gui.screens; + + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +import java.nio.FloatBuffer; +import java.util.Random; + +import net.sector.App; +import net.sector.Constants; +import net.sector.collision.Scene; +import net.sector.gui.panels.Panel; +import net.sector.gui.panels.PanelEmpty; +import net.sector.input.Keys; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.math.Calc.Buffers; +import com.porcupine.struct.Struct5; + + +/** + * Screen class.
+ * Screen animates 3D world, while contained panels render 2D overlays, process + * inputs and run the game logic. + * + * @author MightyPork + */ +public abstract class Screen { + + /** stars renderer */ + public static StarfieldRenderer stars = new StarfieldRenderer(); + + /** application instance, for easier calls */ + public App app = App.inst; + + /** root panel */ + public Panel rootPanel = new PanelEmpty(this); + + /** RNG */ + public Random rand = new Random(); + + /** 3D space manager and renderer */ + public Scene scene = new Scene(); + + private boolean enableFog = false; + + /** Rendering of 2D panels enabled */ + public boolean enableOverlay = false; + + /** Rendering of starfield enabled */ + public boolean enableStars = true; + + private boolean fogSetUp = false, cameraSetUp = false; + + /** + * Enable fog with given parameters + * + * @param fogStart distance from which the fog grows denser + * @param fogEnd distance at which the fog is densest + * @param fogDensity relative fog density, 1.0 default, 0.3 recommended + * @param fogOpacity fog opacity, 1.0 default + * @param fogColor fog color + * @param bgColor screen background color + * @param fogType fog type: GL_LINEAR, GL_EXP, GL_EXP2 + */ + protected final void setupFog(double fogStart, double fogEnd, double fogDensity, double fogOpacity, RGB fogColor, RGB bgColor, int fogType) { + // bg + glClearColor((float) bgColor.r, (float) bgColor.g, (float) bgColor.b, 1.0F); + //fog + glFogf(GL_FOG_START, (float) fogStart); + glFogf(GL_FOG_END, (float) fogEnd); + glFogi(GL_FOG_MODE, fogType); + glFog(GL_FOG_COLOR, Calc.Buffers.fBuff((float) fogColor.r, (float) fogColor.g, (float) fogColor.b, (float) fogOpacity)); + glFogf(GL_FOG_DENSITY, (float) fogDensity); + glHint(GL_FOG_HINT, GL_NICEST); + + fogSetUp = true; + } + + /** + * Enable/disable fog + * + * @param enable whether the fog should be rendered + */ + protected final void enableFog(boolean enable) { + enableFog = enable; + if (enable) { + glEnable(GL_FOG); + } else { + glDisable(GL_FOG); + } + } + + /** + * Check if fog is enabled + * + * @return fog enabled + */ + protected final boolean isFogEnabled() { + return enableFog; + } + + private Struct5 lastCam = null; + + /** + * readjust camera position + */ + private final void reinitViewport() { + setupCamera(lastCam.a, lastCam.b, lastCam.c, lastCam.d, lastCam.e); + } + + /** + * handle fullscreen change + */ + public final void onFullscreenChange() { + reinitViewport(); + rootPanel.onViewportChanged(); + } + + /** + * handle window resize. + */ + public final void onWindowResize() { + reinitViewport(); + rootPanel.onViewportChanged(); + } + + /** + * Set up camera + * + * @param eyePos position of the observing eye + * @param centerPos point the eye is looking at + * @param viewAngle viewing angle (FOV) + * @param zNear nearest visible objects (Z axis) + * @param zFar farthest visible objects (Z axis) + */ + protected final void setupCamera(Coord eyePos, Coord centerPos, double viewAngle, double zNear, double zFar) { + lastCam = new Struct5(eyePos, centerPos, viewAngle, zNear, zFar); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + // set up perspective + + Coord s = app.getSize(); + gluPerspective((float) viewAngle, (float) s.x / (float) s.y, (float) zNear, (float) zFar); + gluLookAt((float) eyePos.x, (float) eyePos.y, (float) eyePos.z, (float) centerPos.x, (float) centerPos.y, (float) centerPos.z, 0F, 1F, 0F); + + glViewport(0, 0, s.xi(), s.yi()); + + // back to modelview matrix + glMatrixMode(GL_MODELVIEW); + + cameraSetUp = true; + } + + /** + * Enable / disable 2D overlay + * + * @param enable + */ + protected void enableOverlay(boolean enable) { + enableOverlay = enable; + } + + /** + * Enable / disable stars + * + * @param enable + */ + public void enableStars(boolean enable) { + enableStars = enable; + } + + /** + * Initialize screen + */ + public final void init() { + + if (!stars.hasInit) stars.init(); + + initScreen(); + + rootPanel.onCreate(); + rootPanel.onFocus(); + + if (!cameraSetUp) setupCamera(Constants.CAM_POS, Constants.CAM_LOOKAT, Constants.CAM_ANGLE, Constants.CAM_NEAR, Constants.CAM_FAR); + if (!fogSetUp) setupFog(Constants.FOG_START, Constants.CAM_FAR, 1.0, 1.0, new RGB(0, 0, 0), new RGB(0, 0, 0), GL_LINEAR); + + + // SETUP LIGHTS + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + float spec = Constants.LIGHT_SPECULAR; + float amb = Constants.LIGHT_AMBIENT; + float diff = Constants.LIGHT_DIFFUSE; + Coord pos = Constants.LIGHT_POS; + + FloatBuffer buff = Buffers.mkBuff(4); + Buffers.fillBuff(buff, amb, amb, amb, 1.0f); + glLight(GL_LIGHT0, GL_AMBIENT, buff); + + buff.clear(); + Buffers.fillBuff(buff, diff, diff, diff, 1.0f); + glLight(GL_LIGHT0, GL_DIFFUSE, buff); + + buff.clear(); + Buffers.fillBuff(buff, spec, spec, spec, 1.0f); + glLight(GL_LIGHT0, GL_SPECULAR, buff); + + buff.clear(); + Buffers.fillBuff(buff, (float) pos.x, (float) pos.y, (float) pos.z, Constants.LIGHT_ATTR); + glLight(GL_LIGHT0, GL_POSITION, buff); //Position The Light + + + // OTHER SETTINGS + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glClearDepth(1f); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + + glEnable(GL_CULL_FACE); + glEnable(GL_NORMALIZE); + + glShadeModel(GL_SMOOTH); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + glDisable(GL_TEXTURE_2D); + + } + + /** + * Here you can initialize the screen. + */ + public abstract void initScreen(); + + public final void update() { + + Mouse.poll(); + Keyboard.poll(); + checkInputEvents(); + + getFocusedPanel().update(); + } + + public final void render(float delta) { + glPushAttrib(GL_ENABLE_BIT); + + if (enableStars) stars.render(); + + // render the scene + scene.render(delta); + + // draw the directly rendered 3D stuff + rootPanel.render3D(); + + if (enableOverlay) { + rootPanel.render(); + } + + glPopAttrib(); + } + + + /** + * @return topmost panel which can handle inputs + */ + protected final Panel getFocusedPanel() { + return rootPanel.getTop(); + } + + /** + * Check input events and process them. + */ + private final void checkInputEvents() { + while (Keyboard.next()) { + int key = Keyboard.getEventKey(); + boolean down = Keyboard.getEventKeyState(); + char c = Keyboard.getEventCharacter(); + Keys.onKey(key, down); + getFocusedPanel().onKey(key, c, down); + } + while (Mouse.next()) { + int button = Mouse.getEventButton(); + boolean down = Mouse.getEventButtonState(); + Coord delta = new Coord(Mouse.getEventDX(), Mouse.getEventDY()); + Coord pos = new Coord(Mouse.getEventX(), Mouse.getEventY()); + int wheeld = Mouse.getEventDWheel(); + + getFocusedPanel().onMouseButton(button, down, wheeld, pos, delta); + } + + int xc = Mouse.getX(); + int yc = Mouse.getY(); + int xd = Mouse.getDX(); + int yd = Mouse.getDY(); + int wd = Mouse.getDWheel(); + + if (Math.abs(xd) > 0 || Math.abs(yd) > 0 || Math.abs(wd) > 0) { + getFocusedPanel().onMouseMove(new Coord(xc, yc), new Vec(xd, yd), wd); + } + + getFocusedPanel().handleStaticInputs(); + } + + public boolean deltaEnabled() { + return getFocusedPanel().isDeltaEnabled(); + } +} diff --git a/src/net/sector/gui/screens/ScreenDesigner.java b/src/net/sector/gui/screens/ScreenDesigner.java new file mode 100644 index 0000000..42816dd --- /dev/null +++ b/src/net/sector/gui/screens/ScreenDesigner.java @@ -0,0 +1,30 @@ +package net.sector.gui.screens; + + +import net.sector.gui.panels.designer.PanelDesigner; +import net.sector.level.GameContext; +import net.sector.level.SuperContext; +import net.sector.sounds.Music; + + +/** + * ship designer screen + * + * @author MightyPork + */ +public class ScreenDesigner extends Screen { + + @Override + public void initScreen() { + + enableOverlay(true); + enableFog(true); + enableStars(true); + + Music.playDesigner(); + + GameContext ctx = SuperContext.getGameContext(); + rootPanel = new PanelDesigner(this, ctx); + } + +} diff --git a/src/net/sector/gui/screens/ScreenGame.java b/src/net/sector/gui/screens/ScreenGame.java new file mode 100644 index 0000000..b5d3a1f --- /dev/null +++ b/src/net/sector/gui/screens/ScreenGame.java @@ -0,0 +1,38 @@ +package net.sector.gui.screens; + + +import net.sector.gui.panels.game.PanelGame; +import net.sector.level.GameContext; +import net.sector.sounds.Music; + + +/** + * main game screen + * + * @author MightyPork + */ +public class ScreenGame extends Screen { + + private GameContext context; + + public ScreenGame(GameContext context) { + this.context = context; + } + + @Override + public void initScreen() { + Music.playIngame(); + + // use default camera position and fog settings + + // all of these are enabled by default + // but we can make sure by re-enabling + enableOverlay(true); + enableFog(true); + enableStars(true); + + rootPanel = new PanelGame(this, context); + + } + +} diff --git a/src/net/sector/gui/screens/ScreenLevels.java b/src/net/sector/gui/screens/ScreenLevels.java new file mode 100644 index 0000000..286606f --- /dev/null +++ b/src/net/sector/gui/screens/ScreenLevels.java @@ -0,0 +1,26 @@ +package net.sector.gui.screens; + + +import net.sector.gui.panels.PanelChallenges; +import net.sector.sounds.Music; + + +/** + * screen for level selection. + * + * @author MightyPork + */ +public class ScreenLevels extends Screen { + + @Override + public void initScreen() { + Music.playMenu(); + + enableOverlay(true); + enableStars(true); + + rootPanel = new PanelChallenges(this); + } + + +} diff --git a/src/net/sector/gui/screens/ScreenMenuMain.java b/src/net/sector/gui/screens/ScreenMenuMain.java new file mode 100644 index 0000000..7c641a8 --- /dev/null +++ b/src/net/sector/gui/screens/ScreenMenuMain.java @@ -0,0 +1,26 @@ +package net.sector.gui.screens; + + +import net.sector.gui.panels.PanelMenu; +import net.sector.sounds.Music; + + +/** + * main menu screen + * + * @author MightyPork + */ +public class ScreenMenuMain extends Screen { + + @Override + public void initScreen() { + Music.playMenu(); + + enableOverlay(true); + enableStars(true); + + rootPanel = new PanelMenu(this); + } + + +} diff --git a/src/net/sector/gui/screens/ScreenSplash.java b/src/net/sector/gui/screens/ScreenSplash.java new file mode 100644 index 0000000..1b7c93c --- /dev/null +++ b/src/net/sector/gui/screens/ScreenSplash.java @@ -0,0 +1,27 @@ +package net.sector.gui.screens; + + +import net.sector.gui.panels.PanelSplash; +import net.sector.sounds.Music; + + + +/** + * Splash screen + * + * @author MightyPork + */ +public class ScreenSplash extends Screen { + + @Override + public void initScreen() { + Music.playIntro(); + + enableOverlay(true); + enableStars(true); + + rootPanel = new PanelSplash(this); + } + + +} diff --git a/src/net/sector/gui/screens/StarfieldRenderer.java b/src/net/sector/gui/screens/StarfieldRenderer.java new file mode 100644 index 0000000..2f22f08 --- /dev/null +++ b/src/net/sector/gui/screens/StarfieldRenderer.java @@ -0,0 +1,84 @@ +package net.sector.gui.screens; + + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL13.*; + +import java.util.Random; + +import net.sector.util.Log; + +import com.porcupine.color.RGB; + + +/** + * Class which renders starfield behind scene but in front of a fog. + * + * @author MightyPork + */ +public class StarfieldRenderer { + + private static final int STARS = 1200; + + private Random rand = new Random(); + private int starfieldDL = -1; + + public boolean hasInit = false; + + /** + * Generate starfield and precompile render list. + */ + public void init() { + if (hasInit) return; + hasInit = true; + Log.f1("Initializing background starfield."); + + starfieldDL = glGenLists(1); + glNewList(starfieldDL, GL_COMPILE); + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT | GL_MULTISAMPLE_BIT); + glDisable(GL_MULTISAMPLE); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + glEnable(GL_POINT_SMOOTH); + glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); + glLoadIdentity(); + RGB color; + glRotated(-10, 1, 0, 0); + + int diffSizes = 10+rand.nextInt(6); + + int[] inGroup = new int[diffSizes]; + for(int i=0; i base = new HashMap(); + private Map hover = new HashMap(); + private Map clicked = new HashMap(); + private Map selected = new HashMap(); + + public ColorScheme() {} + + public ColorScheme(RGB border, RGB background, RGB foreground) { + setBase(border, background, foreground); + setHover(border, background, foreground); + setClicked(border, background, foreground); + setSelected(border, background, foreground); + } + + public ColorScheme(RGB border, RGB background) { + setBase(border, background, RGB.BLACK); + setHover(border, background, RGB.BLACK); + setClicked(border, background, RGB.BLACK); + setSelected(border, background, RGB.BLACK); + } + + public ColorScheme setBase(RGB border, RGB background, RGB foreground) { + base.put(BDR, border); + base.put(BG, background); + base.put(FG, foreground); + return this; + } + + public ColorScheme setHover(RGB border, RGB background, RGB foreground) { + hover.put(BDR, border); + hover.put(BG, background); + hover.put(FG, foreground); + return this; + } + + public ColorScheme setClicked(RGB border, RGB background, RGB foreground) { + clicked.put(BDR, border); + clicked.put(BG, background); + clicked.put(FG, foreground); + return this; + } + + public ColorScheme setSelected(RGB border, RGB background, RGB foreground) { + selected.put(BDR, border); + selected.put(BG, background); + selected.put(FG, foreground); + return this; + } + + private RGB fallback(RGB... options) { + for (RGB color : options) { + if (color != null) return color; + } + return RGB.RED; // error color + } + + + public RGB getColor(EColorRole role, boolean panelActive, boolean enabled, boolean mouseOver, boolean mouseDown, boolean widgetSelected) { + + if (!enabled) { + if (widgetSelected) return fallback(selected.get(role), base.get(role)).mulAlpha(0.3); + return base.get(role).mulAlpha(0.3); + } + + if (mouseDown && panelActive) { + if (widgetSelected) return fallback(selected.get(role), clicked.get(role), hover.get(role), base.get(role)); + return fallback(clicked.get(role), hover.get(role), base.get(role)); + } + + if (mouseOver && panelActive) { + if (widgetSelected) return fallback(selected.get(role), hover.get(role), base.get(role)); + return fallback(hover.get(role), clicked.get(role), base.get(role)); + } + + if (widgetSelected) return fallback(selected.get(role), base.get(role)); + return fallback(base.get(role)); + } + +} diff --git a/src/net/sector/gui/widgets/EColorRole.java b/src/net/sector/gui/widgets/EColorRole.java new file mode 100644 index 0000000..8526b24 --- /dev/null +++ b/src/net/sector/gui/widgets/EColorRole.java @@ -0,0 +1,6 @@ +package net.sector.gui.widgets; + + +public enum EColorRole { + FG, BG, BDR, SHADOW, BDR_INNER; +} diff --git a/src/net/sector/gui/widgets/ETheme.java b/src/net/sector/gui/widgets/ETheme.java new file mode 100644 index 0000000..886dbcb --- /dev/null +++ b/src/net/sector/gui/widgets/ETheme.java @@ -0,0 +1,6 @@ +package net.sector.gui.widgets; + + +public enum ETheme { + GREEN, BLUE, BLUE_FRAME, GREEN_FRAME, DES_TAB_BUTTON, DES_PANEL, DES_TABLE, MENU_BUTTON, MENU_TITLE, BLUE_SCROLLBAR; +} diff --git a/src/net/sector/gui/widgets/GuiRoot.java b/src/net/sector/gui/widgets/GuiRoot.java new file mode 100644 index 0000000..d70bb98 --- /dev/null +++ b/src/net/sector/gui/widgets/GuiRoot.java @@ -0,0 +1,295 @@ +package net.sector.gui.widgets; + + +import static net.sector.util.Align.*; +import static org.lwjgl.opengl.GL11.*; +import net.sector.App; +import net.sector.fonts.FontManager; +import net.sector.gui.panels.Panel; +import net.sector.util.Align; + +import org.lwjgl.input.Mouse; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Root widget, container of layouts + * + * @author MightyPork + */ +public class GuiRoot { + + /** + * Widget event listener + * + * @author MightyPork + */ + public static interface EventListener { + /** + * On action performed - button clicked etc. + * + * @param widget widget responsible for the event. + */ + public void actionPerformed(Widget widget); + } + + /** root child */ + public Widget child = null; + /** focused widget */ + public Widget focus = null; + /** event listener */ + public EventListener listener = null; + + /** Horizontal align to window */ + public int alignH = CENTER; + + /** Vertical align to window */ + public int alignV = CENTER; + private Panel panel; + + private String tooltipText = ""; + private RGB tooltipColor = RGB.WHITE; + private boolean tooltipShown = false; + + public void clearTooltip() { + tooltipShown = false; + } + + public void setTooltip(String text, RGB color) { + tooltipText = text.trim(); + tooltipColor = color; + tooltipShown = true; + } + + /** + * Gui widget root element + * + * @param listener listener - for widget events + * @param child root child (a layout) + */ + public GuiRoot(EventListener listener, Widget child) { + this.listener = listener; + this.child = child; + if (listener instanceof Panel) panel = (Panel) listener; + } + + public GuiRoot setParentPanel(Panel p) { + this.panel = p; + return this; + } + + public boolean isPanelOnTop() { + return panel.isFocused(); + } + + /** + * Add primary child + * + * @param layout + */ + public void setRootWidget(Widget layout) { + this.child = layout; + } + + /** + * Set alignment relative to window; Use constants from Align class. + * + * @param horizontal horizontal align + * @param vertical vertical align + * @return this + */ + public GuiRoot setAlign(int horizontal, int vertical) { + alignH = horizontal; + alignV = vertical; + return this; + } + + /** + * Set alignment relative to window; Use constants from Align class. + * + * @param horizontal horizontal align + * @return this + */ + public GuiRoot setAlignH(int horizontal) { + alignH = horizontal; + return this; + } + + /** + * Set alignment relative to window; Use constants from Align class. + * + * @param vertical vertical align + * @return this + */ + public GuiRoot setAlignV(int vertical) { + alignV = vertical; + return this; + } + + /** + * Do render - centered on screen. + */ + public void render() { + + clearTooltip(); + + glPushMatrix(); + + Coord lower = getLowerPoint(); + + glTranslated(lower.x, lower.y, 0); + glPushMatrix(); + child.render(getRelativeMousePos()); + glPopMatrix(); + + if (tooltipShown && isPanelOnTop()) { + Coord mouse = getRelativeMousePos(); + + String font = "designer_tooltip"; + + int h = (int) FontManager.height(font); + Coord pos = mouse.add(20, -h / 2, 60); + + RGB shadowC = new RGB(0, 0.4); + + FontManager.drawFuzzy(pos, tooltipText, font, shadowC, tooltipColor, 2, Align.LEFT); + } + + glPopMatrix(); + + + } + + private Coord getRelativeMousePos() { + Coord lower = getLowerPoint(); + return new Coord(Mouse.getX() - lower.x, Mouse.getY() - lower.y); + } + + /** + * Get lower point of this root widget - base for relative coordinates. + * + * @return lower coord. + */ + private Coord getLowerPoint() { + Coord cSize = child.getSize(); + Coord wSize = App.inst.getSize(); + Coord lower = new Coord(); + + switch (alignH) { + case LEFT: + lower.x = 0; + break; + case CENTER: + lower.x = (wSize.x - cSize.x) / 2; + break; + case RIGHT: + lower.x = wSize.x - cSize.x; + break; + } + + switch (alignV) { + case BOTTOM: + lower.y = 0; + break; + case CENTER: + lower.y = (wSize.y - cSize.y) / 2; + break; + case TOP: + lower.y = wSize.y - cSize.y; + break; + } + + return lower; + } + + /** + * Remove old focus and focus given widget. + * + * @param newFocus widget to focus or null. + */ + public void setFocus(Widget newFocus) { + + if (focus != null) { + focus.focused = false; + focus.onBlur(); + } + + focus = newFocus; + + if (focus != null) { + focus.focused = true; + focus.onFocus(); + } + + } + + /** + * Handle mouse button + * + * @param button button id + * @param down is down + */ + public void onMouseButton(int button, boolean down) { + Widget consumer = child.onMouseButton(getRelativeMousePos(), button, down); + if (consumer != focus && down) { + setFocus(consumer); + } + if (consumer != null) listener.actionPerformed(consumer); + } + + /** + * handle mouse scroll + * + * @param scroll -1,0,1 + */ + public void onScroll(int scroll) { + Widget consumer = child.onScroll(getRelativeMousePos(), scroll); + if (consumer != focus && consumer != null) { + setFocus(consumer); + } + if (consumer != null) listener.actionPerformed(consumer); + } + + /** + * handle key press + * + * @param key key index + * @param chr character typed + * @param down + */ + public void onKeyDown(int key, char chr, boolean down) { + + Widget consumer = child.onKey(key, chr, down); + if (consumer != focus && consumer != null) { + setFocus(consumer); + } + if (consumer != null) listener.actionPerformed(consumer); + } + + /** + * Handle analog inputs + */ + public void handleStaticInputs() { + child.handleStaticInputs(getRelativeMousePos()); + } + + /** + * Recalculate children positions and sizes. + */ + public void updatePositions() { + child.setGuiRoot(this); + child.calcChildSizes(); + } + + /** + * Get the panel. + * + * @return panel + */ + public Panel getPanel() { + return panel; + } + +} diff --git a/src/net/sector/gui/widgets/IRefreshable.java b/src/net/sector/gui/widgets/IRefreshable.java new file mode 100644 index 0000000..00e0c34 --- /dev/null +++ b/src/net/sector/gui/widgets/IRefreshable.java @@ -0,0 +1,6 @@ +package net.sector.gui.widgets; + + +public interface IRefreshable { + public void refresh(); +} diff --git a/src/net/sector/gui/widgets/IScrollable.java b/src/net/sector/gui/widgets/IScrollable.java new file mode 100644 index 0000000..fe93e46 --- /dev/null +++ b/src/net/sector/gui/widgets/IScrollable.java @@ -0,0 +1,36 @@ +package net.sector.gui.widgets; + + +import net.sector.gui.widgets.input.Scrollbar; + + +/** + * Scrollable element + * + * @author MightyPork + */ +public interface IScrollable { + + /** + * Get height of the entire content + * + * @return content height + */ + public double getContentHeight(); + + public void onScrollbarConnected(Scrollbar scrollbar); + + /** + * Get view height (height of the visible area) + * + * @return view height + */ + public double getViewHeight(); + + /** + * Hook called when scrollbar value changes + * + * @param value scrollbar value 0-1 + */ + public void onScrollbarChange(double value); +} diff --git a/src/net/sector/gui/widgets/IWidget.java b/src/net/sector/gui/widgets/IWidget.java new file mode 100644 index 0000000..715c910 --- /dev/null +++ b/src/net/sector/gui/widgets/IWidget.java @@ -0,0 +1,276 @@ +package net.sector.gui.widgets; + + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Rect; + + +/** + * GUI widget interface + * + * @author MightyPork + */ +public interface IWidget { + + /** + * set widget required margins in layout. + * + * @param left + * @param top + * @param right + * @param bottom + * @return this + */ + public Widget setMargins(int left, int top, int right, int bottom); + + /** + * set widget required margins in layout. + * + * @param left + * @param right + * @return this + */ + public Widget setMarginsH(int left, int right); + + /** + * set widget required margins in layout. + * + * @param top + * @param bottom + * @return this + */ + public Widget setMarginsV(int top, int bottom); + + /** + * Set text + * + * @param text text to set + * @return this + */ + public Widget setText(String text); + + /** + * Get display text + * + * @return text + */ + public String getText(); + + /** + * Set widget id + * + * @param id + * @return this + */ + public Widget setId(int id); + + /** + * get id + * + * @return id + */ + public int getId(); + + /** + * Enable widget (eg. button) + * + * @param state + * @return this + */ + public Widget setEnabled(boolean state); + + /** + * @return is enabled + */ + public boolean isEnabled(); + + /** + * Set widget visible + * + * @param state + * @return this + */ + public Widget setVisible(boolean state); + + /** + * @return is visible + */ + public boolean isVisible(); + + /** + * Set minimal size in layout + * + * @param size size to set + * @return this + */ + public IWidget setMinSize(Coord size); + + /** + * Set minimal size in layout + * + * @param w width + * @param h height + * @return this + */ + public IWidget setMinSize(int w, int h); + + /** + * Get minimal size (set by setMinSize) + * + * @return size width,height + */ + public Coord getMinSize(); + + /** + * Get current size (in fact a size of getRect()) + * + * @return the size width/height + */ + public Coord getSize(); + + /** + * Set bounding rectangle.
+ * The margin is excluded from this area. + * + * @param rect + * @return this + */ + public Widget setRect(Rect rect); + + /** + * Get bounding rectangle + * + * @return bounding rectangle + */ + public Rect getRect(); + + /** + * Get minimal widget margin + * + * @return margin (left,right,up,down) + */ + public WidgetMargins getMargins(); + + /** + * Check if mouse is over. + * + * @param mouse mouse coord + * @return is over + */ + public boolean isMouseOver(Coord mouse); + + /** + * Do render as 2D + * + * @param mouse current mouse position, for hover effects + */ + public void render(Coord mouse); + + + /** + * On focus gained + */ + public void onFocus(); + + /** + * On focus lost + */ + public void onBlur(); + + /** + * Check if this widget has focus + * + * @return has focus + */ + public boolean hasFocus(); + + /** + * Handle click (do effects etc.) + * + * @param pos mouse position + * @param button mouse button + * @param down true if the button was pressed + * @return this if event consumed + */ + public Widget onMouseButton(Coord pos, int button, boolean down); + + /** + * Handle scroll event + * + * @param pos mouse position + * @param scroll scroll (-1,0,1) + * @return this if event consumed + */ + public Widget onScroll(Coord pos, int scroll); + + /** + * Key pressed + * + * @param key key index + * @param chr character typed + * @return this if event consumed + */ + public Widget onKey(int key, char chr, boolean down); + + /** + * Check if can add child + * + * @return can add child to this widget? + */ + public boolean canAddChild(); + + /** + * Add child + * + * @param child + */ + public void add(Widget child); + + /** + * Remove child widget + * + * @param child removed child + */ + public void removeChild(Widget child); + + /** + * remove all childs + */ + public void removeAll(); + + /** + * calculate size based on contents and childs + */ + public void calcChildSizes(); + + /** + * set min height + * + * @param h + * @return this + */ + public IWidget setMinHeight(int h); + + /** + * set min width + * + * @param w + * @return this + */ + public IWidget setMinWidth(int w); + + /** + * Get gui container + * + * @return root + */ + public GuiRoot getGuiRoot(); + + /** + * Set gui container + * + * @param guiContainer + */ + public void setGuiRoot(GuiRoot guiContainer); + +} diff --git a/src/net/sector/gui/widgets/IWidgetFactory.java b/src/net/sector/gui/widgets/IWidgetFactory.java new file mode 100644 index 0000000..a3c5cc4 --- /dev/null +++ b/src/net/sector/gui/widgets/IWidgetFactory.java @@ -0,0 +1,6 @@ +package net.sector.gui.widgets; + + +public interface IWidgetFactory { + public Widget getWidget(); +} diff --git a/src/net/sector/gui/widgets/Widget.java b/src/net/sector/gui/widgets/Widget.java new file mode 100644 index 0000000..3d53974 --- /dev/null +++ b/src/net/sector/gui/widgets/Widget.java @@ -0,0 +1,422 @@ +package net.sector.gui.widgets; + + +import net.sector.gui.panels.Panel; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Rect; + + +/** + * Abstract widget class + * + * @author MightyPork + */ +public abstract class Widget implements IWidget { + + /** Theme */ + public ETheme theme = ETheme.BLUE; + + /** Widget text */ + public String text = ""; + /** Text render font */ + public String font = "default"; + /** widget id */ + public int id = -1; + /** flag is visible */ + public boolean visible = true; + /** flag is enabled */ + public boolean enabled = true; + /** has focus */ + public boolean focused = false; + /** bounding rectangle */ + public Rect rect = new Rect(); + /** required margins */ + public WidgetMargins margins = new WidgetMargins(5, 5, 5, 5); + /** minimal size */ + public Coord minSize = new Coord(); + /** Gui hierarchy root */ + public GuiRoot guiRoot; + /** Widget tag */ + public String tag = ""; + /** Selected flag (for toggle buttons and similar) */ + public boolean selected = false; + /** Clicked flag */ + public boolean clicked = false; + + /** + * Get widget font + * + * @return font name + */ + public final String getFont() { + return font; + } + + /** + * Set widget font + * + * @param font font name + * @return this + */ + public final Widget setFont(String font) { + this.font = font; + return this; + } + + /** + * Get if widget is focused + * + * @return is focused + */ + public final boolean isFocused() { + return focused; + } + + /** + * Set widget focused + * + * @param focused focused flag + * @return this + */ + public final Widget setFocused(boolean focused) { + this.focused = focused; + return this; + } + + /** + * Get theme + * + * @return theme + */ + public final ETheme getTheme() { + return theme; + } + + /** + * Set widget theme + * + * @param theme theme to set + * @return this + */ + public final Widget setTheme(ETheme theme) { + this.theme = theme; + return this; + } + + /** + * Get if this widget has "SELECTED" flag. + * + * @return has selected flag. + */ + public final boolean isSelected() { + return selected; + } + + /** + * Get if this widget has "CLICKED" flag (used in buttons and similar). + * + * @return has selected flag. + */ + public final boolean isClicked() { + return false; + } + + /** + * Set "SELECTED" flag. + * + * @param state flag state + * @return this + */ + public final Widget setSelected(boolean state) { + selected = state; + return this; + } + + /** + * Set "CLICKED" flag. + * + * @param state flag state + * @return this + */ + public final Widget setClicked(boolean state) { + clicked = state; + return this; + } + + /** + * Get color from theme + * + * @param role color role + * @param mouse mouse position + * @return RGB color + */ + public final RGB getColor(EColorRole role, Coord mouse) { + ColorScheme cs = ColorScheme.getForTheme(theme); + return cs.getColor(role, isPanelOnTop(), enabled, isMouseOver(mouse), isClicked(), isSelected()); + } + + /** + * Get color from theme + * + * @param role color role + * @param mouse mouse position + * @param hover (explicitly set HOVER flag) + * @return RGB color + */ + public final RGB getColor(EColorRole role, Coord mouse, boolean hover) { + ColorScheme cs = ColorScheme.getForTheme(theme); + return cs.getColor(role, isPanelOnTop(), enabled, hover, isClicked(), isSelected()); + } + + /** + * Get color from theme + * + * @param role color role + * @return RGB color + */ + public final RGB getColor(EColorRole role) { + ColorScheme cs = ColorScheme.getForTheme(theme); + return cs.getColor(role, isPanelOnTop(), enabled, false, false, isSelected()); + } + + /** + * Set widget tag + * + * @param tag tag + * @return this + */ + public final Widget setTag(String tag) { + this.tag = tag; + return this; + } + + /** + * Get widget tag + * + * @return tag + */ + public final String getTag() { + return tag; + } + + @Override + public final Widget setMargins(int left, int top, int right, int bottom) { + margins.setTo(left, top, right, bottom); + return this; + } + + + @Override + public final Widget setMarginsH(int left, int right) { + margins.left = left; + margins.right = right; + return this; + } + + + @Override + public final Widget setMarginsV(int top, int bottom) { + margins.top = top; + margins.bottom = bottom; + return this; + } + + @Override + public final WidgetMargins getMargins() { + return margins; //.mul(App.fs12()); + } + + @Override + public Widget setText(String text) { + this.text = text; + return this; + } + + @Override + public final String getText() { + return text; + } + + @Override + public final Widget setId(int id) { + this.id = id; + return this; + } + + @Override + public final int getId() { + return id; + } + + @Override + public final Widget setEnabled(boolean state) { + enabled = state; + return this; + } + + @Override + public final boolean isEnabled() { + return enabled; + } + + @Override + public final Widget setVisible(boolean state) { + visible = state; + return this; + } + + @Override + public final boolean isVisible() { + return visible; + } + + @Override + public final Widget setMinSize(Coord size) { + minSize.setTo(size); + return this; + } + + @Override + public final Widget setMinSize(int w, int h) { + minSize.setTo(w, h); + return this; + } + + + @Override + public final Widget setMinWidth(int w) { + minSize.x = w; + return this; + } + + + @Override + public final Widget setMinHeight(int h) { + minSize.y = h; + return this; + } + + @Override + public final Coord getMinSize() { + return minSize; + } + + @Override + public final Coord getSize() { + return rect.getSize(); + } + + @Override + public final Widget setRect(Rect rect) { + rect.setTo(rect); + return this; + } + + @Override + public final Rect getRect() { + return rect; + } + + @Override + public boolean isMouseOver(Coord mouse) { + return rect.isInside(mouse); + } + + @Override + public abstract void render(Coord mouse); + + @Override + public void onFocus() {} + + @Override + public void onBlur() {} + + @Override + public final boolean hasFocus() { + return focused; + } + + @Override + public abstract Widget onMouseButton(Coord pos, int button, boolean down); + + @Override + public abstract Widget onScroll(Coord pos, int scroll); + + @Override + public abstract Widget onKey(int key, char chr, boolean down); + + @Override + public boolean canAddChild() { + return false; + } + + @Override + public void add(Widget child) {} + + @Override + public void removeChild(Widget child) {} + + @Override + public void removeAll() {} + + @Override + public abstract void calcChildSizes(); + + @Override + public final GuiRoot getGuiRoot() { + return guiRoot; + } + + /** + * Get root panel + * + * @return panel + */ + public final Panel getPanel() { + return guiRoot.getPanel(); + } + + /** + * Get if the panel is on top. + * + * @return is opn top. + */ + public final boolean isPanelOnTop() { + return getGuiRoot().isPanelOnTop(); + } + + + @Override + public void setGuiRoot(GuiRoot guiContainer) { + this.guiRoot = guiContainer; + } + + /** + * Render tooltip for current widget + * + * @param text text + * @param color color + */ + public void renderTooltip(String text, RGB color) { + getGuiRoot().setTooltip(text, color); + } + + /** + * Render white tooltip for current widget + * + * @param text text + */ + public void renderTooltip(String text) { + getGuiRoot().setTooltip(text, RGB.WHITE); + } + + + /** + * Handle static inputs (mouse coord given, in case it be needed) + * + * @param pos mouse + */ + public void handleStaticInputs(Coord pos) {} +} diff --git a/src/net/sector/gui/widgets/WidgetMargins.java b/src/net/sector/gui/widgets/WidgetMargins.java new file mode 100644 index 0000000..f63d7ac --- /dev/null +++ b/src/net/sector/gui/widgets/WidgetMargins.java @@ -0,0 +1,80 @@ +package net.sector.gui.widgets; + + +/** + * Margins container class + * + * @author MightyPork + */ +public class WidgetMargins { + /** left margin */ + public int left; + /** top margin */ + public int top; + /** right margin */ + public int right; + /** bottom margin */ + public int bottom; + + /** + * new set of margins + * + * @param left + * @param top + * @param right + * @param bottom + */ + public WidgetMargins(int left, int top, int right, int bottom) { + setTo(left, top, right, bottom); + } + + /** + * new set of margins + * + * @param other + */ + public WidgetMargins(WidgetMargins other) { + setTo(other); + } + + /** + * set margins to.... + * + * @param left + * @param top + * @param right + * @param bottom + */ + public void setTo(int left, int top, int right, int bottom) { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + + /** + * set margins to.... + * + * @param other other margins obj + */ + public void setTo(WidgetMargins other) { + this.left = other.left; + this.top = other.top; + this.right = other.right; + this.bottom = other.bottom; + } + + /** + * get copy multiplied by some number. + * + * @param mul miltiplier + * @return copy multiplied + */ + public WidgetMargins mul(int mul) { + return new WidgetMargins(left * mul, top * mul, right * mul, bottom * mul); + } + + public WidgetMargins copy() { + return new WidgetMargins(this); + } +} diff --git a/src/net/sector/gui/widgets/composite/CompositeScrollBox.java b/src/net/sector/gui/widgets/composite/CompositeScrollBox.java new file mode 100644 index 0000000..6fddcfc --- /dev/null +++ b/src/net/sector/gui/widgets/composite/CompositeScrollBox.java @@ -0,0 +1,79 @@ +package net.sector.gui.widgets.composite; + + +import java.util.ArrayList; +import java.util.List; + +import net.sector.annotations.Internal; +import net.sector.gui.widgets.IWidgetFactory; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.input.Scrollbar; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.ScrollingLayoutV; +import net.sector.util.Align; + + +public class CompositeScrollBox extends LayoutH { + + private ScrollingLayoutV layoutV; + private Scrollbar scrollbar; + + public CompositeScrollBox(int size, int scrollbarWidth, IWidgetFactory fakeWidgetFactory, List elements) { + super(Align.TOP); + + layoutV = new ScrollingLayoutV(size, fakeWidgetFactory); + + for (Widget w : elements) { + layoutV.addChild(w); + } + + add(layoutV); + + add(scrollbar = new Scrollbar(scrollbarWidth, (int) layoutV.getSize().y).setScrollable(layoutV)); + } + + public CompositeScrollBox(int size, IWidgetFactory fakeWidgetFactory, List elements) { + this(size, 31, fakeWidgetFactory, elements); + } + + public CompositeScrollBox(int size, int scrollbarWidth, IWidgetFactory fakeWidgetFactory) { + this(size, scrollbarWidth, fakeWidgetFactory, new ArrayList()); + } + + public CompositeScrollBox(int size, IWidgetFactory fakeWidgetFactory) { + this(size, 31, fakeWidgetFactory, new ArrayList()); + } + + public CompositeScrollBox addItem(Widget item) { + item.setGuiRoot(getGuiRoot()); + layoutV.addChild(item); + return this; + } + + public ArrayList getItems() { + return layoutV.children; + } + + /** + * Refresh positions and contents after some children were added or removed. + */ + public void refresh() { + setGuiRoot(getGuiRoot()); + layoutV.onScrollbarChange(scrollbar.getValue()); + setGuiRoot(getGuiRoot()); + //scb.setValue(0); + } + + @Override + @Internal + public void add(Widget child) { + super.add(child); + child.setGuiRoot(getGuiRoot()); + } + + @Override + public void removeAll() { + layoutV.removeAll(); + } + +} diff --git a/src/net/sector/gui/widgets/composite/DraggablePiece.java b/src/net/sector/gui/widgets/composite/DraggablePiece.java new file mode 100644 index 0000000..d60f84c --- /dev/null +++ b/src/net/sector/gui/widgets/composite/DraggablePiece.java @@ -0,0 +1,144 @@ +package net.sector.gui.widgets.composite; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.fonts.FontManager; +import net.sector.level.ship.PieceBundle; +import net.sector.level.ship.PieceRegistry; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.Align; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Variant of PieceBundle used in designer. + * + * @author MightyPork + */ +public class DraggablePiece extends PieceBundle { + /** Model for designer */ + RenderModel model = null; + + /** + * create draggable piece from name + * + * @param id piece name + */ + public DraggablePiece(String id) { + super(id); + model = PieceRegistry.getModel(id); + } + + /** + * Create draggable piece as copy of another + * + * @param draggablePiece other piece + */ + public DraggablePiece(DraggablePiece draggablePiece) { + super(draggablePiece); + model = draggablePiece.model; + } + + /** + * Create from bundle + * + * @param bundle bundle + */ + public DraggablePiece(PieceBundle bundle) { + super(bundle); + model = PieceRegistry.getModel(id); + } + + /** + * Convert to ordinary bundle + * + * @return bundle + */ + public PieceBundle asBundle() { + return this; + } + + /** + * Render model in designer + */ + public void renderModel() { + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + Models.renderBegin(); + glScaled(15, 15, 15); + glRotated(90, 1, 0, 0); + glRotated(rotate, 0, 1, 0); + model.render(); + Models.renderEnd(); + glPopAttrib(); + glPopMatrix(); + + } + + /** + * Render labels in designer (currently only number of level) + * + * @param isSelected is piece selected (has # overlay) + */ + public void renderLabels(boolean isSelected) { + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + glEnable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + + glTranslated(0, 0, 40); + + Coord txtPos = new Coord(15, -20); + + // calc the color + RGB clr = PieceRegistry.getDamageColor(health, healthMax); + + // prepare + FontManager.setFont("designer_level"); + FontManager.setAlign(Align.RIGHT); + FontManager.setColor(new RGB(0, 0, 0, 0.4)); + + String l = level + ""; + + // shadows on all sides... + FontManager.draw(txtPos.add(1, -1), l); + FontManager.draw(txtPos.add(-1, -1), l); + FontManager.draw(txtPos.add(1, 1), l); + FontManager.draw(txtPos.add(-1, 1), l); + FontManager.draw(txtPos, l, clr); + + + if (isSelected) { + txtPos.setTo(15, -3); + + FontManager.setColor(new RGB(0, 0, 0, 0.4)); + + l = "#"; + + // shadows on all sides... + FontManager.draw(txtPos.add(1, -1), l); + FontManager.draw(txtPos.add(-1, -1), l); + FontManager.draw(txtPos.add(1, 1), l); + FontManager.draw(txtPos.add(-1, 1), l); + + clr.setTo(0.3, 0.4, 1, 1); + + FontManager.draw(txtPos, l, clr); + } + + glPopAttrib(); + glPopMatrix(); + } + + /** + * Duplicate + */ + @Override + public DraggablePiece copy() { + return new DraggablePiece(this); + } +} diff --git a/src/net/sector/gui/widgets/composite/ListItemHighscore.java b/src/net/sector/gui/widgets/composite/ListItemHighscore.java new file mode 100644 index 0000000..1f9d778 --- /dev/null +++ b/src/net/sector/gui/widgets/composite/ListItemHighscore.java @@ -0,0 +1,44 @@ +package net.sector.gui.widgets.composite; + + +import net.sector.gui.panels.HsColors; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.display.TextDouble; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.util.Align; + +import com.porcupine.color.RGB; +import com.porcupine.util.StringUtils; + + +public class ListItemHighscore extends LayoutH { + + + public TextDouble dt; + + public ListItemHighscore(int place, String name, int score, boolean user, boolean active) { + super(Align.CENTER); + + Text t; + add(t = new Text(place + ".", "small_text")); + t.setColorText(new RGB(0.6, 0.6, 1)); + t.setTextAlign(Align.RIGHT); + t.setMinWidth(40); + t.setMarginsH(2, 5); + + add(dt = new TextDouble(390)); + dt.setFonts("small_text", "small_text"); + dt.setTexts(name, StringUtils.formatInt(score)); + + RGB left = RGB.WHITE; + if (user && !active) left = HsColors.USER; + if (user && active) left = HsColors.USER_ACTIVE; + if (!user && !active) left = HsColors.GUEST; + if (!user && active) left = HsColors.GUEST_ACTIVE; + + dt.setColors(left, HsColors.SCORE); + + calcChildSizes(); + } + +} diff --git a/src/net/sector/gui/widgets/composite/ListItemLevel.java b/src/net/sector/gui/widgets/composite/ListItemLevel.java new file mode 100644 index 0000000..93ef904 --- /dev/null +++ b/src/net/sector/gui/widgets/composite/ListItemLevel.java @@ -0,0 +1,129 @@ +package net.sector.gui.widgets.composite; + + +import net.sector.App; +import net.sector.gui.panels.highscore.PanelHiscoreLocal; +import net.sector.gui.panels.highscore.PanelHiscoreShared; +import net.sector.gui.screens.ScreenDesigner; +import net.sector.gui.widgets.display.Icon; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.ButtonIcon; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.gui.widgets.layout.LayoutV; +import net.sector.input.Function; +import net.sector.level.ELevel; +import net.sector.level.LevelBundle; +import net.sector.level.SuperContext; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +public class ListItemLevel extends LayoutH { + + protected ButtonIcon bnPlay; + + public LevelBundle level = null; + + private ButtonIcon bnHighscore; + + private Text txTitle; + + private Text txSubTitle; + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + + + RGB topC = new RGB(0x5D3DD1, 0.4); + RGB downC = new RGB(0x3D71D1, 0.4); + + if (isMouseOver(mouse) && isPanelOnTop()) { + topC = new RGB(0x5D3DD1, 0.6); + downC = new RGB(0x3D71D1, 0.6); + } + + RenderUtils.quadRectGradV(rect, topC, downC); + + super.render(mouse); + } + + public ListItemLevel(LevelBundle level) { + super(Align.CENTER); + this.level = level; + + setMinWidth(600); + setMinHeight(60); + + String texture = "designer_icons"; + + add(new Gap(8, 0)); + if (level == null || level.type == ELevel.INTERNAL) { + add(new Icon(texture, 3, 2).setTooltip("Built-in level", new RGB(0xffff66)).setColor(new RGB(0xFFB836))); + } else if (level.type == ELevel.LOCAL) { + add(new Icon(texture, 3, 2).setTooltip("Local level", new RGB(0xffcc55)).setColor(new RGB(0xFF7826))); + } else { + add(new Icon(texture, 0, 2).setTooltip("Shared level", new RGB(0x9999ff)).setColor(new RGB(0x709DFF))); + } + + add(new Gap(5, 0)); + + LayoutV lv = (LayoutV) new LayoutV(Align.LEFT).setMinWidth(440); + lv.add(txTitle = (Text) new Text("Level title", "level_title").setTextAlign(Align.LEFT).setMinWidth(440)); + lv.add(txSubTitle = (Text) new Text("Level subtitle", "level_subtitle").setTextAlign(Align.LEFT).setMinWidth(440)); + add(lv); + + txTitle.setMarginsV(10, 0); + txSubTitle.setColorText(new RGB(0xffffff, 0.7)).setMarginsV(0, 0); + + add(new Gap(5, 0)); + + add(bnHighscore = (ButtonIcon) new ButtonIcon(-1, texture, 2, 2).setColor(new RGB(0x11ccff)).setPadding(3, 3)); + add(new Gap(5, 0)); + add(bnPlay = (ButtonIcon) new ButtonIcon(-1, texture, 5, 2).setColor(RGB.GREEN).setPadding(3, 3)); + add(new Gap(5, 0)); + calcChildSizes(); + + + bnPlay.setTooltip("Play", new RGB(0x66ff66)); + bnHighscore.setTooltip("Highscore", new RGB(0x99ccff)); + + + bnPlay.addOnClickHandler(new Function() { + @Override + public Boolean run(Object... args) { + + SuperContext.startGame(ListItemLevel.this.level); + + App.inst.replaceScreen(new ScreenDesigner()); + + return true; + } + }); + + bnHighscore.addOnClickHandler(new Function() { + @Override + public Boolean run(Object... args) { + + if (ListItemLevel.this.level.type == ELevel.NET) { + ListItemLevel.this.getPanel().openPanel(new PanelHiscoreShared(ListItemLevel.this.getPanel().screen, ListItemLevel.this.level)); + } else { + ListItemLevel.this.getPanel().openPanel(new PanelHiscoreLocal(ListItemLevel.this.getPanel().screen, ListItemLevel.this.level)); + } + + return true; + } + }); + + if (level != null) { + txTitle.setText(level.title); + txSubTitle.setText(level.subtitle); + } + + } +} diff --git a/src/net/sector/gui/widgets/composite/ListItemProfile.java b/src/net/sector/gui/widgets/composite/ListItemProfile.java new file mode 100644 index 0000000..24804ec --- /dev/null +++ b/src/net/sector/gui/widgets/composite/ListItemProfile.java @@ -0,0 +1,213 @@ +package net.sector.gui.widgets.composite; + + +import java.util.ArrayList; + +import net.sector.gui.panels.dialogs.PanelDialogModal; +import net.sector.gui.panels.dialogs.PanelDialogModal.IDialogListener; +import net.sector.gui.panels.profiles.PanelProfileEdit; +import net.sector.gui.panels.profiles.PanelProfileFixLogin; +import net.sector.gui.panels.profiles.PanelProfiles; +import net.sector.gui.widgets.IRefreshable; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.display.ColorRectange; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.ButtonIcon; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.input.Function; +import net.sector.network.UserProfile; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +public class ListItemProfile extends LayoutH implements IRefreshable { + + public UserProfile profile = null; + + public ArrayList scrollList = null; + + + protected RGB indicatorColor = new RGB(0x999999); + protected ButtonIcon bnSelect, bnEdit, bnRemove; + protected Text txName; + + private ColorRectange indicator; + + /** + * Set scroll list (list of children in CompositeScrollBox + * + * @param scrollList arraylist of children + * @return this + */ + public ListItemProfile setScrollList(ArrayList scrollList) { + this.scrollList = scrollList; + return this; + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + RGB topC = new RGB(0x5D3DD1, 0.4); + RGB downC = new RGB(0x3D71D1, 0.4); + + if (profile.isSelected()) { + topC = new RGB(0x5D3DD1, 0.9); + downC = new RGB(0x3D71D1, 0.9); + } + + if (profile.isRemoved()) { + topC = new RGB(0x888888, 0.5); + downC = new RGB(0x666666, 0.5); + } + + RenderUtils.quadRectGradV(rect, topC, downC); + + if (!profile.isRemoved()) { + superRender(mouse); + } + } + + public void superRender(Coord pos) { + super.render(pos); + } + + public ListItemProfile(UserProfile profile) { + this(); + setProfile(profile); + } + + public ListItemProfile() { + super(Align.CENTER); + setMinWidth(500); + setMinHeight(50); + + add(new Gap(5, 0)); + add(indicator = new ColorRectange(20, 50, 5, 3, indicatorColor)); + + String texture = "designer_icons"; + Coord imgSize = new Coord(32, 32); + + add(bnSelect = new ButtonIcon(-1, texture, 0, 3).setColor(RGB.GREEN)); + add(new Gap(5, 0)); + add(txName = (Text) new Text("", "small_menu").setTextAlign(Align.LEFT).setMinWidth(315)); + add(new Gap(5, 0)); + add(bnEdit = new ButtonIcon(-1, texture, 2, 3).setColor(new RGB(0xCCCCCC))); + add(bnRemove = new ButtonIcon(-1, texture, 1, 3).setColor(RGB.RED)); + calcChildSizes(); + + + bnSelect.setTooltip("Select", new RGB(0x66ff66)); + bnEdit.setTooltip("Edit", RGB.WHITE); + bnRemove.setTooltip("Forget", new RGB(0xff6666)); + + bnSelect.addOnClickHandler(new Function() { + @Override + public Boolean run(Object... args) { + profile.selectThisUser(); + refreshAll(); + return true; + } + }); + + + bnEdit.addOnClickHandler(new Function() { + @Override + public Boolean run(Object... args) { + + if (!profile.isActivated()) { + getPanel().openPanel(new PanelProfileFixLogin(getPanel().screen, ((PanelProfiles) getPanel()).loginHandler, profile)); + } else { + getPanel().openPanel(new PanelProfileEdit(getPanel().screen, ListItemProfile.this)); + } + + return true; + } + }); + + + bnRemove.addOnClickHandler(new Function() { + @Override + public Boolean run(Object... args) { + + PanelDialogModal p; + + IDialogListener listener = new IDialogListener() { + @Override + public void onDialogButton(int dialogId, int button) { + if (button == 0) return; + if (button == 1) { + profile.setRemoved(true); + refreshAll(); + } + } + }; + + String msg = "This will only FORGET the login.\n\nTo DELETE a profile, use profile edit screen. "; + + p = new PanelDialogModal(getPanel().screen, listener, -1, true, msg, "Cancel", "Forget " + profile.uname); + p.setEnterButton(1); + getPanel().openPanel(p); + + return true; + } + }); + + refresh(); + + } + + public ListItemProfile setProfile(UserProfile profile) { + this.profile = profile; + refresh(); + return this; + } + + public void refreshAll() { + for (Widget w : scrollList) { + IRefreshable ref = (IRefreshable) w; + ref.refresh(); + } + } + + @Override + public void refresh() { + if (profile == null) return; + txName.setText(profile.uname); + + if (profile.isRemoved()) { + indicatorColor.setTo(RGB.BLACK); + bnSelect.setEnabled(false); + bnRemove.setEnabled(false); + bnEdit.setEnabled(false); + bnSelect.setSelected(false); + return; + } + + if (profile.isActivated()) { + indicatorColor.setTo(RGB.GREEN); + indicator.setTooltip("Logged in", new RGB(0x66ff66)); + bnSelect.setEnabled(true); + bnRemove.setEnabled(true); + bnEdit.setEnabled(true); + bnSelect.setSelected(false); + } else { + indicatorColor.setTo(RGB.RED); + indicator.setTooltip("Login failed", new RGB(0xff6666)); + bnSelect.setEnabled(false); + bnRemove.setEnabled(true); + bnEdit.setEnabled(true); + bnSelect.setSelected(false); + } + + if (profile.isSelected()) { + bnSelect.setEnabled(true); + bnSelect.setSelected(true); + } + } + +} diff --git a/src/net/sector/gui/widgets/composite/ListItemProfileGuest.java b/src/net/sector/gui/widgets/composite/ListItemProfileGuest.java new file mode 100644 index 0000000..3e676f3 --- /dev/null +++ b/src/net/sector/gui/widgets/composite/ListItemProfileGuest.java @@ -0,0 +1,108 @@ +package net.sector.gui.widgets.composite; + + +import java.util.ArrayList; + +import net.sector.gui.widgets.IRefreshable; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.display.ColorRectange; +import net.sector.gui.widgets.display.Text; +import net.sector.gui.widgets.input.ButtonIcon; +import net.sector.gui.widgets.layout.Gap; +import net.sector.gui.widgets.layout.LayoutH; +import net.sector.input.Function; +import net.sector.level.SuperContext; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +public class ListItemProfileGuest extends LayoutH implements IRefreshable { + + protected RGB indicatorColor; + public ArrayList scrollList = null; + protected ButtonIcon bnSelect; + + /** + * Set scroll list (list of children in CompositeScrollBox + * + * @param scrollList arraylist of children + * @return this + */ + public ListItemProfileGuest setScrollList(ArrayList scrollList) { + this.scrollList = scrollList; + return this; + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + RGB topC = new RGB(0x5D3DD1, 0.4); + RGB downC = new RGB(0x3D71D1, 0.4); + + if (SuperContext.selectedUser == null) { + topC = new RGB(0x5D3DD1, 0.9); + downC = new RGB(0x3D71D1, 0.9); + } + + RenderUtils.quadRectGradV(rect, topC, downC); + + super.render(mouse); + } + + public ListItemProfileGuest() { + super(Align.CENTER); + + indicatorColor = new RGB(0x77ccff); + + setMinWidth(500); + setMinHeight(50); + + add(new Gap(5, 0)); + add(new ColorRectange(20, 50, 5, 3, indicatorColor).setTooltip("Play without profile", new RGB(0xffffff))); + + String texture = "designer_icons"; + + add(bnSelect = new ButtonIcon(-1, texture, 0, 3).setColor(RGB.GREEN)); + add(new Gap(5, 0)); + add(new Text("Guest", "small_menu").setTextAlign(Align.LEFT).setMinWidth(315)); + calcChildSizes(); + + + bnSelect.setTooltip("Select", new RGB(0x66ff66)); + + + bnSelect.addOnClickHandler(new Function() { + @Override + public Boolean run(Object... args) { + SuperContext.selectedUser = null; + refreshAll(); + return true; + } + }); + + refresh(); + + } + + public void refreshAll() { + for (Widget w : scrollList) { + IRefreshable ref = (IRefreshable) w; + ref.refresh(); + } + } + + + @Override + public void refresh() { + if (SuperContext.selectedUser != null) { + bnSelect.setSelected(false); + } else { + bnSelect.setSelected(true); + } + } + +} diff --git a/src/net/sector/gui/widgets/composite/ShipDesignerBase.java b/src/net/sector/gui/widgets/composite/ShipDesignerBase.java new file mode 100644 index 0000000..ff2ea86 --- /dev/null +++ b/src/net/sector/gui/widgets/composite/ShipDesignerBase.java @@ -0,0 +1,212 @@ +package net.sector.gui.widgets.composite; + + +import static net.sector.gui.widgets.EColorRole.*; +import static org.lwjgl.opengl.GL11.*; +import net.sector.gui.widgets.Widget; +import net.sector.sounds.Sounds; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; + + +/** + * ship designer table + * + * @author MightyPork + */ +public abstract class ShipDesignerBase extends Widget { + + protected ShipDesignerController control = null; + + public Widget setDragController(ShipDesignerController ctrl) { + control = ctrl; + return this; + } + + protected int W = 9; + protected int H = 9; + public DraggablePiece[][] slots; + + protected double slotSize = 40; + protected double line = 2; + + protected Coord lastRenderMouse = new Coord(); + + public ShipDesignerBase(int w, int h) { + W = w; + H = h; + slots = new DraggablePiece[H][W]; + } + + protected abstract boolean isCentralSlotHighlited(); + + protected RGB getBgColor() { + return getColor(BG); + } + + protected RGB getCenterColor() { + return getColor(FG); + } + + protected RGB getLineColor() { + return getColor(BDR); + } + + @Override + public void render(Coord mouse) { + + lastRenderMouse.setTo(mouse); + + glPushMatrix(); + // BG + RenderUtils.setColor(getBgColor()); + RenderUtils.quadCoord(rect.getMin().x, rect.getMin().y, rect.getMax().x, rect.getMax().y); + + if (isCentralSlotHighlited()) { + RenderUtils.setColor(getCenterColor()); + RenderUtils.quadCoord(rect.getCenter().x - slotSize / 2, rect.getCenter().y - slotSize / 2, rect.getCenter().x + slotSize / 2, + rect.getCenter().y + slotSize / 2); + } + // LINES + RenderUtils.setColor(getLineColor()); + + // vertical + for (int i = 0; i < W + 1; i++) { + RenderUtils.quadCoord(rect.getMin().x + i * (line + slotSize), rect.getMin().y, rect.getMin().x + i * (line + slotSize) + line, + rect.getMax().y); + } + + // horizontal + for (int i = 0; i < H + 1; i++) { + RenderUtils.quadCoord(rect.getMin().x, rect.getMin().y + i * (line + slotSize), rect.getMax().x, rect.getMin().y + i * (line + slotSize) + + line); + } + + + // piece models + for (int x = 0; x < W; x++) { + for (int y = 0; y < H; y++) { + glPushMatrix(); + glTranslated(rect.getMin().x + x * (line + slotSize) + line + slotSize / 2, rect.getMin().y + y * (line + slotSize) + line + slotSize + / 2, 5); + + if (isSlotBad(x, H - 1 - y)) { + RenderUtils.setColor(new RGB(1, 0, 0, 0.6)); + RenderUtils.quadSize(-slotSize / 2, -slotSize / 2, slotSize, slotSize); + RenderUtils.setColor(RGB.WHITE); + } + + if (slots[H - 1 - y][x] != null) slots[H - 1 - y][x].renderModel(); + glPopMatrix(); + } + } + + // piece labels + for (int x = 0; x < W; x++) { + for (int y = 0; y < H; y++) { + if (slots[H - 1 - y][x] == null) continue; + if (!hasSlotLevelOverlay(x, H - 1 - y)) continue; + glPushMatrix(); + glTranslated(rect.getMin().x + x * (line + slotSize) + line + slotSize / 2, rect.getMin().y + y * (line + slotSize) + line + slotSize + / 2, 20); + slots[H - 1 - y][x].renderLabels(isSlotSelected(x, H - 1 - y)); + glPopMatrix(); + } + } + + glPopMatrix(); + } + + /** + * Get if slot at given coords has been marked as selected and should be + * rendered with a hash mark. + * + * @param x x coord + * @param y y coord + * @return is selected + */ + protected abstract boolean isSlotSelected(int x, int y); + + + + /** + * Get if slot is erroneous + * + * @param x slot x coord + * @param y slot y coord + * @return is bad + */ + protected abstract boolean isSlotBad(int x, int y); + + /** + * Get cell coord under mouse (null if outside this widget) + * + * @param mouse mouse pos + * @return cell coord + */ + protected final CoordI getCoordUnderMouse(Coord mouse) { + if (!isMouseOver(mouse)) return null; + Coord pos = mouse.copy(); + + pos.sub_ip(rect.getMin()); + CoordI c = new CoordI((int) Math.floor(pos.x / (slotSize + line)), (int) (H - 1 - Math.floor(pos.y / (slotSize + line)))); + if (c.x < 0 || c.x >= W || c.y < 0 || c.y >= H) return null; + return c; + } + + protected final void sndGrab() { + Sounds.click2.playEffect(1.3f, 0.3f, false); + } + + protected final void sndDrop() { + Sounds.click2.playEffect(0.8f, 0.3f, false); + } + + protected final void sndDelete() { + Sounds.click2.playEffect(0.5f, 0.4f, false); + } + + protected final void sndLevelUp() { + Sounds.des_level_up.playEffect(1f, 0.8f, false); + } + + protected final void sndLevelDown() { + Sounds.des_level_down.playEffect(1f, 0.8f, false); + } + + protected final void sndRepair() { + Sounds.des_repair.playEffect(0.7f, 1, false); + } + + protected final void sndRotate() { + Sounds.click1.playEffect(1.5f, 0.2f, false); + } + + protected final void sndBuild() { + sndDrop(); + } + + @Override + public abstract Widget onMouseButton(Coord pos, int button, boolean down); + + @Override + public void onBlur() {} + + @Override + public abstract Widget onScroll(Coord pos, int scroll); + + @Override + public abstract Widget onKey(int key, char chr, boolean down); + + @Override + public final void calcChildSizes() { + setMinSize(new Coord((slotSize + line) * W + line, (slotSize + line) * H + line)); + rect.setTo(0, 0, minSize.x, minSize.y); + } + + protected abstract boolean hasSlotLevelOverlay(int x, int y); + +} diff --git a/src/net/sector/gui/widgets/composite/ShipDesignerController.java b/src/net/sector/gui/widgets/composite/ShipDesignerController.java new file mode 100644 index 0000000..9dbf0bc --- /dev/null +++ b/src/net/sector/gui/widgets/composite/ShipDesignerController.java @@ -0,0 +1,304 @@ +package net.sector.gui.widgets.composite; + + +import static net.sector.level.EBuildingMode.*; +import static org.lwjgl.opengl.GL11.*; + +import java.util.HashSet; +import java.util.Set; + +import net.sector.gui.widgets.Widget; +import net.sector.level.EBuildingMode; +import net.sector.level.ship.PieceRegistry; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; + + +/** + * Ship piece drag controller GUI (no size).
+ * In design must be after all other tables. + * + * @author MightyPork + */ +public class ShipDesignerController extends Widget { + + public int money = 0; + + private boolean dragging = false; + private DraggablePiece dragged = null; + /** coord in table the piece was picked from */ + protected CoordI pickFrom = new CoordI(-1, -1); + private ShipDesignerBase dragFrom = null; + + public EBuildingMode buildMode = NORMAL; + + public boolean boughtPiece = false; + + private Set tables = new HashSet(); + + public boolean infoIsBought = false; + + public boolean infoRepair = false; + public int infoRepairCost = 0; + + public boolean infoValue = false; + public int infoValueCost = 0; + + public boolean infoBuy = false; + public int infoBuyCost = 0; + + public boolean infoUpgrade = false; + public int infoUpgradeCost = 0; + + public boolean infoDowngrade = false; + public int infoDowngradeCost = 0; + + public String pieceTriggerDesc = ""; + + public boolean canEdit() { + return buildMode != LOCKED; + } + + /** + * Drag controller + * + * @param money total money + */ + public ShipDesignerController(int money) { + setMargins(0, 0, 0, 0); + setMinSize(0, 0); + setMoney(money); + } + + /** + * Get total money stored in the controller + * + * @return money + */ + public int getTotalMoney() { + return money; + } + + /** + * Check if has money + * + * @param needed needed money + * @return has enough + */ + public boolean hasMoney(int needed) { + if (buildMode == FREE) return true; + return money >= needed; + } + + /** + * Consume given amount of money if has enough + * + * @param needed needed money + * @return consumed all + */ + public boolean consumeMoney(int needed) { + if (buildMode == FREE) return true; + if (hasMoney(needed)) { + money -= needed; + return true; + } + return false; + } + + /** + * Set total money + * + * @param total total money + */ + public void setMoney(int total) { + money = total; + } + + /** + * Add money to storage + * + * @param added added money + */ + public void addMoney(int added) { + money += added; + } + + /** + * Register slot table and connect to this controller + * + * @param table the table added + */ + public void addTable(ShipDesignerBase table) { + tables.add(table); + table.setDragController(this); + } + + /** + * Start dragging a piece + * + * @param from table it was grabbed in + * @param startPos pos in table + * @param piece piece dragged + * @param isPieceBought true if cancelDrag places this piece back to + * original table. + */ + public void startDrag(ShipDesignerBase from, CoordI startPos, DraggablePiece piece, boolean isPieceBought) { + dragFrom = from; + pickFrom.setTo(startPos); + dragging = true; + dragged = piece; + boughtPiece = isPieceBought; + } + + /** + * Is dragging a valid piece? + * + * @return is dragging + */ + public boolean isDragging() { + return dragging && dragged != null; + } + + /** + * Get dragged piece + * + * @return dragged piece + */ + public DraggablePiece getDragged() { + return dragged; + } + + @Override + public void render(Coord mouse) { + if (!isPanelOnTop()) return; + infoBuy = infoRepair = infoUpgrade = infoValue = infoUpgrade = infoDowngrade = false; + pieceTriggerDesc = ""; + infoIsBought = false; + if (isDragging()) { + if (dragged.hasTrigger()) pieceTriggerDesc = dragged.getTrigger().getLabel(false); + if (boughtPiece) { + infoIsBought = true; + infoValue = true; + infoValueCost = dragged.getTotalValue(); + + if (dragged.isDamaged()) { + infoRepair = true; + infoRepairCost = dragged.getRepairCost(); + } + + if (dragged.canBeUpgraded()) { + infoUpgrade = true; + infoUpgradeCost = dragged.getLevelChangeCost(1); + } + if (dragged.canBeDowngraded()) { + infoDowngrade = true; + infoDowngradeCost = dragged.getLevelChangeCost(-1); + } + } else { + infoIsBought = false; + infoBuy = true; + infoBuyCost = dragged.getTotalValue(); + + if (dragged.canBeUpgraded()) { + infoUpgrade = true; + infoUpgradeCost = dragged.getLevelChangeCost(1); + } + + if (dragged.canBeDowngraded()) { + infoDowngrade = true; + infoDowngradeCost = dragged.getLevelChangeCost(-1); + } + } + } + + // render dragged model + if (isDragging() && getGuiRoot().isPanelOnTop()) { + glPushMatrix(); + glTranslated(mouse.x, mouse.y, 50); + dragged.renderModel(); + dragged.renderLabels(false); + glPopMatrix(); + } + + if (isDragging()) return; + + for (ShipDesignerBase table : tables) { + CoordI tile = null; + DraggablePiece piece = null; + if ((tile = table.getCoordUnderMouse(table.lastRenderMouse)) != null && (piece = table.slots[tile.y][tile.x]) != null) { + + if (piece.hasTrigger()) pieceTriggerDesc = piece.getTrigger().getLabel(false); + + if (table instanceof ShipDesignerTable) { + infoIsBought = true; + infoValue = true; + infoValueCost = piece.getTotalValue(); + } else { + infoIsBought = false; + infoBuy = true; + infoBuyCost = piece.getTotalValue(); + } + + if (piece.canBeUpgraded()) { + infoUpgrade = true; + infoUpgradeCost = piece.getLevelChangeCost(1); + } + + if (piece.canBeDowngraded()) { + infoDowngrade = true; + infoDowngradeCost = piece.getLevelChangeCost(-1); + } + + if (piece.isDamaged()) { + infoRepair = true; + infoRepairCost = piece.getRepairCost(); + } + + getGuiRoot().setTooltip(PieceRegistry.getPieceLabel(piece.id), RGB.WHITE); + break; + } + } + } + + /** + * Reset drag info, discard dragged piece and data. + */ + public void resetDragInfo() { + pickFrom.setTo(-1, -1); + dragged = null; + dragging = false; + boughtPiece = false; + } + + /** + * Cancel drag, return piece to orig position if allowed, and reset drag + * info. + */ + public void cancelDrag() { + if (dragging && dragged != null && boughtPiece) dragFrom.slots[pickFrom.y][pickFrom.x] = dragged; + resetDragInfo(); + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + return null; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/composite/ShipDesignerShop.java b/src/net/sector/gui/widgets/composite/ShipDesignerShop.java new file mode 100644 index 0000000..b74770e --- /dev/null +++ b/src/net/sector/gui/widgets/composite/ShipDesignerShop.java @@ -0,0 +1,151 @@ +package net.sector.gui.widgets.composite; + + +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.composite.ShipDesignerTable.EdMode; +import net.sector.level.ship.DiscoveryTable; +import net.sector.level.ship.PieceRegistry; +import net.sector.level.ship.PieceRegistry.PieceEntry; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; + + +/** + * ship designer table + * + * @author MightyPork + */ +public class ShipDesignerShop extends ShipDesignerBase { + + private ShipDesignerTable table = null; + private DiscoveryTable discoveries; + + /** + * Designer Shop + * + * @param table table + * @param discoveries discovery table + */ + public ShipDesignerShop(ShipDesignerTable table, DiscoveryTable discoveries) { + super(3, 9); + this.table = table; + this.discoveries = discoveries; + + fillWithPieceGroup(PieceRegistry.designerDefaultGroup); + + setTheme(ETheme.DES_PANEL); + } + + /** + * Erase shop + */ + public void clearSlots() { + for (int x = 0; x < W; x++) { + for (int y = 0; y < H; y++) { + slots[y][x] = null; + } + } + } + + /** + * Fill shop with pieces from a group + * + * @param group group to use + */ + public void fillWithPieceGroup(String group) { + clearSlots(); + int cnt = 0; + for (PieceEntry pc : PieceRegistry.pieces.values()) { + if (pc.group.equals(group)) { + if (discoveries.isDiscovered(pc.discovery)) { + DraggablePiece p = slots[cnt / W][cnt % W] = new DraggablePiece(pc.id); + if (p.typeWeapon) p.rotate = -30; + cnt++; + } + } + } + } + + + + @Override + public void render(Coord mouse) { + super.render(mouse); + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (!control.canEdit()) return null; + + boolean b0 = button == 0; + boolean up = !down; + + boolean dragging = control.isDragging(); + + // RMB to cancel building. + if (isMouseOver(pos)) { + // init one build + if (b0 && down && (!dragging || table.isBuilding())) { + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) return this; + DraggablePiece p = slots[tile.y][tile.x]; + if (p == null) return this; + p = p.copy(); + p.rotate = 0; + control.startDrag(this, tile, p, false); + table.editMode = EdMode.BUILD_ONE; + sndGrab(); + return this; + } + + // click - release → paint building + if (b0 && up && dragging && table.isBuilding()) { + table.editMode = EdMode.BUILD; + return this; + } + + // trash function + if (b0 && !down && dragging && !table.isBuilding()) { + table.sellPiece(control.getDragged()); + control.resetDragInfo(); + return this; + } + } + + return null; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + protected boolean isCentralSlotHighlited() { + return false; + } + + + @Override + protected boolean isSlotSelected(int x, int y) { + return false; + } + + @Override + protected boolean isSlotBad(int x, int y) { + return false; + } + + @Override + protected boolean hasSlotLevelOverlay(int x, int y) { + return false; + } + +} diff --git a/src/net/sector/gui/widgets/composite/ShipDesignerTable.java b/src/net/sector/gui/widgets/composite/ShipDesignerTable.java new file mode 100644 index 0000000..b3784a8 --- /dev/null +++ b/src/net/sector/gui/widgets/composite/ShipDesignerTable.java @@ -0,0 +1,1534 @@ +package net.sector.gui.widgets.composite; + + +import java.util.ArrayList; +import java.util.Iterator; + +import net.sector.gui.panels.designer.PanelDesigner; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.Widget; +import net.sector.input.Keys; +import net.sector.level.EBuildingMode; +import net.sector.level.ship.DiscoveryTable; +import net.sector.level.ship.PieceBundle; +import net.sector.level.ship.PieceRegistry; +import net.sector.level.ship.modules.pieces.Piece; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; +import com.porcupine.math.Calc; +import com.porcupine.math.Calc.Deg; + + +/** + * ship designer table + * + * @author MightyPork + */ +public class ShipDesignerTable extends ShipDesignerBase { + + /** + * Designer edit modes + * + * @author MightyPork + */ + public enum EdMode { + + /** + * Default mode.
+ * Scroll to rotate dragged piece, or piece under mouse.
+ * Press LMB to grab a piece, release LMB to drop it (swaps pieces if + * dropped in non-empty slot).
+ * Click while holding DELETE to sell piece.
+ * Ctrl + LMB or RMB = level up/down of dragged piece or piece under + * mouse.
+ * Level changes require some money (up - costs some, down - gives some) + */ + ARRANGE, + + /** + * Click = place piece dragged, buy it. Dragged piece is not consumed. + * Scroll to rotate dragged piece. Ctrl + LMB or RMB to level up/down + */ + BUILD, + + /** + * Click = place piece dragged, buy it. Dragged piece is not consumed. + * Scroll to rotate dragged piece. Ctrl + LMB or RMB to level up/down + */ + BUILD_ONE, + + DELETE, + + REPAIR, + + SELECT; + } + + + public static enum EShipStructureError { + EMPTY_CENTER, INVALID_CENTER, NO_PROPULSION, NO_WEAPONS, INVALID, UNSTABLE, OK; + + /** + * Get long verbose description for error dialog. + * + * @return text + */ + public String getDescription() { + switch (this) { + + case INVALID_CENTER: + return "Invalid central piece.\nMust be a BODY or WING."; + + case EMPTY_CENTER: + return "Central slot must not be empty.\nThe core systems reside there."; + + case NO_PROPULSION: + return "Your ship needs some propulsion.\nEngines let your ship maneuver."; + + case NO_WEAPONS: + return "You need some weapons.\nHow would you shoot?"; + + case INVALID: + return "Some pieces are placed incorrectly."; + + case UNSTABLE: + return "Some pieces are not connected to center."; + + case OK: + return "Ship is OK."; + + + } + return "Unknown state."; + } + + /** + * Get human readable error text. + * + * @return text + */ + public String getString() { + switch (this) { + + case INVALID_CENTER: + return "Central piece is invalid!"; + + case EMPTY_CENTER: + return "Central slot is empty!"; + + case NO_PROPULSION: + return "Missing propulsion!"; + + case NO_WEAPONS: + return "Missing weapons!"; + + case INVALID: + return "Invalid piece placement."; + + case UNSTABLE: + return "Ship design is not stable."; + + case OK: + return "Ship design is valid."; + } + return "Unknown state."; + } + + /** + * Get if is valid = can start game with this design + * + * @return is valid + */ + public boolean isValid() { + return this == OK; + } + } + + /** + * Function modifying given piece + * + * @author MightyPork + */ + public static interface PieceModifyFn { + /** + * Do what needs to be done before other stuff. + */ + public void prepare(); + + /** + * modify piece + * + * @param piece piece to modify / process / edit / etc.. + * @param args arguments for the function + * @return replacement (return the piece if not discarded) + */ + public DraggablePiece process(DraggablePiece piece, Object... args); + } + + private boolean cancelBuildingOnRightRelease; + /** The edit mode. */ + protected EdMode editMode = EdMode.ARRANGE; + + /** Error found during the last invocation of checkDesign() */ + public EShipStructureError lastErrorFound = EShipStructureError.OK; + + private PanelDesigner designerGui; + + /** + * Assign designer panel + * + * @param designer designer + */ + public void setDesignerGui(PanelDesigner designer) { + this.designerGui = designer; + } + + /** flag that during batch level change sound was requested to play. */ + private boolean fnPlayedSnd = false; + + /** Change level function, args: direction, ignoreMoney */ + private PieceModifyFn fnLvl = new PieceModifyFn() { + @Override + public void prepare() { + fnPlayedSnd = false; + } + + @Override + public DraggablePiece process(DraggablePiece p, Object... args) { + + int levelChangeDir = (Integer) args[0]; + boolean ignoreMoney = (Boolean) args[1]; + + if (p == null) return null; + if (p.health < p.healthMax) return p; + + boolean doit = true; + int money = 0; + + if (ignoreMoney) { + doit = true; + } else { + money = p.getLevelChangeCost(levelChangeDir); + doit = control.hasMoney(money); + } + + if (doit) { + if (p.level > 1 && levelChangeDir == -1) { + fnPlayedSnd = true; + p.level--; + control.consumeMoney(money); + } else if (p.level < discoveries.getDiscoveryLevelForPiece(p.id) && levelChangeDir == 1) { + fnPlayedSnd = true; + p.level++; + control.consumeMoney(money); + } + } + + p.fixFieldValuesSetMaxHealth(); + + return p; + } + }; + + + private int keyDel = Keyboard.KEY_DELETE; + + private int keyLevel = Keyboard.KEY_LCONTROL; + + private int keyRepair = Keyboard.KEY_R; + + private int keyRotRough = Keyboard.KEY_LSHIFT; + + private int keySelect = Keyboard.KEY_LCONTROL; + + /** Rotate piece, args: dir */ + private PieceModifyFn pieceRotFn = new PieceModifyFn() { + @Override + public void prepare() {} + + @Override + public DraggablePiece process(DraggablePiece p, Object... args) { + + int rotDir = (Integer) args[0]; + + int rough = 45; + int smooth = p.rotStep; + + if (p.rotStep > rough) rough = p.rotStep; + + if (Keyboard.isKeyDown(keyRotRough)) { + p.rotate = Deg.roundX(p.rotate, rough); + p.rotate += rotDir * rough; + } else { + p.rotate += rotDir * smooth; + } + + p.rotate = (int) Deg.norm(p.rotate); + return p; + } + }; + + /** List of selected slots */ + public ArrayList selectedSlots = new ArrayList(); + /** List of slots with problem */ + public ArrayList errorSlots = new ArrayList(); + + private boolean upAtEmptyWillStopSelecting; + private DiscoveryTable discoveries; + + /** + * Ship design table + * + * @param pieces piece table + * @param discoveries + */ + public ShipDesignerTable(PieceBundle pieces[][], DiscoveryTable discoveries) { + super(9, 9); + + int piecesW = pieces[0].length; + int piecesH = pieces.length; + + int padX = (W - piecesW) / 2; + int padY = (H - piecesH) / 2; + + for (int x = 0; x < piecesW; x++) { + for (int y = 0; y < piecesH; y++) { + if (pieces[y][x] == null) continue; + slots[y + padY][x + padX] = new DraggablePiece(pieces[y][x]); + } + } + + this.discoveries = discoveries; + + setTheme(ETheme.DES_TABLE); + } + + /** + * Do some operation with all selected pieces (eg. delete, change level, + * change control trigger) + * + * @param fn operation + * @param args arguments + */ + public void doForSelected(PieceModifyFn fn, Object... args) { + fn.prepare(); + for (CoordI coord : selectedSlots) { + if (slots[coord.y][coord.x] != null) { + slots[coord.y][coord.x] = fn.process(slots[coord.y][coord.x], args); + } + } + } + + /** + * Get ship design, crop symmetrically empty rows and columns + * + * @return table of pieces + */ + public PieceBundle[][] exportShipDesign() { + + int minX = W, minY = H, maxX = 0, maxY = 0; + + for (int y = 0; y < H; y++) { + for (int x = 0; x < W; x++) { + if (slots[y][x] != null) { + minX = Math.min(minX, x); + minY = Math.min(minY, y); + maxX = Math.max(maxX, x); + maxY = Math.max(maxY, y); + } + } + } + + int cropL = minX, cropR = W - 1 - maxX; + int cropU = minY, cropD = H - 1 - maxY; + + int cropX = Math.min(cropL, cropR); + int cropY = Math.min(cropU, cropD); + + cropX = Math.min(cropX, W / 2 - 1); + cropY = Math.min(cropY, H / 2 - 1); + + PieceBundle[][] pieces = new PieceBundle[H - cropY * 2][W - cropX * 2]; + for (int y = cropY; y < H - cropY; y++) { + for (int x = cropX; x < W - cropX; x++) { + pieces[y - cropY][x - cropX] = slots[y][x]; + } + } + + return pieces; + + } + + /** + * Get current edit mode + * + * @return edit mode + */ + public EdMode getEditMode() { + return editMode; + } + + + @Override + public void handleStaticInputs(Coord pos) { + boolean left = Mouse.isButtonDown(0); + boolean right = Mouse.isButtonDown(1); + + boolean dragging = isDragging(); + boolean building = isBuilding(); + boolean buildingSingle = isBuildingSingle(); + //boolean arranging = isArranging(); + boolean deleting = isDeleting(); + boolean repairing = isRepairing(); + boolean selecting = isSelecting(); + boolean isEditable = control.canEdit(); + + // selection mode + if (selecting && !dragging && (left || right)) { + + // repair placed piece + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) { + return; + } + DraggablePiece p = slots[tile.y][tile.x]; + + if (p != null) { + if (left && !selectedSlots.contains(tile)) selectedSlots.add(tile); + if (right && selectedSlots.contains(tile)) selectedSlots.remove(tile); + } + + return; + } + + // building & left down = build piece (paint) + if (isEditable && building && !buildingSingle && dragging && left) { + + DraggablePiece p = control.getDragged(); + int cost = PieceRegistry.getPieceCost(p.baseCost, p.level, p.health, p.healthMax); + + if (control.hasMoney(cost)) { + + CoordI tile = getCoordUnderMouse(pos); + if (tile == null || slots[tile.y][tile.x] != null) { + return; + } + slots[tile.y][tile.x] = control.getDragged().copy(); + + sndBuild(); + + control.consumeMoney(cost); + + } + + + checkDesign(); + + return; + } + + // DELETE + left = sell + if (isEditable && deleting && left && !building && !dragging) { + + // change level of piece under / dragged + DraggablePiece p = null; + + // sell placed piece (give money) + // surely isn't building now. + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) return; + p = slots[tile.y][tile.x]; + if (p == null) return; + + selectedSlots.remove(tile); + + sellPiece(p); + + slots[tile.y][tile.x] = null; + + checkDesign(); + return; + } + + // R + LMB = repair + if (!selecting && (repairing || right) && left && !building && !dragging) { + // repair placed piece + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) return; + DraggablePiece p = slots[tile.y][tile.x]; + repairPiece(p); + + return; + } + + return; + } + + /** + * Check design for errors + * + * @return status + */ + public EShipStructureError checkDesign() { + return (lastErrorFound = checkDesign_do()); + } + + private EShipStructureError checkDesign_do() { + + errorSlots.clear(); + + DraggablePiece center = slots[H / 2][W / 2]; + if (center == null) { + errorSlots.add(new CoordI(W / 2, H / 2)); + return EShipStructureError.EMPTY_CENTER; + } + if (!center.typeBody) { + errorSlots.add(new CoordI(W / 2, H / 2)); + return EShipStructureError.INVALID_CENTER; + } + + int jets = 0; + int weapons = 0; + boolean invalid = false; + for (int y = 0; y < H; y++) { + inner: + for (int x = 0; x < W; x++) { + DraggablePiece p = slots[y][x]; + if (p != null) { + if (p.typeEngine) { + jets++; + + // check if there is no other tile behing this engine. + CoordI move = new CoordI(0, 1); + CoordI tile = new CoordI(x, y); + tile.add_ip(move); + while (tile.x >= 0 && tile.y >= 0 && tile.x < W && tile.y < H) { + if (slots[tile.y][tile.x] != null) { + errorSlots.add(new CoordI(x, y)); + invalid = true; + break; + } + tile.add_ip(move); + } + + } + if (p.typeWeapon) { + weapons++; + + // check if can shoot + int dir = Deg.round45(p.rotate); + CoordI move; + switch (dir) { + case 360: + case 0: + move = new CoordI(0, -1); + break; + + case 45: + move = new CoordI(-1, -1); + break; + + case 90: + move = new CoordI(-1, 0); + break; + + case 135: + move = new CoordI(-1, 1); + break; + + case 180: + move = new CoordI(0, 1); + break; + + case 225: + move = new CoordI(1, 1); + break; + + case 270: + move = new CoordI(1, 0); + break; + + case 315: + move = new CoordI(1, -1); + break; + + default: + continue inner; + } + + // we have move + // now raytrace... + + CoordI tile = new CoordI(x, y); + tile.add_ip(move); + while (tile.x >= 0 && tile.y >= 0 && tile.x < W && tile.y < H) { + if (slots[tile.y][tile.x] != null) { + errorSlots.add(new CoordI(x, y)); + invalid = true; + break; + } + tile.add_ip(move); + } + } + } + } + } + + if (jets == 0) return EShipStructureError.NO_PROPULSION; + if (weapons == 0) return EShipStructureError.NO_WEAPONS; + + // check integrity + + final boolean[][] inconsistent = new boolean[H][W]; + for (int y = 0; y < H; y++) { + for (int x = 0; x < W; x++) { + inconsistent[y][x] = (slots[y][x] != null); + } + } + + class Checker { + Piece getPiece(int x, int y) { + try { + if (slots[y][x] == null) return null; + return slots[y][x].toPiece(); + } catch (ArrayIndexOutOfBoundsException e) { + return null; + } + } + + void markNeighbor(int x, int y) { + Piece p; + p = getPiece(x, y); + if (p == null) { + return; + } + inconsistent[y][x] = false; + + for (int xx = -1; xx <= 1; xx++) { + for (int yy = -1; yy <= 1; yy++) { + if (xx == 0 && yy == 0) continue; + //if (!p.canConnectToSide(xx, yy)) continue; + + Piece p2 = getPiece(x + xx, y + yy); + + int dx = -xx; + int dy = -yy; + + if (p2 != null && inconsistent[y + yy][x + xx] && p2.canConnectToSide(dx, -dy)) { + inconsistent[y + yy][x + xx] = false; + markNeighbor(x + xx, y + yy); + } + } + } + } + + } + + new Checker().markNeighbor(W / 2, H / 2); + + boolean unst = false; + for (int y = 0; y < H; y++) { + for (int x = 0; x < W; x++) { + if (inconsistent[y][x]) { + unst = true; + errorSlots.add(new CoordI(x, y)); + } + } + } + + // this is this far to make sure all checks are done and bad pieces are highlighted + if (invalid) return EShipStructureError.INVALID; + if (unst) return EShipStructureError.UNSTABLE; + + return EShipStructureError.OK; + } + + /** + * Check if any pieces are selected + * + * @return selected pieces + */ + public boolean isAnySelected() { + return selectedSlots.size() > 0; + } + + + /** + * Get if is building. + * + * @return is building. + */ + protected boolean isArranging() { + return editMode == EdMode.ARRANGE; + } + + /** + * Get if is building. + * + * @return is building. + */ + protected boolean isBuilding() { + return editMode == EdMode.BUILD || editMode == EdMode.BUILD_ONE; + } + + /** + * Get if is building one only (discard after first placed) + * + * @return state + */ + protected boolean isBuildingSingle() { + return editMode == EdMode.BUILD_ONE; + } + + @Override + protected boolean isCentralSlotHighlited() { + return true; + } + + /** + * Get if delete mode is active. + * + * @return is deleting + */ + protected boolean isDeleting() { + return editMode == EdMode.DELETE; + } + + /** + * Get if is building. + * + * @return is building. + */ + protected boolean isDragging() { + return control.isDragging(); + } + + /** + * Get if repair mode is active. + * + * @return is repairing + */ + protected boolean isRepairing() { + return editMode == EdMode.REPAIR; + } + + /** + * Get if select mode is active. + * + * @return is selecting + */ + protected boolean isSelecting() { + return editMode == EdMode.SELECT; + } + + @Override + protected boolean isSlotSelected(int x, int y) { + return selectedSlots.contains(new CoordI(x, y)); + } + + @Override + protected boolean isSlotBad(int x, int y) { + return errorSlots.contains(new CoordI(x, y)); + } + + /** + * Change level of dragged pieces + * + * @param dir + */ + public void levelChangeDragged(int dir) { + // change level of piece under / dragged + DraggablePiece p = null; + + // piece dragged (if building, dont consume money) + p = control.getDragged(); + if (control.isDragging() && p != null && p.health == p.healthMax) { + + fnLvl.prepare(); + fnLvl.process(p, dir, isBuilding()); + if (fnPlayedSnd) { + if (dir < 0) sndLevelDown(); + if (dir > 0) sndLevelUp(); + } + return; + } + } + + /** + * Change level of selected pieces + * + * @param dir direction + */ + public void levelChangeSelected(int dir) { + doForSelected(fnLvl, dir, false); + if (fnPlayedSnd) { + if (dir < 0) sndLevelDown(); + if (dir > 0) sndLevelUp(); + } + } + + + /** + * move selected pieces if possible + * + * @param dir + */ + public void moveSelected(CoordI dir) { + // up + + if (dir.x == 0 && dir.y == -1) { + // check + Iterator iter = selectedSlots.iterator(); + while (iter.hasNext()) { + CoordI tile = iter.next(); + if (slots[tile.y][tile.x] == null) { + iter.remove(); + continue; + } + if (tile.y == 0) return; // no place for this tile, cancel all + // no space to move, do nothing. + if (slots[tile.y - 1][tile.x] != null && !selectedSlots.contains(new CoordI(tile.x, tile.y - 1))) return; + } + + for (int y = 0; y < H; y++) { + for (int x = 0; x < W; x++) { + CoordI tile = new CoordI(x, y); + if (selectedSlots.contains(tile)) { + DraggablePiece p = slots[tile.y][tile.x]; + slots[tile.y][tile.x] = null; + + slots[tile.y - 1][tile.x] = p; + } + } + } + + for (CoordI tile : selectedSlots) { + tile.y--; + } + return; + } + + if (dir.x == 0 && dir.y == 1) { + // check + Iterator iter = selectedSlots.iterator(); + while (iter.hasNext()) { + CoordI tile = iter.next(); + if (slots[tile.y][tile.x] == null) { + iter.remove(); + continue; + } + if (tile.y == H - 1) return; // no place for this tile, cancel all + // no space to move, do nothing. + if (slots[tile.y + 1][tile.x] != null && !selectedSlots.contains(new CoordI(tile.x, tile.y + 1))) return; + } + + for (int y = H - 1; y >= 0; y--) { + for (int x = 0; x < W; x++) { + CoordI tile = new CoordI(x, y); + if (selectedSlots.contains(tile)) { + DraggablePiece p = slots[tile.y][tile.x]; + slots[tile.y][tile.x] = null; + + slots[tile.y + 1][tile.x] = p; + } + } + } + + for (CoordI tile : selectedSlots) { + tile.y++; + } + return; + } + if (dir.x == -1 && dir.y == 0) { + // check + Iterator iter = selectedSlots.iterator(); + while (iter.hasNext()) { + CoordI tile = iter.next(); + if (slots[tile.y][tile.x] == null) { + iter.remove(); + continue; + } + if (tile.x == 0) return; // no place for this tile, cancel all + // no space to move, do nothing. + if (slots[tile.y][tile.x - 1] != null && !selectedSlots.contains(new CoordI(tile.x - 1, tile.y))) return; + } + + for (int y = 0; y < H; y++) { + for (int x = 0; x < W; x++) { + CoordI tile = new CoordI(x, y); + if (selectedSlots.contains(tile)) { + DraggablePiece p = slots[tile.y][tile.x]; + slots[tile.y][tile.x] = null; + + slots[tile.y][tile.x - 1] = p; + } + } + } + + for (CoordI tile : selectedSlots) { + tile.x--; + } + return; + } + + if (dir.x == 1 && dir.y == 0) { + // check + Iterator iter = selectedSlots.iterator(); + while (iter.hasNext()) { + CoordI tile = iter.next(); + if (slots[tile.y][tile.x] == null) { + iter.remove(); + continue; + } + if (tile.x == W - 1) return; // no place for this tile, cancel all + // no space to move, do nothing. + if (slots[tile.y][tile.x + 1] != null && !selectedSlots.contains(new CoordI(tile.x + 1, tile.y))) return; + } + + for (int y = 0; y < H; y++) { + for (int x = W - 1; x >= 0; x--) { + CoordI tile = new CoordI(x, y); + if (selectedSlots.contains(tile)) { + DraggablePiece p = slots[tile.y][tile.x]; + slots[tile.y][tile.x] = null; + slots[tile.y][tile.x + 1] = p; + } + } + } + + for (CoordI tile : selectedSlots) { + tile.x++; + } + return; + } + + + } + + /** + * Move all pieces if possible + * + * @param dir + */ + public void moveAll(CoordI dir) { + // up + + if (dir.x == 0 && dir.y == -1) { + + for (int x = 0; x < W; x++) { + if (slots[0][x] != null) return; //cant + } + + for (int y = 0; y < H; y++) { + for (int x = 0; x < W; x++) { + CoordI tile = new CoordI(x, y); + + DraggablePiece p = slots[tile.y][tile.x]; + if (p == null) continue; + slots[tile.y][tile.x] = null; + + slots[tile.y - 1][tile.x] = p; + } + } + + for (CoordI tile : selectedSlots) { + tile.y--; + } + + checkDesign(); + return; + } + + if (dir.x == 0 && dir.y == 1) { + + for (int x = 0; x < W; x++) { + if (slots[H - 1][x] != null) return; //cant + } + + for (int y = H - 1; y >= 0; y--) { + for (int x = 0; x < W; x++) { + CoordI tile = new CoordI(x, y); + + DraggablePiece p = slots[tile.y][tile.x]; + if (p == null) continue; + slots[tile.y][tile.x] = null; + + slots[tile.y + 1][tile.x] = p; + } + } + + for (CoordI tile : selectedSlots) { + tile.y++; + } + + checkDesign(); + return; + } + + if (dir.x == -1 && dir.y == 0) { + // check + for (int y = 0; y < H; y++) { + if (slots[y][0] != null) return; //cant + } + + for (int y = 0; y < H; y++) { + for (int x = 0; x < W; x++) { + CoordI tile = new CoordI(x, y); + + DraggablePiece p = slots[tile.y][tile.x]; + if (p == null) continue; + slots[tile.y][tile.x] = null; + + slots[tile.y][tile.x - 1] = p; + + } + } + + for (CoordI tile : selectedSlots) { + tile.x--; + } + + checkDesign(); + return; + } + + if (dir.x == 1 && dir.y == 0) { + // check + // check + for (int y = 0; y < H; y++) { + if (slots[y][W - 1] != null) return; //cant + } + + for (int y = 0; y < H; y++) { + for (int x = W - 1; x >= 0; x--) { + CoordI tile = new CoordI(x, y); + + DraggablePiece p = slots[tile.y][tile.x]; + if (p == null) continue; + slots[tile.y][tile.x] = null; + + slots[tile.y][tile.x + 1] = p; + } + } + + for (CoordI tile : selectedSlots) { + tile.x++; + } + + checkDesign(); + return; + } + + + } + + + @Override + public Widget onKey(int key, char chr, boolean down) { + + unselectNullSlots(); + + if (key == Keyboard.KEY_SPACE && down) { + unselectAll(); + return this; + } + + if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_A)) { + selectAll(); + return this; + } + + if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_W)) { + selectWeapons(); + return this; + } + + if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_B)) { + selectBody(); + return this; + } + + boolean dragging = isDragging(); + boolean building = isBuilding(); +// boolean buildingSingle = isBuildingSingle(); +// boolean arranging = isArranging(); +// boolean deleting = isDeleting(); +// boolean repairing = isRepairing(); +// boolean selecting = isSelecting(); + + // key press while dragging deletes + if (key == keyDel) { + + if (control.buildMode == EBuildingMode.LOCKED) return this; + + if (dragging) { + if (!building) { + sellPiece(control.getDragged()); + } else { + sndDrop(); + } + control.resetDragInfo(); + + } else if (isAnySelected()) { + + designerGui.deleteSelectedAsk(); + + } else { + if (down) { + setEditMode(EdMode.DELETE); + } else { + setEditMode(EdMode.ARRANGE); + } + } + return this; + } + + // key press while dragging deletes + if (key == keyRepair) { + if (dragging && !building) { + repairPiece(control.getDragged()); + } else { + if (down) { + setEditMode(EdMode.REPAIR); + } else { + setEditMode(EdMode.ARRANGE); + } + } + return this; + } + + if (key == keySelect && !dragging && !building) { + if (down) { + setEditMode(EdMode.SELECT); + } else { + setEditMode(EdMode.ARRANGE); + } + return this; + } + + // CTRL + SPACE = unselect + if (Keyboard.isKeyDown(keySelect) && Keyboard.isKeyDown(Keyboard.KEY_SPACE)) { + unselectAll(); + return this; + } + + return null; + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + Widget w = onMouseButton_do(pos, button, down); + checkDesign(); + return w; + } + + private Widget onMouseButton_do(Coord pos, int button, boolean down) { + + unselectNullSlots(); + + boolean left = button == 0; + boolean right = button == 1; + + boolean up = !down; + + boolean dragging = isDragging(); + boolean building = isBuilding(); + boolean buildingSingle = isBuildingSingle(); + boolean arranging = isArranging(); + boolean deleting = isDeleting(); + boolean repairing = isRepairing(); + boolean selecting = isSelecting(); + boolean isEditable = control.canEdit(); + + // edit controls + if (down && left && !dragging && !building && !deleting && !repairing && !isAnySelected()) { + if (Keys.isDown(Keyboard.KEY_E) || Keys.isDown(Keyboard.KEY_RETURN)) { + CoordI tile = getCoordUnderMouse(pos); + if (tile != null && slots[tile.y][tile.x] != null && slots[tile.y][tile.x].hasTrigger()) { + selectedSlots.add(tile); + designerGui.editControlsSelected(); + return this; + } + } + } + + + if (isEditable && building && right && up && cancelBuildingOnRightRelease) { + // cancel building now + control.resetDragInfo(); + editMode = EdMode.ARRANGE; + sndDrop(); + cancelBuildingOnRightRelease = false; + return this; + } + + if (building && right && down) { + // cancel building when button is released + cancelBuildingOnRightRelease = true; + return this; + } + + if (!isMouseOver(pos)) { + // event outside + + if (down && !dragging) { + // not my business + return null; + } + + // cancel piece drag (!shop must be before in the gui hierarchy to process this event properly!) + if (dragging && up && !isBuilding()) { + sndDrop(); + control.cancelDrag(); + return this; // consume. + } + + return null; + } + + // delete + click = destroy + if (isEditable && deleting && down) { + + // change level of piece under / dragged + DraggablePiece p = null; + + // piece dragged (if building, dont consume money) + if (dragging) { + p = control.getDragged(); + if (!building) { + sellPiece(p); + } else { + sndDrop(); + } + control.resetDragInfo(); + return this; + } + + return this; + } + + // R + click = repair + // right click & nothing other => repair + if ((repairing && down) || (!dragging && right && down && !selecting)) { + + // piece dragged (if building, dont consume money) + if (dragging) { + if (!building) { + repairPiece(control.getDragged()); + } + return this; + } + + // repair placed piece + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) return null; + DraggablePiece p = slots[tile.y][tile.x]; + repairPiece(p); + + return this; + } + + // cancel selecting by r-click at nothing + if (!dragging && selecting && down) { + + // repair placed piece + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) return null; + DraggablePiece p = slots[tile.y][tile.x]; + + if (p == null) { + upAtEmptyWillStopSelecting = true; + } else { + upAtEmptyWillStopSelecting = false; + } + + return this; + } + + // cancel selecting by r-click at nothing + if (!dragging && selecting && up) { + + // repair placed piece + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) return null; + DraggablePiece p = slots[tile.y][tile.x]; + + if (p == null && upAtEmptyWillStopSelecting) { + setEditMode(EdMode.ARRANGE); + } + + upAtEmptyWillStopSelecting = false; + + return this; + } + + // left up = build single + if (isEditable && buildingSingle && dragging && up && left) { + + DraggablePiece p = control.getDragged(); + int cost = PieceRegistry.getPieceCost(p.baseCost, p.level, p.health, p.healthMax); + + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) { + control.resetDragInfo(); + return this; + } + + if (control.hasMoney(cost)) { + if (slots[tile.y][tile.x] == null) { + sndDrop(); + slots[tile.y][tile.x] = control.getDragged(); + control.consumeMoney(cost); + } + control.resetDragInfo(); + editMode = EdMode.ARRANGE; + + } + return this; + } + + // ## DRAG-DROP + + // left down = start drag (if not building) + if (isEditable && arranging && !dragging && down && left) { + + CoordI tile = getCoordUnderMouse(pos); + if (tile == null || slots[tile.y][tile.x] == null) { + control.resetDragInfo(); + return this; + } + + sndGrab(); + selectedSlots.remove(tile); + + control.startDrag(this, tile, slots[tile.y][tile.x], true); + slots[tile.y][tile.x] = null; + return this; + } + + // left up = stop drag (if not building) + if (isEditable && arranging && dragging && up && left) { + + sndDrop(); + + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) { + control.cancelDrag(); + return this; + } + + if (slots[tile.y][tile.x] == null) { + slots[tile.y][tile.x] = control.getDragged(); + control.resetDragInfo(); + } else { + // swap. + if (slots[control.pickFrom.y][control.pickFrom.x] == null) { + slots[control.pickFrom.y][control.pickFrom.x] = slots[tile.y][tile.x]; + slots[tile.y][tile.x] = control.getDragged(); + control.resetDragInfo(); + } + } + return this; + } + + return null; + + } + + @Override + public Widget onScroll(final Coord pos, int scroll) { + + if (control.buildMode == EBuildingMode.LOCKED) return this; + + int scrollUnit = Calc.clampi(scroll, -1, 1); + + // level change action - scroll with modifier. + if (Keyboard.isKeyDown(keyLevel) || Mouse.isButtonDown(1)) { + cancelBuildingOnRightRelease = false; + final int dir = scrollUnit; + + // change level of piece under / dragged + DraggablePiece p = null; + + // piece dragged (if building, dont consume money) + if (control.isDragging()) { + levelChangeDragged(dir); + return this; + } + + if (!isAnySelected()) { + // change level of placed piece (consume money) + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) return null; + p = slots[tile.y][tile.x]; + if (p == null || p.health < p.healthMax) return this; + + fnLvl.prepare(); + fnLvl.process(p, dir, false); + if (fnPlayedSnd) { + if (dir < 0) sndLevelDown(); + if (dir > 0) sndLevelUp(); + } + return this; + } else { + levelChangeSelected(dir); + return this; + } + } + + + + // else rotate the piece + sndRotate(); + + DraggablePiece p = control.getDragged(); + + if (control.isDragging() && p != null) { + // nop + } else { + // get tile under. + CoordI tile = getCoordUnderMouse(pos); + if (tile == null) return null; + p = slots[tile.y][tile.x]; + + } + + if (p == null) return null; + + rotatePiece(p, scrollUnit); + checkDesign(); + + return null; + + } + + @Override + public void render(Coord mouse) { + super.render(mouse); + } + + /** + * Repair piece and consume money + * + * @param piece piece to repair + */ + private void repairPiece(DraggablePiece piece) { + if (piece == null) return; + control.consumeMoney(piece.getRepairCost()); + + if (piece.health < piece.healthMax) sndRepair(); + + piece.health = piece.healthMax; + } + + + public void rotatePiece(DraggablePiece p, int dir) { + int rough = 45; + int smooth = p.rotStep; + + if (p.rotStep > rough) rough = p.rotStep; + + if (Keyboard.isKeyDown(keyRotRough)) { + p.rotate = Deg.roundX(p.rotate, rough); + p.rotate += dir * rough; + } else { + p.rotate += dir * smooth; + } + + p.rotate = (int) Deg.norm(p.rotate); + } + + public void rotateSelected(final int dir) { + doForSelected(pieceRotFn, dir); + checkDesign(); + } + + + /** + * Give back money for given piece + * + * @param piece + */ + public void sellPiece(DraggablePiece piece) { + sndDelete(); + sellPieceSilent(piece); + } + + + private void sellPieceSilent(DraggablePiece piece) { + if (piece == null) return; + if (!isBuilding()) control.addMoney(piece.getTotalValue()); + } + + public void unselectNullSlots() { + Iterator iter = selectedSlots.iterator(); + while (iter.hasNext()) { + CoordI tile = iter.next(); + if (slots[tile.y][tile.x] == null) { + iter.remove(); + continue; + } + } + } + + + /** + * Set table edit mode. + * + * @param mode edit mode. + */ + public void setEditMode(EdMode mode) { + editMode = mode; + } + + public void unselectAll() { + selectedSlots.clear(); + } + + public void selectAll() { + selectedSlots.clear(); + for (int x = 0; x < W; x++) + for (int y = 0; y < H; y++) + if (slots[y][x] != null) selectedSlots.add(new CoordI(x, y)); + } + + public void selectWeapons() { + selectedSlots.clear(); + for (int x = 0; x < W; x++) + for (int y = 0; y < H; y++) + if (slots[y][x] != null && slots[y][x].typeWeapon) selectedSlots.add(new CoordI(x, y)); + } + + public void selectBody() { + selectedSlots.clear(); + for (int x = 0; x < W; x++) + for (int y = 0; y < H; y++) + if (slots[y][x] != null && slots[y][x].typeBody) selectedSlots.add(new CoordI(x, y)); + } + + public void deleteSelected() { + + if (!control.canEdit()) return; + + boolean snd = false; + for (CoordI tile : selectedSlots) { + DraggablePiece p = slots[tile.y][tile.x]; + if (p != null) snd = true; + sellPieceSilent(p); + slots[tile.y][tile.x] = null; + } + if (snd) sndDelete(); + + checkDesign(); + } + + @Override + protected boolean hasSlotLevelOverlay(int x, int y) { + return true; + } + +} diff --git a/src/net/sector/gui/widgets/display/ColorRectange.java b/src/net/sector/gui/widgets/display/ColorRectange.java new file mode 100644 index 0000000..e7e162d --- /dev/null +++ b/src/net/sector/gui/widgets/display/ColorRectange.java @@ -0,0 +1,102 @@ +package net.sector.gui.widgets.display; + + +import net.sector.gui.widgets.Widget; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Space + * + * @author MightyPork + */ +public class ColorRectange extends Widget { + + /** + * Colour rectange + * + * @param width min width + * @param height min height + * @param margin widget margin + * @param border widget border (bevel in rectangle) + * @param color color (referenced!) + */ + public ColorRectange(int width, int height, int margin, int border, RGB color) { + setMargins(margin, margin, margin, margin); + setMinSize(width, height); + this.border = border; + this.rectColor = color; + } + + + public String tooltipText = ""; + public RGB tooltipColor = RGB.WHITE; + + /** + * Set tooltip + * + * @param text text + * @param color render color + * @return this + */ + public ColorRectange setTooltip(String text, RGB color) { + tooltipColor = color; + tooltipText = text; + return this; + } + + public int border = 3; + public RGB rectColor = RGB.GREEN; + + public ColorRectange setColorRect(RGB newColor) { + rectColor = newColor; + return this; + } + + public ColorRectange setBorderWidth(int w) { + border = w; + return this; + } + + private long mouseEnterTime = 0; + + @Override + public void render(Coord mouse) { + RenderUtils.quadRectOutset(rect, border, rectColor, false); + + boolean hover = isMouseOver(mouse); + + if (enabled && hover && tooltipText.length() > 0) { + if (System.currentTimeMillis() - mouseEnterTime > 1000) { + renderTooltip(tooltipText, tooltipColor); + } + } else { + mouseEnterTime = System.currentTimeMillis(); + } + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + return null; + } + + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/display/Icon.java b/src/net/sector/gui/widgets/display/Icon.java new file mode 100644 index 0000000..c67b62b --- /dev/null +++ b/src/net/sector/gui/widgets/display/Icon.java @@ -0,0 +1,165 @@ +package net.sector.gui.widgets.display; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.gui.widgets.Widget; +import net.sector.textures.TextureManager; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; + + +/** + * Icon 32x32 from texture sheet + * + * @author MightyPork + */ +public class Icon extends Widget { + + private CoordI tile = null; + private String texture = null; + + /** Tint color */ + public RGB colorTint = RGB.WHITE.copy(); + + /** + * Set color tint + * + * @param tint color tint + * @return this + */ + public Icon setColor(RGB tint) { + colorTint.setTo(tint); + return this; + } + + + public String tooltipText = ""; + public RGB tooltipColor = RGB.WHITE; + private long mouseEnterTime = 0; + + + /** + * new icon + * + * @param texture texture name + * @param tileX tile x coord + * @param tileY tile y coord + */ + public Icon(String texture, int tileX, int tileY) { + this.texture = texture; + this.tile = new CoordI(tileX, tileY); + setMargins(2, 2, 2, 2); + } + + + /** + * Set tooltip + * + * @param text text + * @param color render color + * @return this + */ + public Icon setTooltip(String text, RGB color) { + tooltipColor = color; + tooltipText = text; + return this; + } + + + public Icon setTooltip(String text) { + tooltipColor = RGB.WHITE.copy(); + tooltipText = text; + return this; + } + + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + TextureManager.bind(texture); + + RenderUtils.setColor(new RGB(colorTint, enabled ? 1 : 0.3)); + + glBegin(GL_QUADS); + + double left = (tile.x) * 0.125; + double top = (tile.y) * 0.125; + double right = (tile.x + 1) * 0.125; + double bottom = (tile.y + 1) * 0.125; + + int w = 32; + int h = 32; + + Coord c = getRect().getCenter(); + + double x1 = c.x - w / 2; + double y1 = c.y + h / 2; + double x2 = c.x + w / 2; + double y2 = c.y - h / 2; + + + glTexCoord2d(left, top); + glVertex3d(x1, y1, 0); + + glTexCoord2d(right, top); + glVertex3d(x2, y1, 0); + + glTexCoord2d(right, bottom); + glVertex3d(x2, y2, 0); + + glTexCoord2d(left, bottom); + glVertex3d(x1, y2, 0); + + glEnd(); + + RenderUtils.setColor(RGB.WHITE); + TextureManager.unbind(); + + glPopAttrib(); + glPopMatrix(); + + + boolean onTop = isPanelOnTop(); + boolean hover = isMouseOver(mouse); + + if (enabled && hover && onTop && tooltipText.length() > 0) { + if (System.currentTimeMillis() - mouseEnterTime > 1000) { + renderTooltip(tooltipText, tooltipColor); + } + } else { + mouseEnterTime = System.currentTimeMillis(); + } + } + + @Override + public void calcChildSizes() { + setMinSize(new Coord(32, 32)); + rect.setTo(0, 0, minSize.x, minSize.y); + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + return null; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + +} diff --git a/src/net/sector/gui/widgets/display/Text.java b/src/net/sector/gui/widgets/display/Text.java new file mode 100644 index 0000000..109c8be --- /dev/null +++ b/src/net/sector/gui/widgets/display/Text.java @@ -0,0 +1,249 @@ +package net.sector.gui.widgets.display; + + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.sector.fonts.FontManager; +import net.sector.gui.widgets.Widget; +import net.sector.input.Function; +import net.sector.util.Align; + +import org.lwjgl.opengl.GL11; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; + + +/** + * Passive text label + * + * @author MightyPork + */ +public class Text extends Widget { + + private Function onClickHandler; + + private int align = Align.CENTER; + + private CoordI padding = new CoordI(0, 0); + + private String[] linesRev = null; + + /** Text color */ + public RGB textColor = new RGB(1, 1, 1); + + /** Blur color */ + public RGB blurColor = new RGB(1, 1, 1); + + /** Blur size */ + public int blurSize = 0; + + /** Blur smooth flag */ + public boolean blurSmooth = true; + + + /** + * Set text padding + * + * @param x padding x + * @param y padding y + * @return this + */ + public Text setPadding(int x, int y) { + padding.setTo(x, y); + return this; + } + + /** + * Assign on clock handler + * + * @param handler handler + * @return this + */ + public Text addOnClickHandler(Function handler) { + onClickHandler = handler; + return this; + } + + + /** + * Set text blur + * + * @param color blur color + * @param size blur size + * @param smooth render smooth blur (all iterations / only the outmost) + * @return this + */ + public Text setBlur(RGB color, int size, boolean smooth) { + this.blurColor.setTo(color); + this.blurSize = size; + this.blurSmooth = smooth; + return this; + } + + /** + * Set text blur (smooth=true) + * + * @param color blur color + * @param size blur size + * @return this + */ + public Text setBlur(RGB color, int size) { + this.blurColor.setTo(color); + this.blurSize = size; + this.blurSmooth = true; + return this; + } + + /** + * new text + * + * @param text widget text + * @param font render font + */ + public Text(String text, String font) { + setText(text); + setMargins(2, 0, 2, 0); + setFont(font); + } + + /** + * new text + * + * @param text widget text + */ + public Text(String text) { + setText(text); + setMargins(2, 0, 2, 0); + } + + @Override + public void calcChildSizes() { + Coord oldms = getMinSize().copy(); + + double max = 0; + for (String s : linesRev) { + max = Math.max(max, FontManager.width(font, s)); + } + + setMinSize(new Coord(max, FontManager.height(font) * linesRev.length)); + + if (minSize.x < oldms.x) minSize.x = oldms.x; + if (minSize.y < oldms.y) minSize.y = oldms.y; + rect.setTo(0, 0, minSize.x + padding.x * 2, minSize.y + padding.y * 2); + } + + @Override + public void onBlur() {} + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + private boolean clicked = false; + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (isMouseOver(pos) && down) clicked = true; + if (!down) { + if (clicked && isMouseOver(pos)) { + clicked = false; + if (onClickHandler != null) return onClickHandler.run(this) ? this : null; + } + clicked = false; + } + return null; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + GL11.glEnable(GL11.GL_TEXTURE_2D); + + int i = 0; + for (String s : linesRev) { + + Coord txtPos = rect.getCenter(); + + switch (align) { + case Align.CENTER: + txtPos = rect.getCenter(); + break; + + case Align.LEFT: + txtPos = rect.getCenter(); + txtPos.x = rect.getMin().x + padding.x; + break; + + case Align.RIGHT: + txtPos = rect.getCenter(); + txtPos.x = rect.getMax().x - padding.x; + break; + } + + txtPos.sub_ip(2, FontManager.height(font) * linesRev.length / 2).add_ip(0, FontManager.height(font) * i); + + if (blurSize == 0) { + FontManager.draw(txtPos, s, font, textColor, align); + } else { + FontManager.drawFuzzy(txtPos, text, font, blurColor, textColor, blurSize, align, blurSmooth); + } + + + i++; + + } + + GL11.glDisable(GL11.GL_TEXTURE_2D); + + // debug white rect showing the bounds. +// RenderUtils.setColor(new RGB(1,1,1,0.2)); +// RenderUtils.quadAbsCoord(rect.x1(), rect.y1(), rect.x2(), rect.y2()); +// RenderUtils.setColor(new RGB(1,1,1)); + } + + /** + * Set text color + * + * @param color color + * @return this + */ + public Text setColorText(RGB color) { + textColor = color; + return this; + } + + @Override + public Text setText(String text) { + super.setText(text); + + linesRev = text.split("\n"); + List l = Arrays.asList(linesRev); + Collections.reverse(l); + + return this; + } + + /** + * Set how the text should be aligned if minWidth is higher than text's + * width. + * + * @param align -1 left, 0 center, 1 right; Use constant from Align class. + * @return this + */ + public Text setTextAlign(int align) { + this.align = align; + return this; + } + +} diff --git a/src/net/sector/gui/widgets/display/TextDouble.java b/src/net/sector/gui/widgets/display/TextDouble.java new file mode 100644 index 0000000..8165d14 --- /dev/null +++ b/src/net/sector/gui/widgets/display/TextDouble.java @@ -0,0 +1,133 @@ +package net.sector.gui.widgets.display; + + +import net.sector.fonts.FontManager; +import net.sector.gui.widgets.Widget; + +import org.lwjgl.opengl.GL11; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Passive text label + * + * @author MightyPork + */ +public class TextDouble extends Widget { + + private String fontLeft = "default"; + private String fontRight = "default"; + + private String textLeft = ""; + private String textRight = ""; + + /** Text color left */ + public RGB colorLeft = new RGB(1, 1, 1); + /** Text color right */ + public RGB colorRight = new RGB(0, 1, 0); + + /** + * new text + * + * @param width min width + */ + public TextDouble(int width) { + setMargins(2, 0, 2, 0); + setMinWidth(width); + } + + /** + * Set text fonts + * + * @param fleft left font + * @param fright right font + * @return this + */ + public TextDouble setFonts(String fleft, String fright) { + fontLeft = fleft; + fontRight = fright; + return this; + } + + public TextDouble setTextLeft(String text, RGB color) { + textLeft = text; + colorLeft = color; + return this; + } + + public TextDouble setTextRight(String text, RGB color) { + textRight = text; + colorRight = color; + return this; + } + + @Override + public void calcChildSizes() { + Coord oldms = getMinSize().copy(); + setMinSize(new Coord(oldms.x, Math.max(FontManager.height(fontLeft), FontManager.height(fontRight)))); + if (minSize.x < oldms.x) minSize.x = oldms.x; + if (minSize.y < oldms.y) minSize.y = oldms.y; + rect.setTo(0, 0, minSize.x, minSize.y); + } + + @Override + public void onBlur() {} + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + return null; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + GL11.glEnable(GL11.GL_TEXTURE_2D); + + Coord leftP; + leftP = rect.getCenter(); + leftP.x = rect.getMin().x; + + Coord rightP; + + rightP = rect.getCenter(); + rightP.x = rect.getMax().x; + + leftP.sub_ip(2, FontManager.height(fontLeft) / 2); + FontManager.draw(leftP, textLeft, fontLeft, colorLeft, -1); + + rightP.sub_ip(2, FontManager.height(fontRight) / 2); + FontManager.draw(rightP, textRight, fontRight, colorRight, 1); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + } + + public void eraseTexts() { + textLeft = ""; + textRight = ""; + } + + public TextDouble setTexts(String left, String right) { + this.textLeft = left; + this.textRight = right; + return this; + } + + public TextDouble setColors(RGB left, RGB right) { + this.colorLeft = left; + this.colorRight = right; + return this; + } +} diff --git a/src/net/sector/gui/widgets/display/TextWithBackground.java b/src/net/sector/gui/widgets/display/TextWithBackground.java new file mode 100644 index 0000000..d51346d --- /dev/null +++ b/src/net/sector/gui/widgets/display/TextWithBackground.java @@ -0,0 +1,46 @@ +package net.sector.gui.widgets.display; + + +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +public class TextWithBackground extends Text { + + private RGB bgColor = new RGB(0x479EF5); + + public TextWithBackground setBackgroundColor(RGB color) { + this.bgColor = color; + return this; + } + + public TextWithBackground(String text) { + super(text); + } + + public TextWithBackground(String text, String font) { + super(text, font); + } + + @Override + public void render(Coord mouse) { + + boolean over = isMouseOver(mouse); + + RGB color = new RGB(bgColor, 0.3); + + if (over) { + color = new RGB(bgColor, 0.9); + } + + RenderUtils.setColor(color); + RenderUtils.quadSize(rect.getMin().x, rect.getMin().y, rect.getSize().x, rect.getSize().y); + + RenderUtils.setColor(RGB.WHITE); + + super.render(mouse); + } + +} diff --git a/src/net/sector/gui/widgets/input/Button.java b/src/net/sector/gui/widgets/input/Button.java new file mode 100644 index 0000000..6482c17 --- /dev/null +++ b/src/net/sector/gui/widgets/input/Button.java @@ -0,0 +1,236 @@ +package net.sector.gui.widgets.input; + + +import static net.sector.gui.widgets.EColorRole.*; +import net.sector.fonts.FontManager; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.Widget; +import net.sector.input.Function; +import net.sector.sounds.Sounds; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import org.lwjgl.opengl.GL11; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Clickable button. + * + * @author MightyPork + */ +public class Button extends Widget { + + private Function onClickHandler; + + public boolean sndClick = false; + + public boolean lastRenderHover = false; + + public double borderWidth = 2; + public boolean showBorder = true; + public double paddingX = 10; + public double paddingY = 4; + + public String tooltipText = ""; + public RGB tooltipColor = RGB.WHITE; + + + public void addOnClickHandler(Function handler) { + onClickHandler = handler; + } + + public Button setPadding(double x, double y) { + paddingX = x; + paddingY = y; + return this; + } + + public Button setBorderSize(double width) { + borderWidth = width; + showBorder = true; + return this; + } + + public Button enableBorder(boolean flag) { + showBorder = flag; + if (!flag) borderWidth = 0; + return this; + } + + /** + * new button + * + * @param id widget id + * @param text widget text + * @param font render font + */ + public Button(int id, String text, String font) { + setId(id); + setText(text); + setFont(font); + setTheme(ETheme.BLUE); + } + + /** + * new button + * + * @param id widget id + * @param text widget text + */ + public Button(int id, String text) { + this(id, text, "small_menu"); + } + + + /** + * new button + * + * @param id widget id + */ + public Button(int id) { + setId(id); + } + + /** + * Set tooltip + * + * @param text text + * @param color render color + * @return this + */ + public Button setTooltip(String text, RGB color) { + tooltipColor = color; + tooltipText = text; + return this; + } + + + public Button setTooltip(String text) { + tooltipColor = RGB.WHITE.copy(); + tooltipText = text; + return this; + } + + + /** Borders - L,R,T,B */ + public boolean bdrs[] = { true, true, true, true }; + + private long mouseEnterTime = 0; + + + protected void renderBase(Coord mouse) { + if (!isVisible()) return; + boolean onTop = isPanelOnTop(); + + boolean hover = isMouseOver(mouse); + + if (showBorder) { + RenderUtils.setColor(getColor(BDR, mouse)); + + //LTTTTR + //L R + //L R + //LBBBBR + // left + if (bdrs[0]) RenderUtils.quadCoord(rect.getMin().x, rect.getMin().y, rect.getMin().x + borderWidth, rect.getMax().y); + // right + if (bdrs[1]) RenderUtils.quadCoord(rect.getMax().x - borderWidth, rect.getMin().y, rect.getMax().x, rect.getMax().y); + // top + if (bdrs[2]) + RenderUtils.quadCoord(rect.getMin().x + borderWidth * (bdrs[0] ? 1 : 0), rect.getMax().y - borderWidth, rect.getMax().x - borderWidth + * (bdrs[1] ? 1 : 0), rect.getMax().y); + // bottom + if (bdrs[3]) + RenderUtils.quadCoord(rect.getMin().x + borderWidth * (bdrs[0] ? 1 : 0), rect.getMin().y, rect.getMax().x - borderWidth + * (bdrs[1] ? 1 : 0), rect.getMin().y + borderWidth); + + RenderUtils.setColor(getColor(BG, mouse)); + double left = rect.getMin().x + borderWidth * (bdrs[0] ? 1 : 0); + double bottom = rect.getMin().y + borderWidth * (bdrs[3] ? 1 : 0); + double right = rect.getMax().x - borderWidth * (bdrs[1] ? 1 : 0); + double top = rect.getMax().y - borderWidth * (bdrs[2] ? 1 : 0); + RenderUtils.quadCoord(left, bottom, right, top); + } else { + RenderUtils.setColor(getColor(BG, mouse)); + RenderUtils.quadCoord(rect.getMin().x, rect.getMin().y, rect.getMax().x, rect.getMax().y); + } + + if (enabled && hover && onTop && tooltipText.length() > 0) { + if (System.currentTimeMillis() - mouseEnterTime > 1000) { + renderTooltip(tooltipText, tooltipColor); + } + } else { + mouseEnterTime = System.currentTimeMillis(); + } + + lastRenderHover = hover; + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + renderBase(mouse); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + + Coord txtCenterPos = rect.getCenter().sub(3, FontManager.height(font) / 2 + 2); + FontManager.draw(txtCenterPos, text, font, getColor(FG, mouse), Align.CENTER); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (button != 0) return null; + if (!isMouseOver(pos)) { + clicked = false; + return null; + } + if (down == true) { + clicked = true; + } else { + if (clicked) { + if (sndClick) { + Sounds.click1.playEffect(1.6f, 0.3f, false); + } else { + Sounds.beep_soft_short.playEffect(1, 0.6f, false); + } + clicked = false; + + if (onClickHandler != null) return onClickHandler.run() ? this : null; + + return this; + } + } + return null; + } + + @Override + public void onBlur() { + clicked = false; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + Coord oldms = getMinSize().copy(); + setMinSize(new Coord(FontManager.width(font, text) + borderWidth * 2 + paddingX * 2, FontManager.height(font) + borderWidth * 2 + paddingY + * 2)); + if (minSize.x < oldms.x) minSize.x = oldms.x; + if (minSize.y < oldms.y) minSize.y = oldms.y; + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/input/ButtonIcon.java b/src/net/sector/gui/widgets/input/ButtonIcon.java new file mode 100644 index 0000000..fc0bec7 --- /dev/null +++ b/src/net/sector/gui/widgets/input/ButtonIcon.java @@ -0,0 +1,120 @@ +package net.sector.gui.widgets.input; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.textures.TextureManager; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; + + +/** + * Button with icon + * + * @author MightyPork + */ +public class ButtonIcon extends Button { + + private CoordI tile = null; + private String texture = null; + + /** Tint color */ + public RGB colorTint = RGB.WHITE.copy(); + + /** + * Set color tint + * + * @param tint color tint + * @return this + */ + public ButtonIcon setColor(RGB tint) { + colorTint.setTo(tint); + return this; + } + + /** + * new button + * + * @param id widget id + * @param texture texture identifier + * @param tileX tile x coord + * @param tileY tile y coord + */ + public ButtonIcon(int id, String texture, int tileX, int tileY) { + super(id); + setId(id); + this.texture = texture; + this.tile = new CoordI(tileX, tileY); + setPadding(2, 2); + setMargins(2, 2, 2, 2); + sndClick = true; + } + + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + renderBase(mouse); + + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + TextureManager.bind(texture); + + RenderUtils.setColor(new RGB(colorTint, enabled ? 1 : 0.3)); + + + glBegin(GL_QUADS); + + double left = (tile.x) * 0.125; + double top = (tile.y) * 0.125; + double right = (tile.x + 1) * 0.125; + double bottom = (tile.y + 1) * 0.125; + + double w = 32; + double h = 32; + + Coord c = getRect().getCenter(); + + double x1 = c.x - w / 2; + double y1 = c.y + h / 2; + double x2 = c.x + w / 2; + double y2 = c.y - h / 2; + + + glTexCoord2d(left, top); + glVertex3d(x1, y1, 0); + + glTexCoord2d(right, top); + glVertex3d(x2, y1, 0); + + glTexCoord2d(right, bottom); + glVertex3d(x2, y2, 0); + + glTexCoord2d(left, bottom); + glVertex3d(x1, y2, 0); + + glEnd(); + + RenderUtils.setColor(RGB.WHITE); + TextureManager.unbind(); + + glPopAttrib(); + glPopMatrix(); + } + + @Override + public void calcChildSizes() { + Coord oldms = getMinSize().copy(); + setMinSize(new Coord(32 + borderWidth * 2 + paddingX * 2, 32 + borderWidth * 2 + paddingY * 2)); + if (minSize.x < oldms.x) minSize.x = oldms.x; + if (minSize.y < oldms.y) minSize.y = oldms.y; + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/input/ButtonVertical.java b/src/net/sector/gui/widgets/input/ButtonVertical.java new file mode 100644 index 0000000..b2d7e59 --- /dev/null +++ b/src/net/sector/gui/widgets/input/ButtonVertical.java @@ -0,0 +1,82 @@ +package net.sector.gui.widgets.input; + + +import static net.sector.gui.widgets.EColorRole.*; +import net.sector.fonts.FontManager; +import net.sector.util.Align; + +import org.lwjgl.opengl.GL11; + +import com.porcupine.coord.Coord; + + +/** + * Vertical (left tab) button + * + * @author MightyPork + */ +public class ButtonVertical extends Button { + + /** + * new button v + * + * @param id widget id + * @param text widget text + * @param font render font + */ + public ButtonVertical(int id, String text, String font) { + super(id, text, font); + } + + /** + * new button v + * + * @param id widget id + * @param text widget text + */ + public ButtonVertical(int id, String text) { + super(id, text); + } + + + /** + * new button v + * + * @param id widget id + */ + public ButtonVertical(int id) { + super(id); + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + renderBase(mouse); + + GL11.glPushMatrix(); + + Coord txtCenterPos = rect.getCenter().add(FontManager.height(font) / 2 + 2, -3); + + GL11.glTranslated(txtCenterPos.x, txtCenterPos.y, 0); + + GL11.glRotated(90, 0, 0, 1); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + FontManager.draw(Coord.ZERO, text, font, getColor(FG, mouse), Align.CENTER); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + GL11.glPopMatrix(); + } + + @Override + public void calcChildSizes() { + Coord oldms = getMinSize().copy(); + double w = FontManager.height(font) + borderWidth * 2 + paddingX * 2; + double h = FontManager.width(font, text) + borderWidth * 2 + paddingY * 2; + setMinSize(new Coord(w, h)); + if (minSize.x < oldms.x) minSize.x = oldms.x; + if (minSize.y < oldms.y) minSize.y = oldms.y; + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/input/Checkbox.java b/src/net/sector/gui/widgets/input/Checkbox.java new file mode 100644 index 0000000..4dfbe6d --- /dev/null +++ b/src/net/sector/gui/widgets/input/Checkbox.java @@ -0,0 +1,160 @@ +package net.sector.gui.widgets.input; + + +import static net.sector.gui.widgets.EColorRole.*; +import static org.lwjgl.opengl.GL11.*; +import net.sector.fonts.FontManager; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.Widget; +import net.sector.sounds.Sounds; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Rect; + + +/** + * Clcikable button. + * + * @author MightyPork + */ +public class Checkbox extends Widget { + + public int frameSize = 25; + public int borderWidth = 1; + public int markDist = borderWidth + 6; + public int txtDist = 5; + + public boolean checked = false; + + public Checkbox setChecked(boolean checked) { + setChecked_do(checked); + return this; + } + + public void setChecked_do(boolean checked) { + this.checked = checked; + } + + public boolean isChecked() { + return checked; + } + + public Checkbox setFrameSize(int size) { + frameSize = size; + return this; + } + + /** + * new ckbox + * + * @param id widget id + * @param text widget text + * @param font render font + */ + public Checkbox(int id, String text, String font) { + setId(id); + setText(text); + setFont(font); + setTheme(ETheme.BLUE); + } + + /** + * new ckbox + * + * @param id widget id + * @param text widget text + */ + public Checkbox(int id, String text) { + this(id, text, "small_menu"); + } + + protected Rect getBoxRect() { + return new Rect(rect.getMin().x, rect.getMin().y, rect.getMin().x + frameSize, rect.getMin().y + frameSize).add_ip(0, + (getSize().y - frameSize) / 2); + } + + public void renderBase(Coord mouse) { + if (!isVisible()) return; + + Rect box = getBoxRect(); + + RGB bdc = getColor(BDR, mouse); + RGB bgc = getColor(BG, mouse); + + RenderUtils.quadRectBorder(box, borderWidth, bdc, bgc); + + + glEnable(GL_TEXTURE_2D); + Coord txtCenterPos = rect.getMin().add(frameSize + txtDist, 0).add_ip(0, rect.getSize().y / 2 - FontManager.height(font) / 2 - 2); + FontManager.draw(txtCenterPos, text, font, getColor(FG, mouse), Align.LEFT); + glDisable(GL_TEXTURE_2D); + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + renderBase(mouse); + + if (checked) { + Rect box = getBoxRect(); + + RenderUtils.setColor(getColor(FG, mouse)); + glLineWidth(2); + glBegin(GL_LINES); + glVertex2d(box.getMin().x + markDist, box.getMin().y + markDist); + glVertex2d(box.getMin().x + frameSize - markDist, box.getMin().y + frameSize - markDist); + glVertex2d(box.getMin().x + markDist, box.getMin().y + frameSize - markDist); + glVertex2d(box.getMin().x + frameSize - markDist, box.getMin().y + markDist); + glEnd(); + } + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (button != 0) return null; + if (!isMouseOver(pos)) { + clicked = false; + return null; + } + if (down == true) { + clicked = true; + } else { + if (clicked) { + Sounds.click2.playEffect(1, 0.5f, false); + clicked = false; + setChecked(!isChecked()); + return this; + } + } + return null; + } + + @Override + public void onBlur() { + clicked = false; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + Coord oldms = getMinSize().copy(); + setMinSize(new Coord(FontManager.width(font, text) + frameSize + this.txtDist, FontManager.height(font))); + if (minSize.x < oldms.x) minSize.x = oldms.x; + if (minSize.y < oldms.y) minSize.y = oldms.y; + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/input/RadioButton.java b/src/net/sector/gui/widgets/input/RadioButton.java new file mode 100644 index 0000000..d03f13b --- /dev/null +++ b/src/net/sector/gui/widgets/input/RadioButton.java @@ -0,0 +1,95 @@ +package net.sector.gui.widgets.input; + + +import static net.sector.gui.widgets.EColorRole.*; + +import java.util.HashSet; + +import net.sector.util.RenderUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Rect; + + +/** + * Radio button. + * + * @author MightyPork + */ +public class RadioButton extends Checkbox { + + /** + * Radio group. + * + * @author MightyPork + */ + public static class RadioGroup extends HashSet {} + + /** + * Build new radiobutton group. + * + * @return group list. + */ + public static RadioGroup newGroup() { + return new RadioGroup(); + } + + private RadioGroup group = null; + + /** + * Assign radio button group + * + * @param groupList group list + * @return this + */ + public RadioButton setGroup(RadioGroup groupList) { + this.group = groupList; + group.add(this); + return this; + } + + /** + * Radio button + * + * @param id widget ID + * @param text + */ + public RadioButton(int id, String text) { + super(id, text); + } + + /** + * Radio button + * + * @param id widget id + * @param text widget text + * @param font render font + */ + public RadioButton(int id, String text, String font) { + super(id, text, font); + } + + @Override + public Checkbox setChecked(boolean checked) { + if (checked == false) return this; // no unchecking here. + for (RadioButton rb : group) + rb.setChecked_do(false); + setChecked_do(true); + return this; + } + + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + renderBase(mouse); + + if (checked) { + Rect box = getBoxRect(); + + RenderUtils.setColor(getColor(FG, mouse)); + RenderUtils.quadSize(box.getMin().x + markDist, box.getMin().y + markDist, frameSize - markDist * 2, frameSize - markDist * 2); + } + } +} diff --git a/src/net/sector/gui/widgets/input/Scrollbar.java b/src/net/sector/gui/widgets/input/Scrollbar.java new file mode 100644 index 0000000..d55bf30 --- /dev/null +++ b/src/net/sector/gui/widgets/input/Scrollbar.java @@ -0,0 +1,168 @@ +package net.sector.gui.widgets.input; + + +import static net.sector.gui.widgets.EColorRole.*; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.IScrollable; +import net.sector.gui.widgets.Widget; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; + + +/** + * Clcikable button. + * + * @author MightyPork + */ +public class Scrollbar extends Widget { + + private int bdr = 2; + private int ingap = 1; + + private double value = 0; + + private IScrollable scrollable; + + /** + * new scrollbar + * + * @param width scrollbar width + * @param height scrollbar height + */ + public Scrollbar(int width, int height) { + setMinSize(width, height); + setTheme(ETheme.BLUE_SCROLLBAR); + } + + /** + * Set scrollable element + * + * @param scrollable scrollable element + * @return this + */ + public Scrollbar setScrollable(IScrollable scrollable) { + this.scrollable = scrollable; + scrollable.onScrollbarConnected(this); + return this; + } + + private double getContentHeight() { + return scrollable.getContentHeight(); + } + + private double getViewHeight() { + return scrollable.getViewHeight(); + } + + private double getGrooveHeight() { + return getSize().y - bdr * 2 - ingap * 2; + } + + private double getHandleHeight() { + double h = (getViewHeight() / getContentHeight()) * getGrooveHeight(); + if (h < 20) h = 20; + if (h > getGrooveHeight()) h = getGrooveHeight(); + return h; + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + RGB borderC = getColor(BDR, mouse); + RGB fillC = getColor(BG, mouse); + + RenderUtils.quadRectBorder(rect, bdr, borderC, fillC); + + + borderC = getColor(BDR_INNER, mouse); + fillC = getColor(FG, mouse); + + double GH = getGrooveHeight(); + double HH = getHandleHeight(); + + Coord min = new Coord(rect.getMin().x + bdr + ingap, rect.getMin().y + bdr + ingap + GH - (GH - HH) * value - HH); + Coord max = min.add(rect.getSize().x - bdr * 2 - ingap * 2, getHandleHeight()); + + + RenderUtils.quadCoordBorder(min, max, 2, borderC, fillC); + } + + private boolean isDragging = false; + private Coord posDragStart; + private double valueDragStart = 0; + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (button != 0) return null; + if (!isDragging && !isMouseOver(pos)) { + + return null; + } + if (getContentHeight() <= getViewHeight()) return null; + if (down == true) { + isDragging = true; + posDragStart = pos; + valueDragStart = value; + } else { + // up. + isDragging = false; + } + return null; + } + + @Override + public void handleStaticInputs(Coord pos) { + if (isDragging) { + double vlast = value; + value = valueDragStart + (1 / (getGrooveHeight() - getHandleHeight())) * (posDragStart.y - pos.y); + value = Calc.clampd(value, 0, 1); + if (value != vlast) { + scrollable.onScrollbarChange(value); + } + } + } + + @Override + public void onBlur() { + + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + if (isMouseOver(pos)) { + return onScrollDelegate(scroll); + } + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + rect.setTo(0, 0, minSize.x, minSize.y); + } + + public Widget onScrollDelegate(int scroll) { + if (getContentHeight() <= getViewHeight()) return null; + double vlast = value; + value = Calc.clampd(value - scroll * (getViewHeight() / getContentHeight()) * 0.2, 0, 1); + if (value != vlast) scrollable.onScrollbarChange(value); + return this; + } + + public double getValue() { + return value; + } + + public void setValue(double value) { + this.value = Calc.clampd(value, 0, 1); + } + +} diff --git a/src/net/sector/gui/widgets/input/Slider.java b/src/net/sector/gui/widgets/input/Slider.java new file mode 100644 index 0000000..686af02 --- /dev/null +++ b/src/net/sector/gui/widgets/input/Slider.java @@ -0,0 +1,145 @@ +package net.sector.gui.widgets.input; + + +import static net.sector.gui.widgets.EColorRole.*; +import net.sector.gui.panels.PanelGui; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.Widget; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; + + +/** + * Clcikable button. + * + * @author MightyPork + */ +public class Slider extends Widget { + + private int bdr = 2; + + private double value = 0; + private int handleW = 22; + private int handleH = 22; + private int grooveH = 6; + private int ingapH = 2 + handleH / 2; + + /** + * new scrollbar + * + * @param width scrollbar width + * @param value slider value + */ + public Slider(int width, double value) { + setMinSize(width, handleH + 4); + setValue(value); + setTheme(ETheme.BLUE_SCROLLBAR); + } + + + private double getGrooveWidth() { + return getSize().x - bdr * 2 - ingapH * 2; + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + RGB borderC = getColor(BDR, mouse); + RGB fillC = getColor(BG, mouse); + + Coord grooveMin = rect.getCenterLeft().sub(0, grooveH / 2); + Coord grooveMax = rect.getCenterRight().add(0, grooveH / 2); + + RenderUtils.quadCoordBorder(grooveMin, grooveMax, bdr, borderC, fillC); + + borderC = getColor(BDR_INNER, mouse); + fillC = getColor(FG, mouse); + + double GW = getGrooveWidth(); + double HW = handleW; + double HH = handleH; + + Coord handleMin = new Coord(rect.getMin().x + bdr + ingapH + (GW) * value - (HW / 2), rect.getCenter().y - HH / 2); + Coord handleMax = handleMin.add(HW, HH); + + RenderUtils.quadCoordBorder(handleMin, handleMax, 2, borderC, fillC); + } + + private boolean isDragging = false; + private Coord posDragStart; + private double valueDragStart = 0; + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (button != 0) return null; + if (!isDragging && !isMouseOver(pos)) { + + return null; + } + + if (down == true) { + isDragging = true; + posDragStart = pos; + valueDragStart = value; + } else { + // up. + isDragging = false; + } + return null; + } + + @Override + public void handleStaticInputs(Coord pos) { + if (isDragging) { + double vlast = value; + value = valueDragStart - (1 / getGrooveWidth()) * (posDragStart.x - pos.x); + value = Calc.clampd(value, 0, 1); + if (value != vlast) { + ((PanelGui) getPanel()).actionPerformed(this); + } + } + } + + @Override + public void onBlur() { + + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + if (isMouseOver(pos)) { + return onScrollDelegate(scroll); + } + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + rect.setTo(0, 0, minSize.x, minSize.y); + } + + public Widget onScrollDelegate(int scroll) { + double vlast = value; + value = Calc.clampd(value + scroll * 0.1, 0, 1); + if (value != vlast) ((PanelGui) getPanel()).actionPerformed(this); + return this; + } + + public double getValue() { + return value; + } + + public void setValue(double value) { + this.value = Calc.clampd(value, 0, 1); + } + +} diff --git a/src/net/sector/gui/widgets/input/TextInput.java b/src/net/sector/gui/widgets/input/TextInput.java new file mode 100644 index 0000000..4592292 --- /dev/null +++ b/src/net/sector/gui/widgets/input/TextInput.java @@ -0,0 +1,165 @@ +package net.sector.gui.widgets.input; + + +import static net.sector.gui.widgets.EColorRole.*; +import net.sector.fonts.FontManager; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.Widget; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.util.StringUtils; + + +/** + * Clcikable button. + * + * @author MightyPork + */ +public class TextInput extends Widget { + public static final String CHARS_NUMBERS = "0123456789"; + public static final String CHARS_NUMBERS_FLOAT = "0123456789.-"; + public static final String CHARS_FILENAME = FontManager.Glyphs.alnum + ".,+-'!_&%#@()[]{}"; + public static final String CHARS_EMAIL = FontManager.Glyphs.alnum_nospace + ".@+-_"; + public static final String CHARS_ALL = FontManager.Glyphs.all; + public static final String CHARS_ALNUM = FontManager.Glyphs.alnum; + public static final String CHARS_BASIC = FontManager.Glyphs.basic; + public static final String CHARS_USERNAME = FontManager.Glyphs.basic; + + public boolean passwordMode = false; + + public double borderWidth = 2; + public double paddingX = 6; + public double paddingY = 4; + + public String allowedChars = CHARS_BASIC; + + /** + * Set chars allowed in this text input. + * + * @param allowed allowed chars + * @return this + */ + public TextInput setAllowedChars(String allowed) { + this.allowedChars = allowed; + return this; + } + + public TextInput setPasswordMode(boolean state) { + passwordMode = state; + return this; + } + + public TextInput setPadding(double x, double y) { + paddingX = x; + paddingY = y; + return this; + } + + public TextInput setBorderSize(double width) { + borderWidth = width; + return this; + } + + /** + * new button + * + * @param id widget id + * @param text widget text + * @param font render font + */ + public TextInput(int id, String text, String font) { + setId(id); + setText(text); + setFont(font); + setTheme(ETheme.BLUE); + } + + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + boolean hover = isMouseOver(mouse) || focused; + + RGB cBdr = getColor(BDR, mouse, hover); + RGB cBg = getColor(BG, mouse, hover); + RGB cFg = getColor(FG, mouse, hover); + + RenderUtils.quadRectBorder(rect, borderWidth, cBdr, cBg); + + + GL11.glEnable(GL11.GL_TEXTURE_2D); + + boolean cursor = focused && enabled && System.currentTimeMillis() % 800 < 400; + + Coord txtPos = rect.getMin().add(paddingX + borderWidth, paddingY + borderWidth - 2); + String shown = getShownText(text); + FontManager.draw(txtPos, shown + (cursor ? "|" : ""), font, cFg, Align.LEFT); + GL11.glDisable(GL11.GL_TEXTURE_2D); + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (down) { + if (isMouseOver(pos)) { + return this; + } + } + return null; + } + + @Override + public void onBlur() {} + + @Override + public void onFocus() { + super.onFocus(); + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + private String getShownText(String text) { + if (!passwordMode) return text; + return StringUtils.passwordify(text); + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + if (focused && enabled && down && chr != 0) { + if (key == Keyboard.KEY_BACK || key == Keyboard.KEY_DELETE) { + if (text.length() > 0) { + text = text.substring(0, text.length() - 1); + return this; + } + } + if (allowedChars == null || allowedChars.contains("" + chr)) { + if (FontManager.width(font, getShownText(text + chr) + "|") <= getMinSize().x - borderWidth * 2 - paddingX * 2) { + text += chr; + return this; + } + } + } + + return null; + } + + @Override + public void calcChildSizes() { + Coord oldms = getMinSize().copy(); + // + borderWidth * 2 + paddingX * 2 + setMinSize(new Coord(oldms.x, FontManager.height(font) + borderWidth * 2 + paddingY * 2)); + if (minSize.x < oldms.x) minSize.x = oldms.x; + if (minSize.y < oldms.y) minSize.y = oldms.y; + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/input/TextInputCountry.java b/src/net/sector/gui/widgets/input/TextInputCountry.java new file mode 100644 index 0000000..de9cfc7 --- /dev/null +++ b/src/net/sector/gui/widgets/input/TextInputCountry.java @@ -0,0 +1,68 @@ +package net.sector.gui.widgets.input; + + +import net.sector.gui.panels.profiles.PanelSelectCountry; +import net.sector.gui.widgets.Widget; +import net.sector.network.CountryList; + +import com.porcupine.coord.Coord; + + +/** + * Text input for countries + * + * @author MightyPork + */ +public class TextInputCountry extends TextInput { + + /** + * Country text input + * + * @param id ID + * @param text text + * @param font font + */ + public TextInputCountry(int id, String text, String font) { + super(id, text, font); + this.text = "Click to select..."; + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (isMouseOver(pos) && down) clicked = true; + if (!down) { + if (clicked && isMouseOver(pos)) { + clicked = false; + getPanel().openPanel(new PanelSelectCountry(getPanel().screen, this)); + return this; + } + clicked = false; + } + return null; + } + + /** + * Set country code + * + * @param code country code + * @return this + */ + public TextInputCountry setCountry(String code) { + + if (code.equals("")) { + setText("Click to select..."); + } else { + String name = CountryList.getName(code); + setText(name); + } + + setTag(code); + return this; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + +} diff --git a/src/net/sector/gui/widgets/layout/Gap.java b/src/net/sector/gui/widgets/layout/Gap.java new file mode 100644 index 0000000..bce6d56 --- /dev/null +++ b/src/net/sector/gui/widgets/layout/Gap.java @@ -0,0 +1,51 @@ +package net.sector.gui.widgets.layout; + + +import net.sector.gui.widgets.Widget; + +import com.porcupine.coord.Coord; + + +/** + * Space + * + * @author MightyPork + */ +public class Gap extends Widget { + + /** + * Gui space (gap) + * + * @param width min width + * @param height min height + */ + public Gap(int width, int height) { + setMargins(0, 0, 0, 0); + setMinSize(width, height); + } + + @Override + public void render(Coord mouse) {} + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + return null; + } + + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/layout/LayoutBase.java b/src/net/sector/gui/widgets/layout/LayoutBase.java new file mode 100644 index 0000000..9349b5f --- /dev/null +++ b/src/net/sector/gui/widgets/layout/LayoutBase.java @@ -0,0 +1,111 @@ +package net.sector.gui.widgets.layout; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.ArrayList; + +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; + +import com.porcupine.coord.Coord; + + +/** + * Base for layouts. + * + * @author MightyPork + */ +public abstract class LayoutBase extends Widget { + + /** layout children. */ + public ArrayList children = new ArrayList(); + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + glPushMatrix(); + glTranslated(rect.x1(), rect.y1(), 2); + for (Widget child : children) { + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + Coord pos_r = mouse.sub(rect.getMin()); + child.render(pos_r); + glPopAttrib(); + glPopMatrix(); + } + glPopMatrix(); + } + + @Override + public void handleStaticInputs(Coord pos) { + if (!isVisible() || !isEnabled()) return; + + Coord pos_r = pos.sub(rect.getMin()); + for (Widget child : children) { + if (!child.isEnabled() || !child.isVisible()) continue; + child.handleStaticInputs(pos_r); + } + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (!isVisible() || !isEnabled()) return null; + + Coord pos_r = pos.sub(rect.getMin()); + for (Widget child : children) { + if (!child.isEnabled() || !child.isVisible()) continue; + Widget consumer = child.onMouseButton(pos_r, button, down); + if (consumer != null) return consumer; + } + return null; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + if (!isVisible() || !isEnabled()) return null; + + Coord pos_r = pos.sub(rect.getMin()); + for (Widget child : children) { + if (!child.isEnabled() || !child.isVisible()) continue; + Widget consumer = child.onScroll(pos_r, scroll); + if (consumer != null) return consumer; + } + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + if (!isVisible() || !isEnabled()) return null; + + for (Widget child : children) { + if (!child.isEnabled() || !child.isVisible()) continue; + Widget consumer = child.onKey(key, chr, down); + if (consumer != null) return consumer; + } + return null; + } + + @Override + public abstract void calcChildSizes(); + + @Override + public void add(Widget child) { + children.add(child); + } + + @Override + public void removeAll() { + children.clear(); + } + + @Override + public void setGuiRoot(GuiRoot guiContainer) { + super.setGuiRoot(guiContainer); + for (Widget child : children) { + child.setGuiRoot(guiContainer); + } + } + +} diff --git a/src/net/sector/gui/widgets/layout/LayoutH.java b/src/net/sector/gui/widgets/layout/LayoutH.java new file mode 100644 index 0000000..fa10a6a --- /dev/null +++ b/src/net/sector/gui/widgets/layout/LayoutH.java @@ -0,0 +1,83 @@ +package net.sector.gui.widgets.layout; + + +import static net.sector.util.Align.*; +import net.sector.gui.widgets.Widget; + +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +/** + * Horizontal layout widget + * + * @author MightyPork + */ +public class LayoutH extends LayoutBase { + + /** vertical align */ + private int alignV = CENTER; + + /** + * New horizontal layout widget + * + * @param alignV vertical align. -1 bottom, 0 center, 1 top. + */ + public LayoutH(int alignV) { + this.alignV = alignV; + } + + @Override + public void calcChildSizes() { + double lastMargin = 0; + double totalSize = 0; + double maxVerticalSize = 0; + + // measure max width for alignment. + for (Widget child : children) { + child.calcChildSizes(); + maxVerticalSize = Math.max(maxVerticalSize, child.getSize().y + child.getMargins().top + child.getMargins().bottom); + } + + boolean first = true; + // generate rects + for (Widget child : children) { + // add whats required by margins. + if (!first && child.getSize().x > 0) { + totalSize += Calc.max(lastMargin, child.getMargins().left); + } + + first = false; + switch (alignV) { + case BOTTOM: + child.rect.add_ip(new Vec(totalSize, child.getMargins().bottom)); + break; + case CENTER: + child.rect.add_ip(new Vec(totalSize, (maxVerticalSize - child.getSize().y) / 2)); + break; + case TOP: + child.rect.add_ip(new Vec(totalSize, (maxVerticalSize - child.getSize().y - child.getMargins().top))); + } + + totalSize += child.getSize().x; + lastMargin = child.getMargins().right; + } + + if (Math.round(totalSize) % 2 == 1) { + totalSize += 1; + } + + if (Math.round(maxVerticalSize) % 2 == 1) { + maxVerticalSize += 1; + } + + this.rect.setTo(0, 0, Math.max(minSize.x, totalSize), Math.max(minSize.y, maxVerticalSize)); + +// if(minSize.x>totalSize) { +// for (Widget child : children) { +// child.getRect().add_ip(minSize.x-totalSize, 0); +// } +// } + } + +} diff --git a/src/net/sector/gui/widgets/layout/LayoutV.java b/src/net/sector/gui/widgets/layout/LayoutV.java new file mode 100644 index 0000000..c64c78e --- /dev/null +++ b/src/net/sector/gui/widgets/layout/LayoutV.java @@ -0,0 +1,85 @@ +package net.sector.gui.widgets.layout; + + +import static net.sector.util.Align.*; +import net.sector.gui.widgets.Widget; + +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +/** + * Vertical layout widget + * + * @author MightyPork + */ +public class LayoutV extends LayoutBase { + + /** horizontal align */ + private int alignH = CENTER; + + /** + * new Vertical layout widget + * + * @param alignH horizontal align: -1 left, 0 center, 1 right + */ + public LayoutV(int alignH) { + this.alignH = alignH; + } + + @Override + public void calcChildSizes() { + + double lastMargin = 0; + double totalSize = 0; + double maxHorizontalSize = 0; + + // measure max width for alignment. + for (Widget child : children) { + child.calcChildSizes(); + maxHorizontalSize = Math.max(maxHorizontalSize, child.getSize().x + child.getMargins().left + child.getMargins().right); + } + + maxHorizontalSize = Math.max(maxHorizontalSize, minSize.x); + + // generate rects + boolean first = true; + for (int i = children.size() - 1; i >= 0; i--) { + Widget child = children.get(i); + // add whats required by margins. + if (!first) { + totalSize += Calc.max(lastMargin, child.getMargins().bottom); + } + first = false; + switch (alignH) { + case LEFT: + child.rect.add_ip(new Vec(0, totalSize)); + break; + case CENTER: + child.rect.add_ip(new Vec((maxHorizontalSize - child.getSize().x) / 2, totalSize)); + break; + case RIGHT: + child.rect.add_ip(new Vec((maxHorizontalSize - child.getSize().x - child.getMargins().right), totalSize)); + } + + totalSize += child.getSize().y; + lastMargin = child.getMargins().top; + } + + if (Math.round(totalSize) % 2 == 1) { + totalSize += 1; + } + + if (Math.round(maxHorizontalSize) % 2 == 1) { + maxHorizontalSize += 1; + } + + this.rect.setTo(0, 0, (int) Math.round(Math.max(minSize.x, maxHorizontalSize)), (int) Math.round(Math.max(minSize.y, totalSize))); + if (minSize.y > totalSize) { + for (Widget child : children) { + child.getRect().add_ip(0, minSize.y - totalSize); + } + } + } + +} diff --git a/src/net/sector/gui/widgets/layout/ScrollingLayoutV.java b/src/net/sector/gui/widgets/layout/ScrollingLayoutV.java new file mode 100644 index 0000000..fc7ee1e --- /dev/null +++ b/src/net/sector/gui/widgets/layout/ScrollingLayoutV.java @@ -0,0 +1,150 @@ +package net.sector.gui.widgets.layout; + + +import java.util.ArrayList; + +import net.sector.gui.widgets.IScrollable; +import net.sector.gui.widgets.IWidgetFactory; +import net.sector.gui.widgets.Widget; +import net.sector.gui.widgets.WidgetMargins; +import net.sector.gui.widgets.input.Scrollbar; +import net.sector.util.Align; +import net.sector.util.Log; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Rect; + + +public class ScrollingLayoutV extends LayoutV implements IScrollable { + + + private Scrollbar scrollbar; + + private ArrayList positions; + + /** + * Create scrolling layout V.
+ * After creating, this layout must be filled with at least the minimal + * amount of children to stretch it accordingly.
+ * It does not work well with children of different sizes. + * + * @param childrenShown + */ + public ScrollingLayoutV(int childrenShown, IWidgetFactory fakeWidgetFactory) { + super(Align.LEFT); + this.childrenShown = childrenShown; + + for (int i = 1; i <= childrenShown; i++) + addChild(fakeWidgetFactory.getWidget()); + rememberPositions(); + removeAll(); + } + + private class ChildPos { + + public ChildPos(Widget w) { + this.rect = w.rect.copy(); + this.margins = w.margins.copy(); + this.minSize = w.minSize.copy(); + } + + public void modify(Widget w) { + w.rect.setTo(this.rect); + w.margins.setTo(this.margins); + w.minSize.setTo(this.minSize); + } + + public Rect rect; + public WidgetMargins margins; + public Coord minSize; + } + + private void rememberPositions() { + calcChildSizes(); + positions = new ArrayList(childrenShown); + for (Widget ch : children) { + if (ch == null) { + Log.w("Null child in ScrollingLayoutV!"); + } else { + positions.add(new ChildPos(ch)); + } + } + //Collections.reverse(positions); + setMinSize(getSize()); + } + + private int childrenShown = 1; + + private ArrayList allChildren = new ArrayList(); + + public void addChild(Widget widget) { + allChildren.add(widget); + if (children.size() < childrenShown) children.add(widget); + } + + @Override + @Deprecated + public void add(Widget child) {} + + @Override + public double getContentHeight() { + return allChildren.size(); + } + + @Override + public double getViewHeight() { + return childrenShown; + } + + @Override + public void onScrollbarChange(double value) { + int startEntry = (int) ((getContentHeight() - getViewHeight()) * value); + + children.clear(); + if (allChildren.size() < childrenShown) { + for (int i = 0, c = 0; i < allChildren.size(); i++, c++) { + try { + Widget w; + children.add(w = allChildren.get(i)); + w.setGuiRoot(getGuiRoot()); + positions.get(c).modify(w); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + } else { + for (int i = startEntry, c = 0; i < startEntry + childrenShown; i++, c++) { + try { + Widget w; + children.add(w = allChildren.get(i)); + w.setGuiRoot(getGuiRoot()); + positions.get(c).modify(w); + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + //calcChildSizes(); + } + + @Override + public void removeAll() { + children.clear(); + allChildren.clear(); + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return scrollbar.onScrollDelegate(scroll); + } + + @Override + public void onScrollbarConnected(Scrollbar scrollbar) { + this.scrollbar = scrollbar; + } + +} diff --git a/src/net/sector/gui/widgets/layout/WindowFrame.java b/src/net/sector/gui/widgets/layout/WindowFrame.java new file mode 100644 index 0000000..c7d9abd --- /dev/null +++ b/src/net/sector/gui/widgets/layout/WindowFrame.java @@ -0,0 +1,217 @@ +package net.sector.gui.widgets.layout; + + +import static net.sector.gui.widgets.EColorRole.*; +import static org.lwjgl.opengl.GL11.*; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.GuiRoot; +import net.sector.gui.widgets.Widget; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Frame for widgets (with shadow and border + background) + * + * @author MightyPork + */ +public class WindowFrame extends Widget { + + public int alignH = 0; + public int alignV = 0; + + public double borderWidth = 3; + + private Widget child = null; + public double paddingBottom = 3; + public double paddingLeft = 3; + public double paddingRight = 3; + + public double paddingTop = 3; + + public double shadowX = 10; + public double shadowY = 10; + + public boolean showBorder = true; + public boolean showShadow = true; + + public WindowFrame() { + setTheme(ETheme.BLUE_FRAME); + } + + /** + * Set the primary and only child. + */ + @Override + public void add(Widget child) { + this.child = child; + } + + @Override + public void calcChildSizes() { + child.calcChildSizes(); + + Coord oldms = getMinSize().copy(); + + //@formatter:off + setMinSize( (int)(Math.max(minSize.x, child.getSize().x + paddingLeft + paddingRight + borderWidth * 2)), + (int)(Math.max(minSize.y, child.getSize().y + paddingTop + paddingBottom + borderWidth * 2))); + //@formatter:on + + rect.setTo(0, 0, minSize.x, minSize.y); + + //Coord lbPos = rect.getCenter(); + Coord childMove = new Coord(); + Coord sizeC = child.getSize(); + + double bdrL = paddingLeft + borderWidth; + double bdrT = paddingTop + borderWidth; + double bdrR = paddingRight + borderWidth; + double bdrB = paddingBottom + borderWidth; + + switch (alignH) { + case Align.LEFT: + childMove.x = bdrL; + break; + case Align.RIGHT: + childMove.x = rect.getSize().x - bdrL - bdrR - sizeC.x; + break; + case Align.CENTER: + childMove.x = rect.getSize().x / 2 - sizeC.x / 2; + break; + } + + + switch (alignV) { + case Align.TOP: + childMove.y = rect.getSize().y - bdrB - bdrT - sizeC.y; + break; + case Align.BOTTOM: + childMove.y = bdrB; + break; + case Align.CENTER: + childMove.y = rect.getSize().y / 2 - sizeC.y / 2; + break; + } + + + child.rect.add_ip(new Vec(childMove)); + } + + public WindowFrame enableBorder(boolean flag) { + showBorder = flag; + if (!flag) borderWidth = 0; + return this; + } + + public WindowFrame enableShadow(boolean flag) { + showShadow = flag; + return this; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + if (!isVisible() || !isEnabled()) return null; + + if (!child.isEnabled() || !child.isVisible()) return null; + return child.onKey(key, chr, down); + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (!isVisible() || !isEnabled()) return null; + + Coord pos_r = pos.sub(rect.getMin()); + + if (!child.isEnabled() || !child.isVisible()) return null; + return child.onMouseButton(pos_r, button, down); + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + if (!isVisible() || !isEnabled()) return null; + + Coord pos_r = pos.sub(rect.getMin()); + if (!child.isEnabled() || !child.isVisible()) return null; + return child.onScroll(pos_r, scroll); + } + + + @Override + public void handleStaticInputs(Coord pos) { + if (!isVisible() || !isEnabled()) return; + + Coord pos_r = pos.sub(rect.getMin()); + + if (!child.isEnabled() || !child.isVisible()) return; + child.handleStaticInputs(pos_r); + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + if (showShadow) { + RenderUtils.setColor(getColor(SHADOW)); + RenderUtils.quadCoord(rect.getMin().x + shadowX, rect.getMin().y - shadowY, rect.getMax().x + shadowX, rect.getMax().y - shadowY); + } + + if (showBorder) { + RenderUtils.quadRectBorder(rect, borderWidth, getColor(BDR), getColor(BG)); + } else { + RenderUtils.setColor(getColor(BG)); + RenderUtils.quadCoord(rect.getMin().x, rect.getMin().y, rect.getMax().x, rect.getMax().y); + } + + + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + + glTranslated(rect.x1(), rect.y1(), 2); + child.render(mouse.sub(rect.getMin())); + + glPopAttrib(); + glPopMatrix(); + } + + public WindowFrame setAlignH(int align) { + alignH = align; + return this; + } + + public WindowFrame setAlignV(int align) { + alignV = align; + return this; + } + + public WindowFrame setBorderSize(double width) { + borderWidth = width; + showBorder = true; + return this; + } + + @Override + public void setGuiRoot(GuiRoot guiContainer) { + super.setGuiRoot(guiContainer); + child.setGuiRoot(guiContainer); + } + + public WindowFrame setPadding(double left, double right, double top, double bottom) { + paddingLeft = left; + paddingRight = right; + paddingTop = top; + paddingBottom = bottom; + return this; + } + + + public WindowFrame setShadowOffset(double shiftX, double shiftY) { + shadowX = shiftX; + shadowY = shiftY; + showShadow = true; + return this; + } +} diff --git a/src/net/sector/gui/widgets/menu/MenuButton.java b/src/net/sector/gui/widgets/menu/MenuButton.java new file mode 100644 index 0000000..8afbc79 --- /dev/null +++ b/src/net/sector/gui/widgets/menu/MenuButton.java @@ -0,0 +1,94 @@ +package net.sector.gui.widgets.menu; + + +import static net.sector.gui.widgets.EColorRole.*; +import net.sector.fonts.FontManager; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.Widget; +import net.sector.sounds.Sounds; +import net.sector.util.Align; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Clcikable button. + * + * @author MightyPork + */ +public class MenuButton extends Widget { + + private boolean clicked = false; + + public String font = "menu"; + + /** + * new button + * + * @param id widget id + * @param text widget text + * @param font render font + */ + public MenuButton(int id, String text) { + setId(id); + setText(text); + setTheme(ETheme.MENU_BUTTON); + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + boolean hover = (isMouseOver(mouse) && isPanelOnTop()); + + RGB color = getColor(FG, mouse); + RGB blur = getColor(SHADOW, mouse); + + FontManager.drawFuzzy(rect.getCenterDown(), text, font, blur, color, hover ? 3 : 1, Align.CENTER); + + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (button != 0) return null; + if (!isMouseOver(pos)) return null; + if (down == true) { + clicked = true; + } else { + if (clicked) { + + Sounds.beep_soft.playAsSoundEffect(1, 0.05f, false); + + // mouse down and up + // click consumed, send event to listener + return this; + } + } + return null; + } + + @Override + public void onBlur() { + clicked = false; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + //FontManager.setFullscreenDoubleSize(true); + setMinSize(new Coord(FontManager.width(font, text), FontManager.height(font))); + rect.setTo(0, 0, minSize.x, minSize.y); + //FontManager.setFullscreenDoubleSize(false); + } + +} diff --git a/src/net/sector/gui/widgets/menu/MenuLoginDisplay.java b/src/net/sector/gui/widgets/menu/MenuLoginDisplay.java new file mode 100644 index 0000000..b7f9ce2 --- /dev/null +++ b/src/net/sector/gui/widgets/menu/MenuLoginDisplay.java @@ -0,0 +1,128 @@ +package net.sector.gui.widgets.menu; + + +import net.sector.App; +import net.sector.fonts.FontManager; +import net.sector.gui.widgets.Widget; +import net.sector.level.SuperContext; +import net.sector.sounds.Sounds; +import net.sector.util.Align; +import net.sector.util.RenderUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +public class MenuLoginDisplay extends Widget { + + public MenuLoginDisplay(int id) { + setMinSize(330, 100); + setId(id); + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + boolean hover = (isMouseOver(mouse) && isPanelOnTop()); + + // line + int bdr = 2; + + RGB side = new RGB(0x029BFA, 0); + RGB center = new RGB(0x02D9FA, 1); + + RenderUtils.quadCoordGradHBilinear(rect.getMin().x, rect.getMax().y - bdr, rect.getMax().x, rect.getMax().y, side, center); + + RenderUtils.quadCoordGradHBilinear(rect.getMin().x, rect.getMin().y, rect.getMax().x, rect.getMin().y + bdr, side, center); + + String font1 = "login_display1"; + String font2 = "login_display2"; + + + + Coord pos = rect.getCenterTop(); + + RGB color = hover ? new RGB(0x02E9FA) : new RGB(0x0B94E3); + RGB blur = hover ? new RGB(0x00A8FC, 0.05) : new RGB(0x003185, 0.05); + + if (App.offlineMode) { + + pos.y -= rect.getSize().y / 2; + pos.y -= FontManager.height(font2) / 2; + + FontManager.drawFuzzy(pos, "No Connection!", font2, new RGB(0xff0000, 0.04), new RGB(0xff0000), 2, Align.CENTER); + + } else if (SuperContext.selectedUser == null) { + + pos.y -= rect.getSize().y / 2; + pos.y -= FontManager.height(font2) / 2; + + FontManager.drawFuzzy(pos, "Click to log in.", font2, blur, color, hover ? 3 : 2, Align.CENTER); + + } else { + pos.y -= rect.getSize().y / 3; + + String s1 = "Logged in as "; + String s2 = SuperContext.selectedUser.uname.trim(); + + double totalWidth = FontManager.width(font1, s1 + s2); + double w1 = FontManager.width(font1, s1); + + RGB c1main = new RGB(0x0B74E3); + RGB c1blur = new RGB(0x003185, 0.2); + + RGB c2main = new RGB(0x0CADED); + RGB c2blur = new RGB(0x0C62A8, 0.1); + + FontManager.drawFuzzy(pos.sub(totalWidth / 2, FontManager.height(font1) / 2), s1, font1, c1blur, c1main, 1, Align.LEFT); + FontManager.drawFuzzy(pos.sub(totalWidth / 2 - w1, FontManager.height(font1) / 2), s2, font2, c2blur, c2main, 2, Align.LEFT); + + pos.y -= rect.getSize().y / 3; + FontManager.drawFuzzy(pos.sub(0, FontManager.height(font2) / 2), "Click to change.", font2, blur, color, hover ? 3 : 2, Align.CENTER); + } + + + + } + + private boolean clicked = false; + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + if (App.offlineMode) return null; + if (button != 0) return null; + if (!isMouseOver(pos)) return null; + if (down == true) { + clicked = true; + } else { + if (clicked) { + Sounds.beep_soft.playAsSoundEffect(1, 0.05f, false); + return this; + } + } + + return null; + } + + @Override + public void onBlur() { + clicked = false; + } + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + rect.setTo(0, 0, minSize.x, minSize.y); + } + +} diff --git a/src/net/sector/gui/widgets/menu/MenuTitle.java b/src/net/sector/gui/widgets/menu/MenuTitle.java new file mode 100644 index 0000000..27de369 --- /dev/null +++ b/src/net/sector/gui/widgets/menu/MenuTitle.java @@ -0,0 +1,78 @@ +package net.sector.gui.widgets.menu; + + +import static net.sector.gui.widgets.EColorRole.*; +import net.sector.fonts.FontManager; +import net.sector.gui.widgets.ETheme; +import net.sector.gui.widgets.Widget; +import net.sector.util.Align; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; + + +/** + * Passive label + * + * @author MightyPork + */ +public class MenuTitle extends Widget { + + /** + * Gui label + * + * @param text widget text + * @param font render font + */ + public MenuTitle(String text, String font) { + setText(text); + setFont(font); + setTheme(ETheme.MENU_TITLE); + } + + /** + * Gui label menu_title + * + * @param text widget text + */ + public MenuTitle(String text) { + this(text, "menu_title"); + } + + @Override + public void render(Coord mouse) { + if (!isVisible()) return; + + + RGB color = getColor(FG, mouse); + RGB blur = getColor(SHADOW, mouse); + + FontManager.drawFuzzy(rect.getCenterDown(), text, font, blur, color, 1, Align.CENTER); + + } + + @Override + public Widget onMouseButton(Coord pos, int button, boolean down) { + return null; + } + + + @Override + public Widget onScroll(Coord pos, int scroll) { + return null; + } + + @Override + public Widget onKey(int key, char chr, boolean down) { + return null; + } + + @Override + public void calcChildSizes() { + //FontManager.setFullscreenDoubleSize(true); + setMinSize((int) FontManager.width(font, text), (int) FontManager.height(font)); + rect.setTo(0, 0, minSize.x, minSize.y); + //FontManager.setFullscreenDoubleSize(false); + } + +} diff --git a/src/net/sector/input/EInput.java b/src/net/sector/input/EInput.java new file mode 100644 index 0000000..f0bb4ba --- /dev/null +++ b/src/net/sector/input/EInput.java @@ -0,0 +1,80 @@ +package net.sector.input; + + +import org.newdawn.slick.util.Log; + + +/** + * Enum of event types for trigger. + * + * @author MightyPork + */ +public enum EInput { + /** Keyboard key pressed */ + KEY_PRESS, + /** Keyboard key held down */ + KEY_DOWN, + /** Keyboard key not pressed */ + KEY_UP, + /** Keyboard key released */ + KEY_RELEASE, + /** Wheel scrolled */ + SCROLL, + /** Mouse button pressed */ + BTN_PRESS, + /** Mouse button held down */ + BTN_DOWN, + /** Mouse button not pressed */ + BTN_UP, + /** Mouse button released */ + BTN_RELEASE; + + /** + * Get state / change variant + * + * @param beStatic is long-lasting state (key held down) + * @return the modified variant. + */ + public EInput variant(boolean beStatic) { + if (beStatic) { + switch (this) { + case BTN_PRESS: + case BTN_DOWN: + return BTN_DOWN; + case BTN_UP: + case BTN_RELEASE: + return BTN_UP; + case SCROLL: + return SCROLL; + case KEY_PRESS: + case KEY_DOWN: + return KEY_DOWN; + case KEY_UP: + case KEY_RELEASE: + return KEY_UP; + } + } else { + switch (this) { + case BTN_PRESS: + case BTN_DOWN: + return BTN_PRESS; + case BTN_UP: + case BTN_RELEASE: + return BTN_RELEASE; + case SCROLL: + return SCROLL; + case KEY_PRESS: + case KEY_DOWN: + return KEY_PRESS; + case KEY_UP: + case KEY_RELEASE: + return KEY_RELEASE; + } + } + + Log.warn("Invalid EInput constant in EInput.variant: " + this); + + return this; + + } +} diff --git a/src/net/sector/input/Function.java b/src/net/sector/input/Function.java new file mode 100644 index 0000000..938144d --- /dev/null +++ b/src/net/sector/input/Function.java @@ -0,0 +1,18 @@ +package net.sector.input; + + +/** + * Function object with return type + * + * @author MightyPork + * @param return type + */ +public interface Function { + /** + * Execute this routine + * + * @param args optional arguments (not optional for implementations) + * @return returned value + */ + public T run(Object... args); +} diff --git a/src/net/sector/input/IInputHandler.java b/src/net/sector/input/IInputHandler.java new file mode 100644 index 0000000..b7a69d8 --- /dev/null +++ b/src/net/sector/input/IInputHandler.java @@ -0,0 +1,50 @@ +package net.sector.input; + + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Input event handler + * + * @author MightyPork + */ +public interface IInputHandler { + /** + * Called each update tick, if the mouse position was changed. + * + * @param pos mouse position + * @param move mouse motion + * @param wheelDelta mouse wheel delta + */ + public void onMouseMove(Coord pos, Vec move, int wheelDelta); + + /** + * Mouse event handler. + * + * @param button button which caused this event + * @param down true = down, false = up + * @param wheelDelta number of steps the wheel turned since last event + * @param pos mouse position + * @param deltaPos delta mouse position + */ + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos); + + + /** + * Key event handler. + * + * @param key key index, constant Keyboard.KEY_??? + * @param c character typed, if any + * @param down true = down, false = up + */ + public void onKey(int key, char c, boolean down); + + + /** + * In this method screen can handle static inputs, that is: + * Keyboard.isKeyDown, Mouse.isButtonDown etc. + */ + public void handleStaticInputs(); +} diff --git a/src/net/sector/input/InputTrigger.java b/src/net/sector/input/InputTrigger.java new file mode 100644 index 0000000..7d25626 --- /dev/null +++ b/src/net/sector/input/InputTrigger.java @@ -0,0 +1,158 @@ +package net.sector.input; + + +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; + + +/** + * Thing for testing input states and events. + * + * @author MightyPork + */ +public class InputTrigger { + /** Trigger event */ + public EInput type = EInput.BTN_PRESS; + /** mark that this trigger is static */ + public boolean isStatic = false; + //KEY_DOWN, KEY_HOLD, KEY_UP, SCROLL, MOVE, BTN_DOWN, BTN_UP, BTN_HOLD; + private int keyIndex = -1; + private int scrollDir = -2; + private int buttonIndex = -1; + private int attrib_raw = -1; + + /** + * Pack to bundle + * + * @return bundle + */ + public TriggerBundle toBundle() { + return new TriggerBundle(type, attrib_raw); + } + + /** + * Create trigger from bundle + * + * @param bundle bundle + */ + public InputTrigger(TriggerBundle bundle) { + this(bundle.event, bundle.attrib); + } + + + /** + * Set trigger attribute + * + * @param attrib attribute number (Key→index, Mouse→button, + * Scroll→direction) + */ + public void setAttrib(int attrib) { + attrib_raw = attrib; + switch (type) { + case BTN_PRESS: + case BTN_DOWN: + case BTN_UP: + case BTN_RELEASE: + buttonIndex = attrib; + break; + + case KEY_PRESS: + case KEY_DOWN: + case KEY_UP: + case KEY_RELEASE: + keyIndex = attrib; + break; + + case SCROLL: + scrollDir = attrib; + break; + } + + if (type == EInput.BTN_DOWN || type == EInput.KEY_DOWN || type == EInput.BTN_UP || type == EInput.KEY_UP) isStatic = true; + } + + /** + * New trigger - event tester + * + * @param type event type + * @param attrib (Key→index, Mouse→button, Scroll→direction) + */ + public InputTrigger(EInput type, int attrib) { + this.type = type; + setAttrib(attrib); + } + + /** + * Try to trigger by mouse event. + * + * @param button button which caused this event + * @param down true = down, false = up + * @param wheelDelta number of steps the wheel turned since last event + * @param pos mouse position + * @param deltaPos delta mouse position + * @return was triggered + */ + public boolean onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + if (type == EInput.BTN_PRESS) { + return down && buttonIndex == button; + } + + if (type == EInput.BTN_RELEASE) { + return !down && buttonIndex == button; + } + + if (type == EInput.SCROLL) { + return Calc.sgn(wheelDelta) == Calc.sgn(scrollDir); + } + return false; + } + + /** + * Try to trigger by keyboard event. + * + * @param key key index, constant Keyboard.KEY_??? + * @param c character typed, if any + * @param down true = down, false = up + * @return was triggered + */ + public boolean onKey(int key, char c, boolean down) { + if (type == EInput.KEY_PRESS) { + return down && keyIndex == key; + } + + if (type == EInput.KEY_RELEASE) { + return !down && keyIndex == key; + } + return false; + } + + /** + * Try to trigger by static inputs (held key/button) + * + * @return was triggered + */ + public boolean handleStaticInputs() { + if (type == EInput.BTN_DOWN) { + return Mouse.isButtonDown(buttonIndex); + } + + if (type == EInput.KEY_DOWN) { + return Keyboard.isKeyDown(keyIndex); + } + + if (type == EInput.BTN_UP) { + return !Mouse.isButtonDown(buttonIndex); + } + + if (type == EInput.KEY_UP) { + return !Keyboard.isKeyDown(keyIndex); + } + + return false; + } + + +} diff --git a/src/net/sector/input/InputTriggerGroup.java b/src/net/sector/input/InputTriggerGroup.java new file mode 100644 index 0000000..6e2f7d8 --- /dev/null +++ b/src/net/sector/input/InputTriggerGroup.java @@ -0,0 +1,117 @@ +package net.sector.input; + + +import java.util.HashSet; +import java.util.Set; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Group of input triggers, able to detect multiple events separately. + * + * @author MightyPork + */ +public class InputTriggerGroup implements IInputHandler { + + + /** triggered actions */ + public Set triggers = new HashSet(); + + /** + * Add new triggered action + * + * @param action the action + * @return the action trigger added + */ + public InputTriggeredAction addTrigger(InputTriggeredAction action) { + InputTriggeredAction a; + triggers.add(a = action); + return a; + } + + /** + * Add new triggered action + * + * @param triggers action trigger(s) + * @param func action + * @return the action trigger added + */ + public InputTriggeredAction addTrigger(Routine func, InputTrigger... triggers) { + InputTriggeredAction a; + this.triggers.add(a = new InputTriggeredAction(func, triggers)); + return a; + } + + /** + * Add new triggered action + * + * @param event event detected + * @param attrib event attribute + * @param func action + * @return the action trigger added + */ + public InputTriggeredAction addTrigger(Routine func, EInput event, int attrib) { + InputTriggeredAction a; + triggers.add(a = new InputTriggeredAction(func, event, attrib)); + return a; + } + + /** + * Add new triggered action + * + * @param func action + * @param event1 1st event type + * @param attrib1 1st event attriv + * @param event2 2nd event type + * @param attrib2 2nd type attrib + * @return the action trigger added + */ + public InputTriggeredAction addTrigger(Routine func, EInput event1, int attrib1, EInput event2, int attrib2) { + InputTriggeredAction a; + triggers.add(a = new InputTriggeredAction(func, new InputTrigger(event1, attrib1), new InputTrigger(event2, attrib2))); + return a; + } + + /** + * Remove trigger action (eg. to rebuild it) + * + * @param action the action. + */ + public void removeTrigger(InputTriggeredAction action) { + if (action == null) return; + triggers.remove(action); + } + + /** + * Remove all action triggers + */ + public void clearTriggers() { + triggers.clear(); + } + + @Override + public void onKey(int key, char c, boolean down) { + for (InputTriggeredAction action : triggers) { + action.onKey(key, c, down); + } + } + + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + for (InputTriggeredAction action : triggers) { + action.onMouseButton(button, down, wheelDelta, pos, deltaPos); + } + } + + @Override + public void onMouseMove(Coord pos, Vec move, int wheelDelta) {} + + @Override + public void handleStaticInputs() { + for (InputTriggeredAction action : triggers) { + action.handleStaticInputs(); + } + } +} diff --git a/src/net/sector/input/InputTriggeredAction.java b/src/net/sector/input/InputTriggeredAction.java new file mode 100644 index 0000000..056f84f --- /dev/null +++ b/src/net/sector/input/InputTriggeredAction.java @@ -0,0 +1,123 @@ +package net.sector.input; + + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Function executor triggered by input event. + * + * @author MightyPork + */ +public class InputTriggeredAction implements IInputHandler { + + /** Trigger used to detect the event */ + private InputTrigger[] triggers = null; + /** Function called when triggered */ + private Routine function = null; + + /** + * Function controller triggered by input event. + * + * @param event event detected + * @param attrib event attribute + * @param func function to run + */ + public InputTriggeredAction(Routine func, EInput event, int attrib) { + triggers = new InputTrigger[] { new InputTrigger(event, attrib) }; + function = func; + } + + /** + * Function controller triggered by input event. + * + * @param func function to run + * @param triggers triggers (AND) + */ + public InputTriggeredAction(Routine func, InputTrigger... triggers) { + this.triggers = triggers; + function = func; + } + + /** + * Replace function. + * + * @param func new function + */ + public void replaceFunction(Routine func) { + this.function = null; + this.function = func; + } + + /** + * Replace trigger(s) + * + * @param triggers the triggers + */ + public void setTriggers(InputTrigger... triggers) { + this.triggers = null; + this.triggers = triggers; + } + + /** + * Replace trigger + * + * @param event event detected + * @param attrib event attribute + */ + public void setTrigger(EInput event, int attrib) { + this.triggers = null; + triggers = new InputTrigger[] { new InputTrigger(event, attrib) }; + } + + @Override + public void onMouseMove(Coord pos, Vec move, int wheelDelta) { + // NO-OP + } + + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + for (InputTrigger t : triggers) { + if (t.isStatic) { + if (!t.handleStaticInputs()) return; + } else { + if (!t.onMouseButton(button, down, wheelDelta, pos, deltaPos)) return; + + } + } + + function.run(); + } + + @Override + public void onKey(int key, char c, boolean down) { + for (InputTrigger t : triggers) { + if (t.isStatic) { + if (!t.handleStaticInputs()) return; + } else { + if (!t.onKey(key, c, down)) return; + } + } + + function.run(); + } + + @Override + public void handleStaticInputs() { + for (InputTrigger t : triggers) { + if (!t.handleStaticInputs()) return; + } + + function.run(); + } + + /** + * Get all triggers + * + * @return triggers + */ + public InputTrigger[] getTriggers() { + return triggers; + } +} diff --git a/src/net/sector/input/Keys.java b/src/net/sector/input/Keys.java new file mode 100644 index 0000000..83351f8 --- /dev/null +++ b/src/net/sector/input/Keys.java @@ -0,0 +1,87 @@ +package net.sector.input; + + +import java.util.Arrays; + +import org.lwjgl.input.Keyboard; + + +/** + * Key state handler + */ +public class Keys { + private static boolean[] prevKeys; + private static boolean[] keys; + + /** + * initialize key state handler + */ + public static void init() { + keys = new boolean[Keyboard.KEYBOARD_SIZE]; + Arrays.fill(keys, false); + prevKeys = new boolean[Keyboard.KEYBOARD_SIZE]; + Arrays.fill(prevKeys, false); + } + + /** + * method called when key event was detected in Screen class. + * + * @param key + * @param down + */ + public static void onKey(int key, boolean down) { + prevKeys[key] = keys[key]; + keys[key] = down; + } + + /** + * Check if key is down + * + * @param key key index + * @return is down + */ + public static boolean isDown(int key) { + return keys[key]; + } + + /** + * Check if key is up + * + * @param key key index + * @return is up + */ + public static boolean isUp(int key) { + return !keys[key]; + } + + /** + * Check if key was just pressed (changed state since last event on this + * key) + * + * @param key key index + * @return true if changed state to DOWN + */ + public static boolean justPressed(int key) { + return !prevKeys[key] && keys[key]; + } + + /** + * Check if key was just released (changed state since last event on this + * key) + * + * @param key key index + * @return true if changed state to UP + */ + public static boolean justReleased(int key) { + return prevKeys[key] && !keys[key]; + } + + /** + * Destroy "just" flag for a key. + * + * @param key key index + */ + public static void destroyChangeState(int key) { + prevKeys[key] = keys[key]; + } +} diff --git a/src/net/sector/input/Routine.java b/src/net/sector/input/Routine.java new file mode 100644 index 0000000..2b3e685 --- /dev/null +++ b/src/net/sector/input/Routine.java @@ -0,0 +1,14 @@ +package net.sector.input; + + +/** + * Stand-alone routine + * + * @author MightyPork + */ +public interface Routine { + /** + * Execute this routine + */ + public void run(); +} diff --git a/src/net/sector/input/TriggerBundle.java b/src/net/sector/input/TriggerBundle.java new file mode 100644 index 0000000..5d3143c --- /dev/null +++ b/src/net/sector/input/TriggerBundle.java @@ -0,0 +1,155 @@ +package net.sector.input; + + +import net.sector.level.dataobj.AiObjParser; + +import org.lwjgl.input.Keyboard; + + +/** + * Bundle representing input configuration for triggers. + * + * @author MightyPork + */ +public class TriggerBundle { + /** Detected event */ + public EInput event; + /** Event attribute */ + public int attrib; + + /** + * Create trigger bundle + * + * @param event event + * @param attrib event attribute + */ + public TriggerBundle(EInput event, int attrib) { + this.event = event; + this.attrib = attrib; + } + + /** + * Create trigger bundle + * + * @param other other bundle + */ + public TriggerBundle(TriggerBundle other) { + this.event = other.event; + this.attrib = other.attrib; + } + + public TriggerBundle() {} + + /** + * Get copy + * + * @return copy + */ + public TriggerBundle copy() { + return new TriggerBundle(this); + } + + /** + * Make the event static / dynamic + * + * @param beStatic is static [TRUE] (hold) or dynamic (press) + */ + public void setStatic(boolean beStatic) { + event = event.variant(beStatic); + } + + /** + * Get human readable variant of trigger bundle. + * + * @param longFmt long style (short: X, Left mouse, long: Press X, Left + * mouse down) + * @return human readable format + */ + public String getLabel(boolean longFmt) { + String evt = null, name = null; + switch (event) { + case BTN_PRESS: + evt = "down"; + //$FALL-THROUGH$ + case BTN_DOWN: + if (evt == null) evt = "hold"; + //$FALL-THROUGH$ + case BTN_UP: + if (evt == null) evt = "unhold"; + //$FALL-THROUGH$ + case BTN_RELEASE: + if (evt == null) evt = "up"; + + // mouse. + if (attrib == 0) name = "Left mouse"; + if (attrib == 1) name = "Right mouse"; + if (attrib == 2) name = "Middle mouse"; + if (attrib > 2) name = "Mouse " + attrib; + + if (longFmt) name += " " + evt; + return name; + + case KEY_PRESS: + evt = "Press"; + //$FALL-THROUGH$ + case KEY_DOWN: + if (evt == null) evt = "Hold"; + //$FALL-THROUGH$ + case KEY_UP: + if (evt == null) evt = "Unhold"; + //$FALL-THROUGH$ + case KEY_RELEASE: + if (evt == null) evt = "Release"; + + name = Keyboard.getKeyName(attrib); + if (longFmt) name = evt + " " + name; + return name; + + case SCROLL: + return "Wheel " + (attrib < 0 ? "in" : "out"); + } + + return "???"; + } + + /** + * Convert to actual trigger + * + * @return trigger + */ + public InputTrigger toTrigger() { + return new InputTrigger(this); + } + + @Override + public String toString() { + return event + ":" + attrib; + } + + /** + * Load from string representation + * + * @param string string variant EVENT:ATTRIB + * @return this + */ + public TriggerBundle fromString(String string) { + if (string == null) return null; + String[] pts = string.split("[:]"); + event = EInput.valueOf(pts[0]); + attrib = AiObjParser.getInteger(pts[1]); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (!(obj instanceof TriggerBundle)) return false; + + return ((TriggerBundle) obj).event == event && ((TriggerBundle) obj).attrib == attrib; + } + + @Override + public int hashCode() { + return event.hashCode() ^ attrib; + } +} diff --git a/src/net/sector/level/EBuildingMode.java b/src/net/sector/level/EBuildingMode.java new file mode 100644 index 0000000..563184e --- /dev/null +++ b/src/net/sector/level/EBuildingMode.java @@ -0,0 +1,6 @@ +package net.sector.level; + + +public enum EBuildingMode { + LOCKED, NORMAL, FREE; +} diff --git a/src/net/sector/level/ELevel.java b/src/net/sector/level/ELevel.java new file mode 100644 index 0000000..6133d5e --- /dev/null +++ b/src/net/sector/level/ELevel.java @@ -0,0 +1,6 @@ +package net.sector.level; + + +public enum ELevel { + NET, LOCAL, INTERNAL; +} diff --git a/src/net/sector/level/GameContext.java b/src/net/sector/level/GameContext.java new file mode 100644 index 0000000..34a43e6 --- /dev/null +++ b/src/net/sector/level/GameContext.java @@ -0,0 +1,138 @@ +package net.sector.level; + + +import net.sector.level.sequence.LevelController; +import net.sector.network.levels.NetLevelContainer; + + +/** + * Game context + * + * @author MightyPork + */ +public class GameContext { + + /** current level */ + private LevelController currentLevel; + + /** Current game cursor */ + public GameCursor cursor; + + /** Saved cursor (when last left designer) */ + private GameCursor savedCursor; + + /** Net level container */ + public NetLevelContainer netLevelContainer = null; + + /** game type */ + public ELevel levelType = null; + + /** current level bundle (to get information about the level) */ + public LevelBundle levelBundle; + + /** + * Create new game context. + */ + public GameContext() {} + +// +// public File getHighscoreFile() { +// return levelBundle.getHighscoreFile(); +// } + + /** + * Save ship state after entering or leaving ship editor. Game can then be + * saved to disk and nothing will get lost. + */ + public void saveCursor() { + savedCursor = cursor.copy(); + } + + /** + * Save cursor for next level start in bundle + in saved slot. + */ + public void saveCursorInBundle() { + saveCursor(); + levelBundle.saveCursorToBundle(cursor.copy()); + } + + /** + * Save ship to file + */ + public void saveShipToFile() { + levelBundle.saveShipToFile(cursor.shipBundle); + } + + /** + * restore from saved state. + */ + public void restoreCursor() { + if (savedCursor == null) return; + cursor = savedCursor.copy(); + } + + /** + * Get last saved ship state. + * + * @return last ship bundle + */ + public GameCursor getSavedCursor() { + return savedCursor; + } + + /** + * Get current level controller + * + * @return level + */ + public LevelController getLevelController() { + return currentLevel; + } + + /** + * Get current cursor + * + * @return cursor + */ + public GameCursor getCursor() { + return cursor; + } + + /** + * Set cursor + * + * @param cursor cursor to set + */ + public void setCursor(GameCursor cursor) { + this.cursor = cursor; + cursor.setContext(this); + } + + /** + * Set level controller. + * + * @param level + */ + public void setLevelController(LevelController level) { + this.currentLevel = level; + } + + /** + * Set level type. + * + * @param elevel level type enum + */ + public void setLevelType(ELevel elevel) { + this.levelType = elevel; + } + + /** + * Set level bundle, containing information about level + * + * @param levelBundle level bundle to set + */ + public void setLevelBundle(LevelBundle levelBundle) { + this.levelBundle = levelBundle; + } + +} diff --git a/src/net/sector/level/GameCursor.java b/src/net/sector/level/GameCursor.java new file mode 100644 index 0000000..acf2033 --- /dev/null +++ b/src/net/sector/level/GameCursor.java @@ -0,0 +1,119 @@ +package net.sector.level; + + +import net.sector.level.sequence.LevelController; +import net.sector.level.ship.DiscoveryTable; +import net.sector.level.ship.ShipBundle; + + +/** + * This is a game cursor, something that indicates where in the level the player + * is, what ship he has, what's his current money and score, discoveries and + * other stuff.
+ * Current level and set of levels is handled by the GameContext. + * + * @author MightyPork + */ +public class GameCursor { + + /** Parent game context */ + public GameContext context = null; + + /** Current player ship bundle (before starting current level) */ + public ShipBundle shipBundle; + + /** Total score collected (for high-score table) */ + public int scoreTotal = 0; + + /** Money = score collected that can be used in designer to buy stuff */ + public int money = 0; + + /** Newly collected artifacts, to be spent in the discovery table */ + public int newArtifacts = 0; + + /** Discovery table */ + public DiscoveryTable discoveryTable; + + /** Designer building mode */ + public EBuildingMode buildMode = EBuildingMode.NORMAL; + + + /** + * Make a cursor. + * + * @param ctx game context + */ + public GameCursor(GameContext ctx) { + context = ctx; + } + + /** + * Make a cursor - with null context + */ + public GameCursor() {} + + /** + * Create cursor as copy of other cursor + * + * @param other + */ + public GameCursor(GameCursor other) { + shipBundle = other.shipBundle.copy(); + scoreTotal = other.scoreTotal; + money = other.money; + discoveryTable = other.discoveryTable.copy(); + context = other.context; + newArtifacts = other.newArtifacts; + buildMode = other.buildMode; + } + + /** + * Get current level controller + * + * @return the level controller + */ + public LevelController getLevel() { + if (context == null) return null; + return context.getLevelController(); + } + + /** + * Get deep copy + * + * @return copy + */ + public GameCursor copy() { + return new GameCursor(this); + } + + /** + * Add artifact(s) + * + * @param artifacts number of artifacts + */ + public void addArtifact(int artifacts) { + newArtifacts += artifacts; + } + + /** + * Add player score + * + * @param points score points + */ + public void addScore(int points) { + money += points; + scoreTotal += points; + } + + /** + * Set game context + * + * @param ctx game context + * @return this + */ + public GameCursor setContext(GameContext ctx) { + this.context = ctx; + return this; + } + +} diff --git a/src/net/sector/level/LevelBundle.java b/src/net/sector/level/LevelBundle.java new file mode 100644 index 0000000..24a4b06 --- /dev/null +++ b/src/net/sector/level/LevelBundle.java @@ -0,0 +1,393 @@ +package net.sector.level; + + +import java.io.File; +import java.io.FileOutputStream; +import java.util.Map.Entry; + +import net.sector.Constants; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.DriverStore; +import net.sector.level.highscore.HighscoreTable; +import net.sector.level.sequence.LevelController; +import net.sector.level.ship.DiscoveryRegistry; +import net.sector.level.ship.DiscoveryTable; +import net.sector.level.ship.ShipBundle; +import net.sector.network.levels.NetLevelContainer; +import net.sector.util.Log; +import net.sector.util.Utils; + +import org.jdom2.Element; + +import com.porcupine.ion.Ion; +import com.porcupine.util.StringUtils; + + +/** + * Level bundle + * + * @author MightyPork + */ +public class LevelBundle implements Comparable { + + private ShipBundle ship = null; + private DiscoveryTable discoveries = DiscoveryRegistry.getDiscoveryTableMaximal(); + private LevelController level = null; + private DriverStore drivers = new DriverStore(SuperContext.basicDrivers); + + private int money = 0; + + private int timer = -1; + + private EBuildingMode buildMode = EBuildingMode.NORMAL; + + /** Level title */ + public String title = ""; + /** Level subtitle */ + public String subtitle = ""; + /** Minimal game version to play this level */ + public int minVersion = 0; + + + /** If this level had default ship when loaded */ + public boolean hadDefaultShip = false; + + /** Level author */ + public String author = ""; + + /** [ELevel] LID (if type == NET) */ + public String lid = ""; + + /** [ELevel] Highscore filename */ + public String rawFilename = ""; + + /** Level type */ + public ELevel type = null; + + private GameCursor compiledCursor = null; + private GameCursor lastCursor = null; + + + /** + * Construct LevelBundle from a NetLevelContainer + * + * @param nlc net level container + */ + public LevelBundle(NetLevelContainer nlc) { + this(nlc.lid, nlc.levelRootNode, ELevel.NET); + this.lid = nlc.lid; + } + + /** + * Create from filename, xml root node and level type. + * + * @param filename filename + * @param rootNode root node + * @param type levle type + */ + public LevelBundle(String filename, Element rootNode, ELevel type) { + + this.type = type; + + + if (filename.contains("/")) { + String[] parts = filename.split("[/]"); + filename = parts[parts.length - 1]; + } + + filename = filename.split("[.]")[0]; + + rawFilename = filename; + + loadFromXml(rootNode); + + } + + private void loadFromXml(Element root) { + + Element info = root.getChild("info"); + if (info == null) { + Log.w("Missing tag in net level."); + } else { + String strTitle = info.getChildText("title"); + if (strTitle != null) this.title = strTitle; + + String strAuthor = info.getChildText("author"); + if (strAuthor != null) this.author = strAuthor; + + String strSubTitle = info.getChildText("subtitle"); + if (strSubTitle != null) this.subtitle = strSubTitle; + + String strVersion; + + strVersion = info.getChildText("minv"); + if (strVersion != null) this.minVersion = AiObjParser.getInteger(strVersion, 0); + } + + // load ship from + Element shipNode = root.getChild("ship"); + if (shipNode != null) { + hadDefaultShip = true; + this.ship = new ShipBundle(); + this.ship.xmlFromElement(shipNode); + } else { + this.ship = new ShipBundle(); + this.ship.shieldLevel = DiscoveryRegistry.getDiscoveryLevelMin("shield"); + this.ship.energyLevel = DiscoveryRegistry.getDiscoveryLevelMin("energy"); + } + + // load drivers from + Element driversNode = root.getChild("drivers"); + if (driversNode != null) { + this.drivers.loadDriversFromNodeList(driversNode); + } + + // parse node + Element configNode = root.getChild("config"); + if (configNode != null) { + this.money = AiObjParser.getInteger(configNode.getChildText("money"), 0); + this.timer = AiObjParser.getInteger(configNode.getChildText("timer"), -1); + if (timer == -1) this.timer = AiObjParser.getInteger(configNode.getChildText("limit"), -1); + + String bmode = configNode.getChildText("building"); + if (bmode != null) { + bmode = bmode.toUpperCase(); + try { + this.buildMode = EBuildingMode.valueOf(bmode); + } catch (Exception e) { + e.printStackTrace(); + } + } + + } else { + Log.w("Missing required node in level " + title); + } + + // parse + Element discoveriesNode = root.getChild("discoveries"); + if (discoveriesNode != null) { + for (Element node : discoveriesNode.getChildren()) { + if (node.getName().equals("all")) { + + String l = node.getAttributeValue("level"); + + if (StringUtils.isInArray(l, false, "min", "empty", "none", "zero", "0")) { + + discoveries = DiscoveryRegistry.getDiscoveryTableMinimal(); + + } else if (StringUtils.isInArray(l, false, "max", "full")) { + + discoveries = DiscoveryRegistry.getDiscoveryTableMaximal(); + + } else if (l.matches("[0-9]+")) { + discoveries = DiscoveryRegistry.getDiscoveryTableMinimal(); + for (Entry e : discoveries.entrySet()) { + discoveries.setDiscoveryLevel(e.getKey(), Integer.valueOf(l)); + } + } + + } else { + + String name = node.getAttributeValue("name"); + String l = node.getAttributeValue("level"); + + if (StringUtils.isInArray(l, false, "min", "empty", "none", "zero", "0")) { + + discoveries.setDiscoveryLevel(name, DiscoveryRegistry.getDiscoveryLevelMin(name)); + + } else if (StringUtils.isInArray(l, false, "max", "full")) { + + discoveries.setDiscoveryLevel(name, DiscoveryRegistry.getDiscoveryLevelMax(name)); + + } else if (l.matches("[0-9]+")) { + discoveries.setDiscoveryLevel(name, AiObjParser.getInteger(name, 0)); + + } else { + Log.w("Illegal discovery level: " + l); + } + } + } + } + + Element sequenceElement = root.getChild("sequence"); + if (sequenceElement != null) { + this.level = new LevelController(sequenceElement); + } else { + Log.e("[!!!] Missing required tag in level " + title); + } + + // set timer in level controller + if (this.timer > 0) this.level.setInitialTimer(this.timer); + + // assign driver store to the level controller + this.level.setDriverStore(drivers); + +// System.out.println("Loaded level: "+title); +// System.out.println("DT:\n"+discoveries+"\n"); + +// if (buildMode != EBuildingMode.LOCKED && !hadDefaultShip) { +// File file = getLastShipFile(); +// if(file.exists()) { +// try { +// ship.xmlFromStream(new FileInputStream(file)); +// } catch (Exception e) { +// Log.exc("Error loading last ship.", e); +// } +// } +// } + + // reduce ship for discoveries and discovery table. + if (buildMode == EBuildingMode.NORMAL) { + ship.reduceForDiscoveryTable(discoveries); + ship.reduceForTotalCost(money); + money -= ship.getTotalCost(); + } + + compileToCursor(); + } + + /** + * Compile to a cursor. + */ + public void compileToCursor() { + Log.f2("Compiling level " + title + " to game cursor."); + this.compiledCursor = new GameCursor(); + this.compiledCursor.discoveryTable = this.discoveries; + this.compiledCursor.money = this.money; + this.compiledCursor.buildMode = buildMode; + this.compiledCursor.shipBundle = ship.copy(); + } + + /** + * Get game cursor for game context + * + * @return the new copy of cursor + */ + public GameContext toGameContext() { + GameContext gc = new GameContext(); + + if (lastCursor == null) { + gc.setCursor(compiledCursor.copy()); + } else { + gc.setCursor(lastCursor.copy()); + } + + gc.setLevelController(this.level); + gc.getLevelController().reset(); + gc.setLevelType(type); + gc.setLevelBundle(this); + gc.saveCursor(); + return gc; + } + + /** + * Get if this level can be played on current game version. + * + * @return if level is compatible. + */ + public boolean isCompatible() { + return Constants.VERSION_NUMBER >= minVersion; + } + + + @Override + public int compareTo(LevelBundle o) { + return title.compareToIgnoreCase(o.title); + } + + /** + * Save cursor (when leaving designer) + * + * @param saved cursor to copy and save + */ + public void saveCursorToBundle(GameCursor saved) { + this.lastCursor = saved.copy(); + } + + /** + * Save ship to file (shown as option in load ship dialog) + * + * @param ship + */ + public void saveShipToFile(ShipBundle ship) { + File file = getLastShipFile(); + + try { + ship.xmlToStream(new FileOutputStream(file)); + } catch (Exception e) { + Log.e("Error saving ship file.", e); + } + } + + /** + * Get local highscore table.
+ * For NET levels, use LeaderboardClient to obtain entries in Global + * Leaderboard. + * + * @return highscore table. + */ + public HighscoreTable getHighscoreTable() { + + File file = getHighscoreFile(); + HighscoreTable table = null; + + table = (HighscoreTable) Ion.fromFile(file); + if (table == null) table = new HighscoreTable(); + + table.sort(); + return table; + } + + /** + * Get highscore file if applicable. + * + * @return hs file + */ + public File getLastShipFile() { + + String highscorePath = ""; + if (type == ELevel.INTERNAL) { + highscorePath = Constants.DIR_LASTSHIP_INTERNAL; + } else if (type == ELevel.LOCAL) { + highscorePath = Constants.DIR_LASTSHIP_LOCAL; + } else { + highscorePath = Constants.DIR_LASTSHIP_SHARED; + } + + File path = Utils.getGameSubfolder(highscorePath); + try { + path.mkdirs(); + } catch (Throwable t) { + t.printStackTrace(); + } + + return new File(path, rawFilename + "." + Constants.SUFFIX_SHIP); + + } + + /** + * Get highscore file if applicable. + * + * @return hs file + */ + public File getHighscoreFile() { + + String highscorePath = ""; + if (type == ELevel.INTERNAL) { + highscorePath = Constants.DIR_HIGHSCORE_INTERNAL; + } else if (type == ELevel.LOCAL) { + highscorePath = Constants.DIR_HIGHSCORE_LOCAL; + } else { + highscorePath = Constants.DIR_HIGHSCORE_SHARED; + } + + File path = Utils.getGameSubfolder(highscorePath); + try { + path.mkdirs(); + } catch (Throwable t) { + t.printStackTrace(); + } + + return new File(path, rawFilename + ".ion"); + } +} diff --git a/src/net/sector/level/LevelContainer.java b/src/net/sector/level/LevelContainer.java new file mode 100644 index 0000000..765013c --- /dev/null +++ b/src/net/sector/level/LevelContainer.java @@ -0,0 +1,33 @@ +package net.sector.level; + + +import net.sector.network.levels.NetLevelContainer; + +import org.jdom2.Element; + + +public class LevelContainer { + public ELevel type; + public String filename; + public Element rootNode; + public String lid = ""; + + public LevelContainer(NetLevelContainer nlc) { + this.lid = nlc.lid; + this.rootNode = nlc.levelRootNode; + this.filename = this.lid; + this.type = ELevel.NET; + } + + public LevelContainer(String filename, Element rootNode, ELevel type) { + this.filename = filename; + this.type = type; + this.rootNode = rootNode; + } + + public LevelBundle toBundle() { + LevelBundle lb = new LevelBundle(filename, rootNode, type); + if (type == ELevel.NET) lb.lid = lid; + return lb; + } +} diff --git a/src/net/sector/level/LevelRegistry.java b/src/net/sector/level/LevelRegistry.java new file mode 100644 index 0000000..10dddab --- /dev/null +++ b/src/net/sector/level/LevelRegistry.java @@ -0,0 +1,39 @@ +package net.sector.level; + + +import java.util.ArrayList; +import java.util.Collections; + +import net.sector.network.levels.NetLevelList; + + +public class LevelRegistry { + + /** Levels connected to Global Leaderboard IN POTENTIA */ + public static NetLevelList netLevels_inPotentia = new NetLevelList(); + /** Levels from resources, built-in IN POTENTIA */ + public static ArrayList internalLevels_inPotentia = new ArrayList(); + /** Levels from user's folder IN POTENTIA */ + public static ArrayList localLevels_inPotentia = new ArrayList(); + /** Levels connected to Global Leaderboard */ + public static ArrayList netLevels = new ArrayList(); + /** Levels from resources, built-in */ + public static ArrayList internalLevels = new ArrayList(); + /** Levels from user's folder */ + public static ArrayList localLevels = new ArrayList(); + + /** + * Get list with all level types. + * + * @return list of level bundles. + */ + public static ArrayList getAllLevels() { + ArrayList list = new ArrayList(); + list.addAll(localLevels); + list.addAll(internalLevels); + list.addAll(netLevels); + Collections.sort(list); + return list; + } + +} diff --git a/src/net/sector/level/SuperContext.java b/src/net/sector/level/SuperContext.java new file mode 100644 index 0000000..667ada6 --- /dev/null +++ b/src/net/sector/level/SuperContext.java @@ -0,0 +1,110 @@ +package net.sector.level; + + +import java.io.File; + +import net.sector.Constants; +import net.sector.level.drivers.DriverStore; +import net.sector.network.ProfileList; +import net.sector.network.UserProfile; +import net.sector.util.Log; +import net.sector.util.Utils; + +import com.porcupine.ion.Ion; + + +/** + * Super context (global) + * + * @author MightyPork + */ +public class SuperContext { + + // INFO ABOUT LATEST VERSION + + /** Flag that update alert was already shown */ + public static boolean updateAlertShown = false; + + /** Version name of the latest release */ + public static String latestVersionName = Constants.VERSION_NAME; + + /** Number of the latest release */ + public static int latestVersionNumber = Constants.VERSION_NUMBER; + + + + // USER PROFILE LIST + + /** User profiles, loaded from file on startup. */ + public static ProfileList userProfiles = new ProfileList(); + + /** Active user profile - null = anonymous/guest mode */ + public static UserProfile selectedUser = null; + + /** Currently active game */ + private static GameContext game = null; + + /** Default drivers */ + public static DriverStore basicDrivers = new DriverStore(); + + + + private static File getUserListFile() { + return Utils.getGameSubfolder(Constants.FILE_CONFIG); + } + + + /** + * Load user list from a file. + */ + public static void loadUserList() { + File file = getUserListFile(); + + boolean loaded = false; + if (file.exists()) { + try { + userProfiles = (ProfileList) Ion.fromFile(file); + loaded = true; + } catch (Exception e) { + Log.e("Error loading user profiles from " + file, e); + } + } + + if (!loaded) { + userProfiles = new ProfileList(); + selectedUser = null; // enter guest mode + } + } + + + /** + * Save user list to a file. + */ + public static void saveUserList() { + File file = getUserListFile(); + + try { + Ion.toFile(file, userProfiles); + } catch (Exception e) { + Log.e("Error saving user profiles to " + file, e); + } + + } + + /** + * Get game context + * + * @return game context + */ + public static GameContext getGameContext() { + if (game == null) { + Log.e("at getGameContext(): No game context exists yet!"); + } + return game; + } + + + public static void startGame(LevelBundle level) { + game = level.toGameContext(); + } +} diff --git a/src/net/sector/level/dataobj/AiCoord.java b/src/net/sector/level/dataobj/AiCoord.java new file mode 100644 index 0000000..9f6b510 --- /dev/null +++ b/src/net/sector/level/dataobj/AiCoord.java @@ -0,0 +1,180 @@ +package net.sector.level.dataobj; + + +import net.sector.entities.Entity; +import net.sector.level.drivers.INavigated; +import net.sector.util.Log; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; +import com.porcupine.coord.Vec; +import com.porcupine.math.PolarDeg; + + +/** + * Simple [X;Z] coordinate for AI + * + * @author MightyPork + */ +public class AiCoord { + /** Zero AI Coord */ + public static final AiCoord ZERO = new AiCoord(); + + /** X coordinate */ + private double x; + /** Z coordinate */ + private double z; + + /** Special type of this coord (runtime replacement) */ + private EAiCoordType specialType = EAiCoordType.BASIC; + + /** + * Create new zero AI coordinate + */ + public AiCoord() { + x = z = 0; + } + + /** + * Create AI Coord as copy of other + * + * @param other copied + */ + public AiCoord(AiCoord other) { + this.x = other.x; + this.z = other.z; + this.specialType = other.specialType; + } + + /** + * Create AI Coord from double Coord + * + * @param coord double coord with X,Z coordinates to use + */ + public AiCoord(Coord coord) { + this.x = coord.x; + this.z = coord.z; + this.specialType = EAiCoordType.BASIC; + } + + /** + * Create AI Coord from integer CoordI (x,y)->(x,z) + * + * @param coordi source CoordI + */ + public AiCoord(CoordI coordi) { + this.x = coordi.x; + this.z = coordi.y; + this.specialType = EAiCoordType.BASIC; + } + + /** + * Create AI Coord from numbers + * + * @param x x coordinate + * @param z z coordinate + * @param type special coord type + */ + public AiCoord(double x, double z, EAiCoordType type) { + this.x = x; + this.z = z; + this.specialType = type; + } + + /** + * Make copy + * + * @return the copy + */ + public AiCoord copy() { + return new AiCoord(this); + } + +// /** +// * Convert to CoordI +// * +// * @return CoordI representing this coord +// */ +// public CoordI toCoordI() { +// return new CoordI((int) Math.round(x), (int) Math.round(z)); +// } + + /** + * Convert to double Coord + * + * @param drone the controlled ship + * @return Coord representing this coord + */ + public Coord toCoord(INavigated drone) { + if (specialType == EAiCoordType.BASIC) return new Coord(x, 0, z); + if (drone == null) { + Log.w("Trying to use magic Coord \"" + specialType + "\" but no drone specified."); + return Coord.ZERO; + } + if (specialType == EAiCoordType.MOTION) return drone.getMotion(); + if (specialType == EAiCoordType.MOVE_DIR) return drone.getMotion(); + if (specialType == EAiCoordType.POS) return drone.getPos(); + + if (specialType == EAiCoordType.PLAYER_MOTION) { + return drone.getScene().getPlayerShip().getMotion(); + } + + if (specialType == EAiCoordType.PLAYER_POS) { + return drone.getScene().getPlayerShip().getPos(); + } + + if (specialType == EAiCoordType.PLAYER_DIR) { + return drone.getPos().vecTo(drone.getScene().getPlayerShip().getPos()); + } + + if (specialType == EAiCoordType.ROTATE_DIR) { + double deg = drone.getRotAngle().get(); + PolarDeg pl = new PolarDeg(deg, 1); + return pl.toCoordXZ(); + } + + if (specialType == EAiCoordType.LEADER_POS) { + Entity leader = drone.getFormationLeader(); + if (leader == null) return drone.getPos(); + return leader.getPos(); + } + + if (specialType == EAiCoordType.LEADER_DIR) { + Entity leader = drone.getFormationLeader(); + if (leader == null) return drone.getMotion(); + return leader.getMotion(); + } + + if (specialType == EAiCoordType.TARGET_POS) { + Entity tg = drone.getTargetEntity(); + if (tg == null) return drone.getPos(); + return tg.getPos(); + } + + if (specialType == EAiCoordType.TARGET_DIR) { + Entity tg = drone.getTargetEntity(); + if (tg == null) return drone.getMotion(); + return tg.getMotion(); + } + + Log.w("Invalid specialType in AiCoord"); + return Coord.ZERO; + } + + /** + * Convert to Vector + * + * @param drone drone + * @return vec + */ + public Vec toVec(INavigated drone) { + return new Vec(toCoord(drone)); + } + + @Override + public String toString() { + if (specialType == EAiCoordType.BASIC) return "AiCoord[" + x + ";" + z + "]"; + return specialType.toString(); + } + +} diff --git a/src/net/sector/level/dataobj/AiObjParser.java b/src/net/sector/level/dataobj/AiObjParser.java new file mode 100644 index 0000000..04e6d5d --- /dev/null +++ b/src/net/sector/level/dataobj/AiObjParser.java @@ -0,0 +1,329 @@ +package net.sector.level.dataobj; + + +import net.sector.util.Log; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; +import com.porcupine.math.Range; + + +/** + * Utility for converting Object to data types; Can also convert strings to data + * types. + * + * @author MightyPork + */ +public class AiObjParser { + + /** + * Get INTEGER + * + * @param o object + * @param def default value + * @return integer + */ + public static int getInteger(Object o, Integer def) { + try { + if (o == null) return def; + if (o instanceof String) return (int) Math.round(Double.parseDouble((String) o)); + if (o instanceof Number) return ((Number) o).intValue(); + if (o instanceof Range) return ((Range) o).randInt(); + if (o instanceof Boolean) return ((Boolean) o) ? 1 : 0; + } catch (NumberFormatException e) {} + Log.w("Object cast error - cannot cast " + o + " to Integer."); + return def; + } + + /** + * Get DOUBLE + * + * @param o object + * @param def default value + * @return double + */ + public static double getDouble(Object o, Double def) { + return getDoubleImpl(o, def); + } + + /** + * Get DOUBLE + * + * @param o object + * @param def default value + * @return double + */ + public static double getDouble(Object o, double def) { + return getDoubleImpl(o, def); + } + + private static double getDoubleImpl(Object o, Double def) { + try { + if (o == null) return def; + if (o instanceof String) return Double.parseDouble((String) o); + if (o instanceof Number) return ((Number) o).doubleValue(); + if (o instanceof Range) return ((Range) o).randDouble(); + if (o instanceof Boolean) return ((Boolean) o) ? 1 : 0; + } catch (NumberFormatException e) {} + Log.w("Object cast error - cannot cast " + o + " to Double."); + return def; + } + + /** + * Get FLOAT + * + * @param o object + * @param def default value + * @return float + */ + public static double getFloat(Object o, Float def) { + try { + if (o == null) return def; + if (o instanceof Number) return ((Number) o).floatValue(); + } catch (NumberFormatException e) {} + Log.w("Object cast error - cannot cast " + o + " to Float."); + return def; + } + + /** + * Get BOOLEAN + * + * @param o object + * @param def default value + * @return boolean + */ + public static boolean getBoolean(Object o, Boolean def) { + if (o == null) return def; + + if (o instanceof String) { + String s = ((String) o).trim().toLowerCase(); + if (s.equals("0")) return false; + if (s.equals("1")) return true; + try { + double n = Double.parseDouble(s); + return n != 0; + } catch (NumberFormatException e) {} + + if (s.equals("true")) return true; + if (s.equals("yes")) return true; + if (s.equals("enabled")) return true; + + if (s.equals("false")) return false; + if (s.equals("no")) return false; + if (s.equals("disabled")) return true; + } + + if (o instanceof Boolean) return ((Boolean) o).booleanValue(); + if (o instanceof Number) return ((Number) o).intValue() != 0; + Log.w("Object cast error - cannot cast " + o + " to Boolean."); + return def; + } + + /** + * Get STRING + * + * @param o object + * @param def default value + * @return String + */ + public static String getString(Object o, String def) { + if (o == null) return def; + if (o instanceof String) return ((String) o); +// Log.w("Object cast error - cannot cast " + o + " to String."); + return o.toString(); + } + + /** + * Get AI_COORD
+ * Converts special constants to magic coordinate instances. + * + * @param o object + * @param def default value + * @return AiCoord + */ + public static AiCoord getCoord(Object o, AiCoord def) { + try { + + if (o == null) return def; + if (o instanceof String) { + String s = ((String) o).trim().toUpperCase(); + try { + EAiCoordType type = EAiCoordType.valueOf(s); + return new AiCoord(0, 0, type); + } catch (IllegalArgumentException e) { + // colon to semicolon + s = s.replace(':', ';'); + // comma to semicolon + s = s.replace(',', ';'); + // remove brackets if any + s = s.replaceAll("[\\(\\[\\{\\)\\]\\}]", ""); + String[] parts = s.split("[;]"); + return new AiCoord(Double.parseDouble(parts[0].trim()), Double.parseDouble(parts[1].trim()), EAiCoordType.BASIC); + } + } + if (o instanceof AiCoord) return (AiCoord) o; + if (o instanceof Coord) return new AiCoord((Coord) o); + if (o instanceof CoordI) return new AiCoord((CoordI) o); + } catch (NumberFormatException e) {} + Log.w("Object cast error - cannot cast " + o + " to AiCoord."); + return def; //new AiCoord(0, 0, EAiCoordSpecialType.BASIC); + } + + + /** + * Get RANGE + * + * @param o object + * @param def default value + * @return AiCoord + */ + public static Range getRange(Object o, Range def) { + try { + if (o == null) return def; + if (o instanceof Number) return new Range(((Number) o).doubleValue(), ((Number) o).doubleValue()); + if (o instanceof String) { + String s = ((String) o).trim(); + + // colon to semicolon + s = s.replace(',', ':'); + // comma to dot. + s = s.replace(';', ':'); + // dash + s = s.replaceAll("([0-9])\\s?[\\-]", "$1:"); + // remove brackets if any + s = s.replaceAll("[\\(\\[\\{\\)\\]\\}]", ""); + String[] parts = s.split("[:]"); + if (parts.length == 2) return new Range(Double.parseDouble(parts[0].trim()), Double.parseDouble(parts[1].trim())); + return new Range(Double.parseDouble(parts[0].trim()), Double.parseDouble(parts[0].trim())); + + } + if (o instanceof Range) return (Range) o; + } catch (NumberFormatException e) {} + Log.w("Object cast error - cannot cast " + o + " to AiRange."); + return def; + } + + + /** + * Get INTEGER + * + * @param o object + * @return integer + */ + public static int getInteger(Object o) { + return getInteger(o, 0); + } + + /** + * Get DOUBLE + * + * @param o object + * @return double + */ + public static double getDouble(Object o) { + return getDouble(o, 0d); + } + + + /** + * Get FLOAT + * + * @param o object + * @return float + */ + public static double getFloat(Object o) { + return getFloat(o, 0f); + } + + /** + * Get BOOLEAN + * + * @param o object + * @return boolean + */ + public static boolean getBoolean(Object o) { + return getBoolean(o, false); + } + + /** + * Get STRING + * + * @param o object + * @return String + */ + public static String getString(Object o) { + return getString(o, ""); + } + + /** + * Get AI_COORD (if special string constant is present instead, build coord + * of it) + * + * @param o object + * @return AiCoord + */ + public static AiCoord getCoord(Object o) { + return getCoord(o, AiCoord.ZERO.copy()); + } + + + /** + * Get RANGE + * + * @param o object + * @return AiCoord + */ + public static Range getRange(Object o) { + return getRange(o, new Range()); + } + +// /** +// * Get if object is a NUMBER +// * +// * @param o object +// * @return is number +// */ +// public static boolean isNum(Object o) { +// return o instanceof Number; +// } +// +// /** +// * Get if object is a BOOLEAN +// * +// * @param o object +// * @return is boolean +// */ +// public static boolean isBool(Object o) { +// return o instanceof Boolean; +// } +// +// /** +// * Get if object is a STRING +// * +// * @param o object +// * @return is string +// */ +// public static boolean isString(Object o) { +// return o instanceof String; +// } +// +// /** +// * Get if object is a Coord (any) +// * +// * @param o object +// * @return is coord +// */ +// public static boolean isCoord(Object o) { +// return o instanceof Coord || o instanceof AiCoord || o instanceof CoordI; +// } +// +// /** +// * Get if object is a AiRange +// * +// * @param o object +// * @return is range +// */ +// public static boolean isRange(Object o) { +// return o instanceof AiRange; +// } +} diff --git a/src/net/sector/level/dataobj/EAiCoordType.java b/src/net/sector/level/dataobj/EAiCoordType.java new file mode 100644 index 0000000..7affb6e --- /dev/null +++ b/src/net/sector/level/dataobj/EAiCoordType.java @@ -0,0 +1,37 @@ +package net.sector.level.dataobj; + + +/** + * Special AI Coord types + * + * @author MightyPork + */ +public enum EAiCoordType { + /** Real coordinates */ + BASIC, + /** Return player position */ + PLAYER_POS, + /** Return player position */ + PLAYER_MOTION, + /** Return drone motion */ + MOTION, + /** alias for MOTION */ + MOVE_DIR, + /** Return vector to player ship */ + PLAYER_DIR, + /** Direction where the ship is turned to */ + ROTATE_DIR, + /** Return drone position */ + POS, + /** + * leader entity of a swarm formation (in case of snake the previous + * article) + */ + LEADER_POS, + /** leader's motion vector */ + LEADER_DIR, + /** Position of the target entity (if any) */ + TARGET_POS, + /** Direction to the target entity (if any) */ + TARGET_DIR +} diff --git a/src/net/sector/level/drivers/AiTask.java b/src/net/sector/level/drivers/AiTask.java new file mode 100644 index 0000000..cfb8785 --- /dev/null +++ b/src/net/sector/level/drivers/AiTask.java @@ -0,0 +1,118 @@ +package net.sector.level.drivers; + + +import java.util.HashMap; +import java.util.Map; + +import net.sector.util.Log; + + +/** + * AI task entry + * + * @author MightyPork + */ +public class AiTask { + /** Task functor name */ + public String fn = "none"; + /** Task functor arguments */ + public Map args = new HashMap(3); + /** memory for task functor */ + public Map memory = new HashMap(1); + + /** Task type (TASK or TEST) */ + public EAiTaskType type = EAiTaskType.TASK; + + /** Type argument value (argument name is "for" for CHECK, "if" for TASK) */ + public String typeArg = ""; + + /** Task ID in driver */ + public String id = ""; + + /** + * AiTask implicit constructor + */ + public AiTask() {} + + /** + * Extend this task with other task - replace what's to replace, and change + * + * @param extension + */ + public void extendWith(AiTask extension) { + + if (extension.type != type) { + Log.w("Error in AiTask: Trying to extend '" + type + "' with '" + extension.type + "'. Aborting extension."); + return; + } + + fn = extension.fn; // the function name + args = extension.args; // arguments for task + if (extension.typeArg != null) typeArg = extension.typeArg; // if -or- for + + if (DriverStore.DEBUG) Log.f3("Task '" + id + "' extended -> " + this); + } + + /** + * AiTask as copy of another + * + * @param other other task to copy + */ + public AiTask(AiTask other) { + fn = other.fn; + args = other.args; + type = other.type; + typeArg = other.typeArg; + id = other.id; + // only memory is new + } + + /** + * Create AI Task + * + * @param func functor name + * @param taskType type of this task entry + * @param typeArg argument for task (condition or output variable) + * @param id id of this task + * @param args arguments given + */ + public AiTask(String func, EAiTaskType taskType, String typeArg, String id, HashMap args) { + this.fn = func; + this.args = args; + this.type = taskType; + this.typeArg = typeArg; + this.id = id; + } + + /** + * Reset memory + */ + public void reset() { + memory.clear(); + } + + /** + * Get a copy + * + * @return copy + */ + public AiTask copy() { + return new AiTask(this); + } + + @Override + public String toString() { + + String s = ""; + s += type + "(id: '" + id + "', fn: "; + s += fn; + if (type == EAiTaskType.TASK && typeArg != null) s += " ? '" + typeArg + "'"; + if (type == EAiTaskType.CHECK && typeArg != null) s += " → '" + typeArg + "'"; + s += ", "; + s += "args: " + args; + + s += ")"; + + return s; + } +} diff --git a/src/net/sector/level/drivers/DriverStore.java b/src/net/sector/level/drivers/DriverStore.java new file mode 100644 index 0000000..3273b9a --- /dev/null +++ b/src/net/sector/level/drivers/DriverStore.java @@ -0,0 +1,294 @@ +package net.sector.level.drivers; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sector.Constants; +import net.sector.level.loading.DirectoryLoader; +import net.sector.level.loading.XmlUtil; +import net.sector.util.Log; + +import org.jdom2.Element; + + +/** + * Driver loader and store + * + * @author MightyPork + */ +public class DriverStore { + /** store of drivers loaded earlier */ + private List superStores = new ArrayList(); + + private HashMap loadedDrivers = new HashMap(); + + public static final boolean DEBUG = Constants.LOG_DRIVERS; + + /** + * Driver store + */ + public DriverStore() {} + + /** + * Driver store + * + * @param superStores (var-args) already loaded stores to be extended + */ + public DriverStore(List superStores) { + this.superStores = superStores; + } + + /** + * Driver store + * + * @param superStores (var-args) already loaded stores to be extended + */ + public DriverStore(DriverStore... superStores) { + this.superStores = new ArrayList(); + for (DriverStore st : superStores) + this.superStores.add(st); + } + + /** + * Add super store (store loaded earlier, with drivers that can be extended) + * + * @param store the added store + */ + public void addSuperStore(DriverStore store) { + superStores.add(store); + } + + /** + * Get driver (task list) that has already been loaded from a XML file. + * + * @param name driver name + * @return task list + */ + public TaskList getDriver(String name) { + if (name == null) { + Log.w("DriverStore: get ( name = null )"); + return null; + } + TaskList tl = loadedDrivers.get(name.toLowerCase()); + + if (tl == null) { + for (DriverStore store : superStores) { + TaskList tl2 = store.getDriver(name.toLowerCase()); + if (tl2 != null) { + tl = tl2; + break; + } + } + } + + if (tl == null) { + Log.w("Could not find driver " + name + "."); + } + return tl; + } + + /** + * Get if this store contains driver of given name + * + * @param name driver name + * @return is here + */ + public boolean hasDriver(String name) { + return loadedDrivers.containsKey(name); + } + + + /** + * Add driver to this store + * + * @param name driver name + * @param driver task list + */ + public void addDriver(String name, TaskList driver) { + if (loadedDrivers.containsKey(name)) { + Log.w("DriverStore: adding driver named \"" + name + "\" overwrites another loaded driver."); + } + loadedDrivers.put(name, driver); + } + + /** + * Load drivers from a directory, as declared in manifext.xml - which MUST + * be present. + * + * @param access directory loader + */ + public void loadDriversFromDirectory(DirectoryLoader access) { + + Map roots = XmlUtil.loadFromDirectoryWithManifest(access, "drivers"); + + if (roots == null) return; + + for (Element elem : roots.values()) { + loadDriversFromNodeList(elem); + } + + } + + /** + * Load drivers from node list (eg. <drivers>Here are + * drivers</drivers>) + * + * @param nodeList node list element + */ + public void loadDriversFromNodeList(Element nodeList) { + List drivers = nodeList.getChildren("driver"); + + for (Element driver : drivers) { + loadDriverFromNode(driver); + } + } + + /** + * Load driver from XML node + * + * @param driverNode the node with driver + */ + public void loadDriverFromNode(Element driverNode) { + String driverName = empty2null(driverNode.getAttributeValue("name")); + String extend = empty2null(driverNode.getAttributeValue("extends")); + + // in case user uses "extend" and not "extends" + if (extend == null) extend = driverNode.getAttributeValue("extend"); + if (driverName == null) driverName = driverNode.getAttributeValue("id"); + + + if (DEBUG) Log.f2("Starting loading a driver '" + driverName + "' extending '" + extend + "'."); + + if (driverName == null) { + Log.w("DriveStore: Loaded driver has no name. Loading aborted."); + return; + } + + TaskList driverTasks = new TaskList(); + + // extend if requested. + if (extend != null) { + boolean found = false; + for (DriverStore store : superStores) { + if (store.hasDriver(extend)) { + driverTasks = store.getDriver(extend).copy(); + found = true; + break; + } + } + if (hasDriver(extend)) { + driverTasks = getDriver(extend).copy(); + found = true; + } + if (!found) { + Log.w("DriveStore: Driver '" + driverName + "' extends nonexistent driver '" + extend + "'. Loading aborted."); + return; + } + } + + List taskNodes = driverNode.getChildren(); + + /* + The Task: + + + + + + + */ + if (DEBUG) Log.f3("Loading tasks..."); + for (Element taskNode : taskNodes) { + AiTask newTask = new AiTask(); + + String id = empty2null(taskNode.getAttributeValue("id")); + String ifA = taskNode.getAttributeValue("if"); + String forA = taskNode.getAttributeValue("for"); + + if (ifA != null) ifA = ifA.trim(); + if (forA != null) forA = forA.trim(); + + + String replace = empty2null(taskNode.getAttributeValue("replace")); + String before = empty2null(taskNode.getAttributeValue("before")); + String after = empty2null(taskNode.getAttributeValue("after")); + + String taskTagName = taskNode.getName(); + if (taskTagName.equals("task") || taskTagName.equals("do")) { + newTask.type = EAiTaskType.TASK; + newTask.typeArg = ifA; + + } else if (taskTagName.equals("check") || taskTagName.equals("test")) { + newTask.type = EAiTaskType.CHECK; + newTask.typeArg = forA; + } + + newTask.id = id; + + newTask.args = XmlUtil.loadArgs(taskNode); + newTask.fn = (String) newTask.args.get("fn"); + newTask.args.remove("fn"); + + // here the task should be ready. + + if (replace != null || before != null || after != null) { + String searched = (replace != null ? replace : before != null ? before : after); + // do replace + int i = 0; + boolean foundTask = false; + for (AiTask t : driverTasks) { + if (t.id != null && t.id.equalsIgnoreCase(searched)) { + foundTask = true; + break; + } + i++; + } + + if (!foundTask) { + Log.w("DriveStore: Task " + (replace != null ? " replacing '" + replace + "'" : " '" + newTask.id + "'") + " in driver '" + + driverName + "' contains invalid before|after|replace value. Loading aborted."); + return; + } + + if (replace != null) { + AiTask replaced = driverTasks.get(i); + replaced.extendWith(newTask); + } else if (before != null) { + driverTasks.add(i, newTask); + } else if (after != null) { + driverTasks.add(i + 1, newTask); + } + } else { + // if no position specified, append + driverTasks.add(newTask); + } + + + //if (DEBUG) Log.f3("Task" + (replace != null ? " replacing '" + replace + "'" : " '" + newTask.id + "'") + " added to new driver."); + } + + + // the driver should be entirely loaded now + if (DEBUG) { + Log.f3("\nAll task in driver " + driverName + ":"); + + for (AiTask task : driverTasks) { + Log.f3(" -> " + task); + } + Log.f2("Driver " + driverName + " loaded.\n"); + } + + loadedDrivers.put(driverName, driverTasks); + + } + + private String empty2null(String source) { + if (source == null) return null; + if (source.trim().length() == 0) return null; + return source.trim(); + } + +} diff --git a/src/net/sector/level/drivers/EAiTaskType.java b/src/net/sector/level/drivers/EAiTaskType.java new file mode 100644 index 0000000..519817a --- /dev/null +++ b/src/net/sector/level/drivers/EAiTaskType.java @@ -0,0 +1,14 @@ +package net.sector.level.drivers; + + +/** + * Task type enum + * + * @author MightyPork + */ +public enum EAiTaskType { + /** Do-something task */ + TASK, + /** Check-condition task */ + CHECK; +} diff --git a/src/net/sector/level/drivers/FunctorBase.java b/src/net/sector/level/drivers/FunctorBase.java new file mode 100644 index 0000000..ad8dc82 --- /dev/null +++ b/src/net/sector/level/drivers/FunctorBase.java @@ -0,0 +1,35 @@ +package net.sector.level.drivers; + + +import java.util.Map; + +import net.sector.entities.EntityNavigable; + + +/** + * Task executing functor + * + * @author MightyPork + */ +public abstract class FunctorBase { + public double speedMul(INavigated drone) { + return ((EntityNavigable) drone).getStableSpeedMultiplier(); + } + + /** + * Execute (called each entity update tick) + * + * @param drone controlled ship + * @param memory task memory, storage of task-instance specific data + * @param args task arguments given by the preset + * @return if this task is of type TEST, here is returned the output value. + */ + public abstract boolean execute(INavigated drone, Map memory, Map args); + + /** + * Get functor type. + * + * @return fn type + */ + public abstract EAiTaskType getFunctorType(); +} diff --git a/src/net/sector/level/drivers/FunctorRegistry.java b/src/net/sector/level/drivers/FunctorRegistry.java new file mode 100644 index 0000000..ce372c8 --- /dev/null +++ b/src/net/sector/level/drivers/FunctorRegistry.java @@ -0,0 +1,61 @@ +package net.sector.level.drivers; + + +import java.util.HashMap; +import java.util.Map; + +import net.sector.level.drivers.functors.*; +import net.sector.util.Log; + + +/** + * Entity registry for easier spawning + * + * @author MightyPork + */ +public class FunctorRegistry { + + private static Map functors = new HashMap(); + + /** + * Initialize + */ + public static void init() { + Log.f1("Initializing driver functor list..."); + + functors.put("FLY_TO_POINT", new FnFlyToPoint()); + functors.put("FLY_TO_RECT", new FnFlyToRect()); + functors.put("FOLLOW_TARGET", new FnFollowTarget()); + functors.put("MAGNET", new FnMagnet()); + + functors.put("AVOID", new FnAvoid()); + + functors.put("SET_SPEED", new FnSetSpeed()); + functors.put("KEEP_DISTANCE", new FnKeepDistance()); + + functors.put("ROTATE", new FnRotate()); + functors.put("TURN_TO", new FnTurnTo()); + + functors.put("SHOOT", new FnShoot()); + functors.put("HEAL", new FnHeal()); + + + // checks + functors.put("CAN_SHOOT", new FnCanShoot()); + functors.put("IS_IN_RECT", new FnIsInRect()); + functors.put("IS_LEADER", new FnIsLeader()); + functors.put("IS_TAIL", new FnIsTail()); + functors.put("CHECK_HEALTH", new FnCheckHealth()); + } + + /** + * Get functor for name + * + * @param fn fn name + * @return the functor + */ + public static FunctorBase get(String fn) { + return functors.get(fn.toUpperCase()); + } + +} diff --git a/src/net/sector/level/drivers/INavigated.java b/src/net/sector/level/drivers/INavigated.java new file mode 100644 index 0000000..ea1021a --- /dev/null +++ b/src/net/sector/level/drivers/INavigated.java @@ -0,0 +1,203 @@ +package net.sector.level.drivers; + + +import net.sector.collision.Scene; +import net.sector.entities.EFormation; +import net.sector.entities.Entity; +import net.sector.util.DeltaDoubleDeg; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Navigator controlled entity + * + * @author MightyPork + */ +public interface INavigated { + /** + * Get desired motion speed (eg. 0.1) + * + * @return desired motion speed + */ + public double getDesiredSpeed(); + + /** + * Set desired ship speed (eg. 0.1) + * + * @param speed the speed + */ + public void setDesiredSpeed(double speed); + + /** + * Set ship level, which has or has not any effect on the ship (health, shot + * damage, desired speed etc.) + * + * @param level ship level + */ + public void setShipLevel(int level); + + /** + * Get entity motion vector + * + * @return motion vector + */ + public Vec getMotion(); + + /** + * Get entity position + * + * @return position + */ + public Coord getPos(); + + /** + * Get entity collider radius + * + * @return radius + */ + public double getRadius(); + + /** + * Get if entity is EMP paralyzed and can not move + * + * @return is paralyzed + */ + public boolean isEmpParalyzed(); + + /** + * Get entity parent scene + * + * @return scene + */ + public Scene getScene(); + + /** + * Get if entity is dead + * + * @return is dead + */ + public boolean isDead(); + + /** + * Set entity dead. + */ + public void setDead(); + + /** + * Get delta-timed rotation angle + * + * @return angle + */ + public DeltaDoubleDeg getRotAngle(); + + /** + * heal the entity + * + * @param add health to add + */ + public void addHealth(double add); + + + /** + * Shoot one shot from appropriate gun.
+ * Do nothing if can't shoot. + * + * @param gunIndex gun index, in case this ship has multiple guns + */ + public void shootOnce(int gunIndex); + + /** + * Get gun aim direction vector + * + * @param gunIndex gun index, in case this ship has multiple guns + * @return gun aim vector + */ + public Vec getGunShotDir(int gunIndex); + + /** + * Healing multiplier (for HEAL task) + * + * @return 1, over 1 for faster, below 1 for slower healing + */ + public double getHealMultiplier(); + + /** + * Set navigator driver + * + * @param driver new task list + */ + public void setDriver(TaskList driver); + + /** + * Get entity navigator + * + * @return navigator + */ + public Navigator getNavigator(); + + /** + * Get leader of the formation + * + * @return leader or null + */ + public Entity getFormationLeader(); + + /** + * Get target entity (used for navigation) + * + * @return target + */ + public Entity getTargetEntity(); + + /** + * Set target entity (for navigation) + * + * @param targetEntity the target entity + */ + public void setTargetEntity(Entity targetEntity); + + /** + * Set fleet formation + * + * @param fleet the fleer + * @param formation the formation + */ + public void setFormation(Entity[] fleet, EFormation formation); + + /** + * Is tail? + * + * @return is tail. + */ + public boolean formationIsTail(); + + /** + * Is leader? + * + * @return is leader. + */ + public boolean formationIsLeader(); + + /** + * Get absolute health + * + * @return health + */ + public double getHealth(); + + /** + * Get relative health + * + * @return health in percent + */ + public double getHealthPercent(); + + /** + * Get health max + * + * @return max health + */ + public double getHealthMax(); +} diff --git a/src/net/sector/level/drivers/Navigator.java b/src/net/sector/level/drivers/Navigator.java new file mode 100644 index 0000000..2e07bcd --- /dev/null +++ b/src/net/sector/level/drivers/Navigator.java @@ -0,0 +1,190 @@ +package net.sector.level.drivers; + + +import java.util.HashMap; +import java.util.Map.Entry; + +import net.sector.util.Log; + + +/** + * AI drone controller with tasks + * + * @author MightyPork + */ +public class Navigator { + private INavigated drone; + + private TaskList tasks = new TaskList(); + + private HashMap taskFlags = new HashMap(); + + /** + * Implicit navigator constructor + */ + public Navigator() {} + + /** + * Implicit navigator constructor + * + * @param tasks AI tasks to be used in this AI + */ + public Navigator(TaskList tasks) { + this.tasks = tasks.copy(); + } + + /** + * Navigator constructor for ship + * + * @param ship controlled ship + */ + public Navigator(INavigated ship) { + this.drone = ship; + } + + /** + * Set ship to be controlled by this AI + * + * @param drone the ship + */ + public void setShip(INavigated drone) { + this.drone = drone; + } + + /** + * Set ship desired speed + * + * @param desiredSpeed desired speed + */ + public void setShipDesiredSpeed(double desiredSpeed) { + this.drone.setDesiredSpeed(desiredSpeed); + } + + /** + * Set ship level + * + * @param level level to set + */ + public void setShipLevel(int level) { + this.drone.setShipLevel(level); + } + + /** + * Add AI task + * + * @param task AI task to add + */ + public void addTask(AiTask task) { + tasks.add(task); + } + + /** + * Clear AI tasks + */ + public void clearTasks() { + tasks.clear(); + } + + /** + * Reset AI tasks (erase memories) + */ + public void resetTasks() { + for (AiTask task : tasks) { + task.reset(); + } + } + + /** + * On entity update hook + */ + public void onUpdate() { + taskFlags.clear(); + for (AiTask task : tasks) { + + + if (task.fn == null || task.fn.equals("") || task.fn.equals("none")) continue; + boolean fnNeg = task.fn.startsWith("!"); + FunctorBase functor = FunctorRegistry.get(task.fn.replace("!", "")); + + if (functor == null) { + Log.e("AI error: requested functor '" + task.fn + "' does not exist. Task id=" + task.id + ", drone=" + drone); + continue; + } + + if (task.type == EAiTaskType.TASK) { + + // check if "if" condition is met. + + String condition = task.typeArg; + String cond1 = condition; + + if (condition != null && condition.length() != 0) { + condition = cond1 = condition.toLowerCase(); + + for (Entry flag : taskFlags.entrySet()) { + condition = condition.replace(flag.getKey().toLowerCase(), flag.getValue() ? "1" : "0"); + } + + if (!condition.matches("[\\(\\)\\|\\&01\\!\\+\\*]+")) { + Log.w("AI error: invalid condition pattern in task \"" + cond1 + "\" - possibly flag that hasn't been set yet.\nRemains = " + + condition); + continue; + } + + int iter = 0; + condition = condition.replaceAll("\\|\\|", "|"); + condition = condition.replaceAll("\\&\\&", "&"); + condition = condition.replaceAll("\\+", "|"); + condition = condition.replaceAll("\\*", "&"); + while (condition.length() > 1) { + // remove useless brackets + condition = condition.replaceAll("\\(([01])\\)", "$1"); + + // not + condition = condition.replaceAll("!0", "1"); + condition = condition.replaceAll("!1", "0"); + + // and + condition = condition.replaceAll("0\\&0", "0"); + condition = condition.replaceAll("0\\&1", "0"); + condition = condition.replaceAll("1\\&0", "0"); + condition = condition.replaceAll("1\\&1", "1"); + + // or + condition = condition.replaceAll("0\\|0", "0"); + condition = condition.replaceAll("0\\|1", "1"); + condition = condition.replaceAll("1\\|0", "1"); + condition = condition.replaceAll("1\\|1", "1"); + + + iter++; + if (iter >= 15) break; + } + } + + if (condition == null || condition.equals("1")) functor.execute(drone, task.memory, task.args); + } else if (task.type == EAiTaskType.CHECK) { + if (task.typeArg == null) continue; + // perform check. + taskFlags.put(task.typeArg.toLowerCase(), (fnNeg ? true : false) ^ functor.execute(drone, task.memory, task.args)); + } + + } + } + + /** + * Set driver to this navigator. + * + * @param driver the task list. + */ + public void setDriver(TaskList driver) { + if (driver == null) { + Log.e(new RuntimeException("Null driver assigned to entity " + this + ".")); + return; + } + this.tasks = driver.copy(); + //resetTasks(); + } + + +} diff --git a/src/net/sector/level/drivers/TaskList.java b/src/net/sector/level/drivers/TaskList.java new file mode 100644 index 0000000..6e3eda5 --- /dev/null +++ b/src/net/sector/level/drivers/TaskList.java @@ -0,0 +1,28 @@ +package net.sector.level.drivers; + + +import java.util.ArrayList; + + +/** + * List of AI tasks + * + * @author MightyPork + */ +public class TaskList extends ArrayList { + + /** + * Make a copy + * + * @return copy + */ + public TaskList copy() { + TaskList newList = new TaskList(); + for (AiTask task : this) { + newList.add(task.copy()); + } + + return newList; + } + +} diff --git a/src/net/sector/level/drivers/functors/FnAvoid.java b/src/net/sector/level/drivers/functors/FnAvoid.java new file mode 100644 index 0000000..1520f96 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnAvoid.java @@ -0,0 +1,99 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; +import java.util.Set; + +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.entities.shots.EntityFireball; +import net.sector.entities.shots.EntityShotBase; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.math.Calc.Rad; + + +/** + * AI avoid collision
+ *
+ * "weight" eg. 1 strength of steering + */ +public class FnAvoid extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + double desiredSpeed = drone.getDesiredSpeed(); + + + double strength = AiObjParser.getDouble(args.get("weight"), 1) * speedMul(drone) * 0.8; + + double dist = AiObjParser.getDouble(args.get("range"), 3); + + boolean sq = AiObjParser.getBoolean(args.get("square"), false); + boolean ignf = AiObjParser.getBoolean(args.get("ignore_formation"), false); + + + String avoid = AiObjParser.getString(args.get("avoid"), "NATURAL,SHOT_GOOD,SHOT_BAD,ENEMY,MINE"); + + int fireballs = 0; + Set ents = drone.getScene().getEntitiesInRange(drone.getPos(), drone.getRadius() + dist); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == drone) continue; + + if (!avoid.contains(e.getType().toString())) continue; + + if (ignf && (e instanceof EntityNavigable)) { + if (((EntityNavigable) e).formationContains((Entity) drone)) continue; + } + + // ignore own shots + if (e instanceof EntityShotBase && ((EntityShotBase) e).origin == drone) continue; + + if (e instanceof EntityFireball) { + fireballs++; + if (fireballs > 8) continue; + } + + double move = 0; + if (sq) { + double entDist = e.getPos().distTo(drone.getPos()) - e.getRadius() - drone.getRadius(); + if (entDist < 0) entDist = 0; + move = 0.001 / entDist; + move = Calc.clampd(move, 0.0001, 0.3); + } else { + move = 0.001; + } + + // redirect factor 0.001 + + Vec vec1 = drone.getMotion(); + Vec vec2 = (Vec) e.getPos().vecTo(drone.getPos()).setY(0); + + double angle = Rad.toDeg(Math.acos(Math.abs(vec1.dot(vec2)) / (vec1.size() * vec2.size()))); + if (angle < 18) { + boolean a = ((int) (System.currentTimeMillis() / 2500)) % 2 == 0; + vec2.setTo((a ? -1 : 1) * vec2.z, 0, (a ? 1 : -1) * vec2.x); + } + + drone.getMotion().add_ip((vec2).norm(strength * move)); + + + drone.getMotion().norm_ip(desiredSpeed); + } + } + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnCanShoot.java b/src/net/sector/level/drivers/functors/FnCanShoot.java new file mode 100644 index 0000000..ebe2a52 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnCanShoot.java @@ -0,0 +1,79 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; +import java.util.Set; + +import net.sector.entities.EEntity; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.coord.Vec; + + +/** + * Check if can safely shoot in vec
+ * "vec" shoot vec
+ * "spare" spared entity types (PLAYER|NATURAL)
+ * * + * + * @author MightyPork + */ +public class FnCanShoot extends FunctorBase { + + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + + + Vec dir = drone.getGunShotDir(AiObjParser.getInteger(args.get("gun"), 0)); + if (dir == null) return false; + + String spared = AiObjParser.getString(args.get("spare"), ""); + + + Set ents = drone.getScene().getEntitiesInLineOfSight(drone.getPos().add(dir.norm(1)), dir, 0.5, 60); + + + boolean ignf = AiObjParser.getBoolean(args.get("ignore_formation"), false); + + if (ents.size() == 0) return false; + Entity closest = null; + double closestDist = 100; + + // get closest entity + for (Entity e : ents) { + if (e == drone) continue; + + if (ignf && (e instanceof EntityNavigable)) { + if (((EntityNavigable) e).formationContains((Entity) drone)) continue; + } + + // ignore shots + EEntity type = e.getType(); + if (type == EEntity.SHOT_BAD || type == EEntity.SHOT_GOOD) continue; + + double dist; + if ((dist = e.getPos().distTo(drone.getPos())) < closestDist) { + closest = e; + closestDist = dist; + } + } + + if (closest == null) return false; + + EEntity type = closest.getType(); + if (!spared.contains(type.toString())) return true; + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.CHECK; + } + +} diff --git a/src/net/sector/level/drivers/functors/FnCheckHealth.java b/src/net/sector/level/drivers/functors/FnCheckHealth.java new file mode 100644 index 0000000..d358280 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnCheckHealth.java @@ -0,0 +1,87 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.math.Range; + + +/** + * Check if drone is in rect + * + * @author MightyPork + */ +public class FnCheckHealth extends FunctorBase { + + /* + * + * + * (opt *) inclusive + * (opt *) or: lower, below, lt + * (opt *) or: above, gt + * (opt) or: relative, perc + * + */ + + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + Range zone = null; + + zone = AiObjParser.getRange(args.get("range"), zone); + if (zone == null) zone = AiObjParser.getRange(args.get("zone"), zone); + if (zone == null) zone = AiObjParser.getRange(args.get("in"), zone); + + Double ltAbs = null; + Double gtAbs = null; + + ltAbs = AiObjParser.getDouble(args.get("below"), ltAbs); + if (ltAbs == null) ltAbs = AiObjParser.getDouble(args.get("lower"), ltAbs); + if (ltAbs == null) ltAbs = AiObjParser.getDouble(args.get("under"), ltAbs); + if (ltAbs == null) ltAbs = AiObjParser.getDouble(args.get("lt"), ltAbs); + + + gtAbs = AiObjParser.getDouble(args.get("over"), gtAbs); + if (gtAbs == null) gtAbs = AiObjParser.getDouble(args.get("above"), gtAbs); + if (gtAbs == null) gtAbs = AiObjParser.getDouble(args.get("higher"), gtAbs); + if (gtAbs == null) gtAbs = AiObjParser.getDouble(args.get("gt"), gtAbs); + + + boolean percent = false; + + if (args.containsKey("percent")) percent = AiObjParser.getBoolean(args.get("percent"), false); + if (args.containsKey("perc")) percent = AiObjParser.getBoolean(args.get("perc"), false); + if (args.containsKey("relative")) percent = AiObjParser.getBoolean(args.get("relative"), false); + + + double health = drone.getHealth(); + double healthperc = drone.getHealthPercent(); + + if (zone != null) { + double cp = (percent ? healthperc : health); + return cp >= zone.getMin() && cp <= zone.getMax(); + } + + if (ltAbs != null) { + double cp = (percent ? healthperc : health); + return cp < ltAbs; + } + + if (gtAbs != null) { + double cp = (percent ? healthperc : health); + return cp > gtAbs; + } + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.CHECK; + } + +} diff --git a/src/net/sector/level/drivers/functors/FnFlyToPoint.java b/src/net/sector/level/drivers/functors/FnFlyToPoint.java new file mode 100644 index 0000000..67e99a1 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnFlyToPoint.java @@ -0,0 +1,57 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Range; + + +/** + * AI fly to point...
+ *
+ * "target" where to fly
+ * "weight" eg. 1 strength of steering + */ +public class FnFlyToPoint extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + Coord target = AiObjParser.getCoord(args.get("target")).toCoord(drone); + + Range x = AiObjParser.getRange(args.get("x")); + Range z = AiObjParser.getRange(args.get("z")); + + if (!args.containsKey("target")) { + // use min-max + if (memory.containsKey("tg")) { + target = (Coord) memory.get("tg"); + } else { + target = new Coord(x.randDouble(), 0, z.randDouble()); + memory.put("tg", target); + } + } + + double strength = AiObjParser.getDouble(args.get("weight"), 1) * speedMul(drone); + + double desiredSpeed = drone.getDesiredSpeed(); + + Vec direction = drone.getPos().vecTo(target); + + drone.getMotion().add_ip(direction.norm(0.001 * strength)); + drone.getMotion().norm_ip(desiredSpeed); + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnFlyToRect.java b/src/net/sector/level/drivers/functors/FnFlyToRect.java new file mode 100644 index 0000000..2872a17 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnFlyToRect.java @@ -0,0 +1,107 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.Constants; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Range; +import com.porcupine.mutable.MInt; + + +/** + * AI fly to rectangle...
+ *
+ * "min" min corner of the rect (-3;20)
+ * "max" max corner of the rect (3;25)
+ * "weight" eg. 0.001 strength of steering
+ */ +public class FnFlyToRect extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + double strength = AiObjParser.getDouble(args.get("weight"), 1) * speedMul(drone); + + // + // + + double desiredSpeed = drone.getDesiredSpeed(); + + Range x_range = AiObjParser.getRange(args.get("x")); + Range z_range = AiObjParser.getRange(args.get("z")); + + Coord min = new Coord(x_range.getMin(), 0, z_range.getMin()); + Coord max = new Coord(x_range.getMax(), 0, z_range.getMax()); + + Coord pos = drone.getPos(); + + Vec move = Vec.ZERO.copy(); + + if (pos.x < min.x - 0.5) move.x = 1; + if (pos.x > max.x + 0.5) move.x = -1; + if (pos.z < min.z - 0.5) move.z = 1; + if (pos.z > max.z + 0.5) move.z = -1; + + if (move.size() != 0) { + drone.getMotion().norm_ip(desiredSpeed); + drone.getMotion().add_ip(move.norm(strength * 0.0005)); + drone.getMotion().norm_ip(desiredSpeed); + } else { + Coord target = drone.getPos(); + + MInt timer; + + boolean changeTarget = false; + + if (memory.containsKey("timer")) { + timer = (MInt) memory.get("timer"); + } else { + memory.put("timer", timer = new MInt(0)); + changeTarget = true; + } + + timer.set(timer.get() + 1); + + if (timer.get() > Constants.FPS_UPDATE * 2) { + timer.set(0); + changeTarget = true; + } + + for (int i = 0; i < 5; i++) { + // use min-max + if (memory.containsKey("tg") && !changeTarget) { + target = (Coord) memory.get("tg"); + } else { + target = new Coord(x_range.randDouble(), 0, z_range.randDouble()); + memory.put("tg", target); + } + + if (drone.getPos().distTo(target) < 0.3) { + changeTarget = true; + timer.set(0); + continue; + } + break; + } + + Vec direction = drone.getPos().vecTo(target); + + drone.getMotion().add_ip(direction.norm(0.001 * strength)); + drone.getMotion().norm_ip(desiredSpeed); + } + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnFollowTarget.java b/src/net/sector/level/drivers/functors/FnFollowTarget.java new file mode 100644 index 0000000..43b42cb --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnFollowTarget.java @@ -0,0 +1,83 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; +import java.util.Set; + +import net.sector.collision.Scene; +import net.sector.entities.Entity; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; +import net.sector.util.Utils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * AI lock on one enemy and kill it
+ *
+ * "target" type of target entity PLAYER, ENEMY, SHOT_GOOD, SHOT_BAD
+ * "range" scan range, eg. 60 + */ +public class FnFollowTarget extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + double desiredSpeed = drone.getDesiredSpeed(); + + double range = AiObjParser.getDouble(args.get("range"), 60); + + String targetType = AiObjParser.getString(args.get("target"), "").toUpperCase(); + + Scene scene = drone.getScene(); + Coord pos = drone.getPos(); + Vec motion = drone.getMotion(); + + if (drone.getTargetEntity() == null || drone.getTargetEntity().isDead()) { + Set entities = scene.getEntitiesInRange(pos, range); + double mini = 180; + double mind = 1000; + for (Entity entity : entities) { + + // if not an allowed target, go on. (allows ENEMY|NATURAL kind of notation) + if (!targetType.contains(entity.getType().toString())) continue; + + if (entity == drone) continue; + double i = 0; + double d = entity.getPos().distTo(pos); + i = Utils.observerAngleToCoord(pos, entity.getPos(), motion); + if (i < 70 && i < mini && d < mind) { + drone.setTargetEntity(entity); + mini = i; + mind = d; + } + } + } + + // fly to + if (drone.getTargetEntity() != null) { + Entity target = drone.getTargetEntity(); + Vec direction = pos.vecTo(target.getPos()); + direction.norm_ip(desiredSpeed); + double dist = target.getPos().distTo(pos) - target.getRadius(); + if (dist < 0) dist = 0; + double spd = 0.2 / dist; + if (spd < 0.05) spd = 0.05; + motion.add_ip(direction.norm(spd)); + motion.norm_ip(desiredSpeed); + } + + motion.norm_ip(desiredSpeed); + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnHeal.java b/src/net/sector/level/drivers/functors/FnHeal.java new file mode 100644 index 0000000..50f348d --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnHeal.java @@ -0,0 +1,57 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.Constants; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.mutable.MInt; + + +/** + * AI heal
+ *
+ * "add" hp points to add
+ */ +public class FnHeal extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + double add = AiObjParser.getDouble(args.get("add"), 0); + + double gap = AiObjParser.getDouble(args.get("gap"), 1); + + + boolean percent = false; + + if (args.containsKey("percent")) percent = AiObjParser.getBoolean(args.get("percent"), false); + if (args.containsKey("perc")) percent = AiObjParser.getBoolean(args.get("perc"), false); + if (args.containsKey("relative")) percent = AiObjParser.getBoolean(args.get("relative"), false); + + + + MInt gap_cnt = null; + if ((gap_cnt = (MInt) memory.get("gap")) == null) { + memory.put("gap", gap_cnt = new MInt((int) (gap * Constants.SPEED_MUL))); + } + + + + if (gap_cnt.o-- == 0) { + drone.addHealth((add * drone.getHealMultiplier()) * (percent ? drone.getHealthMax() / 100D : 1)); + gap_cnt.o = (int) (gap * Constants.SPEED_MUL); + } + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnIsInRect.java b/src/net/sector/level/drivers/functors/FnIsInRect.java new file mode 100644 index 0000000..e8aca5b --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnIsInRect.java @@ -0,0 +1,39 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Range; + + +/** + * Check if drone is in rect + * + * @author MightyPork + */ +public class FnIsInRect extends FunctorBase { + + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + + Range x_range = AiObjParser.getRange(args.get("x")); + Range z_range = AiObjParser.getRange(args.get("z")); + + Coord min = new Coord(x_range.getMin(), 0, z_range.getMin()); + Coord max = new Coord(x_range.getMax(), 0, z_range.getMax()); + + return drone.getPos().isInRect(min, max); + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.CHECK; + } + +} diff --git a/src/net/sector/level/drivers/functors/FnIsLeader.java b/src/net/sector/level/drivers/functors/FnIsLeader.java new file mode 100644 index 0000000..c0f6961 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnIsLeader.java @@ -0,0 +1,28 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + + +/** + * Check if drone is in rect + * + * @author MightyPork + */ +public class FnIsLeader extends FunctorBase { + + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + return drone.formationIsLeader(); + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.CHECK; + } + +} diff --git a/src/net/sector/level/drivers/functors/FnIsTail.java b/src/net/sector/level/drivers/functors/FnIsTail.java new file mode 100644 index 0000000..79ea13b --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnIsTail.java @@ -0,0 +1,28 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + + +/** + * Check if drone is in rect + * + * @author MightyPork + */ +public class FnIsTail extends FunctorBase { + + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + return drone.formationIsTail(); + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.CHECK; + } + +} diff --git a/src/net/sector/level/drivers/functors/FnKeepDistance.java b/src/net/sector/level/drivers/functors/FnKeepDistance.java new file mode 100644 index 0000000..39c39c3 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnKeepDistance.java @@ -0,0 +1,60 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.Constants; +import net.sector.entities.EntityNavigable; +import net.sector.level.dataobj.AiCoord; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Range; + + +/** + * AI slow down
+ *
+ * "factor" 0.5 half of full speed, 2 twice faster + */ +public class FnKeepDistance extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + Coord from = AiObjParser.getCoord(args.get("from"), AiCoord.ZERO).toCoord(drone); + + Range zone = AiObjParser.getRange(args.get("dist"), new Range(5, 8)); + + double dist = drone.getPos().distTo(from); + + EntityNavigable navent = (EntityNavigable) drone; + + if (dist > zone.getMax()) { + navent.speedMul1 += 0.05 * Constants.SPEED_MUL; + if (navent.speedMul1 > 1.5) navent.speedMul1 = 1.5; + } else if (dist < zone.getMin()) { + navent.speedMul1 -= 0.05 * Constants.SPEED_MUL; + if (navent.speedMul1 < -1.5) navent.speedMul1 = -1.5; + } else { + if (navent.speedMul1 > 1) { + navent.speedMul1 -= 0.3 * Constants.SPEED_MUL; + if (navent.speedMul1 < 1) navent.speedMul1 = 1; + } + if (navent.speedMul1 < 1) { + navent.speedMul1 += 0.3 * Constants.SPEED_MUL; + if (navent.speedMul1 > 1) navent.speedMul1 = 1; + } + } + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnMagnet.java b/src/net/sector/level/drivers/functors/FnMagnet.java new file mode 100644 index 0000000..d265863 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnMagnet.java @@ -0,0 +1,60 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; +import java.util.Set; + +import net.sector.entities.Entity; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +/** + * AI fly to closest of type, accelerate when getting close.
+ *
+ * "target" type of target entity PLAYER, ENEMY, SHOT_GOOD, SHOT_BAD
+ * "weight" eg. 0.4 strength of steering
+ * "range" scan range, eg. 15 + */ +public class FnMagnet extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + double desiredSpeed = drone.getDesiredSpeed(); + + + double range = AiObjParser.getDouble(args.get("range"), 15); + double weight = AiObjParser.getDouble(args.get("weight"), 1) * 0.4 * speedMul(drone); + String target = AiObjParser.getString(args.get("target"), ""); + + + Set ents = drone.getScene().getEntitiesInRange(drone.getPos(), range); + if (!ents.isEmpty()) { + for (Entity e : ents) { + if (e == drone) continue; + if (target.contains(e.getType().toString())) { + double dist = e.getPos().distTo(drone.getPos()) - e.getRadius(); + if (dist < 0) dist = 0; + double move = weight / dist; + move = Calc.clampd(move, 0, weight); + drone.getMotion().add_ip(((Vec) drone.getPos().vecTo(e.getPos()).setY(0)).norm(move)); + drone.getMotion().norm_ip(desiredSpeed); + } + } + } + + drone.getMotion().norm_ip(desiredSpeed); + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnRotate.java b/src/net/sector/level/drivers/functors/FnRotate.java new file mode 100644 index 0000000..16f45bc --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnRotate.java @@ -0,0 +1,49 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; +import java.util.Random; + +import net.sector.Constants; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + + +/** + * AI rotation add
+ *
+ * "angle" degrees to add + */ +public class FnRotate extends FunctorBase { + + private static Random rand = new Random(); + + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + double add = AiObjParser.getDouble(args.get("add"), 0); + boolean randDir = AiObjParser.getBoolean(args.get("random_dir"), false); + + int dir = 1; + + if (memory.get("dir") == null) { + if (randDir) dir = rand.nextBoolean() ? 1 : -1; + memory.put("dir", dir); + } else { + dir = (Integer) memory.get("dir"); + } + + drone.getRotAngle().pushLast(); + drone.getRotAngle().add(dir * add * Constants.SPEED_MUL); + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnSetSpeed.java b/src/net/sector/level/drivers/functors/FnSetSpeed.java new file mode 100644 index 0000000..64b5586 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnSetSpeed.java @@ -0,0 +1,45 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.Constants; +import net.sector.entities.EntityNavigable; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + + +/** + * AI set speed (not the stable speed)
+ *
+ * "factor" 0.5 half of full speed, 2 twice faster
+ * incompatible with KeepDistance + */ +public class FnSetSpeed extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + double factor = AiObjParser.getDouble(args.get("speed"), 1); + + EntityNavigable navent = (EntityNavigable) drone; + + if (navent.speedMul1 > factor) { + navent.speedMul1 -= 0.05 * Constants.SPEED_MUL; + if (navent.speedMul1 < factor) navent.speedMul1 = factor; + } else if (navent.speedMul1 < factor) { + navent.speedMul1 += 0.05 * Constants.SPEED_MUL; + if (navent.speedMul1 > factor) navent.speedMul1 = factor; + } + + //drone.getPos().add_ip(drone.getMotion().scale(-1+factor)); + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnShoot.java b/src/net/sector/level/drivers/functors/FnShoot.java new file mode 100644 index 0000000..431f96d --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnShoot.java @@ -0,0 +1,87 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.Constants; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.mutable.MInt; + + +/** + * AI shoot
+ *
+ * "count" shots in group
+ * "gap_shot" pause between shots in group (sec)
+ * "gap_group" pause between groups (sec)
+ * "gun" gun index (0) + */ +public class FnShoot extends FunctorBase { + + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + // DIR + + //Vec dir = AiObjParser.getCoord(args.get("dir"), new AiCoord(drone.getMotion())).toVec(drone); + + int cInGroup = AiObjParser.getInteger(args.get("count"), 1); + double cShotDelay = AiObjParser.getDouble(args.get("gap_shot"), 1); + double cGroupDelay = AiObjParser.getDouble(args.get("gap_group"), 2); + int cGunIndex = AiObjParser.getInteger(args.get("gun"), 0); + int cAtOnce = AiObjParser.getInteger(args.get("bullets"), 1); + + if (cInGroup == 1) cShotDelay = 0; + + MInt shotsInGroup = null; + if ((shotsInGroup = (MInt) memory.get("cnt")) == null) { + memory.put("cnt", shotsInGroup = new MInt(cInGroup)); + } + + MInt groupDelay = null; + if ((groupDelay = (MInt) memory.get("gap_g")) == null) { + memory.put("gap_g", groupDelay = new MInt((int) (cGroupDelay * Constants.SPEED_MUL))); + } + + MInt shotDelay = null; + if ((shotDelay = (MInt) memory.get("gap_s")) == null) { + memory.put("gap_s", shotDelay = new MInt((int) (cShotDelay * Constants.SPEED_MUL))); + } + + if (groupDelay.o > 0) groupDelay.o--; + + // SHOOT + if (groupDelay.o == 0) { //collider.pos.z > 0 + if (shotsInGroup.o == 0) { + shotsInGroup.o = cInGroup; + groupDelay.o = (int) (Constants.FPS_UPDATE * cGroupDelay); + shotDelay.o = 0; + } else { + + if (shotDelay.o > 0) shotDelay.o--; + + if (shotDelay.o == 0) { + shotDelay.o = (int) (Constants.FPS_UPDATE * cShotDelay); + + for (; cAtOnce > 0; cAtOnce--) + drone.shootOnce(cGunIndex); + + shotsInGroup.o--; + } + } + } + + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/FnTurnTo.java b/src/net/sector/level/drivers/functors/FnTurnTo.java new file mode 100644 index 0000000..db58475 --- /dev/null +++ b/src/net/sector/level/drivers/functors/FnTurnTo.java @@ -0,0 +1,49 @@ +package net.sector.level.drivers.functors; + + +import java.util.Map; + +import net.sector.Constants; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.EAiTaskType; +import net.sector.level.drivers.FunctorBase; +import net.sector.level.drivers.INavigated; + +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc.Deg; +import com.porcupine.math.Calc.Rad; +import com.porcupine.math.Polar; + + +/** + * AI rotate in direction of a vector
+ *
+ * "vec" the directional vector
+ */ +public class FnTurnTo extends FunctorBase { + @Override + public boolean execute(INavigated drone, Map memory, Map args) { + if (drone.isEmpParalyzed()) return false; + + Vec vec = new Vec(AiObjParser.getCoord(args.get("dir")).toCoord(drone)); + + if (vec.x == 0 && vec.z == 0) return false; + + Polar p = Polar.fromCoord(vec.x, vec.z); + double current = drone.getRotAngle().get(); + double goal = -90 + Rad.toDeg(p.angle); + double delta = Deg.delta(current, goal); + double add = 0; + if (delta > 0) add = Math.min(7, Math.abs(delta)); + if (delta < 0) add = -Math.min(7, Math.abs(delta)); + + drone.getRotAngle().add(add * Constants.SPEED_MUL); + + return false; + } + + @Override + public EAiTaskType getFunctorType() { + return EAiTaskType.TASK; + } +} diff --git a/src/net/sector/level/drivers/functors/MEntity.java b/src/net/sector/level/drivers/functors/MEntity.java new file mode 100644 index 0000000..3338570 --- /dev/null +++ b/src/net/sector/level/drivers/functors/MEntity.java @@ -0,0 +1,35 @@ +package net.sector.level.drivers.functors; + + +import net.sector.entities.Entity; + +import com.porcupine.mutable.AbstractMutable; + + +/** + * Mutable entity reference + * + * @author MightyPork + */ +public class MEntity extends AbstractMutable { + + /** + * New mutable entity reference + * + * @param o entity + */ + public MEntity(Entity o) { + super(o); + } + + /** + * Imp.c. + */ + public MEntity() {} + + @Override + protected Entity getDefault() { + return null; + } + +} diff --git a/src/net/sector/level/highscore/HighscoreEntry.java b/src/net/sector/level/highscore/HighscoreEntry.java new file mode 100644 index 0000000..ba1f57f --- /dev/null +++ b/src/net/sector/level/highscore/HighscoreEntry.java @@ -0,0 +1,105 @@ +package net.sector.level.highscore; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import net.sector.CustomIonMarks; + +import com.porcupine.ion.Ion; +import com.porcupine.ion.IonizableOptional; + + +/** + * Hiscore entry (score - name) + * + * @author MightyPork + */ +public class HighscoreEntry implements Comparable, IonizableOptional { + /** Score */ + public int score = 0; + + /** Name */ + public String name = ""; + + /** Uid, empty for guests. */ + public String uid = ""; + + /** + * Flag that this entry is local. Used when guest plays global level, to + * differentiate entries of guests and of the active registered accounts. + */ + public boolean isLocal = true; + + /** + * Flag for guests highscore table, indicating that this entry should be + * highlighted + */ + public boolean justAdded = false; + + /** + * Entry of highscore table - implicit constructor + */ + public HighscoreEntry() {} + + /** + * Highscore entry + * + * @param score score + * @param name name + */ + public HighscoreEntry(int score, String name) { + this.score = score; + this.name = name; + } + + @Override + public int compareTo(HighscoreEntry o) { + if (this == o) return 0; + return -new Integer(score).compareTo(o.score); + } + + @Override + public String toString() { + return "( " + score + " - " + name + "; uid = \"" + uid + "\" )"; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (!(obj instanceof HighscoreEntry)) return false; + HighscoreEntry other = (HighscoreEntry) obj; + return other.score == score && other.name.equals(name) && other.uid.equals(uid); + } + + @Override + public int hashCode() { + return score ^ name.hashCode() ^ uid.hashCode(); + } + + @Override + public void ionRead(InputStream in) throws IOException { + score = (Integer) Ion.readObject(in); + name = (String) Ion.readObject(in); + uid = (String) Ion.readObject(in); + } + + @Override + public void ionWrite(OutputStream out) throws IOException { + Ion.writeObject(out, Integer.valueOf(score)); + Ion.writeObject(out, name); + Ion.writeObject(out, uid); + + } + + @Override + public byte ionMark() { + return CustomIonMarks.HIGHSCORE_ENTRY; + } + + @Override + public boolean ionShouldSave() { + return isLocal; + } +} diff --git a/src/net/sector/level/highscore/HighscoreTable.java b/src/net/sector/level/highscore/HighscoreTable.java new file mode 100644 index 0000000..af9cbd4 --- /dev/null +++ b/src/net/sector/level/highscore/HighscoreTable.java @@ -0,0 +1,42 @@ +package net.sector.level.highscore; + + +import java.util.Collections; + +import net.sector.CustomIonMarks; + +import com.porcupine.ion.AbstractIonList; + + +/** + * A highscore table + * + * @author MightyPork + */ +public class HighscoreTable extends AbstractIonList { + + /** + * Add a highscore + * + * @param score + * @param name + * @return the new score + */ + public HighscoreEntry addScore(int score, String name) { + HighscoreEntry e; + add(e = new HighscoreEntry(score, name)); + return e; + } + + /** + * Sort entries + */ + public void sort() { + Collections.sort(this); + } + + @Override + public byte ionMark() { + return CustomIonMarks.HIGHSCORE_TABLE; + } +} diff --git a/src/net/sector/level/loading/DirectoryLoader.java b/src/net/sector/level/loading/DirectoryLoader.java new file mode 100644 index 0000000..92b78f3 --- /dev/null +++ b/src/net/sector/level/loading/DirectoryLoader.java @@ -0,0 +1,28 @@ +package net.sector.level.loading; + + +import java.io.InputStream; + + +/** + * Directory access interface + * + * @author MightyPork + */ +public interface DirectoryLoader { + /** + * Get if file exists in this directory + * + * @param filename file name + * @return exists + */ + public boolean fileExists(String filename); + + /** + * Open file as InputStream + * + * @param filename file name + * @return input stream + */ + public InputStream openFile(String filename); +} diff --git a/src/net/sector/level/loading/ResourceDirectoryLoader.java b/src/net/sector/level/loading/ResourceDirectoryLoader.java new file mode 100644 index 0000000..8227db1 --- /dev/null +++ b/src/net/sector/level/loading/ResourceDirectoryLoader.java @@ -0,0 +1,43 @@ +package net.sector.level.loading; + + +import java.io.InputStream; + +import org.newdawn.slick.util.ResourceLoader; + + +/** + * Directory access in resources + * + * @author MightyPork + */ +public class ResourceDirectoryLoader implements DirectoryLoader { + + private String path; + + /** + * Create resource directory access + * + * @param path the path + */ + public ResourceDirectoryLoader(String path) { + this.path = path; + if (path.endsWith("/")) this.path = path.substring(0, path.length() - 1); + } + + @Override + public boolean fileExists(String filename) { + return ResourceLoader.resourceExists(path + "/" + filename); + } + + @Override + public InputStream openFile(String filename) { + return ResourceLoader.getResourceAsStream(path + "/" + filename); + } + + @Override + public String toString() { + return "Res('" + path + "')"; + } + +} diff --git a/src/net/sector/level/loading/XmlUtil.java b/src/net/sector/level/loading/XmlUtil.java new file mode 100644 index 0000000..e68a15d --- /dev/null +++ b/src/net/sector/level/loading/XmlUtil.java @@ -0,0 +1,192 @@ +package net.sector.level.loading; + + +import java.io.*; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import net.sector.Constants; +import net.sector.level.dataobj.AiObjParser; +import net.sector.util.Log; + +import org.jdom2.Attribute; +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; + + +/** + * XML loading utility + * + * @author MightyPork + */ +public class XmlUtil { + private static final boolean DEBUG = Constants.LOG_XML_LOADING; + + /** + * Get XML document from input stream + * + * @param in input stream + * @return document + */ + public static Document getDocument(InputStream in) { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // Fake code simulating the copy + // You can generally do better with nio if you need... + // And please, unlike me, do something about the Exceptions :D + byte[] buffer = new byte[1024]; + int len; + try { + + while ((len = in.read(buffer)) > -1) { + baos.write(buffer, 0, len); + } + baos.flush(); + + } catch (IOException e) { + e.printStackTrace(); + } + + // Open new InputStreams using the recorded bytes + // Can be repeated as many times as you wish + InputStream is1 = new ByteArrayInputStream(baos.toByteArray()); + InputStream is2 = new ByteArrayInputStream(baos.toByteArray()); + + + try { + SAXBuilder builder = new SAXBuilder(); + Document d = builder.build(is1); + return d; + } catch (IOException io) { + Log.e("XmlUtil: " + io.getMessage()); + } catch (JDOMException jdomex) { + Log.e("XmlUtil: " + jdomex.getMessage()); + } + + try { + String msg = ""; + + msg += "\n\nInvalid XML file:\n"; + InputStreamReader sr = new InputStreamReader(is2); + BufferedReader br = new BufferedReader(sr); + String line; + while ((line = br.readLine()) != null) { + msg += "\t" + line + "\n"; + } + msg += "End of file.\n\n"; + + Log.e(msg); + } catch (IOException e) { + Log.e("IO Error:", e); + } + + return null; + } + + /** + * Get root element of an input stream XML + * + * @param in the input stream + * @return root element + */ + public static Element getRootElement(InputStream in) { + return getDocument(in).getRootElement(); + } + + /** + * Load all files from directory, described in manifest. There can be + * multiple file lists in manifest, each with different "fileListTagName". + * + * @param dirLoader directory loader + * @param manifestFileListTag tag in manifest, containing elements + * <file>filename.xml</file> which describe loading + * order of the directory files. + * @return map of Filename → Root Element + */ + public static Map loadFromDirectoryWithManifest(DirectoryLoader dirLoader, String manifestFileListTag) { + Map roots = new LinkedHashMap(); + + if (DEBUG) Log.f2("XmlUtil: Request to load documents from directory " + dirLoader + "."); + + if (!dirLoader.fileExists("manifest.xml")) { + Log.w("XmlUtil: Folder accessed by " + dirLoader + " has no 'manifest.xml'."); + return null; + } + + InputStream is = dirLoader.openFile("manifest.xml"); + if (DEBUG) Log.f3("Loading manifest file."); + Document doc = getDocument(is); + Element root = doc.getRootElement(); + Element fileList = root.getChild(manifestFileListTag); + List files = fileList.getChildren("file"); + + for (Element elem : files) { + String fname = elem.getText().trim(); + + if (DEBUG) Log.f3("Loading file " + fname); + InputStream is2 = dirLoader.openFile(fname); + Document doc2 = getDocument(is2); + if (doc2 != null) roots.put(fname, doc2.getRootElement()); + } + + return roots; + } + + /** + * Load arguments from wrapper tag + * + * @param wrapper wrapper tag + * @return map of the arguments + */ + public static Map loadArgs(Element wrapper) { + Map args = new HashMap(); + + for (Element argNode : wrapper.getChildren()) { + String argName = argNode.getName().trim().toLowerCase(); + + List at2 = argNode.getAttributes(); + + if (at2.size() == 0) { + Log.w("Parsing XML file: Argument '" + argName + "' has no value in '" + wrapper.getName() + ":" + wrapper.getAttributes() + "'."); + continue; + } + + String argType = at2.get(0).getName().trim().toLowerCase(); + String argValueSrc = at2.get(0).getValue().trim(); + + Object argValue = null; + + if (argType.equals("str") || argType.equals("string") || argType.equals("s") || argType.equals("name")) { + argValue = AiObjParser.getString(argValueSrc); + + } else if (argType.equals("num") || argType.equals("float") || argType.equals("double")) { + argValue = AiObjParser.getDouble(argValueSrc); + + } else if (argType.equals("int")) { + argValue = AiObjParser.getInteger(argValueSrc); + + } else if (argType.equals("bool") || argType.equals("boolean") || argType.equals("flag") || argType.equals("on") + || argType.equals("state")) { + argValue = AiObjParser.getBoolean(argValueSrc); + + } else if (argType.equals("coord") || argType.equals("vec") || argType.equals("dir") || argType.equals("coordinate") + || argType.equals("vector") || argType.equals("direction")) { + argValue = AiObjParser.getCoord(argValueSrc); + + } else if (argType.equals("range") || argType.equals("rand") || argType.equals("scale")) { + argValue = AiObjParser.getRange(argValueSrc); + } + + // argName, argValue + + // add new arg to args map + args.put(argName, argValue); + } + + return args; + } +} diff --git a/src/net/sector/level/sequence/EnemyWave.java b/src/net/sector/level/sequence/EnemyWave.java new file mode 100644 index 0000000..a6ff673 --- /dev/null +++ b/src/net/sector/level/sequence/EnemyWave.java @@ -0,0 +1,52 @@ +package net.sector.level.sequence; + + +import java.util.HashSet; + +import com.porcupine.math.Calc; + +import net.sector.entities.Entity; + + +/** + * Wave of entities + * + * @author MightyPork + */ +public class EnemyWave extends HashSet { + + /** + * Check if all entities in this wave are dead. + * + * @return all are dead + */ + public boolean isDead() { + for (Entity e : this) { + if (!e.isDead()) return false; + } + + clear(); + return true; + } + + /** + * Kill all entities in wave (add damage and set dead) + */ + public void killAll() { + for (Entity e : this) { + e.addDamage(null, 100000); + e.setDead(); + } + } + + @Override + public String toString() { + String s = ""; + s += "\n+---\n"; + s += " Enemy Wave, size = "+size()+"\n"; + for(Entity e: this) { + System.out.println(" -- name:"+Calc.className(e)+", hp:"+e.getHealth()+", dead:"+e.isDead()+", pos: "+e.getPos()); + } + return s; + } +} diff --git a/src/net/sector/level/sequence/HudMessage.java b/src/net/sector/level/sequence/HudMessage.java new file mode 100644 index 0000000..e714fb2 --- /dev/null +++ b/src/net/sector/level/sequence/HudMessage.java @@ -0,0 +1,25 @@ +package net.sector.level.sequence; + + +/** + * HUD message object + * + * @author MightyPork + */ +public class HudMessage { + /** Message text */ + public String text = ""; + /** Displayed secs */ + public double secs = 3; + + /** + * NMew HUD message + * + * @param text message text + * @param time time of dysplay (secs) + */ + public HudMessage(String text, double time) { + this.text = text; + secs = time; + } +} diff --git a/src/net/sector/level/sequence/LevelController.java b/src/net/sector/level/sequence/LevelController.java new file mode 100644 index 0000000..a0364d7 --- /dev/null +++ b/src/net/sector/level/sequence/LevelController.java @@ -0,0 +1,337 @@ +package net.sector.level.sequence; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import net.sector.collision.Scene; +import net.sector.entities.Entity; +import net.sector.level.SuperContext; +import net.sector.level.drivers.DriverStore; +import net.sector.level.sequence.nodes.NodeList; +import net.sector.level.spawners.SpawnerBase; +import net.sector.util.Log; + +import org.jdom2.Element; + +import com.porcupine.coord.Vec; + + +/** + * Level sequencer with timing, spawners & algorithm + * + * @author MightyPork + */ +public class LevelController { + /** Spawners map */ + private Map spawners = new HashMap(); + + /** Enemy waves */ + private Map waves = new HashMap(); + + private ArrayList hudMessages = new ArrayList(); + + private NodeList sequence; + + private LevelTimer timer = null; + private int initialTimer = -1; + + private boolean endReached = false; + private Scene scene; + private DriverStore drivers = SuperContext.basicDrivers; + + public void setInitialTimer(int timer) { + initialTimer = timer; + } + + /** + * Get if there are any messages waiting for display. + * + * @return if there are messages + */ + public boolean hasHudMessage() { + return !hudMessages.isEmpty(); + } + + /** + * Add a message + * + * @param msg message text + * @param time time + */ + public void addHudMessage(String msg, double time) { + hudMessages.add(new HudMessage(msg, time)); + } + + /** + * Pop one message from list waiting for display. + * + * @return one message + */ + public HudMessage getOneHudMessage() { + if (!hasHudMessage()) return null; + HudMessage one = hudMessages.get(0); + hudMessages.remove(0); + return one; + } + + /** + * Create instance of level controller (needed to load from XML) + * + * @param scene game scene for level + */ + public LevelController(Scene scene) { + this.scene = scene; + } + + /** + * Create instance of level controller (needed to set Scene) + * + * @param tag xml tag to load from + */ + public LevelController(Element tag) { + loadFromXml(tag); + } + + /** + * Create instance of level controller (needed to set Scene and load from + * XML) + */ + public LevelController() {} + + /** + * Load level from XML (the sequence) + * + * @param tag + * @return this + */ + public LevelController loadFromXml(Element tag) { + sequence = new NodeList(null, this); + sequence.loadFromXml(tag); + return this; + } + + /** + * Reset (recycle) + */ + public void reset() { + spawners.clear(); + sequence.reset(); + waves.clear(); + endReached = false; + timer = null; + flag_end = false; + hudMessages.clear(); + if (initialTimer != -1) setTimer(initialTimer); + } + + /** + * Get game scene + * + * @return the scene + */ + public Scene getScene() { + return scene; + } + + /** + * Set scene + * + * @param scene + */ + public void setScene(Scene scene) { + this.scene = scene; + } + + /** + * Pause timer if any + */ + public void pause() { + if (hasTimer()) getTimer().pause(); + } + + /** + * Resume timer if any + */ + public void resume() { + if (hasTimer()) getTimer().resume(); + } + + /** flag that "end of level" message has beed logged. */ + private boolean flag_end = false; + private Vec asteroidMovement = new Vec(0, 0, -1); + + /** + * On update + */ + public void onGameTick() { + + if (isEnded()) { + if (!flag_end) Log.f3("Level finished."); + flag_end = true; + return; + } + + if (hasTimer()) getTimer().update(); + + if (sequence.execute()) { + setEnded(); + } + + for (String name : spawners.keySet()) { + spawners.get(name).onGameTick(); + } + } + + /** + * Is level ended? + * + * @return is ended + */ + public boolean isEnded() { + return endReached || (hasTimer() && timer.isFinished()); + } + + /** + * End level + */ + public void setEnded() { + endReached = true; + } + + /** + * Add a spawner (replace if exists) + * + * @param name spawner name + * @param spawner spawner + */ + public void addSpawner(String name, SpawnerBase spawner) { + if (name == null) name = System.nanoTime() + ""; + spawners.put(name.toLowerCase(), spawner); + spawner.setLevel(this); + } + + /** + * Enable spawner + * + * @param name spawner name + * @param enabled be enabled + */ + public void enableSpawner(String name, boolean enabled) { + SpawnerBase spawner = spawners.get(name.toLowerCase()); + if (spawner != null) spawner.enable(enabled); + } + + /** + * Add entity to wave (create wave if not exists) + * + * @param name wave name + * @param entity the added entity + */ + public void addToWave(String name, Entity entity) { + name = name.toLowerCase(); + if (!waves.containsKey(name)) waves.put(name, new EnemyWave()); + waves.get(name).add(entity); + } + + /** + * Get if all entities in wave are dead = wave is empty. Returns true if + * wave does not exist. + * + * @param name wave name + * @return all entities in wave are dead, or wave does not exist + */ + public boolean isWaveDead(String name) { + if (!waves.containsKey(name)) return true; + return waves.get(name).isDead(); + } + + public EnemyWave getWave(String name) { + return waves.get(name); + } + + /** + * Get driver store + * + * @return driver store + */ + public DriverStore getDriverStore() { + return drivers; + } + + /** + * Set driver store + * + * @param drivers driver store to set + */ + public void setDriverStore(DriverStore drivers) { + this.drivers = drivers; + } + + /** + * Get a spawner. + * + * @param name spawner name + * @return spawner or null + */ + public SpawnerBase getSpawner(String name) { + if (name == null) return null; + return spawners.get(name.toLowerCase()); + } + + /** + * Get if level is timed + * + * @return has timer + */ + public boolean hasTimer() { + return timer != null; + } + + /** + * Get the timer if any + * + * @return the count-down timer + */ + public LevelTimer getTimer() { + return timer; + } + + /** + * Set countdown timer + * + * @param t timer + */ + public void setTimer(LevelTimer t) { + timer = t; + } + + /** + * Set timer time + * + * @param seconds countdown seconds + */ + public void setTimer(int seconds) { + timer = new LevelTimer(seconds); + timer.start(); + } + + /** + * Set asteroid movement. + * + * @param movement + */ + public void setGlobalMovement(Vec movement) { + asteroidMovement.setTo(movement); + } + + /** + * Get global movement + * + * @return global movement scaled to 0.1 (for direct use in entities) + */ + public Vec getGlobalMovement() { + return asteroidMovement.scale(0.1); + } +} diff --git a/src/net/sector/level/sequence/LevelNodeRegistry.java b/src/net/sector/level/sequence/LevelNodeRegistry.java new file mode 100644 index 0000000..8dd7024 --- /dev/null +++ b/src/net/sector/level/sequence/LevelNodeRegistry.java @@ -0,0 +1,145 @@ +package net.sector.level.sequence; + + +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.Map; + +import net.sector.level.sequence.nodes.*; +import net.sector.util.Log; + +import org.jdom2.Element; + + +/** + * Entity registry for easier spawning + * + * @author MightyPork + */ +public class LevelNodeRegistry { + + private static Map> nodes = new HashMap>(); + + /** + * Initialize + */ + public static void init() { + Log.f1("Initializing algorithm node registry..."); + + // algorithms + aliases + + nodes.put("repeat", NodeCycle.class); + nodes.put("loop", NodeCycle.class); + nodes.put("cycle", NodeCycle.class); + + nodes.put("list", NodeList.class); + + + //nodes.put("hud", NodeHudMessage.class); + nodes.put("msg", NodeHudMessage.class); + nodes.put("message", NodeHudMessage.class); + nodes.put("text", NodeHudMessage.class); + nodes.put("alert", NodeHudMessage.class); + nodes.put("info", NodeHudMessage.class); + + + //nodes.put("passive_shift", NodeSetGlobalMovement.class); + //nodes.put("shift", NodeSetGlobalMovement.class); + //nodes.put("scene_shift", NodeSetGlobalMovement.class); + //nodes.put("movement", NodeSetGlobalMovement.class); + nodes.put("rockshift", NodeSetGlobalMovement.class); + //nodes.put("scrolling", NodeSetGlobalMovement.class); + //nodes.put("move", NodeSetGlobalMovement.class); + + + nodes.put("spawn", NodeSpawnEntity.class); + nodes.put("fleet", NodeSpawnEntity.class); + nodes.put("squad", NodeSpawnEntity.class); + + nodes.put("pause", NodeWait.class); + nodes.put("delay", NodeWait.class); + nodes.put("sleep", NodeWait.class); + nodes.put("wait", NodeWait.class); + + nodes.put("stop", NodeEndLevel.class); + nodes.put("end", NodeEndLevel.class); + nodes.put("finish", NodeEndLevel.class); + + nodes.put("timer", NodeTimerSetup.class); + nodes.put("timer_set", NodeTimerSetup.class); + + nodes.put("timer_restart", NodeTimerRestart.class); + nodes.put("timer_reset", NodeTimerRestart.class); + + nodes.put("timer_remove", NodeTimerRemove.class); + nodes.put("timer_destroy", NodeTimerRemove.class); + + nodes.put("timer_stop", NodeTimerPause.class); + nodes.put("timer_pause", NodeTimerPause.class); + + nodes.put("timer_resume", NodeTimerResume.class); + nodes.put("timer_continue", NodeTimerResume.class); + nodes.put("timer_start", NodeTimerResume.class); + +// nodes.put("gen_asteroid", NodeSetupAsteroidSpawner.class); +// nodes.put("gen_asteroids", NodeSetupAsteroidSpawner.class); +// nodes.put("asteroids", NodeSetupAsteroidSpawner.class); +// nodes.put("gen_rock", NodeSetupAsteroidSpawner.class); +// nodes.put("gen_rocks", NodeSetupAsteroidSpawner.class); +// nodes.put("rocks", NodeSetupAsteroidSpawner.class); + nodes.put("rockgen", NodeSetupAsteroidSpawner.class); + + nodes.put("scoregen", NodeSetupScoreSpawner.class); + nodes.put("time_reward", NodeSetupScoreSpawner.class); + +// nodes.put("gen_entity", NodeSetupEntitySpawner.class); +// nodes.put("gen_entities", NodeSetupEntitySpawner.class); +// nodes.put("entities", NodeSetupEntitySpawner.class); +// nodes.put("gen_enemy", NodeSetupEntitySpawner.class); +// nodes.put("gen_enemies", NodeSetupEntitySpawner.class); +// nodes.put("gen_ship", NodeSetupEntitySpawner.class); +// nodes.put("gen_ships", NodeSetupEntitySpawner.class); +// nodes.put("enemies", NodeSetupEntitySpawner.class); + + nodes.put("enemygen", NodeSetupEntitySpawner.class); + nodes.put("shipgen", NodeSetupEntitySpawner.class); + + nodes.put("gen_enable", NodeSpawnerEnable.class); + nodes.put("enable", NodeSpawnerEnable.class); + nodes.put("gen_disable", NodeSpawnerDisable.class); + nodes.put("disable", NodeSpawnerDisable.class); + + + nodes.put("score", NodeAddScore.class); + nodes.put("bonus", NodeAddScore.class); + nodes.put("reward", NodeAddScore.class); + nodes.put("add_score", NodeAddScore.class); + + nodes.put("repair_ship", NodeRepairShip.class); + nodes.put("repair", NodeRepairShip.class); + } + + /** + * Load node from XML by tag name + * + * @param parent node parent + * @param level level controller + * @param tag tag + * @return entity + */ + public static LevelNodeBase loadNode(LevelNodeBase parent, LevelController level, Element tag) { + try { + + Class cls = nodes.get(tag.getName().toLowerCase()); + Constructor constructor = cls.getDeclaredConstructor(LevelNodeBase.class, LevelController.class); + LevelNodeBase node = constructor.newInstance(parent, level); + node.loadFromXml(tag); + return node; + + } catch (Exception e) { + Log.e("Could not instantiate algorithm node '" + tag.getName() + "' - not found in registry."); + return null; + } + } + +} diff --git a/src/net/sector/level/sequence/LevelTimer.java b/src/net/sector/level/sequence/LevelTimer.java new file mode 100644 index 0000000..7e18de1 --- /dev/null +++ b/src/net/sector/level/sequence/LevelTimer.java @@ -0,0 +1,132 @@ +package net.sector.level.sequence; + + +/** + * Level count-down timer + * + * @author MightyPork + */ +public class LevelTimer { + private long original = 0; + private long remains = 0; + private long lastUpdateTime = 0; + private boolean running = false; + private boolean finished; + + /** + * Construct a level timer (not started) + * + * @param seconds seconds of the count-down + */ + public LevelTimer(int seconds) { + remains = seconds * 1000; + original = remains; + } + + /** + * Get seconds remaining + * + * @return seconds remaining + */ + public int getRemainingTime() { + return Math.round(remains / 1000); + } + + /** + * Get remaining time in format " #:##", or "##:##". + * + * @return time formatted as Min:sec, with trailing space in mins and + * trailing zero in secs. + */ + public String getRemainingTimeFormatted() { + int rawSecs = getRemainingTime(); + int sec = rawSecs % 60; + int mins = (int) Math.floor(rawSecs / 60); + + String s = "00" + sec; + s = s.substring(s.length() - 2, s.length()); + + String m = " " + mins; + m = m.substring(m.length() - 2, m.length()); + + return m + ":" + s; + } + + /** + * Pause the count-down + */ + public void pause() { + running = false; + } + + /** + * Resume the count-down + */ + public void resume() { + lastUpdateTime = getMs(); + running = true; + } + + /** + * Start the count-down + */ + public void start() { + resume(); + } + + /** + * Restart the timer + */ + public void restart() { + remains = original; + start(); + } + + /** + * Update the timer (on game update tick) + */ + public void update() { + + if (!isRunning()) return; + + long now = getMs(); + + long sinceLastUpdate = now - lastUpdateTime; + + remains -= sinceLastUpdate; + + lastUpdateTime = now; + + if (remains <= 0) { + finished = true; + return; + } + } + + /** + * Get if count-down ended + * + * @return is finished + */ + public boolean isFinished() { + return finished; + } + + /** + * Get if timer is running. + * + * @return is running + */ + public boolean isRunning() { + return running && !finished; + } + + /** + * Get current time in milliseconds. + * + * @return time ms + */ + private long getMs() { + return System.currentTimeMillis(); + } +} diff --git a/src/net/sector/level/sequence/nodes/LevelNodeBase.java b/src/net/sector/level/sequence/nodes/LevelNodeBase.java new file mode 100644 index 0000000..13cc54d --- /dev/null +++ b/src/net/sector/level/sequence/nodes/LevelNodeBase.java @@ -0,0 +1,139 @@ +package net.sector.level.sequence.nodes; + + +import java.util.ArrayList; + +import net.sector.collision.Scene; +import net.sector.level.drivers.DriverStore; +import net.sector.level.sequence.LevelController; + +import org.jdom2.Element; + + +/** + * Level algorithm node - base class. + * + * @author MightyPork + */ +public abstract class LevelNodeBase { + private LevelNodeBase parent; + private LevelController level; + private int lastExecutedChild = -1; + private ArrayList children = new ArrayList(5); + + @Override + public String toString() { + return getClass().getSimpleName(); + } + + /** + * Create sequence node + * + * @param parent parent node + * @param level level controller + */ + public LevelNodeBase(LevelNodeBase parent, LevelController level) { + this.parent = parent; + this.level = level; + } + + /** + * Load this node from a XML tag + * + * @param tag node xml tag + */ + public abstract void loadFromXml(Element tag); + + /** + * Get level controller (to access spawners etc) + * + * @return level controller + */ + public final LevelController getLevel() { + return level; + } + + /** + * Get driver store + * + * @return driver store for level + */ + public final DriverStore getDriverStore() { + return level.getDriverStore(); + } + + /** + * Get level scene + * + * @return scene + */ + public final Scene getScene() { + return getLevel().getScene(); + } + + /** + * Get parent node + * + * @return parent node + */ + public final LevelNodeBase getParent() { + return parent; + } + + /** + * Add a child node + * + * @param node child node to add + */ + public final void addChild(LevelNodeBase node) { + //System.out.println("Add child to " + this + " → " + node); + children.add(node); + } + + /** + * Get if this list has more children + * + * @return has more children + */ + public final boolean hasMoreChildren() { + return lastExecutedChild < children.size() - 1; + } + + /** + * Execute next child in list, if any + * + * @return true on success, false on end reached (repeat or continue to next + * in parent) + */ + public final boolean executeNextChild() { + if (!hasMoreChildren()) { + return false; + } + lastExecutedChild++; + boolean move = children.get(lastExecutedChild).execute(); + if (!move) lastExecutedChild--; + return true; + } + + /** + * Move cursor to first child. + */ + public final void gotoFirstChild() { + lastExecutedChild = -1; + } + + /** + * Execute this node + * + * @return true if finished (false to repeat) + */ + public abstract boolean execute(); + + public abstract void reset(); + + public final void resetChildren() { + gotoFirstChild(); + for (LevelNodeBase c : children) + c.reset(); + } +} diff --git a/src/net/sector/level/sequence/nodes/NodeAddScore.java b/src/net/sector/level/sequence/nodes/NodeAddScore.java new file mode 100644 index 0000000..c0f05e5 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeAddScore.java @@ -0,0 +1,58 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.SuperContext; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.sequence.LevelController; +import net.sector.util.Log; +import net.sector.util.Utils; + +import org.jdom2.Attribute; +import org.jdom2.Element; + +import com.porcupine.math.Range; + + +/** + * "Add score" node + * + * @author MightyPork + */ +public class NodeAddScore extends LevelNodeBase { + + private Range score = new Range(0); + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeAddScore(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = (Attribute) Utils.fallback(tag.getAttribute("points"), tag.getAttribute("money"), tag.getAttribute("score"), tag.getAttribute("i"), + tag.getAttribute("n")); + + score = AiObjParser.getRange(a.getValue(), score); + + } + + @Override + public boolean execute() { + + int added = score.randInt(); + Log.f3("Adding score points: " + added); + SuperContext.getGameContext().getCursor().addScore(added); + + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeCycle.java b/src/net/sector/level/sequence/nodes/NodeCycle.java new file mode 100644 index 0000000..99fa69c --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeCycle.java @@ -0,0 +1,90 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; +import net.sector.level.sequence.LevelNodeRegistry; + +import org.jdom2.Attribute; +import org.jdom2.DataConversionException; +import org.jdom2.Element; + + +/** + * Node loop + * + * @author MightyPork + */ +public class NodeCycle extends LevelNodeBase { + + private int repeatCount = 1; + private int i = -1; + + /** + * Create repeat node + * + * @param parent parent node + * @param level level controller + * @param xmlTag xml tag this node is loading from + */ + public NodeCycle(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() { + i = -1; + resetChildren(); + } + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = tag.getAttribute("count"); + if (a == null) a = tag.getAttribute("cnt"); + if (a == null) a = tag.getAttribute("i"); + if (a == null) a = tag.getAttribute("times"); + if (a == null) a = tag.getAttribute("n"); + + if (a == null || a.getValue().equals("-1") || a.getValue().equals("inf") || a.getValue().equals("infinite")) { + repeatCount = -1; + } else { + try { + repeatCount = a.getIntValue(); + } catch (DataConversionException e) { + e.printStackTrace(); + } + } + + for (Element e : tag.getChildren()) { + LevelNodeBase node = LevelNodeRegistry.loadNode(this, getLevel(), e); + if (node != null) addChild(node); + } + } + + @Override + public boolean execute() { + if (i == -1) { + i = 0; // begin cycle + gotoFirstChild(); // rewind + } + + // if more children, call one and end. + if (executeNextChild()) { + return false; // repeat + } + + gotoFirstChild(); // rewind + i++; // next loop + + // infinite! + if (repeatCount == -1) return false; + + if (i >= repeatCount) { + i = -1; + return true; // break + } + return false; // repeat + } + + +} diff --git a/src/net/sector/level/sequence/nodes/NodeEndLevel.java b/src/net/sector/level/sequence/nodes/NodeEndLevel.java new file mode 100644 index 0000000..cbf84fa --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeEndLevel.java @@ -0,0 +1,38 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; + +import org.jdom2.Element; + + +/** + * "Pause" node + * + * @author MightyPork + */ +public class NodeEndLevel extends LevelNodeBase { + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeEndLevel(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) {} + + @Override + public boolean execute() { + getLevel().setEnded(); + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeHudMessage.java b/src/net/sector/level/sequence/nodes/NodeHudMessage.java new file mode 100644 index 0000000..a6f3541 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeHudMessage.java @@ -0,0 +1,76 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.sequence.LevelController; +import net.sector.util.Log; + +import org.jdom2.Attribute; +import org.jdom2.Element; + + +/** + * "Pause" node + * + * @author MightyPork + */ +public class NodeHudMessage extends LevelNodeBase { + + private String message = "Undefined HUD Message"; + private boolean once = false; + private boolean done = false; + + private double time = 3; + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeHudMessage(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() { + done = false; + } + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = tag.getAttribute("str"); + if (a == null) a = tag.getAttribute("text"); + if (a == null) a = tag.getAttribute("txt"); + //if (a == null) a = tag.getAttribute("t"); + if (a == null) a = tag.getAttribute("msg"); + if (a == null) a = tag.getAttribute("message"); + + message = a.getValue(); + + a = tag.getAttribute("once"); + if (a != null) once = AiObjParser.getBoolean(a.getValue()); + + a = tag.getAttribute("time"); + if (a == null) a = tag.getAttribute("t"); + if (a == null) a = tag.getAttribute("secs"); + + if (a != null) time = AiObjParser.getDouble(a.getValue()); + + } + + @Override + public boolean execute() { + + if (once && done) return true; + + done = true; + + Log.f3("New message (" + time + "s): " + message); + getLevel().addHudMessage(message, time); + + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeList.java b/src/net/sector/level/sequence/nodes/NodeList.java new file mode 100644 index 0000000..ed77454 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeList.java @@ -0,0 +1,47 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; +import net.sector.level.sequence.LevelNodeRegistry; + +import org.jdom2.Element; + + +/** + * Node loop + * + * @author MightyPork + */ +public class NodeList extends LevelNodeBase { + + /** + * Create repeat node + * + * @param parent parent node + * @param level level controller + * @param xmlTag xml tag this node is loading from + */ + public NodeList(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() { + resetChildren(); + } + + @Override + public void loadFromXml(Element tag) { + for (Element e : tag.getChildren()) { + LevelNodeBase child = LevelNodeRegistry.loadNode(this, getLevel(), e); + if (child != null) addChild(child); + } + } + + @Override + public boolean execute() { + return !executeNextChild(); + } + + +} diff --git a/src/net/sector/level/sequence/nodes/NodeRepairShip.java b/src/net/sector/level/sequence/nodes/NodeRepairShip.java new file mode 100644 index 0000000..2fa2aee --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeRepairShip.java @@ -0,0 +1,67 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.sequence.LevelController; +import net.sector.level.ship.modules.pieces.Piece; +import net.sector.sounds.Sounds; +import net.sector.util.Log; +import net.sector.util.Utils; + +import org.jdom2.Attribute; +import org.jdom2.Element; + +import com.porcupine.math.Range; + + +/** + * "Add score" node + * + * @author MightyPork + */ +public class NodeRepairShip extends LevelNodeBase { + + private Range repairRate = new Range(1); + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeRepairShip(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = (Attribute) Utils.fallback(tag.getAttribute("rate"), tag.getAttribute("strength"), tag.getAttribute("i"), tag.getAttribute("n")); + + repairRate = AiObjParser.getRange(a.getValue(), repairRate); + + } + + @Override + public boolean execute() { + double rate = repairRate.randDouble(); + Log.f3("Repairing ship with rate " + rate); + + getScene().getPlayerShip().body.energySystem.fill(); + getScene().getPlayerShip().body.shieldSystem.fill(); + + for (Piece p : getScene().getPlayerShip().body.allPieces) { + if (!p.isDead) { + p.addHealth(p.getHealthMax() * rate); + } + } + + Sounds.des_repair.playEffect(1f, 0.5f, false); + + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeSetGlobalMovement.java b/src/net/sector/level/sequence/nodes/NodeSetGlobalMovement.java new file mode 100644 index 0000000..943698e --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeSetGlobalMovement.java @@ -0,0 +1,54 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.sequence.LevelController; + +import org.jdom2.Attribute; +import org.jdom2.Element; + +import com.porcupine.coord.Vec; + + +/** + * "Pause" node + * + * @author MightyPork + */ +public class NodeSetGlobalMovement extends LevelNodeBase { + + private Vec movement = new Vec(0, 0, -1); + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeSetGlobalMovement(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = tag.getAttribute("move"); + if(a==null) a = tag.getAttribute("dir"); + if(a==null) a = tag.getAttribute("vec"); + if(a==null) a = tag.getAttribute("coord"); + + movement = new Vec(AiObjParser.getCoord(a.getValue()).toCoord(null)); + } + + @Override + public boolean execute() { + + getLevel().setGlobalMovement(movement); + + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeSetupAsteroidSpawner.java b/src/net/sector/level/sequence/nodes/NodeSetupAsteroidSpawner.java new file mode 100644 index 0000000..b0676b5 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeSetupAsteroidSpawner.java @@ -0,0 +1,62 @@ +package net.sector.level.sequence.nodes; + + +import java.util.Map; + +import net.sector.level.loading.XmlUtil; +import net.sector.level.sequence.LevelController; +import net.sector.level.spawners.AsteroidSpawner; +import net.sector.level.spawners.SpawnerBase; +import net.sector.util.Utils; + +import org.jdom2.Attribute; +import org.jdom2.Element; + + +/** + * "Setup entity spawner" node - (ships) + * + * @author MightyPork + */ +public class NodeSetupAsteroidSpawner extends LevelNodeBase { + + private String name; + private Map args; + + /** + * "Setup entity spawner" node + * + * @param parent parent tag + * @param level level controller + */ + public NodeSetupAsteroidSpawner(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + Attribute a = (Attribute) Utils.fallback(tag.getAttribute("name"), tag.getAttribute("id")); + + if (a != null) name = a.getValue(); + + args = XmlUtil.loadArgs(tag); + } + + @Override + public boolean execute() { + SpawnerBase sp = null; + if ((sp = getLevel().getSpawner(name)) != null) { + sp.loadFromXmlArgs(args); + return true; + } + SpawnerBase spawner = new AsteroidSpawner(getScene()); + spawner.loadFromXmlArgs(args); + getLevel().addSpawner(name, spawner); + return true; + } + + +} diff --git a/src/net/sector/level/sequence/nodes/NodeSetupEntitySpawner.java b/src/net/sector/level/sequence/nodes/NodeSetupEntitySpawner.java new file mode 100644 index 0000000..0b2adf0 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeSetupEntitySpawner.java @@ -0,0 +1,63 @@ +package net.sector.level.sequence.nodes; + + +import java.util.Map; + +import net.sector.level.loading.XmlUtil; +import net.sector.level.sequence.LevelController; +import net.sector.level.spawners.EnemySpawner; +import net.sector.level.spawners.SpawnerBase; +import net.sector.util.Utils; + +import org.jdom2.Attribute; +import org.jdom2.Element; + + +/** + * "Setup entity spawner" node - (ships) + * + * @author MightyPork + */ +public class NodeSetupEntitySpawner extends LevelNodeBase { + + private String name; + private Map args; + + /** + * "Setup entity spawner" node + * + * @param parent parent tag + * @param level level controller + * @param xmlTag xml tag to load from + */ + public NodeSetupEntitySpawner(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + Attribute a = (Attribute) Utils.fallback(tag.getAttribute("name"), tag.getAttribute("id")); + + if (a != null) name = a.getValue(); + args = XmlUtil.loadArgs(tag); + } + + @Override + public boolean execute() { + SpawnerBase sp = null; + if ((sp = getLevel().getSpawner(name)) != null) { + sp.loadFromXmlArgs(args); + return true; + } + + SpawnerBase spawner = new EnemySpawner(getScene()); + spawner.loadFromXmlArgs(args); + getLevel().addSpawner(name, spawner); + return true; + } + + +} diff --git a/src/net/sector/level/sequence/nodes/NodeSetupScoreSpawner.java b/src/net/sector/level/sequence/nodes/NodeSetupScoreSpawner.java new file mode 100644 index 0000000..ea9e341 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeSetupScoreSpawner.java @@ -0,0 +1,63 @@ +package net.sector.level.sequence.nodes; + + +import java.util.Map; + +import net.sector.level.loading.XmlUtil; +import net.sector.level.sequence.LevelController; +import net.sector.level.spawners.ScoreSpawner; +import net.sector.level.spawners.SpawnerBase; +import net.sector.util.Utils; + +import org.jdom2.Attribute; +import org.jdom2.Element; + + +/** + * "Setup score spawner" node - (score) + * + * @author MightyPork + */ +public class NodeSetupScoreSpawner extends LevelNodeBase { + + private String name; + private Map args; + + /** + * "Setup score spawner" node + * + * @param parent parent tag + * @param level level controller + */ + public NodeSetupScoreSpawner(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + + Attribute a = (Attribute) Utils.fallback(tag.getAttribute("name"), tag.getAttribute("id")); + + if (a != null) name = a.getValue(); + args = XmlUtil.loadArgs(tag); + } + + @Override + public boolean execute() { + SpawnerBase sp = null; + if ((sp = getLevel().getSpawner(name)) != null) { + sp.loadFromXmlArgs(args); + return true; + } + + SpawnerBase spawner = new ScoreSpawner(getScene()); + spawner.loadFromXmlArgs(args); + getLevel().addSpawner(name, spawner); + return true; + } + + +} diff --git a/src/net/sector/level/sequence/nodes/NodeSpawnEntity.java b/src/net/sector/level/sequence/nodes/NodeSpawnEntity.java new file mode 100644 index 0000000..d347d3e --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeSpawnEntity.java @@ -0,0 +1,268 @@ +package net.sector.level.sequence.nodes; + + +import java.util.Map; + +import net.sector.entities.EFormation; +import net.sector.entities.Entity; +import net.sector.entities.EntityNavigable; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.loading.XmlUtil; +import net.sector.level.sequence.LevelController; +import net.sector.level.spawners.EntityRegistry; +import net.sector.util.Utils; + +import org.jdom2.Element; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Range; + + +/** + * "Spawn entity" node + * + * @author MightyPork + */ +public class NodeSpawnEntity extends LevelNodeBase { + + private String entity = null; + private String wave = null; + private String driver = null; + private Range count = new Range(1); + private Range level = new Range(1); + private String formation = "none"; + private Range healthMul = new Range(1); + + private Range x = new Range(-10, 10); + private Range z = new Range(100, 120); + + private Range dist = new Range(2); + private Range variant = new Range(0); + private Range speed = new Range(1); + private Range size = new Range(1); + private boolean uniform = true; + + private int artifact = 0; + + + /** + * "Setup entity spawner" node + * + * @param parent parent tag + * @param level level controller + */ + public NodeSpawnEntity(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + Map args = XmlUtil.loadArgs(tag); + + /* + * + * + * (opt) + * (opt) + * (opt) + * (opt) + * (opt) none/random, row, line, snake, leader + * (opt) + * (opt) + * (opt) + * + * + */ + + entity = AiObjParser.getString(args.get("entity")); + + wave = AiObjParser.getString(Utils.fallback(args.get("wave"), args.get("group")), null); + + driver = AiObjParser.getString(args.get("driver"), null); + count = AiObjParser.getRange(args.get("count"), count); + level = AiObjParser.getRange(args.get("level"), level); + + + size = AiObjParser.getRange(args.get("size"), size); + + speed = AiObjParser.getRange(args.get("speed"), speed); + + healthMul = AiObjParser.getRange(args.get("health"), healthMul); + + + dist = AiObjParser.getRange(Utils.fallback(args.get("dist"), args.get("space"), args.get("distance")), dist); + + variant = AiObjParser.getRange(Utils.fallback(args.get("variant"), args.get("type"), args.get("kind")), variant); + + formation = AiObjParser.getString(Utils.fallback(args.get("formation"), args.get("fleet"), args.get("shape")), formation); + + uniform = AiObjParser.getBoolean(args.get("uniform"), uniform); + + artifact = AiObjParser.getInteger(args.get("artifact"), artifact); + + x = AiObjParser.getRange(args.get("x"), x); + z = AiObjParser.getRange(args.get("z"), z); + } + + // formations: + // none/random, row, line, snake, leader + + @Override + public boolean execute() { + + if (formation.equals("none") || formation.equals("random")) { + + int mVariant = variant.randInt(); + int mLevel = level.randInt(); + + int mCount = count.randInt(); + double mHealthMul = healthMul.randDouble(); + + double mSpeed = speed.randDouble(); + + for (int i = 0; i < mCount; i++) { + Coord mPos = new Coord(x.randDouble(), 0, z.randDouble()); + + if (!uniform) { + mVariant = variant.randInt(); + mLevel = level.randInt(); + mSpeed = speed.randDouble(); + mHealthMul = healthMul.randDouble(); + } + + spawnEntity(mPos, mVariant, mLevel, mSpeed, mHealthMul); + } + + return true; + } + + if (formation.equals("row")) { + + int mVariant = variant.randInt(); + int mLevel = level.randInt(); + + int mCount = count.randInt(); + + double mDist = dist.randDouble(); + double mSpeed = speed.randDouble(); + double mHealthMul = healthMul.randDouble(); + + double width = mDist * mCount; + + Entity[] pieces = new Entity[mCount]; + Coord mPos = new Coord(x.randDouble(), 0, z.randDouble()); + for (int i = 0; i < mCount; i++) { + + if (!uniform) { + mVariant = variant.randInt(); + mLevel = level.randInt(); + mSpeed = speed.randDouble(); + mHealthMul = healthMul.randDouble(); + } + + EntityNavigable en = spawnEntity(mPos.add(-width / 2 + i * mDist, 0, 0), mVariant, mLevel, mSpeed, mHealthMul); + + en.setFormation(pieces, EFormation.SHAPE); + pieces[i] = en; + } + + return true; + } + + if (formation.equals("line")) { + + int mVariant = variant.randInt(); + int mLevel = level.randInt(); + + int mCount = count.randInt(); + + double mDist = dist.randDouble(); + double mSpeed = speed.randDouble(); + double mHealthMul = healthMul.randDouble(); + + Coord mPos = new Coord(x.randDouble(), 0, z.randDouble()); + + Entity[] pieces = new Entity[mCount]; + for (int i = 0; i < mCount; i++) { + + if (!uniform) { + mVariant = variant.randInt(); + mLevel = level.randInt(); + mDist = dist.randDouble(); + mSpeed = speed.randDouble(); + mHealthMul = healthMul.randDouble(); + } + + EntityNavigable en = spawnEntity(mPos, mVariant, mLevel, mSpeed, mHealthMul); + + en.setFormation(pieces, EFormation.SHAPE); + pieces[i] = en; + + mPos.add_ip(0, 0, -mDist); + } + + return true; + } + + if (formation.equals("snake") || formation.equals("swarm") || formation.equals("leader")) { + boolean swarm = (formation.equals("swarm") || formation.equals("leader")); + Coord mPos = new Coord(x.randDouble(), 0, z.randDouble()); + double mDist = dist.randDouble(); + int mVariant = variant.randInt(); + int mLevel = level.randInt(); + double mSpeed = speed.randDouble(); + double mHealthMul = healthMul.randDouble(); + + int mCount = count.randInt(); + + Entity[] pieces = new Entity[mCount]; + + for (int i = 0; i < mCount; i++) { + if (swarm) mPos = new Coord(x.randDouble(), 0, z.randDouble()); + + if (!uniform) { + mDist = dist.randDouble(); + mVariant = variant.randInt(); + mLevel = level.randInt(); + mSpeed = speed.randDouble(); + mHealthMul = healthMul.randDouble(); + } + + EntityNavigable en = spawnEntity(mPos, mVariant, mLevel, mSpeed, mHealthMul); + + en.setFormation(pieces, swarm ? EFormation.SWARM : EFormation.SNAKE); + pieces[i] = en; + + mPos.add_ip(0, 0, -mDist); + } + + return true; + } + + + + return true; + } + + + private EntityNavigable spawnEntity(Coord mPos, int mVariant, int mLevel, double mSpeed, double healthMul) { + EntityNavigable en = EntityRegistry.buildEntity(entity, size.randDouble(), mPos); + + if (driver != null) en.setDriver(getDriverStore().getDriver(driver)); + en.setShipLevel(mLevel); + en.setShipVariant(mVariant); + en.setStableSpeedMultiplier(mSpeed); + en.healthMul = healthMul; + if (artifact > 0) en.addArtifacts(artifact); + + getScene().add(en); + if (wave != null) getLevel().addToWave(wave, en); + + return en; + } + + +} diff --git a/src/net/sector/level/sequence/nodes/NodeSpawnerDisable.java b/src/net/sector/level/sequence/nodes/NodeSpawnerDisable.java new file mode 100644 index 0000000..1a3dc31 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeSpawnerDisable.java @@ -0,0 +1,52 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; + +import org.jdom2.Attribute; +import org.jdom2.Element; + + +/** + * "Enable spawner" node + * + * @author MightyPork + */ +public class NodeSpawnerDisable extends LevelNodeBase { + + private String spawnerName = ""; + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeSpawnerDisable(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = tag.getAttribute("id"); + if (a == null) a = tag.getAttribute("name"); + if (a == null) a = tag.getAttribute("spawner"); + if (a == null) a = tag.getAttribute("gen"); + if (a == null) a = tag.getAttribute("generator"); + + spawnerName = a.getValue(); + } + + @Override + public boolean execute() { + + getLevel().enableSpawner(spawnerName, false); + + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeSpawnerEnable.java b/src/net/sector/level/sequence/nodes/NodeSpawnerEnable.java new file mode 100644 index 0000000..0e91bb9 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeSpawnerEnable.java @@ -0,0 +1,53 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; + +import org.jdom2.Attribute; +import org.jdom2.Element; + + +/** + * "Enable spawner" node + * + * @author MightyPork + */ +public class NodeSpawnerEnable extends LevelNodeBase { + + private String spawnerName = ""; + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + * @param xmlTag xml tag this node is loading from + */ + public NodeSpawnerEnable(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = tag.getAttribute("id"); + if (a == null) a = tag.getAttribute("name"); + if (a == null) a = tag.getAttribute("spawner"); + if (a == null) a = tag.getAttribute("gen"); + if (a == null) a = tag.getAttribute("generator"); + + spawnerName = a.getValue(); + } + + @Override + public boolean execute() { + + getLevel().enableSpawner(spawnerName, true); + + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeTimerPause.java b/src/net/sector/level/sequence/nodes/NodeTimerPause.java new file mode 100644 index 0000000..bdb3808 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeTimerPause.java @@ -0,0 +1,38 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; + +import org.jdom2.Element; + + +/** + * "Pause" node + * + * @author MightyPork + */ +public class NodeTimerPause extends LevelNodeBase { + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeTimerPause(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) {} + + @Override + public boolean execute() { + if (getLevel().hasTimer()) getLevel().getTimer().pause(); + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeTimerRemove.java b/src/net/sector/level/sequence/nodes/NodeTimerRemove.java new file mode 100644 index 0000000..a02d092 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeTimerRemove.java @@ -0,0 +1,38 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; + +import org.jdom2.Element; + + +/** + * "Pause" node + * + * @author MightyPork + */ +public class NodeTimerRemove extends LevelNodeBase { + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeTimerRemove(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) {} + + @Override + public boolean execute() { + getLevel().setTimer(null); + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeTimerRestart.java b/src/net/sector/level/sequence/nodes/NodeTimerRestart.java new file mode 100644 index 0000000..f9964c8 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeTimerRestart.java @@ -0,0 +1,38 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; + +import org.jdom2.Element; + + +/** + * "Pause" node + * + * @author MightyPork + */ +public class NodeTimerRestart extends LevelNodeBase { + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeTimerRestart(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) {} + + @Override + public boolean execute() { + if (getLevel().hasTimer()) getLevel().getTimer().restart(); + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeTimerResume.java b/src/net/sector/level/sequence/nodes/NodeTimerResume.java new file mode 100644 index 0000000..1d34873 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeTimerResume.java @@ -0,0 +1,38 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.sequence.LevelController; + +import org.jdom2.Element; + + +/** + * "Pause" node + * + * @author MightyPork + */ +public class NodeTimerResume extends LevelNodeBase { + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeTimerResume(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() {} + + @Override + public void loadFromXml(Element tag) {} + + @Override + public boolean execute() { + if (getLevel().hasTimer()) getLevel().getTimer().resume(); + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeTimerSetup.java b/src/net/sector/level/sequence/nodes/NodeTimerSetup.java new file mode 100644 index 0000000..4e35d23 --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeTimerSetup.java @@ -0,0 +1,66 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.sequence.LevelController; +import net.sector.level.sequence.LevelTimer; + +import org.jdom2.Attribute; +import org.jdom2.Element; + + +/** + * "Setup Timer" node + * + * @author MightyPork + */ +public class NodeTimerSetup extends LevelNodeBase { + + private int secs = 0; + private boolean done = false; + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeTimerSetup(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() { + done = false; + } + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = tag.getAttribute("secs"); + if (a == null) a = tag.getAttribute("seconds"); + if (a == null) a = tag.getAttribute("time"); + if (a == null) a = tag.getAttribute("t"); + if (a == null) a = tag.getAttribute("i"); + if (a == null) a = tag.getAttribute("n"); + if (a == null) a = tag.getAttribute("sec"); + + secs = AiObjParser.getInteger(a.getValue(), 1); + } + + @Override + public boolean execute() { + + if (!done) { + LevelTimer t = new LevelTimer(secs); + t.start(); + + getLevel().setTimer(t); + + done = true; + } + + return true; + } + +} diff --git a/src/net/sector/level/sequence/nodes/NodeWait.java b/src/net/sector/level/sequence/nodes/NodeWait.java new file mode 100644 index 0000000..4a6c6be --- /dev/null +++ b/src/net/sector/level/sequence/nodes/NodeWait.java @@ -0,0 +1,95 @@ +package net.sector.level.sequence.nodes; + + +import net.sector.Constants; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.sequence.LevelController; + +import org.jdom2.Attribute; +import org.jdom2.Element; + +import com.porcupine.util.StringUtils; + + +/** + * "Pause" node + * + * @author MightyPork + */ +public class NodeWait extends LevelNodeBase { + + private String waveWait = null; + private int ticks = 0; + private int i = 0; + private boolean infinite; + + /** + * Create "spawner enable" node + * + * @param parent parent node + * @param level level controller + */ + public NodeWait(LevelNodeBase parent, LevelController level) { + super(parent, level); + } + + @Override + public void reset() { + i = -1; + } + + @Override + public void loadFromXml(Element tag) { + Attribute a; + a = tag.getAttribute("secs"); + if (a == null) a = tag.getAttribute("seconds"); + if (a == null) a = tag.getAttribute("time"); + if (a == null) a = tag.getAttribute("t"); + if (a == null) a = tag.getAttribute("i"); + if (a == null) a = tag.getAttribute("n"); + if (a == null) a = tag.getAttribute("sec"); + + if (a == null) { + a = tag.getAttribute("wave"); + if (a == null) a = tag.getAttribute("group"); + if (a == null) a = tag.getAttribute("for"); + + if (a != null) { + waveWait = a.getValue().toLowerCase().trim(); + return; + } + } + + if (a == null || StringUtils.isInArray(a.getValue(), false, "-1", "inf", "infinite", "forever", "4ever")) { + infinite = true; + return; + } + + ticks = (int) (AiObjParser.getDouble(a.getValue(), 1) * Constants.FPS_UPDATE); + } + + @Override + public boolean execute() { + + if (infinite) return false; + + if (waveWait != null) { + //if(waveWait.equals("boss")) System.out.println("Wait for wave: "+waveWait); + if (getLevel().isWaveDead(waveWait)) { + //System.out.println("Wave "+waveWait+" erradicated."); + return true; + } + //if(waveWait.equals("boss")) System.out.println(getLevel().getWave(waveWait)); + return false; + } + + i++; + if (i >= ticks) { + i = 0; + return true; + } + + return false; + } + +} diff --git a/src/net/sector/level/ship/DiscoveryRegistry.java b/src/net/sector/level/ship/DiscoveryRegistry.java new file mode 100644 index 0000000..3840545 --- /dev/null +++ b/src/net/sector/level/ship/DiscoveryRegistry.java @@ -0,0 +1,276 @@ +package net.sector.level.ship; + + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import net.sector.util.Log; + +import com.porcupine.math.Calc; +import com.porcupine.math.Range; +import com.porcupine.util.VarargsParser; + + +/** + * Discovery registry. + * + * @author MightyPork + */ +public class DiscoveryRegistry { + private static Map discoveries = new HashMap(); + + /** + * initialize static fields + */ + public static void init() { + Log.f1("Initializing discovery registry..."); + + //@formatter:off + + // ship systems + registerDiscovery("shield", "Force Shield", 0, 9); + registerDiscovery("energy", "Energy System", 1, 9); + + // piece discoveries + registerDiscovery("body", "Body", 1, 3); + + registerDiscovery("engineRocket", "Rocket Engine", 0, 6); + registerDiscovery("engineIon", "Ion Engine", 0, 6); + + registerDiscovery("cannon", "Cannon", 0, 6); + registerDiscovery("laser", "Laser Gun", 0, 6); + registerDiscovery("plasma", "Plasma Gun", 0, 6); + registerDiscovery("rocket", "Direct Rocket", 0, 6); + registerDiscovery("rocket_guided", "Guided Rocket", 0, 6, "rocket", 1); + registerDiscovery("emp", "EMP Weapon", 0, 6); + registerDiscovery("fireball", "Flamethrower", 0, 6); + + //@formatter:on + } + + /** + * Clamp level of discovery to legal range + * + * @param discovery discovery name + * @param level level to clamp + * @return clamped level + */ + public static int clampLevel(String discovery, int level) { + return Calc.clampi(level, getDiscoveryLevelRange(discovery)); + } + + /** + * Build discovery table with max levels and entries for all discoveries + * registered. + * + * @return the discovery table + */ + public static DiscoveryTable getDiscoveryTableMaximal() { + DiscoveryTable dt = new DiscoveryTable(); + for (Entry e : discoveries.entrySet()) { + dt.setDiscoveryLevel(e.getKey(), e.getValue().getLevelRange().getMaxI()); + } + return dt; + } + + /** + * Build discovery table with min levels and entries for all discoveries + * registered. Energy level is forced to 1. + * + * @return the discovery table + */ + public static DiscoveryTable getDiscoveryTableMinimal() { + DiscoveryTable dt = new DiscoveryTable(); + for (Entry e : discoveries.entrySet()) { + dt.setDiscoveryLevel(e.getKey(), e.getValue().getLevelRange().getMinI()); + } + dt.setDiscoveryLevel("energy", 1); + return dt; + } + + /** + * @param id discovery id + * @param entry discovery entry + */ + public static void registerDiscovery(String id, DiscoveryEntry entry) { + discoveries.put(id, entry); + } + + /** + * Register a discovery + * + * @param id discovery id + * @param label human readable label + * @param level range (min - max) level + * @param requirements varargs of requirements, eg. "DiscA", 1, "DiscB", + * 3... + */ + public static void registerDiscovery(String id, String label, Range level, Object... requirements) { + registerDiscovery(id, new DiscoveryEntry(label, level, requirements)); + } + + /** + * Register a discovery + * + * @param id discovery id + * @param label human readable label + * @param minLevel minimal level + * @param maxLevel maximal level + * @param requirements varargs of requirements, eg. "DiscA", 1, "DiscB", + * 3... + */ + public static void registerDiscovery(String id, String label, int minLevel, int maxLevel, Object... requirements) { + registerDiscovery(id, new DiscoveryEntry(label, minLevel, maxLevel, requirements)); + } + + + /** + * Get discovery level range + * + * @param discovery discovery id + * @return range (initial - max) + */ + public static Range getDiscoveryLevelRange(String discovery) { + return getDiscovery(discovery).getLevelRange(); + } + + + /** + * Get min discovery level + * + * @param discovery discovery id + * @return min level + */ + public static int getDiscoveryLevelMin(String discovery) { + return getDiscoveryLevelRange(discovery).getMinI(); + } + + + /** + * Get max discovery level + * + * @param discovery discovery id + * @return max level + */ + public static int getDiscoveryLevelMax(String discovery) { + return getDiscoveryLevelRange(discovery).getMaxI(); + } + + + /** + * Get if a discovery exists + * + * @param discovery discovery id + * @return exists + */ + public static boolean discoveryExists(String discovery) { + return discoveries.containsKey(discovery); + } + + + /** + * Get discovery entry + * + * @param id discovery id + * @return discovery entry + */ + private static DiscoveryEntry getDiscovery(String id) { + DiscoveryEntry de = discoveries.get(id); + if (de == null) Log.w("No such discovery: " + id); + + return de; + } + + + /** + * Get if discovery is available for discovering (dependencies met) + * + * @param discovery discovery id + * @param table discovery table to look in + * @return is available + */ + public static boolean isDiscoveryAvailable(String discovery, DiscoveryTable table) { + return getDiscovery(discovery).isAvailable(table); + } + + + + /** + * Discovery entry for Discovery Registry + * + * @author MightyPork + */ + public static class DiscoveryEntry { + private String label; + private HashMap dependencies = new HashMap(); + private Range level = new Range(0, 1); + + /** + * Create a new discovery descriptor + * + * @param label Human readable labe + * @param minLevel minimal (initial) level + * @param maxLevel maximal level + * @param requirements varargs of requirements, eg. "DiscA", 1, "DiscB", + * 3, "DiscX", 6 + */ + public DiscoveryEntry(String label, int minLevel, int maxLevel, Object... requirements) { + this(label, new Range(minLevel, maxLevel), requirements); + } + + /** + * Create a new discovery descriptor + * + * @param label Human readable labe + * @param level level range (initial - max) + * @param requirements varargs of requirements, eg. "DiscA", 1, "DiscB", + * 3, "DiscX", 6 + */ + public DiscoveryEntry(String label, Range level, Object... requirements) { + this.label = label; + this.level.setTo(level); + + dependencies = new VarargsParser().parse(requirements); + +// System.out.println(); +// System.out.println("Discovery "+label+", range "+level); +// System.out.println("Dep = "+dependencies); +// System.out.println(); + } + + /** + * Get if this discovery is available for a discovery table + * + * @param table the discovery table to check + * @return is available for discovering + */ + public boolean isAvailable(DiscoveryTable table) { + + for (Entry e : dependencies.entrySet()) { + if (table.get(e.getKey()) < e.getValue()) return false; + } + + return true; + } + + /** + * Get level range + * + * @return level range (initial - max) + */ + public Range getLevelRange() { + return level; + } + + /** + * Get human readable label + * + * @return the label + */ + public String getLabel() { + return label; + } + } + +} diff --git a/src/net/sector/level/ship/DiscoveryTable.java b/src/net/sector/level/ship/DiscoveryTable.java new file mode 100644 index 0000000..9814378 --- /dev/null +++ b/src/net/sector/level/ship/DiscoveryTable.java @@ -0,0 +1,141 @@ +package net.sector.level.ship; + + +import java.util.HashMap; +import java.util.Map; + +import net.sector.util.Log; + + +/** + * Table of discoveries + * + * @author MightyPork + */ +public class DiscoveryTable extends HashMap { + + /** + * Table of discoveries - empty + */ + public DiscoveryTable() {} + + + /** + * Table of discoveries - as copy of other map + * + * @param copied copied map of discovery levels + */ + public DiscoveryTable(Map copied) { + super(copied); + } + + /** + * Check if piece is discovered + * + * @param pieceName piece name + * @return is discovered + */ + public boolean isPieceDiscovered(String pieceName) { + return getDiscoveryLevelForPiece(pieceName) > 0; + } + + /** + * Check if piece is discovered + * + * @param discovery discovery + * @return is discovered + */ + public boolean isDiscovered(String discovery) { + return getDiscoveryLevel(discovery) > 0; + } + + /** + * Get discovery level for piece name + * + * @param pieceName piece name + * @return max level discovered + */ + public int getDiscoveryLevelForPiece(String pieceName) { + String discovery = PieceRegistry.getPieceDiscoveryKey(pieceName); + return getDiscoveryLevel(discovery); + } + + /** + * Get discovered level for discovery key + * + * @param discovery discovery key + * @return level + */ + public int getDiscoveryLevel(String discovery) { + if (!containsKey(discovery)) { + Log.w("DiscoveryTable: requested discovery level of unregistered discovery " + discovery); + return 0; + } + return get(discovery); + } + + /** + * Set discovery level (when building table) + * + * @param discovery discovery key + * @param levelToSet levels discovered total to set + */ + public void setDiscoveryLevel(String discovery, int levelToSet) { + int level = DiscoveryRegistry.clampLevel(discovery, levelToSet); + put(discovery, level); + } + + /** + * Add discovery levels (when artifact is collected) + * + * @param discovery discovery key + * @param levelsToAdd new levels discovered + */ + public void addDiscoveryLevel(String discovery, int levelsToAdd) { + int level = getDiscoveryLevel(discovery); + setDiscoveryLevel(discovery, level + levelsToAdd); + } + + /** + * Get copy + * + * @return copy + */ + public DiscoveryTable copy() { + return new DiscoveryTable(this); + } + + /** + * Get max level a discovery can reach (total limit) + * + * @param discovery discovery id + * @return the limit + */ + public static int getDiscoveryLevelMax(String discovery) { + return DiscoveryRegistry.getDiscoveryLevelRange(discovery).getMaxI(); + } + + /** + * Get if discovery is available for discovering (if dependencies are met) + * + * @param discovery discovery id + * @return is available + */ + public boolean isDiscoveryAvailable(String discovery) { + return DiscoveryRegistry.isDiscoveryAvailable(discovery, this); + } + + /** + * Get if can discover given discovery (if it makes sense to spend artifact + * on this) + * + * @param discovery discovery id + * @return can be discovered + */ + public boolean canDiscover(String discovery) { + if (!isDiscoveryAvailable(discovery)) return false; + return getDiscoveryLevel(discovery) < getDiscoveryLevelMax(discovery); + } + + +} diff --git a/src/net/sector/level/ship/PieceBundle.java b/src/net/sector/level/ship/PieceBundle.java new file mode 100644 index 0000000..8739d27 --- /dev/null +++ b/src/net/sector/level/ship/PieceBundle.java @@ -0,0 +1,272 @@ +package net.sector.level.ship; + + +import java.util.Random; + +import net.sector.input.TriggerBundle; +import net.sector.level.ship.modules.pieces.Piece; + +import com.porcupine.math.Calc; + + +/** + * Object describing ship piece + * + * @author MightyPork + */ +public class PieceBundle { + /** RNG */ + public static Random rand = new Random(); + + /** Base cost (at level 1) */ + public int baseCost = 0; + /** Piece health */ + public double health = 10; + /** Piece health max */ + public double healthMax = 10; + /** Current piece level */ + public int level = 1; + /** Highest level possible */ + public int levelMax = 1; + /** Piece name */ + public String id = ""; + /** Piece rotation (CCW, deg) */ + public int rotate = 0; + /** Smoothest piece rotation step (in designer) */ + public int rotStep = 90; + /** Flag that this is an engine */ + public boolean typeEngine = false; + /** Flag that this is a weapon */ + public boolean typeWeapon = false; + /** Flag that this is a body piece */ + public boolean typeBody = false; + /** Assigned trigger bundle */ + public TriggerBundle trigger = null; + /** Flag that this piece is controlled */ + public boolean hasTrigger = false; + + @Override + protected PieceBundle clone() throws CloneNotSupportedException { + return new PieceBundle(this); + } + + /** + * Create new bundle from piece + * + * @param p piece + */ + public PieceBundle(Piece p) { + this.id = PieceRegistry.getPieceName(p); + level = p.getLevel(); + levelMax = p.getLevelMax(); + health = p.getHealth(); + healthMax = p.getHealthMax(); + rotate = (int) p.getPieceRotate(); + rotStep = p.getPieceRotateStep(); + baseCost = p.getBaseCost(); + typeEngine = p.isEngine(); + typeWeapon = p.isWeapon(); + typeBody = p.isBody(); + hasTrigger = p.hasTrigger(); + if (hasTrigger) trigger = p.getTrigger().copy(); + } + + /** + * Create piece as copy of another + * + * @param other + */ + public PieceBundle(PieceBundle other) { + id = other.id; + level = other.level; + levelMax = other.levelMax; + health = other.health; + healthMax = other.healthMax; + rotate = other.rotate; + rotStep = other.rotStep; + baseCost = other.baseCost; + typeWeapon = other.typeWeapon; + typeEngine = other.typeEngine; + typeBody = other.typeBody; + hasTrigger = other.hasTrigger; + if (hasTrigger) trigger = other.trigger.copy(); + } + + /** + * Create piece for name + * + * @param id + */ + public PieceBundle(String id) { + this(PieceRegistry.makePiece(id)); + } + + /** + * Create new bundle + * + * @param id name + * @param level level + * @param rotate rotation + */ + public PieceBundle(String id, int level, int rotate) { + this.id = id; + this.level = level; + this.rotate = rotate; + fixFieldValuesSetMaxHealth(); + } + + /** + * Create new bundle + * + * @param id name + * @param level level + * @param rotate rotation + * @param health health + */ + public PieceBundle(String id, int level, int rotate, double health) { + this.id = id; + this.level = level; + this.rotate = rotate; + fixFieldValuesSetMaxHealth(); + this.health = Calc.clampd(health, 0, this.healthMax); + } + + /** + * Check if piece can be downgraded + * + * @return state + */ + public boolean canBeDowngraded() { + return level > 1; + } + + /** + * Check if piece can be upgraded + * + * @return state + */ + public boolean canBeUpgraded() { + return level < levelMax; + } + + + /** + * Duplicate + * + * @return copy + */ + public PieceBundle copy() { + return new PieceBundle(this); + } + + /** + * Get how much a level change would cost + * + * @param side 1 for upgrade, -1 for downgrade + * @return cost price (positive = consumed, negative = gained, 0 = not + * applicable) + */ + public int getLevelChangeCost(int side) { + if (side > 0 && !canBeUpgraded()) return 0; + if (side < 0 && !canBeDowngraded()) return 0; + return PieceRegistry.getLevelChangeCost(baseCost, level, level + (side > 0 ? 1 : -1)); + } + + /** + * Get how much a piece repair would cost + * + * @return price + */ + public int getRepairCost() { + return PieceRegistry.getRepairCost(baseCost, level, health, healthMax); + } + + /** + * Get piece total value + * + * @return total value + */ + public int getTotalValue() { + return PieceRegistry.getPieceCost(baseCost, level, health, healthMax); + } + + /** + * Check if piece is damaged + * + * @return is damaged + */ + public boolean isDamaged() { + return health < healthMax; + } + + /** + * Get has trigger + * + * @return has trigger + */ + public boolean hasTrigger() { + return hasTrigger; + } + + /** + * Get trigger + * + * @return trigger + */ + public TriggerBundle getTrigger() { + return trigger; + } + + /** + * Set trigger replacement if already has some + * + * @param trigger the new trigger + */ + public void setTrigger(TriggerBundle trigger) { + if (hasTrigger) this.trigger = trigger.copy(); + + } + + /** + * Create actual piece + * + * @return piece + */ + public Piece toPiece() { + Piece p = PieceRegistry.makePiece(id, level, rotate); + p.setHealth(health); + if (hasTrigger) p.setTrigger(trigger); + return p; + } + + /** + * Update after level change, fix invalid values and update MAX fields. Sets + * health to healthMax + */ + public void fixFieldValuesSetMaxHealth() { + Piece p = PieceRegistry.makePiece(id, level, rotate); + + level = p.getLevel(); + levelMax = p.getLevelMax(); + health = p.getHealth(); + healthMax = p.getHealthMax(); + //rotate = (int) p.getPieceRotate(); + rotStep = p.getPieceRotateStep(); + baseCost = p.getBaseCost(); + + typeEngine = p.isEngine(); + typeWeapon = p.isWeapon(); + typeBody = p.isBody(); + + hasTrigger = p.hasTrigger(); + if (hasTrigger && trigger == null) trigger = p.getTrigger().copy(); + + p = null; + } + + @Override + public String toString() { + return "PB:" + id + ",l=" + level; + } + +} diff --git a/src/net/sector/level/ship/PieceRegistry.java b/src/net/sector/level/ship/PieceRegistry.java new file mode 100644 index 0000000..a3285b3 --- /dev/null +++ b/src/net/sector/level/ship/PieceRegistry.java @@ -0,0 +1,399 @@ +package net.sector.level.ship; + + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; + +import net.sector.level.ship.modules.pieces.Piece; +import net.sector.level.ship.modules.pieces.body.*; +import net.sector.level.ship.modules.pieces.weapons.*; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.Log; + +import com.porcupine.color.RGB; +import com.porcupine.math.Calc; + + +/** + * Table of pieces. + * + * @author MightyPork + */ +public class PieceRegistry { + + public static class PieceEntry { + public String id; + public String discovery; + public String group; + public String label; + public RenderModel model; + public int baseCost; + public Class pieceClass; + + public PieceEntry(String id, String discovery, String pieceGroup, String label, Class pieceClass) { + this.discovery = discovery; + this.group = pieceGroup; + this.label = label; + this.pieceClass = pieceClass; + this.id = id; + + try { + Piece inst = pieceClass.newInstance(); + model = inst.getModel(); + baseCost = inst.getBaseCost(); + } catch (InstantiationException e) { + Log.e("Error registering piece.", e); + } catch (IllegalAccessException e) { + Log.e("Error registering piece.", e); + } + } + } + + /** Human readable labels for piece groups */ + public static LinkedHashMap groups = new LinkedHashMap(); + + public static Map pieces = new LinkedHashMap(); + + public static String designerDefaultGroup = null; + + + + /** + * initialize static fields + */ + public static void init() { + Log.f1("Initializing PieceRegistry..."); + + //@formatter:off + + + String gBODY, gWEAPONS, gENGINES; + // piece groups + registerPieceGroup(gBODY = "body", "Body"); + registerPieceGroup(gWEAPONS = "weapons", "Guns"); + registerPieceGroup(gENGINES = "propulsion", "Engines"); + + + String dBODY, dENGINE_R, dENGINE_I, dCANNON, dLASER, dPLASMA, dEMP, dFIRE, dROCKET, dROCKET_G; + + // piece discoveries + dBODY = "body"; + + dENGINE_R = "engineRocket"; + dENGINE_I = "engineIon"; + + dCANNON = "cannon"; + dLASER = "laser"; + dPLASMA = "plasma"; + dROCKET = "rocket"; + dROCKET_G = "rocket_guided"; + dEMP = "emp"; + dFIRE = "fireball"; + + + // pieces + + // body box + registerPiece("bb_cube", dBODY, gBODY, "Cube", PieceBbCube.class); + registerPiece("bb_triangle", dBODY, gBODY, "Triangle", PieceBbTriangle.class); + registerPiece("bb_arrow", dBODY, gBODY, "Arrow", PieceBbArrow.class); + registerPiece("bb_point", dBODY, gBODY, "Point", PieceBbPoint.class); + + // body smooth + // one side + registerPiece("bs_side1", dBODY, gBODY, "Border 1 side", PieceBsSide1.class); + registerPiece("bs_side2_next", dBODY, gBODY, "Border 2 sides next", PieceBsSide2Next.class); + registerPiece("bs_side2_opp", dBODY, gBODY, "Border 2 sides opposite", PieceBsSide2Opp.class); + registerPiece("bs_side3", dBODY, gBODY, "Border 3 sides", PieceBsSide3.class); + registerPiece("bs_corner1", dBODY, gBODY, "Border 1 corner", PieceBsCorner1.class); + registerPiece("bs_corner2_next", dBODY, gBODY, "Border 2 corners next", PieceBsCorner2Next.class); + registerPiece("bs_corner2_opp", dBODY, gBODY, "Border 2 corners opposite", PieceBsCorner2Opp.class); + registerPiece("bs_corner3", dBODY, gBODY, "Border 3 corners", PieceBsCorner3.class); + registerPiece("bs_corner4", dBODY, gBODY, "Border 4 corners", PieceBsCorner4.class); + registerPiece("bs_corner1_side1", dBODY, gBODY, "Border 1 corner 1 side", PieceBsCorner1Side1.class); + registerPiece("bs_corner1_side1_m", dBODY, gBODY, "Border 1 corner 1 side", PieceBsCorner1Side1M.class); + registerPiece("bs_corner2_side1", dBODY, gBODY, "Border 2 corners 1 side", PieceBsCorner2Side1.class); + registerPiece("bs_corner1_side2", dBODY, gBODY, "Border 1 corner 2 side", PieceBsCorner1Side2.class); + registerPiece("bs_point", dBODY, gBODY, "Border Point", PieceBsPoint.class); + registerPiece("bs_triangle", dBODY, gBODY, "Border Triangle", PieceBsTriangle.class); + + + //body wing + registerPiece("bw_cube", dBODY, gBODY, "Square Wing", PieceBwCube.class); + registerPiece("bw_triangle", dBODY, gBODY, "Triangle Wing", PieceBwCorner.class); + registerPiece("bw_arrow", dBODY, gBODY, "Arrow Wing", PieceBwPoint.class); + + // engine + registerPiece("engine_rocket", dENGINE_R, gENGINES, "Rocket Engine", PieceEngineRocket.class); + registerPiece("engine_ion", dENGINE_I, gENGINES, "Ion Engine", PieceEngineIon.class); + + // weapons + registerPiece("w_cannon", dCANNON, gWEAPONS, "Cannon", PieceCannon.class); + registerPiece("w_laser", dLASER, gWEAPONS, "Laser Gun", PieceLaser.class); + registerPiece("w_plasma", dPLASMA, gWEAPONS, "Plasma Gun", PiecePlasmaGun.class); + registerPiece("w_emp", dEMP, gWEAPONS, "EMP Launcher", PieceEMPGun.class); + registerPiece("w_rocket", dROCKET, gWEAPONS, "Rocket Launcher", PieceRocketLauncher.class); + registerPiece("w_rocket_g", dROCKET_G, gWEAPONS, "Guided Rocket Launcher", PieceRocketLauncherGuided.class); + registerPiece("w_fireball", dFIRE, gWEAPONS, "Flamethrower", PieceFlamethrower.class); + + //@formatter:on + } + + /** + * Get piece damage color. + * + * @param health piece health + * @param healthMax max health + * @return color + */ + public static RGB getDamageColor(double health, double healthMax) { + RGB clr = new RGB(0, 0, 0); + double yellow = healthMax * 0.7; + if (health <= yellow) { + clr.r = 1; + clr.g = health / yellow; + } else if (health < healthMax) { + clr.r = Calc.clampd(1 - (health - yellow) / yellow, 0, 1); + clr.g = 1; + } else { + clr.r = 0; + clr.g = 1; + } + return clr; + } + +// +// /** +// * Register discoverable key +// * +// * @param id discovery key +// * @param label human readable discovery name +// * @param defaultLevel initial discovery level (0 = unavailable) +// * @param maxLevel max discovery level +// * @param dependencies dependencies name, level, name, level... +// */ +// public static void registerDiscovery(String id, String label, int defaultLevel, int maxLevel, Object... dependencies) { +// +// DiscoveryRegistry.registerDiscovery(id, label, defaultLevel, maxLevel, dependencies); +// } + + /** + * Register piece group + * + * @param id group name + * @param label human readable label + */ + public static void registerPieceGroup(String id, String label) { + groups.put(id, label); + if (designerDefaultGroup == null) designerDefaultGroup = id; + } + + /** + * Register new piece + * + * @param id unique identifier + * @param discovery key for discovery table + * @param group piece group + * @param label label for ship designer and similar + * @param pieceClass class of the piece + */ + public static void registerPiece(String id, String discovery, String group, String label, Class pieceClass) { + + pieces.put(id, new PieceEntry(id, discovery, group, label, pieceClass)); + + if (!DiscoveryRegistry.discoveryExists(discovery)) { + Log.w("Ship piece " + id + " registered with unknown discovery key " + discovery + "!"); + } + + } + + /** + * Get piece name from piece instance. + * + * @param p piece instance + * @return name + */ + public static String getPieceName(Piece p) { + for (Entry entry : pieces.entrySet()) { + if (p.getClass() == entry.getValue().pieceClass) return entry.getKey(); + } + throw new RuntimeException("Class of piece " + p + " could not be resolved."); + } + + /** + * Get maximal level for piece instance + * + * @param piece piece instance + * @return piece max level + */ + public final static int getPieceLevelMax(Piece piece) { + String pieceName = getPieceName(piece); + return getPieceLevelMax(pieceName); + } + + /** + * Get maximal level for piece name + * + * @param id piece name + * @return max level + */ + public static int getPieceLevelMax(String id) { + String discoveryName = getPieceDiscoveryKey(id); + return DiscoveryRegistry.getDiscoveryLevelMax(discoveryName); + } + + /** + * Build new ship piece for name + * + * @param id piece name + * @return the piece + */ + public static Piece makePiece(String id) { + return makePiece(id, 1, 0); + } + + /** + * Build new ship piece for name + * + * @param id piece name + * @param level piece level + * @return the piece + */ + public static Piece makePiece(String id, int level) { + return makePiece(id, level, 0); + } + + /** + * Build new ship piece for name + * + * @param id piece name + * @param level piece level + * @param rotate piece rotate + * @return the piece + */ + public static Piece makePiece(String id, int level, int rotate) { + try { + Piece p = pieces.get(id).pieceClass.newInstance(); + p.setPieceRotate(rotate); + p.setLevel(level); + return p; + } catch (Exception e) { + Log.e("Cant make piece for: " + id); + throw new RuntimeException(e); + } + } + + /** + * Get model for piece + * + * @param id piece name + * @return the model + */ + public static RenderModel getModel(String id) { + return pieces.get(id).model; + } + + + /** + * Calculate how much upgrade / downgrade will cost. + * + * @param base base cost (level 1) + * @param from level from (before up/down-grade) + * @param to level to (after up/down-grade) + * @return cost (negative if money was returned) + */ + public static int getLevelChangeCost(int base, int from, int to) { + return (getLevelCost(base, to) - getLevelCost(base, from)); + } + + /** + * Get level cost + * + * @param base base cost (level 1) + * @param level current level + * @return cost + */ + public static int getLevelCost(int base, int level) { + return base * (level * level); + } + + /** + * Get how much repair will cost + * + * @param base base cost (level 1) + * @param level current level + * @param health health of the piece + * @param healthMax max piece health + * @return cost + */ + public static int getRepairCost(int base, int level, double health, double healthMax) { + return (int) Math.round(getLevelCost(base, level) * (1 - health / healthMax)); + } + + /** + * Get piece cost for selling + * + * @param base base cost (level 1) + * @param level current level + * @param health health of the piece + * @param healthMax max piece health + * @return total cost + */ + public static int getPieceCost(int base, int level, double health, double healthMax) { + return getLevelCost(base, level) - getRepairCost(base, level, health, healthMax); + } + + /** + * Get piece base cost for other calculations + * + * @param id piece name + * @return cost of level 1. + */ + public static int getBaseCost(String id) { + if (id.equals("")) return -1; + return pieces.get(id).baseCost; + } + + /** + * Get piece name for tooltip + * + * @param id name + * @return tooltip text + */ + public static String getPieceLabel(String id) { + return pieces.get(id).label; + } + + + /** + * Get piece group key + * + * @param id name + * @return group key + */ + public static String getPieceGroup(String id) { + return pieces.get(id).group; + } + + /** + * Get group label + * + * @param id key + * @return group label + */ + public static String getGroupLabel(String id) { + return groups.get(id); + } + + /** + * Get discovery key, discovery needed to buy piece (eg. "body","cannon") + * + * @param pieceName + * @return discovery key + */ + public static String getPieceDiscoveryKey(String pieceName) { + return pieces.get(pieceName).discovery; + } + +} diff --git a/src/net/sector/level/ship/ShipBundle.java b/src/net/sector/level/ship/ShipBundle.java new file mode 100644 index 0000000..804d788 --- /dev/null +++ b/src/net/sector/level/ship/ShipBundle.java @@ -0,0 +1,411 @@ +package net.sector.level.ship; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +import net.sector.input.TriggerBundle; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.loading.XmlUtil; +import net.sector.level.ship.modules.EnergySystem; +import net.sector.level.ship.modules.Shield; +import net.sector.util.Log; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.output.Format; +import org.jdom2.output.XMLOutputter; + +import com.porcupine.math.Calc; + + +/** + * Player ship bundle + * + * @author MightyPork + */ +public class ShipBundle { + + /** Ship design [Z][X] */ + public PieceBundle[][] ship = new PieceBundle[1][1]; + + /** Shield level */ + public int shieldLevel = 1; + + /** Energy level */ + public int energyLevel = 1; + + /** + * Create new ship bundle. + * + * @param shipBody ship design + * @param shield shields + * @param energy energy + */ + public ShipBundle(PieceBundle[][] shipBody, int shield, int energy) { + ship = shipBody; + if (ship == null) { + ship = new PieceBundle[][] { { null } }; + } + shieldLevel = shield; + energyLevel = energy; + } + + /** + * Create new ship bundle. + */ + public ShipBundle() {} + + + /** + * Create new context. + * + * @param other bundle to copy + */ + public ShipBundle(ShipBundle other) { + // copy the ship. + PieceBundle[][] newShip = new PieceBundle[other.ship.length][]; + for (int i = 0; i < other.ship.length; i++) + newShip[i] = other.ship[i].clone(); + ship = newShip; + + shieldLevel = other.shieldLevel; + energyLevel = other.energyLevel; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return copy(); + } + + /** + * Get power system level + * + * @return level + */ + public int getEnergyLevel() { + return energyLevel; + } + + /** + * Get shield level + * + * @return level + */ + public int getShieldLevel() { + return shieldLevel; + } + + /** + * Get ship design table + * + * @return table + */ + public PieceBundle[][] getShipDesign() { + return ship; + } + + /** + * Get copy + * + * @return copy + */ + public ShipBundle copy() { + return new ShipBundle(this); + } + + /** + * Write as XML to a stream + * + * @param out output stream + * @throws IOException on error + */ + public void xmlToStream(OutputStream out) throws IOException { + Document doc = new Document(); + Element root = new Element("ship"); + doc.setRootElement(root); + + + // write dimensions + Element dim = new Element("dim"); + dim.setAttribute("x", "" + ship[0].length); + dim.setAttribute("y", "" + ship.length); + root.addContent(dim); + + Element sys = new Element("sys"); + sys.setAttribute("energy", "" + energyLevel); + sys.setAttribute("shield", "" + shieldLevel); + root.addContent(sys); + + // write ship content + Element struct = new Element("struct"); + for (PieceBundle[] pbr : ship) { + + int notNull = 0; + for (PieceBundle pb : pbr) { + if (pb != null) notNull++; + } + + if (notNull == 0) { + struct.addContent(new Element("null")); + } else { + Element row = new Element("row"); + for (PieceBundle pb : pbr) { + if (pb == null) { + row.addContent(new Element("null")); + } else { + Element piece = new Element("piece"); + + piece.setAttribute("id", pb.id); + piece.setAttribute("level", pb.level + ""); + piece.setAttribute("rotate", pb.rotate + ""); + piece.setAttribute("health", pb.health + ""); + if (pb.hasTrigger) piece.setAttribute("trigger", pb.trigger.toString()); + row.addContent(piece); + } + } + struct.addContent(row); + } + } + root.addContent(struct); + + XMLOutputter outputter = new XMLOutputter(); + outputter.setFormat(Format.getPrettyFormat()); + outputter.output(doc, out); + } + + /** + * Get total ship & systems cost. + * + * @return total cost. + */ + public int getTotalCost() { + int cost = 0; + + cost += getShieldCost(); + cost += getEnergyCost(); + + // add cost of systems + + for (PieceBundle[] pbr : ship) { + for (PieceBundle pb : pbr) { + if (pb == null) { + continue; + } else { + cost += pb.getTotalValue(); + } + } + } + + return cost; + } + + /** + * Get shield price (level 1 to current level) + * + * @return shield price + */ + public int getShieldCost() { + if (shieldLevel > 0) return PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), 1, shieldLevel); + return 0; + } + + /** + * Get energy system price (level 1 to current level) + * + * @return energy price + */ + public int getEnergyCost() { + if (energyLevel > 0) return PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), 1, energyLevel); + return 0; + } + + /** + * Reduce shield and energy and piece levels to match discovery table (set + * pieces to nuill if not discovered). + * + * @param dt discovery table. + */ + public void reduceForDiscoveryTable(DiscoveryTable dt) { + int yy = 0; + for (PieceBundle[] pbr : ship) { + int xx = 0; + for (PieceBundle pb : pbr) { + if (pb == null) { + xx++; + continue; + } else { + if (dt.getDiscoveryLevelForPiece(pb.id) >= 1) { + pb.level = Calc.clampi(pb.level, 1, dt.getDiscoveryLevelForPiece(pb.id)); + } else { + ship[yy][xx] = null; + } + } + xx++; + + } + yy++; + } + + if (dt.getDiscoveryLevel("shield") == 0) { + shieldLevel = 0; + } else { + shieldLevel = Calc.clampi(shieldLevel, 1, dt.getDiscoveryLevel("shield")); + } + energyLevel = Calc.clampi(energyLevel, 1, dt.getDiscoveryLevel("energy")); + + } + + /** + * Try to decrease piece levels / system levels so that the total cost fits + * into a given limit.
+ * If it isn't possible, erase the ship bundle. + * + * @param cost max total cost + */ + public void reduceForTotalCost(int cost) { + + ArrayList pieces = new ArrayList(); + for (PieceBundle[] pbr : ship) { + for (PieceBundle pb : pbr) { + if (pb == null) { + continue; + } else { + pieces.add(pb); + } + } + } + + int iterations = 0; + while (true) { + iterations++; + + if (getTotalCost() <= cost) return; + + Collections.sort(pieces, new Comparator() { + @Override + public int compare(PieceBundle o1, PieceBundle o2) { + + Integer a = o1.getTotalValue(); + Integer b = o1.getTotalValue(); + + return -(a.compareTo(b)); + } + }); + + + + int max = pieces.get(0).getTotalValue(); + max = Math.max(max, getShieldCost()); + max = Math.max(max, getEnergyCost()); + + if (shieldLevel > 1 && getShieldCost() >= max) shieldLevel--; + + if (getTotalCost() <= cost) return; + + if (energyLevel > 1 && getEnergyCost() >= max) energyLevel--; + + if (getTotalCost() <= cost) return; + + for (PieceBundle pb : pieces) { + if (pb.getTotalValue() >= max && pb.level > 1) { + pb.level--; + + if (getTotalCost() <= cost) return; + } + } + + if (getTotalCost() <= cost) return; + + if (iterations > 500) { + Log.f3("Failed to reduce ship for cost " + cost + ", turning to nothing."); + + shieldLevel = 1; + energyLevel = 1; + + ship = new PieceBundle[1][1]; + + break; + } + } + } + + /** + * Create from XML node + * + * @param root ship design root node (<ship>) + * @return this + */ + public ShipBundle xmlFromElement(Element root) { + // get dimensions + Element dim = root.getChild("dim"); + int x = AiObjParser.getInteger(dim.getAttributeValue("x"), 1); + int y = AiObjParser.getInteger(dim.getAttributeValue("y"), 1); + + + // get system levels + Element sys = root.getChild("sys"); + energyLevel = AiObjParser.getInteger(sys.getAttributeValue("energy"), 1); + shieldLevel = AiObjParser.getInteger(sys.getAttributeValue("shield"), 1); + + + // write ship content + Element struct = root.getChild("struct"); + + + // load structure + ship = new PieceBundle[y][x]; + + int yy = 0; + int xx = 0; + for (Element row : struct.getChildren()) { + xx = 0; + if (row.getName().equals("row")) { + + for (Element piece : row.getChildren()) { + + // if "null", skip. + if (piece.getName().equals("piece")) { + String id = piece.getAttributeValue("id"); + int level = AiObjParser.getInteger(piece.getAttributeValue("level"), 1); + int rotate = AiObjParser.getInteger(piece.getAttributeValue("rotate"), 0); + int health = AiObjParser.getInteger(piece.getAttributeValue("health"), 1); + + PieceBundle pb; + pb = ship[yy][xx] = new PieceBundle(id, level, rotate, health); + if (pb.hasTrigger) { + String triggerText = piece.getAttributeValue("trigger"); + if (triggerText != null) { + TriggerBundle tb = new TriggerBundle().fromString(triggerText); + pb.setTrigger(tb); + } + } + } + + xx++; + } + } + yy++; + } + + return this; + } + + + /** + * Load from XML stream (file) + * + * @param in input stream + * @throws IOException on error + */ + public void xmlFromStream(InputStream in) throws IOException { + + Element root = XmlUtil.getRootElement(in); + + xmlFromElement(root); + } +} diff --git a/src/net/sector/level/ship/modules/EnergySystem.java b/src/net/sector/level/ship/modules/EnergySystem.java new file mode 100644 index 0000000..366d0ac --- /dev/null +++ b/src/net/sector/level/ship/modules/EnergySystem.java @@ -0,0 +1,130 @@ +package net.sector.level.ship.modules; + + +import net.sector.Constants; +import net.sector.level.ship.DiscoveryRegistry; + +import com.porcupine.math.Calc; + + +/** + * Ship energy system + * + * @author MightyPork + */ +public class EnergySystem { + + /** + * Get base energy system cost + * + * @return base cost (level 1) + */ + public static int getBaseCost() { + return 400; + } + + /** + * Get max available level + * + * @return max level + */ + public static int getLevelMax() { + return DiscoveryRegistry.getDiscoveryLevelMax("energy"); + } + + private double storage = 100; + private double storageMax = 1000; + /** Energy system level */ + public int level = 1; + + /** + * Energy system + * + * @param level level + */ + public EnergySystem(int level) { + setLevel(level); + } + + /** + * Set level + * + * @param level level to set + */ + public void setLevel(int level) { + this.level = Calc.clampi(level, 1, getLevelMax()); + storageMax = 1500 * Math.pow(level, 2.2); + storage = storageMax; + } + + public double getAddedPerUpdate() { + return Math.pow(level, 1.8) * 17 * Constants.SPEED_MUL; + } + + /** + * Update tick + */ + public void update() { + storage = Calc.clampd(storage + getAddedPerUpdate(), 0, storageMax); + } + + /** + * Try to consume energy points + * + * @param needed points to consume + * @return all consumed (false = none consumed) + */ + public boolean tryToConsume(double needed) { + if (storage > needed) { + storage -= needed; + return true; + } + return false; + } + + /** + * Get relative storage contents + * + * @return relative storage contents + */ + public double getStorageRatio() { + return storage / storageMax; + } + + /** + * Get stored energy points + * + * @return energy points + */ + public double getStored() { + return storage; + } + + /** + * Get max storage size + * + * @return limit + */ + public double getLimit() { + return storageMax; + } + + /** + * Consume given amount of points, or less if not enough + * + * @param consumed points to consume + * @return consumed all + */ + public boolean consume(double consumed) { + storage -= consumed; + if (storage < 0) { + storage = 0; + return false; + } + return true; + } + + public void fill() { + storage = storageMax; + } +} diff --git a/src/net/sector/level/ship/modules/Shield.java b/src/net/sector/level/ship/modules/Shield.java new file mode 100644 index 0000000..c9a1a09 --- /dev/null +++ b/src/net/sector/level/ship/modules/Shield.java @@ -0,0 +1,252 @@ +package net.sector.level.ship.modules; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.Constants; +import net.sector.level.ship.DiscoveryRegistry; +import net.sector.sounds.Sounds; +import net.sector.textures.TextureManager; +import net.sector.util.DeltaDouble; +import net.sector.util.DeltaDoubleDeg; + +import org.lwjgl.util.glu.Sphere; + +import com.porcupine.color.RGB; +import com.porcupine.math.Calc; + + +/** + * Energy shield renderer + * + * @author MightyPork + */ +public class Shield { + + /** Shield energy storage */ + public double shieldEnergy = 0; + /** Shield energy storage max */ + public double shieldEnergyMax = 0; + + /** + * Get relative energy storage contents + * + * @return 0-1 + */ + public double getLoadRatio() { + return shieldEnergy / shieldEnergyMax; + } + + /** + * Add points to the shield. + * + * @param shieldPoints + * @return something added + */ + public boolean addShieldPoints(double shieldPoints) { + if (shieldEnergy == shieldEnergyMax) return false; + shieldEnergy = Calc.clampd(shieldPoints + shieldEnergy, 0, shieldEnergyMax); + return true; + } + + /** + * Get base cost (level 1) + * + * @return base cost + */ + public static int getBaseCost() { + return 500; + } + + /** + * Get max level + * + * @return level + */ + public static int getLevelMax() { + return DiscoveryRegistry.getDiscoveryLevelMax("shield"); + } + + /** Render alpha */ + public DeltaDouble alpha = new DeltaDouble(0); + private DeltaDouble sinx = new DeltaDouble(0); + /** Is shield active */ + public boolean forceFieldActive = false; + public boolean forceFieldActive_last = false; + + /** Shield level */ + public int level = 0; + + private ShipBody body = null; + + private int list = -1; + + private double shieldRotSpeed; + + private DeltaDoubleDeg rotation = new DeltaDoubleDeg(0); + + private RGB color; + + /** + * New shield renderer + * + * @param body the body + */ + public Shield(ShipBody body) { + this.body = body; + } + + public void onReady() { + double r = body.collider.radius + 1; + shieldRotSpeed = 1D / r; + buildRenderList(); + } + + private void buildRenderList() { + list = glGenLists(1); + glNewList(list, GL_COMPILE); + + // LIST BEGIN + glPushAttrib(GL_ENABLE_BIT); + glDepthMask(false); + + TextureManager.bind("shield"); + + Sphere sp = new Sphere(); + sp.setTextureFlag(true); + sp.draw((float) body.collider.radius, 25, 25); + + glDepthMask(true); + glPopAttrib(); + // LIST END + glEndList(); + } + + /** + * Rotate by angle + * + * @param add added degrees + */ + public void rotate(double add) { + rotation.pushLast(); + rotation.add(add); + } + + + /** + * Set shield color + * + * @param color shield color + */ + public void setColor(RGB color) { + this.color = color; + } + + /** + * Set shield level + * + * @param level level to set + */ + public void setLevel(int level) { + this.level = Calc.clampi(level, 0, getLevelMax()); + shieldEnergy = shieldEnergyMax = this.level * 2000; + } + + /** + * Update shield rotation + */ + public void update() { + + if (level == 0) return; + + rotate(shieldRotSpeed * Constants.SPEED_MUL); + alpha.pushLast(); + sinx.pushLast(); + sinx.d += 0.15 * Constants.SPEED_MUL; + if (forceFieldActive && alpha.d < 1) alpha.d += 0.1 * Constants.SPEED_MUL; + if (!forceFieldActive && alpha.d > 0) alpha.d -= 0.05 * Constants.SPEED_MUL; + alpha.d = Calc.clampd(alpha.d, 0, 1); + + // animate + + if (body.isShieldRequestedByPlayer()) { + forceFieldActive = true; + + // if cant consume energy, fade away + double consume = 2 * body.collider.radius * Constants.SPEED_MUL; + if (forceFieldActive) shieldEnergy -= consume; + + if (shieldEnergy <= 0) { + shieldEnergy = 0; + forceFieldActive = false; + + } + + } else { + forceFieldActive = false; + } + + + if (forceFieldActive_last && !forceFieldActive) { + Sounds.shield_loop.stop(); + } + + if (!forceFieldActive_last && forceFieldActive) { + Sounds.shield_loop.playAsEffectLoop(1f, 0.3f); + } + + forceFieldActive_last = forceFieldActive; + } + + + /** + * Render shield + * + * @param delta delta time (for rotation) + */ + public void render(double delta) { + if (level == 0) return; + + double alph = alpha.delta(delta); + // dont render if it isnt actibve in any way + if (!forceFieldActive && alph <= 0.005 && !body.isShieldRequestedByPlayer()) return; + //if (alph <= 0.005) alph = 0.25; + + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + + glColor4d(color.r, color.g, color.b, color.a * alph * (0.8 - Math.sin(sinx.delta(delta)) * 0.3)); + + glDepthMask(false); + glEnable(GL_BLEND); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_LIGHTING); + + glScaled(1, 0.6, 1); + + glPushMatrix(); + glRotated(rotation.delta(delta), 0.6, 0.3, 0.7); + glCallList(list); + glPopMatrix(); + + glPushMatrix(); + glRotated(rotation.delta(delta), 1, 0.5, -0.4); + glCallList(list); + glPopMatrix(); + + glDisable(GL_BLEND); + //glEnable(GL_TEXTURE_2D); + + glPopAttrib(); + glColor4d(1, 1, 1, 1); + glPopMatrix(); + } + + + public void fill() { + shieldEnergy = shieldEnergyMax; + } + +} diff --git a/src/net/sector/level/ship/modules/ShipBody.java b/src/net/sector/level/ship/modules/ShipBody.java new file mode 100644 index 0000000..431c165 --- /dev/null +++ b/src/net/sector/level/ship/modules/ShipBody.java @@ -0,0 +1,478 @@ +package net.sector.level.ship.modules; + + +import static org.lwjgl.opengl.GL11.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Random; + +import net.sector.GameConfig; +import net.sector.collision.Collider; +import net.sector.collision.ColliderPlayerShip; +import net.sector.collision.Scene; +import net.sector.effects.Effects; +import net.sector.input.EInput; +import net.sector.input.IInputHandler; +import net.sector.input.InputTriggerGroup; +import net.sector.input.Routine; +import net.sector.level.ship.PieceBundle; +import net.sector.level.ship.modules.pieces.Piece; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +/** + * Container for ship body pieces + * + * @author MightyPork + */ +public class ShipBody implements IInputHandler { + + /** Distance of pieces, size of grid cells. */ + public static final double pieceDist = 0.3d; + /** Defualt size of piece collider */ + public static final double pieceColliderSize = pieceDist * Calc.SQ2 * 0.9; + /** Default piece render size */ + public static final double pieceRenderSize = pieceDist / 2; + + /** Set of all the pieces */ + public LinkedHashSet allPieces = new LinkedHashSet(); + + + /** Center piece - coord in the grid. */ + public CoordI center = new CoordI(0, 0); + + private int cnt = 0; + + /** Wrapping collider */ + public ColliderPlayerShip collider; + + /** + * Energy level. Set here so that when ship is spawned, this number is used. + */ + public int energyLevel = 1; + /** Power system */ + public EnergySystem energySystem; + + private boolean initcheck = false; + private long initTime = 0; + + + /** body is dead → entity should die too */ + public boolean isDead = false; + + private Random rand = new Random(); + + private boolean shieldActive = false; + + /** + * Shield level. Set here so that when ship is spawned, this number is used. + */ + public int shieldLevel = 1; + + /** Shield */ + public Shield shieldSystem; + + /** Grid size X */ + public int sizeX = 0; + + /** Grid size Z */ + public int sizeZ = 0; + + /** + * Table of pieces Unlike table in Context, this has inverted Z axis. + */ + private Piece[][] table; + + private InputTriggerGroup triggers = new InputTriggerGroup(); + + /** + * New piece store + * + * @param width grid width (x) + * @param height grid height (z) + */ + public ShipBody(int width, int height) { + table = new Piece[height][width]; + sizeX = width; + sizeZ = height; + } + + /** + * Count engines + * + * @return engines count + */ + public int countEngines() { + int e = 0; + for (Piece pc : allPieces) { + if (pc == null || pc.isDead) continue; + if (pc.isEngine()) e++; + } + return e; + } + + /** + * Count engines - total thrust power + * + * @return engines power + */ + public double countEnginesSq() { + double e = 0; + for (Piece pc : allPieces) { + if (pc == null || pc.isDead) continue; + if (pc.isEngine()) e += pc.getEnginePoints(); + } + return e; + } + + /** + * Count weapons. + * + * @return weapons. + */ + public int countWeapons() { + int w = 0; + for (Piece pc : allPieces) { + if (pc == null || pc.isDead) continue; + if (pc.isWeapon()) w++; + } + return w; + } + + /** + * Enable shield + * + * @param b state + */ + public void enableShield(boolean b) { + shieldActive = b; + shieldSystem.forceFieldActive = b; + } + + /** + * Get piece colliding with given collider. + * + * @param other other collider + * @return the colliding piece + */ + public ArrayList getCollidingPieces(Collider other) { + ArrayList colliding = new ArrayList(); + for (Piece pc : allPieces) { + if (pc == null || pc.isDead) continue; + if (pc.collidesWith(this, other, collider.pos, collider.getRotY(0))) colliding.add(pc); + } + return colliding; + } + + /** + * Get piece in grid + * + * @param x cell x + * @param z cell z + * @return piece or null + */ + public Piece getPiece(int x, int z) { + if (x < 0 || x >= table[0].length || z < 0 || z >= table.length) { + return null; + } + Piece p = table[z][x]; + if (p == null || p.isDead) return null; + return p; + } + + /** + * Get the scene + * + * @return scene + */ + public Scene getScene() { + return collider.scene; + } + + @Override + public void handleStaticInputs() { + triggers.handleStaticInputs(); + for (Piece p : allPieces) { + p.handleStaticInputs(); + } + } + + /** + * Check ship integrity. + */ + public void checkIntegrity() { + for (Piece pc : allPieces) { + if (pc.isDead) continue; + pc.consistencyCheckFlag = false; + } + markNeighborConsistent(center.x, center.y); + for (Piece pc : allPieces) { + if (pc.isDead) continue; + if (!pc.consistencyCheckFlag) { + pc.isDead = true; + onPieceDestroyed(pc, false); + } + } + } + + private void markNeighborConsistent(int x, int z) { + Piece p; + p = getPiece(x, z); + if (p == null || p.isDead) return; + + for (int xx = -1; xx <= 1; xx++) { + for (int zz = -1; zz <= 1; zz++) { + if (xx == 0 && zz == 0) continue; + //if (!p.canConnectToSide(xx, zz)) continue; + + Piece p2 = getPiece(x + xx, z + zz); + + int dx = -xx; + int dz = -zz; + + if (p2 != null && !p2.consistencyCheckFlag && p2.canConnectToSide(dx, dz)) { + p2.consistencyCheckFlag = true; + markNeighborConsistent(x + xx, z + zz); + } + } + } + } + + /** + * Check if shield is active + * + * @return shield is active + */ + public boolean isShieldRequestedByPlayer() { + return shieldActive; + } + + /** + * Check if shield is active + * + * @return shield is active + */ + public boolean isShieldRunning() { + return isShieldRequestedByPlayer() && shieldSystem.forceFieldActive && shieldSystem.level > 0; + } + + @Override + public void onKey(int key, char c, boolean down) { + triggers.onKey(key, c, down); + for (Piece p : allPieces) { + p.onKey(key, c, down); + } + } + + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + triggers.onMouseButton(button, down, wheelDelta, pos, deltaPos); + + for (Piece p : allPieces) { + p.onMouseButton(button, down, wheelDelta, pos, deltaPos); + } + } + + @Override + public void onMouseMove(Coord pos, Vec move, int wheelDelta) { + // NO-OP + } + + /** + * Handle piece destruction (explode, integrity check etc..) + * + * @param piece piece destroyed + * @param check perform integrity check + */ + public void onPieceDestroyed(Piece piece, boolean check) { + Effects.addExplosion(getScene().particles, piece.getAbsoluteCoord(), collider.entity.getMotion(), piece.explodeSize * (check ? 1 : 0.3), + true, false); + if (getPiece(center.x, center.y) == null || countWeapons() == 0 || countEngines() == 0) { + isDead = true; + return; + } + + if (check) { + checkIntegrity(); + } + } + + /** + * Hook called when all is ready: scene, ship, collider != null + */ + public void onReady() { + shieldSystem = new Shield(this); + shieldSystem.setColor(new RGB(0.1, 0.7, 1, Calc.clampd(0.2 * shieldLevel, 0.2, 0.6))); + shieldSystem.onReady(); + shieldSystem.setLevel(shieldLevel); + + energySystem = new EnergySystem(energyLevel); + + + triggers.addTrigger(new Routine() { + @Override + public void run() { + enableShield(true); + } + }, EInput.KEY_PRESS, GameConfig.keyShield); + + triggers.addTrigger(new Routine() { + @Override + public void run() { + enableShield(false); + } + }, EInput.KEY_RELEASE, GameConfig.keyShield); + + } + + /** + * Remove piece from grid + * + * @param x cell x + * @param z cell z + */ + public void removePiece(int x, int z) { + Piece pc = getPiece(x, z); + if (pc == null) return; + allPieces.remove(pc); + table[z][x] = null; + pc = null; + } + + /** + * Remove piece if contained + * + * @param piece piece to remove + */ + public void removePiece(Piece piece) { + table[piece.gridCoord.y][piece.gridCoord.x] = null; + allPieces.remove(piece); + piece = null; + } + + /** + * Render the ship at current pos. + * + * @param delta delta time + */ + public void render(double delta) { + if (isDead) return; + + //@formatter:off + glPushMatrix(); + glLoadIdentity(); + Coord p = collider.pos.getDelta(delta); + glTranslated(p.x, p.y, -p.z); + + + glPushMatrix(); + glRotated(collider.getRotY(delta), 0, 1, 0); + glRotated(collider.getRotZ(delta), 0, 0, 1); + + for (Piece pc : allPieces) { + if (pc.isDead) continue; + pc.render(this); + } + shieldSystem.render(delta); + glPopMatrix(); + + glPopMatrix(); + //@formatter:on + } + + /** + * Set grid coordinates to work as center (for rotation & consistency + * checking) + * + * @param x cell x + * @param y cell y + */ + public void setCenterCoord(int x, int y) { + center.setTo(x, y); + } + + /** + * Set instance of wrapping collider. + * + * @param colliderPieced + */ + public void setCollider(ColliderPlayerShip colliderPieced) { + this.collider = colliderPieced; + } + + /** + * Set grid piece + * + * @param x cell x + * @param z cell z + * @param piece piece to add + */ + public void setPiece(int x, int z, Piece piece) { + if (piece == null) { + table[sizeZ - 1 - z][x] = null; + return; + } + piece.setStore(this); + table[sizeZ - 1 - z][x] = piece; + allPieces.add(piece); + piece.setGridCoord(x, sizeZ - 1 - z); + piece.setColliderRadius(pieceColliderSize); + } + + /** + * Convert back to table used in designer. + * + * @return table + */ + public PieceBundle[][] toTable() { + PieceBundle[][] s = new PieceBundle[sizeZ][sizeX]; + int Z = sizeZ; + int X = sizeX; + + for (int z = 0; z < Z; z++) { + for (int x = 0; x < X; x++) { + Piece p = table[Z - 1 - z][x]; + s[z][x] = new PieceBundle(p); + } + } + + return s; + } + + /** + * Update tick.. + */ + public void update() { + if (isDead) return; + + if (initTime == 0) initTime = System.currentTimeMillis(); + + if (!initcheck && System.currentTimeMillis() - initTime > 1000) { + checkIntegrity(); + initcheck = true; + } + + if (rand.nextInt(3) == 0) { + // shuffle pieces + List list = new ArrayList(allPieces); + Collections.shuffle(list); + allPieces.clear(); + allPieces.addAll(list); + } + + energySystem.update(); + shieldSystem.update(); + + for (Piece p : allPieces) { + p.update(); + } + } +} diff --git a/src/net/sector/level/ship/modules/pieces/Piece.java b/src/net/sector/level/ship/modules/pieces/Piece.java new file mode 100644 index 0000000..bb41ee1 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/Piece.java @@ -0,0 +1,559 @@ +package net.sector.level.ship.modules.pieces; + + +import static org.lwjgl.opengl.GL11.*; +import net.sector.collision.Collider; +import net.sector.collision.ColliderSphere; +import net.sector.collision.Scene; +import net.sector.entities.Entity; +import net.sector.entities.player.EntityPlayerShip; +import net.sector.input.IInputHandler; +import net.sector.input.InputTrigger; +import net.sector.input.Routine; +import net.sector.input.TriggerBundle; +import net.sector.level.ship.PieceRegistry; +import net.sector.level.ship.modules.EnergySystem; +import net.sector.level.ship.modules.ShipBody; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.CoordI; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.math.Calc.Deg; + + +/** + * Ship piece + * + * @author MightyPork + */ +public abstract class Piece implements IInputHandler { + + /** Wrapping store. */ + public ShipBody body = null; + + /** Health points. */ + public double health = 3; + + /** + * Size of explosion when destroyed, can be increased for fuel tanks etc, + * decreased for wings & small pieces.) + */ + public double explodeSize = 5; + + /** Flag for consistency check at {@link ShipBody} */ + public boolean consistencyCheckFlag = false; + + /** Mark that is dead, for collisions etc. */ + public boolean isDead = false; + + /** + * Technical level - the higher the better functions, lower load time, + * bigger damage + */ + public int techLevel = 1; + + /** Piece collider, set to correct values after calling collidesWith. */ + public ColliderSphere pieceCollider = new ColliderSphere(new Coord(0, 0, 0), 1); + + /** Coordinate in PieceStore's table */ + public CoordI gridCoord = new CoordI(0, 0); + + /** rotation of this individual piece (block rotation) */ + public double pieceRotate = 0; + + /** trigger used to detect controls */ + public InputTrigger inputTrigger = null; + + /** Action executed if the trigger is triggered */ + public Routine inputAction = null; + + public abstract double getPieceMass(); + + /** + * For designer - increment for rotating. 15 is for weapons, 90 is for body + * pieces. + * + * @return step in degrees + */ + public abstract int getPieceRotateStep(); + + /** + * Get price of piece level 1 + * + * @return price + */ + public abstract int getBaseCost(); + + + /** + * Ship body piece + */ + public Piece() { + health = getHealthMax(); + } + + /** + * Set tech level. Gets clamped to 1-max + * + * @param level level to set + * @return this + */ + public Piece setLevel(int level) { + techLevel = Calc.clampi(level, 1, getLevelMax()); + return this; + } + + /** + * Get tech level + * + * @return tech level + */ + public int getLevel() { + return techLevel; + } + + /** + * Get maximal tech level + * + * @return tech level + */ + public final int getLevelMax() { + return PieceRegistry.getPieceLevelMax(this); + } + + /** + * Get scene instance + * + * @return the scene + */ + public final Scene getScene() { + return body.getScene(); + } + + /** + * Add entity to scene (for shots) + * + * @param entity + */ + public final void addEntityToScene(Entity entity) { + getScene().add(entity); + } + + /** + * Get ship entity + * + * @return the entity + */ + public final EntityPlayerShip getEntity() { + return (EntityPlayerShip) body.collider.entity; + } + + /** + * Get energy system + * + * @return system + */ + public final EnergySystem getEnergySystem() { + return body.energySystem; + } + + /** + * Try to consume energy + * + * @param points points needed + * @return consumed + */ + public final boolean tryToConsumeEnergy(double points) { + return getEnergySystem().tryToConsume(points); + } + + /** + * Get ship rotation around Y axis + * + * @return Y rotation + */ + public final double getRotY() { + return body.collider.getRotY(0); + } + + /** + * Get ship rotation around Z axis (to sides) + * + * @return Z rotation + */ + public final double getRotZ() { + return body.collider.getRotZ(0); + } + + /** + * get ship position + * + * @return position + */ + public final Coord getPos() { + return body.collider.pos; + } + + /** + * Get sphere collider for this piece + * + * @return this piece's collider + */ + public final ColliderSphere getPieceCollider() { + return pieceCollider; + } + + /** + * Assign store to this piece + * + * @param store the piece store + * @return this + */ + public final Piece setStore(ShipBody store) { + this.body = store; + return this; + } + + /** + * Set piece health + * + * @param health health points + * @return this + */ + public final Piece setHealth(double health) { + this.health = Calc.clampd(health, 0, getHealthMax()); + return this; + } + + /** + * Add health + * + * @param points health points + * @return this + */ + public final Piece addHealth(double points) { + this.health = Calc.clampd(health + points, 0, getHealthMax()); + return this; + } + + + /** + * Add damage to this piece, explode and check integrity if destroyed. + * + * @param points points of damage + * @return this + */ + public final Piece addDamage(double points) { + if (isDead) return this; + health -= points / getResistance(); + if (health <= 0) { + isDead = true; + body.onPieceDestroyed(this, true); + } + return this; + } + + /** + * Get health limit + * + * @return health points max + */ + public abstract double getHealthMax(); + + /** + * Get piece resistance, based on tech level. Higher = better. Default = 1, + * 0.5 = half, 4 = 4x stronger + * + * @return resistance + */ + public abstract double getResistance(); + + /** + * Get coordinate of this piece relative to grid center (in real units) + * + * @return the coordinate + */ + public final Coord getRelativeCoordToCenter() { + CoordI abs = getGridCoord().sub(body.center); + return new Coord(abs.x, 0, abs.y); + } + + /** + * Get coordinate of this piece in absolute units - relative to point + * (0,0,0) + * + * @return the coord + */ + public final Coord getAbsoluteCoord() { + Coord relative = getRelativeCoordToCenter(); + Coord scaledRelative = relative.mul(ShipBody.pieceDist); + + // here we rotate it around Z. + + scaledRelative.y += scaledRelative.x * Math.sin(Math.toRadians(getRotZ())); + scaledRelative.x = scaledRelative.x * Math.cos(Math.toRadians(getRotZ())); + + + Coord scaledRotatedRelative = CoordUtils.coordToLocalSystem(getRotY(), scaledRelative); + return getPos().add(scaledRotatedRelative); + } + + /** + * Get rendering model.
+ * Used to get static field Model by super type. + * + * @return model + */ + public abstract RenderModel getModel(); + + /** + * Set model collider radius.
+ * Should be slightly bigger than gridScale; + * + * @param radius collider radius + */ + public final void setColliderRadius(double radius) { + pieceCollider.radius = radius; + } + + /** + * Set coordinate within PieceStore's table.
+ * + * @param x x coord + * @param y y coord + */ + public final void setGridCoord(int x, int y) { + gridCoord.setTo(x, y); + } + + /** + * Check if this part collides woth other entity + * + * @param store piece store + * @param other other collider - usually shot / asteroid + * @param realCenterPos center of the entity, aligned with table center + * @param rotAngle entity rotate angle + * @return collides + */ + public final boolean collidesWith(ShipBody store, Collider other, Coord realCenterPos, double rotAngle) { + if (isDead) return false; + + pieceCollider.pos.setTo(getAbsoluteCoord()); + + //check collider collision + return pieceCollider.collidesWith(other); + } + + /** + * Get relative render scale multiplier. + * + * @return 1 for default size. + */ + public abstract double getRenderScale(); + + /** + * do render. relative to ship center and rotation, with push-pop. + * + * @param store piece store + */ + public void render(ShipBody store) { + if (isDead) return; + Coord relpos = getRelativeCoordToCenter(); + glPushMatrix(); + glTranslated(relpos.x * ShipBody.pieceDist, 0, -relpos.z * ShipBody.pieceDist); + double d = getRenderScale(); + glScaled(ShipBody.pieceRenderSize * d, ShipBody.pieceRenderSize * d, ShipBody.pieceRenderSize * d); + glRotated(pieceRotate, 0, 1, 0); + + getModel().render(); + + glPopMatrix(); + } + + /** + * Get coord in grid + * + * @return coord + */ + public final CoordI getGridCoord() { + return gridCoord; + } + + // input handling + + /** + * Get if piece has input trigger configurable + * + * @return has trigger + */ + public boolean hasTrigger() { + return inputTrigger != null && inputAction != null; + } + + /** + * Get trigger bundle + * + * @return trigger bundle + */ + public TriggerBundle getTrigger() { + if (!hasTrigger()) return null; + return inputTrigger.toBundle(); + } + + /** + * Set trigger + * + * @param trigger trigger bundle + */ + public void setTrigger(TriggerBundle trigger) { + inputTrigger = trigger.toTrigger(); + } + + /** + * Get triggered action (eg. shoot action) + * + * @return action + */ + public Routine getAction() { + return inputAction; + } + + /** + * Set triggered action (eg. shoot action) + * + * @param fn action + */ + public void setAction(Routine fn) { + inputAction = fn; + } + + /** + * Init triggered action + * + * @param tb trigger bundle + * @param fn action + */ + public void initAction(TriggerBundle tb, Routine fn) { + setTrigger(tb); + setAction(fn); + } + + @Override + public void onMouseMove(Coord pos, Vec move, int wheelDelta) {} + + @Override + public void onMouseButton(int button, boolean down, int wheelDelta, Coord pos, Coord deltaPos) { + if (isDead || getEntity().isDead() || body.isDead) return; + if (hasTrigger() && inputTrigger.onMouseButton(button, down, wheelDelta, pos, deltaPos)) { + inputAction.run(); + } + } + + @Override + public void onKey(int key, char c, boolean down) { + if (isDead || getEntity().isDead() || body.isDead) return; + if (hasTrigger() && inputTrigger.onKey(key, c, down)) { + inputAction.run(); + } + } + + @Override + public void handleStaticInputs() { + if (isDead || getEntity().isDead() || body.isDead) return; + if (hasTrigger() && inputTrigger.handleStaticInputs()) { + inputAction.run(); + } + } + + /** + * Update what needs to be updated.. + */ + public void update() {} + + /** + * Check if this piece can connect to given side + * + * @param x x offset + * @param z z offset + * @return can connect + */ + public abstract boolean canConnectToSide(int x, int z); + + /** + * Set piece rotation + * + * @param rotate rotation (deg CCW) + * @return this + */ + public Piece setPieceRotate(int rotate) { + this.pieceRotate = Deg.norm(rotate); + return this; + } + +// /** +// * Get render-model for designer +// * +// * @return model +// */ +// public RenderModel getModelForDesigner() { +// return getModel(); +// } + + /** + * Is this piece an engine? + * + * @return is engine + */ + public boolean isEngine() { + return false; + } + + /** + * Get thrust points (engine) + * + * @return thrust points (1 = level 1 engine) + */ + public double getEnginePoints() { + return 0; + } + + /** + * Is this piece a weapon? + * + * @return is weapon + */ + public boolean isWeapon() { + return false; + } + + /** + * Is a body piece (= can occupy central slot) + * + * @return is body + */ + public boolean isBody() { + return false; + } + + + /** + * Get health. + * + * @return health + */ + public double getHealth() { + return health; + } + + /** + * Get rotation + * + * @return rotation + */ + public double getPieceRotate() { + return pieceRotate; + } +} diff --git a/src/net/sector/level/ship/modules/pieces/PieceBodyBase.java b/src/net/sector/level/ship/modules/pieces/PieceBodyBase.java new file mode 100644 index 0000000..7e015b7 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/PieceBodyBase.java @@ -0,0 +1,57 @@ +package net.sector.level.ship.modules.pieces; + + +import net.sector.models.wavefront.loader.RenderModel; + + +/** + * Ship body piece + * + * @author MightyPork + */ +public abstract class PieceBodyBase extends Piece { + + @Override + public boolean isBody() { + return true; + } + + @Override + public double getResistance() { + return 1 + (techLevel - 1) * 2; + } + + @Override + public abstract RenderModel getModel(); + + @Override + public double getRenderScale() { + return 1; + } + + @Override + public double getHealthMax() { + return 1.5; + } + + @Override + public boolean canConnectToSide(int x, int z) { + return x == 0 || z == 0; + } + + @Override + public int getPieceRotateStep() { + return 90; + } + + @Override + public int getBaseCost() { + return 100; + } + + @Override + public double getPieceMass() { + return 1; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/PieceWeaponBase.java b/src/net/sector/level/ship/modules/pieces/PieceWeaponBase.java new file mode 100644 index 0000000..4e0c43e --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/PieceWeaponBase.java @@ -0,0 +1,82 @@ +package net.sector.level.ship.modules.pieces; + + +import net.sector.models.wavefront.loader.RenderModel; + +import com.porcupine.math.Calc.Deg; + + +/** + * Weapon stub + * + * @author MightyPork + */ +public abstract class PieceWeaponBase extends Piece { + + @Override + public double getPieceMass() { + return 0.75; + } + + @Override + public double getResistance() { + return techLevel * 1.5; + } + + @Override + public abstract RenderModel getModel(); + + @Override + public double getRenderScale() { + return 1; + } + + @Override + public boolean isWeapon() { + return true; + } + + @Override + public abstract double getHealthMax(); + + @Override + public boolean canConnectToSide(int x, int z) { + int rot = Deg.round45(pieceRotate); + if (rot == 0) { + return z < 0 && x == 0; + } + if (rot == 45) { + return z < 0 && x > 0; + } + if (rot == 90) { + return z == 0 && x > 0; + } + if (rot == 135) { + return z > 0 && x > 0; + } + if (rot == 180) { + return z > 0 && x == 0; + } + if (rot == 225) { + return z > 0 && x < 0; + } + if (rot == 270) { + return z == 0 && x < 0; + } + if (rot == 315) { + return z < 0 && x < 0; + } + return false; + } + + @Override + public int getPieceRotateStep() { + return 5; + } + + @Override + public int getBaseCost() { + return 500; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBbArrow.java b/src/net/sector/level/ship/modules/pieces/body/PieceBbArrow.java new file mode 100644 index 0000000..09ca2ad --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBbArrow.java @@ -0,0 +1,17 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBbArrow extends PiecePointBase { + + public PieceBbArrow() {} + + @Override + public RenderModel getModel() { + return Models.piece_bb_arrow; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBbCube.java b/src/net/sector/level/ship/modules/pieces/body/PieceBbCube.java new file mode 100644 index 0000000..46d323c --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBbCube.java @@ -0,0 +1,23 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBbCube extends PieceBodyBase { + + public PieceBbCube() {} + + @Override + public RenderModel getModel() { + return Models.piece_bb_cube; + } + + @Override + public int getPieceRotateStep() { + return 360; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBbPoint.java b/src/net/sector/level/ship/modules/pieces/body/PieceBbPoint.java new file mode 100644 index 0000000..5807534 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBbPoint.java @@ -0,0 +1,17 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBbPoint extends PiecePointBase { + + public PieceBbPoint() {} + + @Override + public RenderModel getModel() { + return Models.piece_bb_point; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBbTriangle.java b/src/net/sector/level/ship/modules/pieces/body/PieceBbTriangle.java new file mode 100644 index 0000000..19ae7f1 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBbTriangle.java @@ -0,0 +1,17 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBbTriangle extends PieceTriangleBase { + + public PieceBbTriangle() {} + + @Override + public RenderModel getModel() { + return Models.piece_bb_triangle; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1.java new file mode 100644 index 0000000..698c122 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner1 extends PieceBodyBase { + + public PieceBsCorner1() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner1; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side1.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side1.java new file mode 100644 index 0000000..f27e0a4 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side1.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner1Side1 extends PieceBodyBase { + + public PieceBsCorner1Side1() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner1_side1; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side1M.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side1M.java new file mode 100644 index 0000000..26f3273 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side1M.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner1Side1M extends PieceBodyBase { + + public PieceBsCorner1Side1M() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner1_side1_m; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side2.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side2.java new file mode 100644 index 0000000..7ccd21e --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner1Side2.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner1Side2 extends PieceBodyBase { + + public PieceBsCorner1Side2() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner1_side2; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Next.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Next.java new file mode 100644 index 0000000..67c178a --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Next.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner2Next extends PieceBodyBase { + + public PieceBsCorner2Next() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner2_next; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Opp.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Opp.java new file mode 100644 index 0000000..dec44e6 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Opp.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner2Opp extends PieceBodyBase { + + public PieceBsCorner2Opp() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner2_opp; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Side1.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Side1.java new file mode 100644 index 0000000..d62defc --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner2Side1.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner2Side1 extends PieceBodyBase { + + public PieceBsCorner2Side1() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner2_side1; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner3.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner3.java new file mode 100644 index 0000000..7bc2138 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner3.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner3 extends PieceBodyBase { + + public PieceBsCorner3() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner3; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner4.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner4.java new file mode 100644 index 0000000..4370a08 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsCorner4.java @@ -0,0 +1,23 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsCorner4 extends PieceBodyBase { + + public PieceBsCorner4() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_corner4; + } + + @Override + public int getPieceRotateStep() { + return 360; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsPoint.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsPoint.java new file mode 100644 index 0000000..48f636f --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsPoint.java @@ -0,0 +1,17 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsPoint extends PiecePointBase { + + public PieceBsPoint() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_point; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsSide1.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsSide1.java new file mode 100644 index 0000000..6934665 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsSide1.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsSide1 extends PieceBodyBase { + + public PieceBsSide1() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_side1; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsSide2Next.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsSide2Next.java new file mode 100644 index 0000000..56ccfec --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsSide2Next.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsSide2Next extends PieceBodyBase { + + public PieceBsSide2Next() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_side2_next; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsSide2Opp.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsSide2Opp.java new file mode 100644 index 0000000..522e1e8 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsSide2Opp.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsSide2Opp extends PieceBodyBase { + + public PieceBsSide2Opp() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_side2_opp; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsSide3.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsSide3.java new file mode 100644 index 0000000..628658c --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsSide3.java @@ -0,0 +1,18 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsSide3 extends PieceBodyBase { + + public PieceBsSide3() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_side3; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBsTriangle.java b/src/net/sector/level/ship/modules/pieces/body/PieceBsTriangle.java new file mode 100644 index 0000000..f16c2bd --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBsTriangle.java @@ -0,0 +1,17 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBsTriangle extends PieceTriangleBase { + + public PieceBsTriangle() {} + + @Override + public RenderModel getModel() { + return Models.piece_bs_triangle; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBwCorner.java b/src/net/sector/level/ship/modules/pieces/body/PieceBwCorner.java new file mode 100644 index 0000000..04b86b8 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBwCorner.java @@ -0,0 +1,32 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBwCorner extends PieceTriangleBase { + + public PieceBwCorner() {} + + @Override + public RenderModel getModel() { + return Models.piece_bw_triangle; + } + + @Override + public int getBaseCost() { + return 60; + } + + @Override + public double getResistance() { + return 1 + (techLevel - 1) * 0.2; + } + + @Override + public double getPieceMass() { + return super.getPieceMass() * 0.25; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBwCube.java b/src/net/sector/level/ship/modules/pieces/body/PieceBwCube.java new file mode 100644 index 0000000..004ad25 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBwCube.java @@ -0,0 +1,38 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBwCube extends PieceBodyBase { + + public PieceBwCube() {} + + @Override + public RenderModel getModel() { + return Models.piece_bw_cube; + } + + @Override + public int getBaseCost() { + return 60; + } + + @Override + public double getResistance() { + return 1 + (techLevel - 1) * 0.2; + } + + @Override + public int getPieceRotateStep() { + return 360; + } + + @Override + public double getPieceMass() { + return super.getPieceMass() * 0.25; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceBwPoint.java b/src/net/sector/level/ship/modules/pieces/body/PieceBwPoint.java new file mode 100644 index 0000000..ce54fb8 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceBwPoint.java @@ -0,0 +1,32 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; + + +public class PieceBwPoint extends PiecePointBase { + + public PieceBwPoint() {} + + @Override + public RenderModel getModel() { + return Models.piece_bw_arrow; + } + + @Override + public int getBaseCost() { + return 60; + } + + @Override + public double getResistance() { + return 1 + (techLevel - 1) * 0.2; + } + + @Override + public double getPieceMass() { + return super.getPieceMass() * 0.25; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceEngineIon.java b/src/net/sector/level/ship/modules/pieces/body/PieceEngineIon.java new file mode 100644 index 0000000..c93e0bf --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceEngineIon.java @@ -0,0 +1,78 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.effects.Effects; +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +public class PieceEngineIon extends PieceBodyBase { + + public PieceEngineIon() {} + + @Override + public RenderModel getModel() { + return Models.piece_engine_big; + } + + @Override + public boolean canConnectToSide(int x, int z) { + return x == 0 && z > 0; + } + + @Override + public int getPieceRotateStep() { + return 360; + } + + @Override + public int getBaseCost() { + return 1000; + } + + @Override + public boolean isEngine() { + return true; + } + + @Override + public double getEnginePoints() { + return Math.pow(techLevel, 2) * 0.6; + } + + @Override + public boolean isBody() { + return false; + } + + @Override + public double getHealthMax() { + return 4; + } + + @Override + public double getResistance() { + return 1 + (techLevel - 1) * 1; + } + + @Override + public void update() { + if (isDead) return; + + Vec motion = getEntity().getMotion(); + + tryToConsumeEnergy(techLevel * 40 * (0.4 + Math.abs(motion.x) * 7)); + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate).norm(body.pieceDist * 0.5); + Coord pos = getAbsoluteCoord().sub(front); + + Effects.addEngineFire(getScene().particles, pos, front.norm(0.032 + 0.006 * techLevel).neg(), Calc.clampi(techLevel + 2, 1, 7), 1); + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceEngineRocket.java b/src/net/sector/level/ship/modules/pieces/body/PieceEngineRocket.java new file mode 100644 index 0000000..f3b0c1a --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceEngineRocket.java @@ -0,0 +1,72 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.effects.Effects; +import net.sector.level.ship.modules.pieces.PieceBodyBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; + + +public class PieceEngineRocket extends PieceBodyBase { + + public PieceEngineRocket() {} + + @Override + public RenderModel getModel() { + return Models.piece_engine; + } + + @Override + public boolean canConnectToSide(int x, int z) { + return x == 0 && z > 0; + } + + @Override + public int getPieceRotateStep() { + return 360; + } + + @Override + public int getBaseCost() { + return 500; + } + + @Override + public boolean isEngine() { + return true; + } + + @Override + public double getHealthMax() { + return 1; + } + + @Override + public double getEnginePoints() { + return Math.pow(techLevel, 1.4) * 0.4; + } + + @Override + public boolean isBody() { + return false; + } + + @Override + public void update() { + if (isDead) return; + Vec motion = getEntity().getMotion(); + + tryToConsumeEnergy(techLevel * 10 * (0.4 + Math.abs(motion.x) * 7)); + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate); //.norm(body.pieceDist*0.1); + Coord pos = getAbsoluteCoord(); //.sub(front); + + Effects.addEngineFire(getScene().particles, pos, front.norm(0.032 + 0.006 * techLevel).neg(), Calc.clampi(techLevel, 1, 5)); + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PiecePointBase.java b/src/net/sector/level/ship/modules/pieces/body/PiecePointBase.java new file mode 100644 index 0000000..f6f0894 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PiecePointBase.java @@ -0,0 +1,34 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; + +import com.porcupine.math.Calc.Deg; + + +public abstract class PiecePointBase extends PieceBodyBase { + + @Override + public boolean canConnectToSide(int x, int z) { + int rot = Deg.round90(pieceRotate); + if (rot == 0) { + return z < 0 && x == 0; + } + if (rot == 90) { + return x > 0 && z == 0; + } + if (rot == 180) { + return z > 0 && x == 0; + } + if (rot == 270) { + return x < 0 && z == 0; + } + return false; + } + + @Override + public double getPieceMass() { + return 0.25; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/body/PieceTriangleBase.java b/src/net/sector/level/ship/modules/pieces/body/PieceTriangleBase.java new file mode 100644 index 0000000..d24daa9 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/body/PieceTriangleBase.java @@ -0,0 +1,34 @@ +package net.sector.level.ship.modules.pieces.body; + + +import net.sector.level.ship.modules.pieces.PieceBodyBase; + +import com.porcupine.math.Calc.Deg; + + +public abstract class PieceTriangleBase extends PieceBodyBase { + + @Override + public boolean canConnectToSide(int x, int z) { + int rot = Deg.round90(pieceRotate); + if (rot == 0) { + return (x < 0 && z == 0) || (z < 0 && x == 0); + } + if (rot == 90) { + return (x > 0 && z == 0) || (z < 0 && x == 0); + } + if (rot == 180) { + return (x > 0 && z == 0) || (z > 0 && x == 0); + } + if (rot == 270) { + return (x < 0 && z == 0) || (z > 0 && x == 0); + } + return false; + } + + @Override + public double getPieceMass() { + return 0.5; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/weapons/PieceCannon.java b/src/net/sector/level/ship/modules/pieces/weapons/PieceCannon.java new file mode 100644 index 0000000..5f04ce4 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/weapons/PieceCannon.java @@ -0,0 +1,62 @@ +package net.sector.level.ship.modules.pieces.weapons; + + +import net.sector.Constants; +import net.sector.entities.shots.EntityShell; +import net.sector.input.EInput; +import net.sector.input.Routine; +import net.sector.input.TriggerBundle; +import net.sector.level.ship.modules.pieces.PieceWeaponBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +public class PieceCannon extends PieceWeaponBase { + + private int counter = 0; + + private class FnShoot implements Routine { + @Override + public void run() { + if (counter > 0) return; + if (!tryToConsumeEnergy(techLevel * 70)) return; + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate).norm(body.pieceDist); + Coord lpos = getAbsoluteCoord().add(front); + + addEntityToScene(new EntityShell(lpos, front, getEntity(), techLevel).setGlobalMovement(false)); + + counter = (int) (Constants.FPS_UPDATE * (0.4 - techLevel * 0.04)); + } + } + + @Override + public void update() { + if (counter > 0) counter--; + } + + public PieceCannon() { + initAction(new TriggerBundle(EInput.BTN_DOWN, 0), new FnShoot()); + } + + @Override + public RenderModel getModel() { + return Models.piece_w_cannon; + } + + @Override + public double getHealthMax() { + return 1.5; + } + + @Override + public int getBaseCost() { + return 250; + } + + +} diff --git a/src/net/sector/level/ship/modules/pieces/weapons/PieceEMPGun.java b/src/net/sector/level/ship/modules/pieces/weapons/PieceEMPGun.java new file mode 100644 index 0000000..a5e913d --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/weapons/PieceEMPGun.java @@ -0,0 +1,61 @@ +package net.sector.level.ship.modules.pieces.weapons; + + +import net.sector.Constants; +import net.sector.entities.shots.EntityEMP; +import net.sector.input.EInput; +import net.sector.input.Routine; +import net.sector.input.TriggerBundle; +import net.sector.level.ship.modules.pieces.PieceWeaponBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +public class PieceEMPGun extends PieceWeaponBase { + + private int counter = 0; + + private class FnShoot implements Routine { + @Override + public void run() { + if (counter > 0) return; + if (!tryToConsumeEnergy(techLevel * 1200)) return; + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate).norm(body.pieceDist); + Coord lpos = getAbsoluteCoord().add(front); + + addEntityToScene(new EntityEMP(lpos, front, getEntity(), techLevel).setGlobalMovement(false)); + + counter = (int) (Constants.FPS_UPDATE * (5 - techLevel * 0.4)); + } + } + + @Override + public void update() { + if (counter > 0) counter--; + } + + public PieceEMPGun() { + initAction(new TriggerBundle(EInput.BTN_DOWN, 1), new FnShoot()); + } + + @Override + public RenderModel getModel() { + return Models.piece_w_emp; + } + + @Override + public double getHealthMax() { + return 3; + } + + @Override + public int getBaseCost() { + return 1600; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/weapons/PieceFlamethrower.java b/src/net/sector/level/ship/modules/pieces/weapons/PieceFlamethrower.java new file mode 100644 index 0000000..1174350 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/weapons/PieceFlamethrower.java @@ -0,0 +1,99 @@ +package net.sector.level.ship.modules.pieces.weapons; + + +import net.sector.Constants; +import net.sector.entities.shots.EntityFireball; +import net.sector.input.EInput; +import net.sector.input.Routine; +import net.sector.input.TriggerBundle; +import net.sector.level.ship.modules.pieces.PieceWeaponBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +public class PieceFlamethrower extends PieceWeaponBase { + + private int counter = 0; + + private boolean brand_new = true; + + + private double napalmContainer = 0; + private boolean ignited = false; + + private double getNapalmContainerMax() { + return (Constants.FPS_UPDATE * (0.2 + techLevel * 0.2)); + } + + private class FnShoot implements Routine { + @Override + public void run() { + if (!ignited) { + if (napalmContainer < getNapalmContainerMax() * 0.8) { + return; + } + ignited = true; + } + + if (!tryToConsumeEnergy(Math.pow(techLevel, 1.1) * 100)) { + ignited = false; + napalmContainer = 0; + return; + } + + if (counter > 0) return; + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate).norm(body.pieceDist); + Coord lpos = getAbsoluteCoord().add(front); + + addEntityToScene(new EntityFireball(lpos, front, getEntity(), techLevel)); + + counter = (int) (Constants.FPS_UPDATE * 0.04F); + napalmContainer -= counter; + + if (napalmContainer <= 0) { + napalmContainer = 0; + ignited = false; + } + + } + } + + @Override + public void update() { + if (brand_new) { + napalmContainer = getNapalmContainerMax(); + brand_new = false; + } + if (napalmContainer < getNapalmContainerMax()) { + napalmContainer += 0.3; + } + + if (counter > 0) counter--; + } + + public PieceFlamethrower() { + initAction(new TriggerBundle(EInput.BTN_DOWN, 1), new FnShoot()); + } + + @Override + public RenderModel getModel() { + return Models.piece_w_flame; + } + + @Override + public double getHealthMax() { + return 4; + } + + @Override + public int getBaseCost() { + return 1800; + } + + +} diff --git a/src/net/sector/level/ship/modules/pieces/weapons/PieceLaser.java b/src/net/sector/level/ship/modules/pieces/weapons/PieceLaser.java new file mode 100644 index 0000000..817f14f --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/weapons/PieceLaser.java @@ -0,0 +1,68 @@ +package net.sector.level.ship.modules.pieces.weapons; + + +import net.sector.Constants; +import net.sector.entities.shots.EntityLaser; +import net.sector.input.EInput; +import net.sector.input.Routine; +import net.sector.input.TriggerBundle; +import net.sector.level.ship.modules.pieces.PieceWeaponBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +public class PieceLaser extends PieceWeaponBase { + + private int counter = 0; + + private class FnShoot implements Routine { + @Override + public void run() { + if (counter > 0) return; + if (!tryToConsumeEnergy(techLevel * 120)) return; + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate).norm(body.pieceDist); + Coord lpos = getAbsoluteCoord().add(front); + + int[] colors = { 0x00ff00, 0xffee00, 0xff0066, 0xdd00dd, 0x6600ff, 0x0000ff }; + + RGB color = RGB.fromHex(colors[techLevel - 1]); + + addEntityToScene(new EntityLaser(lpos, front, getEntity(), color, techLevel).setGlobalMovement(false)); + + counter = (int) (Constants.FPS_UPDATE * (0.3 - techLevel * 0.03)); + } + } + + @Override + public void update() { + if (counter > 0) counter--; + } + + + + public PieceLaser() { + initAction(new TriggerBundle(EInput.BTN_DOWN, 0), new FnShoot()); + } + + @Override + public RenderModel getModel() { + return Models.piece_w_laser; + } + + @Override + public double getHealthMax() { + return 2; + } + + @Override + public int getBaseCost() { + return 350; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/weapons/PiecePlasmaGun.java b/src/net/sector/level/ship/modules/pieces/weapons/PiecePlasmaGun.java new file mode 100644 index 0000000..b054858 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/weapons/PiecePlasmaGun.java @@ -0,0 +1,61 @@ +package net.sector.level.ship.modules.pieces.weapons; + + +import net.sector.Constants; +import net.sector.entities.shots.EntityPlasma; +import net.sector.input.EInput; +import net.sector.input.Routine; +import net.sector.input.TriggerBundle; +import net.sector.level.ship.modules.pieces.PieceWeaponBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +public class PiecePlasmaGun extends PieceWeaponBase { + + private int counter = 0; + + private class FnShoot implements Routine { + @Override + public void run() { + if (counter > 0) return; + if (!tryToConsumeEnergy(techLevel * 180)) return; + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate).norm(body.pieceDist); + Coord lpos = getAbsoluteCoord().add(front); + + addEntityToScene(new EntityPlasma(lpos, front, getEntity(), techLevel).setGlobalMovement(false)); + + counter = (int) (Constants.FPS_UPDATE * (0.5 - techLevel * 0.04)); + } + } + + @Override + public void update() { + if (counter > 0) counter--; + } + + public PiecePlasmaGun() { + initAction(new TriggerBundle(EInput.BTN_DOWN, 0), new FnShoot()); + } + + @Override + public RenderModel getModel() { + return Models.piece_w_plasma; + } + + @Override + public double getHealthMax() { + return 4; + } + + @Override + public int getBaseCost() { + return 400; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/weapons/PieceRocketLauncher.java b/src/net/sector/level/ship/modules/pieces/weapons/PieceRocketLauncher.java new file mode 100644 index 0000000..392cbb8 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/weapons/PieceRocketLauncher.java @@ -0,0 +1,71 @@ +package net.sector.level.ship.modules.pieces.weapons; + + +import net.sector.Constants; +import net.sector.entities.shots.EntityMissileDirect; +import net.sector.input.EInput; +import net.sector.input.Routine; +import net.sector.input.TriggerBundle; +import net.sector.level.ship.modules.pieces.PieceWeaponBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Rocket launcher. + * + * @author MightyPork + */ +public class PieceRocketLauncher extends PieceWeaponBase { + + private int counter = 0; + + private class FnShoot implements Routine { + @Override + public void run() { + if (counter > 0) return; + if (!tryToConsumeEnergy(techLevel * 800)) return; + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate).norm(body.pieceDist); + Coord pos = getAbsoluteCoord().add(front); + + int rocketLevel = techLevel; + + addEntityToScene(new EntityMissileDirect(pos, front, getEntity(), rocketLevel).setGlobalMovement(false)); + + counter = (int) (Constants.FPS_UPDATE * (3.5 - techLevel * 0.4)); + } + } + + @Override + public void update() { + if (counter > 0) counter--; + } + + /** + * Rocket launcher (level 3+ is guided missile) + */ + public PieceRocketLauncher() { + initAction(new TriggerBundle(EInput.BTN_DOWN, 1), new FnShoot()); + } + + @Override + public RenderModel getModel() { + return Models.piece_w_rocket; + } + + @Override + public double getHealthMax() { + return 4; + } + + @Override + public int getBaseCost() { + return 500; + } + +} diff --git a/src/net/sector/level/ship/modules/pieces/weapons/PieceRocketLauncherGuided.java b/src/net/sector/level/ship/modules/pieces/weapons/PieceRocketLauncherGuided.java new file mode 100644 index 0000000..5400477 --- /dev/null +++ b/src/net/sector/level/ship/modules/pieces/weapons/PieceRocketLauncherGuided.java @@ -0,0 +1,71 @@ +package net.sector.level.ship.modules.pieces.weapons; + + +import net.sector.Constants; +import net.sector.entities.shots.EntityMissileGuided; +import net.sector.input.EInput; +import net.sector.input.Routine; +import net.sector.input.TriggerBundle; +import net.sector.level.ship.modules.pieces.PieceWeaponBase; +import net.sector.models.Models; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.util.CoordUtils; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; + + +/** + * Rocket launcher. + * + * @author MightyPork + */ +public class PieceRocketLauncherGuided extends PieceWeaponBase { + + private int counter = 0; + + private class FnShoot implements Routine { + @Override + public void run() { + if (counter > 0) return; + if (!tryToConsumeEnergy(techLevel * 1200)) return; + + Vec front = CoordUtils.getLocalAxisZ(getRotY() + pieceRotate).norm(body.pieceDist); + Coord pos = getAbsoluteCoord().add(front); + + int rocketLevel = techLevel; + + addEntityToScene(new EntityMissileGuided(pos, front, getEntity(), rocketLevel).setGlobalMovement(true)); + + counter = (int) (Constants.FPS_UPDATE * (4.2 - techLevel * 0.4)); + } + } + + @Override + public void update() { + if (counter > 0) counter--; + } + + /** + * Rocket launcher (level 3+ is guided missile) + */ + public PieceRocketLauncherGuided() { + initAction(new TriggerBundle(EInput.BTN_DOWN, 1), new FnShoot()); + } + + @Override + public RenderModel getModel() { + return Models.piece_w_rocketG; + } + + @Override + public double getHealthMax() { + return 4; + } + + @Override + public int getBaseCost() { + return 700; + } + +} diff --git a/src/net/sector/level/spawners/AsteroidSpawner.java b/src/net/sector/level/spawners/AsteroidSpawner.java new file mode 100644 index 0000000..7614b21 --- /dev/null +++ b/src/net/sector/level/spawners/AsteroidSpawner.java @@ -0,0 +1,158 @@ +package net.sector.level.spawners; + + +import java.util.Map; + +import net.sector.collision.Scene; +import net.sector.entities.Entity; +import net.sector.entities.natural.EntityAsteroid; +import net.sector.level.dataobj.AiObjParser; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc; +import com.porcupine.math.Range; + + +/** + * Asteroid field generator + * + * @author MightyPork + */ +public class AsteroidSpawner extends SpawnerBase { + + private Range asteroidSize = new Range(2, 8); + private double speed = 1; + private Range healthMul = new Range(1); + + private int rarity = 8; + private int type = -1; + + /** + * Asteroid generator + * + * @param scene scene + */ + public AsteroidSpawner(Scene scene) { + super(scene); + } + + /** + * Set asteroid speed + * + * @param speed speed (default 1) + */ + public void setAsteroidSpeed(double speed) { + this.speed = speed; + } + + /** + * Set asteroid type + * + * @param type type (0-5) + */ + public void setAsteroidType(int type) { + this.type = type; + } + + /** + * Set entity health multiplier + * + * @param health health multiplier (1 = default) + */ + public void setHealthMul(Range health) { + healthMul = health; + } + + /** + * Set asteroid size (relative) + * + * @param size (default 2 - 8) + */ + public void setAsteroidSize(Range size) { + asteroidSize = size.copy(); + } + + /** + * Set spawn rarity (0 = super common (bad), 100 = every 100 ticks) + * + * @param rate (default 100) + */ + public void setRarity(int rate) { + this.rarity = rate; + } + + /** + * Spawn asteroids if needed. + */ + @Override + public void onUpdate() { + if (rand.nextInt(rarity + 1) == 0) { + double y = 0; + + double S = 0.4; + Vec motion = new Vec(-S * speed + rand.nextDouble() * S * speed * 2, 0, 0 + rand.nextDouble() * S * speed); + + if (motion.size() > 0.4) motion.norm(0.4); + + double size1 = Calc.clampd(asteroidSize.randDouble(), 0.005, 20); + double size2 = Calc.clampd(asteroidSize.randDouble(), 0.005, 20); + double scale = 0.05 + ((size1 + size2) / 2) * 0.2; + + Entity rock; + if (type == -1) { + rock = new EntityAsteroid(scale, Coord.ZERO, motion); + } else { + rock = new EntityAsteroid(scale, Coord.ZERO, motion, type); + } + + rock.healthMul = healthMul.randDouble(); + + int tries = 0; + Coord pos; + while (true) { + pos = new Coord(xCoord.randDouble(), y, zCoord.randDouble()); + if (scene.getEntitiesInRange(pos, rock.getRadius() + 0.3).size() <= 0) break; + + tries++; + if (tries > 10) return; + } + + rock.getPos().setTo(pos); + scene.add(rock); + + } + } + + @Override + public void loadFromXmlArgs(Map args) { + /* + * + * optional: + * + * + * + * + * + * + * + */ + + // default 2:8 + setAsteroidSize(AiObjParser.getRange(args.get("size"), asteroidSize)); + + // relative, 1 default + setAsteroidSpeed(AiObjParser.getDouble(args.get("speed"), speed)); + + setAsteroidType(AiObjParser.getInteger(args.get("type"), type)); + + setRarity(AiObjParser.getInteger(args.get("rarity"), rarity)); + setHealthMul(AiObjParser.getRange(args.get("health"), healthMul)); + + Range x = AiObjParser.getRange(args.get("x"), xCoord); + Range z = AiObjParser.getRange(args.get("z"), zCoord); + setZone(x, z); + + } + +} diff --git a/src/net/sector/level/spawners/EnemySpawner.java b/src/net/sector/level/spawners/EnemySpawner.java new file mode 100644 index 0000000..59c9024 --- /dev/null +++ b/src/net/sector/level/spawners/EnemySpawner.java @@ -0,0 +1,178 @@ +package net.sector.level.spawners; + + +import java.util.Map; + +import net.sector.collision.Scene; +import net.sector.entities.EntityNavigable; +import net.sector.level.SuperContext; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.drivers.DriverStore; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Range; + + +/** + * Asteroid field generator + * + * @author MightyPork + */ +public class EnemySpawner extends SpawnerBase { + + private Range entitySize = new Range(1); + private Range speedMul = null; + private Range healthMul = new Range(1); + private String driver = null; + private String wave = null; + private DriverStore drivers = SuperContext.basicDrivers; + + private int rarity = 100; + + private String entityName = ""; + + + /** + * Asteroid generator + * + * @param scene scene + */ + public EnemySpawner(Scene scene) { + super(scene); + } + + /** + * Set driver store (basic store is default) + * + * @param store driver store + */ + public void setDriverStore(DriverStore store) { + drivers = store; + } + + /** + * Set spawned entity + * + * @param entityType entity name + */ + public void setEntity(String entityType) { + entityName = entityType; + } + + /** + * Set spawned entity driver + * + * @param driver entity driver + */ + public void setDriver(String driver) { + this.driver = driver; + } + + /** + * Set spawned entity wave + * + * @param wave entity driver + */ + public void setWave(String wave) { + this.wave = wave; + } + + /** + * Set entity size (relative) + * + * @param size (default 1) + */ + public void setEntitySize(Range size) { + entitySize = size.copy(); + } + + /** + * Set entity speed + * + * @param speed (1 = default) + */ + public void setEntitySpeed(Range speed) { + speedMul = speed; + } + + /** + * Set entity health multiplier + * + * @param health health multiplier (1 = default) + */ + public void setHealthMul(Range health) { + healthMul = health; + } + + /** + * Set spawn rarity (0 = super common (bad), 100 = every 100 ticks) + * + * @param rate (default 100) + */ + public void setRarity(int rate) { + this.rarity = rate; + } + + /** + * Spawn asteroids if needed. + */ + @Override + public void onUpdate() { + if (rand.nextInt(rarity + 1) == 0) { + double y = 0; + + double scale = entitySize.randDouble(); + + EntityNavigable ent = EntityRegistry.buildEntity(entityName, Coord.ZERO); + ent.adjustForScale(scale); + if (speedMul != null) ent.setStableSpeedMultiplier(speedMul.randDouble()); + + int tries = 0; + Coord pos; + while (true) { + pos = new Coord(xCoord.randDouble(), y, zCoord.randDouble()); + if (scene.getEntitiesInRange(pos, ent.getRadius() + 0.3).size() <= 0) break; + + tries++; + if (tries > 15) return; + } + + ent.getPos().setTo(pos); + if (driver != null) ent.setDriver(drivers.getDriver(driver)); + + if (wave != null) getLevel().addToWave(wave, ent); + + scene.add(ent); + } + } + + @Override + public void loadFromXmlArgs(Map args) { + /* + * + * + * + * optional: + * + * + * + * + * + * + */ + + setEntity(AiObjParser.getString(args.get("entity"), entityName)); + setDriver(AiObjParser.getString(args.get("driver"), driver)); + setWave(AiObjParser.getString(args.get("wave"), wave)); + setEntitySize(AiObjParser.getRange(args.get("size"), entitySize)); + + setHealthMul(AiObjParser.getRange(args.get("health"), healthMul)); + setEntitySpeed(AiObjParser.getRange(args.get("speed"), speedMul)); + + setRarity(AiObjParser.getInteger(args.get("rarity"), rarity)); + + Range x = AiObjParser.getRange(args.get("x"), xCoord); + Range z = AiObjParser.getRange(args.get("z"), zCoord); + setZone(x, z); + } +} diff --git a/src/net/sector/level/spawners/EntityRegistry.java b/src/net/sector/level/spawners/EntityRegistry.java new file mode 100644 index 0000000..ccc476f --- /dev/null +++ b/src/net/sector/level/spawners/EntityRegistry.java @@ -0,0 +1,101 @@ +package net.sector.level.spawners; + + +import java.util.HashMap; + +import net.sector.entities.EntityNavigable; +import net.sector.entities.enemies.*; +import net.sector.level.drivers.TaskList; +import net.sector.util.Log; + +import com.porcupine.coord.Coord; + + +/** + * Entity registry for easier spawning + * + * @author MightyPork + */ +public class EntityRegistry { + + private static HashMap> entities = new HashMap>(); + + /** + * Initialize + */ + public static void init() { + Log.f1("Initializing entity registry..."); + entities.put("mine", EntityMine.class); + entities.put("bird", EntityShipBird.class); + entities.put("burger", EntityShipBurger.class); + entities.put("burger_king", EntityShipBurgerKing.class); + entities.put("falcon", EntityShipFalcon.class); + entities.put("fighter", EntityShipFighter.class); + entities.put("shark", EntityShipShark.class); + entities.put("snake", EntityShipCube.class); + } + + /** + * Get entity instance + * + * @param type entity type + * @param pos position + * @return entity + */ + public static EntityNavigable buildEntity(String type, Coord pos) { + try { + return entities.get(type).getDeclaredConstructor(Coord.class).newInstance(pos); + } catch (Exception e) { + Log.e("Could not instantiate entity '" + type + "' with Coord argument."); + return null; + } + } + + /** + * Get entity instance + * + * @param type entity type + * @param scale relative scale + * @param pos position + * @return entity + */ + public static EntityNavigable buildEntity(String type, double scale, Coord pos) { + EntityNavigable e = buildEntity(type, pos); + if (e == null) return null; + e.adjustForScale(scale); + return e; + } + + /** + * Get entity instance + * + * @param type entity type + * @param pos position + * @param driver driver (task list) + * @return entity + */ + public static EntityNavigable buildEntity(String type, Coord pos, TaskList driver) { + EntityNavigable e = buildEntity(type, pos); + if (e == null) return null; + e.setDriver(driver); + return e; + } + + /** + * Get entity instance + * + * @param type entity type + * @param scale relative scale + * @param pos position + * @param driver driver (task list) + * @return entity + */ + public static EntityNavigable buildEntity(String type, double scale, Coord pos, TaskList driver) { + EntityNavigable e = buildEntity(type, pos); + if (e == null) return null; + e.adjustForScale(scale); + e.setDriver(driver); + return e; + } + +} diff --git a/src/net/sector/level/spawners/ScoreSpawner.java b/src/net/sector/level/spawners/ScoreSpawner.java new file mode 100644 index 0000000..9fbf9a3 --- /dev/null +++ b/src/net/sector/level/spawners/ScoreSpawner.java @@ -0,0 +1,64 @@ +package net.sector.level.spawners; + + +import java.util.Map; + +import net.sector.Constants; +import net.sector.collision.Scene; +import net.sector.level.SuperContext; +import net.sector.level.dataobj.AiObjParser; +import net.sector.util.Utils; + +import com.porcupine.math.Range; + + +/** + * Score generator + * + * @author MightyPork + */ +public class ScoreSpawner extends SpawnerBase { + + private Range money = new Range(0); + private Range pause = new Range(1); + + private long counter = 0; + private double nextReward = 0; + + /** + * Score generator + * + * @param scene scene + */ + public ScoreSpawner(Scene scene) { + super(scene); + } + + /** + * Spawn score + */ + @Override + public void onUpdate() { + counter++; + double secs = ((double) counter) / ((double) Constants.FPS_UPDATE); + if (secs >= nextReward) { + SuperContext.getGameContext().getCursor().addScore(money.randInt()); + nextReward = secs + pause.randDouble(); + } + } + + @Override + public void loadFromXmlArgs(Map args) { + /* + * // also coins, points + * // also: gap, pause, time, every, secs + * + */ + + money = AiObjParser.getRange(Utils.fallback(args.get("money"), args.get("coins"), args.get("points"), 0), money); + + pause = AiObjParser.getRange( + Utils.fallback(args.get("pause"), args.get("time"), args.get("gap"), args.get("delay"), args.get("every"), args.get("secs"), 1), + pause); + } +} diff --git a/src/net/sector/level/spawners/SpawnerBase.java b/src/net/sector/level/spawners/SpawnerBase.java new file mode 100644 index 0000000..44a1e9d --- /dev/null +++ b/src/net/sector/level/spawners/SpawnerBase.java @@ -0,0 +1,113 @@ +package net.sector.level.spawners; + + +import java.util.Map; +import java.util.Random; + +import net.sector.collision.Scene; +import net.sector.level.sequence.LevelController; + +import com.porcupine.math.Range; + + +/** + * Base for natural stuff generators (asteroids etc.) + * + * @author MightyPork + */ +public abstract class SpawnerBase { + /** Flag whether this generator is enabled */ + protected boolean enabled = true; + + private LevelController level; + + /** Scene instance */ + protected Scene scene; + /** Z range */ + protected Range zCoord = new Range(100, 120); + /** X range */ + protected Range xCoord = new Range(-30, 30); + + /** RNG */ + protected static Random rand = new Random(); + + /** + * Enable/disable the generator + * + * @param state enabled + */ + public void enable(boolean state) { + enabled = state; + } + + + /** + * lead generator from XML arguments + * + * @param args xml arguments + */ + public SpawnerBase(Map args) { + loadFromXmlArgs(args); + } + + public void setLevel(LevelController level) { + this.level = level; + } + + public LevelController getLevel() { + return level; + } + + /** + * Entity generator + * + * @param scene scene + */ + public SpawnerBase(Scene scene) { + setScene(scene); + } + + /** + * Init from XML arguments + * + * @param args map of arguments + */ + public abstract void loadFromXmlArgs(Map args); + + /** + * Asteroid generator (needs initialization) + */ + public SpawnerBase() {} + + /** + * Set entity generation zone (usual scene size: x -40 - 40, z 0 - 100) + * + * @param x x range (default -30,30) + * @param z z range (default 90, 110) + */ + public void setZone(Range x, Range z) { + if (x != null) xCoord.setTo(x); + if (z != null) zCoord.setTo(z); + } + + /** + * Set the scene + * + * @param scene scene + */ + public void setScene(Scene scene) { + this.scene = scene; + } + + /** + * Spawn entities if enabled + */ + public final void onGameTick() { + if (enabled) onUpdate(); + } + + /** + * Update the generator, eg. spawn some rocks if rand.nextInt() == 100 + */ + protected abstract void onUpdate(); +} diff --git a/src/net/sector/models/ModelAsteroid.java b/src/net/sector/models/ModelAsteroid.java new file mode 100644 index 0000000..ab23774 --- /dev/null +++ b/src/net/sector/models/ModelAsteroid.java @@ -0,0 +1,37 @@ +package net.sector.models; + + +import com.porcupine.math.Calc; + + +public class ModelAsteroid extends PhysModel { + + public ModelAsteroid(String resource, double renderScale, double colliderRadius, double density, int health, int score) { + super(resource, renderScale, colliderRadius, density, health, score); + } + + public ModelAsteroid(ModelAsteroid resource, String texture) { + super(resource, texture); + } + + private double getVolume(double scale) { + return (1.333 * 3.1416 * Calc.cube(scale)); + } + + @Override + public double getMass(double scale) { + return getVolume(scale) * density; + } + + @Override + public double getHealth(double scale) { + return Math.pow(scale, 1.2) * health; + } + + @Override + public double getScore(double scale) { + return Math.pow(scale, 1.2) * score; + } + + +} diff --git a/src/net/sector/models/ModelEnemyShip.java b/src/net/sector/models/ModelEnemyShip.java new file mode 100644 index 0000000..e8e5cfb --- /dev/null +++ b/src/net/sector/models/ModelEnemyShip.java @@ -0,0 +1,41 @@ +package net.sector.models; + + +import net.sector.models.wavefront.loader.RenderModel; + +import com.porcupine.math.Calc; + + +public class ModelEnemyShip extends PhysModel { + + public ModelEnemyShip(String resource, double renderScale, double colliderRadius, double density, int health, int score) { + super(resource, renderScale, colliderRadius, density, health, score); + } + + public ModelEnemyShip(PhysModel resource, String texture) { + super(resource, texture); + } + + public ModelEnemyShip(RenderModel model, double renderScale, double colliderRadius, int density, int health, int score) { + super(model, renderScale, colliderRadius, density, health, score); + } + + private double getVolume(double scale) { + return (3.1416 * Calc.square(scale)); + } + + @Override + public double getMass(double scale) { + return getVolume(scale) * density; + } + + @Override + public double getHealth(double scale) { + return Math.pow(scale, 1.2) * health; + } + + @Override + public double getScore(double scale) { + return Math.pow(scale, 1.2) * score; + } +} diff --git a/src/net/sector/models/ModelRocket.java b/src/net/sector/models/ModelRocket.java new file mode 100644 index 0000000..cca550a --- /dev/null +++ b/src/net/sector/models/ModelRocket.java @@ -0,0 +1,35 @@ +package net.sector.models; + + +import com.porcupine.math.Calc; + + +public class ModelRocket extends PhysModel { + + public ModelRocket(String resource, double renderScale, double colliderRadius, double density, int health, int score) { + super(resource, renderScale, colliderRadius, density, health, score); + } + + public ModelRocket(ModelRocket resource, String texture) { + super(resource, texture); + } + + private double getVolume(double scale) { + return (3.1416 * Calc.square(scale)); + } + + @Override + public double getMass(double scale) { + return getVolume(scale) * density; + } + + @Override + public double getScore(double scale) { + return Math.pow(scale, 1.2) * score; + } + + @Override + public double getHealth(double scale) { + return Math.pow(scale, 1.2) * health; + } +} diff --git a/src/net/sector/models/Models.java b/src/net/sector/models/Models.java new file mode 100644 index 0000000..f5d7bb4 --- /dev/null +++ b/src/net/sector/models/Models.java @@ -0,0 +1,240 @@ +package net.sector.models; + + +import static org.lwjgl.opengl.GL11.*; + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.sector.Constants; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.textures.TextureManager; +import net.sector.util.Log; + +import com.porcupine.math.Calc; +import com.porcupine.math.Calc.Buffers; + + +public class Models { + + private static Random rand = new Random(); + + //@formatter:off + public static List[] rockTypes = { + new ArrayList(), + new ArrayList(), + new ArrayList(), + new ArrayList(), + new ArrayList(), + new ArrayList() + }; + //@formatter:on + + public static PhysModel enemyFighter; + public static PhysModel enemyFalcon; + public static PhysModel enemyShark; + public static PhysModel spaceMine; + public static PhysModel enemyBird; + public static PhysModel enemyBurger; + public static PhysModel[] enemyCube; + + public static RenderModel orbShield; + public static RenderModel orbArtifact; + + public static PhysModel rocketThin, rocketFat; + + public static RenderModel piece_bb_arrow; + public static RenderModel piece_bb_cube; + public static RenderModel piece_bb_point; + public static RenderModel piece_bb_triangle; + + public static RenderModel piece_bs_corner1_side1; + public static RenderModel piece_bs_corner1_side1_m; + public static RenderModel piece_bs_corner1_side2; + public static RenderModel piece_bs_corner1; + public static RenderModel piece_bs_corner2_side1; + public static RenderModel piece_bs_corner2_next; + public static RenderModel piece_bs_corner2_opp; + public static RenderModel piece_bs_corner3; + public static RenderModel piece_bs_corner4; + public static RenderModel piece_bs_point; + public static RenderModel piece_bs_side1; + public static RenderModel piece_bs_side2_next; + public static RenderModel piece_bs_side2_opp; + public static RenderModel piece_bs_side3; + public static RenderModel piece_bs_triangle; + + public static RenderModel piece_bw_arrow; + public static RenderModel piece_bw_cube; + public static RenderModel piece_bw_triangle; + + public static RenderModel piece_engine; + public static RenderModel piece_engine_big; + + public static RenderModel piece_w_cannon; + public static RenderModel piece_w_emp; + public static RenderModel piece_w_laser; + public static RenderModel piece_w_rocket; + public static RenderModel piece_w_rocketG; + public static RenderModel piece_w_plasma; + public static RenderModel piece_w_flame; + + public static ModelEnemyShip enemyBurgerKing; + + + + @SuppressWarnings("unchecked") + public static void load() { + + Log.f2("Loading asteroids..."); + + // asteroid loading with various models and textures. + String prefix = "res/models/asteroids/"; + String[] models = { "asteroid02.obj", "asteroid03.obj", "asteroid04.obj", "asteroid05.obj", "asteroid06.obj", "shard01.obj", "shard02.obj" }; + String[] textures = { "limestone.jpg", "black.jpg", "moon.jpg", "moon_big.jpg", "red.jpg", "brown.jpg" }; + + // all asteroid materials are by default with limestone.jpg texture. + for (String model : models) { + ((List) rockTypes[0]).add(new ModelAsteroid(prefix + model, 0.98, 1.1, 5, 30, 30)); + } + for (int i = 1; i < textures.length; i++) { + String tx = textures[i]; + for (int j = 0; j < rockTypes[0].size(); j++) { + ((List) rockTypes[i]).add(new ModelAsteroid((ModelAsteroid) rockTypes[0].get(j), tx)); + } + } + + + Log.f2("Loading enemies and rockets..."); + + rocketFat = new ModelRocket("res/models/shots/rocket_fat.obj", 0.35, 0.5, 4, 10, 0); + rocketThin = new ModelRocket("res/models/shots/rocket_thin.obj", 0.8, 0.9, 4, 10, 0); + + enemyFighter = new ModelEnemyShip("res/models/ships/fighter/starship1.obj", 3.47, 1.1, 3, 16, 100); + enemyFalcon = new ModelEnemyShip("res/models/ships/falcon/starship2.obj", 0.7, 1.2, 10, 80, 500); + enemyShark = new ModelEnemyShip("res/models/ships/shark/shark.obj", 1.5, 1.6, 3, 200, 750); + enemyBird = new ModelEnemyShip("res/models/ships/bird/bird.obj", 0.4, 1.1, 3, 10, 100); + enemyBurger = new ModelEnemyShip("res/models/ships/burger/burger.obj", 0.6, 0.7, 3, 20, 200); + enemyBurgerKing = new ModelEnemyShip(enemyBurger.model, 3, 3, 10, 220, 800); + + spaceMine = new ModelEnemyShip("res/models/ships/mine/mine.obj", 0.2, 0.6, 100, 10, 80); + + enemyCube = new PhysModel[5]; + enemyCube[0] = new ModelEnemyShip("res/models/ships/cube/cube.obj", 0.6, 0.7, 3, 20, 60); + enemyCube[1] = new ModelEnemyShip(enemyCube[0], "cube_red.png"); + enemyCube[2] = new ModelEnemyShip(enemyCube[0], "cube_blue.png"); + enemyCube[3] = new ModelEnemyShip(enemyCube[0], "cube_purple.png"); + enemyCube[4] = new ModelEnemyShip(enemyCube[0], "cube_yellow.png"); + + Log.f2("Loading ship body pieces..."); + + String body = "res/models/playership/body/"; + String misc = "res/models/playership/misc/"; + String weapons = "res/models/playership/weapons/"; + String powerup = "res/models/powerup/"; + + piece_bb_arrow = new RenderModel(body + "bb_arrow.obj"); + piece_bb_cube = new RenderModel(body + "bb_cube.obj"); + piece_bb_point = new RenderModel(body + "bb_point.obj"); + piece_bb_triangle = new RenderModel(body + "bb_triangle.obj"); + + piece_bs_corner1_side1 = new RenderModel(body + "bs_corner1_side1.obj"); + piece_bs_corner1_side1_m = new RenderModel(body + "bs_corner1_side1_m.obj"); + piece_bs_corner1_side2 = new RenderModel(body + "bs_corner1_side2.obj"); + piece_bs_corner1 = new RenderModel(body + "bs_corner1.obj"); + piece_bs_corner2_side1 = new RenderModel(body + "bs_corner2_side1.obj"); + piece_bs_corner2_next = new RenderModel(body + "bs_corner2_next.obj"); + piece_bs_corner2_opp = new RenderModel(body + "bs_corner2_opp.obj"); + piece_bs_corner3 = new RenderModel(body + "bs_corner3.obj"); + piece_bs_corner4 = new RenderModel(body + "bs_corner4.obj"); + piece_bs_point = new RenderModel(body + "bs_point.obj"); + piece_bs_side1 = new RenderModel(body + "bs_side1.obj"); + piece_bs_side2_next = new RenderModel(body + "bs_side2_next.obj"); + piece_bs_side2_opp = new RenderModel(body + "bs_side2_opp.obj"); + piece_bs_side3 = new RenderModel(body + "bs_side3.obj"); + piece_bs_triangle = new RenderModel(body + "bs_triangle.obj"); + + piece_bw_arrow = new RenderModel(body + "bw_arrow.obj"); + piece_bw_cube = new RenderModel(body + "bw_cube.obj"); + piece_bw_triangle = new RenderModel(body + "bw_triangle.obj"); + + piece_engine = new RenderModel(misc + "engine.obj"); + piece_engine_big = new RenderModel(misc + "engine_big.obj"); + + piece_w_cannon = new RenderModel(weapons + "w_cannon.obj"); + piece_w_emp = new RenderModel(weapons + "w_emp.obj"); + piece_w_laser = new RenderModel(weapons + "w_laser.obj"); + piece_w_rocket = new RenderModel(weapons + "w_rocket.obj"); + piece_w_plasma = new RenderModel(weapons + "w_plasma.obj"); + piece_w_flame = new RenderModel(weapons + "w_flame.obj"); + piece_w_rocketG = new RenderModel(weapons + "w_rocket2.obj"); + + Log.f2("Loading power-up models..."); + + orbShield = new RenderModel(powerup + "sphere.obj", "blue-silver.png"); + orbArtifact = new RenderModel(orbShield, "red-gold.png"); + } + + public static PhysModel pickAsteroidOfType(int type) { + type = Calc.clampi(type, 0, rockTypes.length); + return (PhysModel) Calc.pick(rockTypes[type]); + } + + private static int beginList = -1; + private static int endList = -1; + + + public static void renderBegin() { + if (beginList == -1) { + beginList = glGenLists(1); + glNewList(beginList, GL_COMPILE); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_COLOR_MATERIAL); + glEnable(GL_CULL_FACE); + + float spec = Constants.SCENE_MAT_SPECULAR; + float amb = Constants.SCENE_MAT_AMBIENT; + float diff = Constants.SCENE_MAT_DIFFUSE; + + FloatBuffer buff = Calc.Buffers.mkBuff(4); + + Calc.Buffers.fillBuff(buff, amb, amb, amb, 1.0f); + glMaterial(GL_FRONT, GL_AMBIENT, Buffers.fBuff(amb, amb, amb, 1f)); + + buff.clear(); + Calc.Buffers.fillBuff(buff, spec, spec, spec, 1.0f); + glLight(GL_LIGHT0, GL_SPECULAR, buff); + glMaterial(GL_FRONT, GL_SPECULAR, Buffers.fBuff(spec, spec, spec, 1f)); + + buff.clear(); + Calc.Buffers.fillBuff(buff, diff, diff, diff, 1.0f); + glLight(GL_LIGHT0, GL_DIFFUSE, buff); + glMaterial(GL_FRONT, GL_DIFFUSE, Buffers.fBuff(diff, diff, diff, 1f)); + glMaterialf(GL_FRONT, GL_SHININESS, 8); + + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); + + glColor4d(1, 1, 1, 1); + glEndList(); + } + glCallList(beginList); + } + + public static void renderEnd() { + if (endList == -1) { + endList = glGenLists(1); + glNewList(endList, GL_COMPILE); + glDisable(GL_COLOR_MATERIAL); + glDisable(GL_CULL_FACE); + TextureManager.unbind(); + glDisable(GL_TEXTURE_2D); + glEndList(); + } + glCallList(endList); + } + +} diff --git a/src/net/sector/models/PhysModel.java b/src/net/sector/models/PhysModel.java new file mode 100644 index 0000000..2786e17 --- /dev/null +++ b/src/net/sector/models/PhysModel.java @@ -0,0 +1,63 @@ +package net.sector.models; + + +import net.sector.models.wavefront.loader.RenderModel; + + +public abstract class PhysModel { + + public double renderScale = 1; + public double colliderRadius = 1; + public double density = 1; + public int health = 8; + public int score = 10; + + public RenderModel model = null; + + public PhysModel(String modelpath, double renderScale, double colliderRadius, double density, int health, int score) { + this.renderScale = renderScale; + this.colliderRadius = colliderRadius; + this.density = density; + this.model = new RenderModel(modelpath); + this.health = health; + this.score = score; + } + + public PhysModel(RenderModel resource, String texture, double renderScale, double colliderRadius, double density, int health, int score) { + this.renderScale = renderScale; + this.colliderRadius = colliderRadius; + this.density = density; + this.model = new RenderModel(resource, texture); + this.health = health; + this.score = score; + } + + public PhysModel(PhysModel other, String texture) { + this.renderScale = other.renderScale; + this.colliderRadius = other.colliderRadius; + this.density = other.density; + this.model = new RenderModel(other.model, texture); + this.health = other.health; + this.score = other.score; + } + + public PhysModel(RenderModel model, double renderScale, double colliderRadius, int density, int health, int score) { + this.renderScale = renderScale; + this.colliderRadius = colliderRadius; + this.density = density; + this.model = model; + this.health = health; + this.score = score; + } + + public abstract double getMass(double scale); + + public abstract double getHealth(double scale); + + public abstract double getScore(double scale); + + public void render() { + model.render(); + } + +} diff --git a/src/net/sector/models/wavefront/loader/Face.java b/src/net/sector/models/wavefront/loader/Face.java new file mode 100644 index 0000000..9ab25f8 --- /dev/null +++ b/src/net/sector/models/wavefront/loader/Face.java @@ -0,0 +1,67 @@ +package net.sector.models.wavefront.loader; + + + +public class Face { + + public static final int GL_TRIANGLES = 3; + public static final int GL_QUADS = 4; + + private Vertex[] vertices; + private Vertex[] normals; + private TextureCoordinate[] textures; + private Material material; + + private int type; + + public Face copy() { + Face f = new Face(); + f.setVertices(vertices); + f.setNormals(normals); + f.setTextures(textures); + f.setMaterial(material); + return f; + } + + public Vertex[] getVertices() { + return vertices; + } + + public void setVertices(Vertex[] vertices) { + this.vertices = vertices; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public Vertex[] getNormals() { + return normals; + } + + public void setNormals(Vertex[] normals) { + this.normals = normals; + } + + public TextureCoordinate[] getTextures() { + return textures; + } + + public void setTextures(TextureCoordinate[] textures) { + this.textures = textures; + } + + public Material getMaterial() { + return material; + } + + public void setMaterial(Material material) { + this.material = material; + } + + +} diff --git a/src/net/sector/models/wavefront/loader/LineParserFactory.java b/src/net/sector/models/wavefront/loader/LineParserFactory.java new file mode 100644 index 0000000..029759e --- /dev/null +++ b/src/net/sector/models/wavefront/loader/LineParserFactory.java @@ -0,0 +1,36 @@ +package net.sector.models.wavefront.loader; + + +import java.util.Hashtable; + +import net.sector.models.wavefront.parser.DefaultParser; +import net.sector.models.wavefront.parser.LineParser; + + + +public abstract class LineParserFactory { + + protected Hashtable parsers = new Hashtable(); + protected RenderModel object = null; + + + public LineParser getLineParser(String line) { + if (line == null) return null; + + line = line.replaceAll(" ", " "); + line = line.replaceAll(" ", ""); + String[] lineWords = line.split(" "); + + if (lineWords.length < 1) return new DefaultParser(); + + String lineType = lineWords[0]; + + LineParser parser = parsers.get(lineType); + if (parser == null) { + parser = new DefaultParser(); + } + + parser.setWords(lineWords); + return parser; + } +} diff --git a/src/net/sector/models/wavefront/loader/Material.java b/src/net/sector/models/wavefront/loader/Material.java new file mode 100644 index 0000000..7171cf2 --- /dev/null +++ b/src/net/sector/models/wavefront/loader/Material.java @@ -0,0 +1,50 @@ +package net.sector.models.wavefront.loader; + + +import org.newdawn.slick.opengl.Texture; + + +public class Material { + + private Texture texture; + private Vertex Kd; + private String name; + + public Material(String name) { + this.name = name; + } + + public Material(Material other) { + //this.texture = other.texture; + this.Kd = other.Kd; + this.name = other.name; + } + + public Texture getTexture() { + return texture; + } + + public Material setTexture(Texture texture) { + this.texture = texture; + return this; + } + + public Vertex getKd() { + return Kd; + } + + public void setKa(Vertex kd) { + Kd = kd; + } + + @Override + public String toString() { + return "MAT." + name; + } + + public String getName() { + return name; + } + + +} diff --git a/src/net/sector/models/wavefront/loader/NormalParser.java b/src/net/sector/models/wavefront/loader/NormalParser.java new file mode 100644 index 0000000..b622c7f --- /dev/null +++ b/src/net/sector/models/wavefront/loader/NormalParser.java @@ -0,0 +1,33 @@ +package net.sector.models.wavefront.loader; + + +import net.sector.models.wavefront.parser.LineParser; + + +public class NormalParser extends LineParser { + + Vertex vertex = null; + + public NormalParser() {} + + @Override + public void parse() { + vertex = new Vertex(); + + try { + vertex.setX(Float.parseFloat(words[1])); + vertex.setY(Float.parseFloat(words[2])); + vertex.setZ(Float.parseFloat(words[3])); + } catch (Exception e) { + throw new RuntimeException("NormalParser Error"); + } + + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + wavefrontObject.getNormals().add(vertex); + + } + +} diff --git a/src/net/sector/models/wavefront/loader/RenderModel.java b/src/net/sector/models/wavefront/loader/RenderModel.java new file mode 100644 index 0000000..2ec19f8 --- /dev/null +++ b/src/net/sector/models/wavefront/loader/RenderModel.java @@ -0,0 +1,303 @@ +package net.sector.models.wavefront.loader; + + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Map.Entry; + +import net.sector.Constants; +import net.sector.models.wavefront.parser.LineParser; +import net.sector.models.wavefront.parser.obj.ObjLineParserFactory; +import net.sector.textures.TextureManager; +import net.sector.util.Log; + +import org.lwjgl.opengl.GL11; +import org.newdawn.slick.opengl.Texture; +import org.newdawn.slick.util.ResourceLoader; + + + +/** + * OBJ 3D object loaded and pre-rendered. + * + * @author Fabien Sanglard + */ +public class RenderModel { + + private static final boolean DEBUG = Constants.LOG_MODELS; + + public String replTexture = null; + + private ArrayList vertices = new ArrayList(); + private ArrayList normals = new ArrayList(); + private ArrayList textures = new ArrayList(); + private ArrayList faces = new ArrayList(); + + private ObjLineParserFactory parserFactory; + private Hashtable materials = new Hashtable(); + + // This variable is used for both parsing and rendition + private Material currentMaterial; + + private String contextfolder = ""; + + public double radius = 0; + + /** + * Load object with alternate texture. + * + * @param fileName + * @param textureName + */ + public RenderModel(String fileName, String textureName) { + this.replTexture = textureName; + + int lastSlashIndex = fileName.lastIndexOf('/'); + if (lastSlashIndex != -1) this.contextfolder = fileName.substring(0, lastSlashIndex + 1); + + lastSlashIndex = fileName.lastIndexOf('\\'); + if (lastSlashIndex != -1) this.contextfolder = fileName.substring(0, lastSlashIndex + 1); + + parse(fileName); + + calculateRadius(); + + if (DEBUG) Log.f3("Model " + fileName + " loaded."); + } + + /** + * Load object with alternate texture. + * + * @param fileName + * @param textureName + */ + public RenderModel(RenderModel other, String textureName) { + this.vertices = other.vertices; + this.normals = other.normals; + this.textures = other.textures; + this.contextfolder = other.contextfolder; + this.radius = other.radius; + + String pathToTextureBinary = getContextfolder() + textureName; + Texture texture = TextureManager.load(pathToTextureBinary); + for (Entry e : other.materials.entrySet()) { + materials.put(e.getKey(), new Material(e.getValue()).setTexture(texture)); + } + for (Face f : other.faces) { + Face f2; + faces.add(f2 = f.copy()); + f2.setMaterial(materials.get(f2.getMaterial().getName())); + } + + } + + public RenderModel(String fileName) { + int lastSlashIndex = fileName.lastIndexOf('/'); + if (lastSlashIndex != -1) this.contextfolder = fileName.substring(0, lastSlashIndex + 1); + + lastSlashIndex = fileName.lastIndexOf('\\'); + if (lastSlashIndex != -1) this.contextfolder = fileName.substring(0, lastSlashIndex + 1); + + parse(fileName); + + calculateRadius(); + + if (DEBUG) Log.f3("Model " + fileName + " loaded."); + } + + + + private void calculateRadius() { + double currentNorm = 0; + for (Vertex vertex : vertices) { + currentNorm = vertex.norm(); + if (currentNorm > radius) radius = currentNorm; + } + + } + + + public String getContextfolder() { + return contextfolder; + } + + + public void parse(String fileName) { + parserFactory = new ObjLineParserFactory(this); + + + InputStream fileInput = ResourceLoader.getResourceAsStream(fileName); + if (fileInput == null) { + // Could not find the file in the jar. + try { + File file = new File(fileName); + if (file.exists()) fileInput = new FileInputStream(file); + } catch (Exception e2) { + e2.printStackTrace(); + } + } + + + BufferedReader in = null; + + try { + in = new BufferedReader(new InputStreamReader(fileInput)); + + String currentLine = null; + while ((currentLine = in.readLine()) != null) + parseLine(currentLine); + + in.close(); + + } catch (Exception e) { + Log.e("Error reading file " + fileName, e); + throw new RuntimeException(e); + } + + +// +// Log.finest("Loaded OBJ from file " + fileName); +// Log.finest(getVertices().size() + " vertices."); +// Log.finest(getNormals().size() + " normals."); +// Log.finest(getTextures().size() + " textures coordinates."); +// Log.finest(getFaces().size() + " faces."); + } + + private int lineCounter = 0; + + private void parseLine(String currentLine) { + if ("".equals(currentLine)) return; + + LineParser parser = parserFactory.getLineParser(currentLine); + try { + parser.parse(); + parser.incoporateResults(this); + } catch (Throwable t) { + Log.e("ERROR at line " + lineCounter + " : " + currentLine, t); + System.exit(1); + } + lineCounter++; + } + + public int displayListId = 0; + + public void render() { + + + if (displayListId != 0) { + GL11.glCallList(displayListId); + return; + } + + displayListId = GL11.glGenLists(1); + + GL11.glNewList(displayListId, GL11.GL_COMPILE); + + Face face = null; + Material material = new Material("__non_existant"); + + for (int i = 0; i < getFaces().size(); i++) { + face = getFaces().get(i); + + if (!material.equals(face.getMaterial())) { + // Set texture and setColor + material = face.getMaterial(); + if (material == null) { + Log.w("No material in model!"); + } else if (material.getTexture() != null) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, material.getTexture().getTextureID()); + } else + GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); + + if (material != null && material.getKd() != null) + GL11.glColor3f(material.getKd().getX(), material.getKd().getY(), material.getKd().getZ()); + } + + if (face.getType() == Face.GL_TRIANGLES) { + GL11.glBegin(GL11.GL_TRIANGLES); + } else if (face.getType() == Face.GL_QUADS) { + GL11.glBegin(GL11.GL_QUADS); + } else { + GL11.glBegin(GL11.GL_POLYGON); + } + + Vertex vertex = null; + Vertex normal = null; + TextureCoordinate textureCoo = null; + for (int j = 0; j < face.getVertices().length; j++) { + vertex = face.getVertices()[j]; + if (j < face.getNormals().length && face.getNormals()[j] != null) { + normal = face.getNormals()[j]; + GL11.glNormal3f(normal.getX(), normal.getY(), normal.getZ()); + } + + if (j < face.getTextures().length && face.getTextures()[j] != null) { + textureCoo = face.getTextures()[j]; + GL11.glTexCoord2f(textureCoo.getU(), textureCoo.getV()); + //GL11.glTexCoord2f(textureCoo.getV(),textureCoo.getU()); + } + + GL11.glVertex3f(vertex.getX(), vertex.getY(), vertex.getZ()); + } + GL11.glEnd(); + } + GL11.glEndList(); + } + + public void setMaterials(Hashtable materials) { + this.materials = materials; + } + + public void setTextures(ArrayList textures) { + this.textures = textures; + } + + public ArrayList getTextures() { + return textures; + } + + public void setVertices(ArrayList vertices) { + this.vertices = vertices; + } + + public ArrayList getVertices() { + return vertices; + } + + public void setFaces(ArrayList faces) { + this.faces = faces; + } + + public ArrayList getFaces() { + return faces; + } + + public void setNormals(ArrayList normals) { + this.normals = normals; + } + + public ArrayList getNormals() { + return normals; + } + + public Hashtable getMaterials() { + + return this.materials; + } + + public Material getCurrentMaterial() { + return currentMaterial; + } + + public void setCurrentMaterial(Material currentMaterial) { + this.currentMaterial = currentMaterial; + } + + + +} diff --git a/src/net/sector/models/wavefront/loader/TextureCoordinate.java b/src/net/sector/models/wavefront/loader/TextureCoordinate.java new file mode 100644 index 0000000..8e93550 --- /dev/null +++ b/src/net/sector/models/wavefront/loader/TextureCoordinate.java @@ -0,0 +1,35 @@ +package net.sector.models.wavefront.loader; + + +public class TextureCoordinate { + + private float u; + private float v; + private float w; + + public float getU() { + return u; + } + + public void setU(float u) { + this.u = u; + } + + public float getV() { + return v; + } + + public void setV(float v) { + this.v = v; + } + + public float getW() { + return w; + } + + public void setW(float w) { + this.w = w; + } + + +} diff --git a/src/net/sector/models/wavefront/loader/Vertex.java b/src/net/sector/models/wavefront/loader/Vertex.java new file mode 100644 index 0000000..7e2670c --- /dev/null +++ b/src/net/sector/models/wavefront/loader/Vertex.java @@ -0,0 +1,45 @@ +package net.sector.models.wavefront.loader; + + +public class Vertex { + + private float x; + private float y; + private float z; + + public Vertex(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Vertex() {} + + public float getX() { + return x; + } + + public void setX(float x) { + this.x = x; + } + + public float getY() { + return y; + } + + public void setY(float y) { + this.y = y; + } + + public float getZ() { + return z; + } + + public void setZ(float z) { + this.z = z; + } + + public double norm() { + return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)); + } +} diff --git a/src/net/sector/models/wavefront/parser/CommentParser.java b/src/net/sector/models/wavefront/parser/CommentParser.java new file mode 100644 index 0000000..7b23a69 --- /dev/null +++ b/src/net/sector/models/wavefront/parser/CommentParser.java @@ -0,0 +1,15 @@ +package net.sector.models.wavefront.parser; + + +import net.sector.models.wavefront.loader.RenderModel; + + +public class CommentParser extends LineParser { + + @Override + public void incoporateResults(RenderModel wavefrontObject) {} + + @Override + public void parse() {} + +} diff --git a/src/net/sector/models/wavefront/parser/DefaultParser.java b/src/net/sector/models/wavefront/parser/DefaultParser.java new file mode 100644 index 0000000..37d0f7e --- /dev/null +++ b/src/net/sector/models/wavefront/parser/DefaultParser.java @@ -0,0 +1,19 @@ +package net.sector.models.wavefront.parser; + + +import net.sector.models.wavefront.loader.RenderModel; + + +public class DefaultParser extends LineParser { + + public DefaultParser() {} + + @Override + public void parse() { + + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) {} + +} diff --git a/src/net/sector/models/wavefront/parser/LineParser.java b/src/net/sector/models/wavefront/parser/LineParser.java new file mode 100644 index 0000000..3282a69 --- /dev/null +++ b/src/net/sector/models/wavefront/parser/LineParser.java @@ -0,0 +1,19 @@ +package net.sector.models.wavefront.parser; + + +import net.sector.models.wavefront.loader.RenderModel; + + +public abstract class LineParser { + + protected String[] words = null; + + public void setWords(String[] words) { + this.words = words; + } + + public abstract void parse(); + + public abstract void incoporateResults(RenderModel wavefrontObject); + +} diff --git a/src/net/sector/models/wavefront/parser/mtl/KdMapParser.java b/src/net/sector/models/wavefront/parser/mtl/KdMapParser.java new file mode 100644 index 0000000..779269b --- /dev/null +++ b/src/net/sector/models/wavefront/parser/mtl/KdMapParser.java @@ -0,0 +1,40 @@ +package net.sector.models.wavefront.parser.mtl; + + +import net.sector.models.wavefront.loader.Material; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.parser.LineParser; +import net.sector.textures.TextureManager; + +import org.newdawn.slick.opengl.Texture; + + +public class KdMapParser extends LineParser { + + private Texture texture = null; + private RenderModel object = null; + private String textureFileName = null; + + public KdMapParser(RenderModel object) { + this.object = object; + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + + if (texture != null) { + Material currentMaterial = wavefrontObject.getCurrentMaterial(); + currentMaterial.setTexture(texture); + } + } + + @Override + public void parse() { + String textureFileName = words[words.length - 1]; + String pathToTextureBinary = object.getContextfolder() + (object.replTexture == null ? textureFileName : object.replTexture); + + // load texture, if already loaded, use the same instance. + texture = TextureManager.load(pathToTextureBinary); + } + +} diff --git a/src/net/sector/models/wavefront/parser/mtl/KdParser.java b/src/net/sector/models/wavefront/parser/mtl/KdParser.java new file mode 100644 index 0000000..53e1e93 --- /dev/null +++ b/src/net/sector/models/wavefront/parser/mtl/KdParser.java @@ -0,0 +1,35 @@ +package net.sector.models.wavefront.parser.mtl; + + +import net.sector.models.wavefront.loader.Material; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.loader.Vertex; +import net.sector.models.wavefront.parser.LineParser; + + + +public class KdParser extends LineParser { + + Vertex kd = null; + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + Material currentMaterial = wavefrontObject.getCurrentMaterial(); + currentMaterial.setKa(kd); + + } + + @Override + public void parse() { + kd = new Vertex(); + + try { + kd.setX(Float.parseFloat(words[1])); + kd.setY(Float.parseFloat(words[2])); + kd.setZ(Float.parseFloat(words[3])); + } catch (Exception e) { + throw new RuntimeException("VertexParser Error"); + } + } + +} diff --git a/src/net/sector/models/wavefront/parser/mtl/MaterialFileParser.java b/src/net/sector/models/wavefront/parser/mtl/MaterialFileParser.java new file mode 100644 index 0000000..b3aebcb --- /dev/null +++ b/src/net/sector/models/wavefront/parser/mtl/MaterialFileParser.java @@ -0,0 +1,73 @@ +package net.sector.models.wavefront.parser.mtl; + + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Hashtable; + +import net.sector.models.wavefront.loader.Material; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.parser.LineParser; + +import org.newdawn.slick.util.ResourceLoader; + + + +public class MaterialFileParser extends LineParser { + + Hashtable materials = new Hashtable(); + private RenderModel object; + private MtlLineParserFactory parserFactory = null; + + public MaterialFileParser(RenderModel object) { + this.object = object; + this.parserFactory = new MtlLineParserFactory(object); + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + // Material are directly added by the parser, no need to do anything here... + } + + @Override + public void parse() { + String filename = words[1]; + + String pathToMTL = object.getContextfolder() + filename; + + InputStream fileInput = ResourceLoader.getResourceAsStream(pathToMTL); + if (fileInput == null) { + // Could not find the file in the jar. + try { + File file = new File(pathToMTL); + if (file.exists()) fileInput = new FileInputStream(file); + } catch (Exception e2) { + e2.printStackTrace(); + } + } + + try { + BufferedReader in = new BufferedReader(new InputStreamReader(fileInput)); + + String currentLine = null; + while ((currentLine = in.readLine()) != null) { + + LineParser parser = parserFactory.getLineParser(currentLine); + parser.parse(); + parser.incoporateResults(object); + } + + if (in != null) in.close(); + + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error parsing " + pathToMTL); + } + + } + + +} \ No newline at end of file diff --git a/src/net/sector/models/wavefront/parser/mtl/MaterialParser.java b/src/net/sector/models/wavefront/parser/mtl/MaterialParser.java new file mode 100644 index 0000000..5353fe4 --- /dev/null +++ b/src/net/sector/models/wavefront/parser/mtl/MaterialParser.java @@ -0,0 +1,27 @@ +package net.sector.models.wavefront.parser.mtl; + + +import net.sector.models.wavefront.loader.Material; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.parser.LineParser; + + + +public class MaterialParser extends LineParser { + + String materialName = ""; + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + Material newMaterial = new Material(materialName); + + wavefrontObject.getMaterials().put(materialName, newMaterial); + wavefrontObject.setCurrentMaterial(newMaterial); + } + + @Override + public void parse() { + materialName = words[1]; + } + +} diff --git a/src/net/sector/models/wavefront/parser/mtl/MtlLineParserFactory.java b/src/net/sector/models/wavefront/parser/mtl/MtlLineParserFactory.java new file mode 100644 index 0000000..e0fe2cb --- /dev/null +++ b/src/net/sector/models/wavefront/parser/mtl/MtlLineParserFactory.java @@ -0,0 +1,24 @@ +package net.sector.models.wavefront.parser.mtl; + + +import net.sector.models.wavefront.loader.LineParserFactory; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.parser.CommentParser; + + + +public class MtlLineParserFactory extends LineParserFactory { + + + + public MtlLineParserFactory(RenderModel object) { + this.object = object; + parsers.put("newmtl", new MaterialParser()); + parsers.put("Kd", new KdParser()); + parsers.put("map_Kd", new KdMapParser(object)); + parsers.put("#", new CommentParser()); + } + + + +} diff --git a/src/net/sector/models/wavefront/parser/obj/FaceParser.java b/src/net/sector/models/wavefront/parser/obj/FaceParser.java new file mode 100644 index 0000000..4b2a5bf --- /dev/null +++ b/src/net/sector/models/wavefront/parser/obj/FaceParser.java @@ -0,0 +1,98 @@ +package net.sector.models.wavefront.parser.obj; + + +import net.sector.models.wavefront.loader.Face; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.loader.TextureCoordinate; +import net.sector.models.wavefront.loader.Vertex; +import net.sector.models.wavefront.parser.LineParser; + + + +public class FaceParser extends LineParser { + + private Face face; + private Vertex[] vertices; + private Vertex[] normals; + private TextureCoordinate[] textures; + private RenderModel object = null; + + public FaceParser(RenderModel object) { + this.object = object; + } + + @Override + public void parse() { + face = new Face(); + normals = new Vertex[words.length - 1]; + textures = new TextureCoordinate[words.length - 1]; + switch (words.length) { + case 4: + parseTriangles(); + break; + case 5: + parseQuad(); + break; + default: + parsePolygon(); + } + + + } + + private void parseTriangles() { + face.setType(Face.GL_TRIANGLES); + parseLine(3); + } + + private void parsePolygon() { + face.setType(words.length - 1); + parseLine(words.length - 1); + } + + private void parseLine(int vertexCount) { + String[] rawFaces = null; + int currentValue; + vertices = new Vertex[vertexCount]; + for (int i = 1; i <= vertexCount; i++) { + rawFaces = words[i].split("/"); + + // v + currentValue = Integer.parseInt(rawFaces[0]); + vertices[i - 1] = object.getVertices().get(currentValue - 1); // -1 because references starts at 1 + + if (rawFaces.length == 1) continue; + + if (!"".equals(rawFaces[1]) && rawFaces.length == 3) { + currentValue = Integer.parseInt(rawFaces[1]); + if (currentValue <= object.getTextures().size()) // This is to compensate the fact that if no texture is in the obj file, sometimes '1' is put instead of 'blank' (we find coord1/1/coord3 instead of coord1//coord3 or coord1/coord3) + textures[i - 1] = object.getTextures().get(currentValue - 1); // -1 because references starts at 1 + } + + + currentValue = Integer.parseInt(rawFaces[rawFaces.length - 1]); + + normals[i - 1] = object.getNormals().get(currentValue - 1); // -1 because references starts at 1 + } + } + + private void parseQuad() { + face.setType(Face.GL_QUADS); + parseLine(4); + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + + face.setNormals(this.normals); + face.setVertices(this.vertices); + face.setTextures(this.textures); + if (wavefrontObject.getCurrentMaterial() != null) { + face.setMaterial(wavefrontObject.getCurrentMaterial()); + } + wavefrontObject.getFaces().add(face); + + } + + static int faceC = 0; +} diff --git a/src/net/sector/models/wavefront/parser/obj/FreeFormParser.java b/src/net/sector/models/wavefront/parser/obj/FreeFormParser.java new file mode 100644 index 0000000..6462d50 --- /dev/null +++ b/src/net/sector/models/wavefront/parser/obj/FreeFormParser.java @@ -0,0 +1,21 @@ +package net.sector.models.wavefront.parser.obj; + + +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.parser.LineParser; + + + +public class FreeFormParser extends LineParser { + + public FreeFormParser() {} + + @Override + public void parse() { + + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) {} + +} diff --git a/src/net/sector/models/wavefront/parser/obj/MaterialParser.java b/src/net/sector/models/wavefront/parser/obj/MaterialParser.java new file mode 100644 index 0000000..2c4f130 --- /dev/null +++ b/src/net/sector/models/wavefront/parser/obj/MaterialParser.java @@ -0,0 +1,27 @@ +package net.sector.models.wavefront.parser.obj; + + +import net.sector.models.wavefront.loader.Material; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.parser.LineParser; + + + +public class MaterialParser extends LineParser { + String materialName = ""; + + @Override + public void parse() { + materialName = words[1]; + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + Material newMaterial = wavefrontObject.getMaterials().get(materialName); + wavefrontObject.setCurrentMaterial(newMaterial); + + } + + + +} diff --git a/src/net/sector/models/wavefront/parser/obj/ObjLineParserFactory.java b/src/net/sector/models/wavefront/parser/obj/ObjLineParserFactory.java new file mode 100644 index 0000000..eb0471f --- /dev/null +++ b/src/net/sector/models/wavefront/parser/obj/ObjLineParserFactory.java @@ -0,0 +1,29 @@ +package net.sector.models.wavefront.parser.obj; + + +import net.sector.models.wavefront.loader.LineParserFactory; +import net.sector.models.wavefront.loader.NormalParser; +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.parser.CommentParser; +import net.sector.models.wavefront.parser.mtl.MaterialFileParser; + + + +public class ObjLineParserFactory extends LineParserFactory { + + + + public ObjLineParserFactory(RenderModel object) { + this.object = object; + parsers.put("v", new VertexParser()); + parsers.put("vn", new NormalParser()); + parsers.put("vp", new FreeFormParser()); + parsers.put("vt", new TextureCooParser()); + parsers.put("f", new FaceParser(object)); + parsers.put("#", new CommentParser()); + parsers.put("mtllib", new MaterialFileParser(object)); + parsers.put("usemtl", new MaterialParser()); + } + + +} diff --git a/src/net/sector/models/wavefront/parser/obj/TextureCooParser.java b/src/net/sector/models/wavefront/parser/obj/TextureCooParser.java new file mode 100644 index 0000000..4241352 --- /dev/null +++ b/src/net/sector/models/wavefront/parser/obj/TextureCooParser.java @@ -0,0 +1,37 @@ +package net.sector.models.wavefront.parser.obj; + + +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.loader.TextureCoordinate; +import net.sector.models.wavefront.parser.LineParser; + + + +public class TextureCooParser extends LineParser { + + private TextureCoordinate coordinate = null; + + public TextureCooParser() {} + + @Override + public void parse() { + coordinate = new TextureCoordinate(); + try { + if (words.length >= 2) coordinate.setU(Float.parseFloat(words[1])); + + if (words.length >= 3) coordinate.setV(1 - Float.parseFloat(words[2])); // OBJ origin is at upper left, OpenGL origin is at lower left. + + if (words.length >= 4) coordinate.setW(Float.parseFloat(words[3])); + + } catch (Exception e) { + throw new RuntimeException("TextureParser Error"); + } + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + wavefrontObject.getTextures().add(coordinate); + + } + +} diff --git a/src/net/sector/models/wavefront/parser/obj/VertexParser.java b/src/net/sector/models/wavefront/parser/obj/VertexParser.java new file mode 100644 index 0000000..b128b67 --- /dev/null +++ b/src/net/sector/models/wavefront/parser/obj/VertexParser.java @@ -0,0 +1,34 @@ +package net.sector.models.wavefront.parser.obj; + + +import net.sector.models.wavefront.loader.RenderModel; +import net.sector.models.wavefront.loader.Vertex; +import net.sector.models.wavefront.parser.LineParser; + + + +public class VertexParser extends LineParser { + + Vertex vertex = null; + + public VertexParser() {} + + @Override + public void parse() { + vertex = new Vertex(); + + try { + vertex.setX(Float.parseFloat(words[1])); + vertex.setY(Float.parseFloat(words[2])); + vertex.setZ(Float.parseFloat(words[3])); + } catch (Exception e) { + throw new RuntimeException("VertexParser Error"); + } + } + + @Override + public void incoporateResults(RenderModel wavefrontObject) { + wavefrontObject.getVertices().add(vertex); + } + +} diff --git a/src/net/sector/network/CountryList.java b/src/net/sector/network/CountryList.java new file mode 100644 index 0000000..ca9d14d --- /dev/null +++ b/src/net/sector/network/CountryList.java @@ -0,0 +1,365 @@ +package net.sector.network; + + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; + +import net.sector.Constants; +import net.sector.util.Log; + + +/** + * @author MightyPork + */ +public class CountryList { + private static final boolean DEBUG = Constants.LOG_COUNTRIES; + + private static boolean nextBig = false, nextSmall = false, nextFictional = false; + + /** + * Country list entry + * + * @author MightyPork + */ + public static class Country implements Comparable { + /** Tow-letter country code */ + public String code; + /** English country name */ + public String name; + + public boolean isBig = false; + public boolean isSmall = false; + public boolean isFictional = false; + + /** + * Make country entry + * + * @param code 2-letter country code + * @param name country name + */ + public Country(String code, String name) { + this.code = code; + this.name = name; + isBig = CountryList.nextBig; + isSmall = CountryList.nextSmall; + isFictional = CountryList.nextFictional; + + } + + @Override + public int compareTo(Country o) { + return name.compareTo(o.name); + } + } + + + + /** Big, more important countries */ + public static ArrayList big = new ArrayList(); + + /** Small countries (< 250.000 internet users) */ + public static ArrayList small = new ArrayList(); + + /** Merged big and small lists */ + public static ArrayList all = new ArrayList(); + + public static HashMap codeToName = new HashMap(); + + /** + * Get name for code + * + * @param code code + * @return name for code + */ + public static String getName(String code) { + String name = codeToName.get(code); + if (name != null) return name; + return ""; + } + + /** + * Initialize country list + */ + public static void init() { + + Log.f1("Initializing country list..."); + + if (DEBUG) Log.f3("Adding fictional countries"); + nextFictional = true; + // fictional + small.add(new Country("~AT", "Atlantis")); + small.add(new Country("~OZ", "The Land of Oz")); + small.add(new Country("~NN", "Narnia")); + small.add(new Country("~MI", "Middle-Earth")); + small.add(new Country("~DW", "Discworld")); + small.add(new Country("~LP", "Lilliput")); + small.add(new Country("~BL", "Blefuscu")); + small.add(new Country("~UT", "Utopia")); + small.add(new Country("~SH", "Shangri-La")); + small.add(new Country("~NV", "Neverland")); + small.add(new Country("~NH", "Neverhood")); + nextFictional = false; + + if (DEBUG) Log.f3("Adding big countries"); + // big + nextBig = true; + big.add(new Country("AF", "Afghanistan")); + big.add(new Country("AL", "Albania")); + big.add(new Country("DZ", "Algeria")); + big.add(new Country("AO", "Angola")); + big.add(new Country("AR", "Argentina")); + big.add(new Country("AM", "Armenia")); + big.add(new Country("AU", "Australia")); + big.add(new Country("AT", "Austria")); + big.add(new Country("AZ", "Azerbaijan")); + big.add(new Country("BH", "Bahrain")); + big.add(new Country("BD", "Bangladesh")); + big.add(new Country("BY", "Belarus")); + big.add(new Country("BE", "Belgium")); + big.add(new Country("BJ", "Benin")); + big.add(new Country("BO", "Bolivia")); + big.add(new Country("BA", "Bosnia and Herzegovina")); + big.add(new Country("BR", "Brazil")); + big.add(new Country("BG", "Bulgaria")); + big.add(new Country("BF", "Burkina Faso")); + big.add(new Country("KH", "Cambodia")); + big.add(new Country("CM", "Cameroon")); + big.add(new Country("CA", "Canada")); + big.add(new Country("CL", "Chile")); + big.add(new Country("CN", "China")); + big.add(new Country("CC", "Cocos Islands")); + big.add(new Country("CO", "Colombia")); + big.add(new Country("CG", "Congo")); + big.add(new Country("CR", "Costa Rica")); + big.add(new Country("HR", "Croatia")); + big.add(new Country("CU", "Cuba")); + big.add(new Country("CY", "Cyprus")); + big.add(new Country("CZ", "Czech Republic")); + big.add(new Country("DK", "Denmark")); + big.add(new Country("DO", "Dominican Republic")); + big.add(new Country("EC", "Ecuador")); + big.add(new Country("EG", "Egypt")); + big.add(new Country("SV", "El Salvador")); + big.add(new Country("ER", "Eritrea")); + big.add(new Country("EE", "Estonia")); + big.add(new Country("ET", "Ethiopia")); + big.add(new Country("FI", "Finland")); + big.add(new Country("FR", "France")); + big.add(new Country("GE", "Georgia")); + big.add(new Country("DE", "Germany")); + big.add(new Country("GH", "Ghana")); + big.add(new Country("GR", "Greece")); + big.add(new Country("GT", "Guatemala")); + big.add(new Country("HT", "Haiti")); + big.add(new Country("HN", "Honduras")); + big.add(new Country("HK", "Hong Kong")); + big.add(new Country("HU", "Hungary")); + big.add(new Country("IS", "Iceland")); + big.add(new Country("IN", "India")); + big.add(new Country("ID", "Indonesia")); + big.add(new Country("IR", "Iran")); + big.add(new Country("IQ", "Iraq")); + big.add(new Country("IE", "Ireland")); + big.add(new Country("IL", "Israel")); + big.add(new Country("IT", "Italy")); + big.add(new Country("CI", "Ivory Coast")); + big.add(new Country("JM", "Jamaica")); + big.add(new Country("JP", "Japan")); + big.add(new Country("JO", "Jordan")); + big.add(new Country("KZ", "Kazakstan")); + big.add(new Country("KE", "Kenya")); + big.add(new Country("KW", "Kuwait")); + big.add(new Country("KG", "Kyrgyzstan")); + big.add(new Country("LA", "Laos")); + big.add(new Country("LV", "Latvia")); + big.add(new Country("LB", "Lebanon")); + big.add(new Country("LT", "Lithuania")); + big.add(new Country("LU", "Luxembourg")); + big.add(new Country("MO", "Macao")); + big.add(new Country("MK", "Macedonia")); + big.add(new Country("MG", "Madagascar")); + big.add(new Country("MW", "Malawi")); + big.add(new Country("MY", "Malaysia")); + big.add(new Country("ML", "Mali")); + big.add(new Country("MQ", "Martinique")); + big.add(new Country("MU", "Mauritius")); + big.add(new Country("MX", "Mexico")); + big.add(new Country("MD", "Moldova")); + big.add(new Country("MN", "Mongolia")); + big.add(new Country("MA", "Morocco")); + big.add(new Country("MZ", "Mozambique")); + big.add(new Country("MM", "Myanmar")); + big.add(new Country("NA", "Namibia")); + big.add(new Country("NP", "Nepal")); + big.add(new Country("NL", "Netherlands")); + big.add(new Country("NZ", "New Zealand")); + big.add(new Country("NI", "Nicaragua")); + big.add(new Country("NG", "Nigeria")); + big.add(new Country("NO", "Norway")); + big.add(new Country("OM", "Oman")); + big.add(new Country("PK", "Pakistan")); + big.add(new Country("PS", "Palestine")); + big.add(new Country("PA", "Panama")); + big.add(new Country("PY", "Paraguay")); + big.add(new Country("PE", "Peru")); + big.add(new Country("PH", "Philippines")); + big.add(new Country("PL", "Poland")); + big.add(new Country("PT", "Portugal")); + big.add(new Country("PR", "Puerto Rico")); + big.add(new Country("RO", "Romania")); + big.add(new Country("RU", "Russian Federation")); + big.add(new Country("RW", "Rwanda")); + big.add(new Country("SA", "Saudi Arabia")); + big.add(new Country("SN", "Senegal")); + big.add(new Country("SL", "Sierra Leone")); + big.add(new Country("SG", "Singapore")); + big.add(new Country("SK", "Slovakia")); + big.add(new Country("SI", "Slovenia")); + big.add(new Country("ZA", "South Africa")); + big.add(new Country("KR", "South Korea")); + big.add(new Country("ES", "Spain")); + big.add(new Country("LK", "Sri Lanka")); + big.add(new Country("SD", "Sudan")); + big.add(new Country("SE", "Sweden")); + big.add(new Country("CH", "Switzerland")); + big.add(new Country("SY", "Syria")); + big.add(new Country("RS", "Serbia")); + big.add(new Country("TW", "Taiwan")); + big.add(new Country("TJ", "Tajikistan")); + big.add(new Country("TZ", "Tanzania")); + big.add(new Country("TH", "Thailand")); + big.add(new Country("TN", "Tunisia")); + big.add(new Country("TR", "Turkey")); + big.add(new Country("TM", "Turkmenistan")); + big.add(new Country("UG", "Uganda")); + big.add(new Country("UA", "Ukraine")); + big.add(new Country("AE", "United Arab Emirates")); + big.add(new Country("GB", "United Kingdom")); + big.add(new Country("US", "United States")); + big.add(new Country("UY", "Uruguay")); + big.add(new Country("UZ", "Uzbekistan")); + big.add(new Country("VE", "Venezuela")); + big.add(new Country("VN", "Vietnam")); + big.add(new Country("EH", "Western Sahara")); + big.add(new Country("YE", "Yemen")); + big.add(new Country("ZM", "Zambia")); + big.add(new Country("ZW", "Zimbabwe")); + nextBig = false; + + + if (DEBUG) Log.f3("Adding small countries"); + // small + nextSmall = true; + small.add(new Country("AQ", "Antarctica")); + small.add(new Country("AS", "American Samoa")); + small.add(new Country("AD", "Andorra")); + small.add(new Country("AI", "Anguilla")); + small.add(new Country("AG", "Antigua and Barbuda")); + small.add(new Country("AW", "Aruba")); + small.add(new Country("BS", "Bahamas")); + small.add(new Country("BB", "Barbados")); + small.add(new Country("BZ", "Belize")); + small.add(new Country("BM", "Bermuda")); + small.add(new Country("BT", "Bhutan")); + small.add(new Country("BW", "Botswana")); + small.add(new Country("BV", "Bouvet Island")); + small.add(new Country("IO", "Chagos Islands")); + small.add(new Country("BN", "Brunei")); + small.add(new Country("BI", "Burundi")); + small.add(new Country("CV", "Cape Verde")); + small.add(new Country("KY", "Cayman Islands")); + small.add(new Country("CF", "Central African Republic")); + small.add(new Country("TD", "Chad")); + small.add(new Country("CX", "Christmas Island")); + small.add(new Country("KM", "Comoros")); + small.add(new Country("CD", "Congo, Democratic Republic")); + small.add(new Country("CK", "Cook Islands")); + small.add(new Country("DJ", "Djibouti")); + small.add(new Country("DM", "Dominica")); + small.add(new Country("TP", "East Timor")); + small.add(new Country("GQ", "Equatorial Guinea")); + small.add(new Country("FK", "Falkland Islands")); + small.add(new Country("FO", "Faroe Islands")); + small.add(new Country("FJ", "Fiji Islands")); + small.add(new Country("GF", "French Guiana")); + small.add(new Country("PF", "French Polynesia")); + small.add(new Country("GA", "Gabon")); + small.add(new Country("GM", "Gambia")); + small.add(new Country("GI", "Gibraltar")); + small.add(new Country("GL", "Greenland")); + small.add(new Country("GD", "Grenada")); + small.add(new Country("GP", "Guadeloupe")); + small.add(new Country("GU", "Guam")); + small.add(new Country("GN", "Guinea")); + small.add(new Country("GW", "Guinea-Bissau")); + small.add(new Country("GY", "Guyana")); + small.add(new Country("VA", "Vatican")); + small.add(new Country("KI", "Kiribati")); + small.add(new Country("LS", "Lesotho")); + small.add(new Country("LR", "Liberia")); + small.add(new Country("LY", "Libya")); + small.add(new Country("LI", "Liechtenstein")); + small.add(new Country("MV", "Maldives")); + small.add(new Country("MT", "Malta")); + small.add(new Country("MH", "Marshall Islands")); + small.add(new Country("MR", "Mauritania")); + small.add(new Country("YT", "Mayotte")); + small.add(new Country("FM", "Micronesia")); + small.add(new Country("MC", "Monaco")); + small.add(new Country("MS", "Montserrat")); + small.add(new Country("ME", "Montenegro")); + small.add(new Country("NR", "Nauru")); + small.add(new Country("AN", "Netherlands Antilles")); + small.add(new Country("NC", "New Caledonia")); + small.add(new Country("NE", "Niger")); + small.add(new Country("NU", "Niue")); + small.add(new Country("NF", "Norfolk Island")); + small.add(new Country("KP", "North Korea")); + small.add(new Country("MP", "Northern Mariana Islands")); + small.add(new Country("PW", "Palau")); + small.add(new Country("PG", "Papua New Guinea")); + small.add(new Country("PN", "Pitcairn")); + small.add(new Country("QA", "Qatar")); + small.add(new Country("RE", "Réunion")); + small.add(new Country("SH", "Saint Helena")); + small.add(new Country("KN", "Saint Kitts and Nevis")); + small.add(new Country("LC", "Saint Lucia")); + small.add(new Country("PM", "Saint Pierre and Miquelon")); + small.add(new Country("VC", "Saint Vincent")); + small.add(new Country("WS", "Samoa")); + small.add(new Country("SM", "San Marino")); + small.add(new Country("ST", "Sao Tome and Principe")); + small.add(new Country("SC", "Seychelles")); + small.add(new Country("SB", "Solomon Islands")); + small.add(new Country("SO", "Somalia")); + small.add(new Country("GS", "South Georgia")); + small.add(new Country("SR", "Suriname")); + small.add(new Country("SJ", "Svalbard and Jan Mayen")); + small.add(new Country("SZ", "Swaziland")); + small.add(new Country("TG", "Togo")); + small.add(new Country("TK", "Tokelau")); + small.add(new Country("TO", "Tonga")); + small.add(new Country("TT", "Trinidad and Tobago")); + small.add(new Country("TC", "Turks and Caicos Islands")); + small.add(new Country("TV", "Tuvalu")); + small.add(new Country("VU", "Vanuatu")); + small.add(new Country("VI", "Virgin Islands")); + small.add(new Country("VG", "Virgin Islands, British")); + small.add(new Country("WF", "Wallis and Futuna")); + nextSmall = false; + + + if (DEBUG) Log.f3("Merging and sorting country lists"); + all.addAll(big); + all.addAll(small); + + Collections.sort(big); + Collections.sort(small); + Collections.sort(all); + + for (Country c : all) { + codeToName.put(c.code, c.name); + } + } +} diff --git a/src/net/sector/network/ProfileList.java b/src/net/sector/network/ProfileList.java new file mode 100644 index 0000000..fb793df --- /dev/null +++ b/src/net/sector/network/ProfileList.java @@ -0,0 +1,68 @@ +package net.sector.network; + + +import java.io.InputStream; +import java.io.OutputStream; + +import net.sector.CustomIonMarks; +import net.sector.level.SuperContext; +import net.sector.util.Log; + +import com.porcupine.ion.AbstractIonList; +import com.porcupine.ion.Ion; + + +/** + * List of profile entries + * + * @author MightyPork + */ +public class ProfileList extends AbstractIonList { + + @Override + public byte ionMark() { + return CustomIonMarks.USER_PROFILE_LIST; + } + + @Override + public String toString() { + String s = ""; + s += "\n# PROFILE ENTRY LIST BEGIN #\n"; + for (UserProfile u : this) { + s += "\n"; + s += u.toString(); + s += "\n"; + } + s += "# PROFILE ENTRY LIST END #\n"; + return s; + } + + @Override + public void ionWriteCustomData(OutputStream out) { + String selectedUid = ""; + if (SuperContext.selectedUser != null) { + selectedUid = SuperContext.selectedUser.uid; + } + + Ion.writeObject(out, selectedUid); + } + + @Override + public void ionReadCustomData(InputStream in) { + String selectedUid = (String) Ion.readObject(in); + if (selectedUid.length() == 0) { + SuperContext.selectedUser = null; + } else { + for (UserProfile user : this) { + if (user.uid.equals(selectedUid)) { + Log.f3("USERS: Selected user: " + user.uid + ", " + user.uname); + + SuperContext.selectedUser = user; + break; + } + } + if (SuperContext.selectedUser == null) Log.w("No user with UID " + selectedUid + " (selected user) found in saved ION list."); + } + } + +} diff --git a/src/net/sector/network/UserProfile.java b/src/net/sector/network/UserProfile.java new file mode 100644 index 0000000..46c3014 --- /dev/null +++ b/src/net/sector/network/UserProfile.java @@ -0,0 +1,320 @@ +package net.sector.network; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import net.sector.CustomIonMarks; +import net.sector.level.SuperContext; +import net.sector.network.communication.EncryptionHelper; +import net.sector.network.communication.LeaderboardClient; +import net.sector.network.communication.ServerError; +import net.sector.network.responses.ObjScoreList; +import net.sector.network.responses.ObjSessionInfo; +import net.sector.util.Log; + +import com.porcupine.ion.Ion; +import com.porcupine.ion.IonizableOptional; +import com.porcupine.util.StringUtils; + + +/** + * User profile object + * + * @author MightyPork + */ +public class UserProfile implements IonizableOptional, Comparable { + + /** [LOGIN] Profile UID */ + public String uid = ""; + + /** [LOGIN] Profile login AUTH_TOKEN */ + public String auth_token = ""; + + /** E-mail */ + public String email = ""; + + /** Country code */ + public String country = ""; + + /** Registration time */ + public int reg_time = -1; + + /** Flag that this profile is logged in = active */ + public boolean isLoggedIn = false; + + /** + * Flag that this profile info should be saved to disk and reloaded next + * startup + */ + public boolean isPermanent = true; + + /** + * Removed profile flag - indicates profile that should not be saved to disk + * nor shown in profile list. + */ + public boolean isRemoved = false; + + /** [NEEDS SAVE] User name */ + public String uname = null; + + /** [NEEDS SAVE] User password */ + public String password = null; + + + /** + * Create profile of name and password. Not logged in. + * + * @param uname username + * @param password password + */ + public UserProfile(String uname, String password) { + this.uname = uname; + this.password = password; + } + + + /** + * Build profile from name, password and just received session info object + * + * @param name + * @param password + * @param sesinfo + */ + public UserProfile(String name, String password, ObjSessionInfo sesinfo) { + loadFromSessionInfo(sesinfo); + this.password = password; + this.isLoggedIn = true; + } + + + /** + * Set name and password for login. + * + * @param username + * @param password + */ + public void setNamePassword(String username, String password) { + this.uname = username; + this.password = password; + } + + + /** + * Set permanence flag (do not delete on exit) + * + * @param state permanent + */ + public void setPermanent(boolean state) { + isPermanent = state; + } + + + /** + * Make this user the selected one + */ + public void selectThisUser() { + if (!isLoggedIn) Log.w("Cannot select user which isn't logged in."); + SuperContext.selectedUser = this; + } + + + /** + * Get if this is the selected user. + * + * @return is selected + */ + public boolean isSelected() { + return SuperContext.selectedUser == this; + } + + + /** + * Get UID if activated, otherwise throw runtime exception. + * + * @return UID (String) + */ + public String getUserId() { + if (!isActivated()) throw new RuntimeException("Cannot get UID if not logged in."); + return uid; + } + + + /** + * Get if profile login is authenticated by the server + * + * @return is logged in + */ + public boolean isActivated() { + return isLoggedIn == true; + } + + /** + * Get if profile is permanent = should be saved to disk + * + * @return is permanent + */ + public boolean isPermanent() { + return isPermanent; + } + + /** + * Get if this profile is marked for removal. + * + * @return is removed. + */ + public boolean isRemoved() { + return isRemoved; + } + + + /** + * Log into online highscore system and get a valid auth_token + * + * @throws ServerError in case of error + */ + public void logIn() throws ServerError { + loadFromSessionInfo(LeaderboardClient.logIn(uname, password)); + isLoggedIn = true; + } + + + /** + * Get new auth_token and update local copy of profile info. + * + * @throws ServerError in case of error + */ + public void refreshProfileData() throws ServerError { + if (!isActivated()) throw new RuntimeException("Cannot GET_PROFILE_INFO if not logged in."); + loadFromSessionInfo(LeaderboardClient.getProfileInfo(uid, auth_token)); + } + + /** + * Submit score to server. + * + * @param lid level ID + * @param score score to submit + * @return score list object with "score_improved" flag + * @throws ServerError in case of error + */ + public ObjScoreList submitScore(String lid, int score) throws ServerError { + if (!isActivated()) throw new RuntimeException("Cannot submit score if not logged in."); + return LeaderboardClient.submitScore(lid, score, uid, auth_token); + } + + + /** + * Edit the profile - if field isn't changed, insert old value. + * + * @param uname new username + * @param password new password + * @param email new email + * @param country new country code + * @throws ServerError on error + */ + public void editProfile(String uname, String password, String email, String country) throws ServerError { + loadFromSessionInfo(LeaderboardClient.editProfile(uid, auth_token, uname, password, email, country)); + this.password = password; + } + + /** + * Initializer for Ion + */ + public UserProfile() { + isPermanent = true; + isLoggedIn = false; + } + + /** + * Fill profile data fields with data from SessionInfo object + * + * @param sesinfo session info object to parse + */ + public void loadFromSessionInfo(ObjSessionInfo sesinfo) { + this.auth_token = sesinfo.auth_token; + this.country = sesinfo.country; + this.email = sesinfo.email; + this.reg_time = sesinfo.reg_time; + this.uid = sesinfo.uid; + this.uname = sesinfo.uname; + } + + + @Override + public void ionRead(InputStream in) throws IOException { + uname = (String) Ion.readObject(in); + uid = (String) Ion.readObject(in); + String enc = (String) Ion.readObject(in); + password = EncryptionHelper.simpleDecryptString(enc); + } + + @Override + public void ionWrite(OutputStream out) throws IOException { + Ion.writeObject(out, uname); + Ion.writeObject(out, uid); + String enc = EncryptionHelper.simpleEncryptString(password); + Ion.writeObject(out, enc); + } + + @Override + public byte ionMark() { + return CustomIonMarks.USER_PROFILE; + } + + + @Override + public String toString() { + + String s = ""; + s += "UserProfile\n"; + s += "| permanent = " + isPermanent + "\n"; + s += "| loggedIn = " + isLoggedIn + "\n"; + s += "|\n"; + s += "| uname = " + uname + "\n"; + s += "| password = " + StringUtils.passwordify(password, "*") + "\n"; + s += "|\n"; + s += "| uid = " + uid + "\n"; + s += "| auth_token = " + auth_token + "\n"; + s += "|\n"; + s += "| email = " + email + "\n"; + s += "| country = " + country + "\n"; + s += "| reg_time = " + reg_time + "\n"; + + return s; + } + + + @Override + public boolean ionShouldSave() { + return isPermanent && !isRemoved; + } + + + @Override + public int compareTo(UserProfile o) { + return this.uname.compareToIgnoreCase(o.uname); + } + + + /** + * Mark as removed (don't show in level list) + * + * @param state is removed + */ + public void setRemoved(boolean state) { + this.isRemoved = state; + if (isRemoved && isSelected()) SuperContext.selectedUser = null; + } + + + /** + * Delete this profile from online database + * + * @throws ServerError on error + */ + public void deleteProfile() throws ServerError { + LeaderboardClient.deleteProfile(uid, auth_token); + setRemoved(true); + } +} diff --git a/src/net/sector/network/communication/EServerError.java b/src/net/sector/network/communication/EServerError.java new file mode 100644 index 0000000..2a25a4e --- /dev/null +++ b/src/net/sector/network/communication/EServerError.java @@ -0,0 +1,57 @@ +package net.sector.network.communication; + + +/** + * Enum of server errors, for easier handling than numbers. + * + * @author MightyPork + */ +public enum EServerError { + +// * add level errors: +// +// "FILE_NOT_FOUND" 7 (level file added does not exist - ADD_LEVEL) +// "BAD_FILE_FORMAT" 8 (level file added is not XML - ADD_LEVEL) +// "LEVEL_ALREADY_ADDED" 9 (level file already registered in database - ADD_LEVEL) +// "LEVEL_NAME_NOT_UNIQUE" 10 (title of the added level is already used by another level - ADD_LEVEL) + + /** no command requested - cmd is empty */ + NO_COMMAND(0), + /** command requested does not exist or is disabled */ + INVALID_COMMAND(1), + /** MySQL syntax or script error */ + INTERNAL_ERROR(2), + /** missing some required arguments */ + INCOMPLETE_COMMAND(3), + /** Entered user name already taken - REGISTER */ + NAME_NOT_UNIQUE(4), + /** Name or password incorrect - LOG_IN */ + LOGIN_FAILED(5), + /** bad token sent */ + INVALID_TOKEN(6), + /** no level with such LID exists - GET_SCORES or SUBMIT_SCORE */ + NO_SUCH_LEVEL(11), + /** all other errors that are not important to be distinguished */ + UNKNOWN_ERROR(-1), + /** Bad response from server, which caused local error */ + INVALID_SERVER_RESPONSE(100); + + private EServerError(int code) { + this.code = code; + } + + /** + * Get error enum for server error code + * + * @param code the error code + * @return corresponding enum constant + */ + public static EServerError getErrorForCode(int code) { + for (EServerError e : values()) { + if (e.code == code) return e; + } + return UNKNOWN_ERROR; + } + + private int code = -1; +} diff --git a/src/net/sector/network/communication/EncryptionHelper.java b/src/net/sector/network/communication/EncryptionHelper.java new file mode 100644 index 0000000..99f2184 --- /dev/null +++ b/src/net/sector/network/communication/EncryptionHelper.java @@ -0,0 +1,138 @@ +package net.sector.network.communication; + + +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import net.sector.util.Log; + + +/** + * Some algorithms used for the server-client communication and general purpose + * hashing. + * + * @author MightyPork + */ +public class EncryptionHelper { + + /** + * Calculate secure hash for password authentication + * + * @param name user name (used as salt) + * @param password user password (hashed) + * @return the hash + */ + public static String calcSecureHash(String name, String password) { + String hash = sha1(name + "S^1edT@R+ kN0w9e" + md5("troe(l01" + password + "d*G -? df lo%iUq") + "myL!tT1e(P)0nNY"); + return hash; + } + + /** + * Take SHA-1 hash of a string + * + * @param s strign to hash + * @return sha-1 hash of the string + */ + private static String sha1(String s) { + String sha = hash(s, "SHA-1"); + while (sha.length() < 40) { + sha = "0" + sha; + } + return sha; + } + + /** + * Take MD5 hash of a string + * + * @param s strign to hash + * @return md5 hash of the string + */ + private static String md5(String s) { + String md5 = hash(s, "MD5"); + while (md5.length() < 32) { + md5 = "0" + md5; + } + return md5; + } + + /** + * Take hash of a string + * + * @param s string to hash + * @param algorithm algorithm used (MessageDigest.getInstance) + * @return the hash + */ + private static String hash(String s, String algorithm) { + String hashword = null; + try { + MessageDigest md5 = MessageDigest.getInstance(algorithm); + md5.update(s.getBytes()); + hashword = getHexHash(md5.digest()); + } catch (NoSuchAlgorithmException nsae) { + Log.e("Error while hashing string.", nsae); + } + return hashword; + } + + /** + * Get hash hex from bytes obtained from md5 digest + * + * @param bytes byte array + * @return hash as hex string + */ + public static String getHexHash(byte[] bytes) { + BigInteger hash = new BigInteger(1, bytes); + return hash.toString(16); + } + + private static final String replaceTable0 = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY^Z0123456789'\"<>.,-_~@!?;$|*/+%=#&{}()[]"; + private static final String replaceTable1 = "zw&QkD^RZe%3#b[@dv!6o>JB?=4U.I-a'lV8$7GcOM<9(Y*Wn|K,}_p+S]xt~E5j LTh{Fiq/gsC2A;mH0\"uNfXPry)1"; + + /** + * Encrypt string using a simple substitution + * + * @param plain string to encrypt + * @return encrypted + */ + public static String simpleEncryptString(String plain) { + return transcode(plain, replaceTable0, replaceTable1); + } + + /** + * Decrypt a string encrypted using "simpleEncryptString" + * + * @param encrypted encrypted string + * @return plain + */ + public static String simpleDecryptString(String encrypted) { + return transcode(encrypted, replaceTable1, replaceTable0); + } + + public static String transcode(String input, String table1, String table2) { + String out = ""; + + for (int i = 0; i < input.length(); i++) { + + char charSearched = input.charAt(i); + + boolean found = false; + + for (int j = 0; j < table1.length(); j++) { + + char charTblA = table1.charAt(j); + + if (charTblA == charSearched) { + out += table2.charAt(j); + found = true; + break; + } + + } + + if (!found) out += charSearched; + } + + return out; + } +} diff --git a/src/net/sector/network/communication/HttpHelper.java b/src/net/sector/network/communication/HttpHelper.java new file mode 100644 index 0000000..e693d46 --- /dev/null +++ b/src/net/sector/network/communication/HttpHelper.java @@ -0,0 +1,159 @@ +package net.sector.network.communication; + + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import net.sector.Constants; +import net.sector.annotations.Unused; + +import org.apache.commons.io.FileUtils; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.AbstractHttpMessage; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpParams; + + +/** + * Http connection helper (GET and POST, file download) + * + * @author MightyPork + */ +public class HttpHelper { + + private static final String UserAgent = "Sector/HttpHelper"; + private static final int TIMEOUT_CONNECTION = 3000; + private static final int TIMEOUT_READ = 2000; + + /** + * Download file from URL to filesystem + * + * @param remoteFileUrl url + * @param targetFile target file (the file, not only directory!) + * @throws MalformedURLException + * @throws IOException + */ + public static void downloadFile(String remoteFileUrl, String targetFile) throws MalformedURLException, IOException { + downloadFile(remoteFileUrl, new File(targetFile)); + } + + /** + * Download file from URL to filesystem + * + * @param remoteFileUrl url + * @param targetFile target file (the file, not only directory!) + * @throws MalformedURLException + * @throws IOException + */ + public static void downloadFile(String remoteFileUrl, File targetFile) throws MalformedURLException, IOException { + FileUtils.copyURLToFile(new URL(remoteFileUrl), targetFile, TIMEOUT_CONNECTION, TIMEOUT_READ); + } + + + /** + * Send a GET request + * + * @param url target URL without GET args + * @param args GET args in key-value map + * @return returned page as input stream + * @throws IOException + */ + @Unused + public static InputStream requestGet(String url, Map args) throws IOException { + + // merge the args into a get query + if (args.size() > 0) { + + url += "?"; + + boolean first = true; + + for (Entry arg : args.entrySet()) { + if (!first) url += "&"; + url += URLEncoder.encode(arg.getKey(), "UTF-8"); + url += "="; + url += URLEncoder.encode(arg.getValue().toString(), "UTF-8"); + first = false; + } + } + + // prepare client + DefaultHttpClient client = getClient(); + + //HttpProtocolParams.setUserAgent(client.getParams(), UserAgent); + HttpGet request = new HttpGet(url); + + addSectorHeaders(request); + + + // connect + HttpResponse response = client.execute(request); + + // get returned content + return response.getEntity().getContent(); + } + + + private static void addSectorHeaders(AbstractHttpMessage request) { + request.addHeader("User-Agent", UserAgent); + request.addHeader("X-SECTOR-VERSION", Constants.VERSION_NUMBER + ""); + } + + private static DefaultHttpClient getClient() { + + DefaultHttpClient client = new DefaultHttpClient(); + HttpParams params = client.getParams(); + HttpConnectionParams.setConnectionTimeout(params, TIMEOUT_CONNECTION); + HttpConnectionParams.setSoTimeout(params, TIMEOUT_READ); + + return client; + + } + + /** + * Send a POST request + * + * @param url target URL + * @param args POST args in key-value map + * @return returned page as input stream + * @throws IOException + */ + public static InputStream requestPost(String url, Map args) throws IOException { + + // prepare client + DefaultHttpClient client = getClient(); + + HttpPost request = new HttpPost(url); + + // put post arguments into the request + List nameValuePairs = new ArrayList(); + + for (Entry arg : args.entrySet()) { + nameValuePairs.add(new BasicNameValuePair(arg.getKey(), arg.getValue().toString())); + } + + request.setEntity(new UrlEncodedFormEntity(nameValuePairs)); + + addSectorHeaders(request); + + // connect + HttpResponse response = client.execute(request); + + // get returned content + return response.getEntity().getContent(); + } +} diff --git a/src/net/sector/network/communication/LeaderboardClient.java b/src/net/sector/network/communication/LeaderboardClient.java new file mode 100644 index 0000000..efb0bc2 --- /dev/null +++ b/src/net/sector/network/communication/LeaderboardClient.java @@ -0,0 +1,405 @@ +package net.sector.network.communication; + + +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Map; + +import net.sector.App; +import net.sector.Constants; +import net.sector.annotations.Internal; +import net.sector.level.dataobj.AiObjParser; +import net.sector.level.loading.XmlUtil; +import net.sector.network.UserProfile; +import net.sector.network.responses.*; +import net.sector.util.Log; + +import org.jdom2.Element; + + +/** + * main class for server-client communication + * + * @author MightyPork + */ +public class LeaderboardClient { + + /** + * Get list of users (informative) + * + * @return list of users + * @throws ServerError on error + */ + public static ObjUserList getUserList() throws ServerError { + Element root = getServerResponse("GET_USERS", null); + + ObjUserList list = new ObjUserList(); + + for (Element u : root.getChildren("user")) { + + ObjUserInfo userInfo = new ObjUserInfo(); + + userInfo.uname = u.getChildText("name"); + userInfo.country = u.getChildText("country"); + userInfo.reg_time = AiObjParser.getInteger(u.getChildText("reg_time")); + + list.add(userInfo); + } + + return list; + } + + /** + * Submit score for for level + * + * @param lid level ID + * @param score score points + * @param uid UID + * @param auth_token AUTH_TOKEN + * @return list of scores in level, with a flag whether last score was + * improved or not. + * @throws ServerError on error + */ + public static ObjScoreList submitScore(String lid, int score, String uid, String auth_token) throws ServerError { + + Map args = new HashMap(); + + args.put("lid", lid); + args.put("score", score); + args.put("uid", uid); + args.put("auth_token", auth_token); + + Element root = getServerResponse("SUBMIT_SCORE", args); + + ObjScoreList list = new ObjScoreList(); + + for (Element u : root.getChildren("score")) { + + ObjScoreInfo scoreInfo = new ObjScoreInfo(); + + scoreInfo.uid = u.getChildText("uid"); + scoreInfo.time = AiObjParser.getInteger(u.getChildText("time")); + scoreInfo.score = AiObjParser.getInteger(u.getChildText("score")); + scoreInfo.uname = u.getChildText("name"); + + list.add(scoreInfo); + } + + list.scoreImproved = AiObjParser.getBoolean(root.getAttributeValue("score_improved"), false); + list.lastScore = AiObjParser.getInteger(root.getAttributeValue("last_score"), -1); + + return list; + } + + /** + * Get leaderboard for level + * + * @param lid level ID + * @return list of scores in level, ordered from best to worst and from + * newer to older. + * @throws ServerError on error + */ + public static ObjScoreList getLevelScores(String lid) throws ServerError { + + Map args = new HashMap(); + + args.put("lid", lid); + + Element root = getServerResponse("GET_SCORES", args); + + ObjScoreList list = new ObjScoreList(); + + for (Element u : root.getChildren("score")) { + + ObjScoreInfo scoreInfo = new ObjScoreInfo(); + + scoreInfo.uid = u.getChildText("uid"); + scoreInfo.time = AiObjParser.getInteger(u.getChildText("time")); + scoreInfo.score = AiObjParser.getInteger(u.getChildText("score")); + scoreInfo.uname = u.getChildText("name"); + + list.add(scoreInfo); + } + + return list; + } + + /** + * Get list of users (informative) + * + * @return list of users + * @throws ServerError on error + */ + public static ObjLevelList getLevelList() throws ServerError { + Element root = getServerResponse("GET_LEVELS", null); + + ObjLevelList list = new ObjLevelList(); + + for (Element u : root.getChildren("level")) { + + ObjLevelInfo levelInfo = new ObjLevelInfo(); + + levelInfo.checksum = u.getChildText("checksum"); + levelInfo.created_time = AiObjParser.getInteger(u.getChildText("created")); + levelInfo.lid = u.getChildText("lid"); + levelInfo.title = u.getChildText("title"); + levelInfo.url = u.getChildText("url"); + + list.add(levelInfo); + } + + return list; + } + + /** + * Get list of users (informative) + * + * @return list of users + * @throws ServerError on error + */ + public static ObjInfoTable getInfoTable() throws ServerError { + Element root = getServerResponse("GET_INFO", null); + + ObjInfoTable table = new ObjInfoTable(); + + for (Element u : root.getChildren("entry")) { + String key = u.getChildText("key"); + String value = u.getChildText("value"); + +// if(key.equals("LEVELS_PATH")) table.levels_url = value; + if (key.equals("VERSION")) table.latest_version = value; + if (key.equals("VERSION_NUMBER")) table.latest_version_num = AiObjParser.getInteger(value); + } + + return table; + } + + /** + * Send LOG_IN request. + * + * @param username name + * @param password password + * @return session info + * @throws ServerError on error + */ + @Internal + public static ObjSessionInfo logIn(String username, String password) throws ServerError { + + String hash = EncryptionHelper.calcSecureHash(username, password); + + Map args = new HashMap(); + + args.put("name", username); + args.put("password", hash); + + Element root = getServerResponse("LOG_IN", args); + + return parseSessionInfo(root); + + } + + /** + * Create profile instance by logging in with name and password with a + * LOG_IN request + * + * @param username username + * @param password password + * @return the created profile + * @throws ServerError on error + */ + public static UserProfile createProfileLogIn(String username, String password) throws ServerError { + + UserProfile p = new UserProfile(username, password); + p.logIn(); + return p; + } + + /** + * Create profile instance by registering to leaderboard with a REGISTER + * request. + * + * @param username name + * @param password password + * @param email email address (optional) + * @param country country code (optional) + * @return the new profile, logged in + * @throws ServerError on error + */ + public static UserProfile createProfileRegister(String username, String password, String email, String country) throws ServerError { + + if (email == null) email = ""; + if (country == null) country = ""; + + Map args = new HashMap(); + + args.put("name", username); + args.put("password", password); + args.put("email", email); + args.put("country", country); + + // if this fails, error will be thrown + Element root = getServerResponse("REGISTER", args); + + ObjSessionInfo sesinfo = parseSessionInfo(root); + + return new UserProfile(username, password, sesinfo); + + } + + + /** + * Send EDIT_PROFILE request. + * + * @param uid UID + * @param auth_token AUTH_TOKEN from login + * @param username name + * @param password password + * @param email email address (optional) + * @param country country code (optional) + * @return session info + * @throws ServerError on error + */ + @Internal + public static ObjSessionInfo editProfile(String uid, String auth_token, String username, String password, String email, String country) + throws ServerError { + + Map args = new HashMap(); + + args.put("uid", uid); + args.put("auth_token", auth_token); + + args.put("name", username); + args.put("password", password); + args.put("email", email); + args.put("country", country); + + // if this fails, error will be thrown + Element root = getServerResponse("EDIT_PROFILE", args); + + ObjSessionInfo sesinfo = parseSessionInfo(root); + + return sesinfo; + + } + + + + /** + * Delete profile + * + * @param uid UID + * @param auth_token AUTH_TOKEN from login + * @throws ServerError on error + */ + @Internal + public static void deleteProfile(String uid, String auth_token) throws ServerError { + Map args = new HashMap(); + + args.put("uid", uid); + args.put("auth_token", auth_token); + + getServerResponse("DELETE_PROFILE", args); + } + + + /** + * Send GET_PROFILE_INFO request. + * + * @param uid uid + * @param auth_token auth_token + * @return session info + * @throws ServerError on error + */ + @Internal + public static ObjSessionInfo getProfileInfo(String uid, String auth_token) throws ServerError { + + Map args = new HashMap(); + + args.put("uid", uid); + args.put("auth_token", auth_token); + + Element root = getServerResponse("GET_PROFILE_INFO", args); + + return parseSessionInfo(root); + + } + + + /** + * Convert XML element to session info object + * + * @param rootElement xml root node + * @return session info object + */ + private static ObjSessionInfo parseSessionInfo(Element rootElement) { + + ObjSessionInfo resp = new ObjSessionInfo(); + resp.auth_token = rootElement.getChildText("auth_token"); + resp.uid = rootElement.getChildText("uid"); + resp.country = rootElement.getChildText("country"); + resp.email = rootElement.getChildText("email"); + resp.uname = rootElement.getChildText("name"); + resp.reg_time = AiObjParser.getInteger(rootElement.getChildText("reg_time")); + return resp; + + } + + + /** + * Check XML server response, if it is a error response, extract and throw + * the error. + * + * @param rootElement XML root node + * @throws ServerError + */ + private static void detectServerError(Element rootElement) throws ServerError { + + if (rootElement.getName().equals("error")) { + + int code = AiObjParser.getInteger(rootElement.getChildText("code")); + String message = rootElement.getChildText("message"); + String cause = rootElement.getChildText("cause"); + + System.out.println("Error " + code + "\n" + "msg = " + message + "\ncause = " + cause); + + throw new ServerError(code, message, cause); + } + } + + /** + * Contact server and get response as a XML root node. + * + * @param cmd command for server + * @param argMap arguments key->value + * @return the root node of response + * @throws ServerError in case of error returned from server + */ + private static Element getServerResponse(String cmd, Map argMap) throws ServerError { + + try { + if (argMap == null) argMap = new HashMap(); + argMap.put("cmd", cmd); + + Element e = XmlUtil.getRootElement(HttpHelper.requestPost(Constants.SERVER_URL, argMap)); + detectServerError(e); + return e; + + } catch (ServerError se) { + throw se; + } catch (Exception e) { + if (e instanceof UnknownHostException) { + App.offlineMode = true; + Log.i("Server not found, entering OFFLINE MODE!"); + } + + //@formatter:off + throw new ServerError( + 100, + "Invalid server response, not a valid XML document.", + "" + ); + //@formatter:on + + } + } +} diff --git a/src/net/sector/network/communication/ServerError.java b/src/net/sector/network/communication/ServerError.java new file mode 100644 index 0000000..964d360 --- /dev/null +++ b/src/net/sector/network/communication/ServerError.java @@ -0,0 +1,65 @@ +package net.sector.network.communication; + + +/** + * Error returned from the server + * + * @author MightyPork + */ +public class ServerError extends Exception { + private EServerError error; + private String cause; + + /** + * Server-side error + * + * @param code error code + * @param message error message + * @param cause error cause (additional info for error) + */ + public ServerError(int code, String message, String cause) { + super(message); + this.cause = cause; + error = EServerError.getErrorForCode(code); + } + + /** + * Server-side error + * + * @param code error code + * @param message error message + */ + public ServerError(int code, String message) { + super(message); + error = EServerError.getErrorForCode(code); + } + + /** + * Get error + * + * @return error + */ + public EServerError getError() { + return error; + } + + @Override + public String getMessage() { + return super.getMessage() + (getDescription().length() > 0 ? " - " + getDescription() : ""); + } + + /** + * Get aditional error description. + * + * @return text + */ + public String getDescription() { + return cause; + } + + @Override + @Deprecated + public Throwable getCause() { + return super.getCause(); + } +} diff --git a/src/net/sector/network/levels/NetLevelContainer.java b/src/net/sector/network/levels/NetLevelContainer.java new file mode 100644 index 0000000..28a15d8 --- /dev/null +++ b/src/net/sector/network/levels/NetLevelContainer.java @@ -0,0 +1,131 @@ +package net.sector.network.levels; + + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.security.DigestInputStream; +import java.security.MessageDigest; + +import net.sector.Constants; +import net.sector.level.loading.XmlUtil; +import net.sector.network.communication.EncryptionHelper; +import net.sector.network.communication.HttpHelper; +import net.sector.network.responses.ObjLevelInfo; +import net.sector.util.Log; +import net.sector.util.Utils; + +import org.jdom2.Element; + + +/** + * Level descriptor and level data container + * + * @author MightyPork + */ +public class NetLevelContainer { + + /** Flag that this level is valid - original. */ + public boolean isValid = false; + + /** Root node of the level */ + public Element levelRootNode = null; + + /** Level ID */ + public String lid; + + /** Level name */ + public String title; + + /** level download URL */ + public String url; + + /** level file MD5 checksum */ + public String checksum; + + /** time of level creation */ + public int created_time; + + /** + * Empty constructor + */ + public NetLevelContainer() {} + + /** + * Construct from ObjLevelInfo object + * + * @param oli ObjLevelInfo to parse + */ + public NetLevelContainer(ObjLevelInfo oli) { + this.lid = oli.lid; + this.title = oli.title; + this.url = oli.url; + this.checksum = oli.checksum; + this.created_time = oli.created_time; + } + + + /** + * Local filename + * + * @return filename + */ + public File getLocalFile() { + File dir = Utils.getGameSubfolder(Constants.DIR_LEVELS_SHARED); + File file = new File(dir, lid + ".xml"); + return file; + } + + /** + * Get if this level file is downloaded + * + * @return is downloaded + */ + public boolean isDownloaded() { + return getLocalFile().exists(); + } + + /** + * Try to download level file. + * + * @throws MalformedURLException on error + * @throws IOException on error + */ + public void download() throws MalformedURLException, IOException { + HttpHelper.downloadFile(url, getLocalFile()); + } + + /** + * Load level data and check if checksum matches. + * + * @return true if file is original and valid - false if requires + * re-download. + */ + public boolean loadCheckIfOriginal() { + + MessageDigest md; + try { + + md = MessageDigest.getInstance("MD5"); + InputStream is = new FileInputStream(getLocalFile()); + try { + is = new DigestInputStream(is, md); + levelRootNode = XmlUtil.getRootElement(is); + } finally { + is.close(); + } + byte[] digest = md.digest(); + String md5 = EncryptionHelper.getHexHash(digest); + return (isValid = md5.equals(checksum)); + + } catch (Exception e) { + Log.e("Error loading local file for level.", e); + } + + isValid = false; + return false; + } + +} diff --git a/src/net/sector/network/levels/NetLevelList.java b/src/net/sector/network/levels/NetLevelList.java new file mode 100644 index 0000000..4764695 --- /dev/null +++ b/src/net/sector/network/levels/NetLevelList.java @@ -0,0 +1,103 @@ +package net.sector.network.levels; + + +import java.util.ArrayList; + +import net.sector.level.LevelBundle; +import net.sector.network.responses.ObjLevelInfo; +import net.sector.network.responses.ObjLevelList; +import net.sector.util.Log; + + +/** + * List of profile entries + * + * @author MightyPork + */ +public class NetLevelList extends ArrayList { + + + @Override + public String toString() { + String s = ""; + s += "\n# LEVEL LIST BEGIN #\n"; + for (NetLevelContainer u : this) { + s += "\n"; + s += u.toString(); + s += "\n"; + } + s += "# LEVEL LIST END #\n"; + return s; + } + + /** + * Empty constructor for NetLevelList + */ + public NetLevelList() {} + + /** + * Create level list from downloaded ObjLevelList object + * + * @param list level list info + */ + public NetLevelList(ObjLevelList list) { + for (ObjLevelInfo oli : list) { + add(new NetLevelContainer(oli)); + } + } + + /** + * Unpack levels and convert them to level bundles. + * + * @return level bundle list. + */ + public ArrayList unpackLevels() { + ArrayList list = new ArrayList(); + for (NetLevelContainer lc : this) { + if (lc.isValid) { + try { + list.add(new LevelBundle(lc)); + } catch (Exception e) { + Log.e("Error unpacking a level " + lc.title, e); + } + } + } + + return list; + } + + /** + * Download missing levels, check already existing level files for validity + * using checksum. + */ + public void downloadMissingLevels() { + for (NetLevelContainer lc : this) { + boolean got = false; + if (lc.isDownloaded()) { + Log.f2("NET_LEVELS: Level " + lc.title + " found on disk, calculating checksum..."); + if (lc.loadCheckIfOriginal()) { + got = true; + Log.f3("NET_LEVELS: Level " + lc.title + " is valid."); + } else { + Log.f3("NET_LEVELS: Level " + lc.title + " is corrupted."); + } + } + + if (!got) { + try { + Log.f2("NET_LEVELS: Downloading level " + lc.title + "..."); + lc.download(); + Log.f2("NET_LEVELS: Level " + lc.title + " downloaded, calculating checksum..."); + if (!lc.loadCheckIfOriginal()) { + Log.f3("NET_LEVELS: Level " + lc.title + " is corrupted."); + } else { + Log.f3("NET_LEVELS: Level " + lc.title + " is valid."); + } + } catch (Exception e) { + Log.e("NET_LEVELS: Level " + lc.title + " could not be downloaded.", e); + } + } + } + } + +} diff --git a/src/net/sector/network/responses/ObjInfoTable.java b/src/net/sector/network/responses/ObjInfoTable.java new file mode 100644 index 0000000..24f7054 --- /dev/null +++ b/src/net/sector/network/responses/ObjInfoTable.java @@ -0,0 +1,27 @@ +package net.sector.network.responses; + + +/** + * Table of informations + * + * @author MightyPork + */ +public class ObjInfoTable { + + /** Number of the newest version released */ + public int latest_version_num; + + /** Name of the latest version */ + public String latest_version; + + @Override + public String toString() { + + String s = ""; + s += "InfoTable\n"; + s += "| latest version number = " + latest_version_num + "\n"; + s += "| latest version = " + latest_version; + + return s; + } +} diff --git a/src/net/sector/network/responses/ObjLevelInfo.java b/src/net/sector/network/responses/ObjLevelInfo.java new file mode 100644 index 0000000..a6dabb7 --- /dev/null +++ b/src/net/sector/network/responses/ObjLevelInfo.java @@ -0,0 +1,39 @@ +package net.sector.network.responses; + + +/** + * Level entry in level list + * + * @author MightyPork + */ +public class ObjLevelInfo { + + /** Level ID */ + public String lid; + + /** Level name */ + public String title; + + /** level download URL */ + public String url; + + /** level file MD5 checksum */ + public String checksum; + + /** time of level creation */ + public int created_time; + + @Override + public String toString() { + + String s = ""; + s += "LevelInfo\n"; + s += "| lid = " + lid + "\n"; + s += "| title = " + title + "\n"; + s += "| url = " + url + "\n"; + s += "| checksum = " + checksum + "\n"; + s += "| created_time = " + created_time; + + return s; + } +} diff --git a/src/net/sector/network/responses/ObjLevelList.java b/src/net/sector/network/responses/ObjLevelList.java new file mode 100644 index 0000000..d382f91 --- /dev/null +++ b/src/net/sector/network/responses/ObjLevelList.java @@ -0,0 +1,27 @@ +package net.sector.network.responses; + + +import java.util.ArrayList; + + +/** + * List of levels in database + * + * @author MightyPork + */ +public class ObjLevelList extends ArrayList { + + @Override + public String toString() { + String s = ""; + s += "\n# LEVEL LIST BEGIN #\n"; + for (ObjLevelInfo u : this) { + s += "\n"; + s += u.toString(); + s += "\n"; + } + s += "\n# LEVEL LIST END #\n"; + return s; + } + +} diff --git a/src/net/sector/network/responses/ObjScoreInfo.java b/src/net/sector/network/responses/ObjScoreInfo.java new file mode 100644 index 0000000..57c9a04 --- /dev/null +++ b/src/net/sector/network/responses/ObjScoreInfo.java @@ -0,0 +1,41 @@ +package net.sector.network.responses; + + +/** + * Score entry in score list + * + * @author MightyPork + */ +public class ObjScoreInfo implements Comparable { + + /** Username */ + public String uname; + + /** Time when score was taken */ + public int time; + + /** User's score */ + public int score; + + /** User ID */ + public String uid; + + @Override + public String toString() { + + String s = ""; + s += "Score\n"; + s += "| uid = " + uid + "\n"; + s += "| uname = " + uname + "\n"; + s += "| time = " + time + "\n"; + s += "| score = " + score + "\n"; + + return s; + } + + @Override + public int compareTo(ObjScoreInfo o) { + if (this == o) return 0; + return -new Integer(score).compareTo(o.score); + } +} diff --git a/src/net/sector/network/responses/ObjScoreList.java b/src/net/sector/network/responses/ObjScoreList.java new file mode 100644 index 0000000..b535f18 --- /dev/null +++ b/src/net/sector/network/responses/ObjScoreList.java @@ -0,0 +1,57 @@ +package net.sector.network.responses; + + +import java.util.ArrayList; +import java.util.Collections; + + +/** + * List of scores for level + * + * @author MightyPork + */ +public class ObjScoreList extends ArrayList { + + /** Flag that last submitted score improved personal record. */ + public boolean scoreImproved = false; + + /** Last score - before submitting new one; -1 if this is the 1st time */ + public int lastScore = -1; + + @Override + public String toString() { + String s = ""; + s += "\n# SCORE LIST BEGIN #\n"; + + s += "Score improved = " + scoreImproved + "\n"; + s += "Last score = " + lastScore + "\n"; + + for (ObjScoreInfo x : this) { + s += "\n"; + s += x.toString(); + s += "\n"; + } + s += "\n# SCORE LIST END #\n"; + return s; + } + + public int getScoreForUid(String uid) { + for (ObjScoreInfo sc : this) { + if (sc.uid.equals(uid)) return sc.score; + } + return -1; + } + + public int getUserPosition(String uid) { + + Collections.sort(this); + + int pos = 1; + for (ObjScoreInfo sc : this) { + if (sc.uid.equals(uid)) return pos; + pos++; + } + return -1; + } + +} diff --git a/src/net/sector/network/responses/ObjSessionInfo.java b/src/net/sector/network/responses/ObjSessionInfo.java new file mode 100644 index 0000000..abc033c --- /dev/null +++ b/src/net/sector/network/responses/ObjSessionInfo.java @@ -0,0 +1,43 @@ +package net.sector.network.responses; + + +/** + * Session info (response from login request and similar) + * + * @author MightyPork + */ +public class ObjSessionInfo { + + /** User ID */ + public String uid; + + /** AUTH_TOKEN */ + public String auth_token; + + /** Username */ + public String uname; + + /** E-mail */ + public String email; + + /** Country code */ + public String country; + + /** Registration timestamp */ + public int reg_time; + + @Override + public String toString() { + + String s = ""; + s += "ObjSessionInfo\n"; + s += "| uid = " + uid + "\n"; + s += "| auth_token = " + auth_token + "\n"; + s += "| uname = " + uname + "\n"; + s += "| email = " + email + "\n"; + s += "| country = " + country + "\n"; + s += "| reg_time = " + reg_time; + + return s; + } +} diff --git a/src/net/sector/network/responses/ObjUserInfo.java b/src/net/sector/network/responses/ObjUserInfo.java new file mode 100644 index 0000000..0075947 --- /dev/null +++ b/src/net/sector/network/responses/ObjUserInfo.java @@ -0,0 +1,31 @@ +package net.sector.network.responses; + + +/** + * User info entry in user list + * + * @author MightyPork + */ +public class ObjUserInfo { + + /** Username */ + public String uname; + + /** Registration timestamp */ + public int reg_time; + + /** Country code */ + public String country; + + @Override + public String toString() { + + String s = ""; + s += "UserInfo\n"; + s += "| uname = " + uname + "\n"; + s += "| country = " + country + "\n"; + s += "| reg_time = " + reg_time; + + return s; + } +} diff --git a/src/net/sector/network/responses/ObjUserList.java b/src/net/sector/network/responses/ObjUserList.java new file mode 100644 index 0000000..3790680 --- /dev/null +++ b/src/net/sector/network/responses/ObjUserList.java @@ -0,0 +1,27 @@ +package net.sector.network.responses; + + +import java.util.ArrayList; + + +/** + * List of users in global leaderboard system + * + * @author MightyPork + */ +public class ObjUserList extends ArrayList { + + @Override + public String toString() { + String s = ""; + s += "\n# USER LIST BEGIN #\n"; + for (ObjUserInfo u : this) { + s += "\n"; + s += u.toString(); + s += "\n"; + } + s += "\n# USER LIST END #\n"; + return s; + } + +} diff --git a/src/net/sector/sounds/AudioX.java b/src/net/sector/sounds/AudioX.java new file mode 100644 index 0000000..0ed6e41 --- /dev/null +++ b/src/net/sector/sounds/AudioX.java @@ -0,0 +1,277 @@ +package net.sector.sounds; + + +import net.sector.Constants; + +import org.newdawn.slick.openal.Audio; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; + + +/** + * Wrapper class for slick audio with shorter method names and support for + * Coords + * + * @author MightyPork + */ +public class AudioX implements Audio { + + private Audio audio = null; + private float pauseLoopPosition = 0; + private boolean looping = false; + private boolean isLoopPaused = false; + private boolean playingAsMusic = false; + private boolean playingAsEffect = false; + private float playPitch = 1; + private float playGain = 1; + + public void pauseLoop() { + if (isPlaying() && looping) { + pauseLoopPosition = audio.getPosition(); + stop(); + isLoopPaused = true; + } + } + + public void resumeLoop() { + if (looping && isLoopPaused) { + if (playingAsMusic) { + audio.playAsMusic(playPitch, playGain, true); + } else if (playingAsEffect) { + audio.playAsSoundEffect(playPitch, playGain, true); + } + audio.setPosition(pauseLoopPosition); + isLoopPaused = false; + } + } + + /** + * AudioX from slick Audio + * + * @param audio + */ + public AudioX(Audio audio) { + this.audio = audio; + } + + @Override + public void stop() { + audio.stop(); + //looping = false; + isLoopPaused = false; + } + + @Override + public int getBufferID() { + return audio.getBufferID(); + } + + @Override + public boolean isPlaying() { + return audio.isPlaying(); + } + + @Override + public boolean isPaused() { + return audio.isPaused(); + } + + + /** + * Play effect loop + * + * @param pitch effect pitch + * @param gain effect volume + * @return resource id + */ + public int playAsEffectLoop(float pitch, float gain) { + return playEffectLoop(pitch, gain); + } + + /** + * Play effect loop + * + * @param pitch effect pitch + * @param gain effect volume + * @return resource id + */ + public int playEffectLoop(float pitch, float gain) { + playPitch = pitch; + playGain = gain; + looping = true; + playingAsEffect = true; + playingAsMusic = false; + return playAsSoundEffect(pitch, gain, true, Sounds.listener); + } + + @Override + public int playAsSoundEffect(float pitch, float gain, boolean loop) { + playPitch = pitch; + playGain = gain; + looping = loop; + playingAsEffect = true; + playingAsMusic = false; + return playAsSoundEffect(pitch, gain, loop, Sounds.listener); + } + + @Override + public int playAsSoundEffect(float pitch, float gain, boolean loop, float x, float y, float z) { + return audio.playAsSoundEffect(pitch, gain, loop, x, y, z); + } + + /** + * Play this sound as a sound effect + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @param x coord x + * @param y coord y + * @param z coord z + * @return resource index + */ + public int playAsSoundEffect(float pitch, float gain, float x, float y, float z) { + return playAsSoundEffect(pitch, gain, false, x, y, z); + } + + /** + * Play this sound as a sound effect + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @param loop True if we should loop + * @param pos The position of the sound + * @return The ID of the source playing the sound + */ + public int playAsSoundEffect(float pitch, float gain, boolean loop, Coord pos) { + return audio.playAsSoundEffect(pitch, gain, loop, (float) pos.x, (float) pos.y, (float) pos.z); + } + + // shorter + /** + * Play this sound as a sound effect + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @param loop True if we should loop + * @return The ID of the source playing the sound + */ + public int playEffect(float pitch, float gain, boolean loop) { + playPitch = pitch; + playGain = gain; + looping = loop; + playingAsEffect = true; + playingAsMusic = false; + return playAsSoundEffect(pitch, gain, loop, Sounds.listener); + } + + /** + * Play this sound as a sound effect + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @param loop True if we should loop + * @param x The x position of the sound + * @param y The y position of the sound + * @param z The z position of the sound + * @return The ID of the source playing the sound + */ + public int playEffect(float pitch, float gain, boolean loop, float x, float y, float z) { + return playAsSoundEffect(pitch, gain, loop, x, y, z); + } + + /** + * Play this sound as a sound effect + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @param loop True if we should loop + * @param pos The position of the sound + * @return The ID of the source playing the sound + */ + public int playEffect(float pitch, float gain, boolean loop, Coord pos) { + return playAsSoundEffect(pitch, gain, loop, pos); + } + + /** + * Play this sound as a sound effect with linear Z fading + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @param hearDist hearing distance + * @param loop True if we should loop + * @param pos The position of the sound + * @return The ID of the source playing the sound + */ + public int playEffectLinearZ(float pitch, float gain, float hearDist, boolean loop, Coord pos) { + float gain2 = Calc.clampf((hearDist - pos.distTo(new Coord(0, 0, 0))) * (1 / hearDist), 0, 1) * gain; + return playAsSoundEffect(pitch, gain2, loop, new Coord(pos.x, Constants.LISTENER_POS.y - 2, Constants.LISTENER_POS.z)); + } + + // longer + + @Override + public int playAsMusic(float pitch, float gain, boolean loop) { + playPitch = pitch; + playGain = gain; + looping = loop; + playingAsEffect = false; + playingAsMusic = true; + return audio.playAsMusic(pitch, gain, loop); + } + + //shorter + + /** + * Play this sound as music + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @param loop True if we should loop + * @return The ID of the source playing the sound + */ + public int playMusic(float pitch, float gain, boolean loop) { + return playAsMusic(pitch, gain, loop); + } + + /** + * Play this sound as music + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @return The ID of the source playing the sound + */ + public int playMusicLoop(float pitch, float gain) { + return playAsMusic(pitch, gain, true); + } + + /** + * Play this sound as music + * + * @param pitch The pitch of the play back + * @param gain The gain of the play back + * @return The ID of the source playing the sound + */ + public int playAsMusicLoop(float pitch, float gain) { + return playAsMusic(pitch, gain, true); + } + + @Override + public boolean setPosition(float position) { + return audio.setPosition(position); + } + + @Override + public float getPosition() { + return audio.getPosition(); + } + + @Override + public void release() { + audio.release(); + audio = null; + } + + + +} diff --git a/src/net/sector/sounds/Music.java b/src/net/sector/sounds/Music.java new file mode 100644 index 0000000..1445933 --- /dev/null +++ b/src/net/sector/sounds/Music.java @@ -0,0 +1,52 @@ +package net.sector.sounds; + + +public class Music { + public static void stopAll() { + Sounds.timer_loop.stop(); + Sounds.shield_loop.stop(); + pauseMusic(); + } + + public static void pauseMusic() { + Sounds.musDesignerLoop.pauseLoop(); + Sounds.musIngameLoop.pauseLoop(); + Sounds.musMenuLoop.pauseLoop(); + } + + public static void prepareLoops() { + Sounds.musDesignerLoop.playAsMusicLoop(1, 0.1f); + Sounds.musDesignerLoop.pauseLoop(); + + Sounds.musIngameLoop.playAsMusicLoop(1, 0.15f); + Sounds.musIngameLoop.pauseLoop(); + + Sounds.musMenuLoop.playAsMusicLoop(1, 0.07f); + Sounds.musMenuLoop.pauseLoop(); + } + + public static void playIntro() { + Sounds.musIntro.playEffect(1, 0.35f, false); + } + + public static void playMenu() { + Sounds.musDesignerLoop.pauseLoop(); + Sounds.musIngameLoop.pauseLoop(); + + Sounds.musMenuLoop.resumeLoop(); + } + + public static void playDesigner() { + Sounds.musIngameLoop.pauseLoop(); + Sounds.musMenuLoop.pauseLoop(); + + Sounds.musDesignerLoop.resumeLoop(); + } + + public static void playIngame() { + Sounds.musDesignerLoop.pauseLoop(); + Sounds.musMenuLoop.pauseLoop(); + + Sounds.musIngameLoop.resumeLoop(); + } +} diff --git a/src/net/sector/sounds/Sounds.java b/src/net/sector/sounds/Sounds.java new file mode 100644 index 0000000..55259e2 --- /dev/null +++ b/src/net/sector/sounds/Sounds.java @@ -0,0 +1,220 @@ +package net.sector.sounds; + + +import java.nio.FloatBuffer; +import java.util.Random; + +import net.sector.Constants; +import net.sector.GameConfig; +import net.sector.util.Log; + +import org.lwjgl.openal.AL10; +import org.newdawn.slick.openal.SoundStore; + +import com.porcupine.coord.Coord; +import com.porcupine.math.Calc; + + +/** + * Preloaded sounds. + * + * @author MightyPork + */ +@SuppressWarnings("javadoc") +public class Sounds { + + private static final int EXPLODE_CNT = 5; + + + public static AudioX shield_loop; + public static AudioX shield_hit; + + public static AudioX timer_loop; + public static AudioX timer_end; + + public static AudioX shot_laser; + public static AudioX shot_laser_acid; + + public static AudioX shot_plasma1; + public static AudioX shot_plasma2; + + public static AudioX shot_emp; + public static AudioX shot_emp_hit; + + public static AudioX shot_gun1; + public static AudioX shot_gun2; + public static AudioX shot_gun3; + public static AudioX shot_fireball; + + public static AudioX rocket; + + + private static AudioX[] explode = new AudioX[EXPLODE_CNT]; + + + public static AudioX beep_popup; + public static AudioX beep_slow1; + public static AudioX beep_slow2; + public static AudioX beep_soft; + public static AudioX beep_soft_short; + public static AudioX des_level_up; + public static AudioX des_level_down; + public static AudioX des_repair; + public static AudioX click1; + public static AudioX click2; + public static AudioX shutter; + + + public static AudioX appear; + public static AudioX powerup1; + public static AudioX powerup2; + public static AudioX powerdown1; + + protected static AudioX musIntro; + protected static AudioX musIngameLoop; + protected static AudioX musMenuLoop; + protected static AudioX musDesignerLoop; + + + + public static SoundStore soundManager = SoundStore.get(); + + + public static void loadForSplash() { + if (GameConfig.enableSplash) { + musIntro = loadSound("res/sounds/music/intro.ogg"); + } else { + musIntro = loadSound("res/sounds/music/intro-nosplash.ogg"); + } + + shutter = loadSound("res/sounds/effect/shutter.ogg"); + } + + /** + * Load sounds + */ + public static void load() { + musIngameLoop = loadSound("res/sounds/music/random-loop.ogg"); + musMenuLoop = loadSound("res/sounds/music/cosmic-journey.ogg"); + musDesignerLoop = loadSound("res/sounds/music/dust-loop.ogg"); + + shot_fireball = loadSound("res/sounds/effect/shot-fireball2.ogg"); + + shot_laser = loadSound("res/sounds/effect/shot-laser.ogg"); + shot_laser_acid = loadSound("res/sounds/effect/shot-laser-acid.ogg"); + + shot_plasma1 = loadSound("res/sounds/effect/shot-plasma1.ogg"); + shot_plasma2 = loadSound("res/sounds/effect/shot-plasma2.ogg"); + + shot_emp = loadSound("res/sounds/effect/shot-emp.ogg"); + shot_emp_hit = loadSound("res/sounds/effect/shot-emp-sparks.ogg"); + + shot_gun1 = loadSound("res/sounds/effect/shot-gun1.ogg"); + shot_gun2 = loadSound("res/sounds/effect/shot-gun2.ogg"); + shot_gun3 = loadSound("res/sounds/effect/shot-gun3.ogg"); + + explode[0] = loadSound("res/sounds/effect/explode1.ogg"); + explode[1] = loadSound("res/sounds/effect/explode2.ogg"); + explode[2] = loadSound("res/sounds/effect/explode3.ogg"); + explode[3] = loadSound("res/sounds/effect/explode4.ogg"); + explode[4] = loadSound("res/sounds/effect/explode5.ogg"); + + rocket = loadSound("res/sounds/effect/shot-rocket.ogg"); + powerup2 = loadSound("res/sounds/effect/powerup2.ogg"); + powerup1 = loadSound("res/sounds/effect/powerup.ogg"); + powerdown1 = loadSound("res/sounds/effect/powerdown.ogg"); + appear = loadSound("res/sounds/effect/appear.ogg"); + + + timer_loop = loadSound("res/sounds/effect/timer-loop.ogg"); + timer_end = loadSound("res/sounds/effect/timer-end.ogg"); + + beep_popup = loadSound("res/sounds/effect/beep-popup.ogg"); + beep_slow1 = loadSound("res/sounds/effect/beep-slow1.ogg"); + beep_slow2 = loadSound("res/sounds/effect/beep-slow2.ogg"); + + beep_soft = loadSound("res/sounds/effect/beep-soft.ogg"); + beep_soft_short = loadSound("res/sounds/effect/beep-soft-short.ogg"); + + des_level_up = loadSound("res/sounds/effect/beep-des-levelup.ogg"); + des_level_down = loadSound("res/sounds/effect/beep-des-leveldown.ogg"); + des_repair = loadSound("res/sounds/effect/beep-des-repair.ogg"); + + click1 = loadSound("res/sounds/effect/click1.ogg"); + click2 = loadSound("res/sounds/effect/click2.ogg"); + + shield_hit = loadSound("res/sounds/effect/shield-hit.ogg"); + shield_loop = loadSound("res/sounds/effect/shield-loop.ogg"); + + Music.prepareLoops(); + } + + public static Coord listener = new Coord(); + private static Random rand = new Random(); + + + + /** + * Get random explode sound + * + * @return + */ + public static AudioX explosion() { + return explode[rand.nextInt(EXPLODE_CNT)]; + } + + + /** + * Set listener pos + * + * @param pos + */ + public static void setListener(Coord pos) { + listener.setTo(pos); + FloatBuffer buf3 = Calc.Buffers.mkBuff(3); + FloatBuffer buf6 = Calc.Buffers.mkBuff(6); + buf3.clear(); + Calc.Buffers.fillBuff(buf3, (float) pos.x, (float) pos.y, (float) pos.z); + AL10.alListener(AL10.AL_POSITION, buf3); + + buf3.clear(); + Calc.Buffers.fillBuff(buf3, 0, 0, 0); + AL10.alListener(AL10.AL_VELOCITY, buf3); + + buf6.clear(); + Calc.Buffers.fillBuff(buf6, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f); + AL10.alListener(AL10.AL_ORIENTATION, buf6); + + buf3 = buf6 = null; + } + + /** + * load one sound + * + * @param path file path + * @return the sound + */ + private static AudioX loadSound(String path) { + try { + String ext = path.substring(path.length() - 3).toLowerCase(); + AudioX audio = null; + if (ext.equals("ogg")) { + audio = new AudioX(soundManager.getOgg(path)); + } + if (ext.equals("wav")) { + audio = new AudioX(soundManager.getWAV(path)); + } + if (ext.equals("aif")) { + audio = new AudioX(soundManager.getAIF(path)); + } + if (ext.equals("mod")) { + audio = new AudioX(soundManager.getMOD(path)); + } + if (Constants.LOG_SOUNDS) Log.f2("Sound " + path + " loaded."); + return audio; + } catch (Exception e) { + Log.e("ERROR WHILE LOADING: " + path); + throw new RuntimeException(e); + } + } +} diff --git a/src/net/sector/textures/TextureManager.java b/src/net/sector/textures/TextureManager.java new file mode 100644 index 0000000..9500656 --- /dev/null +++ b/src/net/sector/textures/TextureManager.java @@ -0,0 +1,123 @@ +package net.sector.textures; + + +import static org.lwjgl.opengl.GL11.*; + +import java.io.IOException; +import java.util.HashMap; + +import net.sector.Constants; +import net.sector.util.Log; + +import org.newdawn.slick.opengl.Texture; +import org.newdawn.slick.opengl.TextureLoader; +import org.newdawn.slick.util.ResourceLoader; + + +/** + * Texture manager + * + * @author MightyPork + */ +public class TextureManager { + + private static final boolean DEBUG = Constants.LOG_TEXTURES; + + private static HashMap textures = new HashMap(); + + private static HashMap texturesByPath = new HashMap(); + + /** + * Load texture + * + * @param resourcePath + * @return the loaded texture + */ + public static Texture load(String resourcePath) { + try { + if (texturesByPath.containsKey(resourcePath)) { + return texturesByPath.get(resourcePath); + } + + String ext = resourcePath.substring(resourcePath.length() - 4); + + Texture texture = TextureLoader.getTexture(ext.toUpperCase(), ResourceLoader.getResourceAsStream(resourcePath)); + + if (texture != null) { + + if (DEBUG) Log.f2("Texture " + resourcePath + " loaded."); + + texturesByPath.put(resourcePath, texture); + return texture; + } + + Log.w("Texture " + resourcePath + " could not be loaded."); + return null; + } catch (IOException e) { + Log.e("Loading of texture " + resourcePath + " failed.", e); + throw new RuntimeException(e); + } + + } + + /** + * Load texture to the texture list + * + * @param name texture name used to call it + * @param resourcePath eg. "res/image.png" + * @return the texture just loaded + */ + public static Texture load(String name, String resourcePath) { + + if (!textures.containsKey(name)) { + Texture texture = load(resourcePath); + + if (texturesByPath.containsKey(resourcePath)) { + textures.put(name, texture = texturesByPath.get(resourcePath)); + return texture; + } + + if (texture != null) { + textures.put(name, texture); + return texture; + } + Log.w("Texture " + resourcePath + " could not be loaded."); + return null; + } else { + return get(name); + } + + } + + /** + * Bind texture by name + * + * @param name texture name + * @throws RuntimeException if not loaded yet + */ + public static void bind(String name) throws RuntimeException { + Texture tx = get(name); + if (tx == null) throw new RuntimeException("Can't bind texture \"" + name + "\", texture is not loaded."); + //tx.bind(); + glBindTexture(GL_TEXTURE_2D, tx.getTextureID()); + } + + /** + * Unbind all + */ + public static void unbind() { + glBindTexture(GL_TEXTURE_2D, 0); + } + + /** + * Get texture for name + * + * @param name name + * @return texture + */ + public static Texture get(String name) { + return textures.get(name); + } + + +} diff --git a/src/net/sector/textures/Textures.java b/src/net/sector/textures/Textures.java new file mode 100644 index 0000000..85ed8cd --- /dev/null +++ b/src/net/sector/textures/Textures.java @@ -0,0 +1,38 @@ +package net.sector.textures; + + +import org.lwjgl.opengl.GL11; + + +/** + * Texture loading class + * + * @author MightyPork + */ +public class Textures { + + /** + * Load what's needed for splash + */ + public static void loadForSplash() { + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + + TextureManager.load("particles_plain", "res/images/particles_plain.png"); + //TextureManager.load("particles_blend", "res/images/particles_blend.png"); + } + + /** + * Load textures + */ + public static void load() { + TextureManager.load("designer_icons", "res/images/designer_icons.png"); + //TextureManager.load("particles_plain", "res/images/particles_plain.png"); + TextureManager.load("particles_blend", "res/images/particles_blend.png"); + + TextureManager.load("shield", "res/images/shield.png"); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + } + +} diff --git a/src/net/sector/threads/EThreadStatus.java b/src/net/sector/threads/EThreadStatus.java new file mode 100644 index 0000000..f5f07c0 --- /dev/null +++ b/src/net/sector/threads/EThreadStatus.java @@ -0,0 +1,11 @@ +package net.sector.threads; + + +/** + * Loading thread status enumeration + * + * @author MightyPork + */ +public enum EThreadStatus { + UNSTARTED, SUCCESS, FAILURE, WORKING; +} diff --git a/src/net/sector/threads/ThreadCheckLatestVersion.java b/src/net/sector/threads/ThreadCheckLatestVersion.java new file mode 100644 index 0000000..03016b0 --- /dev/null +++ b/src/net/sector/threads/ThreadCheckLatestVersion.java @@ -0,0 +1,43 @@ +package net.sector.threads; + + +import static net.sector.threads.EThreadStatus.*; +import net.sector.level.SuperContext; +import net.sector.network.communication.LeaderboardClient; +import net.sector.network.communication.ServerError; +import net.sector.network.responses.ObjInfoTable; +import net.sector.util.Log; + + +/** + * Thread checking version of the latest release. + * + * @author MightyPork + */ +public class ThreadCheckLatestVersion extends Thread { + + /** Thread status */ + public static EThreadStatus status = UNSTARTED; + + @Override + public void run() { + status = WORKING; + + try { + ObjInfoTable tbl = LeaderboardClient.getInfoTable(); + + SuperContext.latestVersionName = tbl.latest_version; + SuperContext.latestVersionNumber = tbl.latest_version_num; + + Log.f1("THREAD: Downloaded information table."); + Log.f2(tbl.toString()); + + status = SUCCESS; + + } catch (ServerError e) { + status = FAILURE; + Log.w("THREAD: Could not get info table: " + e.getMessage()); + } + + } +} diff --git a/src/net/sector/threads/ThreadDownloadNewLevels.java b/src/net/sector/threads/ThreadDownloadNewLevels.java new file mode 100644 index 0000000..4d18cfb --- /dev/null +++ b/src/net/sector/threads/ThreadDownloadNewLevels.java @@ -0,0 +1,45 @@ +package net.sector.threads; + + +import static net.sector.threads.EThreadStatus.*; +import net.sector.level.LevelRegistry; +import net.sector.network.communication.LeaderboardClient; +import net.sector.network.levels.NetLevelList; +import net.sector.network.responses.ObjLevelList; +import net.sector.util.Log; + + +/** + * Thread checking version of the latest release. + * + * @author MightyPork + */ +public class ThreadDownloadNewLevels extends Thread { + + /** Thread status */ + public static EThreadStatus status = UNSTARTED; + + @Override + public void run() { + status = WORKING; + + try { + ObjLevelList levels = LeaderboardClient.getLevelList(); + Log.f1("THREAD: Downloaded list of new levels."); + + NetLevelList nlc = new NetLevelList(levels); + + Log.f1("THREAD: Retrieving missing levels and getting updates."); + nlc.downloadMissingLevels(); + + LevelRegistry.netLevels_inPotentia = nlc; + + status = SUCCESS; + + } catch (Exception e) { + status = FAILURE; + Log.w("THREAD: Could not get list of levels: " + e.getMessage()); + } + + } +} diff --git a/src/net/sector/threads/ThreadLoadAndActivateProfiles.java b/src/net/sector/threads/ThreadLoadAndActivateProfiles.java new file mode 100644 index 0000000..ab1d56f --- /dev/null +++ b/src/net/sector/threads/ThreadLoadAndActivateProfiles.java @@ -0,0 +1,39 @@ +package net.sector.threads; + + +import static net.sector.threads.EThreadStatus.*; +import net.sector.level.SuperContext; +import net.sector.network.UserProfile; +import net.sector.network.communication.ServerError; +import net.sector.util.Log; + + +/** + * Thread activating all user profiles in SuperContext. + * + * @author MightyPork + */ +public class ThreadLoadAndActivateProfiles extends Thread { + /** Thread status */ + public static EThreadStatus status = UNSTARTED; + + @Override + public void run() { + status = WORKING; + Log.f2("THREAD: Loading file with user logins."); + SuperContext.loadUserList(); + + for (UserProfile p : SuperContext.userProfiles) { + try { + Log.f2("THREAD: Activating profile " + p.uname); + p.logIn(); + Log.f2("THREAD: Profile " + p.uname + " activated."); + } catch (ServerError e) { + Log.w("THREAD: Could not activate profile " + p.uname + ": " + e.getMessage()); + } + } + + if (SuperContext.selectedUser != null && !SuperContext.selectedUser.isActivated()) SuperContext.selectedUser = null; + status = SUCCESS; + } +} diff --git a/src/net/sector/threads/ThreadLoadBasicDrivers.java b/src/net/sector/threads/ThreadLoadBasicDrivers.java new file mode 100644 index 0000000..d08b27a --- /dev/null +++ b/src/net/sector/threads/ThreadLoadBasicDrivers.java @@ -0,0 +1,32 @@ +package net.sector.threads; + + +import static net.sector.threads.EThreadStatus.*; +import net.sector.level.SuperContext; +import net.sector.level.loading.ResourceDirectoryLoader; +import net.sector.util.Log; + + +/** + * Load default drivers + * + * @author MightyPork + */ +public class ThreadLoadBasicDrivers extends Thread { + + /** Thread status */ + public static EThreadStatus status = UNSTARTED; + + @Override + public void run() { + status = WORKING; + try { + SuperContext.basicDrivers.loadDriversFromDirectory(new ResourceDirectoryLoader("res/drivers")); + status = SUCCESS; + } catch (Exception e) { + status = FAILURE; + Log.w("THREAD: Could not unpack levels: " + e.getMessage()); + } + + } +} diff --git a/src/net/sector/threads/ThreadLoadOfflineLevels.java b/src/net/sector/threads/ThreadLoadOfflineLevels.java new file mode 100644 index 0000000..45588eb --- /dev/null +++ b/src/net/sector/threads/ThreadLoadOfflineLevels.java @@ -0,0 +1,81 @@ +package net.sector.threads; + + +import static net.sector.threads.EThreadStatus.*; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Map; +import java.util.Map.Entry; + +import net.sector.Constants; +import net.sector.level.ELevel; +import net.sector.level.LevelContainer; +import net.sector.level.LevelRegistry; +import net.sector.level.loading.ResourceDirectoryLoader; +import net.sector.level.loading.XmlUtil; +import net.sector.util.Log; +import net.sector.util.Utils; + +import org.jdom2.Element; + +import com.porcupine.util.FileUtils; + + +/** + * Thread checking version of the latest release. + * + * @author MightyPork + */ +public class ThreadLoadOfflineLevels extends Thread { + + /** Thread status */ + public static EThreadStatus status = UNSTARTED; + + @Override + public void run() { + status = WORKING; + try { + + // internal + ResourceDirectoryLoader rdl = new ResourceDirectoryLoader("res/levels"); + Map levels = XmlUtil.loadFromDirectoryWithManifest(rdl, "levels"); + + for (Entry e : levels.entrySet()) { + try { + LevelRegistry.internalLevels_inPotentia.add(new LevelContainer(e.getKey(), e.getValue(), ELevel.INTERNAL)); + } catch (Exception err) { + Log.e("Could not load local level from file " + e.getKey(), err); + } + } + + + // local + File folder = Utils.getGameSubfolder(Constants.DIR_LEVELS_LOCAL); + folder.mkdirs(); + + for (File file : FileUtils.listFolder(folder)) { + if (file.isFile()) { + String filename = file.getName(); + if (filename.endsWith(".xml") || filename.endsWith(".XML")) { + try { + InputStream in = new FileInputStream(new File(folder, filename)); + LevelRegistry.localLevels_inPotentia.add(new LevelContainer(filename, XmlUtil.getRootElement(in), ELevel.LOCAL)); + } catch (Exception e) { + Log.e("Could not load local level from file " + filename, e); + } + + } + } + } + + status = SUCCESS; + + } catch (Exception e) { + Log.w("THREAD: Could not load offline levels: " + e.getMessage()); + status = FAILURE; + } + + } +} diff --git a/src/net/sector/threads/ThreadSaveScreenshot.java b/src/net/sector/threads/ThreadSaveScreenshot.java new file mode 100644 index 0000000..244d23e --- /dev/null +++ b/src/net/sector/threads/ThreadSaveScreenshot.java @@ -0,0 +1,92 @@ +package net.sector.threads; + + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.imageio.ImageIO; + +import net.sector.Constants; +import net.sector.util.Log; +import net.sector.util.Utils; + + +/** + * Thread for saving screenshot + * + * @author MightyPork + */ +public class ThreadSaveScreenshot extends Thread { + + private ByteBuffer buffer; + private int width; + private int height; + private int bpp; + + /** + * Save screenshot thread + * + * @param buffer byte buffer with image data + * @param width screen width + * @param height screen height + * @param bpp bits per pixel + */ + public ThreadSaveScreenshot(ByteBuffer buffer, int width, int height, int bpp) { + this.buffer = buffer; + this.width = width; + this.height = height; + this.bpp = bpp; + } + + private String getUniqueScreenshotName() { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + return df.format(new Date()); + } + + @Override + public void run() { + File screenshotDir = Utils.getGameSubfolder(Constants.DIR_SCREENSHOTS); + + screenshotDir.mkdirs(); + + String fname = getUniqueScreenshotName(); + + // generate unique filename + File file; + int index = 0; + while (true) { + file = new File(screenshotDir, fname + (index > 0 ? "-" + index : "") + ".png"); + if (!file.exists()) break; + index++; + } + + Log.f3("Saving screenshot to file: " + file); + + + String format = "PNG"; + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + + // convert to a buffered image + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int i = (x + (width * y)) * bpp; + int r = buffer.get(i) & 0xFF; + int g = buffer.get(i + 1) & 0xFF; + int b = buffer.get(i + 2) & 0xFF; + image.setRGB(x, height - (y + 1), (0xFF << 24) | (r << 16) | (g << 8) | b); + } + } + + // save to disk + try { + ImageIO.write(image, format, file); + } catch (IOException e) { + Log.e("Failed to save screenshot.", e); + } + } +} diff --git a/src/net/sector/threads/ThreadUnpackLevels.java b/src/net/sector/threads/ThreadUnpackLevels.java new file mode 100644 index 0000000..3b027eb --- /dev/null +++ b/src/net/sector/threads/ThreadUnpackLevels.java @@ -0,0 +1,52 @@ +package net.sector.threads; + + +import static net.sector.threads.EThreadStatus.*; +import net.sector.App; +import net.sector.level.LevelContainer; +import net.sector.level.LevelRegistry; +import net.sector.util.Log; + + +/** + * Thread checking version of the latest release. + * + * @author MightyPork + */ +public class ThreadUnpackLevels extends Thread { + public static ThreadUnpackLevels instance = null; + + /** Thread status */ + public static EThreadStatus status = UNSTARTED; + + @Override + public void run() { + instance = this; + status = WORKING; + try { + + if (!App.offlineMode) LevelRegistry.netLevels = LevelRegistry.netLevels_inPotentia.unpackLevels(); + + for (LevelContainer lc : LevelRegistry.internalLevels_inPotentia) { + try { + LevelRegistry.internalLevels.add(lc.toBundle()); + } catch (Exception e) { + Log.w("THREAD: Error unpacking internal level: " + e.getMessage()); + } + } + + for (LevelContainer lc : LevelRegistry.localLevels_inPotentia) { + try { + LevelRegistry.localLevels.add(lc.toBundle()); + } catch (Exception e) { + Log.w("THREAD: Error unpacking local level: " + e.getMessage()); + } + } + status = SUCCESS; + } catch (Exception e) { + status = FAILURE; + Log.e("THREAD: Could not unpack levels.", e); + } + + } +} diff --git a/src/net/sector/util/Align.java b/src/net/sector/util/Align.java new file mode 100644 index 0000000..3f31d88 --- /dev/null +++ b/src/net/sector/util/Align.java @@ -0,0 +1,20 @@ +package net.sector.util; + + +/** + * Alignment + * + * @author MightyPork + */ +@SuppressWarnings("javadoc") +public class Align { + public static final int LEFT = -1; + public static final int RIGHT = 1; + public static final int TOP = 1; + public static final int BOTTOM = -1; + public static final int UP = 1; + public static final int DOWN = -1; + public static final int CENTER = 0; + public static final int MIDDLE = 0; + +} diff --git a/src/net/sector/util/CoordUtils.java b/src/net/sector/util/CoordUtils.java new file mode 100644 index 0000000..23041c6 --- /dev/null +++ b/src/net/sector/util/CoordUtils.java @@ -0,0 +1,70 @@ +package net.sector.util; + + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc.Deg; +import com.porcupine.math.Polar; + + +/** + * Functions for advanced coordinate manipulation. + * + * @author MightyPork + */ +public class CoordUtils { + + /** + * Get absolute coordinate of a point in local axis system, rotated from the + * standard one by ANGLE around Y axis. + * + * @param rotAngle angle of rotation + * @param theCoord the relative coordinate to transform + * @return absolute position of the transformed coordinate + */ + public static Coord coordToLocalSystem(double rotAngle, Coord theCoord) { + Vec[] axes = getLocalAxes(rotAngle); + return axes[0].scale(theCoord.x).add(axes[1].scale(theCoord.z)).add(0, theCoord.y, 0); + } + + /** + * Get "Z" axis vector of Cartesian coordinate system rotated by angle in + * degrees + * + * @param rotAngle angle in degrees + * @return Z axis unit vector + */ + public static Vec getLocalAxisZ(double rotAngle) { + Polar p = new Polar(Deg.toRad(rotAngle + 90), 1); + Coord c = p.toCoord(); + return new Vec(c.x, 0, c.y); + } + + /** + * Get "X" axis vector of Cartesian coordinate system rotated by angle in + * degrees + * + * @param rotAngle angle in degrees + * @return X axis unit vector + */ + public static Vec getLocalAxisX(double rotAngle) { + Vec fw = getLocalAxisZ(rotAngle); + Polar pr = Polar.fromCoord(fw.x, fw.z); + pr.angle += Math.PI / 2; + Coord c = pr.toCoord(); + return new Vec(-c.x, 0, -c.y); + } + + /** + * Get "X" and "Z" axis vectors of Cartesian coordinate system rotated by + * angle in degrees + * + * @param rotAngle angle in degrees + * @return local axes {X,Z} - {1,0,0} and {0,0,1} if angle is 0 + */ + public static Vec[] getLocalAxes(double rotAngle) { + return new Vec[] { getLocalAxisX(rotAngle), getLocalAxisZ(rotAngle) }; + } + + +} diff --git a/src/net/sector/util/DeltaDouble.java b/src/net/sector/util/DeltaDouble.java new file mode 100644 index 0000000..237988c --- /dev/null +++ b/src/net/sector/util/DeltaDouble.java @@ -0,0 +1,118 @@ +package net.sector.util; + + +import com.porcupine.math.Calc; + + +/** + * Double which supports delta timing + * + * @author MightyPork + */ +public class DeltaDouble { + /** target double */ + public double d = 0; + /** last tick double */ + public double dlast = 0; + + /** + * new DeltaDouble + * + * @param d value + */ + public DeltaDouble(double d) { + this.dlast = this.d = d; + } + + /** + * Get target double + * + * @return number + */ + public double get() { + return d; + } + + /** + * Set to a value (both last and future) + * + * @param d + */ + public void set(double d) { + this.dlast = d; + this.d = d; + } + + /** + * Copy other + * + * @param d + */ + public void set(DeltaDouble d) { + this.dlast = d.dlast; + this.d = d.d; + } + + /** + * Store value for delta timing + */ + public void pushLast() { + dlast = d; + } + + /** + * Get value at delta time + * + * @param dtime time + * @return interpolated value + */ + public double delta(double dtime) { + return Calc.interpolate(dlast, d, dtime); + } + + /** + * Add + * + * @param num num + */ + public void add(double num) { + d += num; + } + + /** + * Subtract + * + * @param num num + */ + public void sub(double num) { + d -= num; + } + + /** + * multiply + * + * @param num num + */ + public void mul(double num) { + d *= num; + } + + /** + * Divide + * + * @param num num + */ + public void div(double num) { + d /= num; + } + + /** + * Clamp to range + * + * @param min min + * @param max max + */ + public void clamp(double min, double max) { + d = Calc.clampd(d, min, max); + } +} diff --git a/src/net/sector/util/DeltaDoubleDeg.java b/src/net/sector/util/DeltaDoubleDeg.java new file mode 100644 index 0000000..48adf87 --- /dev/null +++ b/src/net/sector/util/DeltaDoubleDeg.java @@ -0,0 +1,26 @@ +package net.sector.util; + + +import com.porcupine.math.Calc; + + +/** + * Delta double for angles in degrees + * + * @author MightyPork + */ +public class DeltaDoubleDeg extends DeltaDouble { + /** + * Delta double for angle + * + * @param d angle + */ + public DeltaDoubleDeg(double d) { + super(d); + } + + @Override + public double delta(double dtime) { + return Calc.interpolateDeg(dlast, d, dtime); + } +} diff --git a/src/net/sector/util/Log.java b/src/net/sector/util/Log.java new file mode 100644 index 0000000..434652e --- /dev/null +++ b/src/net/sector/util/Log.java @@ -0,0 +1,341 @@ +package net.sector.util; + + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.FileHandler; +import java.util.logging.Formatter; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +import net.sector.Constants; + + +/** + * Sector static logger class. + * + * @author MightyPork + * @copy (c) 2012 + */ +public class Log { + /** + * Global PowerCraft's logger. + */ + private static final Logger logger = Logger.getLogger("Sector"); + private static final Logger loggerError = Logger.getLogger("SectorErr"); + /** Logging enabled */ + public static boolean loggingEnabled = true; + /** Stdout printing enabled */ + public static boolean printToStdout = false; + + static { + try { + FileHandler handler1 = new FileHandler(Utils.getGameSubfolder(Constants.FILE_LOG).getPath()); + handler1.setFormatter(new LogFormatter(true)); + logger.addHandler(handler1); + + FileHandler handler2 = new FileHandler(Utils.getGameSubfolder(Constants.FILE_LOG_E).getPath()); + handler2.setFormatter(new LogFormatter(false)); + loggerError.addHandler(handler2); + + loggingEnabled = true; + } catch (Exception e) { + e.printStackTrace(); + } + + logger.setUseParentHandlers(false); + logger.setLevel(Level.ALL); + logger.info("Main logger initialized."); + logger.info((new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date())); + + loggerError.setUseParentHandlers(false); + loggerError.setLevel(Level.ALL); + loggerError.info("Error logger initialized."); + loggerError.info((new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date())); + + org.newdawn.slick.util.Log.setVerbose(false); + } + + /** + * Enable logging. + * + * @param flag do enable logging + */ + public static void enable(boolean flag) { + loggingEnabled = flag; + } + + + + /** + * Enable debug mode - log also printed to stdout. + * + * @param printToStdout + */ + public static void setPrintToStdout(boolean printToStdout) { + Log.printToStdout = printToStdout; + } + + /** + * Log INFO message + * + * @param msg message + */ + private static void info(String msg) { + if (!loggingEnabled) { + return; + } + logger.log(Level.INFO, msg); + } + + /** + * Log FINE (important) message + * + * @param msg message + */ + private static void fine(String msg) { + if (!loggingEnabled) { + return; + } + logger.log(Level.FINE, msg); + } + + /** + * Log FINER (loss important) message + * + * @param msg message + */ + private static void finer(String msg) { + if (!loggingEnabled) { + return; + } + logger.log(Level.FINER, msg); + } + + /** + * Log FINEST (least important) message + * + * @param msg message + */ + private static void finest(String msg) { + if (!loggingEnabled) { + return; + } + logger.log(Level.FINEST, msg); + } + + /** + * Log WARNING message + * + * @param msg message + */ + private static void warning(String msg) { + if (!loggingEnabled) { + return; + } + logger.log(Level.WARNING, msg); + loggerError.log(Level.WARNING, msg); + } + + /** + * Log FINE message + * + * @param msg message + */ + public static void f1(String msg) { + fine(msg); + } + + /** + * Log FINER message + * + * @param msg message + */ + public static void f2(String msg) { + finer(msg); + } + + /** + * Log FINEST message + * + * @param msg message + */ + public static void f3(String msg) { + finest(msg); + } + + /** + * Log INFO message + * + * @param msg message + */ + public static void i(String msg) { + info(msg); + } + + + /** + * Log WARNING message (less severe than ERROR) + * + * @param msg message + */ + public static void w(String msg) { + warning(msg); + } + + /** + * Log SEVERE (critical warning) message + * + * @param msg message + */ + private static void severe(String msg) { + loggerError.log(Level.SEVERE, msg); + if (!loggingEnabled) { + return; + } + logger.log(Level.SEVERE, msg); + } + + /** + * Log ERROR message + * + * @param msg message + */ + public static void e(String msg) { + severe(msg); + } + + /** + * Log THROWING message + * + * @param msg message + * @param thrown thrown exception + */ + public static void e(String msg, Throwable thrown) { + loggerError.log(Level.SEVERE, msg + "\n" + getStackTrace(thrown)); + if (!loggingEnabled) { + return; + } + logger.log(Level.SEVERE, msg + "\n" + getStackTrace(thrown)); + } + + /** + * Log exception thrown + * + * @param thrown thrown exception + */ + public static void e(Throwable thrown) { + loggerError.log(Level.SEVERE, getStackTrace(thrown)); + if (!loggingEnabled) { + return; + } + logger.log(Level.SEVERE, getStackTrace(thrown)); + } + + /** + * Get stack trace from throwable + * + * @param t + * @return trace + */ + private static String getStackTrace(Throwable t) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw, true); + t.printStackTrace(pw); + pw.flush(); + sw.flush(); + return sw.toString(); + } + + + /** + * PowerCraft Log file formatter. + * + * @author MightyPork + * @copy (c) 2012 + */ + private static class LogFormatter extends Formatter { + + /** Newline string constant */ + private static final String nl = System.getProperty("line.separator"); + private boolean sysout; + + public LogFormatter(boolean sysout) { + this.sysout = sysout; + } + + @Override + public String format(LogRecord record) { + + StringBuffer buf = new StringBuffer(180); + + if (record.getMessage().equals("\n")) { + return nl; + } + + if (record.getMessage().charAt(0) == '\n') { + buf.append(nl); + record.setMessage(record.getMessage().substring(1)); + } + + Level level = record.getLevel(); + String trail = "[ ? ]"; + if (level == Level.FINE) { + trail = "[ # ] "; + } + if (level == Level.FINER) { + trail = "[ - ] "; + } + if (level == Level.FINEST) { + trail = "[ ] "; + } + if (level == Level.INFO) { + trail = "[ i ] "; + } + if (level == Level.SEVERE) { + trail = "[!E!] "; + } + if (level == Level.WARNING) { + trail = "[!W!] "; + } + + record.setMessage(record.getMessage().replaceAll("\n", nl + trail)); + + buf.append(trail); + buf.append(formatMessage(record)); + + buf.append(nl); + + Throwable throwable = record.getThrown(); + if (throwable != null) { + + buf.append("at "); + buf.append(record.getSourceClassName()); + buf.append('.'); + buf.append(record.getSourceMethodName()); + buf.append(nl); + + StringWriter sink = new StringWriter(); + throwable.printStackTrace(new PrintWriter(sink, true)); + buf.append(sink.toString()); + + buf.append(nl); + } + + if (Log.printToStdout && sysout) { + if (level == Level.FINE || level == Level.FINER || level == Level.FINEST || level == Level.INFO) { + System.out.print(buf.toString()); + } else if (level == Level.SEVERE || level == Level.WARNING) { + System.err.print(buf.toString()); + } + } + + return buf.toString(); + } + } + + +} diff --git a/src/net/sector/util/RenderUtils.java b/src/net/sector/util/RenderUtils.java new file mode 100644 index 0000000..d928918 --- /dev/null +++ b/src/net/sector/util/RenderUtils.java @@ -0,0 +1,521 @@ +package net.sector.util; + + +import static org.lwjgl.opengl.GL11.*; + +import com.porcupine.color.HSV; +import com.porcupine.color.RGB; +import com.porcupine.coord.Coord; +import com.porcupine.coord.Rect; + + +/** + * Render utilities + * + * @author MightyPork + */ +public class RenderUtils { + + /** + * Translate with coord + * + * @param coord coord + */ + public static void translate(Coord coord) { + glTranslated(coord.x, coord.y, coord.z); + } + + /** + * Bing GL color + * + * @param color RGB color + */ + public static void setColor(RGB color) { + glColor4d(color.r, color.g, color.b, color.a); + } + + /** + * Render quad 2D + * + * @param rect rectangle + */ + public static void quadRect(Rect rect) { + quadCoord(rect.getMin(), rect.getMax()); + } + + /** + * Render quad 2D + * + * @param left units from left + * @param bottom units from bottom + * @param width quad width + * @param height quad height + */ + public static void quadSize(double left, double bottom, double width, double height) { + glBegin(GL_QUADS); + glVertex2d(left, bottom + height); + glVertex2d(left + width, bottom + height); + glVertex2d(left + width, bottom); + glVertex2d(left, bottom); + glEnd(); + } + + /** + * Render quad 2D + * + * @param min min coord + * @param max max coord + */ + public static void quadCoord(Coord min, Coord max) { + quadCoord(min.x, min.y, max.x, max.y); + } + + /** + * Render quad with absolute coords (from screen bottom) + * + * @param left left x + * @param bottom bottom y + * @param right right x + * @param top top y + */ + public static void quadCoord(double left, double bottom, double right, double top) { + glBegin(GL_QUADS); + glVertex2d(left, top); + glVertex2d(right, top); + glVertex2d(right, bottom); + glVertex2d(left, bottom); + glEnd(); + } + + /** + * Render quad with coloured border with outset effect + * + * @param rect rectangle + * @param border border width + * @param fill fill color + * @param inset true for inset, false for outset + */ + public static void quadRectOutset(Rect rect, double border, RGB fill, boolean inset) { + quadCoordOutset(rect.getMin(), rect.getMax(), border, fill, inset); + } + + /** + * Render quad with coloured border with outset effect + * + * @param min min coord + * @param max max coord + * @param border border width + * @param fill fill color + * @param inset true for inset, false for outset + */ + public static void quadCoordOutset(Coord min, Coord max, double border, RGB fill, boolean inset) { + quadCoordOutset(min.x, min.y, max.x, max.y, border, fill, inset); + } + + /** + * Render quad with coloured border with outset effect + * + * @param minX left X + * @param minY bottom Y + * @param maxX right X + * @param maxY top Y + * @param border border width + * @param fill fill color + * @param inset true for inset, false for outset + */ + public static void quadCoordOutset(double minX, double minY, double maxX, double maxY, double border, RGB fill, boolean inset) { + HSV hsv = fill.toHSV(); + HSV h; + + h = hsv.copy(); + h.s *= 0.6; + RGB a = h.toRGB(); + + h = fill.toHSV(); + h.v *= 0.6; + RGB b = h.toRGB(); + + RGB leftTopC, rightBottomC; + + if (!inset) { + leftTopC = a; + rightBottomC = b; + } else { + leftTopC = b; + rightBottomC = a; + } + + double bdr = border; + + RenderUtils.setColor(leftTopC); + + // left + top + glBegin(GL_QUADS); + glVertex2d(minX, minY); + glVertex2d(minX + bdr, minY + bdr); + glVertex2d(minX + bdr, maxY - bdr); + glVertex2d(minX, maxY); + + glVertex2d(minX, maxY); + glVertex2d(minX + bdr, maxY - bdr); + glVertex2d(maxX - bdr, maxY - bdr); + glVertex2d(maxX, maxY); + glEnd(); + + + RenderUtils.setColor(rightBottomC); + + // right + bottom + glBegin(GL_QUADS); + glVertex2d(maxX, minY); + glVertex2d(maxX, maxY); + glVertex2d(maxX - bdr, maxY - bdr); + glVertex2d(maxX - bdr, minY + bdr); + + glVertex2d(minX, minY); + glVertex2d(maxX, minY); + glVertex2d(maxX - bdr, minY + bdr); + glVertex2d(minX + bdr, minY + bdr); + glEnd(); + + RenderUtils.setColor(fill); + RenderUtils.quadCoord(minX + bdr, minY + bdr, maxX - bdr, maxY - bdr); + } + + /** + * Render quad with coloured border + * + * @param rect rect + * @param border border width + * @param borderColor border color + * @param insideColor filling color + */ + public static void quadRectBorder(Rect rect, double border, RGB borderColor, RGB insideColor) { + quadCoordBorder(rect.getMin(), rect.getMax(), border, borderColor, insideColor); + } + + /** + * Render quad with coloured border + * + * @param min min + * @param max max + * @param border border width + * @param borderColor border color + * @param insideColor filling color + */ + public static void quadCoordBorder(Coord min, Coord max, double border, RGB borderColor, RGB insideColor) { + quadCoordBorder(min.x, min.y, max.x, max.y, border, borderColor, insideColor); + } + + /** + * Render quad with coloured border + * + * @param minX min x + * @param minY min y + * @param maxX max x + * @param maxY max y + * @param border border width + * @param borderColor border color + * @param insideColor filling color + */ + public static void quadCoordBorder(double minX, double minY, double maxX, double maxY, double border, RGB borderColor, RGB insideColor) { + double bdr = border; + + RenderUtils.setColor(borderColor); + + //@formatter:off + RenderUtils.quadCoord(minX, minY, minX + bdr, maxY); + RenderUtils.quadCoord(maxX - bdr, minY, maxX, maxY); + RenderUtils.quadCoord(minX + bdr, maxY - bdr, maxX - bdr, maxY); + RenderUtils.quadCoord(minX + bdr, minY, maxX - bdr, minY + bdr); + //@formatter:on + + RenderUtils.setColor(insideColor); + RenderUtils.quadCoord(minX + bdr, minY + bdr, maxX - bdr, maxY - bdr); + } + + /** + * Render quad 2D with gradient vertical + * + * @param rect rect + * @param colorTop top color + * @param colorBottom bottom color + */ + public static void quadRectGradV(Rect rect, RGB colorTop, RGB colorBottom) { + quadCoordGradV(rect.getMin(), rect.getMax(), colorTop, colorBottom); + } + + /** + * Render quad 2D with gradient vertical + * + * @param min min coord + * @param max max coord + * @param colorTop top color + * @param colorBottom bottom color + */ + public static void quadCoordGradV(Coord min, Coord max, RGB colorTop, RGB colorBottom) { + quadCoordGradV(min.x, min.y, max.x, max.y, colorTop, colorBottom); + } + + /** + * Render quad 2D with gradient vertical + * + * @param minX min X + * @param minY min Y + * @param maxX max X + * @param maxY max Y + * @param colorTop top color + * @param colorBottom bottom color + */ + public static void quadCoordGradV(double minX, double minY, double maxX, double maxY, RGB colorTop, RGB colorBottom) { + glBegin(GL_QUADS); + + setColor(colorTop); + glVertex2d(minX, maxY); + glVertex2d(maxX, maxY); + + setColor(colorBottom); + glVertex2d(maxX, minY); + glVertex2d(minX, minY); + glEnd(); + } + + + + /** + * Render quad 2D with gradient vertical + * + * @param rect rect + * @param colorOuter outer color + * @param colorMiddle middle color + */ + public static void quadRectGradVBilinear(Rect rect, RGB colorOuter, RGB colorMiddle) { + quadCoordGradVBilinear(rect.getMin(), rect.getMax(), colorOuter, colorMiddle); + } + + /** + * Render quad 2D with gradient vertical + * + * @param min min coord + * @param max max coord + * @param colorOuter outer color + * @param colorMiddle middle color + */ + public static void quadCoordGradVBilinear(Coord min, Coord max, RGB colorOuter, RGB colorMiddle) { + quadCoordGradVBilinear(min.x, min.y, max.x, max.y, colorOuter, colorMiddle); + } + + /** + * Render quad 2D with gradient vertical + * + * @param minX min X + * @param minY min Y + * @param maxX max X + * @param maxY max Y + * @param colorOuter outer color + * @param colorMiddle middle color + */ + public static void quadCoordGradVBilinear(double minX, double minY, double maxX, double maxY, RGB colorOuter, RGB colorMiddle) { + glBegin(GL_QUADS); + + setColor(colorOuter); + glVertex2d(minX, maxY); + glVertex2d(maxX, maxY); + + setColor(colorMiddle); + glVertex2d(maxX, (maxY + minY) / 2); + glVertex2d(minX, (maxY + minY) / 2); + + setColor(colorMiddle); + glVertex2d(minX, (maxY + minY) / 2); + glVertex2d(maxX, (maxY + minY) / 2); + + setColor(colorOuter); + glVertex2d(maxX, minY); + glVertex2d(minX, minY); + + glEnd(); + } + + + + /** + * Render quad 2D with gradient horizontal + * + * @param rect rect + * @param colorOuter color outer + * @param colorMiddle color inner + */ + public static void quadRectGradHBilinear(Rect rect, RGB colorOuter, RGB colorMiddle) { + quadCoordGradHBilinear(rect.getMin(), rect.getMax(), colorOuter, colorMiddle); + } + + /** + * Render quad 2D with gradient horizontal + * + * @param min min coord + * @param max max coord + * @param colorOuter color outer + * @param colorMiddle color inner + */ + public static void quadCoordGradHBilinear(Coord min, Coord max, RGB colorOuter, RGB colorMiddle) { + quadCoordGradHBilinear(min.x, min.y, max.x, max.y, colorOuter, colorMiddle); + } + + /** + * Render quad 2D with gradient horizontal + * + * @param minX min x + * @param minY min y + * @param maxX max x + * @param maxY max y + * @param colorOuter color outer + * @param colorMiddle color inner + */ + public static void quadCoordGradHBilinear(double minX, double minY, double maxX, double maxY, RGB colorOuter, RGB colorMiddle) { + glBegin(GL_QUADS); + setColor(colorOuter); + glVertex2d(minX, maxY); + setColor(colorMiddle); + glVertex2d((minX + maxX) / 2, maxY); + + setColor(colorMiddle); + glVertex2d((minX + maxX) / 2, minY); + setColor(colorOuter); + glVertex2d(minX, minY); + + + setColor(colorMiddle); + glVertex2d((minX + maxX) / 2, maxY); + setColor(colorOuter); + glVertex2d(maxX, maxY); + + setColor(colorOuter); + glVertex2d(maxX, minY); + setColor(colorMiddle); + glVertex2d((minX + maxX) / 2, minY); + glEnd(); + } + + + + /** + * Render quad 2D with gradient horizontal + * + * @param rect rect + * @param colorLeft color left + * @param colorRight color right + */ + public static void quadRectGradH(Rect rect, RGB colorLeft, RGB colorRight) { + quadCoordGradH(rect.getMin(), rect.getMax(), colorLeft, colorRight); + } + + /** + * Render quad 2D with gradient horizontal + * + * @param min min coord + * @param max max coord + * @param colorLeft color left + * @param colorRight color right + */ + public static void quadCoordGradH(Coord min, Coord max, RGB colorLeft, RGB colorRight) { + quadCoordGradH(min.x, min.y, max.x, max.y, colorLeft, colorRight); + } + + /** + * Render quad 2D with gradient horizontal + * + * @param minX units from left + * @param minY units from bottom + * @param maxX quad width + * @param maxY quad height + * @param colorLeft color left + * @param colorRight color right + */ + public static void quadCoordGradH(double minX, double minY, double maxX, double maxY, RGB colorLeft, RGB colorRight) { + glBegin(GL_QUADS); + setColor(colorLeft); + glVertex2d(minX, maxY); + setColor(colorRight); + glVertex2d(maxX, maxY); + + setColor(colorRight); + glVertex2d(maxX, minY); + setColor(colorLeft); + glVertex2d(minX, minY); + glEnd(); + } + + /** + * Render textured rect (texture must be binded beforehand) + * + * @param quad rect descriptor + * @param textures texture coords + */ + public static void quadRectTextured(Rect quad, Rect textures) { + double left = quad.x1(); + double bottom = quad.y1(); + double right = quad.x2(); + double top = quad.y2(); + + double tleft = textures.x1(); + double tbottom = textures.y1(); + double tright = textures.x2(); + double ttop = textures.y2(); + + glBegin(GL_QUADS); + glTexCoord2d(tleft, ttop); + glVertex2d(left, top); + glTexCoord2d(tright, ttop); + glVertex2d(right, top); + glTexCoord2d(tright, tbottom); + glVertex2d(right, bottom); + glTexCoord2d(tleft, tbottom); + glVertex2d(left, bottom); + glEnd(); + } + +// /** +// * Render quad 2D (coords from screen top) +// * +// * @param left units from left +// * @param top units from bottom +// * @param width quad width +// * @param height quad height +// */ +// public static void quadTop(double left, double top, double width, double height) { +// double bottom = App.inst.getSize().y - top - height; +// quadSize(left, bottom, width, height); +// } +// +// /** +// * Render quad 2D with gradient vertical (coords from screen top) +// * +// * @param left units from left +// * @param top units from bottom +// * @param width quad width +// * @param height quad height +// * @param colorTop top color +// * @param colorBottom bottom color +// */ +// public static void quadTopGradV(double left, double top, double width, double height, RGB colorTop, RGB colorBottom) { +// double bottom = App.inst.getSize().y - top - height; +// quadGradV(left, bottom, width, height, colorTop, colorBottom); +// } +// +// /** +// * Render quad 2D with gradient horizontal (coords from screen top) +// * +// * @param left units from left +// * @param top units from bottom +// * @param width quad width +// * @param height quad height +// * @param colorLeft color left +// * @param colorRight color right +// */ +// public static void quadTopGradH(double left, double top, double width, double height, RGB colorLeft, RGB colorRight) { +// double bottom = App.inst.getSize().y - top - height; +// quadGradH(left, bottom, width, height, colorLeft, colorRight); +// } + +} diff --git a/src/net/sector/util/Utils.java b/src/net/sector/util/Utils.java new file mode 100644 index 0000000..036ab62 --- /dev/null +++ b/src/net/sector/util/Utils.java @@ -0,0 +1,97 @@ +package net.sector.util; + + +import java.io.File; + +import net.sector.Constants; + +import com.porcupine.coord.Coord; +import com.porcupine.coord.Vec; +import com.porcupine.math.Calc.Rad; +import com.porcupine.math.Polar; +import com.porcupine.util.FileUtils; + + +/** + * Sector's utils class + * + * @author MightyPork + */ +public class Utils { + + + private static File gameDir; + + + /** + * Internal - check if point can be seen by camera + * + * @param pos point position + * @param tolerance tolerance in degrees + * @return can be seen + */ + public static boolean canCoordBeSeen(Coord pos, double tolerance) { + if (pos.z < 0) return false; + Polar p = Polar.fromCoord(pos.x, pos.z + Constants.CAM_POS.z); + + return Rad.toDeg(Rad.diff(p.angle, Rad.a90)) <= Constants.CAM_ANGLE / 2D + tolerance; + } + + /** + * Check if rendering of entity/particle located at this point can safely be + * skipped. That means, if this entity/particle is completely out of screen. + * + * @param pos central point of the entity + * @return can be skipped + */ + public static boolean canSkipRendering(Coord pos) { + return !(Utils.canCoordBeSeen(pos, 30) || (pos.z < 5 && Math.abs(pos.x) < 10 && pos.z > -4)); + } + + /** + * 2D angle of observer to point + * + * @param observer point of observer + * @param point point of target + * @param lookVec look vector of observer + * @return angle + */ + public static double observerAngleToCoord(Coord observer, Coord point, Vec lookVec) { + Vec dist = observer.vecTo(point); + + Polar point_p = Polar.fromCoord(dist.x, dist.z); + Polar look_p = Polar.fromCoord(lookVec.x, lookVec.z); + + return Rad.toDeg(Rad.diff(point_p.angle, look_p.angle)); + } + + /** + * Get working directory ending with slash. + * + * @return directory path file + */ + public static File getGameFolder() { + if (gameDir == null) { + gameDir = FileUtils.getAppDir(Constants.APP_DIR); + } + + return gameDir; + } + + /** + * Get subfolder of game dir + * + * @param subfolderName sibfolder name + * @return the file object + */ + public static File getGameSubfolder(String subfolderName) { + return new File(getGameFolder(), subfolderName); + } + + public static Object fallback(Object... options) { + for (Object o : options) { + if (o != null) return o; + } + return null; // error + } +}