From 629c9ba7b1bea81ad9d37bbb59b81047148518e5 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 9 Feb 2026 18:42:07 +0600 Subject: [PATCH 01/17] add local server --- resources/Cargo_Base_color_sRGB.png | 3 + resources/cargoship001.txt | 6175 +++++++++++++++++++++++++++ src/Game.cpp | 32 +- src/network/LocalClient.cpp | 272 +- src/network/LocalClient.h | 85 +- 5 files changed, 6535 insertions(+), 32 deletions(-) create mode 100644 resources/Cargo_Base_color_sRGB.png create mode 100644 resources/cargoship001.txt diff --git a/resources/Cargo_Base_color_sRGB.png b/resources/Cargo_Base_color_sRGB.png new file mode 100644 index 0000000..6ec9e8e --- /dev/null +++ b/resources/Cargo_Base_color_sRGB.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bd5d071ed94f2bd8ce3ab060136e9b93b04b06d5eabaffc7845a99d73faeb30 +size 2345111 diff --git a/resources/cargoship001.txt b/resources/cargoship001.txt new file mode 100644 index 0000000..62f4d12 --- /dev/null +++ b/resources/cargoship001.txt @@ -0,0 +1,6175 @@ +===Vertices (Split by UV/Normal): 3492 +V 0: Pos(-1.491366, 1.328909, 3.882872) Norm(-0.523, -0.661038, 0.538052) UV(0.019473, 0.091689) +V 1: Pos(-1.746867, 1.630625, 3.882841) Norm(-0.577346, 0.577368, 0.577336) UV(0.001602, 0.076555) +V 2: Pos(-1.746867, 1.328909, 3.882872) Norm(-0.58474, -0.572347, 0.57489) UV(0.019473, 0.076555) +V 3: Pos(-1.746867, 1.630625, 2.584705) Norm(-0.636762, 0.758423, 0.139026) UV(0.253753, 0.89464) +V 4: Pos(-1.491366, 1.630625, 3.882841) Norm(-0.577308, 0.577394, 0.577348) UV(0.175948, 0.885273) +V 5: Pos(-1.491366, 1.630625, 2.584705) Norm(-0.718818, 0.693999, 0.040815) UV(0.252626, 0.879548) +V 6: Pos(-1.512495, 1.318377, 2.580171) Norm(-0.484354, -0.863849, 0.138437) UV(0.221061, 0.509829) +V 7: Pos(-1.746867, 1.328909, 3.882872) Norm(-0.58474, -0.572347, 0.57489) UV(0.297497, 0.52729) +V 8: Pos(-1.746868, 1.328909, 2.584705) Norm(-0.689057, -0.62352, 0.369357) UV(0.220687, 0.523723) +V 9: Pos(-1.746867, 1.328909, 3.882872) Norm(-0.58474, -0.572347, 0.57489) UV(0.505665, 0.739394) +V 10: Pos(-1.746867, 1.630625, 2.584705) Norm(-0.636762, 0.758423, 0.139026) UV(0.428772, 0.757265) +V 11: Pos(-1.746868, 1.328909, 2.584705) Norm(-0.689057, -0.62352, 0.369357) UV(0.428772, 0.739394) +V 12: Pos(-1.491366, 1.164531, 0.703231) Norm(-0.30151, -0.904535, 0.301511) UV(0.107652, 0.500929) +V 13: Pos(-1.991606, 1.164531, 0.630966) Norm(-0.722163, -0.689584, 0.054351) UV(0.101388, 0.530204) +V 14: Pos(-1.491366, 1.164531, 0.630966) Norm(-0.707089, -0.707124, 0.0) UV(0.103381, 0.500641) +V 15: Pos(-1.863751, 1.630625, 2.329785) Norm(-0.71929, 0.669459, 0.1856) UV(0.269326, 0.900419) +V 16: Pos(-1.138994, 2.388921, 1.874625) Norm(-0.537124, 0.842968, 0.030059) UV(0.901682, 0.788914) +V 17: Pos(-1.543156, 2.364377, 2.1357) Norm(-0.707555, 0.706433, -0.01785) UV(0.878572, 0.772173) +V 18: Pos(-1.205699, 2.339613, 2.373965) Norm(-0.538381, 0.842658, -0.008517) UV(0.899263, 0.75903) +V 19: Pos(-1.376387, 1.164531, 2.329785) Norm(-0.763276, -0.627318, 0.154538) UV(0.204236, 0.500614) +V 20: Pos(-1.863753, 1.164531, 2.329785) Norm(-0.653945, -0.690529, 0.309072) UV(0.202294, 0.529417) +V 21: Pos(-1.491366, 1.164531, 1.880578) Norm(-0.285497, -0.932493, -0.221241) UV(0.17723, 0.50562) +V 22: Pos(-0.565739, 0.924291, 1.454266) Norm(-0.131205, -0.973829, -0.185588) UV(0.065304, 0.641973) +V 23: Pos(-1.111483, 0.924291, 0.703231) Norm(-0.301496, -0.904538, 0.301514) UV(0.032698, 0.597693) +V 24: Pos(-0.648541, 0.924291, 0.630966) Norm(0.0, -1.0, 0.0) UV(0.060091, 0.593239) +V 25: Pos(-0.302122, 2.836185, 2.373965) Norm(0.0, 0.948187, 0.317714) UV(0.603683, 0.524856) +V 26: Pos(0.0, 2.836185, 2.373965) Norm(0.0, 0.958499, 0.285096) UV(0.607205, 0.507248) +V 27: Pos(0.0, 2.98476, 1.874452) Norm(0.0, 0.978932, 0.204185) UV(0.637578, 0.513324) +V 28: Pos(-1.422373, 2.220263, 3.747011) Norm(-0.155374, 0.982934, 0.098484) UV(0.890611, 0.676837) +V 29: Pos(-1.491366, 2.2121, 3.8828) Norm(-0.842322, 0.538968, 0.002755) UV(0.886928, 0.668587) +V 30: Pos(-1.328419, 2.243359, 3.80272) Norm(-0.218994, 0.953916, 0.205149) UV(0.8965, 0.673828) +V 31: Pos(-1.03036, 2.710321, 2.373965) Norm(-0.82418, 0.565354, -0.033203) UV(0.706558, 0.697111) +V 32: Pos(-0.827523, 2.948275, 1.874463) Norm(-0.519823, 0.849076, 0.09409) UV(0.738535, 0.683047) +V 33: Pos(-0.909848, 2.860193, 1.874489) Norm(-0.81644, 0.577372, -0.008206) UV(0.737521, 0.690119) +V 34: Pos(-0.948679, 2.79932, 2.373965) Norm(-0.538801, 0.830191, 0.143095) UV(0.595808, 0.56265) +V 35: Pos(-0.714427, 2.98476, 1.874452) Norm(-0.14608, 0.97298, 0.178802) UV(0.629149, 0.55469) +V 36: Pos(-0.827523, 2.948275, 1.874463) Norm(-0.519823, 0.849076, 0.09409) UV(0.627392, 0.561466) +V 37: Pos(-0.778079, 3.010426, 1.373197) Norm(-0.510356, 0.859422, 0.030499) UV(0.768601, 0.682547) +V 38: Pos(-0.862337, 2.923812, 1.373281) Norm(-0.801966, 0.597256, 0.011681) UV(0.76761, 0.689638) +V 39: Pos(-0.66433, 3.046302, 1.373161) Norm(-0.145373, 0.987924, 0.053596) UV(0.658769, 0.557851) +V 40: Pos(-0.778079, 3.010426, 1.373197) Norm(-0.510356, 0.859422, 0.030499) UV(0.657172, 0.564727) +V 41: Pos(-1.418757, 2.235414, 3.499286) Norm(-0.352609, 0.934181, 0.054513) UV(0.635247, 0.723234) +V 42: Pos(-0.948679, 2.79932, 2.373965) Norm(-0.538801, 0.830191, 0.143095) UV(0.7076, 0.690031) +V 43: Pos(-1.422373, 2.220263, 3.747011) Norm(-0.155374, 0.982934, 0.098484) UV(0.50377, 0.574456) +V 44: Pos(-0.835674, 2.836185, 2.373965) Norm(-0.152155, 0.944202, 0.292116) UV(0.597732, 0.555898) +V 45: Pos(-1.328419, 2.243359, 3.80272) Norm(-0.218994, 0.953916, 0.205149) UV(0.502231, 0.568012) +V 46: Pos(-0.48915, 2.836185, 2.373965) Norm(0.001711, 0.941552, 0.336865) UV(0.601581, 0.535746) +V 47: Pos(-1.205699, 2.339613, 2.373965) Norm(-0.538381, 0.842658, -0.008517) UV(0.703326, 0.721198) +V 48: Pos(-1.491366, 2.3201, 2.584705) Norm(-0.691745, 0.714, 0.10813) UV(0.883008, 0.745642) +V 49: Pos(-1.418757, 2.235414, 3.499286) Norm(-0.352609, 0.934181, 0.054513) UV(0.890097, 0.69153) +V 50: Pos(-0.367602, 2.98476, 1.874452) Norm(0.0, 0.978932, 0.204186) UV(0.633225, 0.534669) +V 51: Pos(-1.138994, 2.388921, 1.874625) Norm(-0.537124, 0.842968, 0.030059) UV(0.733284, 0.720879) +V 52: Pos(-0.317255, 3.046302, 1.373161) Norm(0.0, 0.998135, 0.06104) UV(0.663043, 0.537844) +V 53: Pos(-1.111364, 2.442713, 1.373752) Norm(-0.521551, 0.850477, 0.068361) UV(0.763129, 0.721405) +V 54: Pos(0.0, 0.924291, 1.454266) Norm(0.0, -0.924014, -0.382359) UV(0.098813, 0.641761) +V 55: Pos(-1.863751, 1.630625, 2.329785) Norm(-0.71929, 0.669459, 0.1856) UV(0.412161, 0.757265) +V 56: Pos(-1.991606, 1.164531, 0.630966) Norm(-0.722163, -0.689584, 0.054351) UV(0.311252, 0.729658) +V 57: Pos(-1.863753, 1.164531, 2.329785) Norm(-0.653945, -0.690529, 0.309072) UV(0.412161, 0.729658) +V 58: Pos(-1.491366, 0.924291, 0.703231) Norm(-0.577329, -0.577365, 0.577357) UV(0.801316, 0.025161) +V 59: Pos(-1.491366, 1.164531, 0.630966) Norm(-0.707089, -0.707124, 0.0) UV(0.787086, 0.02088) +V 60: Pos(-1.491366, 0.924291, 0.630966) Norm(-0.707107, -0.707107, 0.0) UV(0.801316, 0.02088) +V 61: Pos(-1.30267, 0.580467, 2.875029) Norm(-0.534228, -0.778409, -0.329668) UV(0.159031, 0.89736) +V 62: Pos(-1.491366, 1.328909, 3.882872) Norm(-0.523, -0.661038, 0.538052) UV(0.099277, 0.851718) +V 63: Pos(-1.512495, 1.318377, 2.580171) Norm(-0.484354, -0.863849, 0.138437) UV(0.17645, 0.851902) +V 64: Pos(0.0, 2.755199, -6.804733) Norm(0.0, 0.985345, 0.17057) UV(0.240801, 0.905242) +V 65: Pos(-0.455867, 3.095955, -7.759471) Norm(-0.121131, 0.975112, 0.185698) UV(0.300846, 0.932244) +V 66: Pos(-0.782711, 2.755199, -6.804733) Norm(-0.44254, 0.893849, 0.07206) UV(0.240801, 0.951603) +V 67: Pos(-0.36641, 3.046302, -0.072927) Norm(0.044926, 0.987298, -0.152397) UV(0.873684, 0.215873) +V 68: Pos(-0.782711, 2.755199, -2.047329) Norm(-0.416407, 0.908486, -0.035471) UV(0.857991, 0.335605) +V 69: Pos(-0.503329, 3.046302, -0.072927) Norm(-0.373152, 0.926756, -0.043366) UV(0.865597, 0.216483) +V 70: Pos(0.0, 0.924291, -0.67675) Norm(0.0, -0.951402, -0.307953) UV(0.098014, 0.515539) +V 71: Pos(-0.648541, 0.484647, -6.014415) Norm(-0.622891, -0.711776, 0.324626) UV(0.277512, 0.810893) +V 72: Pos(0.0, 0.484647, -8.09058) Norm(0.0, -0.971193, -0.238294) UV(0.154536, 0.772479) +V 73: Pos(0.0, 0.484647, -6.014415) Norm(0.0, -0.909444, 0.415827) UV(0.277512, 0.772479) +V 74: Pos(-0.648541, 0.484647, -6.014415) Norm(-0.622891, -0.711776, 0.324626) UV(0.807281, 0.110817) +V 75: Pos(0.0, 0.924291, -5.634158) Norm(0.0, -0.909439, 0.415838) UV(0.845695, 0.145247) +V 76: Pos(-0.65104, 0.924291, -5.634158) Norm(-0.297502, -0.868764, 0.395907) UV(0.807133, 0.145247) +V 77: Pos(-0.65104, 1.199254, -1.057006) Norm(0.0, -0.951572, -0.307425) UV(0.553534, 0.464133) +V 78: Pos(0.0, 0.924291, -0.67675) Norm(0.0, -0.951402, -0.307953) UV(0.525739, 0.502695) +V 79: Pos(-0.648541, 0.924291, -0.67675) Norm(0.0, -0.951236, -0.308464) UV(0.525739, 0.464281) +V 80: Pos(-1.720205, 2.268628, 0.630966) Norm(-0.906815, 0.392586, 0.153503) UV(0.720568, 0.151836) +V 81: Pos(-1.305889, 2.389127, 1.876623) Norm(-0.28316, 0.958653, 0.028382) UV(0.645573, 0.13009) +V 82: Pos(-1.461987, 2.527008, 0.630966) Norm(-0.388916, 0.909195, 0.14869) UV(0.72038, 0.1302) +V 83: Pos(-0.880005, 2.649881, 0.630966) Norm(-0.40394, -0.027699, -0.914366) UV(0.901253, 0.225485) +V 84: Pos(-0.730828, 2.527008, -3.148756) Norm(-0.25406, -0.725506, -0.639606) UV(0.912878, 0.001614) +V 85: Pos(-0.726025, 2.527008, 0.630966) Norm(-0.202674, -0.579391, -0.789449) UV(0.912921, 0.225495) +V 86: Pos(-0.782711, 2.755199, -2.047329) Norm(-0.416407, 0.908486, -0.035471) UV(0.571395, 0.175122) +V 87: Pos(-0.884244, 2.649343, -3.148756) Norm(-0.81818, -0.054595, -0.572365) UV(0.506148, 0.166491) +V 88: Pos(-0.880005, 2.649881, 0.630966) Norm(-0.40394, -0.027699, -0.914366) UV(0.730028, 0.166491) +V 89: Pos(-0.648736, 2.527008, 0.630966) Norm(-0.576891, -0.578901, -0.576256) UV(0.471542, 0.207471) +V 90: Pos(-0.730828, 2.527008, -3.148756) Norm(-0.25406, -0.725506, -0.639606) UV(0.695428, 0.202893) +V 91: Pos(-0.653539, 2.527008, -3.148756) Norm(-0.707485, -0.003256, -0.706721) UV(0.695422, 0.207471) +V 92: Pos(-0.881851, 2.651839, -7.759471) Norm(-0.405621, -0.025127, 0.913696) UV(0.08363, 0.729659) +V 93: Pos(-0.782711, 2.755199, -6.804733) Norm(-0.44254, 0.893849, 0.07206) UV(0.140173, 0.738194) +V 94: Pos(-0.455867, 3.095955, -7.759471) Norm(-0.121131, 0.975112, 0.185698) UV(0.083597, 0.766109) +V 95: Pos(0.0, 3.046302, 0.630966) Norm(0.0, 1.0, 0.0) UV(0.22905, 0.930947) +V 96: Pos(-0.503329, 3.046302, -0.072927) Norm(-0.373152, 0.926756, -0.043366) UV(0.199237, 0.97264) +V 97: Pos(-0.503244, 3.046302, 0.630966) Norm(-0.191006, 0.97212, -0.136011) UV(0.199242, 0.930947) +V 98: Pos(-1.305889, 2.389127, 1.876623) Norm(-0.28316, 0.958653, 0.028382) UV(0.713335, 0.554106) +V 99: Pos(-1.569701, 2.13116, 1.880577) Norm(-0.955121, 0.294294, 0.033685) UV(0.724642, 0.572811) +V 100: Pos(-1.543156, 2.364377, 2.1357) Norm(-0.707555, 0.706433, -0.01785) UV(0.704108, 0.572815) +V 101: Pos(-1.305889, 2.389127, 1.876623) Norm(-0.28316, 0.958653, 0.028382) UV(0.891816, 0.78829) +V 102: Pos(-1.111364, 2.442713, 1.373752) Norm(-0.521551, 0.850477, 0.068361) UV(0.901783, 0.818797) +V 103: Pos(-1.461987, 2.527008, 0.630966) Norm(-0.388916, 0.909195, 0.14869) UV(0.878766, 0.86195) +V 104: Pos(-1.569701, 2.13116, 1.880577) Norm(-0.955121, 0.294294, 0.033685) UV(0.043568, 0.807776) +V 105: Pos(-1.720205, 2.268628, 0.630966) Norm(-0.906815, 0.392586, 0.153503) UV(0.11812, 0.799635) +V 106: Pos(-1.720205, 1.630625, 0.630966) Norm(-0.675846, 0.732594, 0.080861) UV(0.11812, 0.837425) +V 107: Pos(-1.491366, 1.164531, 1.880578) Norm(-0.285497, -0.932493, -0.221241) UV(0.646019, 0.016596) +V 108: Pos(-1.420916, 1.164531, 0.703231) Norm(0.301513, -0.301518, 0.904531) UV(0.641846, 0.086333) +V 109: Pos(-1.420916, 1.164531, 1.880578) Norm(0.301509, -0.301516, -0.904533) UV(0.641846, 0.016596) +V 110: Pos(-1.491366, 2.3201, 2.584705) Norm(-0.691745, 0.714, 0.10813) UV(0.854848, 0.866838) +V 111: Pos(-1.491366, 1.630625, 3.882841) Norm(-0.577308, 0.577394, 0.577348) UV(0.777956, 0.907677) +V 112: Pos(-1.491366, 2.2121, 3.8828) Norm(-0.842322, 0.538968, 0.002755) UV(0.777959, 0.873235) +V 113: Pos(-1.491366, 0.924291, 1.880578) Norm(-0.649499, -0.565127, -0.508706) UV(0.614951, 0.629246) +V 114: Pos(-1.376387, 1.164531, 2.329785) Norm(-0.763276, -0.627318, 0.154538) UV(0.60032, 0.6565) +V 115: Pos(-1.491366, 1.164531, 1.880578) Norm(-0.285497, -0.932493, -0.221241) UV(0.600722, 0.629038) +V 116: Pos(-1.491366, 1.630625, 2.584705) Norm(-0.718818, 0.693999, 0.040815) UV(0.001605, 0.837425) +V 117: Pos(-1.491366, 2.3201, 2.584705) Norm(-0.691745, 0.714, 0.10813) UV(0.001604, 0.796586) +V 118: Pos(-1.543156, 2.364377, 2.1357) Norm(-0.707555, 0.706433, -0.01785) UV(0.028375, 0.793962) +V 119: Pos(-1.111483, 0.924291, 1.880578) Norm(-0.297044, -0.904461, -0.306129) UV(0.033139, 0.667428) +V 120: Pos(-0.760641, 0.924291, 2.584705) Norm(-0.297042, -0.834972, -0.463237) UV(0.054184, 0.709003) +V 121: Pos(-1.720205, 1.630625, 0.630966) Norm(-0.675846, 0.732594, 0.080861) UV(0.369037, 0.884448) +V 122: Pos(-1.111364, 2.527008, 0.630966) Norm(-0.389148, 0.636244, -0.666151) UV(0.009766, 0.960954) +V 123: Pos(-0.880005, 2.649881, 0.630966) Norm(-0.40394, -0.027699, -0.914366) UV(0.020062, 0.972563) +V 124: Pos(-0.726025, 2.527008, 0.630966) Norm(-0.202674, -0.579391, -0.789449) UV(0.015132, 0.983139) +V 125: Pos(-0.503244, 3.046302, 0.630966) Norm(-0.191006, 0.97212, -0.136011) UV(0.730056, 0.198885) +V 126: Pos(-0.503329, 3.046302, -0.072927) Norm(-0.373152, 0.926756, -0.043366) UV(0.688363, 0.198918) +V 127: Pos(-0.869927, 2.928302, 0.630966) Norm(-0.593543, 0.452904, -0.66527) UV(0.036232, 0.969267) +V 128: Pos(-0.664419, 3.046302, 0.630966) Norm(-0.109758, 0.732503, -0.671857) UV(0.045887, 0.979455) +V 129: Pos(-0.503244, 3.046302, 0.630966) Norm(-0.191006, 0.97212, -0.136011) UV(0.048131, 0.988734) +V 130: Pos(-1.310804, 0.913759, 2.577662) Norm(-0.581639, -0.729937, -0.359009) UV(0.177743, 0.87865) +V 131: Pos(-0.649767, 0.992952, -8.090581) Norm(-0.896295, -0.321955, -0.304959) UV(0.517674, 0.609248) +V 132: Pos(-0.649097, 0.992709, -9.064156) Norm(-0.43085, -0.887051, 0.165859) UV(0.461301, 0.597105) +V 133: Pos(-0.648232, 0.484648, -8.09058) Norm(-0.655956, -0.733123, -0.179591) UV(0.524007, 0.579814) +V 134: Pos(-0.909059, 2.983731, -7.759471) Norm(-0.585337, 0.493081, 0.643623) UV(0.487749, 0.549567) +V 135: Pos(-1.111364, 2.708697, -7.759471) Norm(-0.486614, 0.500907, 0.715751) UV(0.467698, 0.546938) +V 136: Pos(-0.881851, 2.651839, -7.759471) Norm(-0.405621, -0.025127, 0.913696) UV(0.474678, 0.534796) +V 137: Pos(-1.482806, 2.450317, -9.439158) Norm(-0.683897, 0.727146, -0.059533) UV(0.407765, 0.709406) +V 138: Pos(-1.777471, 1.34622, -7.759471) Norm(-0.735964, -0.664596, -0.129109) UV(0.508775, 0.644008) +V 139: Pos(-1.777471, 2.450317, -7.759471) Norm(-0.735981, 0.664577, -0.129112) UV(0.508775, 0.709406) +V 140: Pos(-1.245159, 2.450317, -9.439158) Norm(-0.158055, 0.978271, -0.134182) UV(0.373637, 0.791929) +V 141: Pos(-1.777471, 2.450317, -7.759471) Norm(-0.735981, 0.664577, -0.129112) UV(0.476197, 0.772585) +V 142: Pos(-1.491366, 2.450317, -7.759471) Norm(-0.27152, 0.954077, 0.126549) UV(0.47416, 0.789409) +V 143: Pos(-1.230799, 1.170611, -8.13096) Norm(-0.620284, -0.694148, -0.365248) UV(0.944338, 0.423915) +V 144: Pos(-1.491366, 1.34622, -7.759471) Norm(-0.314836, -0.948082, -0.044935) UV(0.960522, 0.400069) +V 145: Pos(-1.245159, 1.34622, -9.439158) Norm(-0.18814, -0.970626, -0.149961) UV(0.959502, 0.500618) +V 146: Pos(-1.230799, 1.170611, -8.13096) Norm(-0.620284, -0.694148, -0.365248) UV(0.96499, 0.255049) +V 147: Pos(-1.277231, 0.992955, -7.759471) Norm(-0.729924, -0.677412, -0.091232) UV(0.954467, 0.232874) +V 148: Pos(-1.277231, 1.170611, -7.759471) Norm(-0.894623, -0.430898, -0.118224) UV(0.96499, 0.232874) +V 149: Pos(-0.64966, 0.992952, -7.759472) Norm(-0.891341, -0.453333, -0.000165) UV(0.536848, 0.613374) +V 150: Pos(-0.65104, 0.924291, -5.634158) Norm(-0.297502, -0.868764, 0.395907) UV(0.660773, 0.635877) +V 151: Pos(-0.648541, 0.484647, -6.014415) Norm(-0.622891, -0.711776, 0.324626) UV(0.644231, 0.605681) +V 152: Pos(-1.230799, 0.992955, -8.13096) Norm(-0.517487, -0.580287, -0.628868) UV(0.995042, 0.285085) +V 153: Pos(-0.64966, 0.992952, -7.759472) Norm(-0.891341, -0.453333, -0.000165) UV(0.973038, 0.319507) +V 154: Pos(-1.277231, 0.992955, -7.759471) Norm(-0.729924, -0.677412, -0.091232) UV(0.973038, 0.282335) +V 155: Pos(0.0, 0.992955, -9.064084) Norm(0.0, -0.971212, -0.238216) UV(0.001607, 0.582719) +V 156: Pos(-0.648232, 0.484648, -8.09058) Norm(-0.655956, -0.733123, -0.179591) UV(0.040008, 0.517672) +V 157: Pos(-0.649097, 0.992709, -9.064156) Norm(-0.43085, -0.887051, 0.165859) UV(0.040054, 0.582719) +V 158: Pos(-0.929518, 2.708697, -9.064084) Norm(-0.466815, 0.816394, -0.339978) UV(0.080817, 0.77356) +V 159: Pos(-0.909059, 2.983731, -7.759471) Norm(-0.585337, 0.493081, 0.643623) UV(0.002145, 0.766499) +V 160: Pos(-0.871251, 2.802734, -9.064084) Norm(-0.529763, 0.438109, -0.726231) UV(0.08019, 0.767037) +V 161: Pos(-1.491366, 2.450317, -7.759471) Norm(-0.27152, 0.954077, 0.126549) UV(0.901262, 0.230926) +V 162: Pos(-0.929518, 2.708697, -9.064084) Norm(-0.466815, 0.816394, -0.339978) UV(0.928302, 0.312055) +V 163: Pos(-1.245159, 2.450317, -9.439158) Norm(-0.158055, 0.978271, -0.134182) UV(0.901844, 0.331478) +V 164: Pos(-0.796828, 2.886173, -9.064084) Norm(-0.385683, 0.609706, -0.692464) UV(0.079683, 0.760434) +V 165: Pos(-0.703551, 3.10173, -7.759471) Norm(-0.121706, 0.77541, 0.619618) UV(0.001609, 0.752099) +V 166: Pos(-0.70055, 2.920734, -9.064084) Norm(-0.111005, 0.689743, -0.715494) UV(0.079591, 0.754376) +V 167: Pos(-0.542386, 3.10173, -7.759471) Norm(0.025591, 0.760812, 0.648468) UV(0.001909, 0.742558) +V 168: Pos(-0.566681, 2.920734, -9.064084) Norm(0.000915, 0.657509, -0.753446) UV(0.07984, 0.74645) +V 169: Pos(-0.81946, 3.067169, -7.759471) Norm(-0.416096, 0.683983, 0.599193) UV(0.001666, 0.759263) +V 170: Pos(-0.455867, 3.095955, -7.759471) Norm(-0.121131, 0.975112, 0.185698) UV(0.002118, 0.737426) +V 171: Pos(0.0, 0.924291, 1.454266) Norm(0.0, -0.924014, -0.382359) UV(0.98761, 0.486936) +V 172: Pos(-0.565739, 0.633144, 1.745819) Norm(-0.634265, -0.707295, -0.312156) UV(0.963205, 0.453426) +V 173: Pos(-0.565739, 0.924291, 1.454266) Norm(-0.131205, -0.973829, -0.185588) UV(0.98761, 0.453426) +V 174: Pos(-0.760543, 0.580467, 2.875029) Norm(-0.115858, -0.940021, -0.320838) UV(0.876404, 0.402299) +V 175: Pos(-0.565739, 0.924291, 2.31596) Norm(-0.705941, -0.697131, -0.125117) UV(0.860133, 0.439445) +V 176: Pos(-0.565637, 0.59299, 2.606576) Norm(-0.430304, -0.869704, -0.241771) UV(0.860133, 0.413342) +V 177: Pos(-0.565637, 0.59299, 2.606576) Norm(-0.430304, -0.869704, -0.241771) UV(0.107384, 0.781045) +V 178: Pos(-0.565739, 0.924291, 1.454266) Norm(-0.131205, -0.973829, -0.185588) UV(0.03829, 0.797467) +V 179: Pos(-0.565739, 0.633144, 1.745819) Norm(-0.634265, -0.707295, -0.312156) UV(0.056344, 0.781045) +V 180: Pos(-0.565739, 0.924291, 2.31596) Norm(-0.705941, -0.697131, -0.125117) UV(0.065627, 0.693012) +V 181: Pos(-0.565637, 0.59299, 2.606576) Norm(-0.430304, -0.869704, -0.241771) UV(0.14458, 0.687684) +V 182: Pos(0.0, 0.550755, 3.528204) Norm(0.0, -0.998945, -0.045917) UV(0.089933, 0.721188) +V 183: Pos(-0.565265, 0.550755, 3.528204) Norm(0.000614, -0.998941, -0.046011) UV(0.089933, 0.687706) +V 184: Pos(-0.760543, 0.580467, 2.875029) Norm(-0.115858, -0.940021, -0.320838) UV(0.128662, 0.67614) +V 185: Pos(0.0, 0.633144, 1.745819) Norm(0.0, -0.914883, -0.403719) UV(0.19562, 0.721188) +V 186: Pos(-0.565739, 0.633144, 1.745819) Norm(-0.634265, -0.707295, -0.312156) UV(0.19562, 0.687678) +V 187: Pos(0.0, 2.708697, -9.064084) Norm(0.0, 0.580662, -0.814144) UV(0.369332, 0.185403) +V 188: Pos(-0.566681, 2.920734, -9.064084) Norm(0.000915, 0.657509, -0.753446) UV(0.381892, 0.151837) +V 189: Pos(0.0, 2.920734, -9.064084) Norm(0.0, 0.658364, -0.7527) UV(0.381892, 0.185403) +V 190: Pos(-1.054109, 1.170611, -9.439158) Norm(-0.497307, -0.210601, -0.841625) UV(0.394034, 0.706445) +V 191: Pos(-1.245159, 1.34622, -9.439158) Norm(-0.18814, -0.970626, -0.149961) UV(0.383633, 0.717761) +V 192: Pos(-1.054109, 1.34622, -9.439158) Norm(0.301522, -0.301497, -0.904535) UV(0.383633, 0.706445) +V 193: Pos(0.0, 0.992955, -9.439158) Norm(0.0, -0.707052, -0.707162) UV(0.971834, 0.816473) +V 194: Pos(0.0, 0.992955, -9.064084) Norm(0.0, -0.971212, -0.238216) UV(0.949617, 0.816473) +V 195: Pos(-0.649097, 0.992709, -9.064156) Norm(-0.43085, -0.887051, 0.165859) UV(0.949621, 0.778026) +V 196: Pos(-1.087338, 2.579507, -9.439158) Norm(-0.275035, 0.658174, -0.70083) UV(0.001611, 0.597658) +V 197: Pos(0.0, 2.708697, -9.064084) Norm(0.0, 0.580662, -0.814144) UV(0.025109, 0.662063) +V 198: Pos(0.0, 2.579507, -9.439158) Norm(0.0, 0.580652, -0.814152) UV(0.001611, 0.662063) +V 199: Pos(0.0, 0.992955, -9.439158) Norm(0.0, -0.707052, -0.707162) UV(0.404557, 0.644008) +V 200: Pos(-1.054109, 2.450317, -9.439158) Norm(0.301518, 0.3015, -0.904536) UV(0.318235, 0.706445) +V 201: Pos(-1.087338, 2.579507, -9.439158) Norm(-0.275035, 0.658174, -0.70083) UV(0.310583, 0.708413) +V 202: Pos(0.0, 2.579507, -9.439158) Norm(0.0, 0.580652, -0.814152) UV(0.310583, 0.644008) +V 203: Pos(-1.054109, 0.992955, -9.439158) Norm(-0.53391, -0.584629, -0.610859) UV(0.404557, 0.706445) +V 204: Pos(-1.054109, 0.992955, -9.439158) Norm(-0.53391, -0.584629, -0.610859) UV(0.971834, 0.754036) +V 205: Pos(-1.10049, 0.992955, -9.095757) Norm(-0.634162, -0.572804, 0.519359) UV(0.951493, 0.751289) +V 206: Pos(-0.929518, 2.708697, -9.064084) Norm(-0.466815, 0.816394, -0.339978) UV(0.369332, 0.130345) +V 207: Pos(0.0, 3.095955, -7.759471) Norm(0.0, 0.994528, 0.104469) UV(0.002971, 0.710437) +V 208: Pos(0.0, 2.920734, -9.064084) Norm(0.0, 0.658364, -0.7527) UV(0.080901, 0.712901) +V 209: Pos(0.0, 3.046302, -0.072927) Norm(0.0, 0.977187, -0.212379) UV(0.22905, 0.97264) +V 210: Pos(-0.36641, 3.046302, -0.072927) Norm(0.044926, 0.987298, -0.152397) UV(0.207347, 0.97264) +V 211: Pos(0.0, 3.046302, 1.373161) Norm(0.0, 0.998135, 0.061041) UV(0.66694, 0.519463) +V 212: Pos(-0.766956, 2.351064, 3.526832) Norm(0.00518, 0.921815, 0.387595) UV(0.525653, 0.538305) +V 213: Pos(0.0, 2.755199, -6.804733) Norm(0.0, 0.985345, 0.17057) UV(0.122527, 0.797431) +V 214: Pos(-0.36641, 2.755199, -6.634012) Norm(0.044646, 0.993482, 0.10488) UV(0.132639, 0.775728) +V 215: Pos(0.0, 2.755199, -6.634012) Norm(0.0, 0.988323, 0.152374) UV(0.132639, 0.797431) +V 216: Pos(0.0, 2.527008, -3.559723) Norm(0.0, 1.0, 0.0) UV(0.285794, 0.575649) +V 217: Pos(-0.600842, 2.527008, -5.911546) Norm(0.695488, 0.691389, 0.195645) UV(0.146491, 0.54006) +V 218: Pos(-0.600842, 2.527008, -3.97069) Norm(0.30151, 0.904535, 0.30151) UV(0.261452, 0.54006) +V 219: Pos(0.0, 2.755199, -6.634012) Norm(0.0, 0.988323, 0.152374) UV(0.101614, 0.575649) +V 220: Pos(0.0, 2.527008, -5.911546) Norm(0.0, 0.988323, 0.152371) UV(0.146491, 0.575649) +V 221: Pos(-0.507578, 2.527008, -1.211138) Norm(0.655304, 0.721835, -0.222556) UV(0.424905, 0.545585) +V 222: Pos(0.0, 3.046302, -0.072927) Norm(0.0, 0.977187, -0.212379) UV(0.499009, 0.575649) +V 223: Pos(0.0, 2.527008, -1.211138) Norm(0.0, 0.977187, -0.212381) UV(0.424905, 0.575649) +V 224: Pos(-0.600842, 2.527008, -2.046379) Norm(0.72039, 0.692327, -0.041491) UV(0.375433, 0.54006) +V 225: Pos(-0.507578, 2.527008, -1.211138) Norm(0.655304, 0.721835, -0.222556) UV(0.310054, 0.878209) +V 226: Pos(-0.600842, 2.755199, -2.047329) Norm(0.71012, 0.697523, -0.095869) UV(0.261699, 0.860095) +V 227: Pos(-0.36641, 3.046302, -0.072927) Norm(0.044926, 0.987298, -0.152397) UV(0.380563, 0.853925) +V 228: Pos(-1.482806, 1.34622, -10.181827) Norm(-0.630262, -0.717281, -0.297116) UV(0.442575, 0.180491) +V 229: Pos(-1.482806, 2.174068, -10.458076) Norm(-0.630261, 0.297109, -0.717285) UV(0.458938, 0.131456) +V 230: Pos(-1.482806, 1.622469, -10.458076) Norm(-0.630271, -0.297103, -0.717279) UV(0.458938, 0.164128) +V 231: Pos(-1.054109, 1.34622, -10.995328) Norm(0.630263, -0.717286, -0.297101) UV(0.291008, 0.644007) +V 232: Pos(-1.054109, 2.174068, -11.271577) Norm(0.630279, 0.297103, -0.717271) UV(0.307371, 0.693042) +V 233: Pos(-1.054109, 2.450317, -10.995328) Norm(0.630276, 0.717274, -0.297104) UV(0.291008, 0.709405) +V 234: Pos(-1.119309, 2.456002, 0.630966) Norm(0.0, 0.0, -1.0) UV(0.005568, 0.961486) +V 235: Pos(-0.648736, 2.527008, 0.630966) Norm(-0.576891, -0.578901, -0.576256) UV(0.016208, 0.987589) +V 236: Pos(-0.648724, 2.446799, 0.630966) Norm(-0.711833, -0.00304, -0.702342) UV(0.011591, 0.988706) +V 237: Pos(-1.054109, 2.174068, -11.271577) Norm(0.630279, 0.297103, -0.717271) UV(0.839462, 0.500121) +V 238: Pos(-1.211802, 2.450317, -10.995328) Norm(-0.630261, 0.717289, -0.2971) UV(0.830122, 0.476981) +V 239: Pos(-1.054109, 2.450317, -10.995328) Norm(0.630276, 0.717274, -0.297104) UV(0.839462, 0.476981) +V 240: Pos(-1.360914, 2.450317, -9.747389) Norm(0.301515, 0.904531, -0.301516) UV(0.356337, 0.782928) +V 241: Pos(-1.482806, 2.450317, -10.181827) Norm(-0.630292, 0.717262, -0.297099) UV(0.331659, 0.772667) +V 242: Pos(-1.482806, 2.450317, -9.439158) Norm(-0.683897, 0.727146, -0.059533) UV(0.375329, 0.777955) +V 243: Pos(-1.360914, 2.174068, -10.458076) Norm(0.630277, 0.297101, -0.717274) UV(0.908472, 0.423036) +V 244: Pos(-1.482806, 2.450317, -10.181827) Norm(-0.630292, 0.717262, -0.297099) UV(0.901252, 0.399895) +V 245: Pos(-1.360914, 2.450317, -10.181827) Norm(0.630257, 0.717288, -0.29711) UV(0.908472, 0.399896) +V 246: Pos(-1.211802, 1.622469, -11.271577) Norm(-0.630279, -0.297103, -0.717271) UV(0.041804, 0.034282) +V 247: Pos(-1.054109, 2.174068, -11.271577) Norm(0.630279, 0.297103, -0.717271) UV(0.051145, 0.00161) +V 248: Pos(-1.054109, 1.622469, -11.271577) Norm(0.630255, -0.297111, -0.717289) UV(0.051145, 0.034282) +V 249: Pos(-1.482806, 1.622469, -10.458076) Norm(-0.630271, -0.297103, -0.717279) UV(0.848913, 0.143483) +V 250: Pos(-1.360914, 2.174068, -10.458076) Norm(0.630277, 0.297101, -0.717274) UV(0.856133, 0.110811) +V 251: Pos(-1.360914, 1.622469, -10.458076) Norm(0.630255, -0.297111, -0.717289) UV(0.856133, 0.143483) +V 252: Pos(-1.211802, 1.622469, -11.271577) Norm(-0.630279, -0.297103, -0.717271) UV(0.698637, 0.212236) +V 253: Pos(-1.054109, 1.34622, -10.995328) Norm(0.630263, -0.717286, -0.297101) UV(0.721777, 0.202896) +V 254: Pos(-1.211802, 1.34622, -10.995328) Norm(-0.630281, -0.71727, -0.297101) UV(0.721777, 0.212236) +V 255: Pos(-1.360914, 1.34622, -10.181827) Norm(0.630263, -0.717286, -0.297101) UV(0.5015, 0.010173) +V 256: Pos(-1.482806, 1.622469, -10.458076) Norm(-0.630271, -0.297103, -0.717279) UV(0.478359, 0.017393) +V 257: Pos(-1.360914, 1.622469, -10.458076) Norm(0.630255, -0.297111, -0.717289) UV(0.47836, 0.010173) +V 258: Pos(-1.482806, 1.34622, -9.439158) Norm(-0.683901, -0.727142, -0.059533) UV(0.580703, 0.777954) +V 259: Pos(-1.491366, 1.34622, -7.759471) Norm(-0.314836, -0.948082, -0.044935) UV(0.481872, 0.789409) +V 260: Pos(-1.777471, 1.34622, -7.759471) Norm(-0.735964, -0.664596, -0.129109) UV(0.479836, 0.772585) +V 261: Pos(-1.245159, 2.450317, -9.439158) Norm(-0.158055, 0.978271, -0.134182) UV(0.318235, 0.717761) +V 262: Pos(-1.054109, 2.450317, -9.439158) Norm(0.301518, 0.3015, -0.904536) UV(0.372277, 0.803163) +V 263: Pos(-1.211802, 2.450317, -10.995328) Norm(-0.630261, 0.717289, -0.2971) UV(0.281893, 0.782812) +V 264: Pos(-1.211802, 2.450317, -9.747389) Norm(-0.301522, 0.904532, -0.301506) UV(0.355275, 0.791696) +V 265: Pos(-1.360914, 1.34622, -9.747389) Norm(0.301501, -0.904535, -0.301517) UV(0.599696, 0.782927) +V 266: Pos(-1.482806, 1.34622, -10.181827) Norm(-0.630262, -0.717281, -0.297116) UV(0.624374, 0.772667) +V 267: Pos(-1.360914, 1.34622, -10.181827) Norm(0.630263, -0.717286, -0.297101) UV(0.625242, 0.779835) +V 268: Pos(-1.054109, 1.34622, -9.439158) Norm(0.301522, -0.301497, -0.904535) UV(0.583755, 0.803163) +V 269: Pos(-1.211802, 1.34622, -10.995328) Norm(-0.630281, -0.71727, -0.297101) UV(0.674139, 0.782811) +V 270: Pos(-1.054109, 1.34622, -10.995328) Norm(0.630263, -0.717286, -0.297101) UV(0.675262, 0.792084) +V 271: Pos(-1.245159, 1.34622, -9.439158) Norm(-0.18814, -0.970626, -0.149961) UV(0.582395, 0.791928) +V 272: Pos(-1.211802, 1.34622, -9.747389) Norm(-0.301508, -0.904536, -0.301508) UV(0.600757, 0.791696) +V 273: Pos(-1.360914, 2.450317, -10.181827) Norm(0.630257, 0.717288, -0.29711) UV(0.438766, 0.902341) +V 274: Pos(-1.360914, 1.34622, -9.747389) Norm(0.301501, -0.904535, -0.301517) UV(0.373369, 0.928074) +V 275: Pos(-1.360914, 1.34622, -10.181827) Norm(0.630263, -0.717286, -0.297101) UV(0.373369, 0.902341) +V 276: Pos(-1.360914, 2.450317, -9.747389) Norm(0.301515, 0.904531, -0.301516) UV(0.986614, 0.194322) +V 277: Pos(-1.211802, 1.34622, -9.747389) Norm(-0.301508, -0.904536, -0.301508) UV(0.995446, 0.259719) +V 278: Pos(-1.360914, 1.34622, -9.747389) Norm(0.301501, -0.904535, -0.301517) UV(0.986614, 0.259719) +V 279: Pos(-1.211802, 2.450317, -9.747389) Norm(-0.301522, 0.904532, -0.301506) UV(0.742777, 0.67433) +V 280: Pos(-1.211802, 1.34622, -10.995328) Norm(-0.630281, -0.71727, -0.297101) UV(0.808175, 0.600412) +V 281: Pos(-1.211802, 1.34622, -9.747389) Norm(-0.301508, -0.904536, -0.301508) UV(0.808175, 0.67433) +V 282: Pos(-1.360914, 2.174068, -10.458076) Norm(0.630277, 0.297101, -0.717274) UV(0.422404, 0.885979) +V 283: Pos(-1.211802, 1.622469, -11.271577) Norm(-0.630279, -0.297103, -0.717271) UV(0.791812, 0.584049) +V 284: Pos(-1.211802, 2.450317, -10.995328) Norm(-0.630261, 0.717289, -0.2971) UV(0.742777, 0.600412) +V 285: Pos(-1.211802, 2.174068, -11.271577) Norm(-0.630255, 0.297111, -0.717289) UV(0.75914, 0.584049) +V 286: Pos(-1.482806, 1.34622, -9.439158) Norm(-0.683901, -0.727142, -0.059533) UV(0.398586, 0.180491) +V 287: Pos(-1.482806, 2.450317, -10.181827) Norm(-0.630292, 0.717262, -0.297099) UV(0.442575, 0.115093) +V 288: Pos(-1.054109, 1.34622, -9.439158) Norm(0.301522, -0.301497, -0.904535) UV(0.198833, 0.644007) +V 289: Pos(-1.054109, 2.450317, -9.439158) Norm(0.301518, 0.3015, -0.904536) UV(0.198833, 0.709405) +V 290: Pos(-1.10049, 1.170611, -9.095757) Norm(-0.676724, -0.710549, 0.192779) UV(0.944239, 0.481581) +V 291: Pos(-0.653539, 2.527008, -3.148756) Norm(-0.707485, -0.003256, -0.706721) UV(0.738301, 0.018737) +V 292: Pos(-0.884244, 2.649343, -3.148756) Norm(-0.81818, -0.054595, -0.572365) UV(0.751966, 0.025983) +V 293: Pos(-0.782711, 2.755199, -3.148756) Norm(-0.305114, 0.715427, -0.628546) UV(0.745952, 0.032253) +V 294: Pos(-0.600842, 2.755199, -3.97069) Norm(0.577356, 0.577362, 0.577333) UV(0.707683, 0.506957) +V 295: Pos(-0.653539, 2.527008, -3.97069) Norm(-0.707311, -0.002602, 0.706897) UV(0.694167, 0.510079) +V 296: Pos(-0.600842, 2.527008, -3.97069) Norm(0.30151, 0.904535, 0.30151) UV(0.694167, 0.506957) +V 297: Pos(-0.600842, 2.755199, -2.047329) Norm(0.71012, 0.697523, -0.095869) UV(0.868733, 0.334794) +V 298: Pos(-0.782711, 2.755199, -3.148756) Norm(-0.305114, 0.715427, -0.628546) UV(0.8629, 0.40066) +V 299: Pos(-0.884244, 2.649343, -3.97069) Norm(-0.819513, -0.051224, 0.570767) UV(0.308047, 0.729659) +V 300: Pos(-0.782711, 2.755199, -3.97069) Norm(-0.305115, 0.715432, 0.62854) UV(0.308039, 0.738347) +V 301: Pos(-0.782711, 2.755199, -3.148756) Norm(-0.305114, 0.715427, -0.628546) UV(0.506155, 0.175179) +V 302: Pos(-0.65104, 0.924291, -5.298873) Norm(0.0, -0.990543, 0.137204) UV(0.807044, 0.464133) +V 303: Pos(0.0, 1.199254, -4.325368) Norm(0.0, -0.990543, 0.137202) UV(0.747125, 0.502695) +V 304: Pos(-0.65104, 1.199254, -4.325368) Norm(0.0, -0.990543, 0.137204) UV(0.747125, 0.464133) +V 305: Pos(-0.730828, 2.527008, -3.97069) Norm(-0.256869, -0.72395, 0.640246) UV(0.694167, 0.514657) +V 306: Pos(-0.782711, 2.755199, -3.97069) Norm(-0.305115, 0.715432, 0.62854) UV(0.707683, 0.51773) +V 307: Pos(-0.884244, 2.649343, -3.97069) Norm(-0.819513, -0.051224, 0.570767) UV(0.701413, 0.523744) +V 308: Pos(-0.600842, 2.527008, -3.148756) Norm(0.301503, 0.904533, -0.301523) UV(0.310137, 0.54006) +V 309: Pos(-0.600842, 2.527008, -3.148756) Norm(0.301503, 0.904533, -0.301523) UV(0.195481, 0.867455) +V 310: Pos(-0.600842, 2.527008, -2.046379) Norm(0.72039, 0.692327, -0.041491) UV(0.260491, 0.873557) +V 311: Pos(-0.600842, 2.527008, -5.911546) Norm(0.695488, 0.691389, 0.195645) UV(0.94509, 0.191516) +V 312: Pos(-0.600842, 2.755199, -3.97069) Norm(0.577356, 0.577362, 0.577333) UV(0.93152, 0.076562) +V 313: Pos(-0.600842, 2.527008, -3.97069) Norm(0.30151, 0.904535, 0.30151) UV(0.945036, 0.076555) +V 314: Pos(-0.884244, 2.649343, -3.97069) Norm(-0.819513, -0.051224, 0.570767) UV(0.916137, 0.22602) +V 315: Pos(-0.730828, 2.527008, -7.759471) Norm(-0.323078, -0.910547, 0.257925) UV(0.927759, 0.001603) +V 316: Pos(-0.730828, 2.527008, -3.97069) Norm(-0.256869, -0.72395, 0.640246) UV(0.927759, 0.22602) +V 317: Pos(-0.65104, 0.924291, -5.634158) Norm(-0.297502, -0.868764, 0.395907) UV(0.826904, 0.464133) +V 318: Pos(0.0, 0.924291, -5.298873) Norm(0.0, -0.990543, 0.137206) UV(0.807044, 0.502695) +V 319: Pos(-0.653539, 2.527008, -3.97069) Norm(-0.707311, -0.002602, 0.706897) UV(0.243917, 0.205332) +V 320: Pos(-0.730828, 2.527008, -7.759471) Norm(-0.323078, -0.910547, 0.257925) UV(0.468334, 0.200754) +V 321: Pos(-0.65104, 2.527008, -7.759471) Norm(-0.706011, -0.708201, -0.000426) UV(0.468334, 0.20548) +V 322: Pos(-0.600842, 2.755199, -3.97069) Norm(0.577356, 0.577362, 0.577333) UV(0.290393, 0.761842) +V 323: Pos(-0.782711, 2.755199, -6.804733) Norm(-0.44254, 0.893849, 0.07206) UV(0.122527, 0.75107) +V 324: Pos(-0.782711, 2.755199, -3.97069) Norm(-0.305115, 0.715432, 0.62854) UV(0.290393, 0.751069) +V 325: Pos(-0.36641, 2.755199, -6.634012) Norm(0.044646, 0.993482, 0.10488) UV(0.931521, 0.23649) +V 326: Pos(-0.600842, 2.755199, -5.9038) Norm(0.662736, 0.741937, 0.101535) UV(0.931573, 0.191064) +V 327: Pos(-0.600842, 2.527008, -3.148756) Norm(0.301503, 0.904533, -0.301523) UV(0.735179, 0.018737) +V 328: Pos(-0.600842, 2.755199, -3.148756) Norm(0.57735, 0.57735, -0.57735) UV(0.735179, 0.032253) +V 329: Pos(-0.653539, 2.527008, -3.148756) Norm(-0.707485, -0.003256, -0.706721) UV(0.310137, 0.536939) +V 330: Pos(-0.653539, 2.527008, -3.97069) Norm(-0.707311, -0.002602, 0.706897) UV(0.261452, 0.536939) +V 331: Pos(-1.054109, 1.170611, -9.439158) Norm(-0.497307, -0.210601, -0.841625) UV(0.944204, 0.502106) +V 332: Pos(-1.054109, 1.170611, -9.439158) Norm(-0.497307, -0.210601, -0.841625) UV(0.690958, 0.506962) +V 333: Pos(-1.10049, 0.992955, -9.095757) Norm(-0.634162, -0.572804, 0.519359) UV(0.670433, 0.517485) +V 334: Pos(-1.10049, 1.170611, -9.095757) Norm(-0.676724, -0.710549, 0.192779) UV(0.670433, 0.506962) +V 335: Pos(-1.230799, 0.992955, -8.13096) Norm(-0.517487, -0.580287, -0.628868) UV(0.266767, 0.956643) +V 336: Pos(-1.230799, 1.170611, -8.13096) Norm(-0.620284, -0.694148, -0.365248) UV(0.266767, 0.967166) +V 337: Pos(-1.06854, 1.170611, -8.119707) Norm(0.366272, -0.316364, -0.875076) UV(0.257133, 0.967166) +V 338: Pos(-0.649767, 0.992952, -8.090581) Norm(-0.896295, -0.321955, -0.304959) UV(0.232268, 0.956643) +V 339: Pos(-1.10049, 0.992955, -9.095757) Norm(-0.634162, -0.572804, 0.519359) UV(0.907772, 0.963063) +V 340: Pos(-0.945714, 1.170611, -9.08693) Norm(0.23291, -0.281604, 0.930834) UV(0.91695, 0.973589) +V 341: Pos(-1.10049, 1.170611, -9.095757) Norm(-0.676724, -0.710549, 0.192779) UV(0.907768, 0.973586) +V 342: Pos(-0.649097, 0.992709, -9.064156) Norm(-0.43085, -0.887051, 0.165859) UV(0.934574, 0.963057) +V 343: Pos(-1.230799, 1.170611, -8.13096) Norm(-0.620284, -0.694148, -0.365248) UV(0.043256, 0.576078) +V 344: Pos(-0.945714, 1.170611, -9.08693) Norm(0.23291, -0.281604, 0.930834) UV(0.052875, 0.517778) +V 345: Pos(-1.06854, 1.170611, -8.119707) Norm(0.366272, -0.316364, -0.875076) UV(0.052875, 0.575529) +V 346: Pos(-0.650176, 1.450022, -9.064157) Norm(-0.596638, -0.581808, 0.552741) UV(0.934503, 0.990144) +V 347: Pos(-0.945714, 1.45027, -9.08693) Norm(0.514483, -0.58031, 0.631306) UV(0.916946, 0.990154) +V 348: Pos(-1.06854, 1.45027, -8.119707) Norm(0.632605, -0.574449, -0.519442) UV(0.270161, 0.946024) +V 349: Pos(-0.650176, 1.450022, -9.064157) Norm(-0.596638, -0.581808, 0.552741) UV(0.327691, 0.966853) +V 350: Pos(-0.650846, 1.450265, -8.090582) Norm(-0.557789, -0.574365, -0.599147) UV(0.270161, 0.970825) +V 351: Pos(-0.650846, 1.450265, -8.090582) Norm(-0.557789, -0.574365, -0.599147) UV(0.511977, 0.63573) +V 352: Pos(-0.650176, 1.450022, -9.064157) Norm(-0.596638, -0.581808, 0.552741) UV(0.455603, 0.623586) +V 353: Pos(-1.06854, 1.45027, -8.119707) Norm(0.632605, -0.574449, -0.519442) UV(0.257133, 0.983731) +V 354: Pos(-0.650846, 1.450265, -8.090582) Norm(-0.557789, -0.574365, -0.599147) UV(0.232332, 0.98373) +V 355: Pos(-1.06854, 1.170611, -8.119707) Norm(0.366272, -0.316364, -0.875076) UV(0.431809, 0.830304) +V 356: Pos(-0.945714, 1.45027, -9.08693) Norm(0.514483, -0.58031, 0.631306) UV(0.489559, 0.846869) +V 357: Pos(-1.06854, 1.45027, -8.119707) Norm(0.632605, -0.574449, -0.519442) UV(0.431809, 0.846869) +V 358: Pos(0.0, 3.046302, 0.630966) Norm(0.0, 1.0, 0.0) UV(0.70999, 0.528759) +V 359: Pos(-0.503244, 3.046302, 0.630966) Norm(-0.191006, 0.97212, -0.136011) UV(0.703654, 0.557962) +V 360: Pos(-0.869927, 2.928302, 0.630966) Norm(-0.593543, 0.452904, -0.66527) UV(0.811157, 0.695743) +V 361: Pos(-1.111364, 2.527008, 0.630966) Norm(-0.389148, 0.636244, -0.666151) UV(0.807324, 0.723179) +V 362: Pos(-0.664419, 3.046302, 0.630966) Norm(-0.109758, 0.732503, -0.671857) UV(0.701594, 0.567323) +V 363: Pos(-0.780328, 3.011741, 0.630966) Norm(-0.389407, 0.655175, -0.647386) UV(0.700048, 0.574314) +V 364: Pos(-0.780328, 3.011741, 0.630966) Norm(-0.389407, 0.655175, -0.647386) UV(0.81214, 0.688566) +V 365: Pos(-1.420916, 1.400926, 1.880578) Norm(0.577358, -0.577334, -0.577358) UV(0.560529, 0.945934) +V 366: Pos(-1.111483, 1.400926, 0.703231) Norm(-0.577352, -0.577327, 0.577372) UV(0.630265, 0.964262) +V 367: Pos(-1.111483, 1.400926, 1.880578) Norm(-0.577324, -0.577353, -0.577373) UV(0.560529, 0.964262) +V 368: Pos(-1.420916, 1.164531, 1.880578) Norm(0.301509, -0.301516, -0.904533) UV(0.978619, 0.905251) +V 369: Pos(-1.420916, 1.400926, 0.703231) Norm(0.577341, -0.577355, 0.577355) UV(0.964617, 0.974988) +V 370: Pos(-1.420916, 1.400926, 1.880578) Norm(0.577358, -0.577334, -0.577358) UV(0.964617, 0.905251) +V 371: Pos(-1.111483, 0.924291, 1.880578) Norm(-0.297044, -0.904461, -0.306129) UV(0.293604, 0.779995) +V 372: Pos(-1.420916, 1.164531, 1.880578) Norm(0.301509, -0.301516, -0.904533) UV(0.307834, 0.761667) +V 373: Pos(-1.111483, 1.400926, 1.880578) Norm(-0.577324, -0.577353, -0.577373) UV(0.321836, 0.779995) +V 374: Pos(-1.111483, 0.924291, 0.703231) Norm(-0.301496, -0.904538, 0.301514) UV(0.937793, 0.991299) +V 375: Pos(-1.491366, 1.164531, 0.703231) Norm(-0.30151, -0.904535, 0.301511) UV(0.960294, 0.977069) +V 376: Pos(-1.491366, 0.924291, 0.703231) Norm(-0.577329, -0.577365, 0.577357) UV(0.960294, 0.991299) +V 377: Pos(-1.111483, 1.400926, 0.703231) Norm(-0.577352, -0.577327, 0.577372) UV(0.937793, 0.963067) +V 378: Pos(-1.420916, 1.164531, 0.703231) Norm(0.301513, -0.301518, 0.904531) UV(0.956121, 0.977069) +V 379: Pos(-1.491366, 0.924291, 1.880578) Norm(-0.649499, -0.565127, -0.508706) UV(0.293604, 0.757494) +V 380: Pos(-1.111483, 1.400926, 1.880578) Norm(-0.577324, -0.577353, -0.577373) UV(0.93097, 0.071337) +V 381: Pos(-1.111483, 0.924291, 0.703231) Norm(-0.301496, -0.904538, 0.301514) UV(0.959202, 0.001601) +V 382: Pos(-1.111483, 0.924291, 1.880578) Norm(-0.297044, -0.904461, -0.306129) UV(0.959202, 0.071337) +V 383: Pos(-1.491366, 0.924291, 1.880578) Norm(-0.649499, -0.565127, -0.508706) UV(0.010638, 0.667567) +V 384: Pos(-1.310804, 0.913759, 2.577662) Norm(-0.581639, -0.729937, -0.359009) UV(0.021588, 0.708795) +V 385: Pos(-1.30267, 0.580467, 2.875029) Norm(-0.534228, -0.778409, -0.329668) UV(0.331052, 0.946277) +V 386: Pos(-0.760641, 0.924291, 2.584705) Norm(-0.297042, -0.834972, -0.463237) UV(0.357509, 0.978545) +V 387: Pos(-0.760543, 0.580467, 2.875029) Norm(-0.115858, -0.940021, -0.320838) UV(0.330855, 0.978387) +V 388: Pos(-1.30267, 0.580467, 2.875029) Norm(-0.534228, -0.778409, -0.329668) UV(0.128662, 0.644028) +V 389: Pos(-1.289676, 0.534161, 3.883919) Norm(-0.695842, -0.717999, -0.016778) UV(0.06884, 0.644798) +V 390: Pos(-1.420916, 1.400926, 0.703231) Norm(0.577341, -0.577355, 0.577355) UV(0.956121, 0.963067) +V 391: Pos(-1.420916, 1.400926, 1.880578) Norm(0.577358, -0.577334, -0.577358) UV(0.321836, 0.761667) +V 392: Pos(-1.991606, 1.630625, 0.630966) Norm(-0.722159, 0.689589, 0.05435) UV(0.370234, 0.900479) +V 393: Pos(-1.491366, 0.924291, 0.703231) Norm(-0.577329, -0.577365, 0.577357) UV(0.010197, 0.597835) +V 394: Pos(-0.65104, 1.199254, -3.510261) Norm(-0.446891, -0.894588, 9e-06) UV(0.698845, 0.464133) +V 395: Pos(-0.65104, 1.199254, -3.630376) Norm(-0.446884, -0.894592, 0.0) UV(0.70596, 0.464133) +V 396: Pos(0.0, 1.199254, -1.057006) Norm(0.0, -0.951403, -0.30795) UV(0.553534, 0.502695) +V 397: Pos(-0.65104, 1.199254, -3.510261) Norm(-0.446891, -0.894588, 9e-06) UV(0.392527, 0.11724) +V 398: Pos(-0.653341, 2.448944, -3.630376) Norm(-0.999997, -0.00251, 9.8e-05) UV(0.385413, 0.191262) +V 399: Pos(-0.65104, 1.199254, -3.630376) Norm(-0.446884, -0.894592, 0.0) UV(0.385413, 0.11724) +V 400: Pos(-0.653539, 2.527008, -3.97069) Norm(-0.707311, -0.002602, 0.706897) UV(0.365255, 0.195885) +V 401: Pos(-0.650864, 2.44035, -7.759471) Norm(-0.999993, -0.003556, -0.000602) UV(0.140838, 0.190752) +V 402: Pos(-0.653303, 2.44906, -3.510261) Norm(-0.999996, -0.002785, 0.000174) UV(0.392527, 0.191268) +V 403: Pos(-0.653539, 2.527008, -3.148756) Norm(-0.707485, -0.003256, -0.706721) UV(0.41394, 0.195885) +V 404: Pos(-0.648736, 2.527008, 0.630966) Norm(-0.576891, -0.578901, -0.576256) UV(0.63782, 0.195884) +V 405: Pos(-0.648724, 2.446799, 0.630966) Norm(-0.711833, -0.00304, -0.702342) UV(0.63782, 0.191133) +V 406: Pos(-1.111364, 2.708697, -7.759471) Norm(-0.486614, 0.500907, 0.715751) UV(0.443111, 0.545184) +V 407: Pos(-0.730828, 2.527008, -7.759471) Norm(-0.323078, -0.910547, 0.257925) UV(0.460863, 0.533168) +V 408: Pos(-0.881851, 2.651839, -7.759471) Norm(-0.405621, -0.025127, 0.913696) UV(0.454217, 0.540587) +V 409: Pos(1.491366, 1.328909, 3.882872) Norm(0.522975, -0.661069, 0.538038) UV(0.019473, 0.091689) +V 410: Pos(1.746867, 1.630625, 3.882841) Norm(0.577346, 0.577368, 0.577336) UV(0.001602, 0.076555) +V 411: Pos(1.491366, 1.630625, 3.882841) Norm(0.577308, 0.577394, 0.577348) UV(0.001602, 0.091689) +V 412: Pos(1.746867, 1.630625, 2.584705) Norm(0.636762, 0.758423, 0.139026) UV(0.253753, 0.89464) +V 413: Pos(1.491366, 1.630625, 3.882841) Norm(0.577308, 0.577394, 0.577348) UV(0.175948, 0.885273) +V 414: Pos(1.746867, 1.630625, 3.882841) Norm(0.577346, 0.577368, 0.577336) UV(0.177075, 0.900365) +V 415: Pos(1.512495, 1.318377, 2.580171) Norm(0.484373, -0.863839, 0.138438) UV(0.221061, 0.509829) +V 416: Pos(1.746867, 1.328909, 3.882872) Norm(0.584739, -0.572346, 0.574891) UV(0.297497, 0.52729) +V 417: Pos(1.491366, 1.328909, 3.882872) Norm(0.522975, -0.661069, 0.538038) UV(0.298199, 0.512172) +V 418: Pos(1.746867, 1.328909, 3.882872) Norm(0.584739, -0.572346, 0.574891) UV(0.505665, 0.739394) +V 419: Pos(1.746867, 1.630625, 2.584705) Norm(0.636762, 0.758423, 0.139026) UV(0.428772, 0.757265) +V 420: Pos(1.746867, 1.630625, 3.882841) Norm(0.577346, 0.577368, 0.577336) UV(0.505663, 0.757265) +V 421: Pos(1.491366, 1.164531, 0.703231) Norm(0.30151, -0.904535, 0.301511) UV(0.107652, 0.500929) +V 422: Pos(1.491366, 1.164531, 0.630966) Norm(0.707089, -0.707124, 0.0) UV(0.103381, 0.500641) +V 423: Pos(1.991606, 1.164531, 0.630966) Norm(0.722163, -0.689585, 0.054351) UV(0.101388, 0.530204) +V 424: Pos(1.491366, 1.630625, 2.584705) Norm(0.718885, 0.693929, 0.040837) UV(0.252626, 0.879548) +V 425: Pos(1.863751, 1.630625, 2.329785) Norm(0.71929, 0.669459, 0.1856) UV(0.269326, 0.900419) +V 426: Pos(1.138994, 2.388921, 1.874625) Norm(0.537124, 0.842968, 0.030058) UV(0.901682, 0.788914) +V 427: Pos(1.543156, 2.364377, 2.1357) Norm(0.707555, 0.706433, -0.01785) UV(0.878572, 0.772173) +V 428: Pos(1.305889, 2.389127, 1.876623) Norm(0.283157, 0.958655, 0.028315) UV(0.891816, 0.78829) +V 429: Pos(1.376387, 1.164531, 2.329785) Norm(0.763277, -0.627314, 0.154549) UV(0.204236, 0.500614) +V 430: Pos(1.491366, 1.164531, 1.880578) Norm(0.285497, -0.932493, -0.221241) UV(0.17723, 0.50562) +V 431: Pos(1.863753, 1.164531, 2.329785) Norm(0.653945, -0.690529, 0.309072) UV(0.202294, 0.529417) +V 432: Pos(0.565739, 0.924291, 1.454266) Norm(0.131205, -0.973829, -0.185588) UV(0.065304, 0.641973) +V 433: Pos(1.111483, 0.924291, 0.703231) Norm(0.301496, -0.904538, 0.301514) UV(0.032698, 0.597693) +V 434: Pos(1.111483, 0.924291, 1.880578) Norm(0.297045, -0.904461, -0.30613) UV(0.033139, 0.667428) +V 435: Pos(0.302122, 2.836185, 2.373965) Norm(0.0, 0.948187, 0.317714) UV(0.603683, 0.524856) +V 436: Pos(1.422373, 2.220263, 3.747011) Norm(0.155362, 0.982935, 0.098498) UV(0.890611, 0.676837) +V 437: Pos(1.328419, 2.243359, 3.80272) Norm(0.219023, 0.953911, 0.205143) UV(0.8965, 0.673828) +V 438: Pos(1.491366, 2.2121, 3.8828) Norm(0.842316, 0.538977, 0.002755) UV(0.886928, 0.668587) +V 439: Pos(1.03036, 2.710321, 2.373965) Norm(0.824182, 0.565352, -0.03319) UV(0.706558, 0.697111) +V 440: Pos(0.827523, 2.948275, 1.874463) Norm(0.519777, 0.849105, 0.094086) UV(0.738535, 0.683047) +V 441: Pos(0.948679, 2.79932, 2.373965) Norm(0.538801, 0.830191, 0.143095) UV(0.7076, 0.690031) +V 442: Pos(0.948679, 2.79932, 2.373965) Norm(0.538801, 0.830191, 0.143095) UV(0.595808, 0.56265) +V 443: Pos(0.714427, 2.98476, 1.874452) Norm(0.146079, 0.97298, 0.178802) UV(0.629149, 0.55469) +V 444: Pos(0.835674, 2.836185, 2.373965) Norm(0.152155, 0.944202, 0.292116) UV(0.597732, 0.555898) +V 445: Pos(0.909848, 2.860193, 1.874489) Norm(0.81644, 0.577372, -0.008206) UV(0.737521, 0.690119) +V 446: Pos(0.778079, 3.010426, 1.373197) Norm(0.510356, 0.859422, 0.030499) UV(0.768601, 0.682547) +V 447: Pos(0.827523, 2.948275, 1.874463) Norm(0.519777, 0.849105, 0.094086) UV(0.627392, 0.561466) +V 448: Pos(0.66433, 3.046302, 1.373161) Norm(0.145272, 0.987939, 0.053598) UV(0.658769, 0.557851) +V 449: Pos(1.418757, 2.235414, 3.499286) Norm(0.352429, 0.934241, 0.054657) UV(0.635247, 0.723234) +V 450: Pos(1.422373, 2.220263, 3.747011) Norm(0.155362, 0.982935, 0.098498) UV(0.620603, 0.72188) +V 451: Pos(1.422373, 2.220263, 3.747011) Norm(0.155362, 0.982935, 0.098498) UV(0.50377, 0.574456) +V 452: Pos(1.328419, 2.243359, 3.80272) Norm(0.219023, 0.953911, 0.205143) UV(0.502231, 0.568012) +V 453: Pos(0.48915, 2.836185, 2.373965) Norm(-0.001754, 0.941543, 0.336887) UV(0.601581, 0.535746) +V 454: Pos(0.766956, 2.351064, 3.526832) Norm(-0.00518, 0.921815, 0.387595) UV(0.525653, 0.538305) +V 455: Pos(1.205699, 2.339613, 2.373965) Norm(0.538381, 0.842658, -0.008517) UV(0.703326, 0.721198) +V 456: Pos(1.491366, 2.3201, 2.584705) Norm(0.691731, 0.714013, 0.108137) UV(0.883008, 0.745642) +V 457: Pos(1.205699, 2.339613, 2.373965) Norm(0.538381, 0.842658, -0.008517) UV(0.899263, 0.75903) +V 458: Pos(1.418757, 2.235414, 3.499286) Norm(0.352429, 0.934241, 0.054657) UV(0.890097, 0.69153) +V 459: Pos(0.367602, 2.98476, 1.874452) Norm(0.0, 0.978932, 0.204186) UV(0.633225, 0.534669) +V 460: Pos(1.138994, 2.388921, 1.874625) Norm(0.537124, 0.842968, 0.030058) UV(0.733284, 0.720879) +V 461: Pos(0.317255, 3.046302, 1.373161) Norm(0.0, 0.998135, 0.06104) UV(0.663043, 0.537844) +V 462: Pos(1.111364, 2.442713, 1.373752) Norm(0.521542, 0.850483, 0.068357) UV(0.763129, 0.721405) +V 463: Pos(0.862337, 2.923812, 1.373281) Norm(0.801966, 0.597256, 0.011681) UV(0.76761, 0.689638) +V 464: Pos(0.648541, 0.924291, 0.630966) Norm(0.0, -1.0, 0.0) UV(0.060091, 0.593239) +V 465: Pos(1.863751, 1.630625, 2.329785) Norm(0.71929, 0.669459, 0.1856) UV(0.412161, 0.757265) +V 466: Pos(1.991606, 1.164531, 0.630966) Norm(0.722163, -0.689585, 0.054351) UV(0.311252, 0.729658) +V 467: Pos(1.991606, 1.630625, 0.630966) Norm(0.722159, 0.689589, 0.05435) UV(0.311252, 0.757265) +V 468: Pos(1.491366, 0.924291, 0.703231) Norm(0.577329, -0.577365, 0.577357) UV(0.801316, 0.025161) +V 469: Pos(1.491366, 1.164531, 0.630966) Norm(0.707089, -0.707124, 0.0) UV(0.787086, 0.02088) +V 470: Pos(1.491366, 1.164531, 0.703231) Norm(0.30151, -0.904535, 0.301511) UV(0.787086, 0.025161) +V 471: Pos(1.30267, 0.580467, 2.875029) Norm(0.534259, -0.778374, -0.329698) UV(0.159031, 0.89736) +V 472: Pos(1.491366, 1.328909, 3.882872) Norm(0.522975, -0.661069, 0.538038) UV(0.099277, 0.851718) +V 473: Pos(1.289676, 0.534161, 3.883919) Norm(0.695806, -0.718032, -0.016852) UV(0.099277, 0.900285) +V 474: Pos(0.455867, 3.095955, -7.759471) Norm(0.12113, 0.975112, 0.185698) UV(0.300846, 0.932244) +V 475: Pos(0.0, 3.095955, -7.759471) Norm(0.0, 0.994528, 0.104469) UV(0.300846, 0.905242) +V 476: Pos(0.36641, 3.046302, -0.072927) Norm(-0.044926, 0.987298, -0.152397) UV(0.873684, 0.215873) +V 477: Pos(0.782711, 2.755199, -2.047329) Norm(0.416407, 0.908486, -0.03547) UV(0.857991, 0.335605) +V 478: Pos(0.600842, 2.755199, -2.047329) Norm(-0.71012, 0.697523, -0.095869) UV(0.868733, 0.334794) +V 479: Pos(0.648541, 0.924291, -0.67675) Norm(0.0, -0.951236, -0.308464) UV(0.059601, 0.515782) +V 480: Pos(0.648541, 0.484647, -6.014415) Norm(0.622891, -0.711776, 0.324626) UV(0.277512, 0.810893) +V 481: Pos(0.648232, 0.484648, -8.09058) Norm(0.655932, -0.733148, -0.179576) UV(0.154536, 0.810875) +V 482: Pos(0.648541, 0.484647, -6.014415) Norm(0.622891, -0.711776, 0.324626) UV(0.807281, 0.110817) +V 483: Pos(0.0, 0.484647, -6.014415) Norm(0.0, -0.909444, 0.415827) UV(0.845695, 0.110817) +V 484: Pos(0.65104, 1.199254, -1.057006) Norm(0.0, -0.951572, -0.307425) UV(0.553534, 0.464133) +V 485: Pos(1.720205, 2.268628, 0.630966) Norm(0.906818, 0.392577, 0.153506) UV(0.720568, 0.151836) +V 486: Pos(1.305889, 2.389127, 1.876623) Norm(0.283157, 0.958655, 0.028315) UV(0.645573, 0.13009) +V 487: Pos(1.569701, 2.13116, 1.880577) Norm(0.955098, 0.294359, 0.033783) UV(0.645573, 0.151947) +V 488: Pos(0.880005, 2.649881, 0.630966) Norm(0.40394, -0.027698, -0.914366) UV(0.901253, 0.225485) +V 489: Pos(0.730828, 2.527008, -3.148756) Norm(0.25406, -0.725506, -0.639606) UV(0.912878, 0.001614) +V 490: Pos(0.884244, 2.649343, -3.148756) Norm(0.81818, -0.054595, -0.572365) UV(0.901256, 0.001605) +V 491: Pos(0.880005, 2.649881, 0.630966) Norm(0.40394, -0.027698, -0.914366) UV(0.730028, 0.166491) +V 492: Pos(0.884244, 2.649343, -3.148756) Norm(0.81818, -0.054595, -0.572365) UV(0.506148, 0.166491) +V 493: Pos(0.782711, 2.755199, -2.047329) Norm(0.416407, 0.908486, -0.03547) UV(0.571395, 0.175122) +V 494: Pos(0.648736, 2.527008, 0.630966) Norm(0.576891, -0.578901, -0.576256) UV(0.471542, 0.207471) +V 495: Pos(0.730828, 2.527008, -3.148756) Norm(0.25406, -0.725506, -0.639606) UV(0.695428, 0.202893) +V 496: Pos(0.726025, 2.527008, 0.630966) Norm(0.202674, -0.579391, -0.789449) UV(0.471548, 0.202893) +V 497: Pos(0.881851, 2.651839, -7.759471) Norm(0.405621, -0.025127, 0.913696) UV(0.08363, 0.729659) +V 498: Pos(0.455867, 3.095955, -7.759471) Norm(0.12113, 0.975112, 0.185698) UV(0.083597, 0.766109) +V 499: Pos(0.782711, 2.755199, -6.804733) Norm(0.44254, 0.893849, 0.07206) UV(0.140173, 0.738194) +V 500: Pos(0.503329, 3.046302, -0.072927) Norm(0.373152, 0.926756, -0.043366) UV(0.199237, 0.97264) +V 501: Pos(0.36641, 3.046302, -0.072927) Norm(-0.044926, 0.987298, -0.152397) UV(0.207347, 0.97264) +V 502: Pos(1.305889, 2.389127, 1.876623) Norm(0.283157, 0.958655, 0.028315) UV(0.713335, 0.554106) +V 503: Pos(1.543156, 2.364377, 2.1357) Norm(0.707555, 0.706433, -0.01785) UV(0.704108, 0.572815) +V 504: Pos(1.569701, 2.13116, 1.880577) Norm(0.955098, 0.294359, 0.033783) UV(0.724642, 0.572811) +V 505: Pos(1.461987, 2.527008, 0.630966) Norm(0.388908, 0.909199, 0.148684) UV(0.878766, 0.86195) +V 506: Pos(1.111364, 2.442713, 1.373752) Norm(0.521542, 0.850483, 0.068357) UV(0.901783, 0.818797) +V 507: Pos(1.569701, 2.13116, 1.880577) Norm(0.955098, 0.294359, 0.033783) UV(0.043568, 0.807776) +V 508: Pos(1.720205, 1.630625, 0.630966) Norm(0.675857, 0.732583, 0.080861) UV(0.11812, 0.837425) +V 509: Pos(1.720205, 2.268628, 0.630966) Norm(0.906818, 0.392577, 0.153506) UV(0.11812, 0.799635) +V 510: Pos(1.491366, 1.164531, 1.880578) Norm(0.285497, -0.932493, -0.221241) UV(0.646019, 0.016596) +V 511: Pos(1.420916, 1.164531, 0.703231) Norm(-0.301513, -0.301518, 0.904531) UV(0.641846, 0.086333) +V 512: Pos(1.491366, 1.164531, 0.703231) Norm(0.30151, -0.904535, 0.301511) UV(0.646019, 0.086333) +V 513: Pos(1.491366, 2.3201, 2.584705) Norm(0.691731, 0.714013, 0.108137) UV(0.854848, 0.866838) +V 514: Pos(1.491366, 1.630625, 3.882841) Norm(0.577308, 0.577394, 0.577348) UV(0.777956, 0.907677) +V 515: Pos(1.491366, 1.630625, 2.584705) Norm(0.718885, 0.693929, 0.040837) UV(0.854848, 0.907677) +V 516: Pos(1.491366, 0.924291, 1.880578) Norm(0.649507, -0.565076, -0.508753) UV(0.614951, 0.629246) +V 517: Pos(1.376387, 1.164531, 2.329785) Norm(0.763277, -0.627314, 0.154549) UV(0.60032, 0.6565) +V 518: Pos(1.310804, 0.913759, 2.577662) Norm(0.58164, -0.729936, -0.359009) UV(0.614951, 0.671903) +V 519: Pos(1.491366, 1.630625, 2.584705) Norm(0.718885, 0.693929, 0.040837) UV(0.001605, 0.837425) +V 520: Pos(1.491366, 2.3201, 2.584705) Norm(0.691731, 0.714013, 0.108137) UV(0.001604, 0.796586) +V 521: Pos(0.760641, 0.924291, 2.584705) Norm(0.297009, -0.834987, -0.46323) UV(0.054184, 0.709003) +V 522: Pos(1.746868, 1.328909, 2.584705) Norm(0.689057, -0.623519, 0.369357) UV(0.220687, 0.523723) +V 523: Pos(1.746868, 1.328909, 2.584705) Norm(0.689057, -0.623519, 0.369357) UV(0.428772, 0.739394) +V 524: Pos(1.720205, 1.630625, 0.630966) Norm(0.675857, 0.732583, 0.080861) UV(0.369037, 0.884448) +V 525: Pos(1.111364, 2.527008, 0.630966) Norm(0.389147, 0.636244, -0.666152) UV(0.009766, 0.960954) +V 526: Pos(0.726025, 2.527008, 0.630966) Norm(0.202674, -0.579391, -0.789449) UV(0.015132, 0.983139) +V 527: Pos(0.880005, 2.649881, 0.630966) Norm(0.40394, -0.027698, -0.914366) UV(0.020062, 0.972563) +V 528: Pos(0.503244, 3.046302, 0.630966) Norm(0.191006, 0.97212, -0.136011) UV(0.730056, 0.198885) +V 529: Pos(0.503329, 3.046302, -0.072927) Norm(0.373152, 0.926756, -0.043366) UV(0.688363, 0.198918) +V 530: Pos(0.869927, 2.928302, 0.630966) Norm(0.593543, 0.452904, -0.66527) UV(0.036232, 0.969267) +V 531: Pos(0.503244, 3.046302, 0.630966) Norm(0.191006, 0.97212, -0.136011) UV(0.048131, 0.988734) +V 532: Pos(0.664419, 3.046302, 0.630966) Norm(0.109758, 0.732503, -0.671857) UV(0.045887, 0.979455) +V 533: Pos(1.512495, 1.318377, 2.580171) Norm(0.484373, -0.863839, 0.138438) UV(0.17645, 0.851902) +V 534: Pos(1.310804, 0.913759, 2.577662) Norm(0.58164, -0.729936, -0.359009) UV(0.177743, 0.87865) +V 535: Pos(1.376387, 1.164531, 2.329785) Norm(0.763277, -0.627314, 0.154549) UV(0.192102, 0.862994) +V 536: Pos(0.649767, 0.992952, -8.090581) Norm(0.896295, -0.321955, -0.304959) UV(0.517674, 0.609248) +V 537: Pos(0.648232, 0.484648, -8.09058) Norm(0.655932, -0.733148, -0.179576) UV(0.524007, 0.579814) +V 538: Pos(0.649097, 0.992709, -9.064156) Norm(0.43085, -0.887051, 0.165859) UV(0.461301, 0.597105) +V 539: Pos(0.881851, 2.651839, -7.759471) Norm(0.405621, -0.025127, 0.913696) UV(0.474678, 0.534796) +V 540: Pos(0.909059, 2.983731, -7.759471) Norm(0.585337, 0.493081, 0.643623) UV(0.487749, 0.549567) +V 541: Pos(0.703551, 3.10173, -7.759471) Norm(0.121705, 0.77541, 0.619618) UV(0.50122, 0.545621) +V 542: Pos(1.482806, 2.450317, -9.439158) Norm(0.683897, 0.727146, -0.059533) UV(0.407765, 0.709406) +V 543: Pos(1.777471, 1.34622, -7.759471) Norm(0.735964, -0.664596, -0.129109) UV(0.508775, 0.644008) +V 544: Pos(1.482806, 1.34622, -9.439158) Norm(0.683901, -0.727142, -0.059533) UV(0.407765, 0.644008) +V 545: Pos(1.245159, 2.450317, -9.439158) Norm(0.158056, 0.97827, -0.134184) UV(0.373637, 0.791929) +V 546: Pos(1.777471, 2.450317, -7.759471) Norm(0.735981, 0.664577, -0.129112) UV(0.476197, 0.772585) +V 547: Pos(1.482806, 2.450317, -9.439158) Norm(0.683897, 0.727146, -0.059533) UV(0.375329, 0.777955) +V 548: Pos(1.230799, 1.170611, -8.13096) Norm(0.620269, -0.694154, -0.365262) UV(0.944338, 0.423915) +V 549: Pos(1.491366, 1.34622, -7.759471) Norm(0.314833, -0.948083, -0.044932) UV(0.960522, 0.400069) +V 550: Pos(1.277231, 1.170611, -7.759471) Norm(0.894623, -0.430897, -0.118223) UV(0.944204, 0.401741) +V 551: Pos(1.230799, 1.170611, -8.13096) Norm(0.620269, -0.694154, -0.365262) UV(0.96499, 0.255049) +V 552: Pos(1.277231, 0.992955, -7.759471) Norm(0.729924, -0.677412, -0.091232) UV(0.954467, 0.232874) +V 553: Pos(1.230799, 0.992955, -8.13096) Norm(0.517487, -0.580287, -0.628868) UV(0.954467, 0.255049) +V 554: Pos(0.64966, 0.992952, -7.759472) Norm(0.891344, -0.453327, -0.000179) UV(0.536848, 0.613374) +V 555: Pos(0.65104, 0.924291, -5.634158) Norm(0.297506, -0.868761, 0.395909) UV(0.660773, 0.635877) +V 556: Pos(1.230799, 0.992955, -8.13096) Norm(0.517487, -0.580287, -0.628868) UV(0.995042, 0.285085) +V 557: Pos(0.64966, 0.992952, -7.759472) Norm(0.891344, -0.453327, -0.000179) UV(0.973038, 0.319507) +V 558: Pos(0.649767, 0.992952, -8.090581) Norm(0.896295, -0.321955, -0.304959) UV(0.99265, 0.319501) +V 559: Pos(0.648232, 0.484648, -8.09058) Norm(0.655932, -0.733148, -0.179576) UV(0.040008, 0.517672) +V 560: Pos(0.0, 0.484647, -8.09058) Norm(0.0, -0.971193, -0.238294) UV(0.001612, 0.517669) +V 561: Pos(0.929518, 2.708697, -9.064084) Norm(0.466815, 0.816394, -0.339977) UV(0.080817, 0.77356) +V 562: Pos(0.909059, 2.983731, -7.759471) Norm(0.585337, 0.493081, 0.643623) UV(0.002145, 0.766499) +V 563: Pos(1.111364, 2.708697, -7.759471) Norm(0.486614, 0.500906, 0.715751) UV(0.0039, 0.786646) +V 564: Pos(1.245159, 2.450317, -9.439158) Norm(0.158056, 0.97827, -0.134184) UV(0.901844, 0.331478) +V 565: Pos(0.929518, 2.708697, -9.064084) Norm(0.466815, 0.816394, -0.339977) UV(0.928302, 0.312055) +V 566: Pos(1.491366, 2.450317, -7.759471) Norm(0.271519, 0.954077, 0.126549) UV(0.901262, 0.230926) +V 567: Pos(0.796828, 2.886173, -9.064084) Norm(0.385683, 0.609706, -0.692464) UV(0.079683, 0.760434) +V 568: Pos(0.703551, 3.10173, -7.759471) Norm(0.121705, 0.77541, 0.619618) UV(0.001609, 0.752099) +V 569: Pos(0.81946, 3.067169, -7.759471) Norm(0.41609, 0.683984, 0.599195) UV(0.001666, 0.759263) +V 570: Pos(0.70055, 2.920734, -9.064084) Norm(0.111005, 0.689743, -0.715494) UV(0.079591, 0.754376) +V 571: Pos(0.542386, 3.10173, -7.759471) Norm(-0.025593, 0.760812, 0.648468) UV(0.001909, 0.742558) +V 572: Pos(0.871251, 2.802734, -9.064084) Norm(0.529763, 0.438109, -0.726231) UV(0.08019, 0.767037) +V 573: Pos(0.566681, 2.920734, -9.064084) Norm(-0.000915, 0.657509, -0.753446) UV(0.07984, 0.74645) +V 574: Pos(0.455867, 3.095955, -7.759471) Norm(0.12113, 0.975112, 0.185698) UV(0.002118, 0.737426) +V 575: Pos(0.565739, 0.633144, 1.745819) Norm(0.634265, -0.707295, -0.312156) UV(0.963205, 0.453426) +V 576: Pos(0.0, 0.633144, 1.745819) Norm(0.0, -0.914883, -0.403719) UV(0.963205, 0.486936) +V 577: Pos(0.760543, 0.580467, 2.875029) Norm(0.115857, -0.940021, -0.320839) UV(0.876404, 0.402299) +V 578: Pos(0.565739, 0.924291, 2.31596) Norm(0.705941, -0.697131, -0.125117) UV(0.860133, 0.439445) +V 579: Pos(0.760641, 0.924291, 2.584705) Norm(0.297009, -0.834987, -0.46323) UV(0.876763, 0.428951) +V 580: Pos(0.565637, 0.59299, 2.606576) Norm(0.430304, -0.869704, -0.241771) UV(0.107384, 0.781045) +V 581: Pos(0.565739, 0.924291, 1.454266) Norm(0.131205, -0.973829, -0.185588) UV(0.03829, 0.797467) +V 582: Pos(0.565739, 0.924291, 2.31596) Norm(0.705941, -0.697131, -0.125117) UV(0.089275, 0.799846) +V 583: Pos(0.565739, 0.924291, 2.31596) Norm(0.705941, -0.697131, -0.125117) UV(0.065627, 0.693012) +V 584: Pos(0.565637, 0.59299, 2.606576) Norm(0.430304, -0.869704, -0.241771) UV(0.14458, 0.687684) +V 585: Pos(0.760543, 0.580467, 2.875029) Norm(0.115857, -0.940021, -0.320839) UV(0.128662, 0.67614) +V 586: Pos(0.565265, 0.550755, 3.528204) Norm(-0.000493, -0.998944, -0.045933) UV(0.089933, 0.687706) +V 587: Pos(0.565739, 0.633144, 1.745819) Norm(0.634265, -0.707295, -0.312156) UV(0.19562, 0.687678) +V 588: Pos(0.566681, 2.920734, -9.064084) Norm(-0.000915, 0.657509, -0.753446) UV(0.381892, 0.151837) +V 589: Pos(1.054109, 1.170611, -9.439158) Norm(0.497307, -0.210601, -0.841625) UV(0.394034, 0.706445) +V 590: Pos(1.054109, 1.34622, -9.439158) Norm(-0.301522, -0.301497, -0.904535) UV(0.383633, 0.706445) +V 591: Pos(1.245159, 1.34622, -9.439158) Norm(0.188197, -0.970605, -0.150024) UV(0.383633, 0.717761) +V 592: Pos(0.649097, 0.992709, -9.064156) Norm(0.43085, -0.887051, 0.165859) UV(0.949621, 0.778026) +V 593: Pos(1.087338, 2.579507, -9.439158) Norm(0.275033, 0.658176, -0.700829) UV(0.001611, 0.597658) +V 594: Pos(0.929518, 2.708697, -9.064084) Norm(0.466815, 0.816394, -0.339977) UV(0.025109, 0.607006) +V 595: Pos(1.054109, 2.450317, -9.439158) Norm(-0.301518, 0.3015, -0.904536) UV(0.318235, 0.706445) +V 596: Pos(1.087338, 2.579507, -9.439158) Norm(0.275033, 0.658176, -0.700829) UV(0.310583, 0.708413) +V 597: Pos(1.054109, 0.992955, -9.439158) Norm(0.53391, -0.584629, -0.610859) UV(0.404557, 0.706445) +V 598: Pos(1.054109, 0.992955, -9.439158) Norm(0.53391, -0.584629, -0.610859) UV(0.971834, 0.754036) +V 599: Pos(0.70055, 2.920734, -9.064084) Norm(0.111005, 0.689743, -0.715494) UV(0.381892, 0.143908) +V 600: Pos(0.871251, 2.802734, -9.064084) Norm(0.529763, 0.438109, -0.726231) UV(0.374902, 0.133797) +V 601: Pos(0.473708, 2.351064, 3.526832) Norm(0.0, 0.92172, 0.387856) UV(0.528856, 0.521195) +V 602: Pos(0.36641, 2.755199, -6.634012) Norm(-0.044646, 0.993482, 0.10488) UV(0.132639, 0.775728) +V 603: Pos(0.600842, 2.527008, -5.911546) Norm(-0.695488, 0.691389, 0.195645) UV(0.146491, 0.54006) +V 604: Pos(0.36641, 2.755199, -6.634012) Norm(-0.044646, 0.993482, 0.10488) UV(0.101614, 0.553946) +V 605: Pos(0.507578, 2.527008, -1.211138) Norm(-0.655304, 0.721835, -0.222556) UV(0.424905, 0.545585) +V 606: Pos(0.36641, 3.046302, -0.072927) Norm(-0.044926, 0.987298, -0.152397) UV(0.499009, 0.553946) +V 607: Pos(0.600842, 2.527008, -2.046379) Norm(-0.72039, 0.692327, -0.041492) UV(0.375433, 0.54006) +V 608: Pos(0.507578, 2.527008, -1.211138) Norm(-0.655304, 0.721835, -0.222556) UV(0.310054, 0.878209) +V 609: Pos(0.600842, 2.755199, -2.047329) Norm(-0.71012, 0.697523, -0.095869) UV(0.261699, 0.860095) +V 610: Pos(0.600842, 2.527008, -2.046379) Norm(-0.72039, 0.692327, -0.041492) UV(0.260491, 0.873557) +V 611: Pos(1.482806, 1.34622, -10.181827) Norm(0.630262, -0.717281, -0.297116) UV(0.442575, 0.180491) +V 612: Pos(1.482806, 2.174068, -10.458076) Norm(0.630261, 0.297109, -0.717285) UV(0.458938, 0.131456) +V 613: Pos(1.482806, 2.450317, -10.181827) Norm(0.630292, 0.717262, -0.297099) UV(0.442575, 0.115093) +V 614: Pos(1.054109, 1.34622, -10.995328) Norm(-0.630263, -0.717286, -0.297101) UV(0.291008, 0.644007) +V 615: Pos(1.054109, 2.174068, -11.271577) Norm(-0.630279, 0.297103, -0.717271) UV(0.307371, 0.693042) +V 616: Pos(1.054109, 1.622469, -11.271577) Norm(-0.630255, -0.297111, -0.717289) UV(0.307371, 0.66037) +V 617: Pos(1.119309, 2.456002, 0.630966) Norm(-0.0, 0.0, -1.0) UV(0.005568, 0.961486) +V 618: Pos(0.648724, 2.446799, 0.630966) Norm(0.711833, -0.00304, -0.702342) UV(0.011591, 0.988706) +V 619: Pos(0.648736, 2.527008, 0.630966) Norm(0.576891, -0.578901, -0.576256) UV(0.016208, 0.987589) +V 620: Pos(1.054109, 2.174068, -11.271577) Norm(-0.630279, 0.297103, -0.717271) UV(0.839462, 0.500121) +V 621: Pos(1.211802, 2.450317, -10.995328) Norm(0.630261, 0.717289, -0.2971) UV(0.830122, 0.476981) +V 622: Pos(1.211802, 2.174068, -11.271577) Norm(0.630255, 0.297111, -0.717289) UV(0.830122, 0.500121) +V 623: Pos(1.360914, 2.450317, -9.747389) Norm(-0.301515, 0.904531, -0.301516) UV(0.356337, 0.782928) +V 624: Pos(1.482806, 2.450317, -10.181827) Norm(0.630292, 0.717262, -0.297099) UV(0.331659, 0.772667) +V 625: Pos(1.360914, 2.450317, -10.181827) Norm(-0.630257, 0.717288, -0.29711) UV(0.330791, 0.779835) +V 626: Pos(1.360914, 2.174068, -10.458076) Norm(-0.630277, 0.297101, -0.717274) UV(0.908472, 0.423036) +V 627: Pos(1.482806, 2.450317, -10.181827) Norm(0.630292, 0.717262, -0.297099) UV(0.901252, 0.399895) +V 628: Pos(1.482806, 2.174068, -10.458076) Norm(0.630261, 0.297109, -0.717285) UV(0.901252, 0.423036) +V 629: Pos(1.211802, 1.622469, -11.271577) Norm(0.63028, -0.297103, -0.717271) UV(0.041804, 0.034282) +V 630: Pos(1.054109, 2.174068, -11.271577) Norm(-0.630279, 0.297103, -0.717271) UV(0.051145, 0.00161) +V 631: Pos(1.211802, 2.174068, -11.271577) Norm(0.630255, 0.297111, -0.717289) UV(0.041804, 0.00161) +V 632: Pos(1.482806, 1.622469, -10.458076) Norm(0.630271, -0.297103, -0.717279) UV(0.848913, 0.143483) +V 633: Pos(1.360914, 2.174068, -10.458076) Norm(-0.630277, 0.297101, -0.717274) UV(0.856133, 0.110811) +V 634: Pos(1.482806, 2.174068, -10.458076) Norm(0.630261, 0.297109, -0.717285) UV(0.848913, 0.110811) +V 635: Pos(1.211802, 1.622469, -11.271577) Norm(0.63028, -0.297103, -0.717271) UV(0.698637, 0.212236) +V 636: Pos(1.054109, 1.34622, -10.995328) Norm(-0.630263, -0.717286, -0.297101) UV(0.721777, 0.202896) +V 637: Pos(1.054109, 1.622469, -11.271577) Norm(-0.630255, -0.297111, -0.717289) UV(0.698637, 0.202895) +V 638: Pos(1.360914, 1.34622, -10.181827) Norm(-0.630263, -0.717286, -0.297101) UV(0.5015, 0.010173) +V 639: Pos(1.482806, 1.622469, -10.458076) Norm(0.630271, -0.297103, -0.717279) UV(0.478359, 0.017393) +V 640: Pos(1.482806, 1.34622, -10.181827) Norm(0.630262, -0.717281, -0.297116) UV(0.5015, 0.017393) +V 641: Pos(1.482806, 1.34622, -9.439158) Norm(0.683901, -0.727142, -0.059533) UV(0.580703, 0.777954) +V 642: Pos(1.491366, 1.34622, -7.759471) Norm(0.314833, -0.948083, -0.044932) UV(0.481872, 0.789409) +V 643: Pos(1.245159, 1.34622, -9.439158) Norm(0.188197, -0.970605, -0.150024) UV(0.582395, 0.791928) +V 644: Pos(1.245159, 2.450317, -9.439158) Norm(0.158056, 0.97827, -0.134184) UV(0.318235, 0.717761) +V 645: Pos(1.054109, 2.450317, -9.439158) Norm(-0.301518, 0.3015, -0.904536) UV(0.372277, 0.803163) +V 646: Pos(1.211802, 2.450317, -10.995328) Norm(0.630261, 0.717289, -0.2971) UV(0.281893, 0.782812) +V 647: Pos(1.054109, 2.450317, -10.995328) Norm(-0.630276, 0.717274, -0.297104) UV(0.280771, 0.792085) +V 648: Pos(1.211802, 2.450317, -9.747389) Norm(0.301522, 0.904532, -0.301506) UV(0.355275, 0.791696) +V 649: Pos(1.360914, 1.34622, -9.747389) Norm(-0.301501, -0.904536, -0.301517) UV(0.599696, 0.782927) +V 650: Pos(1.482806, 1.34622, -10.181827) Norm(0.630262, -0.717281, -0.297116) UV(0.624374, 0.772667) +V 651: Pos(1.054109, 1.34622, -9.439158) Norm(-0.301522, -0.301497, -0.904535) UV(0.583755, 0.803163) +V 652: Pos(1.211802, 1.34622, -10.995328) Norm(0.630281, -0.71727, -0.297101) UV(0.674139, 0.782811) +V 653: Pos(1.211802, 1.34622, -9.747389) Norm(0.301508, -0.904536, -0.301508) UV(0.600757, 0.791696) +V 654: Pos(1.360914, 2.450317, -10.181827) Norm(-0.630257, 0.717288, -0.29711) UV(0.438766, 0.902341) +V 655: Pos(1.360914, 1.34622, -9.747389) Norm(-0.301501, -0.904536, -0.301517) UV(0.373369, 0.928074) +V 656: Pos(1.360914, 2.450317, -9.747389) Norm(-0.301515, 0.904531, -0.301516) UV(0.438766, 0.928074) +V 657: Pos(1.360914, 2.450317, -9.747389) Norm(-0.301515, 0.904531, -0.301516) UV(0.986614, 0.194322) +V 658: Pos(1.211802, 1.34622, -9.747389) Norm(0.301508, -0.904536, -0.301508) UV(0.995446, 0.259719) +V 659: Pos(1.211802, 2.450317, -9.747389) Norm(0.301522, 0.904532, -0.301506) UV(0.995446, 0.194322) +V 660: Pos(1.211802, 2.450317, -9.747389) Norm(0.301522, 0.904532, -0.301506) UV(0.742777, 0.67433) +V 661: Pos(1.211802, 1.34622, -10.995328) Norm(0.630281, -0.71727, -0.297101) UV(0.808175, 0.600412) +V 662: Pos(1.211802, 2.450317, -10.995328) Norm(0.630261, 0.717289, -0.2971) UV(0.742777, 0.600412) +V 663: Pos(1.360914, 1.34622, -10.181827) Norm(-0.630263, -0.717286, -0.297101) UV(0.373369, 0.902341) +V 664: Pos(1.360914, 2.174068, -10.458076) Norm(-0.630277, 0.297101, -0.717274) UV(0.422404, 0.885979) +V 665: Pos(1.360914, 1.622469, -10.458076) Norm(-0.630255, -0.297111, -0.717289) UV(0.389731, 0.885979) +V 666: Pos(1.211802, 1.622469, -11.271577) Norm(0.63028, -0.297103, -0.717271) UV(0.791812, 0.584049) +V 667: Pos(1.482806, 1.34622, -9.439158) Norm(0.683901, -0.727142, -0.059533) UV(0.398586, 0.180491) +V 668: Pos(1.482806, 2.450317, -9.439158) Norm(0.683897, 0.727146, -0.059533) UV(0.398586, 0.115093) +V 669: Pos(1.054109, 1.34622, -9.439158) Norm(-0.301522, -0.301497, -0.904535) UV(0.198833, 0.644007) +V 670: Pos(1.054109, 2.450317, -10.995328) Norm(-0.630276, 0.717274, -0.297104) UV(0.291008, 0.709405) +V 671: Pos(1.10049, 1.170611, -9.095757) Norm(0.676724, -0.710549, 0.192779) UV(0.944239, 0.481581) +V 672: Pos(1.245159, 1.34622, -9.439158) Norm(0.188197, -0.970605, -0.150024) UV(0.959502, 0.500618) +V 673: Pos(0.653539, 2.527008, -3.148756) Norm(0.707485, -0.003256, -0.706721) UV(0.738301, 0.018737) +V 674: Pos(0.884244, 2.649343, -3.148756) Norm(0.81818, -0.054595, -0.572365) UV(0.751966, 0.025983) +V 675: Pos(0.730828, 2.527008, -3.148756) Norm(0.25406, -0.725506, -0.639606) UV(0.742879, 0.018737) +V 676: Pos(0.600842, 2.755199, -3.97069) Norm(-0.577356, 0.577362, 0.577333) UV(0.707683, 0.506957) +V 677: Pos(0.653539, 2.527008, -3.97069) Norm(0.707311, -0.002602, 0.706897) UV(0.694167, 0.510079) +V 678: Pos(0.782711, 2.755199, -3.97069) Norm(0.305115, 0.715432, 0.62854) UV(0.707683, 0.51773) +V 679: Pos(0.782711, 2.755199, -3.148756) Norm(0.305114, 0.715427, -0.628546) UV(0.8629, 0.40066) +V 680: Pos(0.600842, 2.755199, -3.148756) Norm(-0.57735, 0.57735, -0.57735) UV(0.873642, 0.399849) +V 681: Pos(0.884244, 2.649343, -3.97069) Norm(0.819513, -0.051224, 0.570766) UV(0.308047, 0.729659) +V 682: Pos(0.782711, 2.755199, -3.148756) Norm(0.305114, 0.715427, -0.628546) UV(0.506155, 0.175179) +V 683: Pos(0.65104, 0.924291, -5.298873) Norm(0.0, -0.990543, 0.137204) UV(0.807044, 0.464133) +V 684: Pos(0.730828, 2.527008, -3.97069) Norm(0.256869, -0.72395, 0.640246) UV(0.694167, 0.514657) +V 685: Pos(0.600842, 2.527008, -3.148756) Norm(-0.301503, 0.904533, -0.301523) UV(0.310137, 0.54006) +V 686: Pos(0.600842, 2.527008, -3.148756) Norm(-0.301503, 0.904533, -0.301523) UV(0.195481, 0.867455) +V 687: Pos(0.600842, 2.755199, -3.148756) Norm(-0.57735, 0.57735, -0.57735) UV(0.196744, 0.853998) +V 688: Pos(0.600842, 2.527008, -5.911546) Norm(-0.695488, 0.691389, 0.195645) UV(0.94509, 0.191516) +V 689: Pos(0.600842, 2.755199, -3.97069) Norm(-0.577356, 0.577362, 0.577333) UV(0.93152, 0.076562) +V 690: Pos(0.600842, 2.755199, -5.9038) Norm(-0.662736, 0.741937, 0.101535) UV(0.931573, 0.191064) +V 691: Pos(0.884244, 2.649343, -3.97069) Norm(0.819513, -0.051224, 0.570766) UV(0.916137, 0.22602) +V 692: Pos(0.730828, 2.527008, -7.759471) Norm(0.323078, -0.910547, 0.257925) UV(0.927759, 0.001603) +V 693: Pos(0.881851, 2.651839, -7.759471) Norm(0.405621, -0.025127, 0.913696) UV(0.916154, 0.001603) +V 694: Pos(0.65104, 0.924291, -5.634158) Norm(0.297506, -0.868761, 0.395909) UV(0.826904, 0.464133) +V 695: Pos(0.0, 0.924291, -5.634158) Norm(0.0, -0.909439, 0.415838) UV(0.826904, 0.502695) +V 696: Pos(0.653539, 2.527008, -3.97069) Norm(0.707311, -0.002602, 0.706897) UV(0.243917, 0.205332) +V 697: Pos(0.730828, 2.527008, -7.759471) Norm(0.323078, -0.910547, 0.257925) UV(0.468334, 0.200754) +V 698: Pos(0.730828, 2.527008, -3.97069) Norm(0.256869, -0.72395, 0.640246) UV(0.243917, 0.200754) +V 699: Pos(0.600842, 2.755199, -3.97069) Norm(-0.577356, 0.577362, 0.577333) UV(0.290393, 0.761842) +V 700: Pos(0.782711, 2.755199, -6.804733) Norm(0.44254, 0.893849, 0.07206) UV(0.122527, 0.75107) +V 701: Pos(0.600842, 2.755199, -5.9038) Norm(-0.662736, 0.741937, 0.101535) UV(0.175891, 0.761842) +V 702: Pos(0.36641, 2.755199, -6.634012) Norm(-0.044646, 0.993482, 0.10488) UV(0.931521, 0.23649) +V 703: Pos(0.600842, 2.527008, -3.148756) Norm(-0.301503, 0.904533, -0.301523) UV(0.735179, 0.018737) +V 704: Pos(0.782711, 2.755199, -3.148756) Norm(0.305114, 0.715427, -0.628546) UV(0.745952, 0.032253) +V 705: Pos(0.600842, 2.527008, -3.97069) Norm(-0.30151, 0.904535, 0.30151) UV(0.261452, 0.54006) +V 706: Pos(0.653539, 2.527008, -3.148756) Norm(0.707485, -0.003256, -0.706721) UV(0.310137, 0.536939) +V 707: Pos(1.054109, 1.170611, -9.439158) Norm(0.497307, -0.210601, -0.841625) UV(0.944204, 0.502106) +V 708: Pos(1.054109, 1.170611, -9.439158) Norm(0.497307, -0.210601, -0.841625) UV(0.690958, 0.506962) +V 709: Pos(1.10049, 0.992955, -9.095757) Norm(0.634183, -0.572752, 0.519391) UV(0.670433, 0.517485) +V 710: Pos(1.054109, 0.992955, -9.439158) Norm(0.53391, -0.584629, -0.610859) UV(0.690958, 0.517485) +V 711: Pos(1.230799, 0.992955, -8.13096) Norm(0.517487, -0.580287, -0.628868) UV(0.266767, 0.956643) +V 712: Pos(1.06854, 1.170611, -8.119707) Norm(-0.366272, -0.316364, -0.875076) UV(0.257133, 0.967166) +V 713: Pos(1.230799, 1.170611, -8.13096) Norm(0.620269, -0.694154, -0.365262) UV(0.266767, 0.967166) +V 714: Pos(0.649767, 0.992952, -8.090581) Norm(0.896295, -0.321955, -0.304959) UV(0.232268, 0.956643) +V 715: Pos(1.10049, 0.992955, -9.095757) Norm(0.634183, -0.572752, 0.519391) UV(0.907772, 0.963063) +V 716: Pos(1.10049, 1.170611, -9.095757) Norm(0.676724, -0.710549, 0.192779) UV(0.907768, 0.973586) +V 717: Pos(0.945714, 1.170611, -9.08693) Norm(-0.23291, -0.281604, 0.930834) UV(0.91695, 0.973589) +V 718: Pos(0.649097, 0.992709, -9.064156) Norm(0.43085, -0.887051, 0.165859) UV(0.934574, 0.963057) +V 719: Pos(1.230799, 1.170611, -8.13096) Norm(0.620269, -0.694154, -0.365262) UV(0.043256, 0.576078) +V 720: Pos(0.945714, 1.170611, -9.08693) Norm(-0.23291, -0.281604, 0.930834) UV(0.052875, 0.517778) +V 721: Pos(1.10049, 1.170611, -9.095757) Norm(0.676724, -0.710549, 0.192779) UV(0.043714, 0.518415) +V 722: Pos(0.650176, 1.450022, -9.064157) Norm(0.596638, -0.581808, 0.552741) UV(0.934503, 0.990144) +V 723: Pos(1.06854, 1.45027, -8.119707) Norm(-0.632605, -0.574449, -0.519442) UV(0.270161, 0.946024) +V 724: Pos(0.650176, 1.450022, -9.064157) Norm(0.596638, -0.581808, 0.552741) UV(0.327691, 0.966853) +V 725: Pos(0.945714, 1.45027, -9.08693) Norm(-0.514483, -0.58031, 0.631306) UV(0.327819, 0.949297) +V 726: Pos(0.650846, 1.450265, -8.090582) Norm(0.557789, -0.574365, -0.599147) UV(0.511977, 0.63573) +V 727: Pos(1.06854, 1.45027, -8.119707) Norm(-0.632605, -0.574449, -0.519442) UV(0.257133, 0.983731) +V 728: Pos(1.06854, 1.170611, -8.119707) Norm(-0.366272, -0.316364, -0.875076) UV(0.431809, 0.830304) +V 729: Pos(0.945714, 1.45027, -9.08693) Norm(-0.514483, -0.58031, 0.631306) UV(0.489559, 0.846869) +V 730: Pos(0.945714, 1.170611, -9.08693) Norm(-0.23291, -0.281604, 0.930834) UV(0.489559, 0.830304) +V 731: Pos(0.869927, 2.928302, 0.630966) Norm(0.593543, 0.452904, -0.66527) UV(0.811157, 0.695743) +V 732: Pos(0.503244, 3.046302, 0.630966) Norm(0.191006, 0.97212, -0.136011) UV(0.703654, 0.557962) +V 733: Pos(0.778079, 3.010426, 1.373197) Norm(0.510356, 0.859422, 0.030499) UV(0.657172, 0.564727) +V 734: Pos(0.664419, 3.046302, 0.630966) Norm(0.109758, 0.732503, -0.671857) UV(0.701594, 0.567323) +V 735: Pos(0.780328, 3.011741, 0.630966) Norm(0.389407, 0.655174, -0.647386) UV(0.81214, 0.688566) +V 736: Pos(1.420916, 1.400926, 1.880578) Norm(-0.577358, -0.577334, -0.577358) UV(0.560529, 0.945934) +V 737: Pos(1.111483, 1.400926, 0.703231) Norm(0.577352, -0.577327, 0.577372) UV(0.630265, 0.964262) +V 738: Pos(1.420916, 1.400926, 0.703231) Norm(-0.577341, -0.577355, 0.577355) UV(0.630265, 0.945934) +V 739: Pos(1.420916, 1.164531, 1.880578) Norm(-0.301509, -0.301516, -0.904533) UV(0.978619, 0.905251) +V 740: Pos(1.420916, 1.400926, 0.703231) Norm(-0.577341, -0.577355, 0.577355) UV(0.964617, 0.974988) +V 741: Pos(1.420916, 1.164531, 0.703231) Norm(-0.301513, -0.301518, 0.904531) UV(0.978619, 0.974988) +V 742: Pos(1.111483, 0.924291, 1.880578) Norm(0.297045, -0.904461, -0.30613) UV(0.293604, 0.779995) +V 743: Pos(1.111483, 1.400926, 1.880578) Norm(0.577324, -0.577353, -0.577373) UV(0.321836, 0.779995) +V 744: Pos(1.420916, 1.164531, 1.880578) Norm(-0.301509, -0.301516, -0.904533) UV(0.307834, 0.761667) +V 745: Pos(1.111483, 0.924291, 0.703231) Norm(0.301496, -0.904538, 0.301514) UV(0.937793, 0.991299) +V 746: Pos(1.491366, 1.164531, 0.703231) Norm(0.30151, -0.904535, 0.301511) UV(0.960294, 0.977069) +V 747: Pos(1.420916, 1.164531, 0.703231) Norm(-0.301513, -0.301518, 0.904531) UV(0.956121, 0.977069) +V 748: Pos(1.111483, 1.400926, 0.703231) Norm(0.577352, -0.577327, 0.577372) UV(0.937793, 0.963067) +V 749: Pos(1.491366, 0.924291, 1.880578) Norm(0.649507, -0.565076, -0.508753) UV(0.293604, 0.757494) +V 750: Pos(1.491366, 1.164531, 1.880578) Norm(0.285497, -0.932493, -0.221241) UV(0.307834, 0.757494) +V 751: Pos(1.111483, 1.400926, 1.880578) Norm(0.577324, -0.577353, -0.577373) UV(0.93097, 0.071337) +V 752: Pos(1.111483, 0.924291, 0.703231) Norm(0.301496, -0.904538, 0.301514) UV(0.959202, 0.001601) +V 753: Pos(1.111483, 1.400926, 0.703231) Norm(0.577352, -0.577327, 0.577372) UV(0.93097, 0.001601) +V 754: Pos(1.491366, 0.924291, 1.880578) Norm(0.649507, -0.565076, -0.508753) UV(0.010638, 0.667567) +V 755: Pos(1.30267, 0.580467, 2.875029) Norm(0.534259, -0.778374, -0.329698) UV(0.331052, 0.946277) +V 756: Pos(0.760641, 0.924291, 2.584705) Norm(0.297009, -0.834987, -0.46323) UV(0.357509, 0.978545) +V 757: Pos(1.310804, 0.913759, 2.577662) Norm(0.58164, -0.729936, -0.359009) UV(0.357511, 0.945949) +V 758: Pos(1.30267, 0.580467, 2.875029) Norm(0.534259, -0.778374, -0.329698) UV(0.128662, 0.644028) +V 759: Pos(1.420916, 1.400926, 0.703231) Norm(-0.577341, -0.577355, 0.577355) UV(0.956121, 0.963067) +V 760: Pos(1.420916, 1.400926, 1.880578) Norm(-0.577358, -0.577334, -0.577358) UV(0.321836, 0.761667) +V 761: Pos(1.991606, 1.630625, 0.630966) Norm(0.722159, 0.689589, 0.05435) UV(0.370234, 0.900479) +V 762: Pos(1.491366, 0.924291, 0.703231) Norm(0.577329, -0.577365, 0.577357) UV(0.010197, 0.597835) +V 763: Pos(1.491366, 0.924291, 0.630966) Norm(0.707107, -0.707107, 0.0) UV(0.01017, 0.593555) +V 764: Pos(0.65104, 1.199254, -3.630376) Norm(0.446884, -0.894592, 0.0) UV(0.70596, 0.464133) +V 765: Pos(0.65104, 1.199254, -3.510261) Norm(0.446891, -0.894588, 9e-06) UV(0.698845, 0.464133) +V 766: Pos(0.65104, 1.199254, -4.325368) Norm(0.0, -0.990543, 0.137204) UV(0.747125, 0.464133) +V 767: Pos(0.65104, 1.199254, -3.510261) Norm(0.446891, -0.894588, 9e-06) UV(0.392527, 0.11724) +V 768: Pos(0.653341, 2.448944, -3.630376) Norm(0.999997, -0.002502, 9.9e-05) UV(0.385413, 0.191262) +V 769: Pos(0.653303, 2.44906, -3.510261) Norm(0.999996, -0.002785, 0.000174) UV(0.392527, 0.191268) +V 770: Pos(0.653539, 2.527008, -3.97069) Norm(0.707311, -0.002602, 0.706897) UV(0.365255, 0.195885) +V 771: Pos(0.650864, 2.44035, -7.759471) Norm(0.999993, -0.003556, -0.000602) UV(0.140838, 0.190752) +V 772: Pos(0.65104, 2.527008, -7.759471) Norm(0.706011, -0.708201, -0.000426) UV(0.140838, 0.195885) +V 773: Pos(0.648736, 2.527008, 0.630966) Norm(0.576891, -0.578901, -0.576256) UV(0.63782, 0.195884) +V 774: Pos(0.653539, 2.527008, -3.148756) Norm(0.707485, -0.003256, -0.706721) UV(0.41394, 0.195885) +V 775: Pos(1.111364, 2.708697, -7.759471) Norm(0.486614, 0.500906, 0.715751) UV(0.443111, 0.545184) +V 776: Pos(0.730828, 2.527008, -7.759471) Norm(0.323078, -0.910547, 0.257925) UV(0.460863, 0.533168) +V 777: Pos(1.491366, 2.450317, -7.759471) Norm(0.271519, 0.954077, 0.126549) UV(0.422051, 0.535074) +V 778: Pos(-1.211802, 0.812158, -11.812522) Norm(0.845644, -0.139628, -0.51516) UV(0.11009, 0.203676) +V 779: Pos(-1.235818, 0.718544, -9.747389) Norm(0.673684, -0.355174, 0.648075) UV(0.001617, 0.208759) +V 780: Pos(-1.235818, 0.718544, -11.798289) Norm(0.724486, -0.469669, -0.50451) UV(0.109343, 0.208752) +V 781: Pos(-1.30143, 0.64362, -9.747389) Norm(0.44095, -0.620928, 0.648083) UV(0.001617, 0.21399) +V 782: Pos(-1.30143, 0.64362, -11.766311) Norm(0.458953, -0.776403, -0.431925) UV(0.107663, 0.213984) +V 783: Pos(-1.527916, 0.738042, -11.869441) Norm(-0.275405, 0.286312, -0.917702) UV(0.386948, 0.113213) +V 784: Pos(-1.450541, 0.774199, -9.747389) Norm(-0.38048, 0.53656, 0.753219) UV(0.382243, 0.001759) +V 785: Pos(-1.438288, 0.774199, -11.883513) Norm(-0.411303, 0.165331, -0.896379) UV(0.381873, 0.113962) +V 786: Pos(-1.384929, 0.849123, -9.747389) Norm(-0.585801, 0.31465, 0.746882) UV(0.377011, 0.001761) +V 787: Pos(-1.372676, 0.849123, -11.896939) Norm(-0.409518, 0.096317, -0.907203) UV(0.376643, 0.11467) +V 788: Pos(-1.354107, 0.942738, -9.747389) Norm(-0.666588, 0.088628, 0.740139) UV(0.371835, 0.001752) +V 789: Pos(-1.358469, 0.920745, -11.896939) Norm(-0.47233, 0.089647, -0.876851) UV(0.372807, 0.114662) +V 790: Pos(-1.540169, 0.738042, -9.747389) Norm(-0.173125, 0.657562, 0.73324) UV(0.480024, 0.808153) +V 791: Pos(-1.30143, 0.64362, -9.747389) Norm(0.44095, -0.620928, 0.648083) UV(0.477784, 0.794855) +V 792: Pos(-1.450541, 0.774199, -9.747389) Norm(-0.38048, 0.53656, 0.753219) UV(0.475964, 0.805106) +V 793: Pos(-1.235818, 0.718544, -9.747389) Norm(0.673684, -0.355174, 0.648075) UV(0.472633, 0.793941) +V 794: Pos(-1.384929, 0.849123, -9.747389) Norm(-0.585801, 0.31465, 0.746882) UV(0.470813, 0.804191) +V 795: Pos(-1.211802, 0.812158, -9.747389) Norm(0.730114, -0.092159, 0.677082) UV(0.467772, 0.795404) +V 796: Pos(-1.354107, 0.942738, -9.747389) Norm(-0.666588, 0.088628, 0.740139) UV(0.465767, 0.805348) +V 797: Pos(-1.211802, 2.842907, -13.273538) Norm(0.730107, 0.09216, -0.677089) UV(0.826002, 0.827818) +V 798: Pos(-1.372676, 2.805942, -13.273538) Norm(-0.573061, -0.306298, -0.760121) UV(0.829224, 0.835867) +V 799: Pos(-1.235818, 2.936522, -13.273538) Norm(0.673684, 0.355174, -0.648075) UV(0.830761, 0.826051) +V 800: Pos(-1.438288, 2.880866, -13.273538) Norm(-0.37887, -0.534987, -0.755147) UV(0.834422, 0.836455) +V 801: Pos(-1.30143, 3.011446, -13.273538) Norm(0.440952, 0.62092, -0.648089) UV(0.835959, 0.826639) +V 802: Pos(-1.527916, 2.917024, -13.273538) Norm(-0.172947, -0.656596, -0.734147) UV(0.838667, 0.83924) +V 803: Pos(-1.391057, 3.047603, -13.273538) Norm(0.187688, 0.711565, -0.677089) UV(0.840203, 0.829423) +V 804: Pos(-1.211802, 0.907723, -9.747389) Norm(0.707113, 0.0, 0.707101) UV(0.001616, 0.198663) +V 805: Pos(-1.211802, 2.842907, -13.273538) Norm(0.730107, 0.09216, -0.677089) UV(0.186825, 0.097004) +V 806: Pos(-1.211802, 2.842907, -10.086551) Norm(0.508425, 0.759336, 0.406094) UV(0.019425, 0.097014) +V 807: Pos(-1.354107, 1.264349, -13.273538) Norm(-0.569728, -0.522048, -0.634725) UV(0.817764, 0.458758) +V 808: Pos(-1.211802, 0.986717, -11.812522) Norm(0.944204, -0.182719, -0.27403) UV(0.739644, 0.451289) +V 809: Pos(-1.354107, 0.986717, -11.896939) Norm(-0.80126, -0.43962, -0.405852) UV(0.744001, 0.458809) +V 810: Pos(-1.937491, 0.53473, -9.747389) Norm(0.094021, -0.699077, 0.708838) UV(0.499957, 0.820493) +V 811: Pos(-2.039762, 0.671544, -9.747389) Norm(-0.094589, 0.703308, 0.704564) UV(0.496584, 0.828807) +V 812: Pos(-1.211802, 0.907723, -9.747389) Norm(0.707113, 0.0, 0.707101) UV(0.463476, 0.798) +V 813: Pos(-1.354107, 2.600502, -9.747389) Norm(-0.666644, 0.365527, 0.649596) UV(0.391239, 0.850379) +V 814: Pos(-1.354107, 1.031324, -9.747389) Norm(-0.706773, 0.000456, 0.70744) UV(0.461785, 0.807755) +V 815: Pos(-1.354107, 1.031324, -9.747389) Norm(-0.706773, 0.000456, 0.70744) UV(0.367181, 0.001745) +V 816: Pos(-1.354107, 2.712327, -13.273538) Norm(-0.679296, -0.088838, -0.728467) UV(0.278573, 0.186811) +V 817: Pos(-1.354107, 1.264349, -13.273538) Norm(-0.569728, -0.522048, -0.634725) UV(0.35463, 0.186939) +V 818: Pos(-1.960162, 0.680508, -11.812959) Norm(-0.17282, 0.364249, -0.915126) UV(0.966561, 0.543651) +V 819: Pos(-2.90103, 0.406478, -11.534469) Norm(-0.567982, -0.777306, -0.270538) UV(0.961975, 0.596966) +V 820: Pos(-2.90845, 0.554287, -11.684682) Norm(-0.620223, 0.246656, -0.744637) UV(0.972643, 0.593984) +V 821: Pos(-1.354107, 2.712327, -10.022182) Norm(-0.826831, 0.483627, 0.287152) UV(0.922883, 0.34009) +V 822: Pos(-1.211802, 2.600502, -9.747389) Norm(0.541346, 0.41941, 0.728725) UV(0.927388, 0.323404) +V 823: Pos(-1.211802, 2.842907, -10.086551) Norm(0.508425, 0.759336, 0.406094) UV(0.912226, 0.339203) +V 824: Pos(-1.30143, 3.011446, -10.431314) Norm(0.176249, 0.916875, 0.358156) UV(0.037533, 0.086706) +V 825: Pos(-1.235818, 2.936522, -13.273538) Norm(0.673684, 0.355174, -0.648075) UV(0.186824, 0.091927) +V 826: Pos(-1.30143, 3.011446, -13.273538) Norm(0.440952, 0.62092, -0.648089) UV(0.186824, 0.086696) +V 827: Pos(-1.354107, 2.712327, -10.022182) Norm(-0.826831, 0.483627, 0.287152) UV(0.278861, 0.01603) +V 828: Pos(-1.372676, 2.805942, -13.273538) Norm(-0.573061, -0.306298, -0.760121) UV(0.27356, 0.186803) +V 829: Pos(-1.450541, 2.880866, -10.436341) Norm(-0.884914, -0.110021, 0.452574) UV(0.2684, 0.037758) +V 830: Pos(-1.527916, 2.917024, -13.273538) Norm(-0.172947, -0.656596, -0.734147) UV(0.263253, 0.186763) +V 831: Pos(-1.438288, 2.880866, -13.273538) Norm(-0.37887, -0.534987, -0.755147) UV(0.268329, 0.186786) +V 832: Pos(-1.235818, 2.936522, -10.266152) Norm(0.384515, 0.845807, 0.369809) UV(0.028858, 0.091937) +V 833: Pos(-1.391057, 0.607463, -11.738725) Norm(0.183907, -0.906809, -0.37931) UV(0.106215, 0.21906) +V 834: Pos(-1.391057, 0.607463, -9.747389) Norm(0.187681, -0.711563, 0.677092) UV(0.001618, 0.219067) +V 835: Pos(-1.391057, 3.047603, -10.520164) Norm(-0.032411, 0.898742, 0.437279) UV(0.0422, 0.081629) +V 836: Pos(-1.391057, 3.047603, -13.273538) Norm(0.187688, 0.711565, -0.677089) UV(0.186824, 0.08162) +V 837: Pos(-1.384929, 2.805942, -10.252227) Norm(-0.929425, 0.240355, 0.279998) UV(0.273664, 0.028104) +V 838: Pos(-2.920704, 3.100779, -10.976743) Norm(-0.731182, -0.481386, 0.483364) UV(0.933324, 0.442214) +V 839: Pos(-1.391057, 3.047603, -10.520164) Norm(-0.032411, 0.898742, 0.437279) UV(0.902076, 0.364334) +V 840: Pos(-2.90103, 3.248588, -10.976743) Norm(-0.54833, 0.695713, 0.464022) UV(0.925809, 0.444421) +V 841: Pos(-1.540169, 2.917024, -10.525191) Norm(-0.50487, -0.532665, 0.679245) UV(0.911652, 0.368428) +V 842: Pos(-1.30143, 3.011446, -10.431314) Norm(0.176249, 0.916875, 0.358156) UV(0.902402, 0.357446) +V 843: Pos(-1.450541, 2.880866, -10.436341) Norm(-0.884914, -0.110021, 0.452574) UV(0.911977, 0.36154) +V 844: Pos(-1.235818, 2.936522, -10.266152) Norm(0.384515, 0.845807, 0.369809) UV(0.906181, 0.348047) +V 845: Pos(-1.384929, 2.805942, -10.252227) Norm(-0.929425, 0.240355, 0.279998) UV(0.916084, 0.351341) +V 846: Pos(-1.358469, 0.920745, -11.896939) Norm(-0.47233, 0.089647, -0.876851) UV(0.969365, 0.508402) +V 847: Pos(-1.211802, 0.986717, -11.812522) Norm(0.944204, -0.182719, -0.27403) UV(0.967825, 0.498987) +V 848: Pos(-1.211802, 0.812158, -11.812522) Norm(0.845644, -0.139628, -0.51516) UV(0.959932, 0.503652) +V 849: Pos(-1.235818, 0.718544, -11.798289) Norm(0.724486, -0.469669, -0.50451) UV(0.95597, 0.506913) +V 850: Pos(-1.372676, 0.849123, -11.896939) Norm(-0.409518, 0.096317, -0.907203) UV(0.966446, 0.510891) +V 851: Pos(-1.391057, 0.607463, -11.738725) Norm(0.183907, -0.906809, -0.37931) UV(0.952292, 0.516821) +V 852: Pos(-1.527916, 0.738042, -11.869441) Norm(-0.275405, 0.286312, -0.917702) UV(0.963718, 0.520731) +V 853: Pos(-1.438288, 0.774199, -11.883513) Norm(-0.411303, 0.165331, -0.896379) UV(0.964092, 0.515615) +V 854: Pos(-1.30143, 0.64362, -11.766311) Norm(0.458953, -0.776403, -0.431925) UV(0.953113, 0.511606) +V 855: Pos(-1.354107, 0.986717, -11.896939) Norm(-0.80126, -0.43962, -0.405852) UV(0.369334, 0.114656) +V 856: Pos(-1.211802, 0.986717, -11.812522) Norm(0.944204, -0.182719, -0.27403) UV(0.110089, 0.194507) +V 857: Pos(-1.211802, 0.812158, -9.747389) Norm(0.730114, -0.092159, 0.677082) UV(0.001617, 0.203683) +V 858: Pos(-2.039762, 0.671544, -9.747389) Norm(-0.094589, 0.703308, 0.704564) UV(0.413792, 0.001685) +V 859: Pos(-1.960162, 0.680508, -11.812959) Norm(-0.17282, 0.364249, -0.915126) UV(0.409846, 0.110191) +V 860: Pos(-1.937491, 0.53473, -9.747389) Norm(0.094021, -0.699077, 0.708838) UV(0.001619, 0.248022) +V 861: Pos(-1.354107, 1.264349, -13.273538) Norm(-0.569728, -0.522048, -0.634725) UV(0.762145, 0.881233) +V 862: Pos(-1.354107, 2.712327, -13.273538) Norm(-0.679296, -0.088838, -0.728467) UV(0.824629, 0.83787) +V 863: Pos(-1.211802, 1.264349, -13.273538) Norm(0.606356, -0.505019, -0.614238) UV(0.18683, 0.179919) +V 864: Pos(-1.354107, 2.600502, -9.747389) Norm(-0.666644, 0.365527, 0.649596) UV(0.284759, 0.001606) +V 865: Pos(-1.211802, 2.600502, -9.747389) Norm(0.541346, 0.41941, 0.728725) UV(0.001611, 0.109748) +V 866: Pos(-2.569841, 0.587375, -9.747389) Norm(-0.492723, 0.54084, 0.681701) UV(0.978174, 0.05737) +V 867: Pos(-2.90103, 0.406478, -10.437949) Norm(-0.650038, -0.739518, 0.174822) UV(0.985705, 0.098014) +V 868: Pos(-2.550167, 0.439566, -9.747389) Norm(-0.329892, -0.66041, 0.674559) UV(0.986006, 0.057292) +V 869: Pos(-2.550167, 0.439566, -9.747389) Norm(-0.329892, -0.66041, 0.674559) UV(0.520878, 0.845452) +V 870: Pos(-2.569841, 0.587375, -9.747389) Norm(-0.492723, 0.54084, 0.681701) UV(0.514767, 0.850351) +V 871: Pos(-2.90103, 0.406478, -10.437949) Norm(-0.650038, -0.739518, 0.174822) UV(0.037895, 0.299077) +V 872: Pos(-1.937491, 0.53473, -11.664807) Norm(0.072263, -0.921607, -0.381337) UV(0.102334, 0.248016) +V 873: Pos(-2.90845, 0.554287, -11.684682) Norm(-0.620223, 0.246656, -0.744637) UV(0.978276, 0.163542) +V 874: Pos(-2.919117, 0.554287, -10.437945) Norm(-0.805207, 0.567336, 0.172546) UV(0.977883, 0.098054) +V 875: Pos(-2.90845, 0.554287, -11.684682) Norm(-0.620223, 0.246656, -0.744637) UV(0.460078, 0.103333) +V 876: Pos(-2.919117, 0.554287, -10.437945) Norm(-0.805207, 0.567336, 0.172546) UV(0.460477, 0.037845) +V 877: Pos(-2.90103, 3.248588, -12.965064) Norm(-0.645204, 0.70327, -0.298535) UV(0.217681, 0.209698) +V 878: Pos(-2.601638, 3.059941, -13.273538) Norm(-0.361739, -0.598961, -0.714416) UV(0.24069, 0.200832) +V 879: Pos(-2.90845, 3.100779, -12.965064) Norm(-0.779486, -0.550852, -0.298266) UV(0.217763, 0.201925) +V 880: Pos(-2.920704, 3.100779, -10.976743) Norm(-0.731182, -0.481386, 0.483364) UV(0.113329, 0.20077) +V 881: Pos(-2.594218, 3.207749, -13.273538) Norm(-0.229169, 0.653962, -0.720982) UV(0.883146, 0.876547) +V 882: Pos(-2.601638, 3.059941, -13.273538) Norm(-0.361739, -0.598961, -0.714416) UV(0.876989, 0.881293) +V 883: Pos(-2.594218, 3.207749, -13.273538) Norm(-0.229169, 0.653962, -0.720982) UV(0.18682, 0.017865) +V 884: Pos(-2.90103, 3.248588, -12.965064) Norm(-0.645204, 0.70327, -0.298535) UV(0.170616, 0.001608) +V 885: Pos(-2.90845, 3.100779, -12.965064) Norm(-0.779486, -0.550852, -0.298266) UV(0.190177, 0.170212) +V 886: Pos(-2.601638, 3.059941, -13.273538) Norm(-0.361739, -0.598961, -0.714416) UV(0.206358, 0.186492) +V 887: Pos(1.211802, 0.812158, -11.812522) Norm(-0.845644, -0.139627, -0.515161) UV(0.11009, 0.203676) +V 888: Pos(1.235818, 0.718544, -9.747389) Norm(-0.673684, -0.355174, 0.648075) UV(0.001617, 0.208759) +V 889: Pos(1.211802, 0.812158, -9.747389) Norm(-0.730114, -0.092159, 0.677082) UV(0.001617, 0.203683) +V 890: Pos(1.235818, 0.718544, -11.798289) Norm(-0.724486, -0.469669, -0.504511) UV(0.109343, 0.208752) +V 891: Pos(1.30143, 0.64362, -9.747389) Norm(-0.44095, -0.620928, 0.648083) UV(0.001617, 0.21399) +V 892: Pos(1.527916, 0.738042, -11.869441) Norm(0.275405, 0.286313, -0.917702) UV(0.386948, 0.113213) +V 893: Pos(1.450541, 0.774199, -9.747389) Norm(0.38048, 0.53656, 0.753219) UV(0.382243, 0.001759) +V 894: Pos(1.540169, 0.738042, -9.747389) Norm(0.173125, 0.657562, 0.73324) UV(0.387319, 0.001748) +V 895: Pos(1.438288, 0.774199, -11.883513) Norm(0.411305, 0.165333, -0.896378) UV(0.381873, 0.113962) +V 896: Pos(1.384929, 0.849123, -9.747389) Norm(0.585801, 0.314651, 0.746882) UV(0.377011, 0.001761) +V 897: Pos(1.372676, 0.849123, -11.896939) Norm(0.409517, 0.096314, -0.907204) UV(0.376643, 0.11467) +V 898: Pos(1.354107, 0.942738, -9.747389) Norm(0.666588, 0.088628, 0.740139) UV(0.371835, 0.001752) +V 899: Pos(1.540169, 0.738042, -9.747389) Norm(0.173125, 0.657562, 0.73324) UV(0.480024, 0.808153) +V 900: Pos(1.30143, 0.64362, -9.747389) Norm(-0.44095, -0.620928, 0.648083) UV(0.477784, 0.794855) +V 901: Pos(1.391057, 0.607463, -9.747389) Norm(-0.187681, -0.711563, 0.677092) UV(0.481844, 0.797902) +V 902: Pos(1.450541, 0.774199, -9.747389) Norm(0.38048, 0.53656, 0.753219) UV(0.475964, 0.805106) +V 903: Pos(1.235818, 0.718544, -9.747389) Norm(-0.673684, -0.355174, 0.648075) UV(0.472633, 0.793941) +V 904: Pos(1.384929, 0.849123, -9.747389) Norm(0.585801, 0.314651, 0.746882) UV(0.470813, 0.804191) +V 905: Pos(1.211802, 0.812158, -9.747389) Norm(-0.730114, -0.092159, 0.677082) UV(0.467772, 0.795404) +V 906: Pos(1.211802, 2.842907, -13.273538) Norm(-0.730107, 0.09216, -0.677089) UV(0.826002, 0.827818) +V 907: Pos(1.372676, 2.805942, -13.273538) Norm(0.573061, -0.306298, -0.76012) UV(0.829224, 0.835867) +V 908: Pos(1.354107, 2.712327, -13.273538) Norm(0.679296, -0.088838, -0.728467) UV(0.824629, 0.83787) +V 909: Pos(1.235818, 2.936522, -13.273538) Norm(-0.673684, 0.355174, -0.648075) UV(0.830761, 0.826051) +V 910: Pos(1.438288, 2.880866, -13.273538) Norm(0.378941, -0.534938, -0.755146) UV(0.834422, 0.836455) +V 911: Pos(1.30143, 3.011446, -13.273538) Norm(-0.440951, 0.62092, -0.648089) UV(0.835959, 0.826639) +V 912: Pos(1.527916, 2.917024, -13.273538) Norm(0.172947, -0.656596, -0.734147) UV(0.838667, 0.83924) +V 913: Pos(1.211802, 0.907723, -9.747389) Norm(-0.707113, 0.0, 0.707101) UV(0.001616, 0.198663) +V 914: Pos(1.211802, 2.842907, -13.273538) Norm(-0.730107, 0.09216, -0.677089) UV(0.186825, 0.097004) +V 915: Pos(1.211802, 1.264349, -13.273538) Norm(-0.606356, -0.505019, -0.614238) UV(0.18683, 0.179919) +V 916: Pos(1.354107, 1.264349, -13.273538) Norm(0.569728, -0.522048, -0.634725) UV(0.817764, 0.458758) +V 917: Pos(1.211802, 0.986717, -11.812522) Norm(-0.944208, -0.182692, -0.274033) UV(0.739644, 0.451289) +V 918: Pos(1.211802, 1.264349, -13.273538) Norm(-0.606356, -0.505019, -0.614238) UV(0.817759, 0.451283) +V 919: Pos(1.937491, 0.53473, -9.747389) Norm(-0.09402, -0.699077, 0.708838) UV(0.499957, 0.820493) +V 920: Pos(1.211802, 0.907723, -9.747389) Norm(-0.707113, 0.0, 0.707101) UV(0.463476, 0.798) +V 921: Pos(1.354107, 2.600502, -9.747389) Norm(0.666644, 0.365506, 0.649608) UV(0.391239, 0.850379) +V 922: Pos(1.211802, 2.600502, -9.747389) Norm(-0.541346, 0.419416, 0.728722) UV(0.387374, 0.843982) +V 923: Pos(1.354107, 1.031324, -9.747389) Norm(0.706773, 0.000456, 0.70744) UV(0.367181, 0.001745) +V 924: Pos(1.354107, 2.712327, -13.273538) Norm(0.679296, -0.088838, -0.728467) UV(0.278573, 0.186811) +V 925: Pos(1.354107, 2.712327, -10.022182) Norm(0.82683, 0.483626, 0.287154) UV(0.278861, 0.01603) +V 926: Pos(1.960162, 0.680508, -11.812959) Norm(0.172806, 0.364179, -0.915156) UV(0.966561, 0.543651) +V 927: Pos(2.90103, 0.406478, -11.534469) Norm(0.567982, -0.777306, -0.27054) UV(0.961975, 0.596966) +V 928: Pos(1.937491, 0.53473, -11.664807) Norm(-0.072265, -0.921617, -0.381314) UV(0.955796, 0.545824) +V 929: Pos(1.354107, 2.712327, -10.022182) Norm(0.82683, 0.483626, 0.287154) UV(0.922883, 0.34009) +V 930: Pos(1.211802, 2.600502, -9.747389) Norm(-0.541346, 0.419416, 0.728722) UV(0.927388, 0.323404) +V 931: Pos(1.354107, 2.600502, -9.747389) Norm(0.666644, 0.365506, 0.649608) UV(0.933052, 0.328282) +V 932: Pos(1.30143, 3.011446, -10.431314) Norm(-0.176244, 0.916868, 0.358178) UV(0.037533, 0.086706) +V 933: Pos(1.235818, 2.936522, -13.273538) Norm(-0.673684, 0.355174, -0.648075) UV(0.186824, 0.091927) +V 934: Pos(1.235818, 2.936522, -10.266152) Norm(-0.384515, 0.845807, 0.369808) UV(0.028858, 0.091937) +V 935: Pos(1.372676, 2.805942, -13.273538) Norm(0.573061, -0.306298, -0.76012) UV(0.27356, 0.186803) +V 936: Pos(1.384929, 2.805942, -10.252227) Norm(0.929419, 0.240404, 0.279975) UV(0.273664, 0.028104) +V 937: Pos(1.450541, 2.880866, -10.436341) Norm(0.884914, -0.110021, 0.452574) UV(0.2684, 0.037758) +V 938: Pos(1.527916, 2.917024, -13.273538) Norm(0.172947, -0.656596, -0.734147) UV(0.263253, 0.186763) +V 939: Pos(1.540169, 2.917024, -10.525191) Norm(0.504872, -0.532664, 0.679244) UV(0.263303, 0.042402) +V 940: Pos(1.211802, 2.842907, -10.086551) Norm(-0.508424, 0.759338, 0.406092) UV(0.019425, 0.097014) +V 941: Pos(1.391057, 0.607463, -11.738725) Norm(-0.183858, -0.906817, -0.379315) UV(0.106215, 0.21906) +V 942: Pos(1.30143, 0.64362, -11.766311) Norm(-0.458951, -0.776403, -0.431928) UV(0.107663, 0.213984) +V 943: Pos(1.391057, 3.047603, -10.520164) Norm(0.03241, 0.898742, 0.437279) UV(0.0422, 0.081629) +V 944: Pos(1.30143, 3.011446, -13.273538) Norm(-0.440951, 0.62092, -0.648089) UV(0.186824, 0.086696) +V 945: Pos(1.438288, 2.880866, -13.273538) Norm(0.378941, -0.534938, -0.755146) UV(0.268329, 0.186786) +V 946: Pos(2.920704, 3.100779, -10.976743) Norm(0.731181, -0.481385, 0.483366) UV(0.933324, 0.442214) +V 947: Pos(1.391057, 3.047603, -10.520164) Norm(0.03241, 0.898742, 0.437279) UV(0.902076, 0.364334) +V 948: Pos(1.540169, 2.917024, -10.525191) Norm(0.504872, -0.532664, 0.679244) UV(0.911652, 0.368428) +V 949: Pos(1.30143, 3.011446, -10.431314) Norm(-0.176244, 0.916868, 0.358178) UV(0.902402, 0.357446) +V 950: Pos(1.450541, 2.880866, -10.436341) Norm(0.884914, -0.110021, 0.452574) UV(0.911977, 0.36154) +V 951: Pos(1.235818, 2.936522, -10.266152) Norm(-0.384515, 0.845807, 0.369808) UV(0.906181, 0.348047) +V 952: Pos(1.384929, 2.805942, -10.252227) Norm(0.929419, 0.240404, 0.279975) UV(0.916084, 0.351341) +V 953: Pos(1.211802, 2.842907, -10.086551) Norm(-0.508424, 0.759338, 0.406092) UV(0.912226, 0.339203) +V 954: Pos(1.358469, 0.920745, -11.896939) Norm(0.47233, 0.089646, -0.876851) UV(0.969365, 0.508402) +V 955: Pos(1.211802, 0.986717, -11.812522) Norm(-0.944208, -0.182692, -0.274033) UV(0.967825, 0.498987) +V 956: Pos(1.354107, 0.986717, -11.896939) Norm(0.80126, -0.43962, -0.405852) UV(0.972249, 0.506468) +V 957: Pos(1.235818, 0.718544, -11.798289) Norm(-0.724486, -0.469669, -0.504511) UV(0.95597, 0.506913) +V 958: Pos(1.211802, 0.812158, -11.812522) Norm(-0.845644, -0.139627, -0.515161) UV(0.959932, 0.503652) +V 959: Pos(1.391057, 0.607463, -11.738725) Norm(-0.183858, -0.906817, -0.379315) UV(0.952292, 0.516821) +V 960: Pos(1.438288, 0.774199, -11.883513) Norm(0.411305, 0.165333, -0.896378) UV(0.964092, 0.515615) +V 961: Pos(1.372676, 0.849123, -11.896939) Norm(0.409517, 0.096314, -0.907204) UV(0.966446, 0.510891) +V 962: Pos(1.30143, 0.64362, -11.766311) Norm(-0.458951, -0.776403, -0.431928) UV(0.953113, 0.511606) +V 963: Pos(1.354107, 1.031324, -9.747389) Norm(0.706773, 0.000456, 0.70744) UV(0.461785, 0.807755) +V 964: Pos(1.358469, 0.920745, -11.896939) Norm(0.47233, 0.089646, -0.876851) UV(0.372807, 0.114662) +V 965: Pos(1.354107, 0.986717, -11.896939) Norm(0.80126, -0.43962, -0.405852) UV(0.369334, 0.114656) +V 966: Pos(1.211802, 0.986717, -11.812522) Norm(-0.944208, -0.182692, -0.274033) UV(0.110089, 0.194507) +V 967: Pos(2.039762, 0.671544, -9.747389) Norm(0.094589, 0.703308, 0.704564) UV(0.413792, 0.001685) +V 968: Pos(1.937491, 0.53473, -9.747389) Norm(-0.09402, -0.699077, 0.708838) UV(0.001619, 0.248022) +V 969: Pos(1.937491, 0.53473, -11.664807) Norm(-0.072265, -0.921617, -0.381314) UV(0.102334, 0.248016) +V 970: Pos(1.354107, 1.264349, -13.273538) Norm(0.569728, -0.522048, -0.634725) UV(0.762145, 0.881233) +V 971: Pos(1.211802, 1.264349, -13.273538) Norm(-0.606356, -0.505019, -0.614238) UV(0.757883, 0.875092) +V 972: Pos(1.354107, 1.264349, -13.273538) Norm(0.569728, -0.522048, -0.634725) UV(0.35463, 0.186939) +V 973: Pos(1.354107, 2.600502, -9.747389) Norm(0.666644, 0.365506, 0.649608) UV(0.284759, 0.001606) +V 974: Pos(1.211802, 2.600502, -9.747389) Norm(-0.541346, 0.419416, 0.728722) UV(0.001611, 0.109748) +V 975: Pos(2.569841, 0.587375, -9.747389) Norm(0.492749, 0.540853, 0.681672) UV(0.978174, 0.05737) +V 976: Pos(2.90103, 0.406478, -10.437949) Norm(0.650038, -0.739518, 0.174822) UV(0.985705, 0.098014) +V 977: Pos(2.919117, 0.554287, -10.437945) Norm(0.805214, 0.567346, 0.172476) UV(0.977883, 0.098054) +V 978: Pos(2.550167, 0.439566, -9.747389) Norm(0.329893, -0.660411, 0.674558) UV(0.520878, 0.845452) +V 979: Pos(2.039762, 0.671544, -9.747389) Norm(0.094589, 0.703308, 0.704564) UV(0.496584, 0.828807) +V 980: Pos(2.90103, 0.406478, -10.437949) Norm(0.650038, -0.739518, 0.174822) UV(0.037895, 0.299077) +V 981: Pos(2.90845, 0.554287, -11.684682) Norm(0.620248, 0.246627, -0.744626) UV(0.978276, 0.163542) +V 982: Pos(2.90103, 0.406478, -11.534469) Norm(0.567982, -0.777306, -0.27054) UV(0.986006, 0.155608) +V 983: Pos(2.919117, 0.554287, -10.437945) Norm(0.805214, 0.567346, 0.172476) UV(0.460477, 0.037845) +V 984: Pos(1.960162, 0.680508, -11.812959) Norm(0.172806, 0.364179, -0.915156) UV(0.409846, 0.110191) +V 985: Pos(2.90103, 3.248588, -12.965064) Norm(0.645203, 0.703271, -0.298534) UV(0.217681, 0.209698) +V 986: Pos(2.601639, 3.059941, -13.273538) Norm(0.361759, -0.598984, -0.714386) UV(0.24069, 0.200832) +V 987: Pos(2.594218, 3.207749, -13.273538) Norm(0.229167, 0.653962, -0.720983) UV(0.240608, 0.208605) +V 988: Pos(2.920704, 3.100779, -10.976743) Norm(0.731181, -0.481385, 0.483366) UV(0.113329, 0.20077) +V 989: Pos(2.90103, 3.248588, -10.976743) Norm(0.54833, 0.695713, 0.464022) UV(0.113248, 0.208602) +V 990: Pos(2.594218, 3.207749, -13.273538) Norm(0.229167, 0.653962, -0.720983) UV(0.883146, 0.876547) +V 991: Pos(1.391057, 3.047603, -13.273538) Norm(-0.187688, 0.711565, -0.677089) UV(0.840203, 0.829423) +V 992: Pos(2.90103, 3.248588, -12.965064) Norm(0.645203, 0.703271, -0.298534) UV(0.170616, 0.001608) +V 993: Pos(2.594218, 3.207749, -13.273538) Norm(0.229167, 0.653962, -0.720983) UV(0.18682, 0.017865) +V 994: Pos(1.391057, 3.047603, -13.273538) Norm(-0.187688, 0.711565, -0.677089) UV(0.186824, 0.08162) +V 995: Pos(2.90845, 3.100779, -12.965064) Norm(0.779487, -0.550852, -0.298266) UV(0.190177, 0.170212) +V 996: Pos(2.920704, 3.100779, -10.976743) Norm(0.731181, -0.481385, 0.483366) UV(0.190037, 0.065771) +V 997: Pos(-0.0, 2.94145, -12.796803) Norm(-0.0, 0.992736, 0.120317) UV(0.750743, 0.730081) +V 998: Pos(-0.153924, 3.115416, -13.596885) Norm(-0.210619, 0.78314, -0.585091) UV(0.758739, 0.775065) +V 999: Pos(-0.110255, 2.926934, -12.796803) Norm(-0.258051, 0.958709, 0.119525) UV(0.744978, 0.732071) +V 1000: Pos(-0.303727, 3.053366, -13.596885) Norm(-0.40505, 0.702516, -0.585155) UV(0.750171, 0.777447) +V 1001: Pos(-0.212996, 2.884378, -12.796803) Norm(-0.496745, 0.859776, 0.118444) UV(0.739102, 0.733705) +V 1002: Pos(-0.432365, 2.954658, -13.596885) Norm(-0.572795, 0.573338, -0.585824) UV(0.741475, 0.779303) +V 1003: Pos(-0.301221, 2.81668, -12.796803) Norm(-0.702379, 0.702022, 0.117599) UV(0.733138, 0.734978) +V 1004: Pos(-0.531073, 2.82602, -13.596885) Norm(-0.701406, 0.405268, -0.586334) UV(0.732682, 0.780631) +V 1005: Pos(-0.368919, 2.728454, -12.796803) Norm(-0.860171, 0.496416, 0.116949) UV(0.727108, 0.735888) +V 1006: Pos(-0.593123, 2.676217, -13.596885) Norm(-0.782203, 0.209736, -0.586659) UV(0.723826, 0.781428) +V 1007: Pos(-0.411476, 2.625713, -12.796803) Norm(-0.959368, 0.256966, 0.11654) UV(0.721033, 0.736435) +V 1008: Pos(-0.614288, 2.515459, -13.596885) Norm(-0.809756, -1e-06, -0.586767) UV(0.714937, 0.781694) +V 1009: Pos(-0.425991, 2.515458, -12.796803) Norm(-0.993202, -3e-06, 0.116401) UV(0.714937, 0.736618) +V 1010: Pos(-0.593123, 2.3547, -13.596885) Norm(-0.782197, -0.20974, -0.586666) UV(0.706049, 0.781428) +V 1011: Pos(-0.411476, 2.405204, -12.796803) Norm(-0.959367, -0.25697, 0.11654) UV(0.708841, 0.736435) +V 1012: Pos(-0.531073, 2.204897, -13.596885) Norm(-0.7014, -0.405272, -0.586338) UV(0.697193, 0.780631) +V 1013: Pos(-0.368919, 2.302463, -12.796803) Norm(-0.860169, -0.496419, 0.116949) UV(0.702767, 0.735888) +V 1014: Pos(-0.432365, 2.076259, -13.596885) Norm(-0.572788, -0.573341, -0.585828) UV(0.6884, 0.779303) +V 1015: Pos(-0.301221, 2.214237, -12.796803) Norm(-0.702377, -0.702023, 0.117598) UV(0.696737, 0.734978) +V 1016: Pos(-0.303727, 1.977551, -13.596885) Norm(-0.405047, -0.702515, -0.585158) UV(0.679704, 0.777447) +V 1017: Pos(-0.212996, 2.146539, -12.796803) Norm(-0.496745, -0.859776, 0.118444) UV(0.690773, 0.733705) +V 1018: Pos(-0.153924, 1.915501, -13.596885) Norm(-0.210689, -0.783114, -0.585101) UV(0.671136, 0.775065) +V 1019: Pos(-0.110255, 2.103982, -12.796803) Norm(-0.258081, -0.958701, 0.119524) UV(0.684897, 0.732071) +V 1020: Pos(-0.0, 1.894336, -13.596885) Norm(0.0, -0.813019, -0.582237) UV(0.663078, 0.772295) +V 1021: Pos(-0.0, 2.089467, -12.796803) Norm(-0.0, -0.992736, 0.120312) UV(0.679132, 0.730081) +V 1022: Pos(-0.110255, 2.103982, -12.452584) Norm(-0.235141, -0.877547, -0.417876) UV(0.492294, 0.733549) +V 1023: Pos(-0.0, 2.089467, -12.796803) Norm(-0.0, -0.992736, 0.120312) UV(0.498392, 0.714671) +V 1024: Pos(-0.0, 2.089467, -12.452584) Norm(0.0, -0.908509, -0.417866) UV(0.498392, 0.733549) +V 1025: Pos(-0.212996, 2.146539, -12.452584) Norm(-0.454258, -0.786785, -0.417874) UV(0.486195, 0.733549) +V 1026: Pos(-0.110255, 2.103982, -12.796803) Norm(-0.258081, -0.958701, 0.119524) UV(0.492294, 0.714671) +V 1027: Pos(-0.301221, 2.214237, -12.452584) Norm(-0.642413, -0.642406, -0.417875) UV(0.480096, 0.733549) +V 1028: Pos(-0.212996, 2.146539, -12.796803) Norm(-0.496745, -0.859776, 0.118444) UV(0.486195, 0.714671) +V 1029: Pos(-0.368919, 2.302463, -12.452584) Norm(-0.786789, -0.454251, -0.417875) UV(0.473998, 0.733549) +V 1030: Pos(-0.301221, 2.214237, -12.796803) Norm(-0.702377, -0.702023, 0.117598) UV(0.480096, 0.714671) +V 1031: Pos(-0.411476, 2.405204, -12.452584) Norm(-0.877548, -0.235137, -0.417876) UV(0.467899, 0.733549) +V 1032: Pos(-0.368919, 2.302463, -12.796803) Norm(-0.860169, -0.496419, 0.116949) UV(0.473998, 0.714671) +V 1033: Pos(-0.425991, 2.515458, -12.452584) Norm(-0.908504, -0.0, -0.417877) UV(0.4618, 0.733549) +V 1034: Pos(-0.411476, 2.405204, -12.796803) Norm(-0.959367, -0.25697, 0.11654) UV(0.467899, 0.714671) +V 1035: Pos(-0.411476, 2.625713, -12.452584) Norm(-0.877548, 0.235139, -0.417875) UV(0.455702, 0.733549) +V 1036: Pos(-0.425991, 2.515458, -12.796803) Norm(-0.993202, -3e-06, 0.116401) UV(0.4618, 0.714671) +V 1037: Pos(-0.368919, 2.728454, -12.452584) Norm(-0.786787, 0.454254, -0.417875) UV(0.449603, 0.733549) +V 1038: Pos(-0.411476, 2.625713, -12.796803) Norm(-0.959368, 0.256966, 0.11654) UV(0.455702, 0.714671) +V 1039: Pos(-0.301221, 2.81668, -12.452584) Norm(-0.64241, 0.642409, -0.417876) UV(0.443504, 0.733549) +V 1040: Pos(-0.368919, 2.728454, -12.796803) Norm(-0.860171, 0.496416, 0.116949) UV(0.449603, 0.714671) +V 1041: Pos(-0.212996, 2.884378, -12.452584) Norm(-0.454249, 0.786789, -0.417876) UV(0.437405, 0.733549) +V 1042: Pos(-0.301221, 2.81668, -12.796803) Norm(-0.702379, 0.702022, 0.117599) UV(0.443504, 0.714671) +V 1043: Pos(-0.110255, 2.926934, -12.452584) Norm(-0.235139, 0.877548, -0.417875) UV(0.431307, 0.733549) +V 1044: Pos(-0.212996, 2.884378, -12.796803) Norm(-0.496745, 0.859776, 0.118444) UV(0.437405, 0.714671) +V 1045: Pos(-0.0, 2.94145, -12.452584) Norm(0.0, 0.9085, -0.417886) UV(0.425208, 0.733549) +V 1046: Pos(-0.110255, 2.926934, -12.796803) Norm(-0.258051, 0.958709, 0.119525) UV(0.431307, 0.714671) +V 1047: Pos(-0.0, 2.716209, -9.439158) Norm(-0.0, 0.537507, 0.843259) UV(0.833395, 0.962597) +V 1048: Pos(-1.054109, 2.809578, -9.639683) Norm(-0.661542, 0.732178, 0.162102) UV(0.891204, 0.950466) +V 1049: Pos(-1.054109, 2.716209, -9.439158) Norm(-0.6038, 0.428489, 0.672178) UV(0.891204, 0.962597) +V 1050: Pos(-0.415949, 2.099509, -12.305865) Norm(-0.410216, -0.734467, -0.54063) UV(0.946673, 0.681696) +V 1051: Pos(-0.29412, 2.006027, -10.837623) Norm(-0.339136, -0.587407, -0.734806) UV(0.938252, 0.601175) +V 1052: Pos(-0.415949, 2.099509, -10.837623) Norm(-0.246604, -0.726493, -0.6414) UV(0.946673, 0.601175) +V 1053: Pos(-0.29412, 2.006027, -12.305865) Norm(-0.45981, -0.796419, -0.3928) UV(0.938252, 0.681696) +V 1054: Pos(-0.152248, 1.947261, -10.837623) Norm(-0.175546, -0.655152, -0.73482) UV(0.92983, 0.601175) +V 1055: Pos(-0.152248, 1.947261, -12.305865) Norm(-0.238014, -0.88829, -0.392798) UV(0.92983, 0.681696) +V 1056: Pos(-0.0, 1.927217, -10.837623) Norm(0.0, -0.678286, -0.734798) UV(0.921409, 0.601175) +V 1057: Pos(-0.415949, 2.931407, -12.305865) Norm(-0.650275, 0.650272, -0.392797) UV(0.270609, 0.823727) +V 1058: Pos(-0.509431, 2.809578, -9.639683) Norm(-0.068104, 0.951392, 0.300359) UV(0.416827, 0.815306) +V 1059: Pos(-0.415949, 2.931407, -9.90133) Norm(-0.447969, 0.865311, 0.224858) UV(0.402478, 0.823727) +V 1060: Pos(-0.29412, 3.024889, -12.305865) Norm(-0.459814, 0.796418, -0.392797) UV(0.270609, 0.832149) +V 1061: Pos(-0.29412, 3.024889, -10.102099) Norm(-0.319878, 0.924727, 0.206294) UV(0.391467, 0.832149) +V 1062: Pos(-0.152248, 3.083655, -12.305865) Norm(-0.23802, 0.888289, -0.392797) UV(0.270609, 0.84057) +V 1063: Pos(-0.152248, 3.083655, -10.228309) Norm(-0.173162, 0.966948, 0.187151) UV(0.384546, 0.84057) +V 1064: Pos(-0.0, 3.103699, -12.305865) Norm(0.0, 0.919624, -0.3928) UV(0.270609, 0.848992) +V 1065: Pos(-0.0, 3.103699, -10.271356) Norm(-0.0, 0.984384, 0.176035) UV(0.382185, 0.848992) +V 1066: Pos(-0.480126, 2.234312, -13.596885) Norm(0.509256, 0.294239, -0.808753) UV(0.888654, 0.471901) +V 1067: Pos(-0.349913, 2.4217, -12.785554) Norm(0.948453, 0.254044, -0.189469) UV(0.843732, 0.48278) +V 1068: Pos(-0.313723, 2.334331, -12.785554) Norm(0.850358, 0.490756, -0.189867) UV(0.843261, 0.477615) +V 1069: Pos(-0.593123, 2.676217, -13.596885) Norm(-0.782203, 0.209736, -0.586659) UV(0.128572, 0.929979) +V 1070: Pos(-0.480126, 2.796605, -13.596885) Norm(0.509252, -0.29424, -0.808756) UV(0.135175, 0.936176) +V 1071: Pos(-0.536299, 2.660991, -13.596885) Norm(0.568388, -0.152402, -0.808523) UV(0.127737, 0.933095) +V 1072: Pos(-0.303727, 1.977551, -13.596885) Norm(-0.405047, -0.702515, -0.585158) UV(0.090257, 0.94585) +V 1073: Pos(-0.390767, 2.117857, -13.596885) Norm(0.415336, 0.415717, -0.80912) UV(0.097951, 0.941077) +V 1074: Pos(-0.274312, 2.028498, -13.596885) Norm(0.293201, 0.50851, -0.809599) UV(0.093051, 0.947463) +V 1075: Pos(-0.432365, 2.954658, -13.596885) Norm(-0.572795, 0.573338, -0.585824) UV(0.143843, 0.938795) +V 1076: Pos(-0.274312, 3.002419, -13.596885) Norm(0.293205, -0.50851, -0.809598) UV(0.146462, 0.947463) +V 1077: Pos(-0.390767, 2.91306, -13.596885) Norm(0.415331, -0.415719, -0.809122) UV(0.141561, 0.941077) +V 1078: Pos(-0.531073, 2.204897, -13.596885) Norm(-0.7014, -0.405272, -0.586338) UV(0.102725, 0.933382) +V 1079: Pos(-0.536299, 2.369926, -13.596885) Norm(0.568394, 0.152402, -0.808518) UV(0.111775, 0.933095) +V 1080: Pos(-0.480126, 2.234312, -13.596885) Norm(0.509256, 0.294239, -0.808753) UV(0.104338, 0.936176) +V 1081: Pos(-0.153924, 3.115416, -13.596885) Norm(-0.210619, 0.78314, -0.585091) UV(0.152659, 0.954065) +V 1082: Pos(-0.0, 3.077752, -13.596885) Norm(-0.0, -0.584046, -0.811721) UV(0.150593, 0.962507) +V 1083: Pos(-0.138698, 3.058592, -13.596885) Norm(0.152737, -0.56666, -0.809671) UV(0.149542, 0.9549) +V 1084: Pos(-0.614288, 2.515459, -13.596885) Norm(-0.809756, -1e-06, -0.586767) UV(0.119756, 0.928818) +V 1085: Pos(-0.555459, 2.515459, -13.596885) Norm(0.588571, 0.0, -0.808446) UV(0.119756, 0.932045) +V 1086: Pos(-0.153924, 1.915501, -13.596885) Norm(-0.210689, -0.783114, -0.585101) UV(0.086854, 0.954065) +V 1087: Pos(-0.138698, 1.972325, -13.596885) Norm(0.152631, 0.5667, -0.809664) UV(0.08997, 0.9549) +V 1088: Pos(-0.531073, 2.82602, -13.596885) Norm(-0.701406, 0.405268, -0.586334) UV(0.136788, 0.933382) +V 1089: Pos(-0.432365, 2.076259, -13.596885) Norm(-0.572788, -0.573341, -0.585828) UV(0.09567, 0.938795) +V 1090: Pos(-0.303727, 3.053366, -13.596885) Norm(-0.40505, 0.702516, -0.585155) UV(0.149256, 0.94585) +V 1091: Pos(-0.593123, 2.3547, -13.596885) Norm(-0.782197, -0.20974, -0.586666) UV(0.11094, 0.929979) +V 1092: Pos(-0.0, 1.894336, -13.596885) Norm(0.0, -0.813019, -0.582237) UV(0.085693, 0.962507) +V 1093: Pos(-0.0, 1.953165, -13.596885) Norm(-0.0, 0.584026, -0.811735) UV(0.088919, 0.962507) +V 1094: Pos(-0.138698, 3.058592, -13.596885) Norm(0.152737, -0.56666, -0.809671) UV(0.883561, 0.527603) +V 1095: Pos(-0.0, 2.877715, -12.785554) Norm(0.0, -0.981229, -0.192847) UV(0.83827, 0.518398) +V 1096: Pos(-0.093759, 2.865371, -12.785554) Norm(0.255178, -0.94756, -0.192393) UV(0.83998, 0.513502) +V 1097: Pos(-0.390767, 2.117857, -13.596885) Norm(0.415336, 0.415717, -0.80912) UV(0.887439, 0.463943) +V 1098: Pos(-0.256154, 2.259305, -12.785554) Norm(0.694333, 0.693982, -0.190499) UV(0.842478, 0.472489) +V 1099: Pos(-0.274312, 3.002419, -13.596885) Norm(0.293205, -0.50851, -0.809598) UV(0.88574, 0.519854) +V 1100: Pos(-0.181128, 2.829182, -12.785554) Norm(0.491024, -0.849877, -0.191324) UV(0.841384, 0.508509) +V 1101: Pos(-0.274312, 2.028498, -13.596885) Norm(0.293201, 0.50851, -0.809599) UV(0.88574, 0.456074) +V 1102: Pos(-0.181128, 2.201735, -12.785554) Norm(0.491023, 0.849877, -0.191324) UV(0.841384, 0.467419) +V 1103: Pos(-0.390767, 2.91306, -13.596885) Norm(0.415331, -0.415719, -0.809122) UV(0.887439, 0.511985) +V 1104: Pos(-0.256154, 2.771612, -12.785554) Norm(0.694331, -0.693984, -0.1905) UV(0.842478, 0.50344) +V 1105: Pos(-0.138698, 1.972325, -13.596885) Norm(0.152631, 0.5667, -0.809664) UV(0.883561, 0.448325) +V 1106: Pos(-0.093759, 2.165546, -12.785554) Norm(0.25516, 0.947562, -0.192403) UV(0.83998, 0.462426) +V 1107: Pos(-0.480126, 2.796605, -13.596885) Norm(0.509252, -0.29424, -0.808756) UV(0.888654, 0.504027) +V 1108: Pos(-0.313723, 2.696587, -12.785554) Norm(0.850358, -0.490757, -0.189867) UV(0.843261, 0.498313) +V 1109: Pos(-0.0, 1.953165, -13.596885) Norm(-0.0, 0.584026, -0.811735) UV(0.881039, 0.441072) +V 1110: Pos(-0.0, 2.153202, -12.785554) Norm(-0.0, 0.981186, -0.193065) UV(0.83827, 0.45753) +V 1111: Pos(-0.536299, 2.660991, -13.596885) Norm(0.568388, -0.152402, -0.808523) UV(0.889384, 0.49601) +V 1112: Pos(-0.349913, 2.609217, -12.785554) Norm(0.948453, -0.254042, -0.189469) UV(0.843732, 0.493148) +V 1113: Pos(-0.555459, 2.515459, -13.596885) Norm(0.588571, 0.0, -0.808446) UV(0.889627, 0.487964) +V 1114: Pos(-0.362256, 2.515459, -12.785554) Norm(0.981913, -0.0, -0.189333) UV(0.843888, 0.487964) +V 1115: Pos(-0.536299, 2.369926, -13.596885) Norm(0.568394, 0.152402, -0.808518) UV(0.889384, 0.479918) +V 1116: Pos(-0.0, 2.153202, -12.785554) Norm(-0.0, 0.981186, -0.193065) UV(0.766266, 0.927105) +V 1117: Pos(-0.055972, 2.306568, -11.791429) Norm(0.177392, 0.662085, -0.728131) UV(0.750804, 0.874063) +V 1118: Pos(-0.0, 2.299199, -11.791429) Norm(-0.0, 0.685431, -0.728137) UV(0.753833, 0.873422) +V 1119: Pos(-0.093759, 2.865371, -12.785554) Norm(0.255178, -0.94756, -0.192393) UV(0.709638, 0.928179) +V 1120: Pos(-0.0, 2.731718, -11.791429) Norm(-2e-06, -0.685453, -0.728117) UV(0.716998, 0.873422) +V 1121: Pos(-0.055972, 2.724349, -11.791429) Norm(0.17739, -0.662071, -0.728144) UV(0.720026, 0.874063) +V 1122: Pos(-0.256154, 2.259305, -12.785554) Norm(0.694333, 0.693982, -0.190499) UV(0.750941, 0.929746) +V 1123: Pos(-0.187286, 2.407329, -11.791429) Norm(0.593593, 0.342714, -0.728145) UV(0.741602, 0.875292) +V 1124: Pos(-0.152919, 2.36254, -11.791429) Norm(0.484688, 0.484689, -0.728116) UV(0.744684, 0.874999) +V 1125: Pos(-0.181128, 2.829182, -12.785554) Norm(0.491024, -0.849877, -0.191324) UV(0.714748, 0.92906) +V 1126: Pos(-0.10813, 2.702745, -11.791429) Norm(0.342702, -0.593606, -0.728139) UV(0.723078, 0.874589) +V 1127: Pos(-0.181128, 2.201735, -12.785554) Norm(0.491023, 0.849877, -0.191324) UV(0.756082, 0.92906) +V 1128: Pos(-0.10813, 2.328172, -11.791429) Norm(0.342672, 0.593608, -0.728152) UV(0.747753, 0.874589) +V 1129: Pos(-0.256154, 2.771612, -12.785554) Norm(0.694331, -0.693984, -0.1905) UV(0.719889, 0.929746) +V 1130: Pos(-0.152919, 2.668377, -11.791429) Norm(0.484679, -0.484673, -0.728133) UV(0.726146, 0.874999) +V 1131: Pos(-0.093759, 2.165546, -12.785554) Norm(0.25516, 0.947562, -0.192403) UV(0.761193, 0.928179) +V 1132: Pos(-0.313723, 2.696587, -12.785554) Norm(0.850358, -0.490757, -0.189867) UV(0.725052, 0.930237) +V 1133: Pos(-0.187286, 2.623588, -11.791429) Norm(0.593595, -0.342711, -0.728145) UV(0.729228, 0.875292) +V 1134: Pos(-0.0, 3.103699, -10.271356) Norm(-0.0, 0.984384, 0.176035) UV(0.833395, 0.912253) +V 1135: Pos(-0.29412, 3.024889, -10.102099) Norm(-0.319878, 0.924727, 0.206294) UV(0.849525, 0.922492) +V 1136: Pos(-0.75615, 2.809578, -12.305865) Norm(-0.423806, 0.60468, -0.674352) UV(0.441983, 0.930944) +V 1137: Pos(-1.054109, 2.099509, -11.686933) Norm(-0.7322, -0.66028, -0.167073) UV(0.480924, 0.968615) +V 1138: Pos(-1.054109, 2.809578, -11.686933) Norm(-0.732207, 0.660275, -0.167065) UV(0.441983, 0.968615) +V 1139: Pos(-0.509431, 2.809578, -12.305865) Norm(-0.519489, 0.61734, -0.590781) UV(0.362136, 0.881585) +V 1140: Pos(-0.75615, 2.809578, -12.305865) Norm(-0.423806, 0.60468, -0.674352) UV(0.362136, 0.868054) +V 1141: Pos(-1.054109, 2.809578, -11.686933) Norm(-0.732207, 0.660275, -0.167065) UV(0.396079, 0.851714) +V 1142: Pos(-0.75615, 2.809578, -12.305865) Norm(-0.423806, 0.60468, -0.674352) UV(0.588577, 0.161869) +V 1143: Pos(-0.509431, 2.809578, -12.305865) Norm(-0.519489, 0.61734, -0.590781) UV(0.588577, 0.148339) +V 1144: Pos(-0.568196, 2.667706, -12.305865) Norm(-0.322093, 0.086303, -0.942766) UV(0.596357, 0.151562) +V 1145: Pos(-1.054109, 2.809578, -11.686933) Norm(-0.732207, 0.660275, -0.167065) UV(0.470075, 0.020881) +V 1146: Pos(-1.054109, 2.099509, -10.837623) Norm(-0.904535, -0.301505, -0.301516) UV(0.509016, 0.067458) +V 1147: Pos(-1.054109, 2.809578, -9.639683) Norm(-0.661542, 0.732178, 0.162102) UV(0.470075, 0.133155) +V 1148: Pos(-0.415949, 2.099509, -10.837623) Norm(-0.246604, -0.726493, -0.6414) UV(0.917345, 0.596041) +V 1149: Pos(-1.054109, 2.099509, -10.837623) Norm(-0.904535, -0.301505, -0.301516) UV(0.882347, 0.596041) +V 1150: Pos(-1.054109, 2.099509, -11.686933) Norm(-0.7322, -0.66028, -0.167073) UV(0.882347, 0.549464) +V 1151: Pos(-0.0, 0.767715, -12.796803) Norm(0.0, -0.992736, 0.120317) UV(0.857989, 0.722637) +V 1152: Pos(-0.153924, 0.593748, -13.596885) Norm(-0.210744, -0.783101, -0.585099) UV(0.813004, 0.714641) +V 1153: Pos(-0.0, 0.572584, -13.596885) Norm(0.0, -0.813113, -0.582106) UV(0.815774, 0.706583) +V 1154: Pos(-0.110255, 0.78223, -12.796803) Norm(-0.258072, -0.958703, 0.119528) UV(0.855998, 0.728401) +V 1155: Pos(-0.303727, 0.655798, -13.596885) Norm(-0.405055, -0.702514, -0.585153) UV(0.810623, 0.723208) +V 1156: Pos(-0.212996, 0.824787, -12.796803) Norm(-0.496745, -0.859776, 0.118445) UV(0.854365, 0.734277) +V 1157: Pos(-0.432365, 0.754506, -13.596885) Norm(-0.572797, -0.573337, -0.585823) UV(0.808766, 0.731905) +V 1158: Pos(-0.301221, 0.892484, -12.796803) Norm(-0.702376, -0.702024, 0.117599) UV(0.853092, 0.740242) +V 1159: Pos(-0.531073, 0.883145, -13.596885) Norm(-0.701405, -0.405267, -0.586336) UV(0.807439, 0.740697) +V 1160: Pos(-0.368919, 0.98071, -12.796803) Norm(-0.860171, -0.496416, 0.116949) UV(0.852181, 0.746272) +V 1161: Pos(-0.593123, 1.032948, -13.596885) Norm(-0.782203, -0.209736, -0.58666) UV(0.806641, 0.749554) +V 1162: Pos(-0.411476, 1.083451, -12.796803) Norm(-0.959368, -0.256966, 0.11654) UV(0.851634, 0.752346) +V 1163: Pos(-0.614288, 1.193706, -13.596885) Norm(-0.809756, 1e-06, -0.586767) UV(0.806376, 0.758442) +V 1164: Pos(-0.425991, 1.193706, -12.796803) Norm(-0.993202, 3e-06, 0.116401) UV(0.851452, 0.758442) +V 1165: Pos(-0.593123, 1.354464, -13.596885) Norm(-0.782201, 0.209738, -0.586661) UV(0.806641, 0.76733) +V 1166: Pos(-0.411476, 1.303961, -12.796803) Norm(-0.959367, 0.256969, 0.11654) UV(0.851634, 0.764538) +V 1167: Pos(-0.531073, 1.504267, -13.596885) Norm(-0.701404, 0.40527, -0.586335) UV(0.807439, 0.776187) +V 1168: Pos(-0.368919, 1.406702, -12.796803) Norm(-0.860168, 0.496422, 0.116949) UV(0.852181, 0.770612) +V 1169: Pos(-0.432365, 1.632905, -13.596885) Norm(-0.572796, 0.573337, -0.585824) UV(0.808766, 0.78498) +V 1170: Pos(-0.301221, 1.494927, -12.796803) Norm(-0.702375, 0.702026, 0.117598) UV(0.853092, 0.776643) +V 1171: Pos(-0.303727, 1.731613, -13.596885) Norm(-0.405058, 0.702511, -0.585156) UV(0.810623, 0.793676) +V 1172: Pos(-0.212996, 1.562625, -12.796803) Norm(-0.496745, 0.859776, 0.118444) UV(0.854365, 0.782607) +V 1173: Pos(-0.153924, 1.793664, -13.596885) Norm(-0.210608, 0.783139, -0.585096) UV(0.813004, 0.802243) +V 1174: Pos(-0.110255, 1.605182, -12.796803) Norm(-0.258081, 0.958701, 0.119524) UV(0.855998, 0.788483) +V 1175: Pos(-0.0, 1.814828, -13.596885) Norm(0.0, 0.813018, -0.582239) UV(0.815774, 0.810301) +V 1176: Pos(-0.110255, 1.605182, -12.452584) Norm(-0.23514, 0.877547, -0.417876) UV(0.490229, 0.951961) +V 1177: Pos(-0.0, 1.619697, -12.796803) Norm(0.0, 0.992736, 0.120312) UV(0.48413, 0.933084) +V 1178: Pos(-0.110255, 1.605182, -12.796803) Norm(-0.258081, 0.958701, 0.119524) UV(0.490229, 0.933084) +V 1179: Pos(-0.212996, 1.562625, -12.452584) Norm(-0.454256, 0.786785, -0.417876) UV(0.496328, 0.951961) +V 1180: Pos(-0.212996, 1.562625, -12.796803) Norm(-0.496745, 0.859776, 0.118444) UV(0.496328, 0.933084) +V 1181: Pos(-0.301221, 1.494927, -12.452584) Norm(-0.642411, 0.642407, -0.417876) UV(0.502426, 0.951961) +V 1182: Pos(-0.301221, 1.494927, -12.796803) Norm(-0.702375, 0.702026, 0.117598) UV(0.502426, 0.933084) +V 1183: Pos(-0.368919, 1.406702, -12.452584) Norm(-0.786787, 0.454253, -0.417876) UV(0.508525, 0.951961) +V 1184: Pos(-0.368919, 1.406702, -12.796803) Norm(-0.860168, 0.496422, 0.116949) UV(0.508525, 0.933084) +V 1185: Pos(-0.411476, 1.303961, -12.452584) Norm(-0.877548, 0.235135, -0.417876) UV(0.514624, 0.951961) +V 1186: Pos(-0.411476, 1.303961, -12.796803) Norm(-0.959367, 0.256969, 0.11654) UV(0.514624, 0.933084) +V 1187: Pos(-0.425991, 1.193706, -12.452584) Norm(-0.908504, -3e-06, -0.417876) UV(0.520722, 0.951961) +V 1188: Pos(-0.425991, 1.193706, -12.796803) Norm(-0.993202, 3e-06, 0.116401) UV(0.520722, 0.933084) +V 1189: Pos(-0.411476, 1.083451, -12.452584) Norm(-0.877546, -0.235141, -0.417877) UV(0.526821, 0.951961) +V 1190: Pos(-0.411476, 1.083451, -12.796803) Norm(-0.959368, -0.256966, 0.11654) UV(0.526821, 0.933084) +V 1191: Pos(-0.368919, 0.98071, -12.452584) Norm(-0.786785, -0.454257, -0.417876) UV(0.53292, 0.951961) +V 1192: Pos(-0.368919, 0.98071, -12.796803) Norm(-0.860171, -0.496416, 0.116949) UV(0.53292, 0.933084) +V 1193: Pos(-0.301221, 0.892485, -12.452584) Norm(-0.642406, -0.642412, -0.417876) UV(0.539018, 0.951961) +V 1194: Pos(-0.301221, 0.892484, -12.796803) Norm(-0.702376, -0.702024, 0.117599) UV(0.539018, 0.933084) +V 1195: Pos(-0.212996, 0.824787, -12.452584) Norm(-0.454251, -0.786788, -0.417876) UV(0.545117, 0.951961) +V 1196: Pos(-0.212996, 0.824787, -12.796803) Norm(-0.496745, -0.859776, 0.118445) UV(0.545117, 0.933084) +V 1197: Pos(-0.110255, 0.78223, -12.452584) Norm(-0.235138, -0.877547, -0.417876) UV(0.551216, 0.951961) +V 1198: Pos(-0.110255, 0.78223, -12.796803) Norm(-0.258072, -0.958703, 0.119528) UV(0.551216, 0.933084) +V 1199: Pos(-0.0, 0.767715, -12.452584) Norm(0.0, -0.908503, -0.417878) UV(0.557315, 0.951961) +V 1200: Pos(-0.0, 0.767715, -12.796803) Norm(0.0, -0.992736, 0.120317) UV(0.557315, 0.933084) +V 1201: Pos(-0.0, 0.992955, -9.439158) Norm(-0.0, -0.53751, 0.843257) UV(0.961411, 0.95831) +V 1202: Pos(-1.054109, 0.899586, -9.639683) Norm(-0.661533, -0.732186, 0.162104) UV(0.903602, 0.946179) +V 1203: Pos(-0.509431, 0.899586, -9.639683) Norm(-0.068104, -0.951392, 0.300359) UV(0.933473, 0.946179) +V 1204: Pos(-0.415949, 1.609655, -12.305865) Norm(-0.41022, 0.734466, -0.540629) UV(0.920557, 0.596041) +V 1205: Pos(-0.29412, 1.703137, -10.837625) Norm(-0.339145, 0.587416, -0.734795) UV(0.928978, 0.51552) +V 1206: Pos(-0.29412, 1.703137, -12.305865) Norm(-0.459813, 0.796418, -0.392798) UV(0.928978, 0.596041) +V 1207: Pos(-0.152248, 1.761903, -10.837625) Norm(-0.175555, 0.655165, -0.734806) UV(0.9374, 0.51552) +V 1208: Pos(-0.152248, 1.761903, -12.305865) Norm(-0.238019, 0.888288, -0.392799) UV(0.9374, 0.596041) +V 1209: Pos(-0.0, 1.781947, -10.837625) Norm(0.0, 0.678276, -0.734807) UV(0.945821, 0.51552) +V 1210: Pos(-0.0, 1.781947, -12.305865) Norm(0.0, 0.919622, -0.392805) UV(0.945821, 0.596041) +V 1211: Pos(-0.415949, 0.777757, -12.305865) Norm(-0.650273, -0.650273, -0.392797) UV(0.121331, 0.840574) +V 1212: Pos(-0.509431, 0.899586, -9.639683) Norm(-0.068104, -0.951392, 0.300359) UV(0.267548, 0.848995) +V 1213: Pos(-0.509431, 0.899586, -12.305865) Norm(-0.519488, -0.617342, -0.59078) UV(0.121331, 0.848995) +V 1214: Pos(-0.29412, 0.684275, -12.305865) Norm(-0.459812, -0.796419, -0.392798) UV(0.121331, 0.832152) +V 1215: Pos(-0.415949, 0.777757, -9.90133) Norm(-0.447969, -0.865311, 0.224858) UV(0.253199, 0.840574) +V 1216: Pos(-0.152248, 0.625509, -12.305865) Norm(-0.23802, -0.888289, -0.392797) UV(0.121331, 0.823731) +V 1217: Pos(-0.29412, 0.684275, -10.102099) Norm(-0.319877, -0.924728, 0.206293) UV(0.242189, 0.832152) +V 1218: Pos(-0.0, 0.605465, -12.305865) Norm(0.0, -0.919628, -0.392791) UV(0.121331, 0.815309) +V 1219: Pos(-0.152248, 0.62551, -10.228309) Norm(-0.173159, -0.966951, 0.187143) UV(0.235267, 0.823731) +V 1220: Pos(-0.480126, 1.474853, -13.596885) Norm(0.509247, -0.294241, -0.808758) UV(0.032921, 0.891816) +V 1221: Pos(-0.349913, 1.287465, -12.785554) Norm(0.948453, -0.254044, -0.189469) UV(0.043801, 0.846894) +V 1222: Pos(-0.536299, 1.339238, -13.596885) Norm(0.568385, -0.152403, -0.808524) UV(0.040938, 0.892546) +V 1223: Pos(-0.593123, 1.032948, -13.596885) Norm(-0.782203, -0.209736, -0.58666) UV(0.575026, 0.772897) +V 1224: Pos(-0.480126, 0.912559, -13.596885) Norm(0.509248, 0.294239, -0.808758) UV(0.581629, 0.7667) +V 1225: Pos(-0.531073, 0.883145, -13.596885) Norm(-0.701405, -0.405267, -0.586336) UV(0.583242, 0.769494) +V 1226: Pos(-0.303727, 1.731613, -13.596885) Norm(-0.405058, 0.702511, -0.585156) UV(0.53671, 0.757026) +V 1227: Pos(-0.390767, 1.591307, -13.596885) Norm(0.415326, -0.41572, -0.809124) UV(0.544405, 0.761799) +V 1228: Pos(-0.432365, 1.632905, -13.596885) Norm(-0.572796, 0.573337, -0.585824) UV(0.542124, 0.76408) +V 1229: Pos(-0.432365, 0.754506, -13.596885) Norm(-0.572797, -0.573337, -0.585823) UV(0.590296, 0.76408) +V 1230: Pos(-0.274312, 0.706745, -13.596885) Norm(0.2932, 0.508511, -0.809599) UV(0.592916, 0.755413) +V 1231: Pos(-0.303727, 0.655798, -13.596885) Norm(-0.405055, -0.702514, -0.585153) UV(0.59571, 0.757026) +V 1232: Pos(-0.531073, 1.504267, -13.596885) Norm(-0.701404, 0.40527, -0.586335) UV(0.549179, 0.769494) +V 1233: Pos(-0.536299, 1.339238, -13.596885) Norm(0.568385, -0.152403, -0.808524) UV(0.558229, 0.76978) +V 1234: Pos(-0.593123, 1.354464, -13.596885) Norm(-0.782201, 0.209738, -0.586661) UV(0.557394, 0.772897) +V 1235: Pos(-0.153924, 0.593748, -13.596885) Norm(-0.210744, -0.783101, -0.585099) UV(0.599113, 0.74881) +V 1236: Pos(-0.0, 0.631413, -13.596885) Norm(0.0, 0.584098, -0.811683) UV(0.597047, 0.740369) +V 1237: Pos(-0.0, 0.572584, -13.596885) Norm(0.0, -0.813113, -0.582106) UV(0.600273, 0.740369) +V 1238: Pos(-0.614288, 1.193706, -13.596885) Norm(-0.809756, 1e-06, -0.586767) UV(0.56621, 0.774057) +V 1239: Pos(-0.536299, 1.048174, -13.596885) Norm(0.568385, 0.152402, -0.808525) UV(0.574191, 0.76978) +V 1240: Pos(-0.153924, 1.793664, -13.596885) Norm(-0.210608, 0.783139, -0.585096) UV(0.533307, 0.74881) +V 1241: Pos(-0.274312, 1.680666, -13.596885) Norm(0.293197, -0.508511, -0.8096) UV(0.539504, 0.755412) +V 1242: Pos(-0.390767, 0.796104, -13.596885) Norm(0.415327, 0.415719, -0.809124) UV(0.588015, 0.761799) +V 1243: Pos(-0.480126, 1.474853, -13.596885) Norm(0.509247, -0.294241, -0.808758) UV(0.550792, 0.7667) +V 1244: Pos(-0.138698, 0.650572, -13.596885) Norm(0.152574, 0.56671, -0.809667) UV(0.595996, 0.747975) +V 1245: Pos(-0.555459, 1.193706, -13.596885) Norm(0.588569, -1e-06, -0.808447) UV(0.56621, 0.770831) +V 1246: Pos(-0.0, 1.814828, -13.596885) Norm(0.0, 0.813018, -0.582239) UV(0.532147, 0.740369) +V 1247: Pos(-0.138698, 1.736839, -13.596885) Norm(0.152636, -0.566689, -0.80967) UV(0.536424, 0.747975) +V 1248: Pos(-0.138698, 0.650572, -13.596885) Norm(0.152574, 0.56671, -0.809667) UV(0.088624, 0.886723) +V 1249: Pos(-0.0, 0.83145, -12.785554) Norm(0.0, 0.981161, -0.193192) UV(0.079418, 0.841432) +V 1250: Pos(-0.0, 0.631413, -13.596885) Norm(0.0, 0.584098, -0.811683) UV(0.095877, 0.884202) +V 1251: Pos(-0.390767, 1.591307, -13.596885) Norm(0.415326, -0.41572, -0.809124) UV(0.024964, 0.890601) +V 1252: Pos(-0.313723, 1.374834, -12.785554) Norm(0.850358, -0.490756, -0.189867) UV(0.038636, 0.846424) +V 1253: Pos(-0.274312, 0.706745, -13.596885) Norm(0.2932, 0.508511, -0.809599) UV(0.080875, 0.888902) +V 1254: Pos(-0.093759, 0.843793, -12.785554) Norm(0.255152, 0.947567, -0.19239) UV(0.074522, 0.843143) +V 1255: Pos(-0.274312, 1.680666, -13.596885) Norm(0.293197, -0.508511, -0.8096) UV(0.017095, 0.888902) +V 1256: Pos(-0.256154, 1.44986, -12.785554) Norm(0.694331, -0.693985, -0.190499) UV(0.033509, 0.845641) +V 1257: Pos(-0.390767, 0.796104, -13.596885) Norm(0.415327, 0.415719, -0.809124) UV(0.073006, 0.890601) +V 1258: Pos(-0.181128, 0.879982, -12.785554) Norm(0.491023, 0.849877, -0.191323) UV(0.06953, 0.844547) +V 1259: Pos(-0.138698, 1.736839, -13.596885) Norm(0.152636, -0.566689, -0.80967) UV(0.009345, 0.886723) +V 1260: Pos(-0.181128, 1.507429, -12.785554) Norm(0.491019, -0.84988, -0.191323) UV(0.02844, 0.844547) +V 1261: Pos(-0.480126, 0.912559, -13.596885) Norm(0.509248, 0.294239, -0.808758) UV(0.065048, 0.891816) +V 1262: Pos(-0.256154, 0.937552, -12.785554) Norm(0.694334, 0.693981, -0.1905) UV(0.06446, 0.845641) +V 1263: Pos(-0.0, 1.755999, -13.596885) Norm(0.0, -0.583957, -0.811784) UV(0.002092, 0.884202) +V 1264: Pos(-0.093759, 1.543618, -12.785554) Norm(0.255228, -0.947545, -0.192396) UV(0.023447, 0.843143) +V 1265: Pos(-0.536299, 1.048174, -13.596885) Norm(0.568385, 0.152402, -0.808525) UV(0.057031, 0.892546) +V 1266: Pos(-0.313723, 1.012578, -12.785554) Norm(0.850359, 0.490755, -0.189867) UV(0.059333, 0.846424) +V 1267: Pos(-0.555459, 1.193706, -13.596885) Norm(0.588569, -1e-06, -0.808447) UV(0.048985, 0.89279) +V 1268: Pos(-0.349913, 1.099947, -12.785554) Norm(0.948453, 0.254044, -0.189469) UV(0.054169, 0.846894) +V 1269: Pos(-0.362256, 1.193706, -12.785554) Norm(0.981913, -1e-06, -0.189333) UV(0.048985, 0.847051) +V 1270: Pos(-0.181128, 0.879982, -12.785554) Norm(0.491023, 0.849877, -0.191323) UV(0.925455, 0.931202) +V 1271: Pos(-0.152919, 1.040787, -11.791429) Norm(0.48469, 0.484689, -0.728116) UV(0.914057, 0.877141) +V 1272: Pos(-0.10813, 1.006419, -11.791429) Norm(0.342712, 0.593599, -0.72814) UV(0.917126, 0.876732) +V 1273: Pos(-0.349913, 1.099947, -12.785554) Norm(0.948453, 0.254044, -0.189469) UV(0.909974, 0.932675) +V 1274: Pos(-0.21626, 1.193705, -11.791429) Norm(0.685427, 2e-06, -0.728141) UV(0.904789, 0.877669) +V 1275: Pos(-0.208891, 1.137733, -11.791429) Norm(0.66207, 0.177414, -0.72814) UV(0.907884, 0.877611) +V 1276: Pos(-0.181128, 1.507429, -12.785554) Norm(0.491019, -0.84988, -0.191323) UV(0.884122, 0.931202) +V 1277: Pos(-0.055972, 1.402596, -11.791429) Norm(0.177402, -0.662074, -0.728139) UV(0.8894, 0.876206) +V 1278: Pos(-0.10813, 1.380992, -11.791429) Norm(0.342712, -0.593599, -0.72814) UV(0.892451, 0.876732) +V 1279: Pos(-0.362256, 1.193706, -12.785554) Norm(0.981913, -1e-06, -0.189333) UV(0.904789, 0.932773) +V 1280: Pos(-0.208891, 1.249678, -11.791429) Norm(0.662092, -0.177411, -0.728121) UV(0.901693, 0.877611) +V 1281: Pos(-0.313723, 1.012578, -12.785554) Norm(0.850359, 0.490755, -0.189867) UV(0.915152, 0.93238) +V 1282: Pos(-0.187286, 1.085576, -11.791429) Norm(0.593593, 0.342714, -0.728145) UV(0.910975, 0.877435) +V 1283: Pos(-0.349913, 1.287465, -12.785554) Norm(0.948453, -0.254044, -0.189469) UV(0.899603, 0.932675) +V 1284: Pos(-0.187286, 1.301835, -11.791429) Norm(0.593594, -0.342711, -0.728145) UV(0.898602, 0.877435) +V 1285: Pos(-0.313723, 1.374834, -12.785554) Norm(0.850358, -0.490756, -0.189867) UV(0.894426, 0.93238) +V 1286: Pos(-0.152919, 1.346624, -11.791429) Norm(0.484682, -0.484673, -0.728131) UV(0.89552, 0.877141) +V 1287: Pos(-0.256154, 0.937552, -12.785554) Norm(0.694334, 0.693981, -0.1905) UV(0.920315, 0.931889) +V 1288: Pos(-0.093759, 0.843793, -12.785554) Norm(0.255152, 0.947567, -0.19239) UV(0.930566, 0.930321) +V 1289: Pos(-0.055972, 0.984815, -11.791429) Norm(0.177401, 0.662084, -0.728131) UV(0.920177, 0.876206) +V 1290: Pos(-0.0, 0.83145, -12.785554) Norm(0.0, 0.981161, -0.193192) UV(0.93564, 0.929247) +V 1291: Pos(-0.0, 0.977446, -11.791429) Norm(3e-06, 0.685436, -0.728133) UV(0.923206, 0.875564) +V 1292: Pos(-0.256154, 1.44986, -12.785554) Norm(0.694331, -0.693985, -0.190499) UV(0.889263, 0.931889) +V 1293: Pos(-0.152919, 1.346624, -11.791429) Norm(0.484682, -0.484673, -0.728131) UV(0.846624, 0.544553) +V 1294: Pos(-0.0, 1.409965, -11.791429) Norm(-0.0, -0.685441, -0.728128) UV(0.838238, 0.548027) +V 1295: Pos(-0.152919, 1.040787, -11.791429) Norm(0.48469, 0.484689, -0.728116) UV(0.846624, 0.52778) +V 1296: Pos(-0.415949, 0.777757, -9.90133) Norm(-0.447969, -0.865311, 0.224858) UV(0.9386, 0.930351) +V 1297: Pos(-0.093759, 1.543618, -12.785554) Norm(0.255228, -0.947545, -0.192396) UV(0.879011, 0.930321) +V 1298: Pos(-0.0, 1.409965, -11.791429) Norm(-0.0, -0.685441, -0.728128) UV(0.886371, 0.875564) +V 1299: Pos(-0.75615, 0.899586, -12.305865) Norm(-0.423805, -0.60468, -0.674353) UV(0.400656, 0.933083) +V 1300: Pos(-1.054109, 1.609655, -11.686933) Norm(-0.7322, 0.66028, -0.167073) UV(0.361714, 0.970754) +V 1301: Pos(-0.75615, 1.609655, -12.305865) Norm(-0.423796, 0.604704, -0.674337) UV(0.361714, 0.933083) +V 1302: Pos(-1.054109, 0.899586, -11.686933) Norm(-0.732207, -0.660275, -0.167065) UV(0.736968, 0.832443) +V 1303: Pos(-0.75615, 0.899586, -12.305865) Norm(-0.423805, -0.60468, -0.674353) UV(0.770911, 0.848783) +V 1304: Pos(-0.509431, 0.899586, -12.305865) Norm(-0.519488, -0.617342, -0.59078) UV(0.770911, 0.862313) +V 1305: Pos(-1.054109, 0.899586, -11.686933) Norm(-0.732207, -0.660275, -0.167065) UV(0.574821, 0.020881) +V 1306: Pos(-1.054109, 1.609655, -10.837623) Norm(-0.904538, 0.301505, -0.301505) UV(0.53588, 0.067458) +V 1307: Pos(-1.054109, 1.609655, -11.686933) Norm(-0.7322, 0.66028, -0.167073) UV(0.53588, 0.020881) +V 1308: Pos(-0.75615, 0.899586, -12.305865) Norm(-0.423805, -0.60468, -0.674353) UV(0.975768, 0.595152) +V 1309: Pos(-0.58824, 1.193706, -12.305865) Norm(-0.333455, -1e-06, -0.942766) UV(0.984976, 0.579022) +V 1310: Pos(-0.568197, 1.041458, -12.305865) Norm(-0.322091, -0.086304, -0.942767) UV(0.986075, 0.587372) +V 1311: Pos(-1.054109, 1.609655, -11.686933) Norm(-0.7322, 0.66028, -0.167073) UV(0.930542, 0.463811) +V 1312: Pos(-1.054109, 1.609655, -10.837623) Norm(-0.904538, 0.301505, -0.301505) UV(0.930542, 0.510388) +V 1313: Pos(-0.415949, 1.609655, -10.837625) Norm(-0.246602, 0.726484, -0.641412) UV(0.895545, 0.510388) +V 1314: Pos(-0.411476, 2.625713, -12.452584) Norm(-0.877548, 0.235139, -0.417875) UV(0.675348, 0.808631) +V 1315: Pos(-0.58824, 2.515459, -12.305865) Norm(-0.333456, -1e-06, -0.942766) UV(0.669278, 0.796044) +V 1316: Pos(-0.568196, 2.667706, -12.305865) Norm(-0.322093, 0.086303, -0.942766) UV(0.67766, 0.796859) +V 1317: Pos(-0.368919, 2.728454, -12.452584) Norm(-0.786787, 0.454254, -0.417875) UV(0.681191, 0.81038) +V 1318: Pos(-0.509431, 2.809578, -12.305865) Norm(-0.519489, 0.61734, -0.590781) UV(0.685728, 0.799274) +V 1319: Pos(-0.301221, 2.81668, -12.452584) Norm(-0.64241, 0.642409, -0.417876) UV(0.686587, 0.813222) +V 1320: Pos(-0.415949, 2.931407, -12.305865) Norm(-0.650275, 0.650272, -0.392797) UV(0.693179, 0.803199) +V 1321: Pos(-0.110255, 2.103982, -12.452584) Norm(-0.235141, -0.877547, -0.417876) UV(0.643303, 0.821723) +V 1322: Pos(-0.0, 1.927218, -12.305865) Norm(-0.0, -0.919626, -0.392795) UV(0.629341, 0.822312) +V 1323: Pos(-0.152248, 1.947261, -12.305865) Norm(-0.238014, -0.88829, -0.392798) UV(0.633409, 0.814938) +V 1324: Pos(-0.212996, 2.884378, -12.452584) Norm(-0.454249, 0.786789, -0.417876) UV(0.691334, 0.817051) +V 1325: Pos(-0.29412, 3.024889, -12.305865) Norm(-0.459814, 0.796418, -0.392797) UV(0.699734, 0.808486) +V 1326: Pos(-0.212996, 2.146539, -12.452584) Norm(-0.454258, -0.786785, -0.417874) UV(0.647223, 0.817051) +V 1327: Pos(-0.29412, 2.006027, -12.305865) Norm(-0.45981, -0.796419, -0.3928) UV(0.638823, 0.808486) +V 1328: Pos(-0.110255, 2.926934, -12.452584) Norm(-0.235139, 0.877548, -0.417875) UV(0.695254, 0.821723) +V 1329: Pos(-0.152248, 3.083655, -12.305865) Norm(-0.23802, 0.888289, -0.392797) UV(0.705147, 0.814938) +V 1330: Pos(-0.301221, 2.214237, -12.452584) Norm(-0.642413, -0.642406, -0.417875) UV(0.65197, 0.813222) +V 1331: Pos(-0.415949, 2.099509, -12.305865) Norm(-0.410216, -0.734467, -0.54063) UV(0.645378, 0.803199) +V 1332: Pos(-0.0, 2.94145, -12.452584) Norm(0.0, 0.9085, -0.417886) UV(0.6982, 0.827063) +V 1333: Pos(-0.0, 3.103699, -12.305865) Norm(0.0, 0.919624, -0.3928) UV(0.709215, 0.822312) +V 1334: Pos(-0.368919, 2.302463, -12.452584) Norm(-0.786789, -0.454251, -0.417875) UV(0.657366, 0.81038) +V 1335: Pos(-0.509431, 2.221339, -12.305865) Norm(-0.288781, -0.166728, -0.942766) UV(0.652829, 0.799274) +V 1336: Pos(-0.411476, 2.405204, -12.452584) Norm(-0.877548, -0.235137, -0.417876) UV(0.663208, 0.808631) +V 1337: Pos(-0.568196, 2.363211, -12.305865) Norm(-0.322088, -0.086306, -0.942767) UV(0.660896, 0.796859) +V 1338: Pos(-0.425991, 2.515458, -12.452584) Norm(-0.908504, -0.0, -0.417877) UV(0.669278, 0.80804) +V 1339: Pos(-0.425991, 1.193706, -12.452584) Norm(-0.908504, -3e-06, -0.417876) UV(0.944554, 0.249907) +V 1340: Pos(-0.568197, 1.041458, -12.305865) Norm(-0.322091, -0.086304, -0.942767) UV(0.933373, 0.258289) +V 1341: Pos(-0.58824, 1.193706, -12.305865) Norm(-0.333455, -1e-06, -0.942766) UV(0.932557, 0.249907) +V 1342: Pos(-0.411476, 1.083451, -12.452584) Norm(-0.877546, -0.235141, -0.417877) UV(0.945144, 0.255977) +V 1343: Pos(-0.509431, 0.899586, -12.305865) Norm(-0.519488, -0.617342, -0.59078) UV(0.935788, 0.266357) +V 1344: Pos(-0.368919, 0.98071, -12.452584) Norm(-0.786785, -0.454257, -0.417876) UV(0.946894, 0.26182) +V 1345: Pos(-0.415949, 0.777757, -12.305865) Norm(-0.650273, -0.650273, -0.392797) UV(0.939713, 0.273808) +V 1346: Pos(-0.0, 1.619697, -12.452584) Norm(0.0, 0.908505, -0.417875) UV(0.963577, 0.220985) +V 1347: Pos(-0.152248, 1.761903, -12.305865) Norm(-0.238019, 0.888288, -0.392799) UV(0.951452, 0.214038) +V 1348: Pos(-0.0, 1.781947, -12.305865) Norm(0.0, 0.919622, -0.392805) UV(0.958825, 0.20997) +V 1349: Pos(-0.301221, 0.892485, -12.452584) Norm(-0.642406, -0.642412, -0.417876) UV(0.949736, 0.267215) +V 1350: Pos(-0.29412, 0.684275, -12.305865) Norm(-0.459812, -0.796419, -0.392798) UV(0.945, 0.280363) +V 1351: Pos(-0.110255, 1.605182, -12.452584) Norm(-0.23514, 0.877547, -0.417876) UV(0.958237, 0.223932) +V 1352: Pos(-0.29412, 1.703137, -12.305865) Norm(-0.459813, 0.796418, -0.392798) UV(0.945, 0.219451) +V 1353: Pos(-0.212996, 0.824787, -12.452584) Norm(-0.454251, -0.786788, -0.417876) UV(0.953565, 0.271962) +V 1354: Pos(-0.152248, 0.625509, -12.305865) Norm(-0.23802, -0.888289, -0.392797) UV(0.951452, 0.285776) +V 1355: Pos(-0.212996, 1.562625, -12.452584) Norm(-0.454256, 0.786785, -0.417876) UV(0.953565, 0.227852) +V 1356: Pos(-0.415949, 1.609655, -12.305865) Norm(-0.41022, 0.734466, -0.540629) UV(0.939713, 0.226006) +V 1357: Pos(-0.110255, 0.78223, -12.452584) Norm(-0.235138, -0.877547, -0.417876) UV(0.958237, 0.275882) +V 1358: Pos(-0.0, 0.605465, -12.305865) Norm(0.0, -0.919628, -0.392791) UV(0.958825, 0.289844) +V 1359: Pos(-0.301221, 1.494927, -12.452584) Norm(-0.642411, 0.642407, -0.417876) UV(0.949736, 0.232599) +V 1360: Pos(-0.509431, 1.487826, -12.305865) Norm(-0.288782, 0.166727, -0.942766) UV(0.935788, 0.233457) +V 1361: Pos(-0.368919, 1.406702, -12.452584) Norm(-0.786787, 0.454253, -0.417876) UV(0.946894, 0.237994) +V 1362: Pos(-0.568197, 1.345954, -12.305865) Norm(-0.32209, 0.086303, -0.942767) UV(0.933373, 0.241525) +V 1363: Pos(-0.411476, 1.303961, -12.452584) Norm(-0.877548, 0.235135, -0.417876) UV(0.945144, 0.243837) +V 1364: Pos(-0.415949, 2.099509, -12.305865) Norm(-0.410216, -0.734467, -0.54063) UV(0.627518, 0.143212) +V 1365: Pos(-0.75615, 2.099509, -12.305865) Norm(-0.423797, -0.604704, -0.674337) UV(0.627518, 0.161869) +V 1366: Pos(-0.509431, 2.221339, -12.305865) Norm(-0.288781, -0.166728, -0.942766) UV(0.620837, 0.148339) +V 1367: Pos(-0.568196, 2.363211, -12.305865) Norm(-0.322088, -0.086306, -0.942767) UV(0.613056, 0.151562) +V 1368: Pos(-0.58824, 2.515459, -12.305865) Norm(-0.333456, -1e-06, -0.942766) UV(0.604707, 0.152661) +V 1369: Pos(-0.509431, 1.487826, -12.305865) Norm(-0.288782, 0.166727, -0.942766) UV(0.989298, 0.562892) +V 1370: Pos(-0.568197, 1.345954, -12.305865) Norm(-0.32209, 0.086303, -0.942767) UV(0.986075, 0.570673) +V 1371: Pos(-0.75615, 1.609655, -12.305865) Norm(-0.423796, 0.604704, -0.674337) UV(0.975768, 0.556211) +V 1372: Pos(-0.415949, 1.609655, -12.305865) Norm(-0.41022, 0.734466, -0.540629) UV(0.994425, 0.556211) +V 1373: Pos(-0.509431, 0.899586, -12.305865) Norm(-0.519488, -0.617342, -0.59078) UV(0.989298, 0.595152) +V 1374: Pos(-0.349913, 2.609217, -12.785554) Norm(0.948453, -0.254042, -0.189469) UV(0.73023, 0.930532) +V 1375: Pos(-0.208891, 2.571431, -11.791429) Norm(0.662093, -0.177411, -0.72812) UV(0.732319, 0.875468) +V 1376: Pos(-0.313723, 2.334331, -12.785554) Norm(0.850358, 0.490756, -0.189867) UV(0.745778, 0.930237) +V 1377: Pos(-0.208891, 2.459486, -11.791429) Norm(0.662073, 0.177413, -0.728137) UV(0.73851, 0.875468) +V 1378: Pos(-0.362256, 2.515459, -12.785554) Norm(0.981913, -0.0, -0.189333) UV(0.735415, 0.930631) +V 1379: Pos(-0.21626, 2.515459, -11.791429) Norm(0.685475, -0.0, -0.728096) UV(0.735415, 0.875527) +V 1380: Pos(-0.349913, 2.4217, -12.785554) Norm(0.948453, 0.254044, -0.189469) UV(0.7406, 0.930532) +V 1381: Pos(-0.152919, 2.668377, -11.791429) Norm(0.484679, -0.484673, -0.728133) UV(0.931767, 0.403592) +V 1382: Pos(-0.0, 2.731718, -11.791429) Norm(-2e-06, -0.685453, -0.728117) UV(0.940153, 0.400118) +V 1383: Pos(-0.152919, 2.36254, -11.791429) Norm(0.484688, 0.484689, -0.728116) UV(0.931767, 0.420365) +V 1384: Pos(-1.054109, 2.099509, -10.837623) Norm(-0.904535, -0.301505, -0.301516) UV(0.880649, 0.829324) +V 1385: Pos(-0.415949, 1.609655, -10.837625) Norm(-0.246602, 0.726484, -0.641412) UV(0.845651, 0.80246) +V 1386: Pos(-1.054109, 1.609655, -10.837623) Norm(-0.904538, 0.301505, -0.301505) UV(0.880649, 0.80246) +V 1387: Pos(-0.415949, 2.099509, -10.837623) Norm(-0.246604, -0.726493, -0.6414) UV(0.845651, 0.829324) +V 1388: Pos(-0.29412, 1.703137, -10.837625) Norm(-0.339145, 0.587416, -0.734795) UV(0.83897, 0.807586) +V 1389: Pos(-0.29412, 2.006027, -10.837623) Norm(-0.339136, -0.587407, -0.734806) UV(0.83897, 0.824197) +V 1390: Pos(-0.152248, 1.761903, -10.837625) Norm(-0.175555, 0.655165, -0.734806) UV(0.831189, 0.810809) +V 1391: Pos(-0.152248, 1.947261, -10.837623) Norm(-0.175546, -0.655152, -0.73482) UV(0.831189, 0.820974) +V 1392: Pos(-0.0, 1.781947, -10.837625) Norm(0.0, 0.678276, -0.734807) UV(0.82284, 0.811908) +V 1393: Pos(-1.054109, 0.899586, -9.639683) Norm(-0.661533, -0.732186, 0.162104) UV(0.574821, 0.133155) +V 1394: Pos(-1.054109, 2.579507, -9.439158) Norm(-0.894426, 0.0, 0.447217) UV(0.482692, 0.144152) +V 1395: Pos(-1.054109, 2.716209, -9.439158) Norm(-0.6038, 0.428489, 0.672178) UV(0.53864, 0.14936) +V 1396: Pos(-0.0, 2.579507, -9.439158) Norm(0.0, 0.0, 1.0) UV(0.480831, 0.156857) +V 1397: Pos(-0.0, 2.716209, -9.439158) Norm(-0.0, 0.537507, 0.843259) UV(0.480831, 0.14936) +V 1398: Pos(-1.054109, 1.170611, -9.439158) Norm(-0.894429, 0.0, 0.447209) UV(0.525739, 0.516703) +V 1399: Pos(-0.0, 0.992955, -9.439158) Norm(-0.0, -0.53751, 0.843257) UV(0.583548, 0.50696) +V 1400: Pos(-0.0, 1.170611, -9.439158) Norm(0.0, 0.0, 1.0) UV(0.583548, 0.516702) +V 1401: Pos(-1.054109, 2.716209, -9.439158) Norm(-0.6038, 0.428489, 0.672178) UV(0.475195, 0.144152) +V 1402: Pos(-1.054109, 1.170611, -9.439158) Norm(-0.894429, 0.0, 0.447209) UV(0.559958, 0.144152) +V 1403: Pos(-1.054109, 0.992955, -9.439158) Norm(-0.6038, -0.428489, 0.672177) UV(0.569701, 0.144152) +V 1404: Pos(0.153924, 3.115416, -13.596885) Norm(0.210619, 0.78314, -0.585091) UV(0.758739, 0.775065) +V 1405: Pos(-0.0, 3.13658, -13.596885) Norm(-0.0, 0.813064, -0.582174) UV(0.766797, 0.772295) +V 1406: Pos(0.110255, 2.926934, -12.796803) Norm(0.258051, 0.958709, 0.119525) UV(0.744978, 0.732071) +V 1407: Pos(0.303727, 3.053366, -13.596885) Norm(0.40505, 0.702516, -0.585155) UV(0.750171, 0.777447) +V 1408: Pos(0.212996, 2.884378, -12.796803) Norm(0.496745, 0.859776, 0.118444) UV(0.739102, 0.733705) +V 1409: Pos(0.432365, 2.954658, -13.596885) Norm(0.572795, 0.573338, -0.585824) UV(0.741475, 0.779303) +V 1410: Pos(0.301221, 2.81668, -12.796803) Norm(0.702379, 0.702022, 0.117599) UV(0.733138, 0.734978) +V 1411: Pos(0.531073, 2.82602, -13.596885) Norm(0.701406, 0.405268, -0.586334) UV(0.732682, 0.780631) +V 1412: Pos(0.368919, 2.728454, -12.796803) Norm(0.860171, 0.496416, 0.116949) UV(0.727108, 0.735888) +V 1413: Pos(0.593123, 2.676217, -13.596885) Norm(0.782203, 0.209736, -0.586659) UV(0.723826, 0.781428) +V 1414: Pos(0.411476, 2.625713, -12.796803) Norm(0.959368, 0.256966, 0.11654) UV(0.721033, 0.736435) +V 1415: Pos(0.614288, 2.515459, -13.596885) Norm(0.809756, -1e-06, -0.586767) UV(0.714937, 0.781694) +V 1416: Pos(0.425991, 2.515458, -12.796803) Norm(0.993202, -3e-06, 0.116401) UV(0.714937, 0.736618) +V 1417: Pos(0.593123, 2.3547, -13.596885) Norm(0.782197, -0.20974, -0.586666) UV(0.706049, 0.781428) +V 1418: Pos(0.411476, 2.405204, -12.796803) Norm(0.959367, -0.25697, 0.11654) UV(0.708841, 0.736435) +V 1419: Pos(0.531073, 2.204897, -13.596885) Norm(0.7014, -0.405272, -0.586338) UV(0.697193, 0.780631) +V 1420: Pos(0.368919, 2.302463, -12.796803) Norm(0.860169, -0.496419, 0.116949) UV(0.702767, 0.735888) +V 1421: Pos(0.432365, 2.076259, -13.596885) Norm(0.572788, -0.573341, -0.585828) UV(0.6884, 0.779303) +V 1422: Pos(0.301221, 2.214237, -12.796803) Norm(0.702377, -0.702023, 0.117598) UV(0.696737, 0.734978) +V 1423: Pos(0.303727, 1.977551, -13.596885) Norm(0.405047, -0.702515, -0.585158) UV(0.679704, 0.777447) +V 1424: Pos(0.212996, 2.146539, -12.796803) Norm(0.496745, -0.859776, 0.118444) UV(0.690773, 0.733705) +V 1425: Pos(0.153924, 1.915501, -13.596885) Norm(0.210689, -0.783114, -0.585101) UV(0.671136, 0.775065) +V 1426: Pos(0.110255, 2.103982, -12.796803) Norm(0.258081, -0.958701, 0.119524) UV(0.684897, 0.732071) +V 1427: Pos(0.110255, 2.103982, -12.452584) Norm(0.235141, -0.877547, -0.417876) UV(0.492294, 0.733549) +V 1428: Pos(0.110255, 2.103982, -12.796803) Norm(0.258081, -0.958701, 0.119524) UV(0.492294, 0.714671) +V 1429: Pos(0.212996, 2.146539, -12.452584) Norm(0.454258, -0.786785, -0.417874) UV(0.486195, 0.733549) +V 1430: Pos(0.212996, 2.146539, -12.796803) Norm(0.496745, -0.859776, 0.118444) UV(0.486195, 0.714671) +V 1431: Pos(0.301221, 2.214237, -12.452584) Norm(0.642413, -0.642406, -0.417875) UV(0.480096, 0.733549) +V 1432: Pos(0.301221, 2.214237, -12.796803) Norm(0.702377, -0.702023, 0.117598) UV(0.480096, 0.714671) +V 1433: Pos(0.368919, 2.302463, -12.452584) Norm(0.786789, -0.454251, -0.417875) UV(0.473998, 0.733549) +V 1434: Pos(0.368919, 2.302463, -12.796803) Norm(0.860169, -0.496419, 0.116949) UV(0.473998, 0.714671) +V 1435: Pos(0.411476, 2.405204, -12.452584) Norm(0.877548, -0.235137, -0.417876) UV(0.467899, 0.733549) +V 1436: Pos(0.411476, 2.405204, -12.796803) Norm(0.959367, -0.25697, 0.11654) UV(0.467899, 0.714671) +V 1437: Pos(0.425991, 2.515458, -12.452584) Norm(0.908504, -0.0, -0.417877) UV(0.4618, 0.733549) +V 1438: Pos(0.425991, 2.515458, -12.796803) Norm(0.993202, -3e-06, 0.116401) UV(0.4618, 0.714671) +V 1439: Pos(0.411476, 2.625713, -12.452584) Norm(0.877548, 0.235139, -0.417875) UV(0.455702, 0.733549) +V 1440: Pos(0.411476, 2.625713, -12.796803) Norm(0.959368, 0.256966, 0.11654) UV(0.455702, 0.714671) +V 1441: Pos(0.368919, 2.728454, -12.452584) Norm(0.786787, 0.454254, -0.417876) UV(0.449603, 0.733549) +V 1442: Pos(0.368919, 2.728454, -12.796803) Norm(0.860171, 0.496416, 0.116949) UV(0.449603, 0.714671) +V 1443: Pos(0.301221, 2.81668, -12.452584) Norm(0.642409, 0.642409, -0.417876) UV(0.443504, 0.733549) +V 1444: Pos(0.301221, 2.81668, -12.796803) Norm(0.702379, 0.702022, 0.117599) UV(0.443504, 0.714671) +V 1445: Pos(0.212996, 2.884378, -12.452584) Norm(0.454249, 0.786789, -0.417876) UV(0.437405, 0.733549) +V 1446: Pos(0.212996, 2.884378, -12.796803) Norm(0.496745, 0.859776, 0.118444) UV(0.437405, 0.714671) +V 1447: Pos(0.110255, 2.926934, -12.452584) Norm(0.235139, 0.877548, -0.417875) UV(0.431307, 0.733549) +V 1448: Pos(0.110255, 2.926934, -12.796803) Norm(0.258051, 0.958709, 0.119525) UV(0.431307, 0.714671) +V 1449: Pos(-0.0, 2.94145, -12.796803) Norm(-0.0, 0.992736, 0.120317) UV(0.425208, 0.714671) +V 1450: Pos(1.054109, 2.809578, -9.639683) Norm(0.661542, 0.732178, 0.162102) UV(0.891204, 0.950466) +V 1451: Pos(0.509431, 2.809578, -9.639683) Norm(0.068104, 0.951392, 0.300359) UV(0.861333, 0.950466) +V 1452: Pos(0.415949, 2.099509, -12.305865) Norm(0.410216, -0.734467, -0.54063) UV(0.946673, 0.681696) +V 1453: Pos(0.29412, 2.006027, -10.837623) Norm(0.339136, -0.587407, -0.734806) UV(0.938252, 0.601175) +V 1454: Pos(0.29412, 2.006027, -12.305865) Norm(0.45981, -0.796419, -0.3928) UV(0.938252, 0.681696) +V 1455: Pos(0.152248, 1.947261, -10.837623) Norm(0.175546, -0.655152, -0.73482) UV(0.92983, 0.601175) +V 1456: Pos(0.152248, 1.947261, -12.305865) Norm(0.238014, -0.88829, -0.392798) UV(0.92983, 0.681696) +V 1457: Pos(-0.0, 1.927218, -12.305865) Norm(-0.0, -0.919626, -0.392795) UV(0.921409, 0.681696) +V 1458: Pos(0.415949, 2.931407, -12.305865) Norm(0.650275, 0.650272, -0.392797) UV(0.270609, 0.823727) +V 1459: Pos(0.509431, 2.809578, -9.639683) Norm(0.068104, 0.951392, 0.300359) UV(0.416827, 0.815306) +V 1460: Pos(0.509431, 2.809578, -12.305865) Norm(0.519489, 0.61734, -0.590781) UV(0.270609, 0.815306) +V 1461: Pos(0.29412, 3.024889, -12.305865) Norm(0.459814, 0.796418, -0.392797) UV(0.270609, 0.832149) +V 1462: Pos(0.415949, 2.931407, -9.90133) Norm(0.447969, 0.865311, 0.224858) UV(0.402478, 0.823727) +V 1463: Pos(0.152248, 3.083655, -12.305865) Norm(0.23802, 0.888289, -0.392797) UV(0.270609, 0.84057) +V 1464: Pos(0.29412, 3.024889, -10.102099) Norm(0.319878, 0.924727, 0.206294) UV(0.391467, 0.832149) +V 1465: Pos(0.152248, 3.083655, -10.228309) Norm(0.17316, 0.966949, 0.18715) UV(0.384546, 0.84057) +V 1466: Pos(0.480126, 2.234312, -13.596885) Norm(-0.509256, 0.294239, -0.808753) UV(0.888654, 0.471901) +V 1467: Pos(0.349913, 2.4217, -12.785554) Norm(-0.948453, 0.254044, -0.189469) UV(0.843732, 0.48278) +V 1468: Pos(0.536299, 2.369926, -13.596885) Norm(-0.568394, 0.152402, -0.808518) UV(0.889384, 0.479918) +V 1469: Pos(0.593123, 2.676217, -13.596885) Norm(0.782203, 0.209736, -0.586659) UV(0.128572, 0.929979) +V 1470: Pos(0.480126, 2.796605, -13.596885) Norm(-0.509252, -0.29424, -0.808756) UV(0.135175, 0.936176) +V 1471: Pos(0.531073, 2.82602, -13.596885) Norm(0.701406, 0.405268, -0.586334) UV(0.136788, 0.933382) +V 1472: Pos(0.303727, 1.977551, -13.596885) Norm(0.405047, -0.702515, -0.585158) UV(0.090257, 0.94585) +V 1473: Pos(0.390767, 2.117857, -13.596885) Norm(-0.415336, 0.415717, -0.80912) UV(0.097951, 0.941077) +V 1474: Pos(0.432365, 2.076259, -13.596885) Norm(0.572788, -0.573341, -0.585828) UV(0.09567, 0.938795) +V 1475: Pos(0.432365, 2.954658, -13.596885) Norm(0.572795, 0.573338, -0.585824) UV(0.143843, 0.938795) +V 1476: Pos(0.274312, 3.002419, -13.596885) Norm(-0.293205, -0.50851, -0.809598) UV(0.146462, 0.947463) +V 1477: Pos(0.303727, 3.053366, -13.596885) Norm(0.40505, 0.702516, -0.585155) UV(0.149256, 0.94585) +V 1478: Pos(0.531073, 2.204897, -13.596885) Norm(0.7014, -0.405272, -0.586338) UV(0.102725, 0.933382) +V 1479: Pos(0.536299, 2.369926, -13.596885) Norm(-0.568394, 0.152402, -0.808518) UV(0.111775, 0.933095) +V 1480: Pos(0.593123, 2.3547, -13.596885) Norm(0.782197, -0.20974, -0.586666) UV(0.11094, 0.929979) +V 1481: Pos(0.153924, 3.115416, -13.596885) Norm(0.210619, 0.78314, -0.585091) UV(0.152659, 0.954065) +V 1482: Pos(-0.0, 3.13658, -13.596885) Norm(-0.0, 0.813064, -0.582174) UV(0.153819, 0.962507) +V 1483: Pos(0.614288, 2.515459, -13.596885) Norm(0.809756, -1e-06, -0.586767) UV(0.119756, 0.928818) +V 1484: Pos(0.536299, 2.660991, -13.596885) Norm(-0.568388, -0.152402, -0.808523) UV(0.127737, 0.933095) +V 1485: Pos(0.153924, 1.915501, -13.596885) Norm(0.210689, -0.783114, -0.585101) UV(0.086854, 0.954065) +V 1486: Pos(0.274312, 2.028498, -13.596885) Norm(-0.293201, 0.50851, -0.809599) UV(0.093051, 0.947463) +V 1487: Pos(0.390767, 2.91306, -13.596885) Norm(-0.415331, -0.415719, -0.809122) UV(0.141561, 0.941077) +V 1488: Pos(0.480126, 2.234312, -13.596885) Norm(-0.509256, 0.294239, -0.808753) UV(0.104338, 0.936176) +V 1489: Pos(0.138698, 3.058592, -13.596885) Norm(-0.152709, -0.566665, -0.809674) UV(0.149542, 0.9549) +V 1490: Pos(0.555459, 2.515459, -13.596885) Norm(-0.588571, 0.0, -0.808446) UV(0.119756, 0.932045) +V 1491: Pos(0.138698, 1.972325, -13.596885) Norm(-0.152631, 0.5667, -0.809664) UV(0.08997, 0.9549) +V 1492: Pos(0.138698, 3.058592, -13.596885) Norm(-0.152709, -0.566665, -0.809674) UV(0.883561, 0.527603) +V 1493: Pos(-0.0, 3.077752, -13.596885) Norm(-0.0, -0.584046, -0.811721) UV(0.881039, 0.534856) +V 1494: Pos(0.390767, 2.117857, -13.596885) Norm(-0.415336, 0.415717, -0.80912) UV(0.887439, 0.463943) +V 1495: Pos(0.313723, 2.334331, -12.785554) Norm(-0.850358, 0.490756, -0.189867) UV(0.843261, 0.477615) +V 1496: Pos(0.274312, 3.002419, -13.596885) Norm(-0.293205, -0.50851, -0.809598) UV(0.88574, 0.519854) +V 1497: Pos(0.093759, 2.865371, -12.785554) Norm(-0.255178, -0.94756, -0.192393) UV(0.83998, 0.513502) +V 1498: Pos(0.274312, 2.028498, -13.596885) Norm(-0.293201, 0.50851, -0.809599) UV(0.88574, 0.456074) +V 1499: Pos(0.256154, 2.259305, -12.785554) Norm(-0.694333, 0.693982, -0.190499) UV(0.842478, 0.472489) +V 1500: Pos(0.390767, 2.91306, -13.596885) Norm(-0.415331, -0.415719, -0.809122) UV(0.887439, 0.511985) +V 1501: Pos(0.181128, 2.829182, -12.785554) Norm(-0.491024, -0.849877, -0.191324) UV(0.841384, 0.508509) +V 1502: Pos(0.138698, 1.972325, -13.596885) Norm(-0.152631, 0.5667, -0.809664) UV(0.883561, 0.448325) +V 1503: Pos(0.181128, 2.201735, -12.785554) Norm(-0.491023, 0.849877, -0.191324) UV(0.841384, 0.467419) +V 1504: Pos(0.480126, 2.796605, -13.596885) Norm(-0.509252, -0.29424, -0.808756) UV(0.888654, 0.504027) +V 1505: Pos(0.256154, 2.771612, -12.785554) Norm(-0.694331, -0.693984, -0.1905) UV(0.842478, 0.50344) +V 1506: Pos(0.093759, 2.165546, -12.785554) Norm(-0.25516, 0.947562, -0.192403) UV(0.83998, 0.462426) +V 1507: Pos(0.536299, 2.660991, -13.596885) Norm(-0.568388, -0.152402, -0.808523) UV(0.889384, 0.49601) +V 1508: Pos(0.313723, 2.696587, -12.785554) Norm(-0.850358, -0.490757, -0.189867) UV(0.843261, 0.498313) +V 1509: Pos(0.555459, 2.515459, -13.596885) Norm(-0.588571, 0.0, -0.808446) UV(0.889627, 0.487964) +V 1510: Pos(0.349913, 2.609217, -12.785554) Norm(-0.948454, -0.254042, -0.189469) UV(0.843732, 0.493148) +V 1511: Pos(0.362256, 2.515459, -12.785554) Norm(-0.981913, -0.0, -0.189333) UV(0.843888, 0.487964) +V 1512: Pos(0.055972, 2.306568, -11.791429) Norm(-0.177373, 0.662075, -0.728146) UV(0.750804, 0.874063) +V 1513: Pos(0.093759, 2.165546, -12.785554) Norm(-0.25516, 0.947562, -0.192403) UV(0.761193, 0.928179) +V 1514: Pos(0.093759, 2.865371, -12.785554) Norm(-0.255178, -0.94756, -0.192393) UV(0.709638, 0.928179) +V 1515: Pos(-0.0, 2.877715, -12.785554) Norm(0.0, -0.981229, -0.192847) UV(0.704564, 0.927105) +V 1516: Pos(0.256154, 2.259305, -12.785554) Norm(-0.694333, 0.693982, -0.190499) UV(0.750941, 0.929746) +V 1517: Pos(0.187286, 2.407329, -11.791429) Norm(-0.593596, 0.342717, -0.728141) UV(0.741602, 0.875292) +V 1518: Pos(0.313723, 2.334331, -12.785554) Norm(-0.850358, 0.490756, -0.189867) UV(0.745778, 0.930237) +V 1519: Pos(0.181128, 2.829182, -12.785554) Norm(-0.491024, -0.849877, -0.191324) UV(0.714748, 0.92906) +V 1520: Pos(0.055972, 2.724349, -11.791429) Norm(-0.177401, -0.66207, -0.728143) UV(0.720026, 0.874063) +V 1521: Pos(0.181128, 2.201735, -12.785554) Norm(-0.491023, 0.849877, -0.191324) UV(0.756082, 0.92906) +V 1522: Pos(0.152919, 2.36254, -11.791429) Norm(-0.48464, 0.484678, -0.728156) UV(0.744684, 0.874999) +V 1523: Pos(0.256154, 2.771612, -12.785554) Norm(-0.694331, -0.693984, -0.1905) UV(0.719889, 0.929746) +V 1524: Pos(0.10813, 2.702745, -11.791429) Norm(-0.342722, -0.593609, -0.728128) UV(0.723078, 0.874589) +V 1525: Pos(0.10813, 2.328172, -11.791429) Norm(-0.342721, 0.59362, -0.728119) UV(0.747753, 0.874589) +V 1526: Pos(0.313723, 2.696587, -12.785554) Norm(-0.850358, -0.490757, -0.189867) UV(0.725052, 0.930237) +V 1527: Pos(0.152919, 2.668377, -11.791429) Norm(-0.484744, -0.484645, -0.728109) UV(0.726146, 0.874999) +V 1528: Pos(0.415949, 2.931407, -9.90133) Norm(0.447969, 0.865311, 0.224858) UV(0.856206, 0.934638) +V 1529: Pos(0.75615, 2.809578, -12.305865) Norm(0.423805, 0.60468, -0.674352) UV(0.441983, 0.930944) +V 1530: Pos(1.054109, 2.099509, -11.686933) Norm(0.7322, -0.66028, -0.167073) UV(0.480924, 0.968615) +V 1531: Pos(0.75615, 2.099509, -12.305865) Norm(0.423797, -0.604704, -0.674337) UV(0.480924, 0.930944) +V 1532: Pos(1.054109, 2.809578, -11.686933) Norm(0.732207, 0.660275, -0.167065) UV(0.396079, 0.851714) +V 1533: Pos(0.75615, 2.809578, -12.305865) Norm(0.423805, 0.60468, -0.674352) UV(0.362136, 0.868054) +V 1534: Pos(0.509431, 2.809578, -12.305865) Norm(0.519489, 0.61734, -0.590781) UV(0.362136, 0.881585) +V 1535: Pos(0.75615, 2.809578, -12.305865) Norm(0.423805, 0.60468, -0.674352) UV(0.588577, 0.161869) +V 1536: Pos(0.568196, 2.667706, -12.305865) Norm(0.322093, 0.086303, -0.942766) UV(0.596357, 0.151562) +V 1537: Pos(0.509431, 2.809578, -12.305865) Norm(0.519489, 0.61734, -0.590781) UV(0.588577, 0.148339) +V 1538: Pos(1.054109, 2.809578, -11.686933) Norm(0.732207, 0.660275, -0.167065) UV(0.470075, 0.020881) +V 1539: Pos(1.054109, 2.099509, -10.837623) Norm(0.904535, -0.301505, -0.301516) UV(0.509016, 0.067458) +V 1540: Pos(1.054109, 2.099509, -11.686933) Norm(0.7322, -0.66028, -0.167073) UV(0.509016, 0.020881) +V 1541: Pos(1.054109, 2.099509, -11.686933) Norm(0.7322, -0.66028, -0.167073) UV(0.882347, 0.549464) +V 1542: Pos(1.054109, 2.099509, -10.837623) Norm(0.904535, -0.301505, -0.301516) UV(0.882347, 0.596041) +V 1543: Pos(0.415949, 2.099509, -10.837623) Norm(0.246604, -0.726493, -0.6414) UV(0.917345, 0.596041) +V 1544: Pos(0.153924, 0.593748, -13.596885) Norm(0.210744, -0.783101, -0.585099) UV(0.813004, 0.714641) +V 1545: Pos(0.110255, 0.78223, -12.796803) Norm(0.258072, -0.958703, 0.119528) UV(0.855998, 0.728401) +V 1546: Pos(0.303727, 0.655798, -13.596885) Norm(0.405055, -0.702514, -0.585153) UV(0.810623, 0.723208) +V 1547: Pos(0.212996, 0.824787, -12.796803) Norm(0.496744, -0.859777, 0.118445) UV(0.854365, 0.734277) +V 1548: Pos(0.432365, 0.754506, -13.596885) Norm(0.572797, -0.573337, -0.585823) UV(0.808766, 0.731905) +V 1549: Pos(0.301221, 0.892484, -12.796803) Norm(0.702376, -0.702024, 0.117599) UV(0.853092, 0.740242) +V 1550: Pos(0.531073, 0.883145, -13.596885) Norm(0.701405, -0.405267, -0.586336) UV(0.807439, 0.740697) +V 1551: Pos(0.368919, 0.98071, -12.796803) Norm(0.860171, -0.496416, 0.116949) UV(0.852181, 0.746272) +V 1552: Pos(0.593123, 1.032948, -13.596885) Norm(0.782203, -0.209736, -0.58666) UV(0.806641, 0.749554) +V 1553: Pos(0.411476, 1.083451, -12.796803) Norm(0.959368, -0.256966, 0.11654) UV(0.851634, 0.752346) +V 1554: Pos(0.614288, 1.193706, -13.596885) Norm(0.809756, 1e-06, -0.586767) UV(0.806376, 0.758442) +V 1555: Pos(0.425991, 1.193706, -12.796803) Norm(0.993202, 3e-06, 0.116401) UV(0.851452, 0.758442) +V 1556: Pos(0.593123, 1.354464, -13.596885) Norm(0.782201, 0.209738, -0.586661) UV(0.806641, 0.76733) +V 1557: Pos(0.411476, 1.303961, -12.796803) Norm(0.959367, 0.256969, 0.11654) UV(0.851634, 0.764538) +V 1558: Pos(0.531073, 1.504267, -13.596885) Norm(0.701404, 0.40527, -0.586335) UV(0.807439, 0.776187) +V 1559: Pos(0.368919, 1.406702, -12.796803) Norm(0.860168, 0.496422, 0.116949) UV(0.852181, 0.770612) +V 1560: Pos(0.432365, 1.632905, -13.596885) Norm(0.572796, 0.573337, -0.585824) UV(0.808766, 0.78498) +V 1561: Pos(0.301221, 1.494927, -12.796803) Norm(0.702375, 0.702026, 0.117598) UV(0.853092, 0.776643) +V 1562: Pos(0.303727, 1.731613, -13.596885) Norm(0.405058, 0.702511, -0.585156) UV(0.810623, 0.793676) +V 1563: Pos(0.212996, 1.562625, -12.796803) Norm(0.496745, 0.859776, 0.118444) UV(0.854365, 0.782607) +V 1564: Pos(0.153924, 1.793664, -13.596885) Norm(0.210688, 0.783115, -0.5851) UV(0.813004, 0.802243) +V 1565: Pos(0.110255, 1.605182, -12.796803) Norm(0.258055, 0.958708, 0.119522) UV(0.855998, 0.788483) +V 1566: Pos(-0.0, 1.619697, -12.796803) Norm(0.0, 0.992736, 0.120312) UV(0.857989, 0.794248) +V 1567: Pos(0.110255, 1.605182, -12.452584) Norm(0.23514, 0.877547, -0.417876) UV(0.490229, 0.951961) +V 1568: Pos(-0.0, 1.619697, -12.452584) Norm(0.0, 0.908505, -0.417875) UV(0.48413, 0.951961) +V 1569: Pos(0.212996, 1.562625, -12.452584) Norm(0.454256, 0.786785, -0.417876) UV(0.496328, 0.951961) +V 1570: Pos(0.110255, 1.605182, -12.796803) Norm(0.258055, 0.958708, 0.119522) UV(0.490229, 0.933084) +V 1571: Pos(0.301221, 1.494927, -12.452584) Norm(0.642411, 0.642407, -0.417876) UV(0.502426, 0.951961) +V 1572: Pos(0.212996, 1.562625, -12.796803) Norm(0.496745, 0.859776, 0.118444) UV(0.496328, 0.933084) +V 1573: Pos(0.368919, 1.406702, -12.452584) Norm(0.786787, 0.454253, -0.417876) UV(0.508525, 0.951961) +V 1574: Pos(0.301221, 1.494927, -12.796803) Norm(0.702375, 0.702026, 0.117598) UV(0.502426, 0.933084) +V 1575: Pos(0.411476, 1.303961, -12.452584) Norm(0.877549, 0.235135, -0.417876) UV(0.514624, 0.951961) +V 1576: Pos(0.368919, 1.406702, -12.796803) Norm(0.860168, 0.496422, 0.116949) UV(0.508525, 0.933084) +V 1577: Pos(0.425991, 1.193706, -12.452584) Norm(0.908504, -3e-06, -0.417876) UV(0.520722, 0.951961) +V 1578: Pos(0.411476, 1.303961, -12.796803) Norm(0.959367, 0.256969, 0.11654) UV(0.514624, 0.933084) +V 1579: Pos(0.411476, 1.083451, -12.452584) Norm(0.877546, -0.235141, -0.417877) UV(0.526821, 0.951961) +V 1580: Pos(0.425991, 1.193706, -12.796803) Norm(0.993202, 3e-06, 0.116401) UV(0.520722, 0.933084) +V 1581: Pos(0.368919, 0.98071, -12.452584) Norm(0.786785, -0.454257, -0.417876) UV(0.53292, 0.951961) +V 1582: Pos(0.411476, 1.083451, -12.796803) Norm(0.959368, -0.256966, 0.11654) UV(0.526821, 0.933084) +V 1583: Pos(0.301221, 0.892485, -12.452584) Norm(0.642406, -0.642412, -0.417876) UV(0.539018, 0.951961) +V 1584: Pos(0.368919, 0.98071, -12.796803) Norm(0.860171, -0.496416, 0.116949) UV(0.53292, 0.933084) +V 1585: Pos(0.212996, 0.824787, -12.452584) Norm(0.454251, -0.786788, -0.417876) UV(0.545117, 0.951961) +V 1586: Pos(0.301221, 0.892484, -12.796803) Norm(0.702376, -0.702024, 0.117599) UV(0.539018, 0.933084) +V 1587: Pos(0.110255, 0.78223, -12.452584) Norm(0.235138, -0.877547, -0.417876) UV(0.551216, 0.951961) +V 1588: Pos(0.212996, 0.824787, -12.796803) Norm(0.496744, -0.859777, 0.118445) UV(0.545117, 0.933084) +V 1589: Pos(0.110255, 0.78223, -12.796803) Norm(0.258072, -0.958703, 0.119528) UV(0.551216, 0.933084) +V 1590: Pos(1.054109, 0.899586, -9.639683) Norm(0.661533, -0.732186, 0.162104) UV(0.903602, 0.946179) +V 1591: Pos(1.054109, 0.992955, -9.439158) Norm(0.6038, -0.428489, 0.672177) UV(0.903602, 0.95831) +V 1592: Pos(0.415949, 1.609655, -12.305865) Norm(0.41022, 0.734466, -0.540629) UV(0.920557, 0.596041) +V 1593: Pos(0.29412, 1.703137, -10.837625) Norm(0.339145, 0.587416, -0.734795) UV(0.928978, 0.51552) +V 1594: Pos(0.415949, 1.609655, -10.837625) Norm(0.246602, 0.726484, -0.641412) UV(0.920557, 0.51552) +V 1595: Pos(0.29412, 1.703137, -12.305865) Norm(0.459813, 0.796418, -0.392798) UV(0.928978, 0.596041) +V 1596: Pos(0.152248, 1.761903, -10.837625) Norm(0.175555, 0.655165, -0.734805) UV(0.9374, 0.51552) +V 1597: Pos(0.152248, 1.761903, -12.305865) Norm(0.238019, 0.888288, -0.392799) UV(0.9374, 0.596041) +V 1598: Pos(0.415949, 0.777757, -12.305865) Norm(0.650273, -0.650273, -0.392797) UV(0.121331, 0.840574) +V 1599: Pos(0.509431, 0.899586, -9.639683) Norm(0.068104, -0.951392, 0.300359) UV(0.267548, 0.848995) +V 1600: Pos(0.415949, 0.777757, -9.90133) Norm(0.447969, -0.865311, 0.224858) UV(0.253199, 0.840574) +V 1601: Pos(0.29412, 0.684275, -12.305865) Norm(0.459812, -0.796419, -0.392798) UV(0.121331, 0.832152) +V 1602: Pos(0.29412, 0.684275, -10.102099) Norm(0.319877, -0.924728, 0.206293) UV(0.242189, 0.832152) +V 1603: Pos(0.152248, 0.625509, -12.305865) Norm(0.23802, -0.888289, -0.392797) UV(0.121331, 0.823731) +V 1604: Pos(0.152248, 0.62551, -10.228309) Norm(0.173159, -0.966951, 0.187143) UV(0.235267, 0.823731) +V 1605: Pos(-0.0, 0.605466, -10.271356) Norm(0.0, -0.984384, 0.176033) UV(0.232906, 0.815309) +V 1606: Pos(0.480126, 1.474853, -13.596885) Norm(-0.509247, -0.294241, -0.808758) UV(0.032921, 0.891816) +V 1607: Pos(0.349913, 1.287465, -12.785554) Norm(-0.948453, -0.254044, -0.189469) UV(0.043801, 0.846894) +V 1608: Pos(0.313723, 1.374834, -12.785554) Norm(-0.850358, -0.490756, -0.189867) UV(0.038636, 0.846424) +V 1609: Pos(0.593123, 1.032948, -13.596885) Norm(0.782203, -0.209736, -0.58666) UV(0.575026, 0.772897) +V 1610: Pos(0.480126, 0.912559, -13.596885) Norm(-0.509248, 0.294239, -0.808758) UV(0.581629, 0.7667) +V 1611: Pos(0.536299, 1.048174, -13.596885) Norm(-0.568385, 0.152402, -0.808525) UV(0.574191, 0.76978) +V 1612: Pos(0.303727, 1.731613, -13.596885) Norm(0.405058, 0.702511, -0.585156) UV(0.53671, 0.757026) +V 1613: Pos(0.390767, 1.591307, -13.596885) Norm(-0.415326, -0.41572, -0.809124) UV(0.544405, 0.761799) +V 1614: Pos(0.274312, 1.680666, -13.596885) Norm(-0.293197, -0.508511, -0.8096) UV(0.539504, 0.755412) +V 1615: Pos(0.432365, 0.754506, -13.596885) Norm(0.572797, -0.573337, -0.585823) UV(0.590296, 0.76408) +V 1616: Pos(0.274312, 0.706745, -13.596885) Norm(-0.2932, 0.508511, -0.809599) UV(0.592916, 0.755413) +V 1617: Pos(0.390767, 0.796104, -13.596885) Norm(-0.415327, 0.415719, -0.809124) UV(0.588015, 0.761799) +V 1618: Pos(0.531073, 1.504267, -13.596885) Norm(0.701404, 0.40527, -0.586335) UV(0.549179, 0.769494) +V 1619: Pos(0.536299, 1.339238, -13.596885) Norm(-0.568385, -0.152403, -0.808524) UV(0.558229, 0.76978) +V 1620: Pos(0.480126, 1.474853, -13.596885) Norm(-0.509247, -0.294241, -0.808758) UV(0.550792, 0.7667) +V 1621: Pos(0.153924, 0.593748, -13.596885) Norm(0.210744, -0.783101, -0.585099) UV(0.599113, 0.74881) +V 1622: Pos(0.138698, 0.650572, -13.596885) Norm(-0.152574, 0.56671, -0.809667) UV(0.595996, 0.747975) +V 1623: Pos(0.614288, 1.193706, -13.596885) Norm(0.809756, 1e-06, -0.586767) UV(0.56621, 0.774057) +V 1624: Pos(0.555459, 1.193706, -13.596885) Norm(-0.588569, -1e-06, -0.808447) UV(0.56621, 0.770831) +V 1625: Pos(0.153924, 1.793664, -13.596885) Norm(0.210688, 0.783115, -0.5851) UV(0.533307, 0.74881) +V 1626: Pos(0.138698, 1.736839, -13.596885) Norm(-0.152636, -0.566689, -0.80967) UV(0.536424, 0.747975) +V 1627: Pos(0.531073, 0.883145, -13.596885) Norm(0.701405, -0.405267, -0.586336) UV(0.583242, 0.769494) +V 1628: Pos(0.432365, 1.632905, -13.596885) Norm(0.572796, 0.573337, -0.585824) UV(0.542124, 0.76408) +V 1629: Pos(0.303727, 0.655798, -13.596885) Norm(0.405055, -0.702514, -0.585153) UV(0.59571, 0.757026) +V 1630: Pos(0.593123, 1.354464, -13.596885) Norm(0.782201, 0.209738, -0.586661) UV(0.557394, 0.772897) +V 1631: Pos(-0.0, 1.755999, -13.596885) Norm(0.0, -0.583957, -0.811784) UV(0.535373, 0.740369) +V 1632: Pos(0.138698, 0.650572, -13.596885) Norm(-0.152574, 0.56671, -0.809667) UV(0.088624, 0.886723) +V 1633: Pos(0.093759, 0.843793, -12.785554) Norm(-0.255152, 0.947567, -0.19239) UV(0.074522, 0.843143) +V 1634: Pos(0.390767, 1.591307, -13.596885) Norm(-0.415326, -0.41572, -0.809124) UV(0.024964, 0.890601) +V 1635: Pos(0.256154, 1.44986, -12.785554) Norm(-0.694331, -0.693985, -0.190499) UV(0.033509, 0.845641) +V 1636: Pos(0.274312, 0.706745, -13.596885) Norm(-0.2932, 0.508511, -0.809599) UV(0.080875, 0.888902) +V 1637: Pos(0.181128, 0.879982, -12.785554) Norm(-0.491023, 0.849877, -0.191323) UV(0.06953, 0.844547) +V 1638: Pos(0.274312, 1.680666, -13.596885) Norm(-0.293197, -0.508511, -0.8096) UV(0.017095, 0.888902) +V 1639: Pos(0.181128, 1.507429, -12.785554) Norm(-0.491019, -0.84988, -0.191323) UV(0.02844, 0.844547) +V 1640: Pos(0.390767, 0.796104, -13.596885) Norm(-0.415327, 0.415719, -0.809124) UV(0.073006, 0.890601) +V 1641: Pos(0.256154, 0.937552, -12.785554) Norm(-0.694334, 0.693981, -0.1905) UV(0.06446, 0.845641) +V 1642: Pos(0.138698, 1.736839, -13.596885) Norm(-0.152636, -0.566689, -0.80967) UV(0.009345, 0.886723) +V 1643: Pos(0.093759, 1.543618, -12.785554) Norm(-0.255228, -0.947545, -0.192396) UV(0.023447, 0.843143) +V 1644: Pos(0.480126, 0.912559, -13.596885) Norm(-0.509248, 0.294239, -0.808758) UV(0.065048, 0.891816) +V 1645: Pos(0.313723, 1.012578, -12.785554) Norm(-0.850359, 0.490755, -0.189867) UV(0.059333, 0.846424) +V 1646: Pos(-0.0, 1.555962, -12.785554) Norm(0.0, -0.981186, -0.193065) UV(0.018551, 0.841432) +V 1647: Pos(0.536299, 1.048174, -13.596885) Norm(-0.568385, 0.152402, -0.808525) UV(0.057031, 0.892546) +V 1648: Pos(0.349913, 1.099947, -12.785554) Norm(-0.948453, 0.254044, -0.189469) UV(0.054169, 0.846894) +V 1649: Pos(0.555459, 1.193706, -13.596885) Norm(-0.588569, -1e-06, -0.808447) UV(0.048985, 0.89279) +V 1650: Pos(0.362256, 1.193706, -12.785554) Norm(-0.981913, -1e-06, -0.189333) UV(0.048985, 0.847051) +V 1651: Pos(0.536299, 1.339238, -13.596885) Norm(-0.568385, -0.152403, -0.808524) UV(0.040938, 0.892546) +V 1652: Pos(0.181128, 0.879982, -12.785554) Norm(-0.491023, 0.849877, -0.191323) UV(0.925455, 0.931202) +V 1653: Pos(0.152919, 1.040787, -11.791429) Norm(-0.484639, 0.484678, -0.728157) UV(0.914057, 0.877141) +V 1654: Pos(0.256154, 0.937552, -12.785554) Norm(-0.694334, 0.693981, -0.1905) UV(0.920315, 0.931889) +V 1655: Pos(0.349913, 1.099947, -12.785554) Norm(-0.948453, 0.254044, -0.189469) UV(0.909974, 0.932675) +V 1656: Pos(0.21626, 1.193705, -11.791429) Norm(-0.685441, 2e-06, -0.728129) UV(0.904789, 0.877669) +V 1657: Pos(0.362256, 1.193706, -12.785554) Norm(-0.981913, -1e-06, -0.189333) UV(0.904789, 0.932773) +V 1658: Pos(0.181128, 1.507429, -12.785554) Norm(-0.491019, -0.84988, -0.191323) UV(0.884122, 0.931202) +V 1659: Pos(0.055972, 1.402596, -11.791429) Norm(-0.177402, -0.662077, -0.728136) UV(0.8894, 0.876206) +V 1660: Pos(0.093759, 1.543618, -12.785554) Norm(-0.255228, -0.947545, -0.192396) UV(0.879011, 0.930321) +V 1661: Pos(0.208891, 1.249678, -11.791429) Norm(-0.662072, -0.177405, -0.72814) UV(0.901693, 0.877611) +V 1662: Pos(0.349913, 1.287465, -12.785554) Norm(-0.948453, -0.254044, -0.189469) UV(0.899603, 0.932675) +V 1663: Pos(0.313723, 1.012578, -12.785554) Norm(-0.850359, 0.490755, -0.189867) UV(0.915152, 0.93238) +V 1664: Pos(0.208891, 1.137733, -11.791429) Norm(-0.662071, 0.177409, -0.72814) UV(0.907884, 0.877611) +V 1665: Pos(0.187286, 1.301835, -11.791429) Norm(-0.593605, -0.342717, -0.728134) UV(0.898602, 0.877435) +V 1666: Pos(0.313723, 1.374834, -12.785554) Norm(-0.850358, -0.490756, -0.189867) UV(0.894426, 0.93238) +V 1667: Pos(0.152919, 1.346624, -11.791429) Norm(-0.484675, -0.484666, -0.728141) UV(0.89552, 0.877141) +V 1668: Pos(0.256154, 1.44986, -12.785554) Norm(-0.694331, -0.693985, -0.190499) UV(0.889263, 0.931889) +V 1669: Pos(0.187286, 1.085576, -11.791429) Norm(-0.593607, 0.342717, -0.728132) UV(0.910975, 0.877435) +V 1670: Pos(0.093759, 0.843793, -12.785554) Norm(-0.255152, 0.947567, -0.19239) UV(0.930566, 0.930321) +V 1671: Pos(0.10813, 1.006419, -11.791429) Norm(-0.342696, 0.593602, -0.728146) UV(0.917126, 0.876732) +V 1672: Pos(0.055972, 0.984815, -11.791429) Norm(-0.177387, 0.662077, -0.72814) UV(0.920177, 0.876206) +V 1673: Pos(0.10813, 1.380992, -11.791429) Norm(-0.342728, -0.593628, -0.728109) UV(0.892451, 0.876732) +V 1674: Pos(0.187286, 1.085576, -11.791429) Norm(-0.593607, 0.342717, -0.728132) UV(0.848509, 0.530237) +V 1675: Pos(0.10813, 1.006419, -11.791429) Norm(-0.342696, 0.593602, -0.728146) UV(0.844168, 0.525896) +V 1676: Pos(0.10813, 1.380992, -11.791429) Norm(-0.342728, -0.593628, -0.728109) UV(0.844168, 0.546438) +V 1677: Pos(-0.0, 0.605466, -10.271356) Norm(0.0, -0.984384, 0.176033) UV(0.961411, 0.907966) +V 1678: Pos(0.29412, 0.684275, -10.102099) Norm(0.319877, -0.924728, 0.206293) UV(0.945281, 0.918205) +V 1679: Pos(-0.0, 1.555962, -12.785554) Norm(0.0, -0.981186, -0.193065) UV(0.873937, 0.929247) +V 1680: Pos(0.75615, 0.899586, -12.305865) Norm(0.423805, -0.60468, -0.674353) UV(0.400656, 0.933083) +V 1681: Pos(1.054109, 1.609655, -11.686933) Norm(0.7322, 0.66028, -0.167073) UV(0.361714, 0.970754) +V 1682: Pos(1.054109, 0.899586, -11.686933) Norm(0.732207, -0.660275, -0.167065) UV(0.400656, 0.970754) +V 1683: Pos(0.509431, 0.899586, -12.305865) Norm(0.519488, -0.617342, -0.59078) UV(0.770911, 0.862313) +V 1684: Pos(0.75615, 0.899586, -12.305865) Norm(0.423805, -0.60468, -0.674353) UV(0.770911, 0.848783) +V 1685: Pos(1.054109, 0.899586, -11.686933) Norm(0.732207, -0.660275, -0.167065) UV(0.736968, 0.832443) +V 1686: Pos(1.054109, 0.899586, -11.686933) Norm(0.732207, -0.660275, -0.167065) UV(0.574821, 0.020881) +V 1687: Pos(1.054109, 1.609655, -10.837623) Norm(0.904538, 0.301505, -0.301505) UV(0.53588, 0.067458) +V 1688: Pos(1.054109, 0.899586, -9.639683) Norm(0.661533, -0.732186, 0.162104) UV(0.574821, 0.133155) +V 1689: Pos(0.75615, 0.899586, -12.305865) Norm(0.423805, -0.60468, -0.674353) UV(0.975768, 0.595152) +V 1690: Pos(0.568197, 1.041458, -12.305865) Norm(0.322091, -0.086304, -0.942767) UV(0.986075, 0.587372) +V 1691: Pos(0.58824, 1.193706, -12.305865) Norm(0.333455, -1e-06, -0.942766) UV(0.984976, 0.579022) +V 1692: Pos(0.415949, 1.609655, -10.837625) Norm(0.246602, 0.726484, -0.641412) UV(0.895545, 0.510388) +V 1693: Pos(1.054109, 1.609655, -10.837623) Norm(0.904538, 0.301505, -0.301505) UV(0.930542, 0.510388) +V 1694: Pos(1.054109, 1.609655, -11.686933) Norm(0.7322, 0.66028, -0.167073) UV(0.930542, 0.463811) +V 1695: Pos(0.411476, 2.625713, -12.452584) Norm(0.877548, 0.235139, -0.417875) UV(0.675348, 0.808631) +V 1696: Pos(0.58824, 2.515459, -12.305865) Norm(0.333456, -1e-06, -0.942766) UV(0.669278, 0.796044) +V 1697: Pos(0.425991, 2.515458, -12.452584) Norm(0.908504, -0.0, -0.417877) UV(0.669278, 0.80804) +V 1698: Pos(0.368919, 2.728454, -12.452584) Norm(0.786787, 0.454254, -0.417876) UV(0.681191, 0.81038) +V 1699: Pos(0.568196, 2.667706, -12.305865) Norm(0.322093, 0.086303, -0.942766) UV(0.67766, 0.796859) +V 1700: Pos(0.301221, 2.81668, -12.452584) Norm(0.642409, 0.642409, -0.417876) UV(0.686587, 0.813222) +V 1701: Pos(0.509431, 2.809578, -12.305865) Norm(0.519489, 0.61734, -0.590781) UV(0.685728, 0.799274) +V 1702: Pos(0.110255, 2.103982, -12.452584) Norm(0.235141, -0.877547, -0.417876) UV(0.643303, 0.821723) +V 1703: Pos(-0.0, 2.089467, -12.452584) Norm(0.0, -0.908509, -0.417866) UV(0.640357, 0.827063) +V 1704: Pos(0.212996, 2.884378, -12.452584) Norm(0.454249, 0.786789, -0.417876) UV(0.691334, 0.817051) +V 1705: Pos(0.415949, 2.931407, -12.305865) Norm(0.650275, 0.650272, -0.392797) UV(0.693179, 0.803199) +V 1706: Pos(0.212996, 2.146539, -12.452584) Norm(0.454258, -0.786785, -0.417874) UV(0.647223, 0.817051) +V 1707: Pos(0.152248, 1.947261, -12.305865) Norm(0.238014, -0.88829, -0.392798) UV(0.633409, 0.814938) +V 1708: Pos(0.110255, 2.926934, -12.452584) Norm(0.235139, 0.877548, -0.417875) UV(0.695254, 0.821723) +V 1709: Pos(0.29412, 3.024889, -12.305865) Norm(0.459814, 0.796418, -0.392797) UV(0.699734, 0.808486) +V 1710: Pos(0.301221, 2.214237, -12.452584) Norm(0.642413, -0.642406, -0.417875) UV(0.65197, 0.813222) +V 1711: Pos(0.29412, 2.006027, -12.305865) Norm(0.45981, -0.796419, -0.3928) UV(0.638823, 0.808486) +V 1712: Pos(0.152248, 3.083655, -12.305865) Norm(0.23802, 0.888289, -0.392797) UV(0.705147, 0.814938) +V 1713: Pos(0.368919, 2.302463, -12.452584) Norm(0.786789, -0.454251, -0.417875) UV(0.657366, 0.81038) +V 1714: Pos(0.415949, 2.099509, -12.305865) Norm(0.410216, -0.734467, -0.54063) UV(0.645378, 0.803199) +V 1715: Pos(0.411476, 2.405204, -12.452584) Norm(0.877548, -0.235137, -0.417876) UV(0.663208, 0.808631) +V 1716: Pos(0.509431, 2.221339, -12.305865) Norm(0.288781, -0.166728, -0.942766) UV(0.652829, 0.799274) +V 1717: Pos(0.568196, 2.363211, -12.305865) Norm(0.322088, -0.086306, -0.942767) UV(0.660896, 0.796859) +V 1718: Pos(0.425991, 1.193706, -12.452584) Norm(0.908504, -3e-06, -0.417876) UV(0.944554, 0.249907) +V 1719: Pos(0.568197, 1.041458, -12.305865) Norm(0.322091, -0.086304, -0.942767) UV(0.933373, 0.258289) +V 1720: Pos(0.411476, 1.083451, -12.452584) Norm(0.877546, -0.235141, -0.417877) UV(0.945144, 0.255977) +V 1721: Pos(0.509431, 0.899586, -12.305865) Norm(0.519488, -0.617342, -0.59078) UV(0.935788, 0.266357) +V 1722: Pos(0.368919, 0.98071, -12.452584) Norm(0.786785, -0.454257, -0.417876) UV(0.946894, 0.26182) +V 1723: Pos(0.415949, 0.777757, -12.305865) Norm(0.650273, -0.650273, -0.392797) UV(0.939713, 0.273808) +V 1724: Pos(0.301221, 0.892485, -12.452584) Norm(0.642406, -0.642412, -0.417876) UV(0.949736, 0.267215) +V 1725: Pos(0.152248, 1.761903, -12.305865) Norm(0.238019, 0.888288, -0.392799) UV(0.951452, 0.214038) +V 1726: Pos(0.110255, 1.605182, -12.452584) Norm(0.23514, 0.877547, -0.417876) UV(0.958237, 0.223932) +V 1727: Pos(0.29412, 0.684275, -12.305865) Norm(0.459812, -0.796419, -0.392798) UV(0.945, 0.280363) +V 1728: Pos(0.212996, 0.824787, -12.452584) Norm(0.454251, -0.786788, -0.417876) UV(0.953565, 0.271962) +V 1729: Pos(0.29412, 1.703137, -12.305865) Norm(0.459813, 0.796418, -0.392798) UV(0.945, 0.219451) +V 1730: Pos(0.212996, 1.562625, -12.452584) Norm(0.454256, 0.786785, -0.417876) UV(0.953565, 0.227852) +V 1731: Pos(0.152248, 0.625509, -12.305865) Norm(0.23802, -0.888289, -0.392797) UV(0.951452, 0.285776) +V 1732: Pos(0.110255, 0.78223, -12.452584) Norm(0.235138, -0.877547, -0.417876) UV(0.958237, 0.275882) +V 1733: Pos(0.415949, 1.609655, -12.305865) Norm(0.41022, 0.734466, -0.540629) UV(0.939713, 0.226006) +V 1734: Pos(0.301221, 1.494927, -12.452584) Norm(0.642411, 0.642407, -0.417876) UV(0.949736, 0.232599) +V 1735: Pos(-0.0, 0.767715, -12.452584) Norm(0.0, -0.908503, -0.417878) UV(0.963577, 0.278829) +V 1736: Pos(0.509431, 1.487826, -12.305865) Norm(0.288782, 0.166727, -0.942766) UV(0.935788, 0.233457) +V 1737: Pos(0.368919, 1.406702, -12.452584) Norm(0.786787, 0.454253, -0.417876) UV(0.946894, 0.237994) +V 1738: Pos(0.568197, 1.345954, -12.305865) Norm(0.32209, 0.086303, -0.942767) UV(0.933373, 0.241525) +V 1739: Pos(0.411476, 1.303961, -12.452584) Norm(0.877549, 0.235135, -0.417876) UV(0.945144, 0.243837) +V 1740: Pos(0.58824, 1.193706, -12.305865) Norm(0.333455, -1e-06, -0.942766) UV(0.932557, 0.249907) +V 1741: Pos(0.415949, 2.099509, -12.305865) Norm(0.410216, -0.734467, -0.54063) UV(0.627518, 0.143212) +V 1742: Pos(0.509431, 2.221339, -12.305865) Norm(0.288781, -0.166728, -0.942766) UV(0.620837, 0.148339) +V 1743: Pos(0.75615, 2.099509, -12.305865) Norm(0.423797, -0.604704, -0.674337) UV(0.627518, 0.161869) +V 1744: Pos(0.568196, 2.363211, -12.305865) Norm(0.322088, -0.086306, -0.942767) UV(0.613056, 0.151562) +V 1745: Pos(0.58824, 2.515459, -12.305865) Norm(0.333456, -1e-06, -0.942766) UV(0.604707, 0.152661) +V 1746: Pos(0.509431, 1.487826, -12.305865) Norm(0.288782, 0.166727, -0.942766) UV(0.989298, 0.562892) +V 1747: Pos(0.75615, 1.609655, -12.305865) Norm(0.423796, 0.604704, -0.674337) UV(0.975768, 0.556211) +V 1748: Pos(0.568197, 1.345954, -12.305865) Norm(0.32209, 0.086303, -0.942767) UV(0.986075, 0.570673) +V 1749: Pos(0.415949, 1.609655, -12.305865) Norm(0.41022, 0.734466, -0.540629) UV(0.994425, 0.556211) +V 1750: Pos(0.509431, 0.899586, -12.305865) Norm(0.519488, -0.617342, -0.59078) UV(0.989298, 0.595152) +V 1751: Pos(0.349913, 2.609217, -12.785554) Norm(-0.948454, -0.254042, -0.189469) UV(0.73023, 0.930532) +V 1752: Pos(0.187286, 2.623588, -11.791429) Norm(-0.593608, -0.342716, -0.728132) UV(0.729228, 0.875292) +V 1753: Pos(0.208891, 2.459486, -11.791429) Norm(-0.662081, 0.17741, -0.728131) UV(0.73851, 0.875468) +V 1754: Pos(0.349913, 2.4217, -12.785554) Norm(-0.948453, 0.254044, -0.189469) UV(0.7406, 0.930532) +V 1755: Pos(0.362256, 2.515459, -12.785554) Norm(-0.981913, -0.0, -0.189333) UV(0.735415, 0.930631) +V 1756: Pos(0.208891, 2.571431, -11.791429) Norm(-0.662071, -0.177406, -0.728141) UV(0.732319, 0.875468) +V 1757: Pos(0.21626, 2.515459, -11.791429) Norm(-0.685444, -0.0, -0.728125) UV(0.735415, 0.875527) +V 1758: Pos(-0.0, 2.299199, -11.791429) Norm(-0.0, 0.685431, -0.728137) UV(0.940153, 0.423838) +V 1759: Pos(0.10813, 2.702745, -11.791429) Norm(-0.342722, -0.593609, -0.728128) UV(0.934223, 0.401707) +V 1760: Pos(0.21626, 2.515459, -11.791429) Norm(-0.685444, -0.0, -0.728125) UV(0.928293, 0.411978) +V 1761: Pos(1.054109, 2.099509, -10.837623) Norm(0.904535, -0.301505, -0.301516) UV(0.880649, 0.829324) +V 1762: Pos(0.415949, 1.609655, -10.837625) Norm(0.246602, 0.726484, -0.641412) UV(0.845651, 0.80246) +V 1763: Pos(0.415949, 2.099509, -10.837623) Norm(0.246604, -0.726493, -0.6414) UV(0.845651, 0.829324) +V 1764: Pos(0.29412, 1.703137, -10.837625) Norm(0.339145, 0.587416, -0.734795) UV(0.83897, 0.807586) +V 1765: Pos(0.29412, 2.006027, -10.837623) Norm(0.339136, -0.587407, -0.734806) UV(0.83897, 0.824197) +V 1766: Pos(0.152248, 1.761903, -10.837625) Norm(0.175555, 0.655165, -0.734805) UV(0.831189, 0.810809) +V 1767: Pos(0.152248, 1.947261, -10.837623) Norm(0.175546, -0.655152, -0.73482) UV(0.831189, 0.820974) +V 1768: Pos(-0.0, 1.927217, -10.837623) Norm(0.0, -0.678286, -0.734798) UV(0.82284, 0.819875) +V 1769: Pos(1.054109, 2.579507, -9.439158) Norm(0.894426, 0.0, 0.447217) UV(0.482692, 0.144152) +V 1770: Pos(1.054109, 1.170611, -9.439158) Norm(0.894429, 0.0, 0.447209) UV(0.559958, 0.144152) +V 1771: Pos(1.054109, 2.716209, -9.439158) Norm(0.6038, 0.428489, 0.672178) UV(0.53864, 0.14936) +V 1772: Pos(1.054109, 2.579507, -9.439158) Norm(0.894426, 0.0, 0.447217) UV(0.53864, 0.156857) +V 1773: Pos(1.054109, 1.170611, -9.439158) Norm(0.894429, 0.0, 0.447209) UV(0.525739, 0.516703) +V 1774: Pos(1.054109, 0.992955, -9.439158) Norm(0.6038, -0.428489, 0.672177) UV(0.525739, 0.50696) +V 1775: Pos(1.054109, 2.716209, -9.439158) Norm(0.6038, 0.428489, 0.672178) UV(0.475195, 0.144152) +V 1776: Pos(1.054109, 2.809578, -9.639683) Norm(0.661542, 0.732178, 0.162102) UV(0.470075, 0.133155) +V 1777: Pos(1.054109, 0.992955, -9.439158) Norm(0.6038, -0.428489, 0.672177) UV(0.569701, 0.144152) +V 1778: Pos(-0.726752, 1.123324, 5.759355) Norm(1.5e-05, 1.0, -0.0) UV(0.270183, 0.423889) +V 1779: Pos(-0.70962, 1.113433, 7.081139) Norm(0.720567, 0.416018, 0.554718) UV(0.191333, 0.422709) +V 1780: Pos(-0.70962, 1.113433, 5.759355) Norm(0.866025, 0.500001, 0.0) UV(0.270183, 0.422709) +V 1781: Pos(-0.70962, 1.09365, 7.081139) Norm(0.720581, -0.416012, 0.554705) UV(0.191333, 0.421528) +V 1782: Pos(-0.70962, 1.09365, 5.759355) Norm(0.866034, -0.499985, 0.0) UV(0.270183, 0.421528) +V 1783: Pos(-0.726752, 1.083758, 7.081139) Norm(1.3e-05, -0.832055, 0.554693) UV(0.191333, 0.420348) +V 1784: Pos(-0.726752, 1.083758, 5.759355) Norm(1.1e-05, -1.0, 0.0) UV(0.270183, 0.420348) +V 1785: Pos(-0.743885, 1.09365, 7.081139) Norm(-0.720579, -0.416024, 0.554698) UV(0.191333, 0.419168) +V 1786: Pos(-0.743885, 1.09365, 5.759355) Norm(-0.86603, -0.499993, 0.0) UV(0.270183, 0.419168) +V 1787: Pos(-0.726752, 1.123325, 7.081139) Norm(3e-06, 0.832059, 0.554687) UV(0.059999, 0.003653) +V 1788: Pos(-0.743885, 1.09365, 7.081139) Norm(-0.720579, -0.416024, 0.554698) UV(0.059999, 0.001609) +V 1789: Pos(-0.70962, 1.09365, 7.081139) Norm(0.720581, -0.416012, 0.554705) UV(0.06177, 0.002631) +V 1790: Pos(-0.743885, 1.09365, 5.759355) Norm(-0.86603, -0.499993, 0.0) UV(0.270183, 0.426249) +V 1791: Pos(-0.743885, 1.113433, 7.081139) Norm(-0.720578, 0.416018, 0.554704) UV(0.191333, 0.425069) +V 1792: Pos(-0.743885, 1.113433, 5.759355) Norm(-0.866016, 0.500016, -0.0) UV(0.270183, 0.425069) +V 1793: Pos(-0.726752, 1.123325, 7.081139) Norm(3e-06, 0.832059, 0.554687) UV(0.191333, 0.423889) +V 1794: Pos(-1.556231, 1.522508, 3.796997) Norm(2e-06, 1.0, 0.0) UV(0.300645, 0.505252) +V 1795: Pos(-1.539098, 1.512616, 5.118781) Norm(0.72058, 0.416027, 0.554694) UV(0.221796, 0.504072) +V 1796: Pos(-1.539098, 1.512616, 3.796997) Norm(0.86603, 0.499992, 0.0) UV(0.300645, 0.504072) +V 1797: Pos(-1.539098, 1.492833, 5.118781) Norm(0.72058, -0.416018, 0.554701) UV(0.221796, 0.502892) +V 1798: Pos(-1.539098, 1.492833, 3.796997) Norm(0.866025, -0.5, 0.0) UV(0.300645, 0.502892) +V 1799: Pos(-1.556231, 1.482941, 5.118781) Norm(2e-06, -0.832052, 0.554698) UV(0.221796, 0.501712) +V 1800: Pos(-1.556231, 1.482941, 3.796997) Norm(-7e-06, -1.0, 0.0) UV(0.300645, 0.501712) +V 1801: Pos(-1.573364, 1.492833, 5.118781) Norm(-0.720575, -0.416023, 0.554704) UV(0.221796, 0.500532) +V 1802: Pos(-1.573364, 1.492833, 3.796997) Norm(-0.86603, -0.499992, 0.0) UV(0.300645, 0.500532) +V 1803: Pos(-1.573364, 1.492833, 5.118781) Norm(-0.720575, -0.416023, 0.554704) UV(0.558333, 0.003652) +V 1804: Pos(-1.556231, 1.482941, 5.118781) Norm(2e-06, -0.832052, 0.554698) UV(0.557743, 0.00263) +V 1805: Pos(-1.539098, 1.492833, 5.118781) Norm(0.72058, -0.416018, 0.554701) UV(0.558333, 0.001608) +V 1806: Pos(-1.573364, 1.492833, 3.796997) Norm(-0.86603, -0.499992, 0.0) UV(0.300645, 0.507613) +V 1807: Pos(-1.573364, 1.512616, 5.118781) Norm(-0.720567, 0.416024, 0.554714) UV(0.221796, 0.506432) +V 1808: Pos(-1.573364, 1.512616, 3.796997) Norm(-0.866028, 0.499996, 0.0) UV(0.300645, 0.506432) +V 1809: Pos(-1.556231, 1.522508, 5.118781) Norm(0.0, 0.832054, 0.554695) UV(0.221796, 0.505252) +V 1810: Pos(-0.97937, 1.503685, 5.750953) Norm(1e-06, 1.0, 0.0) UV(0.990407, 0.104079) +V 1811: Pos(-0.962237, 1.493793, 7.468777) Norm(0.720581, 0.416026, 0.554694) UV(0.991588, 0.001604) +V 1812: Pos(-0.962237, 1.493793, 5.750953) Norm(0.866029, 0.499994, 0.0) UV(0.991588, 0.104079) +V 1813: Pos(-0.962237, 1.47401, 7.468777) Norm(0.720579, -0.41602, 0.554701) UV(0.992768, 0.001604) +V 1814: Pos(-0.962237, 1.47401, 5.750953) Norm(0.866027, -0.499998, 0.0) UV(0.992768, 0.104079) +V 1815: Pos(-0.97937, 1.464118, 7.468777) Norm(1e-06, -0.832052, 0.554698) UV(0.993948, 0.001604) +V 1816: Pos(-0.97937, 1.464118, 5.750953) Norm(-2e-06, -1.0, 0.0) UV(0.993948, 0.104079) +V 1817: Pos(-0.996503, 1.47401, 7.468777) Norm(-0.720578, -0.416022, 0.554701) UV(0.995128, 0.001604) +V 1818: Pos(-0.996503, 1.47401, 5.750953) Norm(-0.866029, -0.499994, 0.0) UV(0.995128, 0.104079) +V 1819: Pos(-0.996503, 1.47401, 7.468777) Norm(-0.720578, -0.416022, 0.554701) UV(0.463415, 0.003652) +V 1820: Pos(-0.97937, 1.464118, 7.468777) Norm(1e-06, -0.832052, 0.554698) UV(0.462825, 0.00263) +V 1821: Pos(-0.962237, 1.47401, 7.468777) Norm(0.720579, -0.41602, 0.554701) UV(0.463415, 0.001608) +V 1822: Pos(-0.996503, 1.493793, 7.468777) Norm(-0.720578, 0.416019, 0.554704) UV(0.996308, 0.001604) +V 1823: Pos(-0.996503, 1.493793, 5.750953) Norm(-0.866027, 0.499997, 0.0) UV(0.996308, 0.104079) +V 1824: Pos(-0.996503, 1.493793, 5.750953) Norm(-0.866027, 0.499997, 0.0) UV(0.989227, 0.104079) +V 1825: Pos(-0.97937, 1.503685, 7.468777) Norm(-2e-06, 0.832054, 0.554695) UV(0.990407, 0.001604) +V 1826: Pos(-2.416991, 2.000594, -7.448886) Norm(2.1e-05, -1.0, 0.0) UV(0.940841, 0.447002) +V 1827: Pos(-2.399859, 2.010486, -8.424918) Norm(0.720582, -0.416018, -0.554698) UV(0.939661, 0.505226) +V 1828: Pos(-2.399859, 2.010486, -7.448886) Norm(0.866037, -0.49998, 0.0) UV(0.939661, 0.447002) +V 1829: Pos(-2.399859, 2.030269, -8.424918) Norm(0.720583, 0.416007, -0.554705) UV(0.93848, 0.505226) +V 1830: Pos(-2.399859, 2.030269, -7.448886) Norm(0.866031, 0.499991, 0.0) UV(0.93848, 0.447002) +V 1831: Pos(-2.416991, 2.040161, -8.424918) Norm(1.8e-05, 0.832055, -0.554693) UV(0.9373, 0.505226) +V 1832: Pos(-2.416991, 2.040161, -7.448886) Norm(-3e-06, 1.0, 0.0) UV(0.9373, 0.447002) +V 1833: Pos(-2.434124, 2.030269, -8.424918) Norm(-0.720576, 0.416026, -0.554701) UV(0.93612, 0.505226) +V 1834: Pos(-2.434124, 2.030269, -7.448886) Norm(-0.866034, 0.499986, 0.0) UV(0.93612, 0.447002) +V 1835: Pos(-2.434124, 2.030269, -8.424918) Norm(-0.720576, 0.416026, -0.554701) UV(0.633017, 0.001608) +V 1836: Pos(-2.416991, 2.040161, -8.424918) Norm(1.8e-05, 0.832055, -0.554693) UV(0.633607, 0.00263) +V 1837: Pos(-2.399859, 2.030269, -8.424918) Norm(0.720583, 0.416007, -0.554705) UV(0.633017, 0.003652) +V 1838: Pos(-2.434124, 2.010486, -8.424918) Norm(-0.720582, -0.416012, -0.554703) UV(0.93494, 0.505226) +V 1839: Pos(-2.434124, 2.010486, -7.448886) Norm(-0.866025, -0.500001, 0.0) UV(0.93494, 0.447002) +V 1840: Pos(-2.416991, 2.000594, -8.424918) Norm(-2e-06, -0.832057, -0.55469) UV(0.93376, 0.505226) +V 1841: Pos(-2.416991, 2.000594, -7.448886) Norm(2.1e-05, -1.0, 0.0) UV(0.93376, 0.447002) +V 1842: Pos(-2.92909, 1.522508, 0.309161) Norm(-5e-06, 1.0, 0.0) UV(0.232287, 0.047007) +V 1843: Pos(-2.911957, 1.512616, 1.017396) Norm(0.720586, 0.416018, 0.554693) UV(0.190037, 0.045827) +V 1844: Pos(-2.911957, 1.512616, 0.309161) Norm(0.866026, 0.499998, 0.0) UV(0.232287, 0.045827) +V 1845: Pos(-2.911957, 1.492833, 1.017396) Norm(0.720578, -0.416024, 0.5547) UV(0.190037, 0.044647) +V 1846: Pos(-2.911957, 1.492833, 0.309161) Norm(0.866032, -0.499989, 0.0) UV(0.232287, 0.044647) +V 1847: Pos(-2.92909, 1.482941, 1.017396) Norm(-4e-06, -0.832052, 0.554697) UV(0.190037, 0.043467) +V 1848: Pos(-2.92909, 1.482941, 0.309161) Norm(1.4e-05, -1.0, 0.0) UV(0.232287, 0.043467) +V 1849: Pos(-2.946223, 1.492833, 1.017396) Norm(-0.720578, -0.416022, 0.554701) UV(0.190037, 0.042287) +V 1850: Pos(-2.946223, 1.492833, 0.309161) Norm(-0.866026, -0.499998, 0.0) UV(0.232287, 0.042287) +V 1851: Pos(-2.946223, 1.492833, 1.017396) Norm(-0.720578, -0.416022, 0.554701) UV(0.730136, 0.003654) +V 1852: Pos(-2.92909, 1.482941, 1.017396) Norm(-4e-06, -0.832052, 0.554697) UV(0.729537, 0.002638) +V 1853: Pos(-2.911957, 1.492833, 1.017396) Norm(0.720578, -0.416024, 0.5547) UV(0.730117, 0.00161) +V 1854: Pos(-2.946223, 1.492833, 0.309161) Norm(-0.866026, -0.499998, 0.0) UV(0.232287, 0.049368) +V 1855: Pos(-2.946223, 1.512616, 1.017396) Norm(-0.720579, 0.416021, 0.554701) UV(0.190037, 0.048187) +V 1856: Pos(-2.946223, 1.512616, 0.309161) Norm(-0.866028, 0.499996, 0.0) UV(0.232287, 0.048187) +V 1857: Pos(-2.92909, 1.522508, 1.017396) Norm(1.2e-05, 0.832054, 0.554694) UV(0.190037, 0.047007) +V 1858: Pos(-1.324176, 2.375464, -13.21555) Norm(2e-06, -1.0, 0.0) UV(0.99275, 0.108675) +V 1859: Pos(-1.307043, 2.385355, -14.586768) Norm(0.720548, -0.416054, -0.554716) UV(0.991569, 0.190473) +V 1860: Pos(-1.307043, 2.385355, -13.21555) Norm(0.866019, -0.500011, 0.0) UV(0.991569, 0.108675) +V 1861: Pos(-1.307043, 2.405139, -14.586768) Norm(0.720552, 0.416052, -0.554712) UV(0.990389, 0.190473) +V 1862: Pos(-1.307043, 2.405138, -13.21555) Norm(0.866027, 0.499997, 0.0) UV(0.990389, 0.108675) +V 1863: Pos(-1.324176, 2.41503, -14.586768) Norm(-2.2e-05, 0.832048, -0.554703) UV(0.989209, 0.190473) +V 1864: Pos(-1.324176, 2.41503, -13.21555) Norm(-2e-06, 1.0, 0.0) UV(0.989209, 0.108675) +V 1865: Pos(-1.324176, 2.41503, -13.21555) Norm(-2e-06, 1.0, 0.0) UV(0.99629, 0.108675) +V 1866: Pos(-1.341309, 2.405139, -14.586768) Norm(-0.720573, 0.41604, -0.554693) UV(0.99511, 0.190473) +V 1867: Pos(-1.341309, 2.405138, -13.21555) Norm(-0.866029, 0.499993, 0.0) UV(0.99511, 0.108675) +V 1868: Pos(-1.324176, 2.41503, -14.586768) Norm(-2.2e-05, 0.832048, -0.554703) UV(0.448412, 0.002624) +V 1869: Pos(-1.307043, 2.405139, -14.586768) Norm(0.720552, 0.416052, -0.554712) UV(0.447822, 0.003646) +V 1870: Pos(-1.324176, 2.375464, -14.586768) Norm(-2.6e-05, -0.832043, -0.554711) UV(0.446052, 0.002624) +V 1871: Pos(-1.341309, 2.385355, -14.586768) Norm(-0.720574, -0.416036, -0.554696) UV(0.99393, 0.190473) +V 1872: Pos(-1.341309, 2.385355, -13.21555) Norm(-0.866017, -0.500015, 0.0) UV(0.99393, 0.108675) +V 1873: Pos(-1.324176, 2.375464, -14.586768) Norm(-2.6e-05, -0.832043, -0.554711) UV(0.99275, 0.190473) +V 1874: Pos(-2.787183, 0.474893, -11.507152) Norm(7e-06, -1.0, 0.0) UV(0.796119, 0.040152) +V 1875: Pos(-2.77005, 0.484785, -12.878369) Norm(0.720581, -0.416026, -0.554694) UV(0.794939, 0.12195) +V 1876: Pos(-2.77005, 0.484785, -11.507152) Norm(0.86603, -0.499991, 0.0) UV(0.794939, 0.040152) +V 1877: Pos(-2.77005, 0.504568, -12.878369) Norm(0.720581, 0.416017, -0.554701) UV(0.793759, 0.12195) +V 1878: Pos(-2.77005, 0.504568, -11.507152) Norm(0.866016, 0.500017, 0.0) UV(0.793759, 0.040152) +V 1879: Pos(-2.787183, 0.51446, -12.878369) Norm(6e-06, 0.832053, -0.554697) UV(0.792578, 0.12195) +V 1880: Pos(-2.787183, 0.514459, -11.507152) Norm(-7e-06, 1.0, 0.0) UV(0.792578, 0.040152) +V 1881: Pos(-2.804316, 0.504568, -12.878369) Norm(-0.720577, 0.416023, -0.554702) UV(0.791398, 0.12195) +V 1882: Pos(-2.804316, 0.504568, -11.507152) Norm(-0.86602, 0.500009, 0.0) UV(0.791398, 0.040152) +V 1883: Pos(-2.804316, 0.504568, -12.878369) Norm(-0.720577, 0.416023, -0.554702) UV(0.639127, 0.00263) +V 1884: Pos(-2.787183, 0.51446, -12.878369) Norm(6e-06, 0.832053, -0.554697) UV(0.638537, 0.003652) +V 1885: Pos(-2.77005, 0.504568, -12.878369) Norm(0.720581, 0.416017, -0.554701) UV(0.637357, 0.003652) +V 1886: Pos(-2.804316, 0.484785, -12.878369) Norm(-0.720579, -0.416016, -0.554704) UV(0.790218, 0.12195) +V 1887: Pos(-2.804316, 0.484785, -11.507152) Norm(-0.866026, -0.499999, 0.0) UV(0.790218, 0.040152) +V 1888: Pos(-2.804316, 0.484785, -11.507152) Norm(-0.866026, -0.499999, 0.0) UV(0.797299, 0.040152) +V 1889: Pos(-2.787183, 0.474893, -12.878369) Norm(-6e-06, -0.832054, -0.554695) UV(0.796119, 0.12195) +V 1890: Pos(0.726752, 1.123325, 5.759356) Norm(-1.5e-05, 1.0, 0.0) UV(0.270183, 0.423889) +V 1891: Pos(0.70962, 1.113433, 7.081139) Norm(-0.720579, 0.416011, 0.554708) UV(0.191333, 0.422709) +V 1892: Pos(0.726752, 1.123325, 7.081139) Norm(-1.5e-05, 0.832059, 0.554687) UV(0.191333, 0.423889) +V 1893: Pos(0.70962, 1.113433, 5.759356) Norm(-0.866036, 0.499982, 0.0) UV(0.270183, 0.422709) +V 1894: Pos(0.70962, 1.09365, 7.081139) Norm(-0.720584, -0.416009, 0.554702) UV(0.191333, 0.421528) +V 1895: Pos(0.70962, 1.09365, 5.759356) Norm(-0.866033, -0.499987, 0.0) UV(0.270183, 0.421528) +V 1896: Pos(0.726752, 1.083758, 7.081139) Norm(-1.3e-05, -0.832055, 0.554693) UV(0.191333, 0.420348) +V 1897: Pos(0.726752, 1.083758, 5.759356) Norm(-1e-05, -1.0, 0.0) UV(0.270183, 0.420348) +V 1898: Pos(0.743885, 1.09365, 7.081139) Norm(0.720577, -0.416025, 0.5547) UV(0.191333, 0.419168) +V 1899: Pos(0.70962, 1.09365, 7.081139) Norm(-0.720584, -0.416009, 0.554702) UV(0.06177, 0.002631) +V 1900: Pos(0.743885, 1.09365, 7.081139) Norm(0.720577, -0.416025, 0.5547) UV(0.059999, 0.001609) +V 1901: Pos(0.726752, 1.123325, 7.081139) Norm(-1.5e-05, 0.832059, 0.554687) UV(0.059999, 0.003653) +V 1902: Pos(0.743885, 1.09365, 5.759356) Norm(0.866029, -0.499993, 0.0) UV(0.270183, 0.426249) +V 1903: Pos(0.743885, 1.113433, 7.081139) Norm(0.720566, 0.416025, 0.554713) UV(0.191333, 0.425069) +V 1904: Pos(0.743885, 1.09365, 7.081139) Norm(0.720577, -0.416025, 0.5547) UV(0.191333, 0.426249) +V 1905: Pos(0.743885, 1.113433, 5.759356) Norm(0.866027, 0.499997, 0.0) UV(0.270183, 0.425069) +V 1906: Pos(1.556231, 1.522508, 3.796997) Norm(-2e-06, 1.0, 0.0) UV(0.300645, 0.505252) +V 1907: Pos(1.539098, 1.512616, 5.118781) Norm(-0.720577, 0.416029, 0.554696) UV(0.221796, 0.504072) +V 1908: Pos(1.556231, 1.522508, 5.118781) Norm(1.2e-05, 0.832054, 0.554695) UV(0.221796, 0.505252) +V 1909: Pos(1.539098, 1.512616, 3.796997) Norm(-0.86603, 0.499992, 0.0) UV(0.300645, 0.504072) +V 1910: Pos(1.539098, 1.492833, 5.118781) Norm(-0.72058, -0.416018, 0.554701) UV(0.221796, 0.502892) +V 1911: Pos(1.539098, 1.492833, 3.796997) Norm(-0.866025, -0.5, 0.0) UV(0.300645, 0.502892) +V 1912: Pos(1.556231, 1.482941, 5.118781) Norm(-2e-06, -0.832052, 0.554698) UV(0.221796, 0.501712) +V 1913: Pos(1.556231, 1.482941, 3.796997) Norm(7e-06, -1.0, 0.0) UV(0.300645, 0.501712) +V 1914: Pos(1.573364, 1.492833, 5.118781) Norm(0.720578, -0.416021, 0.554701) UV(0.221796, 0.500532) +V 1915: Pos(1.573364, 1.492833, 5.118781) Norm(0.720578, -0.416021, 0.554701) UV(0.558333, 0.003652) +V 1916: Pos(1.573364, 1.512616, 5.118781) Norm(0.720573, 0.416021, 0.554709) UV(0.559513, 0.003652) +V 1917: Pos(1.556231, 1.522508, 5.118781) Norm(1.2e-05, 0.832054, 0.554695) UV(0.560103, 0.00263) +V 1918: Pos(1.573364, 1.492833, 3.796997) Norm(0.86603, -0.499992, 0.0) UV(0.300645, 0.507613) +V 1919: Pos(1.573364, 1.512616, 5.118781) Norm(0.720573, 0.416021, 0.554709) UV(0.221796, 0.506432) +V 1920: Pos(1.573364, 1.492833, 5.118781) Norm(0.720578, -0.416021, 0.554701) UV(0.221796, 0.507613) +V 1921: Pos(1.573364, 1.512616, 3.796997) Norm(0.866028, 0.499996, 0.0) UV(0.300645, 0.506432) +V 1922: Pos(0.97937, 1.503685, 5.750953) Norm(-1e-06, 1.0, 0.0) UV(0.990407, 0.104079) +V 1923: Pos(0.962237, 1.493793, 7.468777) Norm(-0.720575, 0.416022, 0.554704) UV(0.991588, 0.001604) +V 1924: Pos(0.97937, 1.503685, 7.468777) Norm(2e-06, 0.832056, 0.554692) UV(0.990407, 0.001604) +V 1925: Pos(0.962237, 1.493793, 5.750953) Norm(-0.866029, 0.499994, 0.0) UV(0.991588, 0.104079) +V 1926: Pos(0.962237, 1.47401, 7.468777) Norm(-0.720581, -0.416021, 0.554698) UV(0.992768, 0.001604) +V 1927: Pos(0.962237, 1.47401, 5.750953) Norm(-0.866027, -0.499998, 0.0) UV(0.992768, 0.104079) +V 1928: Pos(0.97937, 1.464118, 7.468777) Norm(-1e-06, -0.832052, 0.554698) UV(0.993948, 0.001604) +V 1929: Pos(0.97937, 1.464118, 5.750953) Norm(2e-06, -1.0, 0.0) UV(0.993948, 0.104079) +V 1930: Pos(0.996503, 1.47401, 7.468777) Norm(0.72058, -0.416023, 0.554698) UV(0.995128, 0.001604) +V 1931: Pos(0.962237, 1.47401, 7.468777) Norm(-0.720581, -0.416021, 0.554698) UV(0.463415, 0.001608) +V 1932: Pos(0.996503, 1.47401, 7.468777) Norm(0.72058, -0.416023, 0.554698) UV(0.463415, 0.003652) +V 1933: Pos(0.97937, 1.503685, 7.468777) Norm(2e-06, 0.832056, 0.554692) UV(0.465186, 0.00263) +V 1934: Pos(0.996503, 1.47401, 5.750953) Norm(0.866029, -0.499994, 0.0) UV(0.995128, 0.104079) +V 1935: Pos(0.996503, 1.493793, 7.468777) Norm(0.720577, 0.416019, 0.554704) UV(0.996308, 0.001604) +V 1936: Pos(0.996503, 1.493793, 5.750953) Norm(0.866027, 0.499997, 0.0) UV(0.989227, 0.104079) +V 1937: Pos(0.996503, 1.493793, 7.468777) Norm(0.720577, 0.416019, 0.554704) UV(0.989227, 0.001604) +V 1938: Pos(2.416991, 2.000594, -7.448886) Norm(-2.1e-05, -1.0, 0.0) UV(0.940841, 0.447002) +V 1939: Pos(2.399859, 2.010486, -8.424916) Norm(-0.720579, -0.416011, -0.554708) UV(0.939661, 0.505226) +V 1940: Pos(2.416991, 2.000594, -8.424916) Norm(-8e-06, -0.832057, -0.55469) UV(0.940841, 0.505226) +V 1941: Pos(2.399859, 2.010486, -7.448886) Norm(-0.866037, -0.499981, 0.0) UV(0.939661, 0.447002) +V 1942: Pos(2.399859, 2.030269, -8.424916) Norm(-0.720583, 0.416007, -0.554705) UV(0.93848, 0.505226) +V 1943: Pos(2.399859, 2.030269, -7.448886) Norm(-0.866034, 0.499986, 0.0) UV(0.93848, 0.447002) +V 1944: Pos(2.416991, 2.040161, -8.424916) Norm(-1.8e-05, 0.832055, -0.554693) UV(0.9373, 0.505226) +V 1945: Pos(2.416991, 2.040161, -7.448886) Norm(-1e-05, 1.0, 0.0) UV(0.9373, 0.447002) +V 1946: Pos(2.434124, 2.030269, -8.424916) Norm(0.720576, 0.416026, -0.5547) UV(0.93612, 0.505226) +V 1947: Pos(2.434124, 2.010486, -8.424916) Norm(0.720585, -0.41602, -0.554694) UV(0.631837, 0.001608) +V 1948: Pos(2.416991, 2.000594, -8.424916) Norm(-8e-06, -0.832057, -0.55469) UV(0.631247, 0.00263) +V 1949: Pos(2.399859, 2.030269, -8.424916) Norm(-0.720583, 0.416007, -0.554705) UV(0.633017, 0.003652) +V 1950: Pos(2.434124, 2.030269, -7.448886) Norm(0.86603, 0.499991, 0.0) UV(0.93612, 0.447002) +V 1951: Pos(2.434124, 2.010486, -8.424916) Norm(0.720585, -0.41602, -0.554694) UV(0.93494, 0.505226) +V 1952: Pos(2.434124, 2.010486, -7.448886) Norm(0.866024, -0.500002, 0.0) UV(0.93494, 0.447002) +V 1953: Pos(2.416991, 2.000594, -8.424916) Norm(-8e-06, -0.832057, -0.55469) UV(0.93376, 0.505226) +V 1954: Pos(2.92909, 1.522508, 0.309161) Norm(4e-06, 1.0, 0.0) UV(0.232287, 0.047007) +V 1955: Pos(2.911957, 1.512616, 1.017397) Norm(-0.720582, 0.416025, 0.554693) UV(0.190037, 0.045827) +V 1956: Pos(2.92909, 1.522508, 1.017397) Norm(3e-06, 0.832054, 0.554694) UV(0.190037, 0.047007) +V 1957: Pos(2.911957, 1.512616, 0.309161) Norm(-0.866027, 0.499997, 0.0) UV(0.232287, 0.045827) +V 1958: Pos(2.911957, 1.492833, 1.017397) Norm(-0.720578, -0.416023, 0.5547) UV(0.190037, 0.044647) +V 1959: Pos(2.911957, 1.492833, 0.309161) Norm(-0.866027, -0.499997, 0.0) UV(0.232287, 0.044647) +V 1960: Pos(2.92909, 1.482941, 1.017397) Norm(4e-06, -0.832052, 0.554697) UV(0.190037, 0.043467) +V 1961: Pos(2.92909, 1.482941, 0.309161) Norm(4e-06, -1.0, 0.0) UV(0.232287, 0.043467) +V 1962: Pos(2.946223, 1.492833, 1.017397) Norm(0.720578, -0.416022, 0.5547) UV(0.190037, 0.042287) +V 1963: Pos(2.946223, 1.492833, 1.017397) Norm(0.720578, -0.416022, 0.5547) UV(0.730136, 0.003654) +V 1964: Pos(2.946223, 1.512616, 1.017397) Norm(0.72058, 0.416016, 0.554703) UV(0.731316, 0.003644) +V 1965: Pos(2.92909, 1.522508, 1.017397) Norm(3e-06, 0.832054, 0.554694) UV(0.731897, 0.002616) +V 1966: Pos(2.946223, 1.492833, 0.309161) Norm(0.866031, -0.49999, 0.0) UV(0.232287, 0.049368) +V 1967: Pos(2.946223, 1.512616, 1.017397) Norm(0.72058, 0.416016, 0.554703) UV(0.190037, 0.048187) +V 1968: Pos(2.946223, 1.492833, 1.017397) Norm(0.720578, -0.416022, 0.5547) UV(0.190037, 0.049368) +V 1969: Pos(2.946223, 1.512616, 0.309161) Norm(0.866027, 0.499997, 0.0) UV(0.232287, 0.048187) +V 1970: Pos(1.324176, 2.375464, -13.215549) Norm(-2e-06, -1.0, 0.0) UV(0.99275, 0.108675) +V 1971: Pos(1.307043, 2.385355, -14.586766) Norm(-0.720589, -0.416035, -0.554677) UV(0.991569, 0.190473) +V 1972: Pos(1.324176, 2.375464, -14.586766) Norm(-2.2e-05, -0.832044, -0.55471) UV(0.99275, 0.190473) +V 1973: Pos(1.307043, 2.385355, -13.215549) Norm(-0.866019, -0.500012, 0.0) UV(0.991569, 0.108675) +V 1974: Pos(1.307043, 2.405139, -14.586766) Norm(-0.720576, 0.416037, -0.554693) UV(0.990389, 0.190473) +V 1975: Pos(1.307043, 2.405138, -13.215549) Norm(-0.866027, 0.499998, 0.0) UV(0.990389, 0.108675) +V 1976: Pos(1.324176, 2.41503, -14.586766) Norm(-3e-06, 0.832042, -0.554713) UV(0.989209, 0.190473) +V 1977: Pos(1.324176, 2.41503, -13.215549) Norm(3e-06, 1.0, 0.0) UV(0.99629, 0.108675) +V 1978: Pos(1.341309, 2.405139, -14.586766) Norm(0.720573, 0.41604, -0.554694) UV(0.99511, 0.190473) +V 1979: Pos(1.324176, 2.41503, -14.586766) Norm(-3e-06, 0.832042, -0.554713) UV(0.99629, 0.190473) +V 1980: Pos(1.341309, 2.405139, -14.586766) Norm(0.720573, 0.41604, -0.554694) UV(0.447822, 0.001602) +V 1981: Pos(1.341309, 2.385355, -14.586766) Norm(0.720597, -0.416021, -0.554677) UV(0.446642, 0.001602) +V 1982: Pos(1.324176, 2.375464, -14.586766) Norm(-2.2e-05, -0.832044, -0.55471) UV(0.446052, 0.002624) +V 1983: Pos(1.341309, 2.405138, -13.215549) Norm(0.866029, 0.499993, 0.0) UV(0.99511, 0.108675) +V 1984: Pos(1.341309, 2.385355, -14.586766) Norm(0.720597, -0.416021, -0.554677) UV(0.99393, 0.190473) +V 1985: Pos(1.341309, 2.385355, -13.215549) Norm(0.866016, -0.500016, 0.0) UV(0.99393, 0.108675) +V 1986: Pos(2.787183, 0.474893, -11.50715) Norm(6e-06, -1.0, 0.0) UV(0.796119, 0.040152) +V 1987: Pos(2.77005, 0.484785, -12.878367) Norm(-0.720581, -0.416027, -0.554694) UV(0.794939, 0.12195) +V 1988: Pos(2.787183, 0.474893, -12.878367) Norm(2.5e-05, -0.832057, -0.55469) UV(0.796119, 0.12195) +V 1989: Pos(2.77005, 0.484785, -11.50715) Norm(-0.866031, -0.499991, 0.0) UV(0.794939, 0.040152) +V 1990: Pos(2.77005, 0.504568, -12.878367) Norm(-0.720581, 0.416016, -0.554701) UV(0.793759, 0.12195) +V 1991: Pos(2.77005, 0.504568, -11.50715) Norm(-0.866015, 0.500017, 0.0) UV(0.793759, 0.040152) +V 1992: Pos(2.787183, 0.51446, -12.878367) Norm(5e-06, 0.832055, -0.554692) UV(0.792578, 0.12195) +V 1993: Pos(2.787183, 0.514459, -11.50715) Norm(1.6e-05, 1.0, 0.0) UV(0.792578, 0.040152) +V 1994: Pos(2.804315, 0.504568, -12.878367) Norm(0.720585, 0.416009, -0.554701) UV(0.791398, 0.12195) +V 1995: Pos(2.804315, 0.504568, -12.878367) Norm(0.720585, 0.416009, -0.554701) UV(0.639127, 0.00263) +V 1996: Pos(2.804315, 0.484785, -12.878367) Norm(0.720603, -0.415994, -0.554689) UV(0.638537, 0.001608) +V 1997: Pos(2.787183, 0.474893, -12.878367) Norm(2.5e-05, -0.832057, -0.55469) UV(0.637357, 0.001608) +V 1998: Pos(2.804315, 0.504568, -11.50715) Norm(0.866024, 0.500002, 0.0) UV(0.791398, 0.040152) +V 1999: Pos(2.804315, 0.484785, -12.878367) Norm(0.720603, -0.415994, -0.554689) UV(0.790218, 0.12195) +V 2000: Pos(2.804315, 0.484785, -11.50715) Norm(0.866032, -0.499988, 0.0) UV(0.797299, 0.040152) +V 2001: Pos(2.804315, 0.484785, -12.878367) Norm(0.720603, -0.415994, -0.554689) UV(0.797299, 0.12195) +V 2002: Pos(-0.656844, 2.043442, 5.949746) Norm(-0.947814, 0.206865, 0.242602) UV(0.879286, 0.983724) +V 2003: Pos(-0.474337, 1.974987, 6.444519) Norm(-0.919986, 0.153588, 0.360606) UV(0.898493, 0.958901) +V 2004: Pos(-0.484991, 2.589333, 6.155677) Norm(-0.937289, 0.183213, 0.296517) UV(0.912913, 0.996289) +V 2005: Pos(-0.660669, 2.139582, 5.750485) Norm(-0.958416, 0.24939, 0.138724) UV(0.87571, 0.996285) +V 2006: Pos(-0.373902, 1.972552, 6.511814) Norm(0.0, 0.428661, 0.903465) UV(0.755338, 0.202808) +V 2007: Pos(0.0, 2.626866, 6.201366) Norm(0.0, 0.428661, 0.903465) UV(0.73327, 0.160063) +V 2008: Pos(-0.373902, 2.626866, 6.201366) Norm(0.0, 0.428661, 0.903465) UV(0.755338, 0.160063) +V 2009: Pos(-0.480854, 1.807884, 6.488729) Norm(-0.92019, 0.0, 0.391473) UV(0.796301, 0.753152) +V 2010: Pos(-0.690464, 1.340286, 5.996024) Norm(-0.92019, 0.0, 0.391473) UV(0.764699, 0.725554) +V 2011: Pos(-0.480854, 1.395656, 6.488729) Norm(-0.920189, 0.0, 0.391473) UV(0.796301, 0.728822) +V 2012: Pos(-0.461775, 1.222826, 6.447432) Norm(-0.812966, -0.421534, 0.40174) UV(0.594899, 0.769501) +V 2013: Pos(-0.489382, 0.562264, 5.698396) Norm(-0.812897, -0.421606, 0.401805) UV(0.646164, 0.740363) +V 2014: Pos(-0.267407, 0.533866, 6.113513) Norm(-0.812893, -0.42161, 0.401809) UV(0.641489, 0.767802) +V 2015: Pos(0.0, 1.254185, 6.519545) Norm(0.0, -0.423589, 0.905854) UV(0.628061, 0.001604) +V 2016: Pos(-0.165463, 0.519704, 6.176092) Norm(0.0, -0.423589, 0.905854) UV(0.580206, 0.01137) +V 2017: Pos(0.0, 0.519704, 6.176092) Norm(0.0, -0.423589, 0.905854) UV(0.580206, 0.001604) +V 2018: Pos(-0.688387, 2.263284, 5.177258) Norm(-0.918418, 0.393741, 0.038414) UV(0.972436, 0.706631) +V 2019: Pos(-0.482945, 2.661426, 6.008123) Norm(-0.918423, 0.393732, 0.038392) UV(0.941733, 0.753121) +V 2020: Pos(-0.483108, 2.771514, 4.894848) Norm(-0.918427, 0.393719, 0.038444) UV(0.941733, 0.687094) +V 2021: Pos(-0.688583, 2.347369, 4.284067) Norm(0.919175, -0.392122, -0.036835) UV(0.077698, 0.956757) +V 2022: Pos(-0.50786, 2.730895, 4.711029) Norm(0.919175, -0.392122, -0.036835) UV(0.067036, 0.990632) +V 2023: Pos(-0.688583, 2.283926, 4.959442) Norm(0.919175, -0.392122, -0.036835) UV(0.099046, 0.990628) +V 2024: Pos(-0.482663, 2.897745, 3.617621) Norm(-0.919954, 0.390171, 0.038087) UV(0.100552, 0.972768) +V 2025: Pos(-0.688778, 2.370271, 4.042285) Norm(-0.920054, 0.389962, 0.037814) UV(0.128557, 0.941765) +V 2026: Pos(-0.482499, 2.807589, 4.529206) Norm(-0.919968, 0.390141, 0.038067) UV(0.154618, 0.972768) +V 2027: Pos(-0.366853, 2.973998, 3.610639) Norm(0.001309, 0.994801, 0.101825) UV(0.703251, 0.933091) +V 2028: Pos(0.0, 2.867261, 4.649069) Norm(0.0, 0.994824, 0.101614) UV(0.764863, 0.954743) +V 2029: Pos(0.0, 2.973768, 3.611137) Norm(0.0, 0.994776, 0.102079) UV(0.703281, 0.954743) +V 2030: Pos(-0.354818, 2.715312, 6.06142) Norm(0.007229, 0.99396, 0.109504) UV(0.948445, 0.076547) +V 2031: Pos(0.0, 2.845042, 4.860431) Norm(0.0, 0.994007, 0.109321) UV(0.969595, 0.147782) +V 2032: Pos(-0.361021, 2.846327, 4.85909) Norm(0.007183, 0.993962, 0.109491) UV(0.948287, 0.147931) +V 2033: Pos(0.656844, 2.043442, 5.949746) Norm(0.947814, 0.206865, 0.242602) UV(0.879286, 0.983724) +V 2034: Pos(0.484991, 2.589333, 6.155677) Norm(0.937289, 0.183213, 0.296517) UV(0.912913, 0.996289) +V 2035: Pos(0.474337, 1.974987, 6.444519) Norm(0.919986, 0.153588, 0.360606) UV(0.898493, 0.958901) +V 2036: Pos(0.660669, 2.139582, 5.750485) Norm(0.958416, 0.24939, 0.138724) UV(0.87571, 0.996285) +V 2037: Pos(0.373902, 1.972552, 6.511814) Norm(0.0, 0.428661, 0.903465) UV(0.755338, 0.202808) +V 2038: Pos(0.0, 1.972552, 6.511814) Norm(0.0, 0.428661, 0.903465) UV(0.73327, 0.202808) +V 2039: Pos(0.480854, 1.807884, 6.488729) Norm(0.92019, 0.0, 0.391473) UV(0.796301, 0.753152) +V 2040: Pos(0.480854, 1.395656, 6.488729) Norm(0.920189, 0.0, 0.391473) UV(0.796301, 0.728822) +V 2041: Pos(0.690464, 1.340286, 5.996024) Norm(0.92019, 0.0, 0.391473) UV(0.764699, 0.725554) +V 2042: Pos(0.461775, 1.222826, 6.447432) Norm(0.812989, -0.421681, 0.40154) UV(0.594899, 0.769501) +V 2043: Pos(0.267407, 0.533866, 6.113513) Norm(0.807766, -0.42828, 0.405081) UV(0.641489, 0.767802) +V 2044: Pos(0.489382, 0.562264, 5.698396) Norm(0.81285, -0.421419, 0.402096) UV(0.646164, 0.740363) +V 2045: Pos(0.165463, 0.519704, 6.176092) Norm(0.0, -0.423589, 0.905854) UV(0.580206, 0.01137) +V 2046: Pos(0.367974, 1.254185, 6.519545) Norm(0.0, -0.423589, 0.905854) UV(0.628061, 0.023322) +V 2047: Pos(0.688387, 2.263284, 5.177258) Norm(0.918418, 0.393741, 0.038414) UV(0.972436, 0.706631) +V 2048: Pos(0.482945, 2.661426, 6.008123) Norm(0.918228, 0.394211, 0.038142) UV(0.941733, 0.753121) +V 2049: Pos(0.688516, 2.222282, 5.61433) Norm(0.918394, 0.3938, 0.038399) UV(0.972321, 0.73254) +V 2050: Pos(0.688583, 2.347369, 4.284067) Norm(0.919175, 0.392122, 0.036835) UV(0.077698, 0.956757) +V 2051: Pos(0.50786, 2.730895, 4.711029) Norm(0.919175, 0.392122, 0.036835) UV(0.067036, 0.990632) +V 2052: Pos(0.688583, 2.283926, 4.959442) Norm(0.919175, 0.392122, 0.036835) UV(0.099046, 0.990628) +V 2053: Pos(0.482663, 2.897745, 3.617621) Norm(0.920111, 0.389845, 0.037639) UV(0.100552, 0.972768) +V 2054: Pos(0.688778, 2.370271, 4.042285) Norm(0.920054, 0.389962, 0.037814) UV(0.128557, 0.941765) +V 2055: Pos(0.688625, 2.410098, 3.617614) Norm(0.920017, 0.390038, 0.03794) UV(0.103382, 0.941653) +V 2056: Pos(0.366853, 2.973998, 3.610639) Norm(-0.001309, 0.994801, 0.101826) UV(0.703251, 0.933091) +V 2057: Pos(0.362453, 2.868172, 4.647927) Norm(-0.001336, 0.994801, 0.101826) UV(0.764791, 0.93335) +V 2058: Pos(0.354818, 2.715312, 6.06142) Norm(-0.007229, 0.99396, 0.109504) UV(0.948445, 0.076547) +V 2059: Pos(0.0, 2.711394, 6.059947) Norm(0.0, 0.993987, 0.1095) UV(0.969388, 0.076547) +V 2060: Pos(0.0, 1.885951, 6.58776) Norm(0.0, 0.195959, 0.980612) UV(0.403868, 0.961584) +V 2061: Pos(-0.488272, 1.316085, 6.58776) Norm(-0.524314, -0.226629, 0.820813) UV(0.437134, 0.933081) +V 2062: Pos(0.0, 1.316085, 6.58776) Norm(0.0, -0.237789, 0.971317) UV(0.437134, 0.961584) +V 2063: Pos(0.0, 1.316085, 6.58776) Norm(0.0, -0.237789, 0.971317) UV(0.068877, 0.943789) +V 2064: Pos(-0.373902, 1.253412, 6.555117) Norm(0.175232, -0.586814, 0.790533) UV(0.064752, 0.965616) +V 2065: Pos(0.0, 1.253412, 6.555117) Norm(0.0, -0.860554, 0.509359) UV(0.064752, 0.943789) +V 2066: Pos(-0.488272, 1.885951, 6.58776) Norm(-0.516293, 0.172885, 0.83878) UV(0.056973, 0.930938) +V 2067: Pos(0.0, 1.989284, 6.544742) Norm(0.0, 0.938315, 0.345782) UV(0.050458, 0.959446) +V 2068: Pos(-0.373902, 1.989284, 6.544742) Norm(0.310901, 0.642501, 0.700381) UV(0.050444, 0.937619) +V 2069: Pos(0.0, 2.74693, 6.191276) Norm(0.0, 0.803647, 0.595107) UV(0.001609, 0.959441) +V 2070: Pos(-0.373902, 2.643597, 6.234294) Norm(0.292506, 0.094913, 0.951542) UV(0.008167, 0.937622) +V 2071: Pos(0.0, 2.643597, 6.234294) Norm(0.0, -0.345818, 0.938302) UV(0.008143, 0.959448) +V 2072: Pos(-0.488272, 2.74693, 6.191276) Norm(-0.503755, 0.703107, 0.501868) UV(0.00164, 0.930938) +V 2073: Pos(-0.488272, 1.316085, 6.58776) Norm(-0.524314, -0.226629, 0.820813) UV(0.068877, 0.972292) +V 2074: Pos(-0.175157, 0.517274, 6.211589) Norm(0.378368, -0.088955, 0.921371) UV(0.017322, 0.954046) +V 2075: Pos(-0.222585, 0.428923, 6.161959) Norm(-0.298893, -0.810333, 0.504006) UV(0.011417, 0.956837) +V 2076: Pos(0.0, 0.517274, 6.211589) Norm(0.0, 0.475343, 0.879801) UV(0.017284, 0.943822) +V 2077: Pos(0.0, 2.890635, 4.737126) Norm(0.0, 0.995152, 0.098345) UV(0.579877, 0.758158) +V 2078: Pos(-0.373902, 2.878195, 4.863008) Norm(0.259608, 0.917271, 0.302023) UV(0.587261, 0.736331) +V 2079: Pos(0.0, 2.878195, 4.863008) Norm(0.0, 0.633539, 0.773711) UV(0.587261, 0.758158) +V 2080: Pos(-0.488272, 2.74693, 6.191276) Norm(-0.503755, 0.703107, 0.501868) UV(0.665178, 0.729654) +V 2081: Pos(0.0, 2.759371, 6.065393) Norm(-0.0, 0.77421, -0.632928) UV(0.657793, 0.758157) +V 2082: Pos(-0.373902, 2.759371, 6.065393) Norm(0.257772, 0.959635, -0.112493) UV(0.657793, 0.736331) +V 2083: Pos(-0.488272, 2.890635, 4.737126) Norm(-0.550521, 0.830838, 0.081449) UV(0.579877, 0.729654) +V 2084: Pos(0.0, 2.898925, 4.653236) Norm(-1e-06, 0.789587, -0.613639) UV(0.574956, 0.758158) +V 2085: Pos(-0.373902, 2.898925, 4.653236) Norm(0.258475, 0.957766, -0.125997) UV(0.574956, 0.736331) +V 2086: Pos(-0.488272, 3.01024, 3.526832) Norm(-0.535192, 0.840651, 0.082917) UV(0.508881, 0.729654) +V 2087: Pos(-0.373902, 3.00195, 3.610722) Norm(0.250258, 0.912142, 0.324604) UV(0.513802, 0.736331) +V 2088: Pos(0.0, 3.01024, 3.526832) Norm(0.0, 0.995153, 0.098342) UV(0.508881, 0.758157) +V 2089: Pos(0.0, 3.00195, 3.610722) Norm(0.0, 0.673609, 0.739088) UV(0.513802, 0.758157) +V 2090: Pos(-0.516177, 1.983721, 6.46039) Norm(-0.920725, 0.361663, 0.146512) UV(0.969929, 0.852569) +V 2091: Pos(-0.766956, 1.973238, 5.93269) Norm(-0.923521, 0.186713, 0.335032) UV(0.93806, 0.864733) +V 2092: Pos(-0.488272, 1.885951, 6.58776) Norm(-0.516293, 0.172885, 0.83878) UV(0.974589, 0.844275) +V 2093: Pos(-0.526831, 2.598067, 6.171548) Norm(-0.957752, -0.129977, 0.25655) UV(0.969394, 0.892199) +V 2094: Pos(-0.488272, 2.74693, 6.191276) Norm(-0.503755, 0.703107, 0.501868) UV(0.974591, 0.899608) +V 2095: Pos(-0.733206, 2.158842, 5.772384) Norm(-0.754799, 0.321078, 0.572003) UV(0.935248, 0.878799) +V 2096: Pos(-0.766956, 2.150968, 5.656943) Norm(-0.9308, 0.347257, 0.114127) UV(0.92865, 0.881243) +V 2097: Pos(-0.737986, 2.052176, 5.965617) Norm(-0.557046, 0.735082, 0.386464) UV(0.942294, 0.868009) +V 2098: Pos(-0.766956, 1.973238, 5.93269) Norm(-0.923521, 0.186713, 0.335032) UV(0.938224, 0.864658) +V 2099: Pos(-0.488272, 1.885951, 6.58776) Norm(-0.516293, 0.172885, 0.83878) UV(0.158292, 0.972503) +V 2100: Pos(-0.732419, 1.873536, 6.013872) Norm(-0.74254, -0.296215, 0.600743) UV(0.159017, 0.936096) +V 2101: Pos(-0.522809, 1.807884, 6.506578) Norm(-0.952615, -0.302268, 0.034051) UV(0.16285, 0.967353) +V 2102: Pos(-0.766956, 1.973238, 5.93269) Norm(-0.923521, 0.186713, 0.335032) UV(0.153197, 0.930946) +V 2103: Pos(-0.732419, 1.340286, 6.013872) Norm(-0.738224, 0.297332, 0.605491) UV(0.190146, 0.936096) +V 2104: Pos(-0.766956, 1.24247, 5.93269) Norm(-0.877703, -0.232622, 0.418958) UV(0.195856, 0.930946) +V 2105: Pos(-0.522809, 1.395656, 6.506578) Norm(-0.952296, 0.302448, 0.040707) UV(0.186914, 0.967353) +V 2106: Pos(-0.488272, 1.316085, 6.58776) Norm(-0.524314, -0.226629, 0.820813) UV(0.191559, 0.972503) +V 2107: Pos(-0.488272, 1.316085, 6.58776) Norm(-0.524314, -0.226629, 0.820813) UV(0.368822, 0.905241) +V 2108: Pos(-0.710827, 1.167881, 5.971722) Norm(-0.554431, -0.616967, 0.558533) UV(0.349668, 0.9395) +V 2109: Pos(-0.503636, 1.215853, 6.464633) Norm(-0.778282, -0.588729, 0.218347) UV(0.360945, 0.910228) +V 2110: Pos(-0.766956, 1.24247, 5.93269) Norm(-0.877703, -0.232622, 0.418958) UV(0.35337, 0.94412) +V 2111: Pos(-0.531027, 0.554498, 5.715254) Norm(-0.649304, -0.216804, 0.728972) UV(0.309454, 0.937765) +V 2112: Pos(-0.56821, 0.456401, 5.572929) Norm(-0.53404, -0.799561, 0.274779) UV(0.301513, 0.944382) +V 2113: Pos(-0.308144, 0.5261, 6.130371) Norm(-0.985357, 0.036307, 0.166592) UV(0.31484, 0.910772) +V 2114: Pos(-0.222585, 0.428923, 6.161959) Norm(-0.298893, -0.810333, 0.504006) UV(0.30935, 0.905241) +V 2115: Pos(-0.730492, 2.301805, 4.961122) Norm(-0.830655, 0.521959, -0.193834) UV(0.822707, 0.612533) +V 2116: Pos(-0.766956, 2.201389, 5.120191) Norm(-0.918601, 0.393403, 0.037499) UV(0.817347, 0.602716) +V 2117: Pos(-0.730261, 2.281237, 5.179009) Norm(-0.522648, 0.770092, 0.365783) UV(0.822764, 0.599757) +V 2118: Pos(-0.73039, 2.240236, 5.616081) Norm(-0.518232, 0.829944, -0.206466) UV(0.822878, 0.574131) +V 2119: Pos(-0.766956, 2.150968, 5.656943) Norm(-0.9308, 0.347257, 0.114127) UV(0.817487, 0.571245) +V 2120: Pos(-0.524819, 2.679379, 6.009874) Norm(-0.934391, 0.287809, -0.209953) UV(0.853132, 0.553776) +V 2121: Pos(-0.488272, 2.74693, 6.191276) Norm(-0.503755, 0.703107, 0.501868) UV(0.858537, 0.543625) +V 2122: Pos(-0.524981, 2.789467, 4.896599) Norm(-0.935697, 0.233318, 0.264637) UV(0.853132, 0.619081) +V 2123: Pos(-0.488272, 3.01024, 3.526832) Norm(-0.535192, 0.840651, 0.082917) UV(0.858537, 0.699922) +V 2124: Pos(-0.730571, 2.427881, 3.619344) Norm(-0.693203, 0.622572, 0.363144) UV(0.822357, 0.691204) +V 2125: Pos(-0.52461, 2.915529, 3.619351) Norm(-0.948615, 0.077939, 0.306685) UV(0.853132, 0.694003) +V 2126: Pos(-0.766956, 2.351064, 3.526832) Norm(-0.920186, 0.389709, 0.037212) UV(0.816931, 0.696138) +V 2127: Pos(-0.730725, 2.388055, 4.044015) Norm(-0.505329, 0.843833, -0.180523) UV(0.822468, 0.666305) +V 2128: Pos(-0.549769, 2.748773, 4.712708) Norm(-0.998414, 0.052889, -0.019295) UV(0.849419, 0.62953) +V 2129: Pos(-0.488272, 2.890635, 4.737126) Norm(-0.550521, 0.830838, 0.081449) UV(0.858536, 0.628926) +V 2130: Pos(-0.524446, 2.825373, 4.530937) Norm(-0.932608, 0.308597, -0.18711) UV(0.853132, 0.640529) +V 2131: Pos(-0.766956, 2.29922, 4.078731) Norm(-0.920004, 0.390141, 0.037172) UV(0.817075, 0.663779) +V 2132: Pos(-0.730492, 2.365248, 4.285747) Norm(-0.853926, 0.451532, 0.258706) UV(0.822531, 0.652132) +V 2133: Pos(-0.373902, 1.253412, 6.555117) Norm(0.175232, -0.586814, 0.790533) UV(0.974778, 0.139585) +V 2134: Pos(-0.165463, 0.519704, 6.176092) Norm(0.477029, 0.863804, 0.162126) UV(0.972881, 0.189269) +V 2135: Pos(-0.367974, 1.254185, 6.519545) Norm(0.796609, -0.581384, 0.16555) UV(0.972873, 0.140483) +V 2136: Pos(-0.710827, 1.167881, 5.971722) Norm(-0.554431, -0.616967, 0.558533) UV(0.877173, 0.265587) +V 2137: Pos(-0.489382, 0.562264, 5.698396) Norm(0.075122, 0.641562, 0.763384) UV(0.874825, 0.306412) +V 2138: Pos(-0.668815, 1.167843, 5.966711) Norm(0.219657, -0.779615, 0.586473) UV(0.874825, 0.266353) +V 2139: Pos(-0.524819, 2.679379, 6.009874) Norm(-0.934391, 0.287809, -0.209953) UV(0.756641, 0.207177) +V 2140: Pos(-0.483108, 2.771514, 4.894848) Norm(-0.19071, -0.525614, 0.829072) UV(0.75398, 0.27248) +V 2141: Pos(-0.482945, 2.661426, 6.008123) Norm(-0.185635, -0.343185, -0.920741) UV(0.75398, 0.207175) +V 2142: Pos(-0.175157, 0.517274, 6.211589) Norm(0.378368, -0.088955, 0.921371) UV(0.270361, 0.020393) +V 2143: Pos(0.0, 0.519704, 6.176092) Norm(0.0, 0.997665, 0.068296) UV(0.272438, 0.010168) +V 2144: Pos(-0.165463, 0.519704, 6.176092) Norm(0.477029, 0.863804, 0.162126) UV(0.272438, 0.019827) +V 2145: Pos(-0.308144, 0.5261, 6.130371) Norm(-0.985357, 0.036307, 0.166592) UV(0.396425, 0.185762) +V 2146: Pos(-0.461775, 1.222826, 6.447432) Norm(-0.318355, -0.523718, -0.790171) UV(0.441928, 0.188348) +V 2147: Pos(-0.267407, 0.533866, 6.113513) Norm(-0.333301, 0.839972, -0.428203) UV(0.395817, 0.188303) +V 2148: Pos(-0.524981, 2.789467, 4.896599) Norm(-0.935697, 0.233318, 0.264637) UV(0.875692, 0.312096) +V 2149: Pos(-0.688387, 2.263284, 5.177258) Norm(0.346989, 0.755064, 0.556307) UV(0.873031, 0.348093) +V 2150: Pos(-0.483108, 2.771514, 4.894848) Norm(-0.19071, -0.525614, 0.829072) UV(0.873031, 0.312099) +V 2151: Pos(-0.733206, 2.158842, 5.772384) Norm(-0.754799, 0.321078, 0.572003) UV(0.457773, 0.169347) +V 2152: Pos(-0.656844, 2.043442, 5.949746) Norm(0.215269, 0.941373, 0.259762) UV(0.470752, 0.17135) +V 2153: Pos(-0.660669, 2.139582, 5.750485) Norm(0.272309, 0.125025, 0.954053) UV(0.458089, 0.1739) +V 2154: Pos(-0.730261, 2.281237, 5.179009) Norm(-0.522648, 0.770092, 0.365783) UV(0.724987, 0.207175) +V 2155: Pos(-0.688516, 2.222282, 5.61433) Norm(0.349045, 0.852119, -0.38995) UV(0.750609, 0.209836) +V 2156: Pos(-0.688387, 2.263284, 5.177258) Norm(0.346989, 0.755064, 0.556307) UV(0.724982, 0.209836) +V 2157: Pos(-0.531027, 0.554498, 5.715254) Norm(-0.649304, -0.216804, 0.728972) UV(0.365879, 0.160232) +V 2158: Pos(-0.267407, 0.533866, 6.113513) Norm(-0.333301, 0.839972, -0.428203) UV(0.36323, 0.188013) +V 2159: Pos(-0.489382, 0.562264, 5.698396) Norm(0.075122, 0.641562, 0.763384) UV(0.36323, 0.160483) +V 2160: Pos(-0.549769, 2.748773, 4.712708) Norm(-0.998414, 0.052889, -0.019295) UV(0.998041, 0.322807) +V 2161: Pos(-0.688583, 2.347369, 4.284067) Norm(0.165511, 0.29966, 0.93958) UV(0.995379, 0.357932) +V 2162: Pos(-0.50786, 2.730895, 4.711029) Norm(-0.392854, -0.906271, -0.156008) UV(0.995379, 0.322807) +V 2163: Pos(-0.73039, 2.240236, 5.616081) Norm(-0.518232, 0.829944, -0.206466) UV(0.753969, 0.312158) +V 2164: Pos(-0.482945, 2.661426, 6.008123) Norm(-0.185635, -0.343185, -0.920741) UV(0.756631, 0.275691) +V 2165: Pos(-0.688516, 2.222282, 5.61433) Norm(0.349045, 0.852119, -0.38995) UV(0.756631, 0.312155) +V 2166: Pos(0.0, 3.00195, 3.610722) Norm(0.0, 0.673609, 0.739088) UV(0.19568, 0.187402) +V 2167: Pos(-0.366853, 2.973998, 3.610639) Norm(0.635257, 0.202781, 0.745203) UV(0.174265, 0.185767) +V 2168: Pos(0.0, 2.973768, 3.611137) Norm(-0.0, 0.005797, 0.999983) UV(0.195681, 0.185757) +V 2169: Pos(-0.730492, 2.301805, 4.961122) Norm(-0.830655, 0.521959, -0.193834) UV(0.528712, 0.063247) +V 2170: Pos(-0.50786, 2.730895, 4.711029) Norm(-0.392854, -0.906271, -0.156008) UV(0.531374, 0.031587) +V 2171: Pos(-0.688583, 2.283926, 4.959442) Norm(0.190281, 0.524079, -0.830141) UV(0.531374, 0.063247) +V 2172: Pos(-0.373902, 3.00195, 3.610722) Norm(0.250258, 0.912142, 0.324604) UV(0.972772, 0.135677) +V 2173: Pos(-0.362453, 2.868172, 4.647927) Norm(0.613268, 0.304818, -0.728689) UV(0.974708, 0.074655) +V 2174: Pos(-0.366853, 2.973998, 3.610639) Norm(0.635257, 0.202781, 0.745203) UV(0.974448, 0.135522) +V 2175: Pos(-0.730492, 2.365248, 4.285747) Norm(-0.853926, 0.451532, 0.258706) UV(0.859273, 0.217881) +V 2176: Pos(-0.688583, 2.283926, 4.959442) Norm(0.190281, 0.524079, -0.830141) UV(0.856612, 0.25748) +V 2177: Pos(-0.688583, 2.347369, 4.284067) Norm(0.165511, 0.29966, 0.93958) UV(0.856612, 0.217881) +V 2178: Pos(-0.522809, 1.807884, 6.506578) Norm(-0.952615, -0.302268, 0.034051) UV(0.987828, 0.417018) +V 2179: Pos(-0.690464, 1.873536, 5.996023) Norm(0.25943, -0.748904, 0.609786) UV(0.985167, 0.448509) +V 2180: Pos(-0.480854, 1.807884, 6.488729) Norm(-0.293171, -0.662681, -0.689133) UV(0.985167, 0.417018) +V 2181: Pos(-0.373902, 2.898925, 4.653236) Norm(0.258475, 0.957766, -0.125997) UV(0.054354, 0.023435) +V 2182: Pos(0.0, 2.867261, 4.649069) Norm(1e-06, 0.150381, -0.988628) UV(0.056219, 0.001608) +V 2183: Pos(-0.362453, 2.868172, 4.647927) Norm(0.613268, 0.304818, -0.728689) UV(0.056176, 0.022767) +V 2184: Pos(-0.522809, 1.395656, 6.506578) Norm(-0.952296, 0.302448, 0.040707) UV(0.041809, 0.062077) +V 2185: Pos(-0.480854, 1.807884, 6.488729) Norm(-0.293171, -0.662681, -0.689133) UV(0.04447, 0.038013) +V 2186: Pos(-0.480854, 1.395656, 6.488729) Norm(-0.290709, 0.669758, -0.683309) UV(0.04447, 0.062077) +V 2187: Pos(-0.732419, 1.873536, 6.013872) Norm(-0.74254, -0.296215, 0.600743) UV(0.994444, 0.515522) +V 2188: Pos(-0.690464, 1.340286, 5.996024) Norm(0.262186, 0.742582, 0.616304) UV(0.991782, 0.546651) +V 2189: Pos(-0.690464, 1.873536, 5.996023) Norm(0.25943, -0.748904, 0.609786) UV(0.991782, 0.515522) +V 2190: Pos(-0.373902, 2.643597, 6.234294) Norm(0.292506, 0.094913, 0.951542) UV(0.997527, 0.361385) +V 2191: Pos(-0.373902, 1.972552, 6.511814) Norm(0.700928, 0.635849, -0.323104) UV(0.995371, 0.40372) +V 2192: Pos(-0.373902, 2.626866, 6.201366) Norm(0.713117, -0.624996, 0.317559) UV(0.995371, 0.361443) +V 2193: Pos(-0.732419, 1.340286, 6.013872) Norm(-0.738224, 0.297332, 0.605491) UV(0.304819, 0.421828) +V 2194: Pos(-0.480854, 1.395656, 6.488729) Norm(-0.290709, 0.669758, -0.683309) UV(0.273396, 0.419166) +V 2195: Pos(-0.690464, 1.340286, 5.996024) Norm(0.262186, 0.742582, 0.616304) UV(0.304819, 0.419166) +V 2196: Pos(-0.52461, 2.915529, 3.619351) Norm(-0.948615, 0.077939, 0.306685) UV(0.306526, 0.500533) +V 2197: Pos(-0.688625, 2.410098, 3.617614) Norm(0.28957, 0.611385, 0.736449) UV(0.303865, 0.531438) +V 2198: Pos(-0.482663, 2.897745, 3.617621) Norm(-0.264614, -0.689709, 0.674004) UV(0.303865, 0.500537) +V 2199: Pos(-0.373902, 1.989284, 6.544742) Norm(0.310901, 0.642501, 0.700381) UV(0.807236, 0.106939) +V 2200: Pos(0.0, 1.972552, 6.511814) Norm(0.0, 0.891506, -0.453008) UV(0.809392, 0.085112) +V 2201: Pos(-0.373902, 1.972552, 6.511814) Norm(0.700928, 0.635849, -0.323104) UV(0.809392, 0.106939) +V 2202: Pos(-0.524446, 2.825373, 4.530937) Norm(-0.932608, 0.308597, -0.18711) UV(0.317693, 0.20931) +V 2203: Pos(-0.482663, 2.897745, 3.617621) Norm(-0.264614, -0.689709, 0.674004) UV(0.371165, 0.211972) +V 2204: Pos(-0.482499, 2.807589, 4.529206) Norm(-0.165042, -0.297767, -0.940264) UV(0.317691, 0.211972) +V 2205: Pos(0.0, 2.643597, 6.234294) Norm(0.0, -0.345818, 0.938302) UV(0.211867, 0.055156) +V 2206: Pos(-0.373902, 2.626866, 6.201366) Norm(0.713117, -0.624996, 0.317559) UV(0.19004, 0.053) +V 2207: Pos(0.0, 2.626866, 6.201366) Norm(0.0, -0.891521, 0.45298) UV(0.211867, 0.053) +V 2208: Pos(0.0, 1.253412, 6.555117) Norm(0.0, -0.860554, 0.509359) UV(0.623425, 0.060135) +V 2209: Pos(-0.367974, 1.254185, 6.519545) Norm(0.796609, -0.581384, 0.16555) UV(0.625502, 0.038654) +V 2210: Pos(0.0, 1.254185, 6.519545) Norm(0.0, -0.999764, -0.021725) UV(0.625502, 0.060135) +V 2211: Pos(-0.730571, 2.427881, 3.619344) Norm(-0.693203, 0.622572, 0.363144) UV(0.585055, 0.162729) +V 2212: Pos(-0.688778, 2.370271, 4.042285) Norm(0.355133, 0.870727, -0.340169) UV(0.560161, 0.160067) +V 2213: Pos(-0.688625, 2.410098, 3.617614) Norm(0.28957, 0.611385, 0.736449) UV(0.58506, 0.160067) +V 2214: Pos(-0.737986, 2.052176, 5.965617) Norm(-0.557046, 0.735082, 0.386464) UV(0.470346, 0.166514) +V 2215: Pos(-0.474337, 1.974987, 6.444519) Norm(-0.236919, 0.607097, -0.758487) UV(0.501674, 0.174092) +V 2216: Pos(-0.373902, 2.759371, 6.065393) Norm(0.257772, 0.959635, -0.112493) UV(0.599857, 0.030135) +V 2217: Pos(0.0, 2.711394, 6.059947) Norm(-1e-06, 0.101517, -0.994834) UV(0.57803, 0.027316) +V 2218: Pos(-0.354818, 2.715312, 6.06142) Norm(0.56604, 0.3164, -0.761243) UV(0.598743, 0.027553) +V 2219: Pos(-0.730725, 2.388055, 4.044015) Norm(-0.505329, 0.843833, -0.180523) UV(0.414441, 0.211982) +V 2220: Pos(-0.482499, 2.807589, 4.529206) Norm(-0.165042, -0.297767, -0.940264) UV(0.37438, 0.20932) +V 2221: Pos(-0.688778, 2.370271, 4.042285) Norm(0.355133, 0.870727, -0.340169) UV(0.414438, 0.20932) +V 2222: Pos(-0.516177, 1.983721, 6.46039) Norm(-0.920725, 0.361663, 0.146512) UV(0.457296, 0.211977) +V 2223: Pos(-0.484991, 2.589333, 6.155677) Norm(-0.278529, -0.958271, -0.064335) UV(0.417768, 0.209318) +V 2224: Pos(-0.474337, 1.974987, 6.444519) Norm(-0.236919, 0.607097, -0.758487) UV(0.457401, 0.209318) +V 2225: Pos(-0.373902, 2.878195, 4.863008) Norm(0.259608, 0.917271, 0.302023) UV(0.314449, 0.211336) +V 2226: Pos(-0.354818, 2.715312, 6.06142) Norm(0.56604, 0.3164, -0.761243) UV(0.243868, 0.209317) +V 2227: Pos(-0.361021, 2.846327, 4.85909) Norm(0.574434, 0.161909, 0.802379) UV(0.314471, 0.209317) +V 2228: Pos(0.0, 2.878195, 4.863008) Norm(0.0, 0.633539, 0.773711) UV(0.45178, 0.110618) +V 2229: Pos(-0.361021, 2.846327, 4.85909) Norm(0.574434, 0.161909, 0.802379) UV(0.430705, 0.108744) +V 2230: Pos(0.0, 2.845042, 4.860431) Norm(-1e-06, -0.099779, 0.99501) UV(0.451781, 0.108677) +V 2231: Pos(-0.526831, 2.598067, 6.171548) Norm(-0.957752, -0.129977, 0.25655) UV(0.641852, 0.126365) +V 2232: Pos(-0.660669, 2.139582, 5.750485) Norm(0.272309, 0.125025, 0.954053) UV(0.646411, 0.089476) +V 2233: Pos(-0.484991, 2.589333, 6.155677) Norm(-0.278529, -0.958271, -0.064335) UV(0.64451, 0.126223) +V 2234: Pos(-0.503636, 1.215853, 6.464633) Norm(-0.778282, -0.588729, 0.218347) UV(0.802523, 0.145623) +V 2235: Pos(-0.668815, 1.167843, 5.966711) Norm(0.219657, -0.779615, 0.586473) UV(0.771862, 0.143248) +V 2236: Pos(-0.461775, 1.222826, 6.447432) Norm(-0.318355, -0.523718, -0.790171) UV(0.802583, 0.142951) +V 2237: Pos(-0.222585, 0.428923, 6.161959) Norm(-0.298893, -0.810333, 0.504006) UV(0.970889, 0.834733) +V 2238: Pos(0.0, 0.456401, 5.572929) Norm(0.0, -0.998914, -0.046599) UV(0.936467, 0.82174) +V 2239: Pos(0.0, 0.428923, 6.161959) Norm(0.0, -0.8746, 0.484846) UV(0.970889, 0.82174) +V 2240: Pos(0.488272, 1.316085, 6.58776) Norm(0.524314, -0.226629, 0.820813) UV(0.437134, 0.933081) +V 2241: Pos(0.488272, 1.885951, 6.58776) Norm(0.516293, 0.172885, 0.83878) UV(0.403868, 0.933081) +V 2242: Pos(0.373902, 1.253412, 6.555117) Norm(-0.175233, -0.586815, 0.790533) UV(0.064752, 0.965616) +V 2243: Pos(0.488272, 1.316085, 6.58776) Norm(0.524314, -0.226629, 0.820813) UV(0.068877, 0.972292) +V 2244: Pos(0.488272, 1.885951, 6.58776) Norm(0.516293, 0.172885, 0.83878) UV(0.056973, 0.930938) +V 2245: Pos(0.0, 1.885951, 6.58776) Norm(0.0, 0.195959, 0.980612) UV(0.056992, 0.959441) +V 2246: Pos(0.373902, 2.643597, 6.234294) Norm(-0.292506, 0.094913, 0.951542) UV(0.008167, 0.937622) +V 2247: Pos(0.488272, 2.74693, 6.191276) Norm(0.503755, 0.703107, 0.501867) UV(0.00164, 0.930938) +V 2248: Pos(0.373902, 1.989284, 6.544742) Norm(-0.310901, 0.642501, 0.700381) UV(0.050444, 0.937619) +V 2249: Pos(0.175157, 0.517274, 6.211589) Norm(-0.378368, -0.088955, 0.921371) UV(0.017322, 0.954046) +V 2250: Pos(0.222585, 0.428923, 6.161959) Norm(0.298893, -0.810333, 0.504006) UV(0.011417, 0.956837) +V 2251: Pos(0.0, 0.428923, 6.161959) Norm(0.0, -0.8746, 0.484846) UV(0.011368, 0.943844) +V 2252: Pos(0.373902, 2.878195, 4.863008) Norm(-0.259612, 0.91727, 0.302024) UV(0.587261, 0.736331) +V 2253: Pos(0.488272, 2.890635, 4.737126) Norm(0.550521, 0.830838, 0.081449) UV(0.579877, 0.729654) +V 2254: Pos(0.488272, 2.74693, 6.191276) Norm(0.503755, 0.703107, 0.501867) UV(0.665178, 0.729654) +V 2255: Pos(0.0, 2.74693, 6.191276) Norm(0.0, 0.803647, 0.595107) UV(0.665178, 0.758157) +V 2256: Pos(0.373902, 2.759371, 6.065393) Norm(-0.257773, 0.959635, -0.112493) UV(0.657793, 0.736331) +V 2257: Pos(0.488272, 3.01024, 3.526832) Norm(0.535184, 0.840658, 0.082901) UV(0.508881, 0.729654) +V 2258: Pos(0.373902, 2.898925, 4.653236) Norm(-0.258475, 0.957766, -0.125997) UV(0.574956, 0.736331) +V 2259: Pos(0.373902, 3.00195, 3.610722) Norm(-0.250259, 0.912142, 0.324604) UV(0.513802, 0.736331) +V 2260: Pos(0.516177, 1.983721, 6.46039) Norm(0.920725, 0.361663, 0.146513) UV(0.969929, 0.852569) +V 2261: Pos(0.766956, 1.973238, 5.93269) Norm(0.923523, 0.186719, 0.335023) UV(0.93806, 0.864733) +V 2262: Pos(0.737986, 2.052176, 5.965617) Norm(0.557056, 0.73507, 0.386472) UV(0.942083, 0.868139) +V 2263: Pos(0.526831, 2.598067, 6.171548) Norm(0.957751, -0.129977, 0.256552) UV(0.969394, 0.892199) +V 2264: Pos(0.488272, 1.885951, 6.58776) Norm(0.516293, 0.172885, 0.83878) UV(0.974589, 0.844275) +V 2265: Pos(0.733206, 2.158842, 5.772384) Norm(0.754779, 0.321112, 0.57201) UV(0.935248, 0.878799) +V 2266: Pos(0.488272, 2.74693, 6.191276) Norm(0.503755, 0.703107, 0.501867) UV(0.974591, 0.899608) +V 2267: Pos(0.737986, 2.052176, 5.965617) Norm(0.557056, 0.73507, 0.386472) UV(0.942294, 0.868009) +V 2268: Pos(0.766956, 2.150968, 5.656943) Norm(0.930835, 0.347125, 0.114242) UV(0.92865, 0.881243) +V 2269: Pos(0.488272, 1.885951, 6.58776) Norm(0.516293, 0.172885, 0.83878) UV(0.158292, 0.972503) +V 2270: Pos(0.732419, 1.873536, 6.013872) Norm(0.74254, -0.296215, 0.600743) UV(0.159017, 0.936096) +V 2271: Pos(0.766956, 1.973238, 5.93269) Norm(0.923523, 0.186719, 0.335023) UV(0.153197, 0.930946) +V 2272: Pos(0.732419, 1.340286, 6.013872) Norm(0.738224, 0.297332, 0.605491) UV(0.190146, 0.936096) +V 2273: Pos(0.766956, 1.24247, 5.93269) Norm(0.877702, -0.232621, 0.418959) UV(0.195856, 0.930946) +V 2274: Pos(0.522809, 1.395656, 6.506578) Norm(0.952296, 0.302448, 0.040707) UV(0.186914, 0.967353) +V 2275: Pos(0.488272, 1.316085, 6.58776) Norm(0.524314, -0.226629, 0.820813) UV(0.191559, 0.972503) +V 2276: Pos(0.522809, 1.807884, 6.506578) Norm(0.952615, -0.302268, 0.034051) UV(0.16285, 0.967353) +V 2277: Pos(0.488272, 1.316085, 6.58776) Norm(0.524314, -0.226629, 0.820813) UV(0.368822, 0.905241) +V 2278: Pos(0.710827, 1.167881, 5.971722) Norm(0.554431, -0.616967, 0.558532) UV(0.349668, 0.9395) +V 2279: Pos(0.766956, 1.24247, 5.93269) Norm(0.877702, -0.232621, 0.418959) UV(0.35337, 0.94412) +V 2280: Pos(0.531027, 0.554498, 5.715254) Norm(0.649317, -0.216798, 0.728962) UV(0.309454, 0.937765) +V 2281: Pos(0.56821, 0.456401, 5.572929) Norm(0.53405, -0.799554, 0.274781) UV(0.301513, 0.944382) +V 2282: Pos(0.308144, 0.5261, 6.130371) Norm(0.985357, 0.03632, 0.16659) UV(0.31484, 0.910772) +V 2283: Pos(0.222585, 0.428923, 6.161959) Norm(0.298893, -0.810333, 0.504006) UV(0.30935, 0.905241) +V 2284: Pos(0.503636, 1.215853, 6.464633) Norm(0.778287, -0.58872, 0.218352) UV(0.360945, 0.910228) +V 2285: Pos(0.730492, 2.301805, 4.961122) Norm(0.830688, 0.521868, -0.193933) UV(0.822707, 0.612533) +V 2286: Pos(0.730261, 2.281237, 5.179009) Norm(0.522723, 0.770031, 0.365805) UV(0.822764, 0.599757) +V 2287: Pos(0.766956, 2.201389, 5.120191) Norm(0.918601, 0.393403, 0.037499) UV(0.817347, 0.602716) +V 2288: Pos(0.73039, 2.240236, 5.616081) Norm(0.51822, 0.829943, -0.2065) UV(0.822878, 0.574131) +V 2289: Pos(0.766956, 2.150968, 5.656943) Norm(0.930835, 0.347125, 0.114242) UV(0.817487, 0.571245) +V 2290: Pos(0.524819, 2.679379, 6.009874) Norm(0.934391, 0.287809, -0.209953) UV(0.853132, 0.553776) +V 2291: Pos(0.488272, 2.74693, 6.191276) Norm(0.503755, 0.703107, 0.501867) UV(0.858537, 0.543625) +V 2292: Pos(0.524981, 2.789467, 4.896599) Norm(0.935698, 0.233318, 0.264637) UV(0.853132, 0.619081) +V 2293: Pos(0.488272, 2.890635, 4.737126) Norm(0.550521, 0.830838, 0.081449) UV(0.858536, 0.628926) +V 2294: Pos(0.488272, 3.01024, 3.526832) Norm(0.535184, 0.840658, 0.082901) UV(0.858537, 0.699922) +V 2295: Pos(0.730571, 2.427881, 3.619344) Norm(0.69322, 0.622574, 0.363107) UV(0.822357, 0.691204) +V 2296: Pos(0.766956, 2.351064, 3.526832) Norm(0.920134, 0.38983, 0.037219) UV(0.816931, 0.696138) +V 2297: Pos(0.730725, 2.388055, 4.044015) Norm(0.505318, 0.843846, -0.180493) UV(0.822468, 0.666305) +V 2298: Pos(0.766956, 2.29922, 4.078731) Norm(0.919881, 0.390441, 0.037088) UV(0.817075, 0.663779) +V 2299: Pos(0.549769, 2.748773, 4.712708) Norm(0.998414, 0.052889, -0.019295) UV(0.849419, 0.62953) +V 2300: Pos(0.524446, 2.825373, 4.530937) Norm(0.932608, 0.308597, -0.18711) UV(0.853132, 0.640529) +V 2301: Pos(0.52461, 2.915529, 3.619351) Norm(0.948615, 0.077939, 0.306685) UV(0.853132, 0.694003) +V 2302: Pos(0.373902, 1.253412, 6.555117) Norm(-0.175233, -0.586815, 0.790533) UV(0.974778, 0.139585) +V 2303: Pos(0.165463, 0.519704, 6.176092) Norm(-0.477029, 0.863803, 0.162137) UV(0.972881, 0.189269) +V 2304: Pos(0.175157, 0.517274, 6.211589) Norm(-0.378368, -0.088955, 0.921371) UV(0.974853, 0.188405) +V 2305: Pos(0.710827, 1.167881, 5.971722) Norm(0.554431, -0.616967, 0.558532) UV(0.877173, 0.265587) +V 2306: Pos(0.489382, 0.562264, 5.698396) Norm(-0.075163, 0.64153, 0.763407) UV(0.874825, 0.306412) +V 2307: Pos(0.531027, 0.554498, 5.715254) Norm(0.649317, -0.216798, 0.728962) UV(0.877413, 0.305792) +V 2308: Pos(0.524819, 2.679379, 6.009874) Norm(0.934391, 0.287809, -0.209953) UV(0.756641, 0.207177) +V 2309: Pos(0.483108, 2.771514, 4.894848) Norm(0.19071, -0.525614, 0.829072) UV(0.75398, 0.27248) +V 2310: Pos(0.524981, 2.789467, 4.896599) Norm(0.935698, 0.233318, 0.264637) UV(0.756641, 0.272482) +V 2311: Pos(0.175157, 0.517274, 6.211589) Norm(-0.378368, -0.088955, 0.921371) UV(0.270361, 0.020393) +V 2312: Pos(0.0, 0.517274, 6.211589) Norm(0.0, 0.475343, 0.879801) UV(0.270361, 0.010168) +V 2313: Pos(0.308144, 0.5261, 6.130371) Norm(0.985357, 0.03632, 0.16659) UV(0.396425, 0.185762) +V 2314: Pos(0.461775, 1.222826, 6.447432) Norm(0.318449, -0.523786, -0.790087) UV(0.441928, 0.188348) +V 2315: Pos(0.503636, 1.215853, 6.464633) Norm(0.778287, -0.58872, 0.218352) UV(0.442602, 0.185762) +V 2316: Pos(0.524981, 2.789467, 4.896599) Norm(0.935698, 0.233318, 0.264637) UV(0.875692, 0.312096) +V 2317: Pos(0.688387, 2.263284, 5.177258) Norm(-0.346989, 0.755064, 0.556307) UV(0.873031, 0.348093) +V 2318: Pos(0.730261, 2.281237, 5.179009) Norm(0.522723, 0.770031, 0.365805) UV(0.875692, 0.34809) +V 2319: Pos(0.733206, 2.158842, 5.772384) Norm(0.754779, 0.321112, 0.57201) UV(0.457773, 0.169347) +V 2320: Pos(0.656844, 2.043442, 5.949746) Norm(-0.215256, 0.941386, 0.259724) UV(0.470752, 0.17135) +V 2321: Pos(0.737986, 2.052176, 5.965617) Norm(0.557056, 0.73507, 0.386472) UV(0.470346, 0.166514) +V 2322: Pos(0.730261, 2.281237, 5.179009) Norm(0.522723, 0.770031, 0.365805) UV(0.724987, 0.207175) +V 2323: Pos(0.688516, 2.222282, 5.61433) Norm(-0.349045, 0.852119, -0.38995) UV(0.750609, 0.209836) +V 2324: Pos(0.73039, 2.240236, 5.616081) Norm(0.51822, 0.829943, -0.2065) UV(0.750613, 0.207175) +V 2325: Pos(0.531027, 0.554498, 5.715254) Norm(0.649317, -0.216798, 0.728962) UV(0.365879, 0.160232) +V 2326: Pos(0.267407, 0.533866, 6.113513) Norm(0.333314, 0.83997, -0.428196) UV(0.36323, 0.188013) +V 2327: Pos(0.308144, 0.5261, 6.130371) Norm(0.985357, 0.03632, 0.16659) UV(0.365833, 0.187787) +V 2328: Pos(0.549769, 2.748773, 4.712708) Norm(0.998414, 0.052889, -0.019295) UV(0.998041, 0.322807) +V 2329: Pos(0.688583, 2.347369, 4.284067) Norm(-0.165511, 0.29966, 0.93958) UV(0.995379, 0.357932) +V 2330: Pos(0.730492, 2.365248, 4.285747) Norm(0.853926, 0.451532, 0.258706) UV(0.998041, 0.357932) +V 2331: Pos(0.73039, 2.240236, 5.616081) Norm(0.51822, 0.829943, -0.2065) UV(0.753969, 0.312158) +V 2332: Pos(0.482945, 2.661426, 6.008123) Norm(0.185635, -0.343185, -0.920741) UV(0.756631, 0.275691) +V 2333: Pos(0.524819, 2.679379, 6.009874) Norm(0.934391, 0.287809, -0.209953) UV(0.753969, 0.275695) +V 2334: Pos(0.366853, 2.973998, 3.610639) Norm(-0.63526, 0.202765, 0.745205) UV(0.174265, 0.185767) +V 2335: Pos(0.373902, 3.00195, 3.610722) Norm(-0.250259, 0.912142, 0.324604) UV(0.173854, 0.187399) +V 2336: Pos(0.730492, 2.301805, 4.961122) Norm(0.830688, 0.521868, -0.193933) UV(0.528712, 0.063247) +V 2337: Pos(0.50786, 2.730895, 4.711029) Norm(0.392854, -0.906271, -0.156008) UV(0.531374, 0.031587) +V 2338: Pos(0.549769, 2.748773, 4.712708) Norm(0.998414, 0.052889, -0.019295) UV(0.528712, 0.031587) +V 2339: Pos(0.373902, 3.00195, 3.610722) Norm(-0.250259, 0.912142, 0.324604) UV(0.972772, 0.135677) +V 2340: Pos(0.362453, 2.868172, 4.647927) Norm(-0.613273, 0.304805, -0.728691) UV(0.974708, 0.074655) +V 2341: Pos(0.373902, 2.898925, 4.653236) Norm(-0.258475, 0.957766, -0.125997) UV(0.972772, 0.074523) +V 2342: Pos(0.730492, 2.365248, 4.285747) Norm(0.853926, 0.451532, 0.258706) UV(0.859273, 0.217881) +V 2343: Pos(0.688583, 2.283926, 4.959442) Norm(-0.190281, 0.524079, -0.830141) UV(0.856612, 0.25748) +V 2344: Pos(0.730492, 2.301805, 4.961122) Norm(0.830688, 0.521868, -0.193933) UV(0.859273, 0.25748) +V 2345: Pos(0.522809, 1.807884, 6.506578) Norm(0.952615, -0.302268, 0.034051) UV(0.987828, 0.417018) +V 2346: Pos(0.690464, 1.873536, 5.996023) Norm(-0.25943, -0.748904, 0.609786) UV(0.985167, 0.448509) +V 2347: Pos(0.732419, 1.873536, 6.013872) Norm(0.74254, -0.296215, 0.600743) UV(0.987828, 0.448509) +V 2348: Pos(0.373902, 2.898925, 4.653236) Norm(-0.258475, 0.957766, -0.125997) UV(0.054354, 0.023435) +V 2349: Pos(0.0, 2.898925, 4.653236) Norm(-1e-06, 0.789587, -0.613639) UV(0.054354, 0.001608) +V 2350: Pos(0.522809, 1.395656, 6.506578) Norm(0.952296, 0.302448, 0.040707) UV(0.041809, 0.062077) +V 2351: Pos(0.480854, 1.807884, 6.488729) Norm(0.293171, -0.662681, -0.689133) UV(0.04447, 0.038013) +V 2352: Pos(0.522809, 1.807884, 6.506578) Norm(0.952615, -0.302268, 0.034051) UV(0.041809, 0.038013) +V 2353: Pos(0.732419, 1.873536, 6.013872) Norm(0.74254, -0.296215, 0.600743) UV(0.994444, 0.515522) +V 2354: Pos(0.690464, 1.340286, 5.996024) Norm(-0.262186, 0.742582, 0.616304) UV(0.991782, 0.546651) +V 2355: Pos(0.732419, 1.340286, 6.013872) Norm(0.738224, 0.297332, 0.605491) UV(0.994444, 0.546651) +V 2356: Pos(0.373902, 2.643597, 6.234294) Norm(-0.292506, 0.094913, 0.951542) UV(0.997527, 0.361385) +V 2357: Pos(0.373902, 1.972552, 6.511814) Norm(-0.700928, 0.635849, -0.323104) UV(0.995371, 0.40372) +V 2358: Pos(0.373902, 1.989284, 6.544742) Norm(-0.310901, 0.642501, 0.700381) UV(0.997527, 0.403662) +V 2359: Pos(0.732419, 1.340286, 6.013872) Norm(0.738224, 0.297332, 0.605491) UV(0.304819, 0.421828) +V 2360: Pos(0.480854, 1.395656, 6.488729) Norm(0.290709, 0.669758, -0.683309) UV(0.273396, 0.419166) +V 2361: Pos(0.522809, 1.395656, 6.506578) Norm(0.952296, 0.302448, 0.040707) UV(0.273396, 0.421828) +V 2362: Pos(0.52461, 2.915529, 3.619351) Norm(0.948615, 0.077939, 0.306685) UV(0.306526, 0.500533) +V 2363: Pos(0.688625, 2.410098, 3.617614) Norm(-0.28957, 0.611385, 0.736449) UV(0.303865, 0.531438) +V 2364: Pos(0.730571, 2.427881, 3.619344) Norm(0.69322, 0.622574, 0.363107) UV(0.306526, 0.531435) +V 2365: Pos(0.373902, 1.989284, 6.544742) Norm(-0.310901, 0.642501, 0.700381) UV(0.807236, 0.106939) +V 2366: Pos(0.0, 1.989284, 6.544742) Norm(0.0, 0.938315, 0.345782) UV(0.807236, 0.085112) +V 2367: Pos(0.524446, 2.825373, 4.530937) Norm(0.932608, 0.308597, -0.18711) UV(0.317693, 0.20931) +V 2368: Pos(0.482663, 2.897745, 3.617621) Norm(0.264614, -0.689709, 0.674004) UV(0.371165, 0.211972) +V 2369: Pos(0.52461, 2.915529, 3.619351) Norm(0.948615, 0.077939, 0.306685) UV(0.371167, 0.20931) +V 2370: Pos(0.373902, 2.626866, 6.201366) Norm(-0.713117, -0.624996, 0.317559) UV(0.19004, 0.053) +V 2371: Pos(0.373902, 2.643597, 6.234294) Norm(-0.292506, 0.094913, 0.951542) UV(0.19004, 0.055156) +V 2372: Pos(0.367974, 1.254185, 6.519545) Norm(-0.796609, -0.581383, 0.165551) UV(0.625502, 0.038654) +V 2373: Pos(0.373902, 1.253412, 6.555117) Norm(-0.175233, -0.586815, 0.790533) UV(0.623425, 0.038308) +V 2374: Pos(0.730571, 2.427881, 3.619344) Norm(0.69322, 0.622574, 0.363107) UV(0.585055, 0.162729) +V 2375: Pos(0.688778, 2.370271, 4.042285) Norm(-0.355133, 0.870727, -0.340169) UV(0.560161, 0.160067) +V 2376: Pos(0.730725, 2.388055, 4.044015) Norm(0.505318, 0.843846, -0.180493) UV(0.560156, 0.162729) +V 2377: Pos(0.474337, 1.974987, 6.444519) Norm(0.236918, 0.607097, -0.758488) UV(0.501674, 0.174092) +V 2378: Pos(0.516177, 1.983721, 6.46039) Norm(0.920725, 0.361663, 0.146513) UV(0.501867, 0.171438) +V 2379: Pos(0.373902, 2.759371, 6.065393) Norm(-0.257773, 0.959635, -0.112493) UV(0.599857, 0.030135) +V 2380: Pos(0.0, 2.759371, 6.065393) Norm(-0.0, 0.77421, -0.632928) UV(0.57803, 0.030135) +V 2381: Pos(0.730725, 2.388055, 4.044015) Norm(0.505318, 0.843846, -0.180493) UV(0.414441, 0.211982) +V 2382: Pos(0.482499, 2.807589, 4.529206) Norm(0.165042, -0.297767, -0.940264) UV(0.37438, 0.20932) +V 2383: Pos(0.524446, 2.825373, 4.530937) Norm(0.932608, 0.308597, -0.18711) UV(0.374382, 0.211982) +V 2384: Pos(0.516177, 1.983721, 6.46039) Norm(0.920725, 0.361663, 0.146513) UV(0.457296, 0.211977) +V 2385: Pos(0.484991, 2.589333, 6.155677) Norm(0.278529, -0.958271, -0.064335) UV(0.417768, 0.209318) +V 2386: Pos(0.526831, 2.598067, 6.171548) Norm(0.957751, -0.129977, 0.256552) UV(0.417662, 0.211977) +V 2387: Pos(0.373902, 2.878195, 4.863008) Norm(-0.259612, 0.91727, 0.302024) UV(0.314449, 0.211336) +V 2388: Pos(0.354818, 2.715312, 6.06142) Norm(-0.56604, 0.316398, -0.761243) UV(0.243868, 0.209317) +V 2389: Pos(0.373902, 2.759371, 6.065393) Norm(-0.257773, 0.959635, -0.112493) UV(0.243921, 0.212129) +V 2390: Pos(0.361021, 2.846327, 4.85909) Norm(-0.574436, 0.161892, 0.802381) UV(0.430705, 0.108744) +V 2391: Pos(0.373902, 2.878195, 4.863008) Norm(-0.259612, 0.91727, 0.302024) UV(0.429954, 0.110618) +V 2392: Pos(0.526831, 2.598067, 6.171548) Norm(0.957751, -0.129977, 0.256552) UV(0.641852, 0.126365) +V 2393: Pos(0.660669, 2.139582, 5.750485) Norm(-0.272317, 0.125021, 0.954051) UV(0.646411, 0.089476) +V 2394: Pos(0.733206, 2.158842, 5.772384) Norm(0.754779, 0.321112, 0.57201) UV(0.641852, 0.089684) +V 2395: Pos(0.503636, 1.215853, 6.464633) Norm(0.778287, -0.58872, 0.218352) UV(0.802523, 0.145623) +V 2396: Pos(0.668815, 1.167843, 5.966711) Norm(-0.219663, -0.779614, 0.586473) UV(0.771862, 0.143248) +V 2397: Pos(0.710827, 1.167881, 5.971722) Norm(0.554431, -0.616967, 0.558532) UV(0.771185, 0.145623) +V 2398: Pos(0.730492, 2.365248, 4.285747) Norm(0.853926, 0.451532, 0.258706) UV(0.822531, 0.652132) +V 2399: Pos(0.222585, 0.428923, 6.161959) Norm(0.298893, -0.810333, 0.504006) UV(0.970889, 0.834733) +V 2400: Pos(0.56821, 0.456401, 5.572929) Norm(0.53405, -0.799554, 0.274781) UV(0.936467, 0.854909) +V 2401: Pos(-0.894965, 2.62882, 0.630966) Norm(0.212132, 0.730274, 0.649384) UV(0.938511, 0.764133) +V 2402: Pos(-2.016632, 2.62882, 0.031415) Norm(-0.179542, 0.98375, 1e-06) UV(0.902912, 0.697534) +V 2403: Pos(-2.016632, 2.62882, 0.630966) Norm(-0.394535, 0.623438, 0.675031) UV(0.938511, 0.697534) +V 2404: Pos(-3.478066, 2.077005, 0.337888) Norm(-0.658808, 0.455472, 0.598763) UV(0.963752, 0.393472) +V 2405: Pos(-3.478066, 1.153763, 0.031415) Norm(-0.82256, -0.568679, 0.0) UV(0.981949, 0.448289) +V 2406: Pos(-3.478066, 1.153763, 0.337888) Norm(-0.658819, -0.45545, 0.598768) UV(0.963752, 0.448289) +V 2407: Pos(-2.209737, 0.674862, 0.031415) Norm(-0.179187, -0.983815, -0.0) UV(0.968083, 0.681676) +V 2408: Pos(-3.478066, 1.153763, 0.337888) Norm(-0.658819, -0.45545, 0.598768) UV(0.949886, 0.601179) +V 2409: Pos(-3.478066, 1.153763, 0.031415) Norm(-0.82256, -0.568679, 0.0) UV(0.968083, 0.601179) +V 2410: Pos(-0.648541, 0.674862, 0.021751) Norm(0.708517, -0.705694, -0.0) UV(0.615291, 0.851725) +V 2411: Pos(-2.016632, 0.674862, 0.630966) Norm(-0.374212, -0.614324, 0.694674) UV(0.53406, 0.887897) +V 2412: Pos(-2.209737, 0.674862, 0.031415) Norm(-0.179187, -0.983815, -0.0) UV(0.522594, 0.852299) +V 2413: Pos(-2.016632, 2.62882, 0.031415) Norm(-0.179542, 0.98375, 1e-06) UV(0.918195, 0.60118) +V 2414: Pos(-2.209737, 2.555906, 0.337873) Norm(-0.553102, 0.723718, 0.412687) UV(0.899999, 0.613436) +V 2415: Pos(-2.016632, 2.62882, 0.630966) Norm(-0.394535, 0.623438, 0.675031) UV(0.882597, 0.60118) +V 2416: Pos(-0.894965, 2.62882, 0.031415) Norm(0.278944, 0.960307, 0.0) UV(0.975047, 0.831639) +V 2417: Pos(-0.648541, 2.472465, 0.630966) Norm(0.317375, 0.500201, 0.80565) UV(0.992376, 0.796041) +V 2418: Pos(-0.648541, 2.472465, 0.031415) Norm(0.535752, 0.844375, 0.0) UV(0.992376, 0.831639) +V 2419: Pos(-3.478066, 2.077005, 0.337888) Norm(-0.658808, 0.455472, 0.598763) UV(0.739573, 0.600351) +V 2420: Pos(-2.209737, 0.674862, 0.337873) Norm(-0.380889, -0.822074, 0.423224) UV(0.664266, 0.683603) +V 2421: Pos(-2.209737, 2.555906, 0.337873) Norm(-0.553102, 0.723718, 0.412687) UV(0.664266, 0.571916) +V 2422: Pos(-3.478066, 2.077005, 0.031415) Norm(-0.822576, 0.568655, 0.0) UV(0.918195, 0.693933) +V 2423: Pos(-2.016632, 2.62882, 0.630966) Norm(-0.394535, 0.623438, 0.675031) UV(0.001969, 0.926089) +V 2424: Pos(-2.209737, 0.674862, 0.337873) Norm(-0.380889, -0.822074, 0.423224) UV(0.117986, 0.905249) +V 2425: Pos(-2.016632, 0.674862, 0.630966) Norm(-0.374212, -0.614324, 0.694674) UV(0.117986, 0.926089) +V 2426: Pos(-2.016632, 0.674862, 0.630966) Norm(-0.374212, -0.614324, 0.694674) UV(0.856923, 0.365637) +V 2427: Pos(-0.648541, 0.674862, 0.630966) Norm(0.577331, -0.57736, 0.57736) UV(0.856923, 0.446868) +V 2428: Pos(-0.648541, 0.924291, 0.630966) Norm(0.447219, 0.0, 0.894425) UV(0.842113, 0.446868) +V 2429: Pos(-0.648541, 0.924291, 0.021751) Norm(1.0, 0.0, 0.0) UV(0.740903, 0.35898) +V 2430: Pos(-0.648541, 0.674862, 0.630966) Norm(0.577331, -0.57736, 0.57736) UV(0.755713, 0.322808) +V 2431: Pos(-0.648541, 0.674862, 0.021751) Norm(0.708517, -0.705694, -0.0) UV(0.755713, 0.35898) +V 2432: Pos(-0.894965, 2.62882, -7.759468) Norm(0.212132, 0.730274, -0.649384) UV(0.570129, 0.927995) +V 2433: Pos(-2.016632, 2.62882, -7.159917) Norm(-0.179542, 0.98375, -1e-06) UV(0.50353, 0.892396) +V 2434: Pos(-0.894965, 2.62882, -7.159917) Norm(0.278944, 0.960307, 0.0) UV(0.570129, 0.892396) +V 2435: Pos(-3.478066, 2.077005, -7.46639) Norm(-0.658808, 0.455472, -0.598763) UV(0.982619, 0.333511) +V 2436: Pos(-3.478066, 1.153763, -7.159917) Norm(-0.822559, -0.568679, 0.0) UV(0.964422, 0.388329) +V 2437: Pos(-3.478066, 2.077005, -7.159917) Norm(-0.822576, 0.568655, -0.0) UV(0.964422, 0.333511) +V 2438: Pos(-2.209737, 0.674862, -7.159917) Norm(-0.17954, -0.983751, 0.0) UV(0.572428, 0.569058) +V 2439: Pos(-3.478066, 1.153763, -7.46639) Norm(-0.658818, -0.45545, -0.598768) UV(0.652925, 0.587255) +V 2440: Pos(-2.209737, 0.674862, -7.466375) Norm(-0.380889, -0.822074, -0.423224) UV(0.572428, 0.587254) +V 2441: Pos(-2.209737, 0.674862, -7.159917) Norm(-0.17954, -0.983751, 0.0) UV(0.711197, 0.866706) +V 2442: Pos(-2.016632, 0.674862, -7.759468) Norm(-0.374212, -0.614324, -0.694674) UV(0.699731, 0.902305) +V 2443: Pos(-0.648541, 0.674862, -7.159917) Norm(0.707123, -0.707091, 0.0) UV(0.6185, 0.866706) +V 2444: Pos(-2.016632, 2.62882, -7.159917) Norm(-0.179542, 0.98375, -1e-06) UV(0.933256, 0.867376) +V 2445: Pos(-2.016632, 2.62882, -7.759468) Norm(-0.394535, 0.623438, -0.675031) UV(0.897658, 0.867376) +V 2446: Pos(-2.209737, 2.555906, -7.466375) Norm(-0.553103, 0.723718, -0.412686) UV(0.91506, 0.85512) +V 2447: Pos(-0.894965, 2.62882, -7.159917) Norm(0.278944, 0.960307, 0.0) UV(0.977806, 0.836726) +V 2448: Pos(-0.648541, 2.472465, -7.759468) Norm(0.317375, 0.500202, -0.80565) UV(0.995134, 0.872325) +V 2449: Pos(-0.894965, 2.62882, -7.759468) Norm(0.212132, 0.730274, -0.649384) UV(0.977806, 0.872325) +V 2450: Pos(-3.478066, 2.077005, -7.46639) Norm(-0.658808, 0.455472, -0.598763) UV(0.592185, 0.644004) +V 2451: Pos(-2.209737, 0.674862, -7.466375) Norm(-0.380889, -0.822074, -0.423224) UV(0.508932, 0.719311) +V 2452: Pos(-3.478066, 1.153763, -7.46639) Norm(-0.658818, -0.45545, -0.598768) UV(0.537367, 0.644004) +V 2453: Pos(-3.478066, 2.077005, -7.159917) Norm(-0.822576, 0.568655, -0.0) UV(0.933256, 0.774623) +V 2454: Pos(-3.478066, 2.077005, -7.46639) Norm(-0.658808, 0.455472, -0.598763) UV(0.915059, 0.774623) +V 2455: Pos(-2.016632, 2.62882, -7.759468) Norm(-0.394535, 0.623438, -0.675031) UV(0.121571, 0.905251) +V 2456: Pos(-2.209737, 0.674862, -7.466375) Norm(-0.380889, -0.822074, -0.423224) UV(0.237588, 0.926091) +V 2457: Pos(-2.209737, 2.555906, -7.466375) Norm(-0.553103, 0.723718, -0.412686) UV(0.1259, 0.926091) +V 2458: Pos(-2.016632, 2.62882, -7.759468) Norm(-0.394535, 0.623438, -0.675031) UV(0.650147, 0.010174) +V 2459: Pos(-0.894965, 2.62882, -7.759468) Norm(0.212132, 0.730274, -0.649384) UV(0.716746, 0.010174) +V 2460: Pos(-0.648541, 0.924291, -7.759468) Norm(0.447219, 0.0, -0.894425) UV(0.731378, 0.111381) +V 2461: Pos(-0.648541, 0.924291, -7.159917) Norm(1.0, 0.0, 0.0) UV(0.799956, 0.001604) +V 2462: Pos(-0.648541, 0.674862, -7.759468) Norm(0.577332, -0.57736, -0.57736) UV(0.764358, 0.016414) +V 2463: Pos(-0.648541, 0.924291, -7.759468) Norm(0.447219, 0.0, -0.894425) UV(0.764358, 0.001604) +V 2464: Pos(0.894965, 2.62882, 0.630966) Norm(-0.212132, 0.730274, 0.649384) UV(0.938511, 0.764133) +V 2465: Pos(2.016632, 2.62882, 0.031415) Norm(0.179542, 0.98375, 1e-06) UV(0.902912, 0.697534) +V 2466: Pos(0.894965, 2.62882, 0.031415) Norm(-0.278944, 0.960307, 0.0) UV(0.902912, 0.764133) +V 2467: Pos(3.478066, 2.077005, 0.337888) Norm(0.658808, 0.455472, 0.598763) UV(0.963752, 0.393472) +V 2468: Pos(3.478066, 1.153763, 0.031415) Norm(0.82256, -0.568679, 0.0) UV(0.981949, 0.448289) +V 2469: Pos(3.478066, 2.077005, 0.031415) Norm(0.822576, 0.568655, 0.0) UV(0.981949, 0.393472) +V 2470: Pos(2.209737, 0.674862, 0.031415) Norm(0.179187, -0.983815, 0.0) UV(0.968083, 0.681676) +V 2471: Pos(3.478066, 1.153763, 0.337888) Norm(0.658819, -0.45545, 0.598768) UV(0.949886, 0.601179) +V 2472: Pos(2.209737, 0.674862, 0.337873) Norm(0.380889, -0.822074, 0.423224) UV(0.949887, 0.681676) +V 2473: Pos(2.209737, 0.674862, 0.031415) Norm(0.179187, -0.983815, 0.0) UV(0.522594, 0.852299) +V 2474: Pos(2.016632, 0.674862, 0.630966) Norm(0.374212, -0.614324, 0.694674) UV(0.53406, 0.887897) +V 2475: Pos(0.648541, 0.674862, 0.021751) Norm(-0.708517, -0.705694, 0.0) UV(0.615291, 0.851725) +V 2476: Pos(2.016632, 2.62882, 0.031415) Norm(0.179542, 0.98375, 1e-06) UV(0.918195, 0.60118) +V 2477: Pos(2.016632, 2.62882, 0.630966) Norm(0.394535, 0.623438, 0.675031) UV(0.882597, 0.60118) +V 2478: Pos(2.209737, 2.555906, 0.337873) Norm(0.553102, 0.723718, 0.412687) UV(0.899999, 0.613436) +V 2479: Pos(0.894965, 2.62882, 0.031415) Norm(-0.278944, 0.960307, 0.0) UV(0.975047, 0.831639) +V 2480: Pos(0.648541, 2.472465, 0.630966) Norm(-0.317375, 0.500201, 0.80565) UV(0.992376, 0.796041) +V 2481: Pos(0.894965, 2.62882, 0.630966) Norm(-0.212132, 0.730274, 0.649384) UV(0.975047, 0.796041) +V 2482: Pos(3.478066, 2.077005, 0.337888) Norm(0.658808, 0.455472, 0.598763) UV(0.739573, 0.600351) +V 2483: Pos(2.209737, 0.674862, 0.337873) Norm(0.380889, -0.822074, 0.423224) UV(0.664266, 0.683603) +V 2484: Pos(3.478066, 1.153763, 0.337888) Norm(0.658819, -0.45545, 0.598768) UV(0.739573, 0.655168) +V 2485: Pos(3.478066, 2.077005, 0.031415) Norm(0.822576, 0.568655, 0.0) UV(0.918195, 0.693933) +V 2486: Pos(3.478066, 2.077005, 0.337888) Norm(0.658808, 0.455472, 0.598763) UV(0.899998, 0.693933) +V 2487: Pos(2.016632, 2.62882, 0.630966) Norm(0.394535, 0.623438, 0.675031) UV(0.001969, 0.926089) +V 2488: Pos(2.209737, 0.674862, 0.337873) Norm(0.380889, -0.822074, 0.423224) UV(0.117986, 0.905249) +V 2489: Pos(2.209737, 2.555906, 0.337873) Norm(0.553102, 0.723718, 0.412687) UV(0.006299, 0.905249) +V 2490: Pos(2.016632, 2.62882, 0.630966) Norm(0.394535, 0.623438, 0.675031) UV(0.740905, 0.365637) +V 2491: Pos(0.894965, 2.62882, 0.630966) Norm(-0.212132, 0.730274, 0.649384) UV(0.740905, 0.432236) +V 2492: Pos(0.648541, 0.924291, 0.630966) Norm(-0.447219, 0.0, 0.894425) UV(0.842113, 0.446868) +V 2493: Pos(0.648541, 0.924291, 0.021751) Norm(-1.0, 0.0, 0.0) UV(0.740903, 0.35898) +V 2494: Pos(0.648541, 0.674862, 0.630966) Norm(-0.577331, -0.57736, 0.57736) UV(0.755713, 0.322808) +V 2495: Pos(0.648541, 0.924291, 0.630966) Norm(-0.447219, 0.0, 0.894425) UV(0.740903, 0.322808) +V 2496: Pos(0.894965, 2.62882, -7.759468) Norm(-0.212132, 0.730274, -0.649384) UV(0.570129, 0.927995) +V 2497: Pos(2.016632, 2.62882, -7.159917) Norm(0.179542, 0.98375, -1e-06) UV(0.50353, 0.892396) +V 2498: Pos(2.016632, 2.62882, -7.759468) Norm(0.394535, 0.623438, -0.675031) UV(0.50353, 0.927995) +V 2499: Pos(3.478066, 2.077005, -7.46639) Norm(0.658808, 0.455472, -0.598763) UV(0.982619, 0.333511) +V 2500: Pos(3.478066, 1.153763, -7.159917) Norm(0.822559, -0.568679, 0.0) UV(0.964422, 0.388329) +V 2501: Pos(3.478066, 1.153763, -7.46639) Norm(0.658818, -0.45545, -0.598768) UV(0.982619, 0.388329) +V 2502: Pos(2.209737, 0.674862, -7.159917) Norm(0.17954, -0.983751, 0.0) UV(0.572428, 0.569058) +V 2503: Pos(3.478066, 1.153763, -7.46639) Norm(0.658818, -0.45545, -0.598768) UV(0.652925, 0.587255) +V 2504: Pos(3.478066, 1.153763, -7.159917) Norm(0.822559, -0.568679, 0.0) UV(0.652925, 0.569058) +V 2505: Pos(0.648541, 0.674862, -7.159917) Norm(-0.707123, -0.707091, 0.0) UV(0.6185, 0.866706) +V 2506: Pos(2.016632, 0.674862, -7.759468) Norm(0.374212, -0.614324, -0.694674) UV(0.699731, 0.902305) +V 2507: Pos(2.209737, 0.674862, -7.159917) Norm(0.17954, -0.983751, 0.0) UV(0.711197, 0.866706) +V 2508: Pos(2.016632, 2.62882, -7.159917) Norm(0.179542, 0.98375, -1e-06) UV(0.933256, 0.867376) +V 2509: Pos(2.209737, 2.555906, -7.466375) Norm(0.553103, 0.723718, -0.412686) UV(0.91506, 0.85512) +V 2510: Pos(2.016632, 2.62882, -7.759468) Norm(0.394535, 0.623438, -0.675031) UV(0.897658, 0.867376) +V 2511: Pos(0.894965, 2.62882, -7.159917) Norm(-0.278944, 0.960307, 0.0) UV(0.977806, 0.836726) +V 2512: Pos(0.648541, 2.472465, -7.759468) Norm(-0.317376, 0.500201, -0.805649) UV(0.995134, 0.872325) +V 2513: Pos(0.648541, 2.472465, -7.159917) Norm(-0.535753, 0.844375, 0.0) UV(0.995134, 0.836726) +V 2514: Pos(3.478066, 2.077005, -7.46639) Norm(0.658808, 0.455472, -0.598763) UV(0.592185, 0.644004) +V 2515: Pos(2.209737, 0.674862, -7.466375) Norm(0.380889, -0.822074, -0.423224) UV(0.508932, 0.719311) +V 2516: Pos(2.209737, 2.555906, -7.466375) Norm(0.553103, 0.723718, -0.412686) UV(0.62062, 0.719311) +V 2517: Pos(3.478066, 2.077005, -7.159917) Norm(0.822576, 0.568655, -0.0) UV(0.933256, 0.774623) +V 2518: Pos(2.016632, 2.62882, -7.759468) Norm(0.394535, 0.623438, -0.675031) UV(0.121571, 0.905251) +V 2519: Pos(2.209737, 0.674862, -7.466375) Norm(0.380889, -0.822074, -0.423224) UV(0.237588, 0.926091) +V 2520: Pos(2.016632, 0.674862, -7.759468) Norm(0.374212, -0.614324, -0.694674) UV(0.237588, 0.905251) +V 2521: Pos(2.016632, 0.674862, -7.759468) Norm(0.374212, -0.614324, -0.694674) UV(0.650147, 0.126191) +V 2522: Pos(0.648541, 0.674862, -7.759468) Norm(-0.577332, -0.57736, -0.57736) UV(0.731378, 0.126191) +V 2523: Pos(0.648541, 0.924291, -7.759468) Norm(-0.447219, 0.0, -0.894425) UV(0.731378, 0.111381) +V 2524: Pos(0.648541, 0.924291, -7.159917) Norm(-1.0, 0.0, 0.0) UV(0.799956, 0.001604) +V 2525: Pos(0.648541, 0.674862, -7.759468) Norm(-0.577332, -0.57736, -0.57736) UV(0.764358, 0.016414) +V 2526: Pos(0.648541, 0.674862, -7.159917) Norm(-0.707123, -0.707091, 0.0) UV(0.799956, 0.016414) +V 2527: Pos(-0.766956, 2.150968, 5.656943) Norm(-0.335534, 0.867402, 0.367465) UV(0.506007, 0.806749) +V 2528: Pos(-1.491366, 2.2121, 3.8828) Norm(-0.688499, 0.707801, 0.158074) UV(0.611553, 0.850354) +V 2529: Pos(-1.277092, 2.040021, 5.425371) Norm(-0.743093, 0.616852, 0.259435) UV(0.519111, 0.838111) +V 2530: Pos(-0.766956, 1.24247, 5.93269) Norm(-0.540911, -0.255528, 0.801324) UV(0.936387, 0.334395) +V 2531: Pos(-1.244434, 1.901152, 5.636478) Norm(-0.771283, 0.302933, 0.55978) UV(0.969827, 0.295194) +V 2532: Pos(-1.238971, 1.328909, 5.635668) Norm(-0.814732, -0.183705, 0.549968) UV(0.969577, 0.329251) +V 2533: Pos(-0.766956, 1.24247, 5.93269) Norm(-0.540911, -0.255528, 0.801324) UV(0.926759, 0.341059) +V 2534: Pos(-1.091858, 0.472849, 5.211225) Norm(-0.585591, -0.764425, 0.269697) UV(0.960328, 0.397525) +V 2535: Pos(-0.565265, 0.456129, 5.572916) Norm(-0.236135, -0.926685, 0.292396) UV(0.922485, 0.393731) +V 2536: Pos(-0.766956, 2.150968, 5.656943) Norm(-0.335534, 0.867402, 0.367465) UV(0.857947, 0.783614) +V 2537: Pos(-1.244434, 1.901152, 5.636478) Norm(-0.771283, 0.302933, 0.55978) UV(0.872182, 0.754849) +V 2538: Pos(-0.766956, 1.973238, 5.93269) Norm(-0.524702, 0.370777, 0.766298) UV(0.876918, 0.78823) +V 2539: Pos(-1.238971, 1.328909, 5.635668) Norm(-0.814732, -0.183705, 0.549968) UV(0.73459, 0.139173) +V 2540: Pos(-1.289676, 0.534161, 3.883919) Norm(-0.572492, -0.818409, 0.049588) UV(0.783356, 0.035553) +V 2541: Pos(-1.091858, 0.472849, 5.211225) Norm(-0.585591, -0.764425, 0.269697) UV(0.786993, 0.115419) +V 2542: Pos(-1.091858, 0.472849, 5.211225) Norm(-0.585591, -0.764425, 0.269697) UV(0.813478, 0.571944) +V 2543: Pos(-0.565265, 0.550755, 3.528204) Norm(6.7e-05, -0.998932, -0.046213) UV(0.713208, 0.540604) +V 2544: Pos(-0.565265, 0.456129, 5.572916) Norm(-0.236135, -0.926685, 0.292396) UV(0.835027, 0.540604) +V 2545: Pos(0.0, 0.550755, 3.528204) Norm(0.0, -0.998931, -0.046229) UV(0.713208, 0.506963) +V 2546: Pos(0.0, 0.456129, 5.572916) Norm(0.0, -0.998931, -0.046229) UV(0.835027, 0.506963) +V 2547: Pos(-1.244434, 1.901152, 5.636478) Norm(-0.771283, 0.302933, 0.55978) UV(0.822163, 0.107) +V 2548: Pos(-1.277092, 2.040021, 5.425371) Norm(-0.743093, 0.616852, 0.259435) UV(0.813898, 0.094287) +V 2549: Pos(-1.238971, 1.328909, 5.635668) Norm(-0.814732, -0.183705, 0.549968) UV(0.856221, 0.107) +V 2550: Pos(-1.491366, 1.328909, 3.882873) Norm(-0.982878, -0.121134, 0.138842) UV(0.856226, 0.001609) +V 2551: Pos(0.766956, 2.150968, 5.656943) Norm(0.335536, 0.867403, 0.367461) UV(0.506007, 0.806749) +V 2552: Pos(1.491366, 2.2121, 3.8828) Norm(0.688498, 0.707801, 0.158076) UV(0.611553, 0.850354) +V 2553: Pos(0.766956, 2.351064, 3.526832) Norm(0.186499, 0.9763, 0.1098) UV(0.633336, 0.806749) +V 2554: Pos(0.766956, 1.24247, 5.93269) Norm(0.540904, -0.255504, 0.801337) UV(0.936387, 0.334395) +V 2555: Pos(1.244434, 1.901152, 5.636478) Norm(0.771311, 0.302904, 0.559758) UV(0.969827, 0.295194) +V 2556: Pos(0.766956, 1.973238, 5.93269) Norm(0.524701, 0.370777, 0.766298) UV(0.936387, 0.290904) +V 2557: Pos(0.766956, 1.24247, 5.93269) Norm(0.540904, -0.255504, 0.801337) UV(0.926759, 0.341059) +V 2558: Pos(1.091858, 0.472849, 5.211225) Norm(0.58559, -0.764426, 0.269698) UV(0.960328, 0.397525) +V 2559: Pos(1.238971, 1.328909, 5.635668) Norm(0.814737, -0.183693, 0.549964) UV(0.960328, 0.33999) +V 2560: Pos(0.766956, 2.150968, 5.656943) Norm(0.335536, 0.867403, 0.367461) UV(0.857947, 0.783614) +V 2561: Pos(1.244434, 1.901152, 5.636478) Norm(0.771311, 0.302904, 0.559758) UV(0.872182, 0.754849) +V 2562: Pos(1.277092, 2.040021, 5.425371) Norm(0.743098, 0.616841, 0.259446) UV(0.857947, 0.749625) +V 2563: Pos(1.238971, 1.328909, 5.635668) Norm(0.814737, -0.183693, 0.549964) UV(0.73459, 0.139173) +V 2564: Pos(1.289676, 0.534161, 3.883919) Norm(0.572471, -0.818424, 0.049602) UV(0.783356, 0.035553) +V 2565: Pos(1.491366, 1.328909, 3.882873) Norm(0.982877, -0.12114, 0.138843) UV(0.73459, 0.033782) +V 2566: Pos(1.091858, 0.472849, 5.211225) Norm(0.58559, -0.764426, 0.269698) UV(0.813478, 0.571944) +V 2567: Pos(0.565265, 0.550755, 3.528204) Norm(-6.7e-05, -0.998932, -0.046213) UV(0.713208, 0.540604) +V 2568: Pos(1.289676, 0.534161, 3.883919) Norm(0.572471, -0.818424, 0.049602) UV(0.734401, 0.583717) +V 2569: Pos(0.565265, 0.456129, 5.572916) Norm(0.236135, -0.926685, 0.292397) UV(0.835027, 0.540604) +V 2570: Pos(1.244434, 1.901152, 5.636478) Norm(0.771311, 0.302904, 0.559758) UV(0.822163, 0.107) +V 2571: Pos(1.238971, 1.328909, 5.635668) Norm(0.814737, -0.183693, 0.549964) UV(0.856221, 0.107) +V 2572: Pos(1.277092, 2.040021, 5.425371) Norm(0.743098, 0.616841, 0.259446) UV(0.813898, 0.094287) +V 2573: Pos(1.491366, 1.328909, 3.882873) Norm(0.982877, -0.12114, 0.138843) UV(0.856226, 0.001609) +V 2574: Pos(1.491366, 2.2121, 3.8828) Norm(0.688498, 0.707801, 0.158076) UV(0.803664, 0.001601) +V 2575: Pos(-0.488272, 3.01024, 3.526832) Norm(-0.564803, 0.818256, -0.107024) UV(0.804298, 0.798819) +V 2576: Pos(-0.32714, 2.922813, 2.008049) Norm(-0.212414, 0.974013, -0.078604) UV(0.713547, 0.808431) +V 2577: Pos(-0.766956, 2.351064, 3.526832) Norm(-0.914491, 0.386625, -0.119277) UV(0.799308, 0.756419) +V 2578: Pos(0.0, 3.01024, 3.526832) Norm(0.0, 0.998347, -0.057469) UV(0.804298, 0.827946) +V 2579: Pos(0.488272, 3.01024, 3.526832) Norm(0.564803, 0.818256, -0.107024) UV(0.804298, 0.798819) +V 2580: Pos(0.766956, 2.351064, 3.526832) Norm(0.914491, 0.386625, -0.119277) UV(0.799308, 0.756419) +V 2581: Pos(0.32714, 2.922813, 2.008049) Norm(0.212414, 0.974013, -0.078604) UV(0.713547, 0.808431) +V 2582: Pos(0.0, 2.922813, 2.008049) Norm(0.0, 0.998347, -0.057469) UV(0.713547, 0.827946) +V 2583: Pos(-0.81128, 0.493254, 4.782921) Norm(-0.968772, -0.011554, 0.247685) UV(0.983406, 0.214638) +V 2584: Pos(-0.81128, 0.262186, 4.772142) Norm(-0.691167, -0.685946, 0.227524) UV(0.969857, 0.214638) +V 2585: Pos(-0.488272, 0.465776, 5.371951) Norm(-0.1367, -0.913318, 0.383618) UV(0.983406, 0.175258) +V 2586: Pos(-0.292559, 0.262186, 4.772142) Norm(0.0, -0.990173, 0.139845) UV(0.595163, 0.070824) +V 2587: Pos(0.0, 0.308742, 3.774133) Norm(0.0, -0.673388, -0.739289) UV(0.578028, 0.129343) +V 2588: Pos(0.0, 0.262186, 4.772142) Norm(0.0, -0.990173, 0.139847) UV(0.578028, 0.070824) +V 2589: Pos(-0.488272, 0.465776, 5.371951) Norm(-0.1367, -0.913318, 0.383618) UV(0.606627, 0.033724) +V 2590: Pos(0.0, 0.465776, 5.371951) Norm(0.0, -0.946939, 0.321414) UV(0.578028, 0.033724) +V 2591: Pos(-0.81128, 0.262186, 4.772142) Norm(-0.691167, -0.685946, 0.227524) UV(0.625546, 0.070824) +V 2592: Pos(-0.81128, 0.52, 4.209571) Norm(-0.959316, 0.013156, -0.282029) UV(0.983406, 0.248257) +V 2593: Pos(-0.537317, 0.308742, 3.774133) Norm(-0.377991, -0.580598, -0.72113) UV(0.969857, 0.277879) +V 2594: Pos(-0.81128, 0.288932, 4.198792) Norm(-0.730054, -0.638018, -0.244857) UV(0.969857, 0.248257) +V 2595: Pos(-0.537317, 0.53981, 3.784912) Norm(-0.478709, 0.040912, -0.87702) UV(0.847626, 0.571203) +V 2596: Pos(0.0, 0.308742, 3.774133) Norm(0.0, -0.673388, -0.739289) UV(0.834077, 0.602675) +V 2597: Pos(-0.537317, 0.308742, 3.774133) Norm(-0.377991, -0.580598, -0.72113) UV(0.834077, 0.571203) +V 2598: Pos(-0.537317, 0.308742, 3.774133) Norm(-0.377991, -0.580598, -0.72113) UV(0.609499, 0.129343) +V 2599: Pos(0.81128, 0.493254, 4.782921) Norm(0.968772, -0.011554, 0.247685) UV(0.983406, 0.214638) +V 2600: Pos(0.488272, 0.465776, 5.371951) Norm(0.1367, -0.913318, 0.383618) UV(0.983406, 0.175258) +V 2601: Pos(0.81128, 0.262186, 4.772142) Norm(0.691167, -0.685946, 0.227524) UV(0.969857, 0.214638) +V 2602: Pos(0.292559, 0.262186, 4.772142) Norm(0.0, -0.990173, 0.139845) UV(0.595163, 0.070824) +V 2603: Pos(0.537317, 0.308742, 3.774133) Norm(0.377991, -0.580598, -0.72113) UV(0.609499, 0.129343) +V 2604: Pos(0.488272, 0.465776, 5.371951) Norm(0.1367, -0.913318, 0.383618) UV(0.606627, 0.033724) +V 2605: Pos(0.81128, 0.262186, 4.772142) Norm(0.691167, -0.685946, 0.227524) UV(0.625546, 0.070824) +V 2606: Pos(0.81128, 0.52, 4.209571) Norm(0.959316, 0.013156, -0.282029) UV(0.983406, 0.248257) +V 2607: Pos(0.537317, 0.308742, 3.774133) Norm(0.377991, -0.580598, -0.72113) UV(0.969857, 0.277879) +V 2608: Pos(0.537317, 0.53981, 3.784912) Norm(0.478709, 0.040912, -0.87702) UV(0.983406, 0.277879) +V 2609: Pos(0.537317, 0.53981, 3.784912) Norm(0.478709, 0.040912, -0.87702) UV(0.847626, 0.571203) +V 2610: Pos(0.0, 0.53981, 3.784912) Norm(0.0, 0.046599, -0.998914) UV(0.847626, 0.602675) +V 2611: Pos(0.81128, 0.288932, 4.198792) Norm(0.730054, -0.638018, -0.244857) UV(0.969857, 0.248257) +V 2612: Pos(0.81128, 0.288932, 4.198792) Norm(0.730054, -0.638018, -0.244857) UV(0.625546, 0.104443) +V 2613: Pos(-2.005711, 2.56898, -3.613668) Norm(-0.117277, 0.652201, 0.748919) UV(0.992163, 0.3228) +V 2614: Pos(-3.42803, 2.042414, -3.507417) Norm(-0.417939, 0.290901, -0.860641) UV(0.98584, 0.413115) +V 2615: Pos(-2.005711, 2.56898, -3.507491) Norm(-0.117333, 0.652313, -0.748813) UV(0.98584, 0.3228) +V 2616: Pos(-0.91211, -0.001723, -3.613669) Norm(0.184706, -0.608341, 0.771884) UV(0.723727, 0.144765) +V 2617: Pos(-0.701674, 0.125872, -3.517228) Norm(0.470512, -0.284487, -0.835276) UV(0.730046, 0.13035) +V 2618: Pos(-0.91175, -0.001618, -3.50749) Norm(0.15561, -0.613766, -0.774001) UV(0.730045, 0.144995) +V 2619: Pos(-3.478066, 0.491716, -3.507417) Norm(-0.658828, -0.455449, -0.598758) UV(0.804047, 0.034603) +V 2620: Pos(-3.42803, 2.042414, -3.507417) Norm(-0.417939, 0.290901, -0.860641) UV(0.801017, 0.126943) +V 2621: Pos(-3.42803, 0.526307, -3.507417) Norm(-0.417943, -0.290899, -0.86064) UV(0.801067, 0.036661) +V 2622: Pos(-2.016632, 2.62882, -3.507491) Norm(-0.133478, 0.731313, -0.668853) UV(0.716951, 0.161817) +V 2623: Pos(-0.911751, 2.570353, -3.50749) Norm(0.155608, 0.61375, -0.774013) UV(0.651158, 0.158299) +V 2624: Pos(-2.005711, 2.56898, -3.507491) Norm(-0.117333, 0.652313, -0.748813) UV(0.716302, 0.158253) +V 2625: Pos(-0.648541, 1.211878, -3.517228) Norm(0.44721, 0.0, -0.894429) UV(0.635477, 0.077393) +V 2626: Pos(-0.701674, 0.125872, -3.517228) Norm(0.470512, -0.284487, -0.835276) UV(0.638641, 0.012723) +V 2627: Pos(-0.701674, 1.213685, -3.517228) Norm(0.705967, 0.0, -0.708245) UV(0.638641, 0.077501) +V 2628: Pos(-0.702016, 1.213647, -3.623408) Norm(0.708247, 0.0, 0.705965) UV(0.520243, 0.187796) +V 2629: Pos(-0.701674, 2.442851, -3.517228) Norm(0.470599, 0.284459, -0.835236) UV(0.447046, 0.181473) +V 2630: Pos(-0.701674, 1.213685, -3.517228) Norm(0.705967, 0.0, -0.708245) UV(0.520241, 0.181473) +V 2631: Pos(-0.894965, 2.62882, -3.613669) Norm(0.218992, 0.722724, 0.655525) UV(0.478359, 0.001646) +V 2632: Pos(-2.005711, 2.56898, -3.613668) Norm(-0.117277, 0.652201, 0.748919) UV(0.544504, 0.005173) +V 2633: Pos(-0.912111, 2.570458, -3.613669) Norm(0.18471, 0.608361, 0.771867) UV(0.479382, 0.005121) +V 2634: Pos(-0.648541, 0.674862, 0.021751) Norm(0.895381, 0.00229, 0.445295) UV(0.107766, 0.580013) +V 2635: Pos(-2.016632, -0.060085, 0.031377) Norm(-0.132189, -0.730169, 0.670358) UV(0.180735, 0.636833) +V 2636: Pos(-0.894965, -0.060085, 0.031453) Norm(0.217504, -0.724834, 0.653688) UV(0.114888, 0.625623) +V 2637: Pos(-0.894965, 2.62882, -3.50749) Norm(0.205456, 0.737693, -0.643115) UV(0.650157, 0.16178) +V 2638: Pos(-0.701674, 2.442851, -3.517228) Norm(0.470599, 0.284459, -0.835236) UV(0.638641, 0.150696) +V 2639: Pos(-0.648541, 2.472465, -3.623409) Norm(0.333336, 0.49838, 0.800315) UV(0.46368, 0.010967) +V 2640: Pos(-0.702016, 2.443472, -3.623409) Norm(0.486128, 0.254246, 0.836085) UV(0.466864, 0.012693) +V 2641: Pos(-0.91175, -0.001618, -3.50749) Norm(0.15561, -0.613766, -0.774001) UV(0.223635, 0.586082) +V 2642: Pos(-2.005712, -0.000245, -3.613668) Norm(-0.117261, -0.652246, 0.748882) UV(0.158491, 0.579759) +V 2643: Pos(-0.91211, -0.001723, -3.613669) Norm(0.184706, -0.608341, 0.771884) UV(0.223614, 0.579759) +V 2644: Pos(-3.428031, 0.526308, -3.613593) Norm(-0.417915, -0.290957, 0.860634) UV(0.991773, 0.507342) +V 2645: Pos(-2.005711, -0.000245, -3.507491) Norm(-0.11733, -0.652348, -0.748783) UV(0.998096, 0.417028) +V 2646: Pos(-3.42803, 0.526307, -3.507417) Norm(-0.417943, -0.290899, -0.86064) UV(0.998096, 0.507343) +V 2647: Pos(-0.702016, 2.443472, -3.623409) Norm(0.486128, 0.254246, 0.836085) UV(0.459639, 0.001667) +V 2648: Pos(-0.911751, 2.570353, -3.50749) Norm(0.155608, 0.61375, -0.774013) UV(0.45332, 0.016525) +V 2649: Pos(-0.701674, 2.442851, -3.517228) Norm(0.470599, 0.284459, -0.835236) UV(0.45332, 0.00188) +V 2650: Pos(-3.42803, 0.526307, -3.507417) Norm(-0.417943, -0.290899, -0.86064) UV(0.188123, 0.425484) +V 2651: Pos(-3.42803, 2.042413, -3.613593) Norm(-0.417925, 0.290952, 0.860631) UV(0.097841, 0.419161) +V 2652: Pos(-3.428031, 0.526308, -3.613593) Norm(-0.417915, -0.290957, 0.860634) UV(0.188123, 0.419161) +V 2653: Pos(-2.005711, 2.56898, -3.507491) Norm(-0.117333, 0.652313, -0.748813) UV(0.994108, 0.599037) +V 2654: Pos(-0.912111, 2.570458, -3.613669) Norm(0.18471, 0.608361, 0.771867) UV(0.987786, 0.664159) +V 2655: Pos(-2.005711, 2.56898, -3.613668) Norm(-0.117277, 0.652201, 0.748919) UV(0.987785, 0.599037) +V 2656: Pos(-3.478066, 0.491716, -3.613593) Norm(-0.658792, -0.455482, 0.598773) UV(0.632197, 0.129013) +V 2657: Pos(-2.005712, -0.000245, -3.613668) Norm(-0.117261, -0.652246, 0.748882) UV(0.544505, 0.15826) +V 2658: Pos(-3.428031, 0.526308, -3.613593) Norm(-0.417915, -0.290957, 0.860634) UV(0.629219, 0.126951) +V 2659: Pos(-0.648541, 1.211878, -3.623408) Norm(0.447188, 0.0, 0.89444) UV(0.46368, 0.086033) +V 2660: Pos(-0.702016, 1.213647, -3.623408) Norm(0.708247, 0.0, 0.705965) UV(0.466864, 0.085927) +V 2661: Pos(-0.648541, 0.096257, -3.517228) Norm(0.685212, -0.383413, -0.619257) UV(0.635477, 0.01096) +V 2662: Pos(-0.91175, -0.001618, -3.50749) Norm(0.15561, -0.613766, -0.774001) UV(0.651158, 0.005121) +V 2663: Pos(-2.016632, -0.060085, -3.613668) Norm(-0.133449, -0.731328, 0.668843) UV(0.545153, 0.161823) +V 2664: Pos(-0.91211, -0.001723, -3.613669) Norm(0.184706, -0.608341, 0.771884) UV(0.479382, 0.158311) +V 2665: Pos(-3.478066, 2.077005, -3.507417) Norm(-0.658821, 0.455464, -0.598755) UV(0.803995, 0.129005) +V 2666: Pos(-0.894965, -0.060085, -3.50749) Norm(0.205439, -0.73773, -0.643078) UV(0.650157, 0.00164) +V 2667: Pos(-2.005711, -0.000245, -3.507491) Norm(-0.11733, -0.652348, -0.748783) UV(0.716302, 0.005167) +V 2668: Pos(-0.894965, -0.060085, -3.613669) Norm(0.218986, -0.722692, 0.655561) UV(0.478359, 0.161786) +V 2669: Pos(-0.702016, 0.12525, -3.623408) Norm(0.48604, -0.254218, 0.836145) UV(0.466864, 0.15074) +V 2670: Pos(-2.016632, 2.62882, -3.613668) Norm(-0.133459, 0.731324, 0.668845) UV(0.545153, 0.001609) +V 2671: Pos(-3.42803, 2.042413, -3.613593) Norm(-0.417925, 0.290952, 0.860631) UV(0.629219, 0.036482) +V 2672: Pos(-2.016632, -0.060085, -3.507491) Norm(-0.13348, -0.731309, -0.668857) UV(0.71695, 0.001603) +V 2673: Pos(-3.42803, 0.526307, -3.507417) Norm(-0.417943, -0.290899, -0.86064) UV(0.801016, 0.036476) +V 2674: Pos(-0.648541, 0.674862, 0.021751) Norm(0.895381, 0.00229, 0.445295) UV(0.311789, 0.498586) +V 2675: Pos(-0.648541, 0.096257, -3.517228) Norm(0.685212, -0.383413, -0.619257) UV(0.52253, 0.464131) +V 2676: Pos(-0.648541, 1.211878, -3.517228) Norm(0.44721, 0.0, -0.894429) UV(0.52253, 0.530565) +V 2677: Pos(-0.894965, 2.62882, -3.613669) Norm(0.218992, 0.722724, 0.655525) UV(0.880032, 0.001666) +V 2678: Pos(-0.648541, 2.472465, -7.162736) Norm(0.535752, 0.844375, 0.0) UV(0.89741, 0.213008) +V 2679: Pos(-0.894965, 2.62882, -7.162736) Norm(0.278956, 0.960304, 0.0) UV(0.880032, 0.213008) +V 2680: Pos(-0.894965, 2.62882, 0.031453) Norm(0.275973, 0.961165, 0.0) UV(0.879133, 0.748317) +V 2681: Pos(-0.648541, 2.472465, -3.517228) Norm(0.301053, 0.502059, -0.810742) UV(0.861754, 0.536998) +V 2682: Pos(-0.894965, 2.62882, -3.50749) Norm(0.205456, 0.737693, -0.643115) UV(0.879133, 0.537578) +V 2683: Pos(-0.648541, 1.211878, -3.623408) Norm(0.447188, 0.0, 0.89444) UV(0.525741, 0.459905) +V 2684: Pos(-0.648541, 0.096257, -7.162736) Norm(0.692286, -0.380657, -0.613058) UV(0.736503, 0.393471) +V 2685: Pos(-0.648541, 0.674862, -7.162736) Norm(0.894437, 0.0, -0.447195) UV(0.736503, 0.427926) +V 2686: Pos(-0.648541, 0.096257, -3.623408) Norm(0.699095, -0.377977, 0.606959) UV(0.876817, 0.212372) +V 2687: Pos(-0.894965, -0.060085, -7.162736) Norm(0.212117, -0.730277, -0.649386) UV(0.859438, 0.001609) +V 2688: Pos(-0.648541, 0.096257, -7.162736) Norm(0.692286, -0.380657, -0.613058) UV(0.876817, 0.001609) +V 2689: Pos(-0.648541, 0.096257, 0.021751) Norm(0.705206, -0.379917, 0.598622) UV(0.898042, 0.426541) +V 2690: Pos(-0.894965, -0.060085, -3.50749) Norm(0.205439, -0.73773, -0.643078) UV(0.880664, 0.216379) +V 2691: Pos(-0.648541, 0.096257, -3.517228) Norm(0.685212, -0.383413, -0.619257) UV(0.898042, 0.215799) +V 2692: Pos(-2.016632, -0.060085, -7.162736) Norm(-0.133469, -0.731316, -0.668852) UV(0.311794, 0.389601) +V 2693: Pos(-0.894965, -0.060085, -3.613669) Norm(0.218986, -0.722692, 0.655561) UV(0.523136, 0.322807) +V 2694: Pos(-2.016632, -0.060085, -3.613668) Norm(-0.133449, -0.731328, 0.668843) UV(0.523136, 0.389601) +V 2695: Pos(-2.016632, -0.060085, 0.031377) Norm(-0.132189, -0.730169, 0.670358) UV(0.001602, 0.303537) +V 2696: Pos(-3.478066, 0.491716, -3.507417) Norm(-0.658828, -0.455449, -0.598758) UV(0.094625, 0.514268) +V 2697: Pos(-2.016632, -0.060085, -3.507491) Norm(-0.13348, -0.731309, -0.668857) UV(0.001602, 0.514272) +V 2698: Pos(-2.016632, -0.060085, -3.613668) Norm(-0.133449, -0.731328, 0.668843) UV(0.853394, 0.360695) +V 2699: Pos(-3.478066, 0.491716, -7.162736) Norm(-0.658822, -0.455449, -0.598765) UV(0.76037, 0.149353) +V 2700: Pos(-2.016632, -0.060085, -7.162736) Norm(-0.133469, -0.731316, -0.668852) UV(0.853394, 0.149353) +V 2701: Pos(-2.016632, -0.060085, -3.507491) Norm(-0.13348, -0.731309, -0.668857) UV(0.308572, 0.429873) +V 2702: Pos(-0.894965, -0.060085, 0.031453) Norm(0.217504, -0.724834, 0.653688) UV(0.097832, 0.496667) +V 2703: Pos(-2.016632, -0.060085, 0.031377) Norm(-0.132189, -0.730169, 0.670358) UV(0.097837, 0.429873) +V 2704: Pos(-3.478066, 1.153763, -7.162736) Norm(-0.933201, 0.0, -0.359354) UV(0.110904, 0.255164) +V 2705: Pos(-3.478066, 0.491716, -7.162736) Norm(-0.658822, -0.455449, -0.598765) UV(0.110904, 0.21574) +V 2706: Pos(-3.478066, 0.491716, -3.613593) Norm(-0.658792, -0.455482, 0.598773) UV(0.322251, 0.21574) +V 2707: Pos(-3.478066, 0.491716, -3.507417) Norm(-0.658828, -0.455449, -0.598758) UV(0.536202, 0.310137) +V 2708: Pos(-3.478066, 0.491716, 0.031415) Norm(-0.658814, -0.455465, 0.598763) UV(0.325469, 0.310137) +V 2709: Pos(-3.478066, 1.153763, 0.031415) Norm(-0.933203, 0.0, 0.359351) UV(0.325469, 0.270713) +V 2710: Pos(-0.894965, 2.62882, -7.162736) Norm(0.278956, 0.960304, 0.0) UV(0.526348, 0.389601) +V 2711: Pos(-2.016632, 2.62882, -3.613668) Norm(-0.133459, 0.731324, 0.668845) UV(0.73769, 0.322808) +V 2712: Pos(-0.894965, 2.62882, -3.613669) Norm(0.218992, 0.722724, 0.655525) UV(0.73769, 0.389601) +V 2713: Pos(-0.894965, 2.62882, -3.50749) Norm(0.205456, 0.737693, -0.643115) UV(0.52253, 0.39347) +V 2714: Pos(-2.016632, 2.62882, 0.031377) Norm(-0.179541, 0.983751, 0.0) UV(0.311796, 0.460264) +V 2715: Pos(-0.894965, 2.62882, 0.031453) Norm(0.275973, 0.961165, 0.0) UV(0.311791, 0.39347) +V 2716: Pos(-3.478066, 2.077005, 0.031415) Norm(-0.822582, 0.568647, 0.0) UV(0.308579, 0.322805) +V 2717: Pos(-2.016632, 2.62882, -3.507491) Norm(-0.133478, 0.731313, -0.668853) UV(0.097842, 0.415829) +V 2718: Pos(-3.478066, 2.077005, -3.507417) Norm(-0.658821, 0.455464, -0.598755) UV(0.097847, 0.322805) +V 2719: Pos(-3.478066, 2.077005, -3.613593) Norm(-0.658819, 0.455453, 0.598766) UV(0.750761, 0.215742) +V 2720: Pos(-2.016632, 2.62882, -7.162736) Norm(-0.179535, 0.983752, 0.0) UV(0.539414, 0.308766) +V 2721: Pos(-3.478066, 2.077005, -7.162736) Norm(-0.822561, 0.568676, 0.0) UV(0.539414, 0.215742) +V 2722: Pos(-3.478066, 2.077005, -3.507417) Norm(-0.658821, 0.455464, -0.598755) UV(0.536202, 0.215735) +V 2723: Pos(-3.478066, 2.077005, 0.031415) Norm(-0.822582, 0.568647, 0.0) UV(0.325469, 0.215735) +V 2724: Pos(-3.478066, 2.077005, -7.162736) Norm(-0.822561, 0.568676, 0.0) UV(0.110904, 0.310142) +V 2725: Pos(-3.478066, 2.077005, -3.613593) Norm(-0.658819, 0.455453, 0.598766) UV(0.322251, 0.310142) +V 2726: Pos(-0.648541, 2.472465, -3.517228) Norm(0.301053, 0.502059, -0.810742) UV(0.635477, 0.15246) +V 2727: Pos(-3.478066, 2.077005, -3.613593) Norm(-0.658819, 0.455453, 0.598766) UV(0.632197, 0.03442) +V 2728: Pos(-3.428031, 0.526308, -3.613593) Norm(-0.417915, -0.290957, 0.860634) UV(0.62927, 0.126763) +V 2729: Pos(-0.648541, 1.211878, 0.021751) Norm(1.0, 0.0, 0.0) UV(0.311789, 0.530565) +V 2730: Pos(-0.648541, 0.096257, -3.623408) Norm(0.699095, -0.377977, 0.606959) UV(0.46368, 0.152467) +V 2731: Pos(-3.478066, 0.491716, 0.031415) Norm(-0.658814, -0.455465, 0.598763) UV(0.272041, 0.619045) +V 2732: Pos(-2.209737, 0.674862, 0.031382) Norm(0.001403, 0.002395, 0.999996) UV(0.199416, 0.595618) +V 2733: Pos(-3.478066, 1.153763, 0.031415) Norm(-0.933203, 0.0, 0.359351) UV(0.278658, 0.58018) +V 2734: Pos(-0.894965, -0.060085, -7.162736) Norm(0.212117, -0.730277, -0.649386) UV(0.290912, 0.590999) +V 2735: Pos(-2.209737, 0.674862, -7.162736) Norm(0.0, 0.0, -1.0) UV(0.37544, 0.621002) +V 2736: Pos(-0.648541, 0.674862, -7.162736) Norm(0.894437, 0.0, -0.447195) UV(0.283792, 0.636606) +V 2737: Pos(-2.016632, -0.060085, -7.162736) Norm(-0.133469, -0.731316, -0.668852) UV(0.356758, 0.579788) +V 2738: Pos(-3.478066, 1.153763, -7.162736) Norm(-0.933201, 0.0, -0.359354) UV(0.454682, 0.636439) +V 2739: Pos(-0.648541, 0.096257, 0.021751) Norm(0.705206, -0.379917, 0.598622) UV(0.101976, 0.613978) +V 2740: Pos(-0.648541, 0.096257, -7.162736) Norm(0.692286, -0.380657, -0.613058) UV(0.278009, 0.60264) +V 2741: Pos(-0.702016, 0.12525, -3.623408) Norm(0.48604, -0.254218, 0.836145) UV(0.585056, 0.187796) +V 2742: Pos(-0.701674, 0.125872, -3.517228) Norm(0.470512, -0.284487, -0.835276) UV(0.585019, 0.181473) +V 2743: Pos(-0.648541, 1.211878, -7.162736) Norm(1.0, 0.0, 0.0) UV(0.736503, 0.459905) +V 2744: Pos(2.005712, 2.56898, -3.613668) Norm(0.117298, 0.652254, 0.74887) UV(0.992163, 0.3228) +V 2745: Pos(3.42803, 2.042414, -3.507417) Norm(0.417939, 0.2909, -0.860642) UV(0.98584, 0.413115) +V 2746: Pos(3.42803, 2.042413, -3.613593) Norm(0.417926, 0.290952, 0.86063) UV(0.992163, 0.413115) +V 2747: Pos(0.91211, -0.001723, -3.613669) Norm(-0.184656, -0.608366, 0.771877) UV(0.723727, 0.144765) +V 2748: Pos(0.701674, 0.125872, -3.517228) Norm(-0.470512, -0.284475, -0.83528) UV(0.730046, 0.13035) +V 2749: Pos(0.702015, 0.12525, -3.623408) Norm(-0.486037, -0.254216, 0.836147) UV(0.723727, 0.130136) +V 2750: Pos(3.478066, 0.491716, -3.507417) Norm(0.658828, -0.455449, -0.598758) UV(0.804047, 0.034603) +V 2751: Pos(3.42803, 2.042414, -3.507417) Norm(0.417939, 0.2909, -0.860642) UV(0.801017, 0.126943) +V 2752: Pos(3.478066, 2.077005, -3.507417) Norm(0.658821, 0.455464, -0.598755) UV(0.803995, 0.129005) +V 2753: Pos(2.016632, 2.62882, -3.507491) Norm(0.133478, 0.731313, -0.668853) UV(0.716951, 0.161817) +V 2754: Pos(0.911751, 2.570353, -3.50749) Norm(-0.155632, 0.613844, -0.773934) UV(0.651158, 0.158299) +V 2755: Pos(0.894965, 2.62882, -3.50749) Norm(-0.205447, 0.737706, -0.643102) UV(0.650157, 0.16178) +V 2756: Pos(0.648541, 1.211878, -3.517228) Norm(-0.447209, 0.0, -0.894429) UV(0.635477, 0.077393) +V 2757: Pos(0.701674, 0.125872, -3.517228) Norm(-0.470512, -0.284475, -0.83528) UV(0.638641, 0.012723) +V 2758: Pos(0.648541, 0.096257, -3.517228) Norm(-0.685212, -0.383413, -0.619257) UV(0.635477, 0.01096) +V 2759: Pos(0.702016, 1.213647, -3.623408) Norm(-0.708247, 1e-06, 0.705965) UV(0.520243, 0.187796) +V 2760: Pos(0.701674, 2.442851, -3.517228) Norm(-0.470603, 0.2845, -0.83522) UV(0.447046, 0.181473) +V 2761: Pos(0.702016, 2.443472, -3.623409) Norm(-0.486111, 0.254213, 0.836105) UV(0.447009, 0.187796) +V 2762: Pos(0.894965, 2.62882, -3.613669) Norm(-0.218992, 0.722724, 0.655525) UV(0.478359, 0.001646) +V 2763: Pos(2.005712, 2.56898, -3.613668) Norm(0.117298, 0.652254, 0.74887) UV(0.544504, 0.005173) +V 2764: Pos(2.016632, 2.62882, -3.613668) Norm(0.133459, 0.731324, 0.668845) UV(0.545153, 0.001609) +V 2765: Pos(0.648541, 0.674862, 0.021751) Norm(-0.895383, 0.002272, 0.445292) UV(0.107766, 0.580013) +V 2766: Pos(2.016632, -0.060085, 0.031377) Norm(0.132229, -0.730136, 0.670385) UV(0.180735, 0.636833) +V 2767: Pos(2.209737, 0.674862, 0.031382) Norm(-0.001402, 0.002395, 0.999996) UV(0.199416, 0.595618) +V 2768: Pos(0.701674, 2.442851, -3.517228) Norm(-0.470603, 0.2845, -0.83522) UV(0.638641, 0.150696) +V 2769: Pos(0.648541, 2.472465, -3.517228) Norm(-0.301054, 0.502059, -0.810743) UV(0.635477, 0.15246) +V 2770: Pos(0.648541, 2.472465, -3.623409) Norm(-0.333336, 0.49838, 0.800315) UV(0.46368, 0.010967) +V 2771: Pos(0.912111, 2.570458, -3.613669) Norm(-0.18471, 0.608363, 0.771865) UV(0.479382, 0.005121) +V 2772: Pos(0.91175, -0.001618, -3.50749) Norm(-0.155613, -0.613741, -0.77402) UV(0.223635, 0.586082) +V 2773: Pos(2.005712, -0.000245, -3.613668) Norm(0.11726, -0.652247, 0.748882) UV(0.158491, 0.579759) +V 2774: Pos(2.005712, -0.000245, -3.507491) Norm(0.11734, -0.652378, -0.748755) UV(0.158491, 0.586082) +V 2775: Pos(3.428031, 0.526308, -3.613593) Norm(0.417915, -0.290957, 0.860634) UV(0.991773, 0.507342) +V 2776: Pos(2.005712, -0.000245, -3.507491) Norm(0.11734, -0.652378, -0.748755) UV(0.998096, 0.417028) +V 2777: Pos(2.005712, -0.000245, -3.613668) Norm(0.11726, -0.652247, 0.748882) UV(0.991773, 0.417028) +V 2778: Pos(0.702016, 2.443472, -3.623409) Norm(-0.486111, 0.254213, 0.836105) UV(0.459639, 0.001667) +V 2779: Pos(0.911751, 2.570353, -3.50749) Norm(-0.155632, 0.613844, -0.773934) UV(0.45332, 0.016525) +V 2780: Pos(0.912111, 2.570458, -3.613669) Norm(-0.18471, 0.608363, 0.771865) UV(0.459639, 0.016297) +V 2781: Pos(3.42803, 0.526307, -3.507417) Norm(0.417943, -0.290899, -0.86064) UV(0.188123, 0.425484) +V 2782: Pos(3.42803, 2.042413, -3.613593) Norm(0.417926, 0.290952, 0.86063) UV(0.097841, 0.419161) +V 2783: Pos(3.42803, 2.042414, -3.507417) Norm(0.417939, 0.2909, -0.860642) UV(0.097841, 0.425484) +V 2784: Pos(2.005711, 2.56898, -3.507491) Norm(0.117334, 0.652258, -0.748861) UV(0.994108, 0.599037) +V 2785: Pos(0.912111, 2.570458, -3.613669) Norm(-0.18471, 0.608363, 0.771865) UV(0.987786, 0.664159) +V 2786: Pos(0.911751, 2.570353, -3.50749) Norm(-0.155632, 0.613844, -0.773934) UV(0.994108, 0.664181) +V 2787: Pos(3.478066, 0.491716, -3.613593) Norm(0.658792, -0.455482, 0.598773) UV(0.632197, 0.129013) +V 2788: Pos(2.005712, -0.000245, -3.613668) Norm(0.11726, -0.652247, 0.748882) UV(0.544505, 0.15826) +V 2789: Pos(2.016632, -0.060085, -3.613668) Norm(0.133449, -0.731328, 0.668843) UV(0.545153, 0.161823) +V 2790: Pos(0.648541, 1.211878, -3.623408) Norm(-0.447188, 0.0, 0.89444) UV(0.46368, 0.086033) +V 2791: Pos(0.702016, 2.443472, -3.623409) Norm(-0.486111, 0.254213, 0.836105) UV(0.466864, 0.012693) +V 2792: Pos(0.91175, -0.001618, -3.50749) Norm(-0.155613, -0.613741, -0.77402) UV(0.651158, 0.005121) +V 2793: Pos(0.894965, -0.060085, -3.50749) Norm(-0.205439, -0.73773, -0.643078) UV(0.650157, 0.00164) +V 2794: Pos(0.91211, -0.001723, -3.613669) Norm(-0.184656, -0.608366, 0.771877) UV(0.479382, 0.158311) +V 2795: Pos(0.894965, -0.060085, -3.613669) Norm(-0.218985, -0.72271, 0.655543) UV(0.478359, 0.161786) +V 2796: Pos(2.005711, 2.56898, -3.507491) Norm(0.117334, 0.652258, -0.748861) UV(0.716302, 0.158253) +V 2797: Pos(2.005712, -0.000245, -3.507491) Norm(0.11734, -0.652378, -0.748755) UV(0.716302, 0.005167) +V 2798: Pos(2.016632, -0.060085, -3.507491) Norm(0.13348, -0.731309, -0.668857) UV(0.71695, 0.001603) +V 2799: Pos(0.702015, 0.12525, -3.623408) Norm(-0.486037, -0.254216, 0.836147) UV(0.466864, 0.15074) +V 2800: Pos(0.648541, 0.096257, -3.623408) Norm(-0.699095, -0.377977, 0.60696) UV(0.46368, 0.152467) +V 2801: Pos(3.42803, 2.042413, -3.613593) Norm(0.417926, 0.290952, 0.86063) UV(0.629219, 0.036482) +V 2802: Pos(3.478066, 2.077005, -3.613593) Norm(0.658819, 0.455453, 0.598766) UV(0.632197, 0.03442) +V 2803: Pos(3.42803, 0.526307, -3.507417) Norm(0.417943, -0.290899, -0.86064) UV(0.801016, 0.036476) +V 2804: Pos(3.478066, 0.491716, -3.507417) Norm(0.658828, -0.455449, -0.598758) UV(0.803995, 0.034414) +V 2805: Pos(0.648541, 0.674862, 0.021751) Norm(-0.895383, 0.002272, 0.445292) UV(0.311789, 0.498586) +V 2806: Pos(0.648541, 0.096257, -3.517228) Norm(-0.685212, -0.383413, -0.619257) UV(0.52253, 0.464131) +V 2807: Pos(0.648541, 0.096257, 0.021751) Norm(-0.705206, -0.379917, 0.598622) UV(0.311789, 0.464131) +V 2808: Pos(0.894965, 2.62882, -3.613669) Norm(-0.218992, 0.722724, 0.655525) UV(0.880032, 0.001666) +V 2809: Pos(0.648541, 2.472465, -7.162736) Norm(-0.535752, 0.844375, 0.0) UV(0.89741, 0.213008) +V 2810: Pos(0.648541, 2.472465, -3.623409) Norm(-0.333336, 0.49838, 0.800315) UV(0.89741, 0.002246) +V 2811: Pos(0.894965, 2.62882, 0.031453) Norm(-0.275973, 0.961165, 0.0) UV(0.879133, 0.748317) +V 2812: Pos(0.648541, 2.472465, -3.517228) Norm(-0.301054, 0.502059, -0.810743) UV(0.861754, 0.536998) +V 2813: Pos(0.648541, 2.472465, 0.021751) Norm(-0.535752, 0.844375, 0.0) UV(0.861754, 0.747739) +V 2814: Pos(0.648541, 1.211878, -3.623408) Norm(-0.447188, 0.0, 0.89444) UV(0.525741, 0.459905) +V 2815: Pos(0.648541, 0.096257, -7.162736) Norm(-0.692286, -0.380657, -0.613058) UV(0.736503, 0.393471) +V 2816: Pos(0.648541, 0.096257, -3.623408) Norm(-0.699095, -0.377977, 0.60696) UV(0.525741, 0.393471) +V 2817: Pos(0.648541, 0.096257, -3.623408) Norm(-0.699095, -0.377977, 0.60696) UV(0.876817, 0.212372) +V 2818: Pos(0.894965, -0.060085, -7.162736) Norm(-0.212117, -0.730277, -0.649386) UV(0.859438, 0.001609) +V 2819: Pos(0.894965, -0.060085, -3.613669) Norm(-0.218985, -0.72271, 0.655543) UV(0.859438, 0.212952) +V 2820: Pos(0.648541, 0.096257, 0.021751) Norm(-0.705206, -0.379917, 0.598622) UV(0.898042, 0.426541) +V 2821: Pos(0.894965, -0.060085, -3.50749) Norm(-0.205439, -0.73773, -0.643078) UV(0.880664, 0.216379) +V 2822: Pos(0.894965, -0.060085, 0.031453) Norm(-0.217504, -0.724834, 0.653688) UV(0.880664, 0.427118) +V 2823: Pos(2.016632, -0.060085, -7.162736) Norm(0.133469, -0.731316, -0.668852) UV(0.311794, 0.389601) +V 2824: Pos(0.894965, -0.060085, -3.613669) Norm(-0.218985, -0.72271, 0.655543) UV(0.523136, 0.322807) +V 2825: Pos(0.894965, -0.060085, -7.162736) Norm(-0.212117, -0.730277, -0.649386) UV(0.311794, 0.322807) +V 2826: Pos(2.016632, -0.060085, 0.031377) Norm(0.132229, -0.730136, 0.670385) UV(0.001602, 0.303537) +V 2827: Pos(3.478066, 0.491716, -3.507417) Norm(0.658828, -0.455449, -0.598758) UV(0.094625, 0.514268) +V 2828: Pos(3.478066, 0.491716, 0.031415) Norm(0.658814, -0.455465, 0.598763) UV(0.094625, 0.303535) +V 2829: Pos(2.016632, -0.060085, -3.613668) Norm(0.133449, -0.731328, 0.668843) UV(0.853394, 0.360695) +V 2830: Pos(3.478066, 0.491716, -7.162736) Norm(0.658822, -0.455449, -0.598765) UV(0.76037, 0.149353) +V 2831: Pos(3.478066, 0.491716, -3.613593) Norm(0.658792, -0.455482, 0.598773) UV(0.76037, 0.360699) +V 2832: Pos(2.016632, -0.060085, -3.507491) Norm(0.13348, -0.731309, -0.668857) UV(0.308572, 0.429873) +V 2833: Pos(0.894965, -0.060085, 0.031453) Norm(-0.217504, -0.724834, 0.653688) UV(0.097832, 0.496667) +V 2834: Pos(0.894965, -0.060085, -3.50749) Norm(-0.205439, -0.73773, -0.643078) UV(0.308572, 0.496666) +V 2835: Pos(3.478066, 1.153763, -7.162736) Norm(0.933201, 0.0, -0.359354) UV(0.110904, 0.255164) +V 2836: Pos(3.478066, 0.491716, -3.613593) Norm(0.658792, -0.455482, 0.598773) UV(0.322251, 0.21574) +V 2837: Pos(3.478066, 0.491716, -7.162736) Norm(0.658822, -0.455449, -0.598765) UV(0.110904, 0.21574) +V 2838: Pos(3.478066, 0.491716, -3.507417) Norm(0.658828, -0.455449, -0.598758) UV(0.536202, 0.310137) +V 2839: Pos(3.478066, 1.153763, 0.031415) Norm(0.933203, 0.0, 0.359351) UV(0.325469, 0.270713) +V 2840: Pos(3.478066, 0.491716, 0.031415) Norm(0.658814, -0.455465, 0.598763) UV(0.325469, 0.310137) +V 2841: Pos(0.894965, 2.62882, -7.162736) Norm(-0.278956, 0.960304, 0.0) UV(0.526348, 0.389601) +V 2842: Pos(2.016632, 2.62882, -3.613668) Norm(0.133459, 0.731324, 0.668845) UV(0.73769, 0.322808) +V 2843: Pos(2.016632, 2.62882, -7.162736) Norm(0.179535, 0.983752, 0.0) UV(0.526348, 0.322808) +V 2844: Pos(0.894965, 2.62882, -3.50749) Norm(-0.205447, 0.737706, -0.643102) UV(0.52253, 0.39347) +V 2845: Pos(2.016632, 2.62882, 0.031377) Norm(0.179541, 0.983751, 0.0) UV(0.311796, 0.460264) +V 2846: Pos(2.016632, 2.62882, -3.507491) Norm(0.133478, 0.731313, -0.668853) UV(0.52253, 0.460264) +V 2847: Pos(3.478066, 2.077005, 0.031415) Norm(0.822582, 0.568647, 0.0) UV(0.308579, 0.322805) +V 2848: Pos(2.016632, 2.62882, -3.507491) Norm(0.133478, 0.731313, -0.668853) UV(0.097842, 0.415829) +V 2849: Pos(2.016632, 2.62882, 0.031377) Norm(0.179541, 0.983751, 0.0) UV(0.308577, 0.415829) +V 2850: Pos(3.478066, 2.077005, -3.613593) Norm(0.658819, 0.455453, 0.598766) UV(0.750761, 0.215742) +V 2851: Pos(2.016632, 2.62882, -7.162736) Norm(0.179535, 0.983752, 0.0) UV(0.539414, 0.308766) +V 2852: Pos(2.016632, 2.62882, -3.613668) Norm(0.133459, 0.731324, 0.668845) UV(0.750756, 0.308766) +V 2853: Pos(3.478066, 2.077005, -3.507417) Norm(0.658821, 0.455464, -0.598755) UV(0.536202, 0.215735) +V 2854: Pos(3.478066, 2.077005, -7.162736) Norm(0.822561, 0.568676, 0.0) UV(0.110904, 0.310142) +V 2855: Pos(0.701674, 1.213685, -3.517228) Norm(-0.705967, 0.0, -0.708245) UV(0.638641, 0.077501) +V 2856: Pos(3.428031, 0.526308, -3.613593) Norm(0.417915, -0.290957, 0.860634) UV(0.62927, 0.126763) +V 2857: Pos(3.478066, 0.491716, -3.613593) Norm(0.658792, -0.455482, 0.598773) UV(0.63225, 0.128822) +V 2858: Pos(0.648541, 1.211878, 0.021751) Norm(-1.0, 0.0, 0.0) UV(0.311789, 0.530565) +V 2859: Pos(0.648541, 1.211878, -3.517228) Norm(-0.447209, 0.0, -0.894429) UV(0.52253, 0.530565) +V 2860: Pos(0.702016, 1.213647, -3.623408) Norm(-0.708247, 1e-06, 0.705965) UV(0.466864, 0.085927) +V 2861: Pos(3.478066, 0.491716, 0.031415) Norm(0.658814, -0.455465, 0.598763) UV(0.272041, 0.619045) +V 2862: Pos(0.894965, -0.060085, -7.162736) Norm(-0.212117, -0.730277, -0.649386) UV(0.290912, 0.590999) +V 2863: Pos(2.209737, 0.674862, -7.162736) Norm(0.0, 0.0, -1.0) UV(0.37544, 0.621002) +V 2864: Pos(2.016632, -0.060085, -7.162736) Norm(0.133469, -0.731316, -0.668852) UV(0.356758, 0.579788) +V 2865: Pos(3.478066, 1.153763, -7.162736) Norm(0.933201, 0.0, -0.359354) UV(0.454682, 0.636439) +V 2866: Pos(3.478066, 0.491716, -7.162736) Norm(0.658822, -0.455449, -0.598765) UV(0.448065, 0.597574) +V 2867: Pos(0.894965, -0.060085, 0.031453) Norm(-0.217504, -0.724834, 0.653688) UV(0.114888, 0.625623) +V 2868: Pos(0.648541, 0.096257, 0.021751) Norm(-0.705206, -0.379917, 0.598622) UV(0.101976, 0.613978) +V 2869: Pos(0.648541, 0.096257, -7.162736) Norm(-0.692286, -0.380657, -0.613058) UV(0.278009, 0.60264) +V 2870: Pos(0.648541, 0.674862, -7.162736) Norm(-0.894437, 0.0, -0.447195) UV(0.283792, 0.636606) +V 2871: Pos(0.702015, 0.12525, -3.623408) Norm(-0.486037, -0.254216, 0.836147) UV(0.585056, 0.187796) +V 2872: Pos(0.701674, 1.213685, -3.517228) Norm(-0.705967, 0.0, -0.708245) UV(0.520241, 0.181473) +V 2873: Pos(0.648541, 1.211878, -7.162736) Norm(-1.0, 0.0, 0.0) UV(0.736503, 0.459905) +V 2874: Pos(0.648541, 0.674862, -7.162736) Norm(-0.894437, 0.0, -0.447195) UV(0.736503, 0.427926) +V 2875: Pos(-1.111483, 0.924291, 1.880578) Norm(0.577367, -0.577327, 0.577357) UV(0.001601, 0.001611) +V 2876: Pos(-1.491366, 0.924291, 0.703231) Norm(-0.57735, -0.577335, -0.577366) UV(0.024262, 0.071844) +V 2877: Pos(-1.111483, 0.924291, 0.703231) Norm(0.577354, -0.577354, -0.577342) UV(0.001601, 0.071844) +V 2878: Pos(-1.429669, 0.985988, 1.880578) Norm(0.301514, 0.301502, 0.904536) UV(0.190038, 0.024264) +V 2879: Pos(-1.429669, 1.164531, 0.703231) Norm(0.577356, 0.577359, -0.577336) UV(0.260271, 0.034915) +V 2880: Pos(-1.429669, 1.164531, 1.880578) Norm(0.577347, 0.577357, 0.577347) UV(0.190038, 0.034915) +V 2881: Pos(-1.111483, 0.985988, 0.703231) Norm(0.577365, 0.57733, -0.577356) UV(0.260271, 0.005283) +V 2882: Pos(-1.429669, 0.985988, 0.703231) Norm(0.301516, 0.301516, -0.904531) UV(0.260271, 0.024264) +V 2883: Pos(-1.111483, 0.924291, 1.880578) Norm(0.577367, -0.577327, 0.577357) UV(0.190038, 0.001602) +V 2884: Pos(-1.111483, 0.985988, 1.880578) Norm(0.577352, 0.577352, 0.577347) UV(0.190038, 0.005283) +V 2885: Pos(-1.491366, 0.924291, 1.880578) Norm(-0.577346, -0.577346, 0.577359) UV(0.528714, 0.012315) +V 2886: Pos(-1.111483, 0.985988, 1.880578) Norm(0.577352, 0.577352, 0.577347) UV(0.551376, 0.015996) +V 2887: Pos(-1.429669, 0.985988, 1.880578) Norm(0.301514, 0.301502, 0.904536) UV(0.532395, 0.015996) +V 2888: Pos(-1.111483, 0.924291, 0.703231) Norm(0.577354, -0.577354, -0.577342) UV(0.263475, 0.024264) +V 2889: Pos(-1.429669, 0.985988, 0.703231) Norm(0.301516, 0.301516, -0.904531) UV(0.267156, 0.005283) +V 2890: Pos(-1.111483, 0.985988, 0.703231) Norm(0.577365, 0.57733, -0.577356) UV(0.267156, 0.024264) +V 2891: Pos(-1.491366, 1.164531, 0.703231) Norm(-0.577347, 0.577357, -0.577347) UV(0.260271, 0.038595) +V 2892: Pos(-1.491366, 1.164531, 1.880578) Norm(-0.577351, 0.577365, 0.577335) UV(0.528714, 0.026646) +V 2893: Pos(-1.429669, 1.164531, 1.880578) Norm(0.577347, 0.577357, 0.577347) UV(0.532395, 0.026646) +V 2894: Pos(-1.491366, 0.924291, 0.703231) Norm(-0.57735, -0.577335, -0.577366) UV(0.263475, 0.001603) +V 2895: Pos(-1.429669, 1.164531, 0.703231) Norm(0.577356, 0.577359, -0.577336) UV(0.277806, 0.005283) +V 2896: Pos(-1.491366, 1.164531, 1.880578) Norm(-0.577351, 0.577365, 0.577335) UV(0.038594, 0.001611) +V 2897: Pos(-1.491366, 0.924291, 1.880578) Norm(-0.577346, -0.577346, 0.577359) UV(0.024262, 0.001611) +V 2898: Pos(1.111483, 0.924291, 1.880578) Norm(-0.577367, -0.577327, 0.577357) UV(0.001601, 0.001611) +V 2899: Pos(1.491366, 0.924291, 0.703231) Norm(0.57735, -0.577335, -0.577366) UV(0.024262, 0.071844) +V 2900: Pos(1.491366, 0.924291, 1.880578) Norm(0.577346, -0.577346, 0.577359) UV(0.024262, 0.001611) +V 2901: Pos(1.429669, 0.985988, 1.880578) Norm(-0.301514, 0.301502, 0.904536) UV(0.190038, 0.024264) +V 2902: Pos(1.429669, 1.164531, 0.703231) Norm(-0.577356, 0.577359, -0.577336) UV(0.260271, 0.034915) +V 2903: Pos(1.429669, 0.985988, 0.703231) Norm(-0.301516, 0.301516, -0.904531) UV(0.260271, 0.024264) +V 2904: Pos(1.111483, 0.985988, 0.703231) Norm(-0.577365, 0.57733, -0.577356) UV(0.260271, 0.005283) +V 2905: Pos(1.111483, 0.985988, 1.880578) Norm(-0.577352, 0.577352, 0.577347) UV(0.190038, 0.005283) +V 2906: Pos(1.111483, 0.924291, 1.880578) Norm(-0.577367, -0.577327, 0.577357) UV(0.190038, 0.001602) +V 2907: Pos(1.111483, 0.924291, 0.703231) Norm(-0.577354, -0.577354, -0.577342) UV(0.260271, 0.001602) +V 2908: Pos(1.491366, 0.924291, 1.880578) Norm(0.577346, -0.577346, 0.577359) UV(0.528714, 0.012315) +V 2909: Pos(1.111483, 0.985988, 1.880578) Norm(-0.577352, 0.577352, 0.577347) UV(0.551376, 0.015996) +V 2910: Pos(1.111483, 0.924291, 1.880578) Norm(-0.577367, -0.577327, 0.577357) UV(0.551376, 0.012315) +V 2911: Pos(1.111483, 0.924291, 0.703231) Norm(-0.577354, -0.577354, -0.577342) UV(0.263475, 0.024264) +V 2912: Pos(1.429669, 0.985988, 0.703231) Norm(-0.301516, 0.301516, -0.904531) UV(0.267156, 0.005283) +V 2913: Pos(1.491366, 0.924291, 0.703231) Norm(0.57735, -0.577335, -0.577366) UV(0.263475, 0.001603) +V 2914: Pos(1.491366, 1.164531, 0.703231) Norm(0.577347, 0.577357, -0.577347) UV(0.260271, 0.038595) +V 2915: Pos(1.429669, 1.164531, 1.880578) Norm(-0.577347, 0.577357, 0.577347) UV(0.190038, 0.034915) +V 2916: Pos(1.491366, 1.164531, 1.880578) Norm(0.577351, 0.577365, 0.577335) UV(0.190038, 0.038595) +V 2917: Pos(1.491366, 1.164531, 1.880578) Norm(0.577351, 0.577365, 0.577335) UV(0.528714, 0.026646) +V 2918: Pos(1.429669, 0.985988, 1.880578) Norm(-0.301514, 0.301502, 0.904536) UV(0.532395, 0.015996) +V 2919: Pos(1.429669, 1.164531, 0.703231) Norm(-0.577356, 0.577359, -0.577336) UV(0.277806, 0.005283) +V 2920: Pos(1.491366, 1.164531, 0.703231) Norm(0.577347, 0.577357, -0.577347) UV(0.277806, 0.001603) +V 2921: Pos(1.491366, 1.164531, 1.880578) Norm(0.577351, 0.577365, 0.577335) UV(0.038594, 0.001611) +V 2922: Pos(1.491366, 1.164531, 0.703231) Norm(0.577347, 0.577357, -0.577347) UV(0.038594, 0.071844) +V 2923: Pos(-1.10049, 0.992955, -9.095757) Norm(-0.505305, -0.579279, -0.639612) UV(0.646572, 0.93508) +V 2924: Pos(-0.648541, 0.992955, -8.09058) Norm(0.553739, -0.587099, 0.590497) UV(0.699425, 0.905396) +V 2925: Pos(-1.230799, 0.992955, -8.13096) Norm(-0.642281, -0.574344, 0.507547) UV(0.700066, 0.937492) +V 2926: Pos(-1.10049, 1.170611, -9.095757) Norm(-0.49487, 0.577358, -0.649431) UV(0.646131, 0.944842) +V 2927: Pos(-1.230799, 1.170611, -8.13096) Norm(-0.649439, 0.577349, 0.494871) UV(0.699626, 0.947254) +V 2928: Pos(-1.10049, 0.992955, -9.095757) Norm(-0.505305, -0.579279, -0.639612) UV(0.760856, 0.001604) +V 2929: Pos(-1.033229, 1.170611, -9.086672) Norm(0.650759, 0.578561, -0.491711) UV(0.757147, 0.011385) +V 2930: Pos(-1.034843, 1.062455, -9.08689) Norm(0.389632, 0.329695, -0.859935) UV(0.757222, 0.005436) +V 2931: Pos(-0.648541, 0.992955, -8.09058) Norm(0.553739, -0.587099, 0.590497) UV(0.139589, 0.637692) +V 2932: Pos(-0.648762, 1.060582, -9.064156) Norm(0.588304, 0.591316, -0.551583) UV(0.192721, 0.64533) +V 2933: Pos(-0.648541, 1.060827, -8.09058) Norm(0.566507, 0.560751, 0.603844) UV(0.139315, 0.641416) +V 2934: Pos(-1.230799, 1.170611, -8.13096) Norm(-0.649439, 0.577349, 0.494871) UV(0.110691, 0.316382) +V 2935: Pos(-1.162118, 1.059393, -8.121683) Norm(0.209318, 0.271821, 0.939308) UV(0.104582, 0.312557) +V 2936: Pos(-1.163538, 1.170611, -8.121875) Norm(0.493406, 0.57574, 0.651977) UV(0.1107, 0.312649) +V 2937: Pos(-0.648762, 0.99271, -9.064156) Norm(0.599758, -0.569708, -0.561893) UV(0.735949, 0.001604) +V 2938: Pos(-0.648762, 1.060582, -9.064156) Norm(0.588304, 0.591316, -0.551583) UV(0.73595, 0.005338) +V 2939: Pos(-1.10049, 1.170611, -9.095757) Norm(-0.49487, 0.577358, -0.649431) UV(0.193014, 0.676265) +V 2940: Pos(-1.163538, 1.170611, -8.121875) Norm(0.493406, 0.57574, 0.651977) UV(0.139338, 0.67582) +V 2941: Pos(-1.033229, 1.170611, -9.086672) Norm(0.650759, 0.578561, -0.491711) UV(0.192786, 0.672539) +V 2942: Pos(-1.230799, 0.992955, -8.13096) Norm(-0.642281, -0.574344, 0.507547) UV(0.10092, 0.316361) +V 2943: Pos(-0.648541, 1.060827, -8.09058) Norm(0.566507, 0.560751, 0.603844) UV(0.104653, 0.284257) +V 2944: Pos(-1.162118, 1.059393, -8.121683) Norm(0.209318, 0.271821, 0.939308) UV(0.138962, 0.669713) +V 2945: Pos(-1.034843, 1.062455, -9.08689) Norm(0.389632, 0.329695, -0.859935) UV(0.192421, 0.666601) +V 2946: Pos(1.10049, 0.992955, -9.095757) Norm(0.505305, -0.579279, -0.639612) UV(0.646572, 0.93508) +V 2947: Pos(0.648541, 0.992955, -8.09058) Norm(-0.553739, -0.587099, 0.590497) UV(0.699425, 0.905396) +V 2948: Pos(0.648762, 0.99271, -9.064156) Norm(-0.599758, -0.569708, -0.561893) UV(0.646089, 0.910178) +V 2949: Pos(1.10049, 1.170611, -9.095757) Norm(0.49487, 0.577358, -0.649431) UV(0.646131, 0.944842) +V 2950: Pos(1.230799, 0.992955, -8.13096) Norm(0.642281, -0.574344, 0.507547) UV(0.700066, 0.937492) +V 2951: Pos(1.10049, 0.992955, -9.095757) Norm(0.505305, -0.579279, -0.639612) UV(0.760856, 0.001604) +V 2952: Pos(1.033229, 1.170611, -9.086672) Norm(-0.650759, 0.578561, -0.491711) UV(0.757147, 0.011385) +V 2953: Pos(1.10049, 1.170611, -9.095757) Norm(0.49487, 0.577358, -0.649431) UV(0.760881, 0.011376) +V 2954: Pos(0.648541, 0.992955, -8.09058) Norm(-0.553739, -0.587099, 0.590497) UV(0.139589, 0.637692) +V 2955: Pos(0.648762, 1.060582, -9.064156) Norm(-0.588304, 0.591316, -0.551583) UV(0.192721, 0.64533) +V 2956: Pos(0.648762, 0.99271, -9.064156) Norm(-0.599758, -0.569708, -0.561893) UV(0.192995, 0.641607) +V 2957: Pos(1.230799, 1.170611, -8.13096) Norm(0.649439, 0.577349, 0.494871) UV(0.110691, 0.316382) +V 2958: Pos(1.162118, 1.059393, -8.121683) Norm(-0.209318, 0.271821, 0.939308) UV(0.104582, 0.312557) +V 2959: Pos(1.230799, 0.992955, -8.13096) Norm(0.642281, -0.574344, 0.507547) UV(0.10092, 0.316361) +V 2960: Pos(0.648762, 0.99271, -9.064156) Norm(-0.599758, -0.569708, -0.561893) UV(0.735949, 0.001604) +V 2961: Pos(1.034843, 1.062455, -9.08689) Norm(-0.389632, 0.329695, -0.859935) UV(0.757222, 0.005436) +V 2962: Pos(1.10049, 1.170611, -9.095757) Norm(0.49487, 0.577358, -0.649431) UV(0.193014, 0.676265) +V 2963: Pos(1.163538, 1.170611, -8.121875) Norm(-0.493406, 0.57574, 0.651977) UV(0.139338, 0.67582) +V 2964: Pos(1.230799, 1.170611, -8.13096) Norm(0.649439, 0.577349, 0.494871) UV(0.139566, 0.679546) +V 2965: Pos(0.648541, 1.060827, -8.09058) Norm(-0.566507, 0.560751, 0.603844) UV(0.104653, 0.284257) +V 2966: Pos(0.648541, 0.992955, -8.09058) Norm(-0.553739, -0.587099, 0.590497) UV(0.10092, 0.284258) +V 2967: Pos(1.033229, 1.170611, -9.086672) Norm(-0.650759, 0.578561, -0.491711) UV(0.192786, 0.672539) +V 2968: Pos(1.162118, 1.059393, -8.121683) Norm(-0.209318, 0.271821, 0.939308) UV(0.138962, 0.669713) +V 2969: Pos(1.034843, 1.062455, -9.08689) Norm(-0.389632, 0.329695, -0.859935) UV(0.192421, 0.666601) +V 2970: Pos(0.648541, 1.060827, -8.09058) Norm(-0.566507, 0.560751, 0.603844) UV(0.139315, 0.641416) +V 2971: Pos(-0.600842, 2.755199, -5.9038) Norm(0.662736, 0.741937, 0.101535) UV(0.175891, 0.761842) +V 2972: Pos(-1.491366, 1.630625, 3.882841) Norm(-0.577308, 0.577394, 0.577348) UV(0.001602, 0.091689) +V 2973: Pos(-1.746867, 1.630625, 3.882841) Norm(-0.577346, 0.577368, 0.577336) UV(0.177075, 0.900365) +V 2974: Pos(-1.491366, 1.328909, 3.882872) Norm(-0.523, -0.661038, 0.538052) UV(0.298199, 0.512172) +V 2975: Pos(-1.746867, 1.630625, 3.882841) Norm(-0.577346, 0.577368, 0.577336) UV(0.505663, 0.757265) +V 2976: Pos(-1.422373, 2.220263, 3.747011) Norm(-0.155374, 0.982934, 0.098484) UV(0.620603, 0.72188) +V 2977: Pos(-1.991606, 1.630625, 0.630966) Norm(-0.722159, 0.689589, 0.05435) UV(0.311252, 0.757265) +V 2978: Pos(-1.491366, 1.164531, 0.703231) Norm(-0.30151, -0.904535, 0.301511) UV(0.787086, 0.025161) +V 2979: Pos(-1.289676, 0.534161, 3.883919) Norm(-0.695842, -0.717999, -0.016778) UV(0.099277, 0.900285) +V 2980: Pos(-0.648541, 0.924291, -0.67675) Norm(0.0, -0.951236, -0.308464) UV(0.059601, 0.515782) +V 2981: Pos(-0.648232, 0.484648, -8.09058) Norm(-0.655956, -0.733123, -0.179591) UV(0.154536, 0.810875) +V 2982: Pos(-1.569701, 2.13116, 1.880577) Norm(-0.955121, 0.294294, 0.033685) UV(0.645573, 0.151947) +V 2983: Pos(-0.884244, 2.649343, -3.148756) Norm(-0.81818, -0.054595, -0.572365) UV(0.901256, 0.001605) +V 2984: Pos(-0.726025, 2.527008, 0.630966) Norm(-0.202674, -0.579391, -0.789449) UV(0.471548, 0.202893) +V 2985: Pos(-1.111364, 2.527008, 0.630966) Norm(-0.389148, 0.636244, -0.666151) UV(0.899507, 0.863018) +V 2986: Pos(-1.491366, 1.164531, 0.703231) Norm(-0.30151, -0.904535, 0.301511) UV(0.646019, 0.086333) +V 2987: Pos(-1.491366, 1.630625, 2.584705) Norm(-0.718818, 0.693999, 0.040815) UV(0.854848, 0.907677) +V 2988: Pos(-1.310804, 0.913759, 2.577662) Norm(-0.581639, -0.729937, -0.359009) UV(0.614951, 0.671903) +V 2989: Pos(-0.780328, 3.011741, 0.630966) Norm(-0.389407, 0.655175, -0.647386) UV(0.042283, 0.973263) +V 2990: Pos(-1.376387, 1.164531, 2.329785) Norm(-0.763276, -0.627318, 0.154538) UV(0.192102, 0.862994) +V 2991: Pos(-0.455867, 3.095955, -7.759471) Norm(-0.121131, 0.975112, 0.185698) UV(0.511128, 0.534796) +V 2992: Pos(-0.542386, 3.10173, -7.759471) Norm(0.025591, 0.760812, 0.648468) UV(0.507828, 0.538731) +V 2993: Pos(-0.703551, 3.10173, -7.759471) Norm(-0.121706, 0.77541, 0.619618) UV(0.50122, 0.545621) +V 2994: Pos(-0.81946, 3.067169, -7.759471) Norm(-0.416096, 0.683983, 0.599193) UV(0.49499, 0.549158) +V 2995: Pos(-1.482806, 1.34622, -9.439158) Norm(-0.683901, -0.727142, -0.059533) UV(0.407765, 0.644008) +V 2996: Pos(-1.277231, 1.170611, -7.759471) Norm(-0.894623, -0.430898, -0.118224) UV(0.944204, 0.401741) +V 2997: Pos(-1.230799, 0.992955, -8.13096) Norm(-0.517487, -0.580287, -0.628868) UV(0.954467, 0.255049) +V 2998: Pos(-0.649767, 0.992952, -8.090581) Norm(-0.896295, -0.321955, -0.304959) UV(0.99265, 0.319501) +V 2999: Pos(-1.111364, 2.708697, -7.759471) Norm(-0.486614, 0.500907, 0.715751) UV(0.0039, 0.786646) +V 3000: Pos(-1.111364, 2.708697, -7.759471) Norm(-0.486614, 0.500907, 0.715751) UV(0.928302, 0.234033) +V 3001: Pos(-1.087338, 2.579507, -9.439158) Norm(-0.275035, 0.658174, -0.70083) UV(0.913851, 0.332807) +V 3002: Pos(-0.760641, 0.924291, 2.584705) Norm(-0.297042, -0.834972, -0.463237) UV(0.876763, 0.428951) +V 3003: Pos(-0.565739, 0.924291, 2.31596) Norm(-0.705941, -0.697131, -0.125117) UV(0.089275, 0.799846) +V 3004: Pos(-0.929518, 2.708697, -9.064084) Norm(-0.466815, 0.816394, -0.339978) UV(0.025109, 0.607006) +V 3005: Pos(-0.871251, 2.802734, -9.064084) Norm(-0.529763, 0.438109, -0.726231) UV(0.374902, 0.133797) +V 3006: Pos(-0.796828, 2.886173, -9.064084) Norm(-0.385683, 0.609706, -0.692464) UV(0.379844, 0.138205) +V 3007: Pos(-0.70055, 2.920734, -9.064084) Norm(-0.111005, 0.689743, -0.715494) UV(0.381892, 0.143908) +V 3008: Pos(-0.473708, 2.351064, 3.526832) Norm(0.0, 0.92172, 0.387856) UV(0.528856, 0.521195) +V 3009: Pos(-0.36641, 2.755199, -6.634012) Norm(0.044646, 0.993482, 0.10488) UV(0.101614, 0.553946) +V 3010: Pos(-0.36641, 3.046302, -0.072927) Norm(0.044926, 0.987298, -0.152397) UV(0.499009, 0.553946) +V 3011: Pos(-1.054109, 1.622469, -11.271577) Norm(0.630255, -0.297111, -0.717289) UV(0.307371, 0.66037) +V 3012: Pos(-1.211802, 2.174068, -11.271577) Norm(-0.630255, 0.297111, -0.717289) UV(0.830122, 0.500121) +V 3013: Pos(-1.360914, 2.450317, -10.181827) Norm(0.630257, 0.717288, -0.29711) UV(0.330791, 0.779835) +V 3014: Pos(-1.482806, 2.174068, -10.458076) Norm(-0.630261, 0.297109, -0.717285) UV(0.901252, 0.423036) +V 3015: Pos(-1.211802, 2.174068, -11.271577) Norm(-0.630255, 0.297111, -0.717289) UV(0.041804, 0.00161) +V 3016: Pos(-1.482806, 2.174068, -10.458076) Norm(-0.630261, 0.297109, -0.717285) UV(0.848913, 0.110811) +V 3017: Pos(-1.054109, 1.622469, -11.271577) Norm(0.630255, -0.297111, -0.717289) UV(0.698637, 0.202895) +V 3018: Pos(-1.482806, 1.34622, -10.181827) Norm(-0.630262, -0.717281, -0.297116) UV(0.5015, 0.017393) +V 3019: Pos(-1.054109, 2.450317, -10.995328) Norm(0.630276, 0.717274, -0.297104) UV(0.280771, 0.792085) +V 3020: Pos(-1.360914, 2.450317, -9.747389) Norm(0.301515, 0.904531, -0.301516) UV(0.438766, 0.928074) +V 3021: Pos(-1.211802, 2.450317, -9.747389) Norm(-0.301522, 0.904532, -0.301506) UV(0.995446, 0.194322) +V 3022: Pos(-1.360914, 1.622469, -10.458076) Norm(0.630255, -0.297111, -0.717289) UV(0.389731, 0.885979) +V 3023: Pos(-1.482806, 2.450317, -9.439158) Norm(-0.683897, 0.727146, -0.059533) UV(0.398586, 0.115093) +V 3024: Pos(-0.730828, 2.527008, -3.148756) Norm(-0.25406, -0.725506, -0.639606) UV(0.742879, 0.018737) +V 3025: Pos(-0.600842, 2.755199, -3.148756) Norm(0.57735, 0.57735, -0.57735) UV(0.873642, 0.399849) +V 3026: Pos(-0.600842, 2.755199, -3.148756) Norm(0.57735, 0.57735, -0.57735) UV(0.196744, 0.853998) +V 3027: Pos(-0.881851, 2.651839, -7.759471) Norm(-0.405621, -0.025127, 0.913696) UV(0.916154, 0.001603) +V 3028: Pos(-0.730828, 2.527008, -3.97069) Norm(-0.256869, -0.72395, 0.640246) UV(0.243917, 0.200754) +V 3029: Pos(-1.054109, 0.992955, -9.439158) Norm(-0.53391, -0.584629, -0.610859) UV(0.690958, 0.517485) +V 3030: Pos(-1.10049, 1.170611, -9.095757) Norm(-0.676724, -0.710549, 0.192779) UV(0.043714, 0.518415) +V 3031: Pos(-0.945714, 1.45027, -9.08693) Norm(0.514483, -0.58031, 0.631306) UV(0.327819, 0.949297) +V 3032: Pos(-0.945714, 1.170611, -9.08693) Norm(0.23291, -0.281604, 0.930834) UV(0.489559, 0.830304) +V 3033: Pos(-1.420916, 1.400926, 0.703231) Norm(0.577341, -0.577355, 0.577355) UV(0.630265, 0.945934) +V 3034: Pos(-1.420916, 1.164531, 0.703231) Norm(0.301513, -0.301518, 0.904531) UV(0.978619, 0.974988) +V 3035: Pos(-1.491366, 1.164531, 1.880578) Norm(-0.285497, -0.932493, -0.221241) UV(0.307834, 0.757494) +V 3036: Pos(-1.111483, 1.400926, 0.703231) Norm(-0.577352, -0.577327, 0.577372) UV(0.93097, 0.001601) +V 3037: Pos(-1.310804, 0.913759, 2.577662) Norm(-0.581639, -0.729937, -0.359009) UV(0.357511, 0.945949) +V 3038: Pos(-1.491366, 0.924291, 0.630966) Norm(-0.707107, -0.707107, 0.0) UV(0.01017, 0.593555) +V 3039: Pos(-0.65104, 2.527008, -7.759471) Norm(-0.706011, -0.708201, -0.000426) UV(0.140838, 0.195885) +V 3040: Pos(-1.491366, 2.450317, -7.759471) Norm(-0.27152, 0.954077, 0.126549) UV(0.422051, 0.535074) +V 3041: Pos(1.746867, 1.328909, 3.882872) Norm(0.584739, -0.572346, 0.574891) UV(0.019473, 0.076555) +V 3042: Pos(1.863753, 1.164531, 2.329785) Norm(0.653945, -0.690529, 0.309072) UV(0.412161, 0.729658) +V 3043: Pos(1.491366, 0.924291, 0.630966) Norm(0.707107, -0.707107, 0.0) UV(0.801316, 0.02088) +V 3044: Pos(0.782711, 2.755199, -6.804733) Norm(0.44254, 0.893849, 0.07206) UV(0.240801, 0.951603) +V 3045: Pos(0.503329, 3.046302, -0.072927) Norm(0.373152, 0.926756, -0.043366) UV(0.865597, 0.216483) +V 3046: Pos(0.65104, 0.924291, -5.634158) Norm(0.297506, -0.868761, 0.395909) UV(0.807133, 0.145247) +V 3047: Pos(0.648541, 0.924291, -0.67675) Norm(0.0, -0.951236, -0.308464) UV(0.525739, 0.464281) +V 3048: Pos(1.461987, 2.527008, 0.630966) Norm(0.388908, 0.909199, 0.148684) UV(0.72038, 0.1302) +V 3049: Pos(0.726025, 2.527008, 0.630966) Norm(0.202674, -0.579391, -0.789449) UV(0.912921, 0.225495) +V 3050: Pos(0.653539, 2.527008, -3.148756) Norm(0.707485, -0.003256, -0.706721) UV(0.695422, 0.207471) +V 3051: Pos(0.503244, 3.046302, 0.630966) Norm(0.191006, 0.97212, -0.136011) UV(0.199242, 0.930947) +V 3052: Pos(1.111364, 2.527008, 0.630966) Norm(0.389147, 0.636244, -0.666152) UV(0.899507, 0.863018) +V 3053: Pos(1.420916, 1.164531, 1.880578) Norm(-0.301509, -0.301516, -0.904533) UV(0.641846, 0.016596) +V 3054: Pos(1.491366, 2.2121, 3.8828) Norm(0.842316, 0.538977, 0.002755) UV(0.777959, 0.873235) +V 3055: Pos(1.491366, 1.164531, 1.880578) Norm(0.285497, -0.932493, -0.221241) UV(0.600722, 0.629038) +V 3056: Pos(1.543156, 2.364377, 2.1357) Norm(0.707555, 0.706433, -0.01785) UV(0.028375, 0.793962) +V 3057: Pos(0.780328, 3.011741, 0.630966) Norm(0.389407, 0.655174, -0.647386) UV(0.042283, 0.973263) +V 3058: Pos(0.542386, 3.10173, -7.759471) Norm(-0.025593, 0.760812, 0.648468) UV(0.507828, 0.538731) +V 3059: Pos(0.455867, 3.095955, -7.759471) Norm(0.12113, 0.975112, 0.185698) UV(0.511128, 0.534796) +V 3060: Pos(1.111364, 2.708697, -7.759471) Norm(0.486614, 0.500906, 0.715751) UV(0.467698, 0.546938) +V 3061: Pos(0.81946, 3.067169, -7.759471) Norm(0.41609, 0.683984, 0.599195) UV(0.49499, 0.549158) +V 3062: Pos(1.777471, 2.450317, -7.759471) Norm(0.735981, 0.664577, -0.129112) UV(0.508775, 0.709406) +V 3063: Pos(1.491366, 2.450317, -7.759471) Norm(0.271519, 0.954077, 0.126549) UV(0.47416, 0.789409) +V 3064: Pos(1.277231, 1.170611, -7.759471) Norm(0.894623, -0.430897, -0.118223) UV(0.96499, 0.232874) +V 3065: Pos(0.648541, 0.484647, -6.014415) Norm(0.622891, -0.711776, 0.324626) UV(0.644231, 0.605681) +V 3066: Pos(1.277231, 0.992955, -7.759471) Norm(0.729924, -0.677412, -0.091232) UV(0.973038, 0.282335) +V 3067: Pos(0.649097, 0.992709, -9.064156) Norm(0.43085, -0.887051, 0.165859) UV(0.040054, 0.582719) +V 3068: Pos(1.087338, 2.579507, -9.439158) Norm(0.275033, 0.658176, -0.700829) UV(0.913851, 0.332807) +V 3069: Pos(1.111364, 2.708697, -7.759471) Norm(0.486614, 0.500906, 0.715751) UV(0.928302, 0.234033) +V 3070: Pos(0.565739, 0.924291, 1.454266) Norm(0.131205, -0.973829, -0.185588) UV(0.98761, 0.453426) +V 3071: Pos(0.565637, 0.59299, 2.606576) Norm(0.430304, -0.869704, -0.241771) UV(0.860133, 0.413342) +V 3072: Pos(0.565739, 0.633144, 1.745819) Norm(0.634265, -0.707295, -0.312156) UV(0.056344, 0.781045) +V 3073: Pos(1.10049, 0.992955, -9.095757) Norm(0.634183, -0.572752, 0.519391) UV(0.951493, 0.751289) +V 3074: Pos(0.796828, 2.886173, -9.064084) Norm(0.385683, 0.609706, -0.692464) UV(0.379844, 0.138205) +V 3075: Pos(0.929518, 2.708697, -9.064084) Norm(0.466815, 0.816394, -0.339977) UV(0.369332, 0.130345) +V 3076: Pos(0.36641, 3.046302, -0.072927) Norm(-0.044926, 0.987298, -0.152397) UV(0.380563, 0.853925) +V 3077: Pos(1.482806, 1.622469, -10.458076) Norm(0.630271, -0.297103, -0.717279) UV(0.458938, 0.164128) +V 3078: Pos(1.054109, 2.450317, -10.995328) Norm(-0.630276, 0.717274, -0.297104) UV(0.839462, 0.476981) +V 3079: Pos(1.360914, 2.450317, -10.181827) Norm(-0.630257, 0.717288, -0.29711) UV(0.908472, 0.399896) +V 3080: Pos(1.054109, 1.622469, -11.271577) Norm(-0.630255, -0.297111, -0.717289) UV(0.051145, 0.034282) +V 3081: Pos(1.360914, 1.622469, -10.458076) Norm(-0.630255, -0.297111, -0.717289) UV(0.856133, 0.143483) +V 3082: Pos(1.211802, 1.34622, -10.995328) Norm(0.630281, -0.71727, -0.297101) UV(0.721777, 0.212236) +V 3083: Pos(1.360914, 1.622469, -10.458076) Norm(-0.630255, -0.297111, -0.717289) UV(0.47836, 0.010173) +V 3084: Pos(1.777471, 1.34622, -7.759471) Norm(0.735964, -0.664596, -0.129109) UV(0.479836, 0.772585) +V 3085: Pos(1.360914, 1.34622, -10.181827) Norm(-0.630263, -0.717286, -0.297101) UV(0.625242, 0.779835) +V 3086: Pos(1.054109, 1.34622, -10.995328) Norm(-0.630263, -0.717286, -0.297101) UV(0.675262, 0.792084) +V 3087: Pos(1.360914, 1.34622, -9.747389) Norm(-0.301501, -0.904536, -0.301517) UV(0.986614, 0.259719) +V 3088: Pos(1.211802, 1.34622, -9.747389) Norm(0.301508, -0.904536, -0.301508) UV(0.808175, 0.67433) +V 3089: Pos(1.211802, 2.174068, -11.271577) Norm(0.630255, 0.297111, -0.717289) UV(0.75914, 0.584049) +V 3090: Pos(1.054109, 2.450317, -9.439158) Norm(-0.301518, 0.3015, -0.904536) UV(0.198833, 0.709405) +V 3091: Pos(0.600842, 2.527008, -3.97069) Norm(-0.30151, 0.904535, 0.30151) UV(0.694167, 0.506957) +V 3092: Pos(0.782711, 2.755199, -3.97069) Norm(0.305115, 0.715432, 0.62854) UV(0.308039, 0.738347) +V 3093: Pos(0.884244, 2.649343, -3.97069) Norm(0.819513, -0.051224, 0.570766) UV(0.701413, 0.523744) +V 3094: Pos(0.600842, 2.527008, -3.97069) Norm(-0.30151, 0.904535, 0.30151) UV(0.945036, 0.076555) +V 3095: Pos(0.730828, 2.527008, -3.97069) Norm(0.256869, -0.72395, 0.640246) UV(0.927759, 0.22602) +V 3096: Pos(0.65104, 2.527008, -7.759471) Norm(0.706011, -0.708201, -0.000426) UV(0.468334, 0.20548) +V 3097: Pos(0.782711, 2.755199, -3.97069) Norm(0.305115, 0.715432, 0.62854) UV(0.290393, 0.751069) +V 3098: Pos(0.600842, 2.755199, -3.148756) Norm(-0.57735, 0.57735, -0.57735) UV(0.735179, 0.032253) +V 3099: Pos(0.653539, 2.527008, -3.97069) Norm(0.707311, -0.002602, 0.706897) UV(0.261452, 0.536939) +V 3100: Pos(1.10049, 1.170611, -9.095757) Norm(0.676724, -0.710549, 0.192779) UV(0.670433, 0.506962) +V 3101: Pos(1.06854, 1.170611, -8.119707) Norm(-0.366272, -0.316364, -0.875076) UV(0.052875, 0.575529) +V 3102: Pos(0.945714, 1.45027, -9.08693) Norm(-0.514483, -0.58031, 0.631306) UV(0.916946, 0.990154) +V 3103: Pos(0.650846, 1.450265, -8.090582) Norm(0.557789, -0.574365, -0.599147) UV(0.270161, 0.970825) +V 3104: Pos(0.650176, 1.450022, -9.064157) Norm(0.596638, -0.581808, 0.552741) UV(0.455603, 0.623586) +V 3105: Pos(0.650846, 1.450265, -8.090582) Norm(0.557789, -0.574365, -0.599147) UV(0.232332, 0.98373) +V 3106: Pos(1.06854, 1.45027, -8.119707) Norm(-0.632605, -0.574449, -0.519442) UV(0.431809, 0.846869) +V 3107: Pos(1.111364, 2.527008, 0.630966) Norm(0.389147, 0.636244, -0.666152) UV(0.807324, 0.723179) +V 3108: Pos(0.780328, 3.011741, 0.630966) Norm(0.389407, 0.655174, -0.647386) UV(0.700048, 0.574314) +V 3109: Pos(1.111483, 1.400926, 1.880578) Norm(0.577324, -0.577353, -0.577373) UV(0.560529, 0.964262) +V 3110: Pos(1.420916, 1.400926, 1.880578) Norm(-0.577358, -0.577334, -0.577358) UV(0.964617, 0.905251) +V 3111: Pos(1.491366, 0.924291, 0.703231) Norm(0.577329, -0.577365, 0.577357) UV(0.960294, 0.991299) +V 3112: Pos(1.111483, 0.924291, 1.880578) Norm(0.297045, -0.904461, -0.30613) UV(0.959202, 0.071337) +V 3113: Pos(1.310804, 0.913759, 2.577662) Norm(0.58164, -0.729936, -0.359009) UV(0.021588, 0.708795) +V 3114: Pos(0.760543, 0.580467, 2.875029) Norm(0.115857, -0.940021, -0.320839) UV(0.330855, 0.978387) +V 3115: Pos(1.289676, 0.534161, 3.883919) Norm(0.695806, -0.718032, -0.016852) UV(0.06884, 0.644798) +V 3116: Pos(0.65104, 1.199254, -3.630376) Norm(0.446884, -0.894592, 0.0) UV(0.385413, 0.11724) +V 3117: Pos(0.648724, 2.446799, 0.630966) Norm(0.711833, -0.00304, -0.702342) UV(0.63782, 0.191133) +V 3118: Pos(0.881851, 2.651839, -7.759471) Norm(0.405621, -0.025127, 0.913696) UV(0.454217, 0.540587) +V 3119: Pos(-1.540169, 0.738042, -9.747389) Norm(-0.173125, 0.657562, 0.73324) UV(0.387319, 0.001748) +V 3120: Pos(-1.391057, 0.607463, -9.747389) Norm(0.187681, -0.711563, 0.677092) UV(0.481844, 0.797902) +V 3121: Pos(-1.211802, 1.264349, -13.273538) Norm(0.606356, -0.505019, -0.614238) UV(0.817759, 0.451283) +V 3122: Pos(-1.211802, 2.600502, -9.747389) Norm(0.541346, 0.41941, 0.728725) UV(0.387374, 0.843982) +V 3123: Pos(-1.937491, 0.53473, -11.664807) Norm(0.072263, -0.921607, -0.381337) UV(0.955796, 0.545824) +V 3124: Pos(-1.354107, 2.600502, -9.747389) Norm(-0.666644, 0.365527, 0.649596) UV(0.933052, 0.328282) +V 3125: Pos(-1.540169, 2.917024, -10.525191) Norm(-0.50487, -0.532665, 0.679245) UV(0.263303, 0.042402) +V 3126: Pos(-1.354107, 0.986717, -11.896939) Norm(-0.80126, -0.43962, -0.405852) UV(0.972249, 0.506468) +V 3127: Pos(-1.211802, 1.264349, -13.273538) Norm(0.606356, -0.505019, -0.614238) UV(0.757883, 0.875092) +V 3128: Pos(-2.550167, 0.439566, -9.747389) Norm(-0.329892, -0.66041, 0.674559) UV(0.001611, 0.280589) +V 3129: Pos(-2.90103, 0.406478, -11.534469) Norm(-0.567982, -0.777306, -0.270538) UV(0.095491, 0.299073) +V 3130: Pos(-2.90103, 0.406478, -11.534469) Norm(-0.567982, -0.777306, -0.270538) UV(0.986006, 0.155608) +V 3131: Pos(-2.569841, 0.587375, -9.747389) Norm(-0.492723, 0.54084, 0.681701) UV(0.441984, 0.001606) +V 3132: Pos(-2.594218, 3.207749, -13.273538) Norm(-0.229169, 0.653962, -0.720982) UV(0.240608, 0.208605) +V 3133: Pos(-2.90103, 3.248588, -10.976743) Norm(-0.54833, 0.695713, 0.464022) UV(0.113248, 0.208602) +V 3134: Pos(-2.90103, 3.248588, -10.976743) Norm(-0.54833, 0.695713, 0.464022) UV(0.066177, 0.001615) +V 3135: Pos(-2.920704, 3.100779, -10.976743) Norm(-0.731182, -0.481386, 0.483364) UV(0.190037, 0.065771) +V 3136: Pos(1.354107, 0.942738, -9.747389) Norm(0.666588, 0.088628, 0.740139) UV(0.465767, 0.805348) +V 3137: Pos(1.354107, 0.986717, -11.896939) Norm(0.80126, -0.43962, -0.405852) UV(0.744001, 0.458809) +V 3138: Pos(2.90845, 0.554287, -11.684682) Norm(0.620248, 0.246627, -0.744626) UV(0.972643, 0.593984) +V 3139: Pos(1.391057, 0.607463, -9.747389) Norm(-0.187681, -0.711563, 0.677092) UV(0.001618, 0.219067) +V 3140: Pos(2.90103, 3.248588, -10.976743) Norm(0.54833, 0.695713, 0.464022) UV(0.925809, 0.444421) +V 3141: Pos(1.527916, 0.738042, -11.869441) Norm(0.275405, 0.286313, -0.917702) UV(0.963718, 0.520731) +V 3142: Pos(2.550167, 0.439566, -9.747389) Norm(0.329893, -0.660411, 0.674558) UV(0.986006, 0.057292) +V 3143: Pos(2.569841, 0.587375, -9.747389) Norm(0.492749, 0.540853, 0.681672) UV(0.514767, 0.850351) +V 3144: Pos(2.90103, 0.406478, -11.534469) Norm(0.567982, -0.777306, -0.27054) UV(0.095491, 0.299073) +V 3145: Pos(2.550167, 0.439566, -9.747389) Norm(0.329893, -0.660411, 0.674558) UV(0.001611, 0.280589) +V 3146: Pos(2.569841, 0.587375, -9.747389) Norm(0.492749, 0.540853, 0.681672) UV(0.441984, 0.001606) +V 3147: Pos(2.90845, 0.554287, -11.684682) Norm(0.620248, 0.246627, -0.744626) UV(0.460078, 0.103333) +V 3148: Pos(2.90845, 3.100779, -12.965064) Norm(0.779487, -0.550852, -0.298266) UV(0.217763, 0.201925) +V 3149: Pos(2.601639, 3.059941, -13.273538) Norm(0.361759, -0.598984, -0.714386) UV(0.876989, 0.881293) +V 3150: Pos(2.90103, 3.248588, -10.976743) Norm(0.54833, 0.695713, 0.464022) UV(0.066177, 0.001615) +V 3151: Pos(2.601639, 3.059941, -13.273538) Norm(0.361759, -0.598984, -0.714386) UV(0.206358, 0.186492) +V 3152: Pos(-0.509431, 2.809578, -9.639683) Norm(-0.068104, 0.951392, 0.300359) UV(0.861333, 0.950466) +V 3153: Pos(-0.509431, 2.809578, -12.305865) Norm(-0.519489, 0.61734, -0.590781) UV(0.270609, 0.815306) +V 3154: Pos(-0.152248, 3.083655, -10.228309) Norm(-0.173162, 0.966948, 0.187151) UV(0.841745, 0.914857) +V 3155: Pos(-0.415949, 2.931407, -9.90133) Norm(-0.447969, 0.865311, 0.224858) UV(0.856206, 0.934638) +V 3156: Pos(-0.75615, 2.099509, -12.305865) Norm(-0.423797, -0.604704, -0.674337) UV(0.480924, 0.930944) +V 3157: Pos(-1.054109, 2.809578, -9.639683) Norm(-0.661542, 0.732178, 0.162102) UV(0.508353, 0.851714) +V 3158: Pos(-0.509431, 2.809578, -9.639683) Norm(-0.068104, 0.951392, 0.300359) UV(0.508353, 0.881585) +V 3159: Pos(-1.054109, 2.099509, -11.686933) Norm(-0.7322, -0.66028, -0.167073) UV(0.509016, 0.020881) +V 3160: Pos(-0.75615, 2.099509, -12.305865) Norm(-0.423797, -0.604704, -0.674337) UV(0.898688, 0.515521) +V 3161: Pos(-0.415949, 2.099509, -12.305865) Norm(-0.410216, -0.734467, -0.54063) UV(0.917345, 0.515521) +V 3162: Pos(-1.054109, 0.992955, -9.439158) Norm(-0.6038, -0.428489, 0.672177) UV(0.903602, 0.95831) +V 3163: Pos(-0.415949, 1.609655, -10.837625) Norm(-0.246602, 0.726484, -0.641412) UV(0.920557, 0.51552) +V 3164: Pos(-0.10813, 1.380992, -11.791429) Norm(0.342712, -0.593599, -0.72814) UV(0.844168, 0.546438) +V 3165: Pos(-0.055972, 1.402596, -11.791429) Norm(0.177402, -0.662074, -0.728139) UV(0.841308, 0.547623) +V 3166: Pos(-0.0, 0.977446, -11.791429) Norm(3e-06, 0.685436, -0.728133) UV(0.838238, 0.524307) +V 3167: Pos(-0.055972, 0.984815, -11.791429) Norm(0.177401, 0.662084, -0.728131) UV(0.841308, 0.524711) +V 3168: Pos(-0.10813, 1.006419, -11.791429) Norm(0.342712, 0.593599, -0.72814) UV(0.844168, 0.525896) +V 3169: Pos(-0.187286, 1.085576, -11.791429) Norm(0.593593, 0.342714, -0.728145) UV(0.848509, 0.530237) +V 3170: Pos(-0.208891, 1.137733, -11.791429) Norm(0.66207, 0.177414, -0.72814) UV(0.849694, 0.533097) +V 3171: Pos(-0.21626, 1.193705, -11.791429) Norm(0.685427, 2e-06, -0.728141) UV(0.850098, 0.536167) +V 3172: Pos(-0.208891, 1.249678, -11.791429) Norm(0.662092, -0.177411, -0.728121) UV(0.849694, 0.539236) +V 3173: Pos(-0.187286, 1.301835, -11.791429) Norm(0.593594, -0.342711, -0.728145) UV(0.848509, 0.542097) +V 3174: Pos(-0.29412, 0.684275, -10.102099) Norm(-0.319877, -0.924728, 0.206293) UV(0.945281, 0.918205) +V 3175: Pos(-0.152248, 0.62551, -10.228309) Norm(-0.173159, -0.966951, 0.187143) UV(0.953062, 0.91057) +V 3176: Pos(-1.054109, 0.899586, -11.686933) Norm(-0.732207, -0.660275, -0.167065) UV(0.400656, 0.970754) +V 3177: Pos(-0.509431, 0.899586, -9.639683) Norm(-0.068104, -0.951392, 0.300359) UV(0.624694, 0.862313) +V 3178: Pos(-1.054109, 0.899586, -9.639683) Norm(-0.661533, -0.732186, 0.162104) UV(0.624694, 0.832443) +V 3179: Pos(-0.415949, 1.609655, -12.305865) Norm(-0.41022, 0.734466, -0.540629) UV(0.895545, 0.429868) +V 3180: Pos(-0.75615, 1.609655, -12.305865) Norm(-0.423796, 0.604704, -0.674337) UV(0.914202, 0.429868) +V 3181: Pos(-0.10813, 2.702745, -11.791429) Norm(0.342702, -0.593606, -0.728139) UV(0.934223, 0.401707) +V 3182: Pos(-0.055972, 2.724349, -11.791429) Norm(0.17739, -0.662071, -0.728144) UV(0.937084, 0.400522) +V 3183: Pos(-0.055972, 2.306568, -11.791429) Norm(0.177392, 0.662085, -0.728131) UV(0.937084, 0.423434) +V 3184: Pos(-0.10813, 2.328172, -11.791429) Norm(0.342672, 0.593608, -0.728152) UV(0.934223, 0.422249) +V 3185: Pos(-0.187286, 2.407329, -11.791429) Norm(0.593593, 0.342714, -0.728145) UV(0.929882, 0.417908) +V 3186: Pos(-0.208891, 2.459486, -11.791429) Norm(0.662073, 0.177413, -0.728137) UV(0.928697, 0.415048) +V 3187: Pos(-0.21626, 2.515459, -11.791429) Norm(0.685475, -0.0, -0.728096) UV(0.928293, 0.411978) +V 3188: Pos(-0.208891, 2.571431, -11.791429) Norm(0.662093, -0.177411, -0.72812) UV(0.928697, 0.408909) +V 3189: Pos(-0.187286, 2.623588, -11.791429) Norm(0.593595, -0.342711, -0.728145) UV(0.929882, 0.406048) +V 3190: Pos(-1.054109, 2.579507, -9.439158) Norm(-0.894426, 0.0, 0.447217) UV(0.53864, 0.156857) +V 3191: Pos(-1.054109, 0.992955, -9.439158) Norm(-0.6038, -0.428489, 0.672177) UV(0.525739, 0.50696) +V 3192: Pos(1.054109, 2.716209, -9.439158) Norm(0.6038, 0.428489, 0.672178) UV(0.891204, 0.962597) +V 3193: Pos(0.415949, 2.099509, -10.837623) Norm(0.246604, -0.726493, -0.6414) UV(0.946673, 0.601175) +V 3194: Pos(0.29412, 3.024889, -10.102099) Norm(0.319878, 0.924727, 0.206294) UV(0.849525, 0.922492) +V 3195: Pos(0.152248, 3.083655, -10.228309) Norm(0.17316, 0.966949, 0.18715) UV(0.841745, 0.914857) +V 3196: Pos(1.054109, 2.809578, -11.686933) Norm(0.732207, 0.660275, -0.167065) UV(0.441983, 0.968615) +V 3197: Pos(0.509431, 2.809578, -9.639683) Norm(0.068104, 0.951392, 0.300359) UV(0.508353, 0.881585) +V 3198: Pos(1.054109, 2.809578, -9.639683) Norm(0.661542, 0.732178, 0.162102) UV(0.508353, 0.851714) +V 3199: Pos(0.415949, 2.099509, -12.305865) Norm(0.410216, -0.734467, -0.54063) UV(0.917345, 0.515521) +V 3200: Pos(0.75615, 2.099509, -12.305865) Norm(0.423797, -0.604704, -0.674337) UV(0.898688, 0.515521) +V 3201: Pos(0.509431, 0.899586, -9.639683) Norm(0.068104, -0.951392, 0.300359) UV(0.933473, 0.946179) +V 3202: Pos(0.509431, 0.899586, -12.305865) Norm(0.519488, -0.617342, -0.59078) UV(0.121331, 0.848995) +V 3203: Pos(0.055972, 1.402596, -11.791429) Norm(-0.177402, -0.662077, -0.728136) UV(0.841308, 0.547623) +V 3204: Pos(0.152919, 1.346624, -11.791429) Norm(-0.484675, -0.484666, -0.728141) UV(0.846624, 0.544553) +V 3205: Pos(0.187286, 1.301835, -11.791429) Norm(-0.593605, -0.342717, -0.728134) UV(0.848509, 0.542097) +V 3206: Pos(0.208891, 1.249678, -11.791429) Norm(-0.662072, -0.177405, -0.72814) UV(0.849694, 0.539236) +V 3207: Pos(0.21626, 1.193705, -11.791429) Norm(-0.685441, 2e-06, -0.728129) UV(0.850098, 0.536167) +V 3208: Pos(0.208891, 1.137733, -11.791429) Norm(-0.662071, 0.177409, -0.72814) UV(0.849694, 0.533097) +V 3209: Pos(0.152919, 1.040787, -11.791429) Norm(-0.484639, 0.484678, -0.728157) UV(0.846624, 0.52778) +V 3210: Pos(0.055972, 0.984815, -11.791429) Norm(-0.177387, 0.662077, -0.72814) UV(0.841308, 0.524711) +V 3211: Pos(0.152248, 0.62551, -10.228309) Norm(0.173159, -0.966951, 0.187143) UV(0.953062, 0.91057) +V 3212: Pos(0.415949, 0.777757, -9.90133) Norm(0.447969, -0.865311, 0.224858) UV(0.9386, 0.930351) +V 3213: Pos(0.75615, 1.609655, -12.305865) Norm(0.423796, 0.604704, -0.674337) UV(0.361714, 0.933083) +V 3214: Pos(1.054109, 0.899586, -9.639683) Norm(0.661533, -0.732186, 0.162104) UV(0.624694, 0.832443) +V 3215: Pos(0.509431, 0.899586, -9.639683) Norm(0.068104, -0.951392, 0.300359) UV(0.624694, 0.862313) +V 3216: Pos(1.054109, 1.609655, -11.686933) Norm(0.7322, 0.66028, -0.167073) UV(0.53588, 0.020881) +V 3217: Pos(0.75615, 1.609655, -12.305865) Norm(0.423796, 0.604704, -0.674337) UV(0.914202, 0.429868) +V 3218: Pos(0.415949, 1.609655, -12.305865) Norm(0.41022, 0.734466, -0.540629) UV(0.895545, 0.429868) +V 3219: Pos(0.055972, 2.724349, -11.791429) Norm(-0.177401, -0.66207, -0.728143) UV(0.937084, 0.400522) +V 3220: Pos(0.152919, 2.668377, -11.791429) Norm(-0.484744, -0.484645, -0.728109) UV(0.931767, 0.403592) +V 3221: Pos(0.187286, 2.623588, -11.791429) Norm(-0.593608, -0.342716, -0.728132) UV(0.929882, 0.406048) +V 3222: Pos(0.208891, 2.571431, -11.791429) Norm(-0.662071, -0.177406, -0.728141) UV(0.928697, 0.408909) +V 3223: Pos(0.208891, 2.459486, -11.791429) Norm(-0.662081, 0.17741, -0.728131) UV(0.928697, 0.415048) +V 3224: Pos(0.10813, 2.328172, -11.791429) Norm(-0.342721, 0.59362, -0.728119) UV(0.934223, 0.422249) +V 3225: Pos(0.187286, 2.407329, -11.791429) Norm(-0.593596, 0.342717, -0.728141) UV(0.929882, 0.417908) +V 3226: Pos(0.152919, 2.36254, -11.791429) Norm(-0.48464, 0.484678, -0.728156) UV(0.931767, 0.420365) +V 3227: Pos(0.055972, 2.306568, -11.791429) Norm(-0.177373, 0.662075, -0.728146) UV(0.937084, 0.423434) +V 3228: Pos(1.054109, 1.609655, -10.837623) Norm(0.904538, 0.301505, -0.301505) UV(0.880649, 0.80246) +V 3229: Pos(-0.70962, 1.113433, 7.081139) Norm(0.720567, 0.416018, 0.554718) UV(0.06118, 0.003653) +V 3230: Pos(-0.743885, 1.113433, 7.081139) Norm(-0.720578, 0.416018, 0.554704) UV(0.059409, 0.002631) +V 3231: Pos(-0.726752, 1.083758, 7.081139) Norm(1.3e-05, -0.832055, 0.554693) UV(0.06118, 0.001609) +V 3232: Pos(-0.743885, 1.09365, 7.081139) Norm(-0.720579, -0.416024, 0.554698) UV(0.191333, 0.426249) +V 3233: Pos(-1.539098, 1.512616, 5.118781) Norm(0.72058, 0.416027, 0.554694) UV(0.559513, 0.001608) +V 3234: Pos(-1.556231, 1.522508, 5.118781) Norm(0.0, 0.832054, 0.554695) UV(0.560103, 0.00263) +V 3235: Pos(-1.573364, 1.512616, 5.118781) Norm(-0.720567, 0.416024, 0.554714) UV(0.559513, 0.003652) +V 3236: Pos(-1.573364, 1.492833, 5.118781) Norm(-0.720575, -0.416023, 0.554704) UV(0.221796, 0.507613) +V 3237: Pos(-0.962237, 1.493793, 7.468777) Norm(0.720581, 0.416026, 0.554694) UV(0.464595, 0.001608) +V 3238: Pos(-0.97937, 1.503685, 7.468777) Norm(-2e-06, 0.832054, 0.554695) UV(0.465186, 0.00263) +V 3239: Pos(-0.996503, 1.493793, 7.468777) Norm(-0.720578, 0.416019, 0.554704) UV(0.464595, 0.003652) +V 3240: Pos(-0.996503, 1.493793, 7.468777) Norm(-0.720578, 0.416019, 0.554704) UV(0.989227, 0.001604) +V 3241: Pos(-2.416991, 2.000594, -8.424918) Norm(-2e-06, -0.832057, -0.55469) UV(0.940841, 0.505226) +V 3242: Pos(-2.399859, 2.010486, -8.424918) Norm(0.720582, -0.416018, -0.554698) UV(0.631837, 0.003652) +V 3243: Pos(-2.416991, 2.000594, -8.424918) Norm(-2e-06, -0.832057, -0.55469) UV(0.631247, 0.00263) +V 3244: Pos(-2.434124, 2.010486, -8.424918) Norm(-0.720582, -0.416012, -0.554703) UV(0.631837, 0.001608) +V 3245: Pos(-2.911957, 1.512616, 1.017396) Norm(0.720586, 0.416018, 0.554693) UV(0.731297, 0.0016) +V 3246: Pos(-2.92909, 1.522508, 1.017396) Norm(1.2e-05, 0.832054, 0.554694) UV(0.731897, 0.002616) +V 3247: Pos(-2.946223, 1.512616, 1.017396) Norm(-0.720579, 0.416021, 0.554701) UV(0.731316, 0.003644) +V 3248: Pos(-2.946223, 1.492833, 1.017396) Norm(-0.720578, -0.416022, 0.554701) UV(0.190037, 0.049368) +V 3249: Pos(-1.324176, 2.41503, -14.586768) Norm(-2.2e-05, 0.832048, -0.554703) UV(0.99629, 0.190473) +V 3250: Pos(-1.307043, 2.385355, -14.586768) Norm(0.720548, -0.416054, -0.554716) UV(0.446642, 0.003646) +V 3251: Pos(-1.341309, 2.385355, -14.586768) Norm(-0.720574, -0.416036, -0.554696) UV(0.446642, 0.001602) +V 3252: Pos(-1.341309, 2.405139, -14.586768) Norm(-0.720573, 0.41604, -0.554693) UV(0.447822, 0.001602) +V 3253: Pos(-2.77005, 0.484785, -12.878369) Norm(0.720581, -0.416026, -0.554694) UV(0.636767, 0.00263) +V 3254: Pos(-2.787183, 0.474893, -12.878369) Norm(-6e-06, -0.832054, -0.554695) UV(0.637357, 0.001608) +V 3255: Pos(-2.804316, 0.484785, -12.878369) Norm(-0.720579, -0.416016, -0.554704) UV(0.638537, 0.001608) +V 3256: Pos(-2.804316, 0.484785, -12.878369) Norm(-0.720579, -0.416016, -0.554704) UV(0.797299, 0.12195) +V 3257: Pos(0.743885, 1.09365, 5.759356) Norm(0.866029, -0.499993, 0.0) UV(0.270183, 0.419168) +V 3258: Pos(0.70962, 1.113433, 7.081139) Norm(-0.720579, 0.416011, 0.554708) UV(0.06118, 0.003653) +V 3259: Pos(0.726752, 1.083758, 7.081139) Norm(-1.3e-05, -0.832055, 0.554693) UV(0.06118, 0.001609) +V 3260: Pos(0.743885, 1.113433, 7.081139) Norm(0.720566, 0.416025, 0.554713) UV(0.059409, 0.002631) +V 3261: Pos(1.573364, 1.492833, 3.796997) Norm(0.86603, -0.499992, 0.0) UV(0.300645, 0.500532) +V 3262: Pos(1.539098, 1.512616, 5.118781) Norm(-0.720577, 0.416029, 0.554696) UV(0.559513, 0.001608) +V 3263: Pos(1.539098, 1.492833, 5.118781) Norm(-0.72058, -0.416018, 0.554701) UV(0.558333, 0.001608) +V 3264: Pos(1.556231, 1.482941, 5.118781) Norm(-2e-06, -0.832052, 0.554698) UV(0.557743, 0.00263) +V 3265: Pos(0.962237, 1.493793, 7.468777) Norm(-0.720575, 0.416022, 0.554704) UV(0.464595, 0.001608) +V 3266: Pos(0.97937, 1.464118, 7.468777) Norm(-1e-06, -0.832052, 0.554698) UV(0.462825, 0.00263) +V 3267: Pos(0.996503, 1.493793, 7.468777) Norm(0.720577, 0.416019, 0.554704) UV(0.464595, 0.003652) +V 3268: Pos(0.996503, 1.493793, 5.750953) Norm(0.866027, 0.499997, 0.0) UV(0.996308, 0.104079) +V 3269: Pos(2.399859, 2.010486, -8.424916) Norm(-0.720579, -0.416011, -0.554708) UV(0.631837, 0.003652) +V 3270: Pos(2.416991, 2.040161, -8.424916) Norm(-1.8e-05, 0.832055, -0.554693) UV(0.633607, 0.00263) +V 3271: Pos(2.434124, 2.030269, -8.424916) Norm(0.720576, 0.416026, -0.5547) UV(0.633017, 0.001608) +V 3272: Pos(2.416991, 2.000594, -7.448886) Norm(-2.1e-05, -1.0, 0.0) UV(0.93376, 0.447002) +V 3273: Pos(2.946223, 1.492833, 0.309161) Norm(0.866031, -0.49999, 0.0) UV(0.232287, 0.042287) +V 3274: Pos(2.911957, 1.512616, 1.017397) Norm(-0.720582, 0.416025, 0.554693) UV(0.731297, 0.0016) +V 3275: Pos(2.911957, 1.492833, 1.017397) Norm(-0.720578, -0.416023, 0.5547) UV(0.730117, 0.00161) +V 3276: Pos(2.92909, 1.482941, 1.017397) Norm(4e-06, -0.832052, 0.554697) UV(0.729537, 0.002638) +V 3277: Pos(1.324176, 2.41503, -13.215549) Norm(3e-06, 1.0, 0.0) UV(0.989209, 0.108675) +V 3278: Pos(1.307043, 2.385355, -14.586766) Norm(-0.720589, -0.416035, -0.554677) UV(0.446642, 0.003646) +V 3279: Pos(1.307043, 2.405139, -14.586766) Norm(-0.720576, 0.416037, -0.554693) UV(0.447822, 0.003646) +V 3280: Pos(1.324176, 2.41503, -14.586766) Norm(-3e-06, 0.832042, -0.554713) UV(0.448412, 0.002624) +V 3281: Pos(2.77005, 0.484785, -12.878367) Norm(-0.720581, -0.416027, -0.554694) UV(0.636767, 0.00263) +V 3282: Pos(2.77005, 0.504568, -12.878367) Norm(-0.720581, 0.416016, -0.554701) UV(0.637357, 0.003652) +V 3283: Pos(2.787183, 0.51446, -12.878367) Norm(5e-06, 0.832055, -0.554692) UV(0.638537, 0.003652) +V 3284: Pos(2.804315, 0.484785, -11.50715) Norm(0.866032, -0.499988, 0.0) UV(0.790218, 0.040152) +V 3285: Pos(-0.690464, 1.873536, 5.996023) Norm(-0.92019, 1e-06, 0.391473) UV(0.764699, 0.757027) +V 3286: Pos(-0.668815, 1.167843, 5.966711) Norm(-0.812903, -0.4216, 0.4018) UV(0.605661, 0.740363) +V 3287: Pos(-0.367974, 1.254185, 6.519545) Norm(0.0, -0.423589, 0.905854) UV(0.628061, 0.023322) +V 3288: Pos(-0.688516, 2.222282, 5.61433) Norm(-0.918394, 0.3938, 0.038399) UV(0.972321, 0.73254) +V 3289: Pos(-0.688625, 2.410098, 3.617614) Norm(-0.919987, 0.390101, 0.038008) UV(0.103382, 0.941653) +V 3290: Pos(-0.362453, 2.868172, 4.647927) Norm(0.001336, 0.994801, 0.101826) UV(0.764791, 0.93335) +V 3291: Pos(0.373902, 2.626866, 6.201366) Norm(0.0, 0.428661, 0.903465) UV(0.755338, 0.160063) +V 3292: Pos(0.690464, 1.873536, 5.996023) Norm(0.92019, 1e-06, 0.391473) UV(0.764699, 0.757027) +V 3293: Pos(0.668815, 1.167843, 5.966711) Norm(0.818478, -0.414976, 0.397352) UV(0.605661, 0.740363) +V 3294: Pos(0.483108, 2.771514, 4.894848) Norm(0.918427, 0.393719, 0.038444) UV(0.941733, 0.687094) +V 3295: Pos(0.482499, 2.807589, 4.529206) Norm(0.919968, 0.390141, 0.038067) UV(0.154618, 0.972768) +V 3296: Pos(0.361021, 2.846327, 4.85909) Norm(-0.007183, 0.993962, 0.109491) UV(0.948287, 0.147931) +V 3297: Pos(-0.488272, 1.885951, 6.58776) Norm(-0.516293, 0.172885, 0.83878) UV(0.403868, 0.933081) +V 3298: Pos(-0.737986, 2.052176, 5.965617) Norm(-0.557046, 0.735082, 0.386464) UV(0.942083, 0.868139) +V 3299: Pos(-0.175157, 0.517274, 6.211589) Norm(0.378368, -0.088955, 0.921371) UV(0.974853, 0.188405) +V 3300: Pos(-0.531027, 0.554498, 5.715254) Norm(-0.649304, -0.216804, 0.728972) UV(0.877413, 0.305792) +V 3301: Pos(-0.524981, 2.789467, 4.896599) Norm(-0.935697, 0.233318, 0.264637) UV(0.756641, 0.272482) +V 3302: Pos(-0.503636, 1.215853, 6.464633) Norm(-0.778282, -0.588729, 0.218347) UV(0.442602, 0.185762) +V 3303: Pos(-0.730261, 2.281237, 5.179009) Norm(-0.522648, 0.770092, 0.365783) UV(0.875692, 0.34809) +V 3304: Pos(-0.73039, 2.240236, 5.616081) Norm(-0.518232, 0.829944, -0.206466) UV(0.750613, 0.207175) +V 3305: Pos(-0.308144, 0.5261, 6.130371) Norm(-0.985357, 0.036307, 0.166592) UV(0.365833, 0.187787) +V 3306: Pos(-0.730492, 2.365248, 4.285747) Norm(-0.853926, 0.451532, 0.258706) UV(0.998041, 0.357932) +V 3307: Pos(-0.524819, 2.679379, 6.009874) Norm(-0.934391, 0.287809, -0.209953) UV(0.753969, 0.275695) +V 3308: Pos(-0.373902, 3.00195, 3.610722) Norm(0.250258, 0.912142, 0.324604) UV(0.173854, 0.187399) +V 3309: Pos(-0.549769, 2.748773, 4.712708) Norm(-0.998414, 0.052889, -0.019295) UV(0.528712, 0.031587) +V 3310: Pos(-0.373902, 2.898925, 4.653236) Norm(0.258475, 0.957766, -0.125997) UV(0.972772, 0.074523) +V 3311: Pos(-0.730492, 2.301805, 4.961122) Norm(-0.830655, 0.521959, -0.193834) UV(0.859273, 0.25748) +V 3312: Pos(-0.732419, 1.873536, 6.013872) Norm(-0.74254, -0.296215, 0.600743) UV(0.987828, 0.448509) +V 3313: Pos(-0.522809, 1.807884, 6.506578) Norm(-0.952615, -0.302268, 0.034051) UV(0.041809, 0.038013) +V 3314: Pos(-0.732419, 1.340286, 6.013872) Norm(-0.738224, 0.297332, 0.605491) UV(0.994444, 0.546651) +V 3315: Pos(-0.373902, 1.989284, 6.544742) Norm(0.310901, 0.642501, 0.700381) UV(0.997527, 0.403662) +V 3316: Pos(-0.522809, 1.395656, 6.506578) Norm(-0.952296, 0.302448, 0.040707) UV(0.273396, 0.421828) +V 3317: Pos(-0.730571, 2.427881, 3.619344) Norm(-0.693203, 0.622572, 0.363144) UV(0.306526, 0.531435) +V 3318: Pos(-0.52461, 2.915529, 3.619351) Norm(-0.948615, 0.077939, 0.306685) UV(0.371167, 0.20931) +V 3319: Pos(-0.373902, 2.643597, 6.234294) Norm(0.292506, 0.094913, 0.951542) UV(0.19004, 0.055156) +V 3320: Pos(-0.373902, 1.253412, 6.555117) Norm(0.175232, -0.586814, 0.790533) UV(0.623425, 0.038308) +V 3321: Pos(-0.730725, 2.388055, 4.044015) Norm(-0.505329, 0.843833, -0.180523) UV(0.560156, 0.162729) +V 3322: Pos(-0.516177, 1.983721, 6.46039) Norm(-0.920725, 0.361663, 0.146512) UV(0.501867, 0.171438) +V 3323: Pos(-0.524446, 2.825373, 4.530937) Norm(-0.932608, 0.308597, -0.18711) UV(0.374382, 0.211982) +V 3324: Pos(-0.526831, 2.598067, 6.171548) Norm(-0.957752, -0.129977, 0.25655) UV(0.417662, 0.211977) +V 3325: Pos(-0.373902, 2.759371, 6.065393) Norm(0.257772, 0.959635, -0.112493) UV(0.243921, 0.212129) +V 3326: Pos(-0.373902, 2.878195, 4.863008) Norm(0.259608, 0.917271, 0.302023) UV(0.429954, 0.110618) +V 3327: Pos(-0.733206, 2.158842, 5.772384) Norm(-0.754799, 0.321078, 0.572003) UV(0.641852, 0.089684) +V 3328: Pos(-0.710827, 1.167881, 5.971722) Norm(-0.554431, -0.616967, 0.558533) UV(0.771185, 0.145623) +V 3329: Pos(-0.56821, 0.456401, 5.572929) Norm(-0.53404, -0.799561, 0.274779) UV(0.936467, 0.854909) +V 3330: Pos(0.766956, 1.973238, 5.93269) Norm(0.923523, 0.186719, 0.335023) UV(0.938224, 0.864658) +V 3331: Pos(0.367974, 1.254185, 6.519545) Norm(-0.796609, -0.581383, 0.165551) UV(0.972873, 0.140483) +V 3332: Pos(0.668815, 1.167843, 5.966711) Norm(-0.219663, -0.779614, 0.586473) UV(0.874825, 0.266353) +V 3333: Pos(0.482945, 2.661426, 6.008123) Norm(0.185635, -0.343185, -0.920741) UV(0.75398, 0.207175) +V 3334: Pos(0.165463, 0.519704, 6.176092) Norm(-0.477029, 0.863803, 0.162137) UV(0.272438, 0.019827) +V 3335: Pos(0.267407, 0.533866, 6.113513) Norm(0.333314, 0.83997, -0.428196) UV(0.395817, 0.188303) +V 3336: Pos(0.483108, 2.771514, 4.894848) Norm(0.19071, -0.525614, 0.829072) UV(0.873031, 0.312099) +V 3337: Pos(0.660669, 2.139582, 5.750485) Norm(-0.272317, 0.125021, 0.954051) UV(0.458089, 0.1739) +V 3338: Pos(0.688387, 2.263284, 5.177258) Norm(-0.346989, 0.755064, 0.556307) UV(0.724982, 0.209836) +V 3339: Pos(0.489382, 0.562264, 5.698396) Norm(-0.075163, 0.64153, 0.763407) UV(0.36323, 0.160483) +V 3340: Pos(0.50786, 2.730895, 4.711029) Norm(0.392854, -0.906271, -0.156008) UV(0.995379, 0.322807) +V 3341: Pos(0.688516, 2.222282, 5.61433) Norm(-0.349045, 0.852119, -0.38995) UV(0.756631, 0.312155) +V 3342: Pos(0.688583, 2.283926, 4.959442) Norm(-0.190281, 0.524079, -0.830141) UV(0.531374, 0.063247) +V 3343: Pos(0.366853, 2.973998, 3.610639) Norm(-0.63526, 0.202765, 0.745205) UV(0.974448, 0.135522) +V 3344: Pos(0.688583, 2.347369, 4.284067) Norm(-0.165511, 0.29966, 0.93958) UV(0.856612, 0.217881) +V 3345: Pos(0.480854, 1.807884, 6.488729) Norm(0.293171, -0.662681, -0.689133) UV(0.985167, 0.417018) +V 3346: Pos(0.362453, 2.868172, 4.647927) Norm(-0.613273, 0.304805, -0.728691) UV(0.056176, 0.022767) +V 3347: Pos(0.480854, 1.395656, 6.488729) Norm(0.290709, 0.669758, -0.683309) UV(0.04447, 0.062077) +V 3348: Pos(0.690464, 1.873536, 5.996023) Norm(-0.25943, -0.748904, 0.609786) UV(0.991782, 0.515522) +V 3349: Pos(0.373902, 2.626866, 6.201366) Norm(-0.713117, -0.624996, 0.317559) UV(0.995371, 0.361443) +V 3350: Pos(0.690464, 1.340286, 5.996024) Norm(-0.262186, 0.742582, 0.616304) UV(0.304819, 0.419166) +V 3351: Pos(0.482663, 2.897745, 3.617621) Norm(0.264614, -0.689709, 0.674004) UV(0.303865, 0.500537) +V 3352: Pos(0.373902, 1.972552, 6.511814) Norm(-0.700928, 0.635849, -0.323104) UV(0.809392, 0.106939) +V 3353: Pos(0.482499, 2.807589, 4.529206) Norm(0.165042, -0.297767, -0.940264) UV(0.317691, 0.211972) +V 3354: Pos(0.688625, 2.410098, 3.617614) Norm(-0.28957, 0.611385, 0.736449) UV(0.58506, 0.160067) +V 3355: Pos(0.354818, 2.715312, 6.06142) Norm(-0.56604, 0.316398, -0.761243) UV(0.598743, 0.027553) +V 3356: Pos(0.688778, 2.370271, 4.042285) Norm(-0.355133, 0.870727, -0.340169) UV(0.414438, 0.20932) +V 3357: Pos(0.474337, 1.974987, 6.444519) Norm(0.236918, 0.607097, -0.758488) UV(0.457401, 0.209318) +V 3358: Pos(0.361021, 2.846327, 4.85909) Norm(-0.574436, 0.161892, 0.802381) UV(0.314471, 0.209317) +V 3359: Pos(0.484991, 2.589333, 6.155677) Norm(0.278529, -0.958271, -0.064335) UV(0.64451, 0.126223) +V 3360: Pos(0.461775, 1.222826, 6.447432) Norm(0.318449, -0.523786, -0.790087) UV(0.802583, 0.142951) +V 3361: Pos(-0.894965, 2.62882, 0.031415) Norm(0.278944, 0.960307, 0.0) UV(0.902912, 0.764133) +V 3362: Pos(-3.478066, 2.077005, 0.031415) Norm(-0.822576, 0.568655, 0.0) UV(0.981949, 0.393472) +V 3363: Pos(-2.209737, 0.674862, 0.337873) Norm(-0.380889, -0.822074, 0.423224) UV(0.949887, 0.681676) +V 3364: Pos(-0.648541, 0.674862, 0.630966) Norm(0.577331, -0.57736, 0.57736) UV(0.615291, 0.887897) +V 3365: Pos(-2.209737, 0.674862, 0.337873) Norm(-0.380889, -0.822074, 0.423224) UV(0.522594, 0.870495) +V 3366: Pos(-0.894965, 2.62882, 0.630966) Norm(0.212132, 0.730274, 0.649384) UV(0.975047, 0.796041) +V 3367: Pos(-3.478066, 1.153763, 0.337888) Norm(-0.658819, -0.45545, 0.598768) UV(0.739573, 0.655168) +V 3368: Pos(-3.478066, 2.077005, 0.337888) Norm(-0.658808, 0.455472, 0.598763) UV(0.899998, 0.693933) +V 3369: Pos(-2.209737, 2.555906, 0.337873) Norm(-0.553102, 0.723718, 0.412687) UV(0.006299, 0.905249) +V 3370: Pos(-0.648541, 2.472465, 0.630966) Norm(0.317375, 0.500201, 0.80565) UV(0.750189, 0.446868) +V 3371: Pos(-0.894965, 2.62882, 0.630966) Norm(0.212132, 0.730274, 0.649384) UV(0.740905, 0.432236) +V 3372: Pos(-2.016632, 2.62882, 0.630966) Norm(-0.394535, 0.623438, 0.675031) UV(0.740905, 0.365637) +V 3373: Pos(-0.648541, 0.924291, 0.630966) Norm(0.447219, 0.0, 0.894425) UV(0.740903, 0.322808) +V 3374: Pos(-2.016632, 2.62882, -7.759468) Norm(-0.394535, 0.623438, -0.675031) UV(0.50353, 0.927995) +V 3375: Pos(-3.478066, 1.153763, -7.46639) Norm(-0.658818, -0.45545, -0.598768) UV(0.982619, 0.388329) +V 3376: Pos(-3.478066, 1.153763, -7.159917) Norm(-0.822559, -0.568679, 0.0) UV(0.652925, 0.569058) +V 3377: Pos(-2.209737, 0.674862, -7.466375) Norm(-0.380889, -0.822074, -0.423224) UV(0.711196, 0.884902) +V 3378: Pos(-0.648541, 0.674862, -7.759468) Norm(0.577332, -0.57736, -0.57736) UV(0.6185, 0.902305) +V 3379: Pos(-0.648541, 2.472465, -7.159917) Norm(0.535753, 0.844375, 0.0) UV(0.995134, 0.836726) +V 3380: Pos(-2.209737, 2.555906, -7.466375) Norm(-0.553103, 0.723718, -0.412686) UV(0.62062, 0.719311) +V 3381: Pos(-2.016632, 0.674862, -7.759468) Norm(-0.374212, -0.614324, -0.694674) UV(0.237588, 0.905251) +V 3382: Pos(-0.648541, 2.472465, -7.759468) Norm(0.317375, 0.500202, -0.80565) UV(0.731378, 0.019457) +V 3383: Pos(-0.648541, 0.674862, -7.759468) Norm(0.577332, -0.57736, -0.57736) UV(0.731378, 0.126191) +V 3384: Pos(-2.016632, 0.674862, -7.759468) Norm(-0.374212, -0.614324, -0.694674) UV(0.650147, 0.126191) +V 3385: Pos(-0.648541, 0.674862, -7.159917) Norm(0.707123, -0.707091, 0.0) UV(0.799956, 0.016414) +V 3386: Pos(2.016632, 2.62882, 0.630966) Norm(0.394535, 0.623438, 0.675031) UV(0.938511, 0.697534) +V 3387: Pos(3.478066, 1.153763, 0.337888) Norm(0.658819, -0.45545, 0.598768) UV(0.963752, 0.448289) +V 3388: Pos(3.478066, 1.153763, 0.031415) Norm(0.82256, -0.568679, 0.0) UV(0.968083, 0.601179) +V 3389: Pos(2.209737, 0.674862, 0.337873) Norm(0.380889, -0.822074, 0.423224) UV(0.522594, 0.870495) +V 3390: Pos(0.648541, 0.674862, 0.630966) Norm(-0.577331, -0.57736, 0.57736) UV(0.615291, 0.887897) +V 3391: Pos(0.648541, 2.472465, 0.031415) Norm(-0.535752, 0.844375, 0.0) UV(0.992376, 0.831639) +V 3392: Pos(2.209737, 2.555906, 0.337873) Norm(0.553102, 0.723718, 0.412687) UV(0.664266, 0.571916) +V 3393: Pos(2.016632, 0.674862, 0.630966) Norm(0.374212, -0.614324, 0.694674) UV(0.117986, 0.926089) +V 3394: Pos(0.648541, 2.472465, 0.630966) Norm(-0.317375, 0.500201, 0.80565) UV(0.750189, 0.446868) +V 3395: Pos(0.648541, 0.674862, 0.630966) Norm(-0.577331, -0.57736, 0.57736) UV(0.856923, 0.446868) +V 3396: Pos(2.016632, 0.674862, 0.630966) Norm(0.374212, -0.614324, 0.694674) UV(0.856923, 0.365637) +V 3397: Pos(0.648541, 0.674862, 0.021751) Norm(-0.708517, -0.705694, 0.0) UV(0.755713, 0.35898) +V 3398: Pos(0.894965, 2.62882, -7.159917) Norm(-0.278944, 0.960307, 0.0) UV(0.570129, 0.892396) +V 3399: Pos(3.478066, 2.077005, -7.159917) Norm(0.822576, 0.568655, -0.0) UV(0.964422, 0.333511) +V 3400: Pos(2.209737, 0.674862, -7.466375) Norm(0.380889, -0.822074, -0.423224) UV(0.572428, 0.587254) +V 3401: Pos(0.648541, 0.674862, -7.759468) Norm(-0.577332, -0.57736, -0.57736) UV(0.6185, 0.902305) +V 3402: Pos(2.209737, 0.674862, -7.466375) Norm(0.380889, -0.822074, -0.423224) UV(0.711196, 0.884902) +V 3403: Pos(0.894965, 2.62882, -7.759468) Norm(-0.212132, 0.730274, -0.649384) UV(0.977806, 0.872325) +V 3404: Pos(3.478066, 1.153763, -7.46639) Norm(0.658818, -0.45545, -0.598768) UV(0.537367, 0.644004) +V 3405: Pos(3.478066, 2.077005, -7.46639) Norm(0.658808, 0.455472, -0.598763) UV(0.915059, 0.774623) +V 3406: Pos(2.209737, 2.555906, -7.466375) Norm(0.553103, 0.723718, -0.412686) UV(0.1259, 0.926091) +V 3407: Pos(0.648541, 2.472465, -7.759468) Norm(-0.317376, 0.500201, -0.805649) UV(0.731378, 0.019457) +V 3408: Pos(0.894965, 2.62882, -7.759468) Norm(-0.212132, 0.730274, -0.649384) UV(0.716746, 0.010174) +V 3409: Pos(2.016632, 2.62882, -7.759468) Norm(0.394535, 0.623438, -0.675031) UV(0.650147, 0.010174) +V 3410: Pos(0.648541, 0.924291, -7.759468) Norm(-0.447219, 0.0, -0.894425) UV(0.764358, 0.001604) +V 3411: Pos(-0.766956, 2.351064, 3.526832) Norm(-0.186499, 0.9763, 0.109799) UV(0.633336, 0.806749) +V 3412: Pos(-0.766956, 1.973238, 5.93269) Norm(-0.524702, 0.370777, 0.766298) UV(0.936387, 0.290904) +V 3413: Pos(-1.238971, 1.328909, 5.635668) Norm(-0.814732, -0.183705, 0.549968) UV(0.960328, 0.33999) +V 3414: Pos(-1.277092, 2.040021, 5.425371) Norm(-0.743093, 0.616852, 0.259435) UV(0.857947, 0.749625) +V 3415: Pos(-1.491366, 1.328909, 3.882873) Norm(-0.982878, -0.121134, 0.138842) UV(0.73459, 0.033782) +V 3416: Pos(-1.289676, 0.534161, 3.883919) Norm(-0.572492, -0.818409, 0.049588) UV(0.734401, 0.583717) +V 3417: Pos(-1.491366, 2.2121, 3.8828) Norm(-0.688499, 0.707801, 0.158074) UV(0.803664, 0.001601) +V 3418: Pos(1.277092, 2.040021, 5.425371) Norm(0.743098, 0.616841, 0.259446) UV(0.519111, 0.838111) +V 3419: Pos(1.238971, 1.328909, 5.635668) Norm(0.814737, -0.183693, 0.549964) UV(0.969577, 0.329251) +V 3420: Pos(0.565265, 0.456129, 5.572916) Norm(0.236135, -0.926685, 0.292397) UV(0.922485, 0.393731) +V 3421: Pos(0.766956, 1.973238, 5.93269) Norm(0.524701, 0.370777, 0.766298) UV(0.876918, 0.78823) +V 3422: Pos(1.091858, 0.472849, 5.211225) Norm(0.58559, -0.764426, 0.269698) UV(0.786993, 0.115419) +V 3423: Pos(-0.537317, 0.53981, 3.784912) Norm(-0.478709, 0.040912, -0.87702) UV(0.983406, 0.277879) +V 3424: Pos(-0.81128, 0.288932, 4.198792) Norm(-0.730054, -0.638018, -0.244857) UV(0.625546, 0.104443) +V 3425: Pos(0.537317, 0.308742, 3.774133) Norm(0.377991, -0.580598, -0.72113) UV(0.834077, 0.571203) +V 3426: Pos(-3.42803, 2.042413, -3.613593) Norm(-0.417925, 0.290952, 0.860631) UV(0.992163, 0.413115) +V 3427: Pos(-0.702016, 0.12525, -3.623408) Norm(0.48604, -0.254218, 0.836145) UV(0.723727, 0.130136) +V 3428: Pos(-0.702016, 2.443472, -3.623409) Norm(0.486128, 0.254246, 0.836085) UV(0.447009, 0.187796) +V 3429: Pos(-2.005711, -0.000245, -3.507491) Norm(-0.11733, -0.652348, -0.748783) UV(0.158491, 0.586082) +V 3430: Pos(-2.005712, -0.000245, -3.613668) Norm(-0.117261, -0.652246, 0.748882) UV(0.991773, 0.417028) +V 3431: Pos(-0.912111, 2.570458, -3.613669) Norm(0.18471, 0.608361, 0.771867) UV(0.459639, 0.016297) +V 3432: Pos(-3.42803, 2.042414, -3.507417) Norm(-0.417939, 0.290901, -0.860641) UV(0.097841, 0.425484) +V 3433: Pos(-0.911751, 2.570353, -3.50749) Norm(0.155608, 0.61375, -0.774013) UV(0.994108, 0.664181) +V 3434: Pos(-3.478066, 0.491716, -3.507417) Norm(-0.658828, -0.455449, -0.598758) UV(0.803995, 0.034414) +V 3435: Pos(-0.648541, 0.096257, 0.021751) Norm(0.705206, -0.379917, 0.598622) UV(0.311789, 0.464131) +V 3436: Pos(-0.648541, 2.472465, -3.623409) Norm(0.333336, 0.49838, 0.800315) UV(0.89741, 0.002246) +V 3437: Pos(-0.648541, 2.472465, 0.021751) Norm(0.535752, 0.844375, 0.0) UV(0.861754, 0.747739) +V 3438: Pos(-0.648541, 0.096257, -3.623408) Norm(0.699095, -0.377977, 0.606959) UV(0.525741, 0.393471) +V 3439: Pos(-0.894965, -0.060085, -3.613669) Norm(0.218986, -0.722692, 0.655561) UV(0.859438, 0.212952) +V 3440: Pos(-0.894965, -0.060085, 0.031453) Norm(0.217504, -0.724834, 0.653688) UV(0.880664, 0.427118) +V 3441: Pos(-0.894965, -0.060085, -7.162736) Norm(0.212117, -0.730277, -0.649386) UV(0.311794, 0.322807) +V 3442: Pos(-3.478066, 0.491716, 0.031415) Norm(-0.658814, -0.455465, 0.598763) UV(0.094625, 0.303535) +V 3443: Pos(-3.478066, 0.491716, -3.613593) Norm(-0.658792, -0.455482, 0.598773) UV(0.76037, 0.360699) +V 3444: Pos(-0.894965, -0.060085, -3.50749) Norm(0.205439, -0.73773, -0.643078) UV(0.308572, 0.496666) +V 3445: Pos(-2.016632, 2.62882, -7.162736) Norm(-0.179535, 0.983752, 0.0) UV(0.526348, 0.322808) +V 3446: Pos(-2.016632, 2.62882, -3.507491) Norm(-0.133478, 0.731313, -0.668853) UV(0.52253, 0.460264) +V 3447: Pos(-2.016632, 2.62882, 0.031377) Norm(-0.179541, 0.983751, 0.0) UV(0.308577, 0.415829) +V 3448: Pos(-2.016632, 2.62882, -3.613668) Norm(-0.133459, 0.731324, 0.668845) UV(0.750756, 0.308766) +V 3449: Pos(-3.478066, 0.491716, -3.613593) Norm(-0.658792, -0.455482, 0.598773) UV(0.63225, 0.128822) +V 3450: Pos(-3.478066, 0.491716, -7.162736) Norm(-0.658822, -0.455449, -0.598765) UV(0.448065, 0.597574) +V 3451: Pos(2.005711, 2.56898, -3.507491) Norm(0.117334, 0.652258, -0.748861) UV(0.98584, 0.3228) +V 3452: Pos(0.91175, -0.001618, -3.50749) Norm(-0.155613, -0.613741, -0.77402) UV(0.730045, 0.144995) +V 3453: Pos(3.42803, 0.526307, -3.507417) Norm(0.417943, -0.290899, -0.86064) UV(0.801067, 0.036661) +V 3454: Pos(0.91211, -0.001723, -3.613669) Norm(-0.184656, -0.608366, 0.771877) UV(0.223614, 0.579759) +V 3455: Pos(3.42803, 0.526307, -3.507417) Norm(0.417943, -0.290899, -0.86064) UV(0.998096, 0.507343) +V 3456: Pos(0.701674, 2.442851, -3.517228) Norm(-0.470603, 0.2845, -0.83522) UV(0.45332, 0.00188) +V 3457: Pos(3.428031, 0.526308, -3.613593) Norm(0.417915, -0.290957, 0.860634) UV(0.188123, 0.419161) +V 3458: Pos(2.005712, 2.56898, -3.613668) Norm(0.117298, 0.652254, 0.74887) UV(0.987785, 0.599037) +V 3459: Pos(3.428031, 0.526308, -3.613593) Norm(0.417915, -0.290957, 0.860634) UV(0.629219, 0.126951) +V 3460: Pos(0.894965, 2.62882, -7.162736) Norm(-0.278956, 0.960304, 0.0) UV(0.880032, 0.213008) +V 3461: Pos(0.894965, 2.62882, -3.50749) Norm(-0.205447, 0.737706, -0.643102) UV(0.879133, 0.537578) +V 3462: Pos(0.648541, 0.096257, -7.162736) Norm(-0.692286, -0.380657, -0.613058) UV(0.876817, 0.001609) +V 3463: Pos(0.648541, 0.096257, -3.517228) Norm(-0.685212, -0.383413, -0.619257) UV(0.898042, 0.215799) +V 3464: Pos(2.016632, -0.060085, -3.613668) Norm(0.133449, -0.731328, 0.668843) UV(0.523136, 0.389601) +V 3465: Pos(2.016632, -0.060085, -3.507491) Norm(0.13348, -0.731309, -0.668857) UV(0.001602, 0.514272) +V 3466: Pos(2.016632, -0.060085, -7.162736) Norm(0.133469, -0.731316, -0.668852) UV(0.853394, 0.149353) +V 3467: Pos(2.016632, -0.060085, 0.031377) Norm(0.132229, -0.730136, 0.670385) UV(0.097837, 0.429873) +V 3468: Pos(0.894965, 2.62882, -3.613669) Norm(-0.218992, 0.722724, 0.655525) UV(0.73769, 0.389601) +V 3469: Pos(0.894965, 2.62882, 0.031453) Norm(-0.275973, 0.961165, 0.0) UV(0.311791, 0.39347) +V 3470: Pos(3.478066, 2.077005, -3.507417) Norm(0.658821, 0.455464, -0.598755) UV(0.097847, 0.322805) +V 3471: Pos(3.478066, 2.077005, -7.162736) Norm(0.822561, 0.568676, 0.0) UV(0.539414, 0.215742) +V 3472: Pos(3.478066, 2.077005, 0.031415) Norm(0.822582, 0.568647, 0.0) UV(0.325469, 0.215735) +V 3473: Pos(3.478066, 2.077005, -3.613593) Norm(0.658819, 0.455453, 0.598766) UV(0.322251, 0.310142) +V 3474: Pos(3.478066, 1.153763, 0.031415) Norm(0.933203, 0.0, 0.359351) UV(0.278658, 0.58018) +V 3475: Pos(0.701674, 0.125872, -3.517228) Norm(-0.470512, -0.284475, -0.83528) UV(0.585019, 0.181473) +V 3476: Pos(-1.111483, 0.924291, 0.703231) Norm(0.577354, -0.577354, -0.577342) UV(0.260271, 0.001602) +V 3477: Pos(-1.111483, 0.924291, 1.880578) Norm(0.577367, -0.577327, 0.577357) UV(0.551376, 0.012315) +V 3478: Pos(-1.491366, 1.164531, 1.880578) Norm(-0.577351, 0.577365, 0.577335) UV(0.190038, 0.038595) +V 3479: Pos(-1.491366, 1.164531, 0.703231) Norm(-0.577347, 0.577357, -0.577347) UV(0.277806, 0.001603) +V 3480: Pos(-1.491366, 1.164531, 0.703231) Norm(-0.577347, 0.577357, -0.577347) UV(0.038594, 0.071844) +V 3481: Pos(1.111483, 0.924291, 0.703231) Norm(-0.577354, -0.577354, -0.577342) UV(0.001601, 0.071844) +V 3482: Pos(1.111483, 0.985988, 0.703231) Norm(-0.577365, 0.57733, -0.577356) UV(0.267156, 0.024264) +V 3483: Pos(1.429669, 1.164531, 1.880578) Norm(-0.577347, 0.577357, 0.577347) UV(0.532395, 0.026646) +V 3484: Pos(-0.648762, 0.99271, -9.064156) Norm(0.599758, -0.569708, -0.561893) UV(0.646089, 0.910178) +V 3485: Pos(-1.10049, 1.170611, -9.095757) Norm(-0.49487, 0.577358, -0.649431) UV(0.760881, 0.011376) +V 3486: Pos(-0.648762, 0.99271, -9.064156) Norm(0.599758, -0.569708, -0.561893) UV(0.192995, 0.641607) +V 3487: Pos(-1.230799, 1.170611, -8.13096) Norm(-0.649439, 0.577349, 0.494871) UV(0.139566, 0.679546) +V 3488: Pos(-0.648541, 0.992955, -8.09058) Norm(0.553739, -0.587099, 0.590497) UV(0.10092, 0.284258) +V 3489: Pos(1.230799, 1.170611, -8.13096) Norm(0.649439, 0.577349, 0.494871) UV(0.699626, 0.947254) +V 3490: Pos(1.163538, 1.170611, -8.121875) Norm(-0.493406, 0.57574, 0.651977) UV(0.1107, 0.312649) +V 3491: Pos(0.648762, 1.060582, -9.064156) Norm(-0.588304, 0.591316, -0.551583) UV(0.73595, 0.005338) + +===Triangles (Indices): 2680 +Tri: 0 1 2 +Tri: 3 4 5 +Tri: 6 7 8 +Tri: 9 10 11 +Tri: 12 13 14 +Tri: 5 15 3 +Tri: 16 17 18 +Tri: 19 20 21 +Tri: 20 12 21 +Tri: 22 23 24 +Tri: 25 26 27 +Tri: 28 29 30 +Tri: 31 32 33 +Tri: 34 35 36 +Tri: 33 37 38 +Tri: 36 39 40 +Tri: 41 42 31 +Tri: 43 44 34 +Tri: 45 46 44 +Tri: 41 31 47 +Tri: 48 49 18 +Tri: 44 50 35 +Tri: 31 51 47 +Tri: 35 52 39 +Tri: 33 53 51 +Tri: 49 29 28 +Tri: 54 22 24 +Tri: 55 56 57 +Tri: 58 59 60 +Tri: 61 62 63 +Tri: 64 65 66 +Tri: 67 68 69 +Tri: 24 70 54 +Tri: 71 72 73 +Tri: 74 75 76 +Tri: 77 78 79 +Tri: 80 81 82 +Tri: 83 84 85 +Tri: 86 87 88 +Tri: 89 90 91 +Tri: 92 93 94 +Tri: 95 96 97 +Tri: 98 99 100 +Tri: 101 102 103 +Tri: 104 105 106 +Tri: 107 108 109 +Tri: 18 17 48 +Tri: 110 111 112 +Tri: 113 114 115 +Tri: 106 116 104 +Tri: 104 117 118 +Tri: 119 22 120 +Tri: 6 20 19 +Tri: 11 55 57 +Tri: 121 15 5 +Tri: 122 123 124 +Tri: 125 126 88 +Tri: 127 123 122 +Tri: 128 129 123 +Tri: 63 130 61 +Tri: 131 132 133 +Tri: 134 135 136 +Tri: 137 138 139 +Tri: 140 141 142 +Tri: 143 144 145 +Tri: 146 147 148 +Tri: 133 149 131 +Tri: 150 133 151 +Tri: 152 153 154 +Tri: 155 156 157 +Tri: 158 159 160 +Tri: 161 162 163 +Tri: 164 165 166 +Tri: 166 167 168 +Tri: 160 169 164 +Tri: 168 167 170 +Tri: 171 172 173 +Tri: 174 175 176 +Tri: 177 178 179 +Tri: 22 180 120 +Tri: 181 182 183 +Tri: 184 181 183 +Tri: 185 181 186 +Tri: 187 188 189 +Tri: 190 191 192 +Tri: 193 194 195 +Tri: 196 197 198 +Tri: 190 192 199 +Tri: 200 201 202 +Tri: 203 190 199 +Tri: 192 202 199 +Tri: 204 195 205 +Tri: 188 187 206 +Tri: 168 207 208 +Tri: 95 209 210 +Tri: 50 211 52 +Tri: 212 25 46 +Tri: 46 27 50 +Tri: 213 214 215 +Tri: 216 217 218 +Tri: 219 217 220 +Tri: 221 222 223 +Tri: 223 224 221 +Tri: 225 226 227 +Tri: 228 229 230 +Tri: 231 232 233 +Tri: 124 234 122 +Tri: 235 236 124 +Tri: 237 238 239 +Tri: 240 241 242 +Tri: 243 244 245 +Tri: 246 247 248 +Tri: 249 250 251 +Tri: 252 253 254 +Tri: 255 256 257 +Tri: 258 259 260 +Tri: 201 200 261 +Tri: 262 263 264 +Tri: 262 264 140 +Tri: 140 240 242 +Tri: 140 264 240 +Tri: 265 266 267 +Tri: 268 269 270 +Tri: 268 271 272 +Tri: 271 258 265 +Tri: 271 265 272 +Tri: 273 274 275 +Tri: 276 277 278 +Tri: 279 280 281 +Tri: 275 282 273 +Tri: 283 284 285 +Tri: 286 287 228 +Tri: 288 233 289 +Tri: 290 143 145 +Tri: 291 292 293 +Tri: 294 295 296 +Tri: 297 298 68 +Tri: 93 299 300 +Tri: 301 87 86 +Tri: 302 303 304 +Tri: 305 306 307 +Tri: 216 308 224 +Tri: 309 226 310 +Tri: 311 312 313 +Tri: 314 315 316 +Tri: 317 318 302 +Tri: 319 320 321 +Tri: 322 323 324 +Tri: 311 325 326 +Tri: 214 213 323 +Tri: 327 293 328 +Tri: 308 216 218 +Tri: 329 218 330 +Tri: 331 290 145 +Tri: 332 333 334 +Tri: 335 336 337 +Tri: 338 335 337 +Tri: 339 340 341 +Tri: 339 342 340 +Tri: 343 344 345 +Tri: 340 346 347 +Tri: 348 349 350 +Tri: 132 351 352 +Tri: 338 353 354 +Tri: 355 356 357 +Tri: 52 358 359 +Tri: 53 360 361 +Tri: 39 359 362 +Tri: 40 362 363 +Tri: 38 364 360 +Tri: 365 366 367 +Tri: 368 369 370 +Tri: 371 372 373 +Tri: 374 375 376 +Tri: 374 377 378 +Tri: 379 372 371 +Tri: 380 381 382 +Tri: 383 120 384 +Tri: 385 386 387 +Tri: 388 183 389 +Tri: 378 377 390 +Tri: 373 372 391 +Tri: 121 392 15 +Tri: 393 24 23 +Tri: 303 394 395 +Tri: 394 396 77 +Tri: 304 303 395 +Tri: 397 398 399 +Tri: 400 401 398 +Tri: 400 402 403 +Tri: 404 402 405 +Tri: 406 407 408 +Tri: 409 410 411 +Tri: 412 413 414 +Tri: 415 416 417 +Tri: 418 419 420 +Tri: 421 422 423 +Tri: 424 412 425 +Tri: 426 427 428 +Tri: 429 430 431 +Tri: 431 421 423 +Tri: 432 433 434 +Tri: 435 27 26 +Tri: 436 437 438 +Tri: 439 440 441 +Tri: 442 443 444 +Tri: 445 446 440 +Tri: 447 448 443 +Tri: 449 441 450 +Tri: 451 444 452 +Tri: 452 453 454 +Tri: 449 455 439 +Tri: 456 457 458 +Tri: 444 459 453 +Tri: 439 460 445 +Tri: 443 461 459 +Tri: 445 462 463 +Tri: 458 438 456 +Tri: 54 464 432 +Tri: 465 466 467 +Tri: 468 469 470 +Tri: 471 472 473 +Tri: 64 474 475 +Tri: 476 477 478 +Tri: 464 70 479 +Tri: 480 72 481 +Tri: 482 75 483 +Tri: 484 78 396 +Tri: 485 486 487 +Tri: 488 489 490 +Tri: 491 492 493 +Tri: 494 495 496 +Tri: 497 498 499 +Tri: 95 500 501 +Tri: 502 503 504 +Tri: 505 506 428 +Tri: 507 508 509 +Tri: 510 511 512 +Tri: 457 456 427 +Tri: 513 514 515 +Tri: 516 517 518 +Tri: 508 507 519 +Tri: 507 520 519 +Tri: 434 521 432 +Tri: 415 431 522 +Tri: 523 465 419 +Tri: 524 424 425 +Tri: 525 526 527 +Tri: 528 491 529 +Tri: 530 525 527 +Tri: 527 531 532 +Tri: 533 534 535 +Tri: 536 537 538 +Tri: 539 540 541 +Tri: 542 543 544 +Tri: 545 546 547 +Tri: 548 549 550 +Tri: 551 552 553 +Tri: 537 536 554 +Tri: 555 537 554 +Tri: 556 557 558 +Tri: 155 559 560 +Tri: 561 562 563 +Tri: 564 565 566 +Tri: 567 568 569 +Tri: 570 571 568 +Tri: 572 569 562 +Tri: 573 574 571 +Tri: 171 575 576 +Tri: 577 578 579 +Tri: 580 581 582 +Tri: 432 521 583 +Tri: 584 182 185 +Tri: 585 586 584 +Tri: 185 587 584 +Tri: 187 189 588 +Tri: 589 590 591 +Tri: 193 592 194 +Tri: 593 197 594 +Tri: 589 199 590 +Tri: 595 202 596 +Tri: 597 199 589 +Tri: 590 202 595 +Tri: 598 592 193 +Tri: 588 599 600 +Tri: 573 207 574 +Tri: 95 501 209 +Tri: 459 211 27 +Tri: 454 435 601 +Tri: 453 27 435 +Tri: 213 215 602 +Tri: 216 603 220 +Tri: 219 603 604 +Tri: 605 222 606 +Tri: 223 607 216 +Tri: 608 609 610 +Tri: 611 612 613 +Tri: 614 615 616 +Tri: 526 617 618 +Tri: 619 526 618 +Tri: 620 621 622 +Tri: 623 624 625 +Tri: 626 627 628 +Tri: 629 630 631 +Tri: 632 633 634 +Tri: 635 636 637 +Tri: 638 639 640 +Tri: 641 642 643 +Tri: 596 644 595 +Tri: 645 646 647 +Tri: 645 545 648 +Tri: 545 547 623 +Tri: 545 623 648 +Tri: 649 650 641 +Tri: 651 652 653 +Tri: 651 653 643 +Tri: 643 649 641 +Tri: 643 653 649 +Tri: 654 655 656 +Tri: 657 658 659 +Tri: 660 661 662 +Tri: 663 664 665 +Tri: 666 662 661 +Tri: 667 613 668 +Tri: 669 670 614 +Tri: 671 672 548 +Tri: 673 674 675 +Tri: 676 677 678 +Tri: 478 679 680 +Tri: 499 681 497 +Tri: 682 493 492 +Tri: 683 303 318 +Tri: 684 678 677 +Tri: 216 607 685 +Tri: 686 609 687 +Tri: 688 689 690 +Tri: 691 692 693 +Tri: 694 318 695 +Tri: 696 697 698 +Tri: 699 700 701 +Tri: 688 690 702 +Tri: 700 213 602 +Tri: 703 704 673 +Tri: 685 705 216 +Tri: 706 705 685 +Tri: 707 672 671 +Tri: 708 709 710 +Tri: 711 712 713 +Tri: 714 712 711 +Tri: 715 716 717 +Tri: 715 717 718 +Tri: 719 720 721 +Tri: 717 722 718 +Tri: 723 724 725 +Tri: 538 726 536 +Tri: 714 727 712 +Tri: 728 729 730 +Tri: 461 358 211 +Tri: 462 731 463 +Tri: 448 732 461 +Tri: 733 734 448 +Tri: 463 735 446 +Tri: 736 737 738 +Tri: 739 740 741 +Tri: 742 743 744 +Tri: 745 746 747 +Tri: 745 747 748 +Tri: 749 744 750 +Tri: 751 752 753 +Tri: 754 521 434 +Tri: 755 756 757 +Tri: 758 586 585 +Tri: 747 759 748 +Tri: 743 760 744 +Tri: 524 425 761 +Tri: 762 464 763 +Tri: 303 764 765 +Tri: 765 396 303 +Tri: 766 764 303 +Tri: 767 768 769 +Tri: 770 771 772 +Tri: 770 769 768 +Tri: 773 769 774 +Tri: 775 776 777 +Tri: 778 779 780 +Tri: 780 781 782 +Tri: 783 784 785 +Tri: 785 786 787 +Tri: 787 788 789 +Tri: 790 791 792 +Tri: 792 793 794 +Tri: 794 795 796 +Tri: 797 798 799 +Tri: 799 800 801 +Tri: 801 802 803 +Tri: 804 805 806 +Tri: 807 808 809 +Tri: 810 790 811 +Tri: 812 813 814 +Tri: 815 816 817 +Tri: 818 819 820 +Tri: 821 822 823 +Tri: 824 825 826 +Tri: 827 828 816 +Tri: 829 830 831 +Tri: 832 805 825 +Tri: 833 781 834 +Tri: 835 826 836 +Tri: 837 831 828 +Tri: 838 839 840 +Tri: 841 842 839 +Tri: 843 844 842 +Tri: 845 823 844 +Tri: 846 847 848 +Tri: 846 849 850 +Tri: 851 818 852 +Tri: 853 849 854 +Tri: 853 851 852 +Tri: 795 814 796 +Tri: 789 815 855 +Tri: 778 856 804 +Tri: 857 778 804 +Tri: 788 815 789 +Tri: 858 783 859 +Tri: 860 833 834 +Tri: 797 861 862 +Tri: 855 815 817 +Tri: 856 863 804 +Tri: 815 864 827 +Tri: 804 806 865 +Tri: 866 867 868 +Tri: 869 811 870 +Tri: 860 871 872 +Tri: 873 867 874 +Tri: 859 875 876 +Tri: 877 878 879 +Tri: 880 877 879 +Tri: 881 802 882 +Tri: 836 883 884 +Tri: 885 886 830 +Tri: 887 888 889 +Tri: 890 891 888 +Tri: 892 893 894 +Tri: 895 896 893 +Tri: 897 898 896 +Tri: 899 900 901 +Tri: 902 903 900 +Tri: 904 905 903 +Tri: 906 907 908 +Tri: 909 910 907 +Tri: 911 912 910 +Tri: 913 914 915 +Tri: 916 917 918 +Tri: 919 899 901 +Tri: 920 921 922 +Tri: 923 924 925 +Tri: 926 927 928 +Tri: 929 930 931 +Tri: 932 933 934 +Tri: 925 935 936 +Tri: 937 938 939 +Tri: 934 914 940 +Tri: 941 891 942 +Tri: 943 944 932 +Tri: 936 945 937 +Tri: 946 947 948 +Tri: 948 949 950 +Tri: 950 951 952 +Tri: 952 953 929 +Tri: 954 955 956 +Tri: 954 957 958 +Tri: 959 926 928 +Tri: 960 957 961 +Tri: 960 959 962 +Tri: 905 963 920 +Tri: 964 965 923 +Tri: 887 913 966 +Tri: 889 913 887 +Tri: 898 964 923 +Tri: 967 892 894 +Tri: 968 941 969 +Tri: 906 970 971 +Tri: 965 972 923 +Tri: 966 913 915 +Tri: 923 925 973 +Tri: 913 974 940 +Tri: 975 976 977 +Tri: 978 979 919 +Tri: 969 980 968 +Tri: 981 976 982 +Tri: 983 984 967 +Tri: 985 986 987 +Tri: 988 985 989 +Tri: 990 912 991 +Tri: 992 993 994 +Tri: 938 995 996 +Tri: 997 998 999 +Tri: 999 1000 1001 +Tri: 1001 1002 1003 +Tri: 1003 1004 1005 +Tri: 1005 1006 1007 +Tri: 1007 1008 1009 +Tri: 1009 1010 1011 +Tri: 1011 1012 1013 +Tri: 1013 1014 1015 +Tri: 1015 1016 1017 +Tri: 1017 1018 1019 +Tri: 1019 1020 1021 +Tri: 1022 1023 1024 +Tri: 1025 1026 1022 +Tri: 1027 1028 1025 +Tri: 1029 1030 1027 +Tri: 1031 1032 1029 +Tri: 1033 1034 1031 +Tri: 1035 1036 1033 +Tri: 1037 1038 1035 +Tri: 1039 1040 1037 +Tri: 1041 1042 1039 +Tri: 1043 1044 1041 +Tri: 1045 1046 1043 +Tri: 1047 1048 1049 +Tri: 1050 1051 1052 +Tri: 1053 1054 1051 +Tri: 1055 1056 1054 +Tri: 1057 1058 1059 +Tri: 1060 1059 1061 +Tri: 1062 1061 1063 +Tri: 1064 1063 1065 +Tri: 1066 1067 1068 +Tri: 1069 1070 1071 +Tri: 1072 1073 1074 +Tri: 1075 1076 1077 +Tri: 1078 1079 1080 +Tri: 1081 1082 1083 +Tri: 1084 1071 1085 +Tri: 1086 1074 1087 +Tri: 1088 1077 1070 +Tri: 1089 1080 1073 +Tri: 1090 1083 1076 +Tri: 1091 1085 1079 +Tri: 1092 1087 1093 +Tri: 1094 1095 1096 +Tri: 1097 1068 1098 +Tri: 1099 1096 1100 +Tri: 1101 1098 1102 +Tri: 1103 1100 1104 +Tri: 1105 1102 1106 +Tri: 1107 1104 1108 +Tri: 1109 1106 1110 +Tri: 1111 1108 1112 +Tri: 1113 1112 1114 +Tri: 1115 1114 1067 +Tri: 1116 1117 1118 +Tri: 1119 1120 1121 +Tri: 1122 1123 1124 +Tri: 1125 1121 1126 +Tri: 1127 1124 1128 +Tri: 1129 1126 1130 +Tri: 1131 1128 1117 +Tri: 1132 1130 1133 +Tri: 1047 1134 1135 +Tri: 1136 1137 1138 +Tri: 1139 1140 1141 +Tri: 1142 1143 1144 +Tri: 1145 1146 1147 +Tri: 1148 1149 1150 +Tri: 1151 1152 1153 +Tri: 1154 1155 1152 +Tri: 1156 1157 1155 +Tri: 1158 1159 1157 +Tri: 1160 1161 1159 +Tri: 1162 1163 1161 +Tri: 1164 1165 1163 +Tri: 1166 1167 1165 +Tri: 1168 1169 1167 +Tri: 1170 1171 1169 +Tri: 1172 1173 1171 +Tri: 1174 1175 1173 +Tri: 1176 1177 1178 +Tri: 1179 1178 1180 +Tri: 1181 1180 1182 +Tri: 1183 1182 1184 +Tri: 1185 1184 1186 +Tri: 1187 1186 1188 +Tri: 1189 1188 1190 +Tri: 1191 1190 1192 +Tri: 1193 1192 1194 +Tri: 1195 1194 1196 +Tri: 1197 1196 1198 +Tri: 1199 1198 1200 +Tri: 1201 1202 1203 +Tri: 1204 1205 1206 +Tri: 1206 1207 1208 +Tri: 1208 1209 1210 +Tri: 1211 1212 1213 +Tri: 1214 1215 1211 +Tri: 1216 1217 1214 +Tri: 1218 1219 1216 +Tri: 1220 1221 1222 +Tri: 1223 1224 1225 +Tri: 1226 1227 1228 +Tri: 1229 1230 1231 +Tri: 1232 1233 1234 +Tri: 1235 1236 1237 +Tri: 1238 1239 1223 +Tri: 1240 1241 1226 +Tri: 1225 1242 1229 +Tri: 1228 1243 1232 +Tri: 1231 1244 1235 +Tri: 1234 1245 1238 +Tri: 1246 1247 1240 +Tri: 1248 1249 1250 +Tri: 1251 1252 1220 +Tri: 1253 1254 1248 +Tri: 1255 1256 1251 +Tri: 1257 1258 1253 +Tri: 1259 1260 1255 +Tri: 1261 1262 1257 +Tri: 1263 1264 1259 +Tri: 1265 1266 1261 +Tri: 1267 1268 1265 +Tri: 1222 1269 1267 +Tri: 1270 1271 1272 +Tri: 1273 1274 1275 +Tri: 1276 1277 1278 +Tri: 1279 1280 1274 +Tri: 1281 1275 1282 +Tri: 1283 1284 1280 +Tri: 1285 1286 1284 +Tri: 1287 1282 1271 +Tri: 1288 1272 1289 +Tri: 1290 1289 1291 +Tri: 1292 1278 1286 +Tri: 1293 1294 1295 +Tri: 1201 1203 1296 +Tri: 1297 1298 1277 +Tri: 1299 1300 1301 +Tri: 1302 1303 1304 +Tri: 1305 1306 1307 +Tri: 1308 1309 1310 +Tri: 1311 1312 1313 +Tri: 1314 1315 1316 +Tri: 1317 1316 1318 +Tri: 1319 1318 1320 +Tri: 1321 1322 1323 +Tri: 1324 1320 1325 +Tri: 1326 1323 1327 +Tri: 1328 1325 1329 +Tri: 1330 1327 1331 +Tri: 1332 1329 1333 +Tri: 1334 1331 1335 +Tri: 1336 1335 1337 +Tri: 1338 1337 1315 +Tri: 1339 1340 1341 +Tri: 1342 1343 1340 +Tri: 1344 1345 1343 +Tri: 1346 1347 1348 +Tri: 1349 1350 1345 +Tri: 1351 1352 1347 +Tri: 1353 1354 1350 +Tri: 1355 1356 1352 +Tri: 1357 1358 1354 +Tri: 1359 1360 1356 +Tri: 1361 1362 1360 +Tri: 1363 1341 1362 +Tri: 1364 1365 1366 +Tri: 1366 1365 1367 +Tri: 1365 1368 1367 +Tri: 1368 1142 1144 +Tri: 1369 1370 1371 +Tri: 1372 1369 1371 +Tri: 1371 1309 1308 +Tri: 1373 1308 1310 +Tri: 1374 1133 1375 +Tri: 1376 1377 1123 +Tri: 1378 1375 1379 +Tri: 1380 1379 1377 +Tri: 1381 1382 1383 +Tri: 1384 1385 1386 +Tri: 1387 1388 1385 +Tri: 1389 1390 1388 +Tri: 1391 1392 1390 +Tri: 1393 1394 1147 +Tri: 1395 1396 1397 +Tri: 1398 1399 1400 +Tri: 1401 1147 1394 +Tri: 1402 1393 1403 +Tri: 1147 1306 1393 +Tri: 997 1404 1405 +Tri: 1406 1407 1404 +Tri: 1408 1409 1407 +Tri: 1410 1411 1409 +Tri: 1412 1413 1411 +Tri: 1414 1415 1413 +Tri: 1416 1417 1415 +Tri: 1418 1419 1417 +Tri: 1420 1421 1419 +Tri: 1422 1423 1421 +Tri: 1424 1425 1423 +Tri: 1426 1020 1425 +Tri: 1427 1023 1428 +Tri: 1429 1428 1430 +Tri: 1431 1430 1432 +Tri: 1433 1432 1434 +Tri: 1435 1434 1436 +Tri: 1437 1436 1438 +Tri: 1439 1438 1440 +Tri: 1441 1440 1442 +Tri: 1443 1442 1444 +Tri: 1445 1444 1446 +Tri: 1447 1446 1448 +Tri: 1045 1448 1449 +Tri: 1047 1450 1451 +Tri: 1452 1453 1454 +Tri: 1454 1455 1456 +Tri: 1456 1056 1457 +Tri: 1458 1459 1460 +Tri: 1461 1462 1458 +Tri: 1463 1464 1461 +Tri: 1064 1465 1463 +Tri: 1466 1467 1468 +Tri: 1469 1470 1471 +Tri: 1472 1473 1474 +Tri: 1475 1476 1477 +Tri: 1478 1479 1480 +Tri: 1481 1082 1482 +Tri: 1483 1484 1469 +Tri: 1485 1486 1472 +Tri: 1471 1487 1475 +Tri: 1474 1488 1478 +Tri: 1477 1489 1481 +Tri: 1480 1490 1483 +Tri: 1092 1491 1485 +Tri: 1492 1095 1493 +Tri: 1494 1495 1466 +Tri: 1496 1497 1492 +Tri: 1498 1499 1494 +Tri: 1500 1501 1496 +Tri: 1502 1503 1498 +Tri: 1504 1505 1500 +Tri: 1109 1506 1502 +Tri: 1507 1508 1504 +Tri: 1509 1510 1507 +Tri: 1468 1511 1509 +Tri: 1116 1512 1513 +Tri: 1514 1120 1515 +Tri: 1516 1517 1518 +Tri: 1519 1520 1514 +Tri: 1521 1522 1516 +Tri: 1523 1524 1519 +Tri: 1513 1525 1521 +Tri: 1526 1527 1523 +Tri: 1047 1451 1528 +Tri: 1529 1530 1531 +Tri: 1532 1533 1534 +Tri: 1535 1536 1537 +Tri: 1538 1539 1540 +Tri: 1541 1542 1543 +Tri: 1151 1544 1545 +Tri: 1545 1546 1547 +Tri: 1547 1548 1549 +Tri: 1549 1550 1551 +Tri: 1551 1552 1553 +Tri: 1553 1554 1555 +Tri: 1555 1556 1557 +Tri: 1557 1558 1559 +Tri: 1559 1560 1561 +Tri: 1561 1562 1563 +Tri: 1563 1564 1565 +Tri: 1565 1175 1566 +Tri: 1567 1177 1568 +Tri: 1569 1570 1567 +Tri: 1571 1572 1569 +Tri: 1573 1574 1571 +Tri: 1575 1576 1573 +Tri: 1577 1578 1575 +Tri: 1579 1580 1577 +Tri: 1581 1582 1579 +Tri: 1583 1584 1581 +Tri: 1585 1586 1583 +Tri: 1587 1588 1585 +Tri: 1199 1589 1587 +Tri: 1201 1590 1591 +Tri: 1592 1593 1594 +Tri: 1595 1596 1593 +Tri: 1597 1209 1596 +Tri: 1598 1599 1600 +Tri: 1601 1600 1602 +Tri: 1603 1602 1604 +Tri: 1218 1604 1605 +Tri: 1606 1607 1608 +Tri: 1609 1610 1611 +Tri: 1612 1613 1614 +Tri: 1615 1616 1617 +Tri: 1618 1619 1620 +Tri: 1621 1236 1622 +Tri: 1623 1611 1624 +Tri: 1625 1614 1626 +Tri: 1627 1617 1610 +Tri: 1628 1620 1613 +Tri: 1629 1622 1616 +Tri: 1630 1624 1619 +Tri: 1246 1626 1631 +Tri: 1632 1249 1633 +Tri: 1634 1608 1635 +Tri: 1636 1633 1637 +Tri: 1638 1635 1639 +Tri: 1640 1637 1641 +Tri: 1642 1639 1643 +Tri: 1644 1641 1645 +Tri: 1263 1643 1646 +Tri: 1647 1645 1648 +Tri: 1649 1648 1650 +Tri: 1651 1650 1607 +Tri: 1652 1653 1654 +Tri: 1655 1656 1657 +Tri: 1658 1659 1660 +Tri: 1657 1661 1662 +Tri: 1663 1664 1655 +Tri: 1662 1665 1666 +Tri: 1666 1667 1668 +Tri: 1654 1669 1663 +Tri: 1670 1671 1652 +Tri: 1290 1672 1670 +Tri: 1668 1673 1658 +Tri: 1674 1675 1676 +Tri: 1201 1677 1678 +Tri: 1660 1298 1679 +Tri: 1680 1681 1682 +Tri: 1683 1684 1685 +Tri: 1686 1687 1688 +Tri: 1689 1690 1691 +Tri: 1692 1693 1694 +Tri: 1695 1696 1697 +Tri: 1698 1699 1695 +Tri: 1700 1701 1698 +Tri: 1702 1322 1703 +Tri: 1704 1705 1700 +Tri: 1706 1707 1702 +Tri: 1708 1709 1704 +Tri: 1710 1711 1706 +Tri: 1332 1712 1708 +Tri: 1713 1714 1710 +Tri: 1715 1716 1713 +Tri: 1697 1717 1715 +Tri: 1718 1719 1720 +Tri: 1720 1721 1722 +Tri: 1722 1723 1724 +Tri: 1346 1725 1726 +Tri: 1724 1727 1728 +Tri: 1726 1729 1730 +Tri: 1728 1731 1732 +Tri: 1730 1733 1734 +Tri: 1732 1358 1735 +Tri: 1734 1736 1737 +Tri: 1737 1738 1739 +Tri: 1739 1740 1718 +Tri: 1741 1742 1743 +Tri: 1742 1744 1743 +Tri: 1743 1745 1535 +Tri: 1745 1536 1535 +Tri: 1746 1747 1748 +Tri: 1749 1747 1746 +Tri: 1747 1691 1748 +Tri: 1750 1690 1689 +Tri: 1751 1752 1526 +Tri: 1518 1753 1754 +Tri: 1755 1756 1751 +Tri: 1754 1757 1755 +Tri: 1758 1759 1760 +Tri: 1761 1762 1763 +Tri: 1763 1764 1765 +Tri: 1765 1766 1767 +Tri: 1767 1392 1768 +Tri: 1688 1769 1770 +Tri: 1771 1396 1772 +Tri: 1773 1399 1774 +Tri: 1775 1769 1776 +Tri: 1770 1777 1688 +Tri: 1776 1687 1539 +Tri: 1778 1779 1780 +Tri: 1780 1781 1782 +Tri: 1782 1783 1784 +Tri: 1784 1785 1786 +Tri: 1787 1788 1789 +Tri: 1790 1791 1792 +Tri: 1792 1793 1778 +Tri: 1794 1795 1796 +Tri: 1796 1797 1798 +Tri: 1798 1799 1800 +Tri: 1800 1801 1802 +Tri: 1803 1804 1805 +Tri: 1806 1807 1808 +Tri: 1808 1809 1794 +Tri: 1810 1811 1812 +Tri: 1812 1813 1814 +Tri: 1814 1815 1816 +Tri: 1816 1817 1818 +Tri: 1819 1820 1821 +Tri: 1818 1822 1823 +Tri: 1824 1825 1810 +Tri: 1826 1827 1828 +Tri: 1828 1829 1830 +Tri: 1830 1831 1832 +Tri: 1832 1833 1834 +Tri: 1835 1836 1837 +Tri: 1834 1838 1839 +Tri: 1839 1840 1841 +Tri: 1842 1843 1844 +Tri: 1844 1845 1846 +Tri: 1846 1847 1848 +Tri: 1848 1849 1850 +Tri: 1851 1852 1853 +Tri: 1854 1855 1856 +Tri: 1856 1857 1842 +Tri: 1858 1859 1860 +Tri: 1860 1861 1862 +Tri: 1862 1863 1864 +Tri: 1865 1866 1867 +Tri: 1868 1869 1870 +Tri: 1867 1871 1872 +Tri: 1872 1873 1858 +Tri: 1874 1875 1876 +Tri: 1876 1877 1878 +Tri: 1878 1879 1880 +Tri: 1880 1881 1882 +Tri: 1883 1884 1885 +Tri: 1882 1886 1887 +Tri: 1888 1889 1874 +Tri: 1890 1891 1892 +Tri: 1893 1894 1891 +Tri: 1895 1896 1894 +Tri: 1897 1898 1896 +Tri: 1899 1900 1901 +Tri: 1902 1903 1904 +Tri: 1905 1892 1903 +Tri: 1906 1907 1908 +Tri: 1909 1910 1907 +Tri: 1911 1912 1910 +Tri: 1913 1914 1912 +Tri: 1915 1916 1917 +Tri: 1918 1919 1920 +Tri: 1921 1908 1919 +Tri: 1922 1923 1924 +Tri: 1925 1926 1923 +Tri: 1927 1928 1926 +Tri: 1929 1930 1928 +Tri: 1931 1932 1933 +Tri: 1934 1935 1930 +Tri: 1936 1924 1937 +Tri: 1938 1939 1940 +Tri: 1941 1942 1939 +Tri: 1943 1944 1942 +Tri: 1945 1946 1944 +Tri: 1947 1948 1949 +Tri: 1950 1951 1946 +Tri: 1952 1953 1951 +Tri: 1954 1955 1956 +Tri: 1957 1958 1955 +Tri: 1959 1960 1958 +Tri: 1961 1962 1960 +Tri: 1963 1964 1965 +Tri: 1966 1967 1968 +Tri: 1969 1956 1967 +Tri: 1970 1971 1972 +Tri: 1973 1974 1971 +Tri: 1975 1976 1974 +Tri: 1977 1978 1979 +Tri: 1980 1981 1982 +Tri: 1983 1984 1978 +Tri: 1985 1972 1984 +Tri: 1986 1987 1988 +Tri: 1989 1990 1987 +Tri: 1991 1992 1990 +Tri: 1993 1994 1992 +Tri: 1995 1996 1997 +Tri: 1998 1999 1994 +Tri: 2000 1988 2001 +Tri: 2002 2003 2004 +Tri: 2005 2002 2004 +Tri: 2006 2007 2008 +Tri: 2009 2010 2011 +Tri: 2012 2013 2014 +Tri: 2015 2016 2017 +Tri: 2018 2019 2020 +Tri: 2021 2022 2023 +Tri: 2024 2025 2026 +Tri: 2027 2028 2029 +Tri: 2030 2031 2032 +Tri: 2033 2034 2035 +Tri: 2036 2034 2033 +Tri: 2037 2007 2038 +Tri: 2039 2040 2041 +Tri: 2042 2043 2044 +Tri: 2015 2045 2046 +Tri: 2047 2048 2049 +Tri: 2050 2051 2052 +Tri: 2053 2054 2055 +Tri: 2056 2028 2057 +Tri: 2058 2031 2059 +Tri: 2060 2061 2062 +Tri: 2063 2064 2065 +Tri: 2066 2067 2068 +Tri: 2069 2070 2071 +Tri: 2072 2068 2070 +Tri: 2073 2074 2064 +Tri: 2075 2076 2074 +Tri: 2077 2078 2079 +Tri: 2080 2081 2082 +Tri: 2083 2082 2078 +Tri: 2083 2084 2085 +Tri: 2086 2085 2087 +Tri: 2088 2087 2089 +Tri: 2090 2091 2092 +Tri: 2093 2092 2094 +Tri: 2095 2094 2096 +Tri: 2097 2096 2098 +Tri: 2099 2100 2101 +Tri: 2102 2103 2100 +Tri: 2104 2105 2103 +Tri: 2106 2101 2105 +Tri: 2107 2108 2109 +Tri: 2110 2111 2108 +Tri: 2112 2113 2111 +Tri: 2114 2109 2113 +Tri: 2115 2116 2117 +Tri: 2116 2118 2117 +Tri: 2119 2120 2118 +Tri: 2121 2122 2120 +Tri: 2123 2124 2125 +Tri: 2126 2127 2124 +Tri: 2128 2129 2130 +Tri: 2129 2125 2130 +Tri: 2131 2115 2132 +Tri: 2133 2134 2135 +Tri: 2136 2137 2138 +Tri: 2139 2140 2141 +Tri: 2142 2143 2144 +Tri: 2145 2146 2147 +Tri: 2148 2149 2150 +Tri: 2151 2152 2153 +Tri: 2154 2155 2156 +Tri: 2157 2158 2159 +Tri: 2160 2161 2162 +Tri: 2163 2164 2165 +Tri: 2166 2167 2168 +Tri: 2169 2170 2171 +Tri: 2172 2173 2174 +Tri: 2175 2176 2177 +Tri: 2178 2179 2180 +Tri: 2181 2182 2183 +Tri: 2184 2185 2186 +Tri: 2187 2188 2189 +Tri: 2190 2191 2192 +Tri: 2193 2194 2195 +Tri: 2196 2197 2198 +Tri: 2199 2200 2201 +Tri: 2202 2203 2204 +Tri: 2205 2206 2207 +Tri: 2208 2209 2210 +Tri: 2211 2212 2213 +Tri: 2214 2215 2152 +Tri: 2216 2217 2218 +Tri: 2219 2220 2221 +Tri: 2222 2223 2224 +Tri: 2225 2226 2227 +Tri: 2228 2229 2230 +Tri: 2231 2232 2233 +Tri: 2234 2235 2236 +Tri: 2132 2130 2127 +Tri: 2131 2132 2127 +Tri: 2129 2128 2122 +Tri: 2128 2117 2122 +Tri: 2237 2238 2239 +Tri: 2060 2240 2241 +Tri: 2063 2242 2243 +Tri: 2244 2067 2245 +Tri: 2069 2246 2247 +Tri: 2247 2248 2244 +Tri: 2243 2249 2250 +Tri: 2250 2076 2251 +Tri: 2077 2252 2253 +Tri: 2254 2081 2255 +Tri: 2253 2256 2254 +Tri: 2253 2084 2077 +Tri: 2257 2258 2253 +Tri: 2088 2259 2257 +Tri: 2260 2261 2262 +Tri: 2263 2264 2260 +Tri: 2265 2266 2263 +Tri: 2267 2268 2265 +Tri: 2269 2270 2271 +Tri: 2271 2272 2273 +Tri: 2273 2274 2275 +Tri: 2275 2276 2269 +Tri: 2277 2278 2279 +Tri: 2279 2280 2281 +Tri: 2281 2282 2283 +Tri: 2283 2284 2277 +Tri: 2285 2286 2287 +Tri: 2287 2288 2289 +Tri: 2289 2290 2291 +Tri: 2291 2292 2293 +Tri: 2294 2295 2296 +Tri: 2296 2297 2298 +Tri: 2299 2300 2293 +Tri: 2293 2301 2294 +Tri: 2298 2285 2287 +Tri: 2302 2303 2304 +Tri: 2305 2306 2307 +Tri: 2308 2309 2310 +Tri: 2311 2143 2312 +Tri: 2313 2314 2315 +Tri: 2316 2317 2318 +Tri: 2319 2320 2321 +Tri: 2322 2323 2324 +Tri: 2325 2326 2327 +Tri: 2328 2329 2330 +Tri: 2331 2332 2333 +Tri: 2166 2334 2335 +Tri: 2336 2337 2338 +Tri: 2339 2340 2341 +Tri: 2342 2343 2344 +Tri: 2345 2346 2347 +Tri: 2348 2182 2349 +Tri: 2350 2351 2352 +Tri: 2353 2354 2355 +Tri: 2356 2357 2358 +Tri: 2359 2360 2361 +Tri: 2362 2363 2364 +Tri: 2365 2200 2366 +Tri: 2367 2368 2369 +Tri: 2205 2370 2371 +Tri: 2208 2372 2373 +Tri: 2374 2375 2376 +Tri: 2321 2377 2378 +Tri: 2379 2217 2380 +Tri: 2381 2382 2383 +Tri: 2384 2385 2386 +Tri: 2387 2388 2389 +Tri: 2228 2390 2391 +Tri: 2392 2393 2394 +Tri: 2395 2396 2397 +Tri: 2398 2300 2299 +Tri: 2298 2297 2398 +Tri: 2293 2292 2299 +Tri: 2299 2286 2285 +Tri: 2399 2238 2400 +Tri: 2401 2402 2403 +Tri: 2404 2405 2406 +Tri: 2407 2408 2409 +Tri: 2410 2411 2412 +Tri: 2413 2414 2415 +Tri: 2416 2417 2418 +Tri: 2419 2420 2421 +Tri: 2422 2414 2413 +Tri: 2423 2424 2425 +Tri: 2426 2427 2428 +Tri: 2429 2430 2431 +Tri: 2432 2433 2434 +Tri: 2435 2436 2437 +Tri: 2438 2439 2440 +Tri: 2441 2442 2443 +Tri: 2444 2445 2446 +Tri: 2447 2448 2449 +Tri: 2450 2451 2452 +Tri: 2453 2446 2454 +Tri: 2455 2456 2457 +Tri: 2458 2459 2460 +Tri: 2461 2462 2463 +Tri: 2464 2465 2466 +Tri: 2467 2468 2469 +Tri: 2470 2471 2472 +Tri: 2473 2474 2475 +Tri: 2476 2477 2478 +Tri: 2479 2480 2481 +Tri: 2482 2483 2484 +Tri: 2485 2478 2486 +Tri: 2487 2488 2489 +Tri: 2490 2491 2492 +Tri: 2493 2494 2495 +Tri: 2496 2497 2498 +Tri: 2499 2500 2501 +Tri: 2502 2503 2504 +Tri: 2505 2506 2507 +Tri: 2508 2509 2510 +Tri: 2511 2512 2513 +Tri: 2514 2515 2516 +Tri: 2517 2509 2508 +Tri: 2518 2519 2520 +Tri: 2521 2522 2523 +Tri: 2524 2525 2526 +Tri: 2527 2528 2529 +Tri: 2530 2531 2532 +Tri: 2533 2534 2535 +Tri: 2536 2537 2538 +Tri: 2539 2540 2541 +Tri: 2542 2543 2544 +Tri: 2544 2545 2546 +Tri: 2547 2548 2549 +Tri: 2548 2550 2549 +Tri: 2551 2552 2553 +Tri: 2554 2555 2556 +Tri: 2557 2558 2559 +Tri: 2560 2561 2562 +Tri: 2563 2564 2565 +Tri: 2566 2567 2568 +Tri: 2569 2545 2567 +Tri: 2570 2571 2572 +Tri: 2572 2573 2574 +Tri: 2575 2576 2577 +Tri: 2578 2576 2575 +Tri: 2579 2580 2581 +Tri: 2578 2581 2582 +Tri: 2583 2584 2585 +Tri: 2586 2587 2588 +Tri: 2589 2588 2590 +Tri: 2591 2586 2589 +Tri: 2592 2593 2594 +Tri: 2595 2596 2597 +Tri: 2592 2584 2583 +Tri: 2591 2598 2586 +Tri: 2599 2600 2601 +Tri: 2602 2587 2603 +Tri: 2604 2588 2602 +Tri: 2605 2604 2602 +Tri: 2606 2607 2608 +Tri: 2609 2596 2610 +Tri: 2606 2601 2611 +Tri: 2605 2603 2612 +Tri: 2613 2614 2615 +Tri: 2616 2617 2618 +Tri: 2619 2620 2621 +Tri: 2622 2623 2624 +Tri: 2625 2626 2627 +Tri: 2628 2629 2630 +Tri: 2631 2632 2633 +Tri: 2634 2635 2636 +Tri: 2637 2638 2623 +Tri: 2639 2633 2640 +Tri: 2641 2642 2643 +Tri: 2644 2645 2646 +Tri: 2647 2648 2649 +Tri: 2650 2651 2652 +Tri: 2653 2654 2655 +Tri: 2656 2657 2658 +Tri: 2659 2640 2660 +Tri: 2661 2662 2626 +Tri: 2663 2664 2657 +Tri: 2665 2624 2620 +Tri: 2666 2667 2662 +Tri: 2668 2669 2664 +Tri: 2670 2671 2632 +Tri: 2672 2673 2667 +Tri: 2674 2675 2676 +Tri: 2677 2678 2679 +Tri: 2680 2681 2682 +Tri: 2683 2684 2685 +Tri: 2686 2687 2688 +Tri: 2689 2690 2691 +Tri: 2692 2693 2694 +Tri: 2695 2696 2697 +Tri: 2698 2699 2700 +Tri: 2701 2702 2703 +Tri: 2704 2705 2706 +Tri: 2707 2708 2709 +Tri: 2710 2711 2712 +Tri: 2713 2714 2715 +Tri: 2716 2717 2718 +Tri: 2719 2720 2721 +Tri: 2722 2709 2723 +Tri: 2724 2706 2725 +Tri: 2726 2627 2638 +Tri: 2727 2728 2671 +Tri: 2729 2674 2676 +Tri: 2730 2660 2669 +Tri: 2731 2732 2733 +Tri: 2734 2735 2736 +Tri: 2737 2738 2735 +Tri: 2636 2739 2634 +Tri: 2740 2734 2736 +Tri: 2741 2630 2742 +Tri: 2683 2685 2743 +Tri: 2744 2745 2746 +Tri: 2747 2748 2749 +Tri: 2750 2751 2752 +Tri: 2753 2754 2755 +Tri: 2756 2757 2758 +Tri: 2759 2760 2761 +Tri: 2762 2763 2764 +Tri: 2765 2766 2767 +Tri: 2755 2768 2769 +Tri: 2770 2771 2762 +Tri: 2772 2773 2774 +Tri: 2775 2776 2777 +Tri: 2778 2779 2780 +Tri: 2781 2782 2783 +Tri: 2784 2785 2786 +Tri: 2787 2788 2789 +Tri: 2790 2791 2770 +Tri: 2758 2792 2793 +Tri: 2789 2794 2795 +Tri: 2752 2796 2753 +Tri: 2793 2797 2798 +Tri: 2795 2799 2800 +Tri: 2764 2801 2802 +Tri: 2798 2803 2804 +Tri: 2805 2806 2807 +Tri: 2808 2809 2810 +Tri: 2811 2812 2813 +Tri: 2814 2815 2816 +Tri: 2817 2818 2819 +Tri: 2820 2821 2822 +Tri: 2823 2824 2825 +Tri: 2826 2827 2828 +Tri: 2829 2830 2831 +Tri: 2832 2833 2834 +Tri: 2835 2836 2837 +Tri: 2838 2839 2840 +Tri: 2841 2842 2843 +Tri: 2844 2845 2846 +Tri: 2847 2848 2849 +Tri: 2850 2851 2852 +Tri: 2853 2839 2838 +Tri: 2854 2836 2835 +Tri: 2769 2855 2756 +Tri: 2802 2856 2857 +Tri: 2858 2859 2805 +Tri: 2800 2860 2790 +Tri: 2861 2767 2766 +Tri: 2862 2863 2864 +Tri: 2864 2865 2866 +Tri: 2867 2765 2868 +Tri: 2869 2870 2862 +Tri: 2871 2872 2759 +Tri: 2814 2873 2874 +Tri: 2875 2876 2877 +Tri: 2878 2879 2880 +Tri: 2878 2881 2882 +Tri: 2883 2881 2884 +Tri: 2885 2886 2887 +Tri: 2888 2889 2890 +Tri: 2891 2880 2879 +Tri: 2892 2887 2893 +Tri: 2894 2895 2889 +Tri: 2896 2876 2897 +Tri: 2898 2899 2900 +Tri: 2901 2902 2903 +Tri: 2901 2904 2905 +Tri: 2906 2904 2907 +Tri: 2908 2909 2910 +Tri: 2911 2912 2913 +Tri: 2914 2915 2916 +Tri: 2917 2918 2908 +Tri: 2913 2919 2920 +Tri: 2921 2899 2922 +Tri: 2923 2924 2925 +Tri: 2926 2925 2927 +Tri: 2928 2929 2930 +Tri: 2931 2932 2933 +Tri: 2934 2935 2936 +Tri: 2937 2930 2938 +Tri: 2939 2940 2941 +Tri: 2942 2943 2935 +Tri: 2941 2944 2945 +Tri: 2945 2933 2932 +Tri: 2946 2947 2948 +Tri: 2949 2950 2946 +Tri: 2951 2952 2953 +Tri: 2954 2955 2956 +Tri: 2957 2958 2959 +Tri: 2960 2961 2951 +Tri: 2962 2963 2964 +Tri: 2959 2965 2966 +Tri: 2967 2968 2963 +Tri: 2969 2970 2968 +Tri: 2971 214 323 +Tri: 701 700 602 +Tri: 529 491 493 +Tri: 126 86 88 +Tri: 0 2972 1 +Tri: 3 2973 4 +Tri: 6 2974 7 +Tri: 9 2975 10 +Tri: 16 101 17 +Tri: 20 13 12 +Tri: 22 119 23 +Tri: 31 42 32 +Tri: 34 44 35 +Tri: 33 32 37 +Tri: 36 35 39 +Tri: 41 2976 42 +Tri: 43 45 44 +Tri: 45 212 46 +Tri: 44 46 50 +Tri: 31 33 51 +Tri: 35 50 52 +Tri: 33 38 53 +Tri: 49 48 29 +Tri: 55 2977 56 +Tri: 58 2978 59 +Tri: 61 2979 62 +Tri: 64 475 65 +Tri: 67 297 68 +Tri: 24 2980 70 +Tri: 71 2981 72 +Tri: 74 483 75 +Tri: 77 396 78 +Tri: 80 2982 81 +Tri: 83 2983 84 +Tri: 89 2984 90 +Tri: 95 210 96 +Tri: 16 102 101 +Tri: 102 2985 103 +Tri: 107 2986 108 +Tri: 110 2987 111 +Tri: 113 2988 114 +Tri: 104 116 117 +Tri: 6 8 20 +Tri: 11 10 55 +Tri: 127 2989 123 +Tri: 2989 128 123 +Tri: 63 2990 130 +Tri: 136 2991 2992 +Tri: 2992 2993 136 +Tri: 2993 2994 134 +Tri: 136 2993 134 +Tri: 137 2995 138 +Tri: 140 242 141 +Tri: 143 2996 144 +Tri: 146 2997 147 +Tri: 150 149 133 +Tri: 152 2998 153 +Tri: 155 560 156 +Tri: 158 2999 159 +Tri: 3000 162 161 +Tri: 162 3001 163 +Tri: 164 169 165 +Tri: 166 165 167 +Tri: 160 159 169 +Tri: 171 576 172 +Tri: 174 3002 175 +Tri: 177 3003 178 +Tri: 181 185 182 +Tri: 196 3004 197 +Tri: 192 200 202 +Tri: 204 193 195 +Tri: 206 3005 188 +Tri: 3005 3006 3007 +Tri: 188 3005 3007 +Tri: 168 170 207 +Tri: 50 27 211 +Tri: 212 3008 25 +Tri: 46 25 27 +Tri: 216 220 217 +Tri: 219 3009 217 +Tri: 221 3010 222 +Tri: 223 216 224 +Tri: 225 310 226 +Tri: 228 287 229 +Tri: 231 3011 232 +Tri: 124 236 234 +Tri: 237 3012 238 +Tri: 240 3013 241 +Tri: 243 3014 244 +Tri: 246 3015 247 +Tri: 249 3016 250 +Tri: 252 3017 253 +Tri: 255 3018 256 +Tri: 258 271 259 +Tri: 262 3019 263 +Tri: 265 258 266 +Tri: 268 272 269 +Tri: 273 3020 274 +Tri: 276 3021 277 +Tri: 279 284 280 +Tri: 275 3022 282 +Tri: 283 280 284 +Tri: 286 3023 287 +Tri: 288 231 233 +Tri: 291 3024 292 +Tri: 294 306 295 +Tri: 297 3025 298 +Tri: 93 92 299 +Tri: 302 318 303 +Tri: 305 295 306 +Tri: 309 3026 226 +Tri: 311 326 312 +Tri: 314 3027 315 +Tri: 317 695 318 +Tri: 319 3028 320 +Tri: 322 2971 323 +Tri: 327 291 293 +Tri: 329 308 218 +Tri: 332 3029 333 +Tri: 343 3030 344 +Tri: 340 342 346 +Tri: 348 3031 349 +Tri: 132 131 351 +Tri: 338 337 353 +Tri: 355 3032 356 +Tri: 52 211 358 +Tri: 53 38 360 +Tri: 39 52 359 +Tri: 40 39 362 +Tri: 38 37 364 +Tri: 365 3033 366 +Tri: 368 3034 369 +Tri: 374 378 375 +Tri: 379 3035 372 +Tri: 380 3036 381 +Tri: 383 119 120 +Tri: 385 3037 386 +Tri: 388 184 183 +Tri: 393 3038 24 +Tri: 394 303 396 +Tri: 397 402 398 +Tri: 400 3039 401 +Tri: 400 398 402 +Tri: 404 403 402 +Tri: 406 3040 407 +Tri: 409 3041 410 +Tri: 412 424 413 +Tri: 415 522 416 +Tri: 418 523 419 +Tri: 426 457 427 +Tri: 431 430 421 +Tri: 432 464 433 +Tri: 439 445 440 +Tri: 442 447 443 +Tri: 445 463 446 +Tri: 447 733 448 +Tri: 449 439 441 +Tri: 451 442 444 +Tri: 452 444 453 +Tri: 444 443 459 +Tri: 439 455 460 +Tri: 443 448 461 +Tri: 445 460 462 +Tri: 458 436 438 +Tri: 465 3042 466 +Tri: 468 3043 469 +Tri: 471 533 472 +Tri: 64 3044 474 +Tri: 476 3045 477 +Tri: 464 54 70 +Tri: 480 73 72 +Tri: 482 3046 75 +Tri: 484 3047 78 +Tri: 485 3048 486 +Tri: 488 3049 489 +Tri: 494 3050 495 +Tri: 95 3051 500 +Tri: 3052 506 505 +Tri: 506 426 428 +Tri: 510 3053 511 +Tri: 513 3054 514 +Tri: 516 3055 517 +Tri: 507 3056 520 +Tri: 415 429 431 +Tri: 523 3042 465 +Tri: 532 3057 527 +Tri: 3057 530 527 +Tri: 533 471 534 +Tri: 3058 3059 539 +Tri: 539 3060 540 +Tri: 540 3061 541 +Tri: 541 3058 539 +Tri: 542 3062 543 +Tri: 545 3063 546 +Tri: 548 672 549 +Tri: 551 3064 552 +Tri: 555 3065 537 +Tri: 556 3066 557 +Tri: 155 3067 559 +Tri: 561 572 562 +Tri: 3068 565 564 +Tri: 565 3069 566 +Tri: 567 570 568 +Tri: 570 573 571 +Tri: 572 567 569 +Tri: 171 3070 575 +Tri: 577 3071 578 +Tri: 580 3072 581 +Tri: 584 586 182 +Tri: 593 198 197 +Tri: 590 199 202 +Tri: 598 3073 592 +Tri: 3074 600 599 +Tri: 600 3075 588 +Tri: 3075 187 588 +Tri: 573 208 207 +Tri: 459 461 211 +Tri: 454 453 435 +Tri: 453 459 27 +Tri: 216 705 603 +Tri: 219 220 603 +Tri: 605 223 222 +Tri: 223 605 607 +Tri: 608 3076 609 +Tri: 611 3077 612 +Tri: 614 670 615 +Tri: 526 525 617 +Tri: 620 3078 621 +Tri: 623 547 624 +Tri: 626 3079 627 +Tri: 629 3080 630 +Tri: 632 3081 633 +Tri: 635 3082 636 +Tri: 638 3083 639 +Tri: 641 3084 642 +Tri: 645 648 646 +Tri: 649 3085 650 +Tri: 651 3086 652 +Tri: 654 663 655 +Tri: 657 3087 658 +Tri: 660 3088 661 +Tri: 663 654 664 +Tri: 666 3089 662 +Tri: 667 611 613 +Tri: 669 3090 670 +Tri: 673 704 674 +Tri: 676 3091 677 +Tri: 478 477 679 +Tri: 499 3092 681 +Tri: 683 766 303 +Tri: 684 3093 678 +Tri: 686 610 609 +Tri: 688 3094 689 +Tri: 691 3095 692 +Tri: 694 683 318 +Tri: 696 3096 697 +Tri: 699 3097 700 +Tri: 703 3098 704 +Tri: 706 3099 705 +Tri: 708 3100 709 +Tri: 719 3101 720 +Tri: 717 3102 722 +Tri: 723 3103 724 +Tri: 538 3104 726 +Tri: 714 3105 727 +Tri: 728 3106 729 +Tri: 461 732 358 +Tri: 462 3107 731 +Tri: 448 734 732 +Tri: 733 3108 734 +Tri: 463 731 735 +Tri: 736 3109 737 +Tri: 739 3110 740 +Tri: 745 3111 746 +Tri: 749 742 744 +Tri: 751 3112 752 +Tri: 754 3113 521 +Tri: 755 3114 756 +Tri: 758 3115 586 +Tri: 762 433 464 +Tri: 765 484 396 +Tri: 767 3116 768 +Tri: 770 768 771 +Tri: 770 774 769 +Tri: 773 3117 769 +Tri: 775 3118 776 +Tri: 778 857 779 +Tri: 780 779 781 +Tri: 783 3119 784 +Tri: 785 784 786 +Tri: 787 786 788 +Tri: 790 3120 791 +Tri: 792 791 793 +Tri: 794 793 795 +Tri: 797 862 798 +Tri: 799 798 800 +Tri: 801 800 802 +Tri: 804 863 805 +Tri: 807 3121 808 +Tri: 810 3120 790 +Tri: 812 3122 813 +Tri: 815 827 816 +Tri: 818 3123 819 +Tri: 821 3124 822 +Tri: 824 832 825 +Tri: 827 837 828 +Tri: 829 3125 830 +Tri: 832 806 805 +Tri: 833 782 781 +Tri: 835 824 826 +Tri: 837 829 831 +Tri: 838 841 839 +Tri: 841 843 842 +Tri: 843 845 844 +Tri: 845 821 823 +Tri: 846 3126 847 +Tri: 846 848 849 +Tri: 851 3123 818 +Tri: 853 850 849 +Tri: 853 854 851 +Tri: 795 812 814 +Tri: 858 3119 783 +Tri: 860 872 833 +Tri: 797 3127 861 +Tri: 866 874 867 +Tri: 869 810 811 +Tri: 3128 871 860 +Tri: 871 3129 872 +Tri: 873 3130 867 +Tri: 876 3131 858 +Tri: 858 859 876 +Tri: 877 3132 878 +Tri: 880 3133 877 +Tri: 881 803 802 +Tri: 884 3134 836 +Tri: 3134 835 836 +Tri: 830 3125 3135 +Tri: 3135 885 830 +Tri: 887 890 888 +Tri: 890 942 891 +Tri: 892 895 893 +Tri: 895 897 896 +Tri: 897 964 898 +Tri: 899 902 900 +Tri: 902 904 903 +Tri: 904 3136 905 +Tri: 906 909 907 +Tri: 909 911 910 +Tri: 911 991 912 +Tri: 913 940 914 +Tri: 916 3137 917 +Tri: 919 979 899 +Tri: 920 963 921 +Tri: 923 972 924 +Tri: 926 3138 927 +Tri: 929 953 930 +Tri: 932 944 933 +Tri: 925 924 935 +Tri: 937 945 938 +Tri: 934 933 914 +Tri: 941 3139 891 +Tri: 943 994 944 +Tri: 936 935 945 +Tri: 946 3140 947 +Tri: 948 947 949 +Tri: 950 949 951 +Tri: 952 951 953 +Tri: 954 958 955 +Tri: 954 961 957 +Tri: 959 3141 926 +Tri: 960 962 957 +Tri: 960 3141 959 +Tri: 905 3136 963 +Tri: 967 984 892 +Tri: 968 3139 941 +Tri: 906 908 970 +Tri: 975 3142 976 +Tri: 978 3143 979 +Tri: 3144 980 969 +Tri: 980 3145 968 +Tri: 981 977 976 +Tri: 967 3146 983 +Tri: 983 3147 984 +Tri: 985 3148 986 +Tri: 988 3148 985 +Tri: 990 3149 912 +Tri: 943 3150 994 +Tri: 3150 992 994 +Tri: 996 939 938 +Tri: 938 3151 995 +Tri: 997 1405 998 +Tri: 999 998 1000 +Tri: 1001 1000 1002 +Tri: 1003 1002 1004 +Tri: 1005 1004 1006 +Tri: 1007 1006 1008 +Tri: 1009 1008 1010 +Tri: 1011 1010 1012 +Tri: 1013 1012 1014 +Tri: 1015 1014 1016 +Tri: 1017 1016 1018 +Tri: 1019 1018 1020 +Tri: 1022 1026 1023 +Tri: 1025 1028 1026 +Tri: 1027 1030 1028 +Tri: 1029 1032 1030 +Tri: 1031 1034 1032 +Tri: 1033 1036 1034 +Tri: 1035 1038 1036 +Tri: 1037 1040 1038 +Tri: 1039 1042 1040 +Tri: 1041 1044 1042 +Tri: 1043 1046 1044 +Tri: 1045 1449 1046 +Tri: 1047 3152 1048 +Tri: 1050 1053 1051 +Tri: 1053 1055 1054 +Tri: 1055 1457 1056 +Tri: 1057 3153 1058 +Tri: 1060 1057 1059 +Tri: 1062 1060 1061 +Tri: 1064 1062 1063 +Tri: 1066 1115 1067 +Tri: 1069 1088 1070 +Tri: 1072 1089 1073 +Tri: 1075 1090 1076 +Tri: 1078 1091 1079 +Tri: 1081 1482 1082 +Tri: 1084 1069 1071 +Tri: 1086 1072 1074 +Tri: 1088 1075 1077 +Tri: 1089 1078 1080 +Tri: 1090 1081 1083 +Tri: 1091 1084 1085 +Tri: 1092 1086 1087 +Tri: 1094 1493 1095 +Tri: 1097 1066 1068 +Tri: 1099 1094 1096 +Tri: 1101 1097 1098 +Tri: 1103 1099 1100 +Tri: 1105 1101 1102 +Tri: 1107 1103 1104 +Tri: 1109 1105 1106 +Tri: 1111 1107 1108 +Tri: 1113 1111 1112 +Tri: 1115 1113 1114 +Tri: 1116 1131 1117 +Tri: 1119 1515 1120 +Tri: 1122 1376 1123 +Tri: 1125 1119 1121 +Tri: 1127 1122 1124 +Tri: 1129 1125 1126 +Tri: 1131 1127 1128 +Tri: 1132 1129 1130 +Tri: 3154 1135 1134 +Tri: 1135 3155 1047 +Tri: 3155 3152 1047 +Tri: 1136 3156 1137 +Tri: 3157 3158 1141 +Tri: 3158 1139 1141 +Tri: 1145 3159 1146 +Tri: 3160 3161 1150 +Tri: 3161 1148 1150 +Tri: 1151 1154 1152 +Tri: 1154 1156 1155 +Tri: 1156 1158 1157 +Tri: 1158 1160 1159 +Tri: 1160 1162 1161 +Tri: 1162 1164 1163 +Tri: 1164 1166 1165 +Tri: 1166 1168 1167 +Tri: 1168 1170 1169 +Tri: 1170 1172 1171 +Tri: 1172 1174 1173 +Tri: 1174 1566 1175 +Tri: 1176 1568 1177 +Tri: 1179 1176 1178 +Tri: 1181 1179 1180 +Tri: 1183 1181 1182 +Tri: 1185 1183 1184 +Tri: 1187 1185 1186 +Tri: 1189 1187 1188 +Tri: 1191 1189 1190 +Tri: 1193 1191 1192 +Tri: 1195 1193 1194 +Tri: 1197 1195 1196 +Tri: 1199 1197 1198 +Tri: 1201 3162 1202 +Tri: 1204 3163 1205 +Tri: 1206 1205 1207 +Tri: 1208 1207 1209 +Tri: 1211 1215 1212 +Tri: 1214 1217 1215 +Tri: 1216 1219 1217 +Tri: 1218 1605 1219 +Tri: 1220 1252 1221 +Tri: 1223 1239 1224 +Tri: 1226 1241 1227 +Tri: 1229 1242 1230 +Tri: 1232 1243 1233 +Tri: 1235 1244 1236 +Tri: 1238 1245 1239 +Tri: 1240 1247 1241 +Tri: 1225 1224 1242 +Tri: 1228 1227 1243 +Tri: 1231 1230 1244 +Tri: 1234 1233 1245 +Tri: 1246 1631 1247 +Tri: 1248 1254 1249 +Tri: 1251 1256 1252 +Tri: 1253 1258 1254 +Tri: 1255 1260 1256 +Tri: 1257 1262 1258 +Tri: 1259 1264 1260 +Tri: 1261 1266 1262 +Tri: 1263 1646 1264 +Tri: 1265 1268 1266 +Tri: 1267 1269 1268 +Tri: 1222 1221 1269 +Tri: 1270 1287 1271 +Tri: 1273 1279 1274 +Tri: 1276 1297 1277 +Tri: 1279 1283 1280 +Tri: 1281 1273 1275 +Tri: 1283 1285 1284 +Tri: 1285 1292 1286 +Tri: 1287 1281 1282 +Tri: 1288 1270 1272 +Tri: 1290 1288 1289 +Tri: 1292 1276 1278 +Tri: 3164 3165 1293 +Tri: 3165 1294 1293 +Tri: 1294 3166 3167 +Tri: 3167 3168 1295 +Tri: 1295 3169 3170 +Tri: 3170 3171 3172 +Tri: 3172 3173 1293 +Tri: 1294 3167 1295 +Tri: 1295 3170 3172 +Tri: 3172 1293 1295 +Tri: 1296 3174 1201 +Tri: 3174 3175 1677 +Tri: 1201 3174 1677 +Tri: 1297 1679 1298 +Tri: 1299 3176 1300 +Tri: 1304 3177 1302 +Tri: 3177 3178 1302 +Tri: 1305 1393 1306 +Tri: 1313 3179 1311 +Tri: 3179 3180 1311 +Tri: 1314 1338 1315 +Tri: 1317 1314 1316 +Tri: 1319 1317 1318 +Tri: 1321 1703 1322 +Tri: 1324 1319 1320 +Tri: 1326 1321 1323 +Tri: 1328 1324 1325 +Tri: 1330 1326 1327 +Tri: 1332 1328 1329 +Tri: 1334 1330 1331 +Tri: 1336 1334 1335 +Tri: 1338 1336 1337 +Tri: 1339 1342 1340 +Tri: 1342 1344 1343 +Tri: 1344 1349 1345 +Tri: 1346 1351 1347 +Tri: 1349 1353 1350 +Tri: 1351 1355 1352 +Tri: 1353 1357 1354 +Tri: 1355 1359 1356 +Tri: 1357 1735 1358 +Tri: 1359 1361 1360 +Tri: 1361 1363 1362 +Tri: 1363 1339 1341 +Tri: 1365 1142 1368 +Tri: 1371 1370 1309 +Tri: 1374 1132 1133 +Tri: 1376 1380 1377 +Tri: 1378 1374 1375 +Tri: 1380 1378 1379 +Tri: 3181 3182 1382 +Tri: 1382 1758 3183 +Tri: 3183 3184 1383 +Tri: 1383 3185 3186 +Tri: 3186 3187 3188 +Tri: 3188 3189 1381 +Tri: 1381 3181 1382 +Tri: 1382 3183 1383 +Tri: 1383 3186 3188 +Tri: 3188 1381 1383 +Tri: 1384 1387 1385 +Tri: 1387 1389 1388 +Tri: 1389 1391 1390 +Tri: 1391 1768 1392 +Tri: 1393 1402 1394 +Tri: 1395 3190 1396 +Tri: 1398 3191 1399 +Tri: 1147 1146 1306 +Tri: 997 1406 1404 +Tri: 1406 1408 1407 +Tri: 1408 1410 1409 +Tri: 1410 1412 1411 +Tri: 1412 1414 1413 +Tri: 1414 1416 1415 +Tri: 1416 1418 1417 +Tri: 1418 1420 1419 +Tri: 1420 1422 1421 +Tri: 1422 1424 1423 +Tri: 1424 1426 1425 +Tri: 1426 1021 1020 +Tri: 1427 1024 1023 +Tri: 1429 1427 1428 +Tri: 1431 1429 1430 +Tri: 1433 1431 1432 +Tri: 1435 1433 1434 +Tri: 1437 1435 1436 +Tri: 1439 1437 1438 +Tri: 1441 1439 1440 +Tri: 1443 1441 1442 +Tri: 1445 1443 1444 +Tri: 1447 1445 1446 +Tri: 1045 1447 1448 +Tri: 1047 3192 1450 +Tri: 1452 3193 1453 +Tri: 1454 1453 1455 +Tri: 1456 1455 1056 +Tri: 1458 1462 1459 +Tri: 1461 1464 1462 +Tri: 1463 1465 1464 +Tri: 1064 1065 1465 +Tri: 1466 1495 1467 +Tri: 1469 1484 1470 +Tri: 1472 1486 1473 +Tri: 1475 1487 1476 +Tri: 1478 1488 1479 +Tri: 1481 1489 1082 +Tri: 1483 1490 1484 +Tri: 1485 1491 1486 +Tri: 1471 1470 1487 +Tri: 1474 1473 1488 +Tri: 1477 1476 1489 +Tri: 1480 1479 1490 +Tri: 1092 1093 1491 +Tri: 1492 1497 1095 +Tri: 1494 1499 1495 +Tri: 1496 1501 1497 +Tri: 1498 1503 1499 +Tri: 1500 1505 1501 +Tri: 1502 1506 1503 +Tri: 1504 1508 1505 +Tri: 1109 1110 1506 +Tri: 1507 1510 1508 +Tri: 1509 1511 1510 +Tri: 1468 1467 1511 +Tri: 1116 1118 1512 +Tri: 1514 1520 1120 +Tri: 1516 1522 1517 +Tri: 1519 1524 1520 +Tri: 1521 1525 1522 +Tri: 1523 1527 1524 +Tri: 1513 1512 1525 +Tri: 1526 1752 1527 +Tri: 1528 3194 1047 +Tri: 3194 3195 1134 +Tri: 1047 3194 1134 +Tri: 1529 3196 1530 +Tri: 1534 3197 1532 +Tri: 3197 3198 1532 +Tri: 1538 1776 1539 +Tri: 1543 3199 1541 +Tri: 3199 3200 1541 +Tri: 1151 1153 1544 +Tri: 1545 1544 1546 +Tri: 1547 1546 1548 +Tri: 1549 1548 1550 +Tri: 1551 1550 1552 +Tri: 1553 1552 1554 +Tri: 1555 1554 1556 +Tri: 1557 1556 1558 +Tri: 1559 1558 1560 +Tri: 1561 1560 1562 +Tri: 1563 1562 1564 +Tri: 1565 1564 1175 +Tri: 1567 1570 1177 +Tri: 1569 1572 1570 +Tri: 1571 1574 1572 +Tri: 1573 1576 1574 +Tri: 1575 1578 1576 +Tri: 1577 1580 1578 +Tri: 1579 1582 1580 +Tri: 1581 1584 1582 +Tri: 1583 1586 1584 +Tri: 1585 1588 1586 +Tri: 1587 1589 1588 +Tri: 1199 1200 1589 +Tri: 1201 3201 1590 +Tri: 1592 1595 1593 +Tri: 1595 1597 1596 +Tri: 1597 1210 1209 +Tri: 1598 3202 1599 +Tri: 1601 1598 1600 +Tri: 1603 1601 1602 +Tri: 1218 1603 1604 +Tri: 1606 1651 1607 +Tri: 1609 1627 1610 +Tri: 1612 1628 1613 +Tri: 1615 1629 1616 +Tri: 1618 1630 1619 +Tri: 1621 1237 1236 +Tri: 1623 1609 1611 +Tri: 1625 1612 1614 +Tri: 1627 1615 1617 +Tri: 1628 1618 1620 +Tri: 1629 1621 1622 +Tri: 1630 1623 1624 +Tri: 1246 1625 1626 +Tri: 1632 1250 1249 +Tri: 1634 1606 1608 +Tri: 1636 1632 1633 +Tri: 1638 1634 1635 +Tri: 1640 1636 1637 +Tri: 1642 1638 1639 +Tri: 1644 1640 1641 +Tri: 1263 1642 1643 +Tri: 1647 1644 1645 +Tri: 1649 1647 1648 +Tri: 1651 1649 1650 +Tri: 1652 1671 1653 +Tri: 1655 1664 1656 +Tri: 1658 1673 1659 +Tri: 1657 1656 1661 +Tri: 1663 1669 1664 +Tri: 1662 1661 1665 +Tri: 1666 1665 1667 +Tri: 1654 1653 1669 +Tri: 1670 1672 1671 +Tri: 1290 1291 1672 +Tri: 1668 1667 1673 +Tri: 1294 3203 3166 +Tri: 3203 1676 3166 +Tri: 1676 3204 3205 +Tri: 3205 3206 3207 +Tri: 3207 3208 1674 +Tri: 1674 3209 1675 +Tri: 1675 3210 1676 +Tri: 3210 3166 1676 +Tri: 1676 3205 3207 +Tri: 3207 1674 1676 +Tri: 3211 1678 1677 +Tri: 1678 3212 1201 +Tri: 3212 3201 1201 +Tri: 1660 1659 1298 +Tri: 1680 3213 1681 +Tri: 3214 3215 1685 +Tri: 3215 1683 1685 +Tri: 1686 3216 1687 +Tri: 3217 3218 1694 +Tri: 3218 1692 1694 +Tri: 1695 1699 1696 +Tri: 1698 1701 1699 +Tri: 1700 1705 1701 +Tri: 1702 1707 1322 +Tri: 1704 1709 1705 +Tri: 1706 1711 1707 +Tri: 1708 1712 1709 +Tri: 1710 1714 1711 +Tri: 1332 1333 1712 +Tri: 1713 1716 1714 +Tri: 1715 1717 1716 +Tri: 1697 1696 1717 +Tri: 1718 1740 1719 +Tri: 1720 1719 1721 +Tri: 1722 1721 1723 +Tri: 1346 1348 1725 +Tri: 1724 1723 1727 +Tri: 1726 1725 1729 +Tri: 1728 1727 1731 +Tri: 1730 1729 1733 +Tri: 1732 1731 1358 +Tri: 1734 1733 1736 +Tri: 1737 1736 1738 +Tri: 1739 1738 1740 +Tri: 1743 1744 1745 +Tri: 1747 1689 1691 +Tri: 1751 1756 1752 +Tri: 1518 1517 1753 +Tri: 1755 1757 1756 +Tri: 1754 1753 1757 +Tri: 1382 3219 1759 +Tri: 1759 3220 3221 +Tri: 3221 3222 1760 +Tri: 1760 3223 3224 +Tri: 3223 3225 3224 +Tri: 3225 3226 3224 +Tri: 3224 3227 1758 +Tri: 1758 1382 1759 +Tri: 1759 3221 1760 +Tri: 3224 1758 1760 +Tri: 1761 3228 1762 +Tri: 1763 1762 1764 +Tri: 1765 1764 1766 +Tri: 1767 1766 1392 +Tri: 1688 1776 1769 +Tri: 1771 1397 1396 +Tri: 1773 1400 1399 +Tri: 1776 1688 1687 +Tri: 1778 1793 1779 +Tri: 1780 1779 1781 +Tri: 1782 1781 1783 +Tri: 1784 1783 1785 +Tri: 1789 3229 1787 +Tri: 1787 3230 1788 +Tri: 1788 3231 1789 +Tri: 1790 3232 1791 +Tri: 1792 1791 1793 +Tri: 1794 1809 1795 +Tri: 1796 1795 1797 +Tri: 1798 1797 1799 +Tri: 1800 1799 1801 +Tri: 1805 3233 1803 +Tri: 3233 3234 1803 +Tri: 3234 3235 1803 +Tri: 1806 3236 1807 +Tri: 1808 1807 1809 +Tri: 1810 1825 1811 +Tri: 1812 1811 1813 +Tri: 1814 1813 1815 +Tri: 1816 1815 1817 +Tri: 1821 3237 1819 +Tri: 3237 3238 1819 +Tri: 3238 3239 1819 +Tri: 1818 1817 1822 +Tri: 1824 3240 1825 +Tri: 1826 3241 1827 +Tri: 1828 1827 1829 +Tri: 1830 1829 1831 +Tri: 1832 1831 1833 +Tri: 1837 3242 1835 +Tri: 3242 3243 1835 +Tri: 3243 3244 1835 +Tri: 1834 1833 1838 +Tri: 1839 1838 1840 +Tri: 1842 1857 1843 +Tri: 1844 1843 1845 +Tri: 1846 1845 1847 +Tri: 1848 1847 1849 +Tri: 1853 3245 1851 +Tri: 3245 3246 1851 +Tri: 3246 3247 1851 +Tri: 1854 3248 1855 +Tri: 1856 1855 1857 +Tri: 1858 1873 1859 +Tri: 1860 1859 1861 +Tri: 1862 1861 1863 +Tri: 1865 3249 1866 +Tri: 1869 3250 1870 +Tri: 1870 3251 3252 +Tri: 3252 1868 1870 +Tri: 1867 1866 1871 +Tri: 1872 1871 1873 +Tri: 1874 1889 1875 +Tri: 1876 1875 1877 +Tri: 1878 1877 1879 +Tri: 1880 1879 1881 +Tri: 1885 3253 1883 +Tri: 3253 3254 1883 +Tri: 3254 3255 1883 +Tri: 1882 1881 1886 +Tri: 1888 3256 1889 +Tri: 1890 1893 1891 +Tri: 1893 1895 1894 +Tri: 1895 1897 1896 +Tri: 1897 3257 1898 +Tri: 1901 3258 1899 +Tri: 1899 3259 1900 +Tri: 1900 3260 1901 +Tri: 1902 1905 1903 +Tri: 1905 1890 1892 +Tri: 1906 1909 1907 +Tri: 1909 1911 1910 +Tri: 1911 1913 1912 +Tri: 1913 3261 1914 +Tri: 1917 3262 1915 +Tri: 3262 3263 1915 +Tri: 3263 3264 1915 +Tri: 1918 1921 1919 +Tri: 1921 1906 1908 +Tri: 1922 1925 1923 +Tri: 1925 1927 1926 +Tri: 1927 1929 1928 +Tri: 1929 1934 1930 +Tri: 1933 3265 1931 +Tri: 1931 3266 1932 +Tri: 1932 3267 1933 +Tri: 1934 3268 1935 +Tri: 1936 1922 1924 +Tri: 1938 1941 1939 +Tri: 1941 1943 1942 +Tri: 1943 1945 1944 +Tri: 1945 1950 1946 +Tri: 1948 3269 1949 +Tri: 1949 3270 3271 +Tri: 3271 1947 1949 +Tri: 1950 1952 1951 +Tri: 1952 3272 1953 +Tri: 1954 1957 1955 +Tri: 1957 1959 1958 +Tri: 1959 1961 1960 +Tri: 1961 3273 1962 +Tri: 1965 3274 1963 +Tri: 3274 3275 1963 +Tri: 3275 3276 1963 +Tri: 1966 1969 1967 +Tri: 1969 1954 1956 +Tri: 1970 1973 1971 +Tri: 1973 1975 1974 +Tri: 1975 3277 1976 +Tri: 1977 1983 1978 +Tri: 1982 3278 1980 +Tri: 3278 3279 1980 +Tri: 3279 3280 1980 +Tri: 1983 1985 1984 +Tri: 1985 1970 1972 +Tri: 1986 1989 1987 +Tri: 1989 1991 1990 +Tri: 1991 1993 1992 +Tri: 1993 1998 1994 +Tri: 1997 3281 1995 +Tri: 3281 3282 1995 +Tri: 3282 3283 1995 +Tri: 1998 3284 1999 +Tri: 2000 1986 1988 +Tri: 2006 2038 2007 +Tri: 2009 3285 2010 +Tri: 2012 3286 2013 +Tri: 2015 3287 2016 +Tri: 2018 3288 2019 +Tri: 2024 3289 2025 +Tri: 2027 3290 2028 +Tri: 2030 2059 2031 +Tri: 2037 3291 2007 +Tri: 2039 2041 3292 +Tri: 2042 2044 3293 +Tri: 2015 2017 2045 +Tri: 2047 3294 2048 +Tri: 2053 3295 2054 +Tri: 2056 2029 2028 +Tri: 2058 3296 2031 +Tri: 2060 3297 2061 +Tri: 2063 2073 2064 +Tri: 2066 2245 2067 +Tri: 2069 2072 2070 +Tri: 2072 2066 2068 +Tri: 2073 2075 2074 +Tri: 2075 2251 2076 +Tri: 2077 2083 2078 +Tri: 2080 2255 2081 +Tri: 2083 2080 2082 +Tri: 2083 2077 2084 +Tri: 2086 2083 2085 +Tri: 2088 2086 2087 +Tri: 2090 3298 2091 +Tri: 2093 2090 2092 +Tri: 2095 2093 2094 +Tri: 2097 2095 2096 +Tri: 2099 2102 2100 +Tri: 2102 2104 2103 +Tri: 2104 2106 2105 +Tri: 2106 2099 2101 +Tri: 2107 2110 2108 +Tri: 2110 2112 2111 +Tri: 2112 2114 2113 +Tri: 2114 2107 2109 +Tri: 2116 2119 2118 +Tri: 2119 2121 2120 +Tri: 2121 2129 2122 +Tri: 2123 2126 2124 +Tri: 2126 2131 2127 +Tri: 2129 2123 2125 +Tri: 2131 2116 2115 +Tri: 2133 3299 2134 +Tri: 2136 3300 2137 +Tri: 2139 3301 2140 +Tri: 2142 2312 2143 +Tri: 2145 3302 2146 +Tri: 2148 3303 2149 +Tri: 2151 2214 2152 +Tri: 2154 3304 2155 +Tri: 2157 3305 2158 +Tri: 2160 3306 2161 +Tri: 2163 3307 2164 +Tri: 2166 3308 2167 +Tri: 2169 3309 2170 +Tri: 2172 3310 2173 +Tri: 2175 3311 2176 +Tri: 2178 3312 2179 +Tri: 2181 2349 2182 +Tri: 2184 3313 2185 +Tri: 2187 3314 2188 +Tri: 2190 3315 2191 +Tri: 2193 3316 2194 +Tri: 2196 3317 2197 +Tri: 2199 2366 2200 +Tri: 2202 3318 2203 +Tri: 2205 3319 2206 +Tri: 2208 3320 2209 +Tri: 2211 3321 2212 +Tri: 2214 3322 2215 +Tri: 2216 2380 2217 +Tri: 2219 3323 2220 +Tri: 2222 3324 2223 +Tri: 2225 3325 2226 +Tri: 2228 3326 2229 +Tri: 2231 3327 2232 +Tri: 2234 3328 2235 +Tri: 2132 2128 2130 +Tri: 2128 2115 2117 +Tri: 2237 3329 2238 +Tri: 2060 2062 2240 +Tri: 2063 2065 2242 +Tri: 2244 2248 2067 +Tri: 2069 2071 2246 +Tri: 2247 2246 2248 +Tri: 2243 2242 2249 +Tri: 2250 2249 2076 +Tri: 2077 2079 2252 +Tri: 2254 2256 2081 +Tri: 2253 2252 2256 +Tri: 2253 2258 2084 +Tri: 2257 2259 2258 +Tri: 2088 2089 2259 +Tri: 2260 2264 2261 +Tri: 2263 2266 2264 +Tri: 2265 2268 2266 +Tri: 2267 3330 2268 +Tri: 2269 2276 2270 +Tri: 2271 2270 2272 +Tri: 2273 2272 2274 +Tri: 2275 2274 2276 +Tri: 2277 2284 2278 +Tri: 2279 2278 2280 +Tri: 2281 2280 2282 +Tri: 2283 2282 2284 +Tri: 2287 2286 2288 +Tri: 2289 2288 2290 +Tri: 2291 2290 2292 +Tri: 2294 2301 2295 +Tri: 2296 2295 2297 +Tri: 2293 2300 2301 +Tri: 2298 2398 2285 +Tri: 2302 3331 2303 +Tri: 2305 3332 2306 +Tri: 2308 3333 2309 +Tri: 2311 3334 2143 +Tri: 2313 3335 2314 +Tri: 2316 3336 2317 +Tri: 2319 3337 2320 +Tri: 2322 3338 2323 +Tri: 2325 3339 2326 +Tri: 2328 3340 2329 +Tri: 2331 3341 2332 +Tri: 2166 2168 2334 +Tri: 2336 3342 2337 +Tri: 2339 3343 2340 +Tri: 2342 3344 2343 +Tri: 2345 3345 2346 +Tri: 2348 3346 2182 +Tri: 2350 3347 2351 +Tri: 2353 3348 2354 +Tri: 2356 3349 2357 +Tri: 2359 3350 2360 +Tri: 2362 3351 2363 +Tri: 2365 3352 2200 +Tri: 2367 3353 2368 +Tri: 2205 2207 2370 +Tri: 2208 2210 2372 +Tri: 2374 3354 2375 +Tri: 2321 2320 2377 +Tri: 2379 3355 2217 +Tri: 2381 3356 2382 +Tri: 2384 3357 2385 +Tri: 2387 3358 2388 +Tri: 2228 2230 2390 +Tri: 2392 3359 2393 +Tri: 2395 3360 2396 +Tri: 2398 2297 2300 +Tri: 2299 2292 2286 +Tri: 2399 2239 2238 +Tri: 2401 3361 2402 +Tri: 2404 3362 2405 +Tri: 2407 3363 2408 +Tri: 3364 2411 2410 +Tri: 2411 3365 2412 +Tri: 2416 3366 2417 +Tri: 2419 3367 2420 +Tri: 2422 3368 2414 +Tri: 2423 3369 2424 +Tri: 2428 3370 3371 +Tri: 3371 3372 2428 +Tri: 3372 2426 2428 +Tri: 2429 3373 2430 +Tri: 2432 3374 2433 +Tri: 2435 3375 2436 +Tri: 2438 3376 2439 +Tri: 3377 2442 2441 +Tri: 2442 3378 2443 +Tri: 2447 3379 2448 +Tri: 2450 3380 2451 +Tri: 2453 2444 2446 +Tri: 2455 3381 2456 +Tri: 2459 3382 2460 +Tri: 2460 3383 3384 +Tri: 3384 2458 2460 +Tri: 2461 3385 2462 +Tri: 2464 3386 2465 +Tri: 2467 3387 2468 +Tri: 2470 3388 2471 +Tri: 3389 2474 2473 +Tri: 2474 3390 2475 +Tri: 2479 3391 2480 +Tri: 2482 3392 2483 +Tri: 2485 2476 2478 +Tri: 2487 3393 2488 +Tri: 2491 3394 2492 +Tri: 2492 3395 3396 +Tri: 3396 2490 2492 +Tri: 2493 3397 2494 +Tri: 2496 3398 2497 +Tri: 2499 3399 2500 +Tri: 2502 3400 2503 +Tri: 3401 2506 2505 +Tri: 2506 3402 2507 +Tri: 2511 3403 2512 +Tri: 2514 3404 2515 +Tri: 2517 3405 2509 +Tri: 2518 3406 2519 +Tri: 2523 3407 3408 +Tri: 3408 3409 2523 +Tri: 3409 2521 2523 +Tri: 2524 3410 2525 +Tri: 2527 3411 2528 +Tri: 2530 3412 2531 +Tri: 2533 3413 2534 +Tri: 2536 3414 2537 +Tri: 2539 3415 2540 +Tri: 2542 3416 2543 +Tri: 2544 2543 2545 +Tri: 2548 3417 2550 +Tri: 2551 3418 2552 +Tri: 2554 3419 2555 +Tri: 2557 3420 2558 +Tri: 2560 3421 2561 +Tri: 2563 3422 2564 +Tri: 2566 2569 2567 +Tri: 2569 2546 2545 +Tri: 2572 2571 2573 +Tri: 2578 2582 2576 +Tri: 2578 2579 2581 +Tri: 2586 2598 2587 +Tri: 2589 2586 2588 +Tri: 2592 3423 2593 +Tri: 2595 2610 2596 +Tri: 2592 2594 2584 +Tri: 2591 3424 2598 +Tri: 2602 2588 2587 +Tri: 2604 2590 2588 +Tri: 2606 2611 2607 +Tri: 2609 3425 2596 +Tri: 2606 2599 2601 +Tri: 2605 2602 2603 +Tri: 2613 3426 2614 +Tri: 2616 3427 2617 +Tri: 2619 2665 2620 +Tri: 2622 2637 2623 +Tri: 2625 2661 2626 +Tri: 2628 3428 2629 +Tri: 2631 2670 2632 +Tri: 2634 2732 2635 +Tri: 2637 2726 2638 +Tri: 2639 2631 2633 +Tri: 2641 3429 2642 +Tri: 2644 3430 2645 +Tri: 2647 3431 2648 +Tri: 2650 3432 2651 +Tri: 2653 3433 2654 +Tri: 2656 2663 2657 +Tri: 2659 2639 2640 +Tri: 2661 2666 2662 +Tri: 2663 2668 2664 +Tri: 2665 2622 2624 +Tri: 2666 2672 2667 +Tri: 2668 2730 2669 +Tri: 2670 2727 2671 +Tri: 2672 3434 2673 +Tri: 2674 3435 2675 +Tri: 2677 3436 2678 +Tri: 2680 3437 2681 +Tri: 2683 3438 2684 +Tri: 2686 3439 2687 +Tri: 2689 3440 2690 +Tri: 2692 3441 2693 +Tri: 2695 3442 2696 +Tri: 2698 3443 2699 +Tri: 2701 3444 2702 +Tri: 2710 3445 2711 +Tri: 2713 3446 2714 +Tri: 2716 3447 2717 +Tri: 2719 3448 2720 +Tri: 2722 2707 2709 +Tri: 2724 2704 2706 +Tri: 2726 2625 2627 +Tri: 2727 3449 2728 +Tri: 2730 2659 2660 +Tri: 2731 2635 2732 +Tri: 2734 2737 2735 +Tri: 2737 3450 2738 +Tri: 2741 2628 2630 +Tri: 2744 3451 2745 +Tri: 2747 3452 2748 +Tri: 2750 3453 2751 +Tri: 2753 2796 2754 +Tri: 2756 2855 2757 +Tri: 2759 2872 2760 +Tri: 2762 2771 2763 +Tri: 2765 2867 2766 +Tri: 2755 2754 2768 +Tri: 2770 2791 2771 +Tri: 2772 3454 2773 +Tri: 2775 3455 2776 +Tri: 2778 3456 2779 +Tri: 2781 3457 2782 +Tri: 2784 3458 2785 +Tri: 2787 3459 2788 +Tri: 2790 2860 2791 +Tri: 2758 2757 2792 +Tri: 2789 2788 2794 +Tri: 2752 2751 2796 +Tri: 2793 2792 2797 +Tri: 2795 2794 2799 +Tri: 2764 2763 2801 +Tri: 2798 2797 2803 +Tri: 2805 2859 2806 +Tri: 2808 3460 2809 +Tri: 2811 3461 2812 +Tri: 2814 2874 2815 +Tri: 2817 3462 2818 +Tri: 2820 3463 2821 +Tri: 2823 3464 2824 +Tri: 2826 3465 2827 +Tri: 2829 3466 2830 +Tri: 2832 3467 2833 +Tri: 2841 3468 2842 +Tri: 2844 3469 2845 +Tri: 2847 3470 2848 +Tri: 2850 3471 2851 +Tri: 2853 3472 2839 +Tri: 2854 3473 2836 +Tri: 2769 2768 2855 +Tri: 2802 2801 2856 +Tri: 2800 2799 2860 +Tri: 2861 3474 2767 +Tri: 2862 2870 2863 +Tri: 2864 2863 2865 +Tri: 2871 3475 2872 +Tri: 2875 2897 2876 +Tri: 2878 2882 2879 +Tri: 2878 2884 2881 +Tri: 2883 3476 2881 +Tri: 2885 3477 2886 +Tri: 2888 2894 2889 +Tri: 2891 3478 2880 +Tri: 2892 2885 2887 +Tri: 2894 3479 2895 +Tri: 2896 3480 2876 +Tri: 2898 3481 2899 +Tri: 2901 2915 2902 +Tri: 2901 2903 2904 +Tri: 2906 2905 2904 +Tri: 2908 2918 2909 +Tri: 2911 3482 2912 +Tri: 2914 2902 2915 +Tri: 2917 3483 2918 +Tri: 2913 2912 2919 +Tri: 2921 2900 2899 +Tri: 2923 3484 2924 +Tri: 2926 2923 2925 +Tri: 2928 3485 2929 +Tri: 2931 3486 2932 +Tri: 2934 2942 2935 +Tri: 2937 2928 2930 +Tri: 2939 3487 2940 +Tri: 2942 3488 2943 +Tri: 2941 2940 2944 +Tri: 2945 2944 2933 +Tri: 2946 2950 2947 +Tri: 2949 3489 2950 +Tri: 2951 2961 2952 +Tri: 2954 2970 2955 +Tri: 2957 3490 2958 +Tri: 2960 3491 2961 +Tri: 2962 2967 2963 +Tri: 2959 2958 2965 +Tri: 2967 2969 2968 +Tri: 2969 2955 2970 diff --git a/src/Game.cpp b/src/Game.cpp index 5ce7e6c..0e8d9a3 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -26,8 +26,8 @@ namespace ZL #ifdef EMSCRIPTEN const char* CONST_ZIP_FILE = "resources.zip"; #else - const char* CONST_ZIP_FILE = "C:\\Work\\Projects\\space-game001\\resources.zip"; - //const char* CONST_ZIP_FILE = ""; + //const char* CONST_ZIP_FILE = "C:\\Work\\Projects\\space-game001\\resources.zip"; + const char* CONST_ZIP_FILE = ""; #endif static bool g_exitBgAnimating = false; @@ -440,12 +440,27 @@ namespace ZL //spaceshipBase = LoadFromTextFile02("./resources/spaceship006x.txt", CONST_ZIP_FILE); //spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI / 2.0, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); + spaceshipTexture = std::make_unique(CreateTextureDataFromPng("resources/MainCharacter_Base_color_sRGB.png", CONST_ZIP_FILE)); spaceshipBase = LoadFromTextFile02("resources/spaceshipnew001.txt", CONST_ZIP_FILE); spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); spaceshipBase.Move(Vector3f{ 1.2, 0, -5 }); + /* + spaceshipTexture = std::make_unique(CreateTextureDataFromPng("resources/Cargo_Base_color_sRGB.png", CONST_ZIP_FILE)); + spaceshipBase = LoadFromTextFile02("resources/cargoship001.txt", CONST_ZIP_FILE); + + auto quat = Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI*0.5, Eigen::Vector3f::UnitZ())); + auto rotMatrix = quat.toRotationMatrix(); + spaceshipBase.RotateByMatrix(rotMatrix); + + auto quat2 = Eigen::Quaternionf(Eigen::AngleAxisf(M_PI*0.5, Eigen::Vector3f::UnitY())); + auto rotMatrix2 = quat2.toRotationMatrix(); + spaceshipBase.RotateByMatrix(rotMatrix2); + + //spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); + */ spaceship.AssignFrom(spaceshipBase); spaceship.RefreshVBO(); @@ -835,7 +850,7 @@ namespace ZL for (auto const& [id, remotePlayer] : remotePlayerStates) { -//<<<<<<< HEAD + //<<<<<<< HEAD const ClientState& st = remotePlayer; // Позиция корабля в мире Vector3f shipWorld = st.position; @@ -1391,8 +1406,17 @@ namespace ZL #endif } render(); + + if (networkClient) { +#ifndef NETWORK + auto localClient = dynamic_cast(networkClient.get()); + if (localClient) { + localClient->setLocalPlayerState(Environment::shipState); + } +#endif + networkClient->Poll(); + } mainThreadHandler.processMainThreadTasks(); - networkClient->Poll(); if (networkClient) { auto pending = networkClient->getPendingProjectiles(); diff --git a/src/network/LocalClient.cpp b/src/network/LocalClient.cpp index b460a6f..b6fc7f6 100644 --- a/src/network/LocalClient.cpp +++ b/src/network/LocalClient.cpp @@ -1,20 +1,288 @@ #include "LocalClient.h" #include - +#include +#include +#include +#define _USE_MATH_DEFINES +#include namespace ZL { void LocalClient::Connect(const std::string& host, uint16_t port) { + generateBoxes(); + lastUpdateMs = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + } + + void LocalClient::generateBoxes() { + serverBoxes.clear(); + + std::random_device rd; + std::mt19937 gen(rd()); + + const float MIN_COORD = -100.0f; + const float MAX_COORD = 100.0f; + const float MIN_DISTANCE = 3.0f; + const float MIN_DISTANCE_SQUARED = MIN_DISTANCE * MIN_DISTANCE; + const int MAX_ATTEMPTS = 1000; + + std::uniform_real_distribution<> posDistrib(MIN_COORD, MAX_COORD); + std::uniform_real_distribution<> angleDistrib(0.0, M_PI * 2.0); + + for (int i = 0; i < 50; i++) { + bool accepted = false; + int attempts = 0; + + while (!accepted && attempts < MAX_ATTEMPTS) { + LocalServerBox box; + box.position = Eigen::Vector3f( + (float)posDistrib(gen), + (float)posDistrib(gen), + (float)posDistrib(gen) + ); + + accepted = true; + for (const auto& existingBox : serverBoxes) { + Eigen::Vector3f diff = box.position - existingBox.position; + if (diff.squaredNorm() < MIN_DISTANCE_SQUARED) { + accepted = false; + break; + } + } + + if (accepted) { + float randomAngle = (float)angleDistrib(gen); + Eigen::Vector3f axis = Eigen::Vector3f::Random().normalized(); + box.rotation = Eigen::AngleAxisf(randomAngle, axis).toRotationMatrix(); + serverBoxes.push_back(box); + } + + attempts++; + } + } + + std::cout << "LocalClient: Generated " << serverBoxes.size() << " boxes\n"; } void LocalClient::Poll() { + updatePhysics(); + checkCollisions(); + } + + void LocalClient::updatePhysics() { + auto now_ms = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + + if (lastUpdateMs == 0) { + lastUpdateMs = now_ms; + return; + } + + uint64_t deltaMs = now_ms - lastUpdateMs; + float dt = deltaMs / 1000.0f; + lastUpdateMs = now_ms; + + std::vector indicesToRemove; + + for (size_t i = 0; i < projectiles.size(); ++i) { + auto& pr = projectiles[i]; + pr.pos += pr.vel * dt; + + if (now_ms > pr.spawnMs + static_cast(pr.lifeMs)) { + indicesToRemove.push_back(static_cast(i)); + } + } + + if (!indicesToRemove.empty()) { + std::sort(indicesToRemove.rbegin(), indicesToRemove.rend()); + for (int idx : indicesToRemove) { + if (idx >= 0 && idx < (int)projectiles.size()) { + projectiles.erase(projectiles.begin() + idx); + } + } + } + } + + void LocalClient::checkCollisions() { + auto now_ms = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + + const float projectileHitRadius = 1.5f; + const float boxCollisionRadius = 2.0f; + const float shipCollisionRadius = 15.0f; + + std::vector> boxProjectileCollisions; + + for (size_t bi = 0; bi < serverBoxes.size(); ++bi) { + if (serverBoxes[bi].destroyed) continue; + + Eigen::Vector3f boxWorld = serverBoxes[bi].position + Eigen::Vector3f(0.0f, 6.0f, 45000.0f); + + for (size_t pi = 0; pi < projectiles.size(); ++pi) { + const auto& pr = projectiles[pi]; + Eigen::Vector3f diff = pr.pos - boxWorld; + float thresh = boxCollisionRadius + projectileHitRadius; + + if (diff.squaredNorm() <= thresh * thresh) { + boxProjectileCollisions.push_back({ bi, pi }); + } + } + } + + std::vector projIndicesToRemove; + for (const auto& [boxIdx, projIdx] : boxProjectileCollisions) { + if (!serverBoxes[boxIdx].destroyed) { + serverBoxes[boxIdx].destroyed = true; + + Eigen::Vector3f boxWorld = serverBoxes[boxIdx].position + Eigen::Vector3f(0.0f, 0.0f, 45000.0f); + + BoxDestroyedInfo destruction; + destruction.boxIndex = static_cast(boxIdx); + destruction.serverTime = now_ms; + destruction.position = boxWorld; + destruction.destroyedBy = projectiles[projIdx].shooterId; + + pendingBoxDestructions.push_back(destruction); + + std::cout << "LocalClient: Box " << boxIdx << " destroyed by projectile from player " + << projectiles[projIdx].shooterId << std::endl; + + if (std::find(projIndicesToRemove.begin(), projIndicesToRemove.end(), (int)projIdx) + == projIndicesToRemove.end()) { + projIndicesToRemove.push_back(static_cast(projIdx)); + } + } + } + + if (!projIndicesToRemove.empty()) { + std::sort(projIndicesToRemove.rbegin(), projIndicesToRemove.rend()); + for (int idx : projIndicesToRemove) { + if (idx >= 0 && idx < (int)projectiles.size()) { + projectiles.erase(projectiles.begin() + idx); + } + } + } + + if (hasLocalPlayerState) { + for (size_t bi = 0; bi < serverBoxes.size(); ++bi) { + if (serverBoxes[bi].destroyed) continue; + + Eigen::Vector3f boxWorld = serverBoxes[bi].position + Eigen::Vector3f(0.0f, 0.0f, 45000.0f); + Eigen::Vector3f diff = localPlayerState.position - boxWorld; + float thresh = shipCollisionRadius + boxCollisionRadius; + + if (diff.squaredNorm() <= thresh * thresh) { + serverBoxes[bi].destroyed = true; + + BoxDestroyedInfo destruction; + destruction.boxIndex = static_cast(bi); + destruction.serverTime = now_ms; + destruction.position = boxWorld; + destruction.destroyedBy = GetClientId(); + + pendingBoxDestructions.push_back(destruction); + + std::cout << "LocalClient: Box " << bi << " destroyed by ship collision with player " + << GetClientId() << std::endl; + } + } + } } void LocalClient::Send(const std::string& message) { + auto parts = [](const std::string& s, char delimiter) { + std::vector tokens; + std::string token; + std::istringstream tokenStream(s); + while (std::getline(tokenStream, token, delimiter)) { + tokens.push_back(token); + } + return tokens; + }(message, ':'); + + if (parts.empty()) return; + + std::string type = parts[0]; + + if (type == "FIRE") { + if (parts.size() < 10) return; + + uint64_t clientTime = std::stoull(parts[1]); + Eigen::Vector3f pos{ + std::stof(parts[2]), std::stof(parts[3]), std::stof(parts[4]) + }; + Eigen::Quaternionf dir( + std::stof(parts[5]), std::stof(parts[6]), std::stof(parts[7]), std::stof(parts[8]) + ); + float velocity = std::stof(parts[9]); + + int shotCount = 2; + if (parts.size() >= 11) { + try { shotCount = std::stoi(parts[10]); } + catch (...) { shotCount = 2; } + } + + const std::vector localOffsets = { + Eigen::Vector3f(-1.5f, 0.9f, 5.0f), + Eigen::Vector3f(1.5f, 0.9f, 5.0f) + }; + + uint64_t now_ms = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + + for (int i = 0; i < std::min(shotCount, (int)localOffsets.size()); ++i) { + LocalProjectile pr; + pr.shooterId = GetClientId(); + pr.spawnMs = now_ms; + Eigen::Vector3f shotPos = pos + dir.toRotationMatrix() * localOffsets[i]; + pr.pos = shotPos; + Eigen::Vector3f localForward(0.0f, 0.0f, -1.0f); + Eigen::Vector3f worldForward = dir.toRotationMatrix() * localForward; + float len = worldForward.norm(); + if (len > 1e-6f) worldForward /= len; + pr.vel = worldForward * velocity; + pr.lifeMs = 5000.0f; + projectiles.push_back(pr); + + ProjectileInfo pinfo; + pinfo.shooterId = pr.shooterId; + pinfo.clientTime = clientTime; + pinfo.position = pr.pos; + pinfo.rotation = dir.toRotationMatrix(); + pinfo.velocity = velocity; + pendingProjectiles.push_back(pinfo); + + std::cout << "LocalClient: Created projectile at pos (" << shotPos.x() << ", " + << shotPos.y() << ", " << shotPos.z() << ") vel (" << pr.vel.x() << ", " + << pr.vel.y() << ", " << pr.vel.z() << ")" << std::endl; + } + } } std::vector LocalClient::getPendingProjectiles() { - return {}; + auto result = pendingProjectiles; + pendingProjectiles.clear(); + return result; + } + + std::vector> LocalClient::getServerBoxes() { + std::vector> result; + for (const auto& box : serverBoxes) { + result.push_back({ box.position, box.rotation }); + } + return result; + } + + std::vector LocalClient::getPendingDeaths() { + auto result = pendingDeaths; + pendingDeaths.clear(); + return result; + } + + std::vector LocalClient::getPendingBoxDestructions() { + auto result = pendingBoxDestructions; + pendingBoxDestructions.clear(); + return result; } } \ No newline at end of file diff --git a/src/network/LocalClient.h b/src/network/LocalClient.h index ba2fbe7..c795e49 100644 --- a/src/network/LocalClient.h +++ b/src/network/LocalClient.h @@ -2,41 +2,74 @@ #include "NetworkInterface.h" #include +#include +#include +#include +#include namespace ZL { - class LocalClient : public INetworkClient { - private: - std::queue messageQueue; - public: - void Connect(const std::string& host, uint16_t port) override; - void Poll() override; + struct LocalServerBox { + Eigen::Vector3f position; + Eigen::Matrix3f rotation; + float collisionRadius = 2.0f; + bool destroyed = false; + }; - void Send(const std::string& message) override; + struct LocalProjectile { + int shooterId = -1; + uint64_t spawnMs = 0; + Eigen::Vector3f pos; + Eigen::Vector3f vel; + float lifeMs = 5000.0f; + }; - bool IsConnected() const override { return true; } - int GetClientId() const override { return 1; } - std::vector getPendingProjectiles() override; + class LocalClient : public INetworkClient { + private: + std::queue messageQueue; + std::vector serverBoxes; + std::vector projectiles; + std::vector pendingProjectiles; + std::vector pendingDeaths; + std::vector pendingBoxDestructions; + std::vector pendingRespawns; - std::unordered_map getRemotePlayers() override { - return std::unordered_map(); + uint64_t lastUpdateMs = 0; + ClientState localPlayerState; + bool hasLocalPlayerState = false; + + void updatePhysics(); + void checkCollisions(); + void generateBoxes(); + + public: + void Connect(const std::string& host, uint16_t port) override; + + void Poll() override; + + void Send(const std::string& message) override; + + bool IsConnected() const override { return true; } + int GetClientId() const override { return 1; } + std::vector getPendingProjectiles() override; + + std::unordered_map getRemotePlayers() override { + return std::unordered_map(); } - std::vector> getServerBoxes() override { - return {}; - } + std::vector> getServerBoxes() override; - std::vector getPendingDeaths() override { - return {}; - } + std::vector getPendingDeaths() override; - std::vector getPendingRespawns() override { - return {}; - } + std::vector getPendingRespawns() override { + return {}; + } - std::vector getPendingBoxDestructions() override - { - return {}; - } - }; + std::vector getPendingBoxDestructions() override; + + void setLocalPlayerState(const ClientState& state) { + localPlayerState = state; + hasLocalPlayerState = true; + } + }; } \ No newline at end of file From 5df2216da65639763e9016ee427abf6d47a02a1c Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 10 Feb 2026 12:42:19 +0600 Subject: [PATCH 02/17] added npc --- src/network/LocalClient.cpp | 104 +++++++++++++++++++++++++++++--- src/network/LocalClient.h | 114 ++++++++++++++++++++---------------- 2 files changed, 160 insertions(+), 58 deletions(-) diff --git a/src/network/LocalClient.cpp b/src/network/LocalClient.cpp index b6fc7f6..e0a8d36 100644 --- a/src/network/LocalClient.cpp +++ b/src/network/LocalClient.cpp @@ -10,13 +10,14 @@ namespace ZL { void LocalClient::Connect(const std::string& host, uint16_t port) { generateBoxes(); + initializeNPCs(); lastUpdateMs = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); } void LocalClient::generateBoxes() { serverBoxes.clear(); - + std::random_device rd; std::mt19937 gen(rd()); @@ -64,20 +65,101 @@ namespace ZL { std::cout << "LocalClient: Generated " << serverBoxes.size() << " boxes\n"; } + Eigen::Vector3f LocalClient::generateRandomPosition() { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution<> distrib(-50.0, 50.0); + + return Eigen::Vector3f( + (float)distrib(gen), + (float)distrib(gen), + (float)distrib(gen) + 45000.0f + ); + } + + void LocalClient::initializeNPCs() { + npcs.clear(); + + for (int i = 0; i < 3; ++i) { + LocalNPC npc; + npc.id = 100 + i; + npc.speed = 20.0f + (i * 5.0f); + npc.currentState.id = npc.id; + npc.currentState.position = generateRandomPosition(); + npc.currentState.rotation = Eigen::Matrix3f::Identity(); + npc.currentState.velocity = npc.speed; + npc.targetPosition = generateRandomPosition(); + npc.lastStateUpdateMs = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + + npc.stateHistory.add_state(npc.currentState); + npcs.push_back(npc); + + std::cout << "LocalClient: Created NPC with id=" << npc.id + << " at pos (" << npc.currentState.position.x() << ", " + << npc.currentState.position.y() << ", " + << npc.currentState.position.z() << ")" << std::endl; + } + } + + void LocalClient::updateNPCs() { + auto now_ms = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + + for (auto& npc : npcs) { + uint64_t deltaMs = now_ms - npc.lastStateUpdateMs; + float dt = deltaMs / 1000.0f; + npc.lastStateUpdateMs = now_ms; + + Eigen::Vector3f direction = npc.targetPosition - npc.currentState.position; + float distance = direction.norm(); + + if (distance < 5.0f) { + npc.targetPosition = generateRandomPosition(); + direction = npc.targetPosition - npc.currentState.position; + distance = direction.norm(); + } + + if (distance > 0.001f) { + direction.normalize(); + npc.currentState.position += direction * npc.speed * dt; + npc.currentState.velocity = npc.speed; + + Eigen::Vector3f localForward(0.0f, 0.0f, -1.0f); + Eigen::Vector3f worldForward = direction; + + Eigen::Vector3f cross = localForward.cross(worldForward); + float dot = localForward.dot(worldForward); + + if (cross.norm() > 0.001f) { + float angle = std::atan2(cross.norm(), dot); + cross.normalize(); + Eigen::AngleAxisf aa(angle * 0.05f, cross); + npc.currentState.rotation = npc.currentState.rotation * aa.toRotationMatrix(); + } + } + + npc.currentState.lastUpdateServerTime = std::chrono::system_clock::time_point( + std::chrono::milliseconds(now_ms)); + npc.stateHistory.add_state(npc.currentState); + } + } + void LocalClient::Poll() { updatePhysics(); + updateNPCs(); checkCollisions(); } void LocalClient::updatePhysics() { auto now_ms = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); - + if (lastUpdateMs == 0) { lastUpdateMs = now_ms; return; } - + uint64_t deltaMs = now_ms - lastUpdateMs; float dt = deltaMs / 1000.0f; lastUpdateMs = now_ms; @@ -147,7 +229,7 @@ namespace ZL { std::cout << "LocalClient: Box " << boxIdx << " destroyed by projectile from player " << projectiles[projIdx].shooterId << std::endl; - if (std::find(projIndicesToRemove.begin(), projIndicesToRemove.end(), (int)projIdx) + if (std::find(projIndicesToRemove.begin(), projIndicesToRemove.end(), (int)projIdx) == projIndicesToRemove.end()) { projIndicesToRemove.push_back(static_cast(projIdx)); } @@ -198,7 +280,7 @@ namespace ZL { tokens.push_back(token); } return tokens; - }(message, ':'); + }(message, ':'); if (parts.empty()) return; @@ -252,8 +334,8 @@ namespace ZL { pinfo.velocity = velocity; pendingProjectiles.push_back(pinfo); - std::cout << "LocalClient: Created projectile at pos (" << shotPos.x() << ", " - << shotPos.y() << ", " << shotPos.z() << ") vel (" << pr.vel.x() << ", " + std::cout << "LocalClient: Created projectile at pos (" << shotPos.x() << ", " + << shotPos.y() << ", " << shotPos.z() << ") vel (" << pr.vel.x() << ", " << pr.vel.y() << ", " << pr.vel.z() << ")" << std::endl; } } @@ -265,6 +347,14 @@ namespace ZL { return result; } + std::unordered_map LocalClient::getRemotePlayers() { + std::unordered_map result; + for (const auto& npc : npcs) { + result[npc.id] = npc.stateHistory; + } + return result; + } + std::vector> LocalClient::getServerBoxes() { std::vector> result; for (const auto& box : serverBoxes) { diff --git a/src/network/LocalClient.h b/src/network/LocalClient.h index c795e49..d94a82d 100644 --- a/src/network/LocalClient.h +++ b/src/network/LocalClient.h @@ -9,67 +9,79 @@ namespace ZL { - struct LocalServerBox { - Eigen::Vector3f position; - Eigen::Matrix3f rotation; - float collisionRadius = 2.0f; - bool destroyed = false; - }; + struct LocalServerBox { + Eigen::Vector3f position; + Eigen::Matrix3f rotation; + float collisionRadius = 2.0f; + bool destroyed = false; + }; - struct LocalProjectile { - int shooterId = -1; - uint64_t spawnMs = 0; - Eigen::Vector3f pos; - Eigen::Vector3f vel; - float lifeMs = 5000.0f; - }; + struct LocalProjectile { + int shooterId = -1; + uint64_t spawnMs = 0; + Eigen::Vector3f pos; + Eigen::Vector3f vel; + float lifeMs = 5000.0f; + }; - class LocalClient : public INetworkClient { - private: - std::queue messageQueue; - std::vector serverBoxes; - std::vector projectiles; - std::vector pendingProjectiles; - std::vector pendingDeaths; - std::vector pendingBoxDestructions; - std::vector pendingRespawns; + struct LocalNPC { + int id = -1; + ClientState currentState; + ClientStateInterval stateHistory; + Eigen::Vector3f targetPosition; + float speed = 30.0f; + uint64_t lastStateUpdateMs = 0; + }; - uint64_t lastUpdateMs = 0; - ClientState localPlayerState; - bool hasLocalPlayerState = false; + class LocalClient : public INetworkClient { + private: + std::queue messageQueue; + std::vector serverBoxes; + std::vector projectiles; + std::vector pendingProjectiles; + std::vector pendingDeaths; + std::vector pendingBoxDestructions; + std::vector pendingRespawns; + + uint64_t lastUpdateMs = 0; + ClientState localPlayerState; + bool hasLocalPlayerState = false; + + std::vector npcs; + + void updatePhysics(); + void checkCollisions(); + void generateBoxes(); + void initializeNPCs(); + void updateNPCs(); + Eigen::Vector3f generateRandomPosition(); + + public: + void Connect(const std::string& host, uint16_t port) override; - void updatePhysics(); - void checkCollisions(); - void generateBoxes(); + void Poll() override; - public: - void Connect(const std::string& host, uint16_t port) override; + void Send(const std::string& message) override; - void Poll() override; + bool IsConnected() const override { return true; } + int GetClientId() const override { return 1; } + std::vector getPendingProjectiles() override; - void Send(const std::string& message) override; + std::unordered_map getRemotePlayers() override; - bool IsConnected() const override { return true; } - int GetClientId() const override { return 1; } - std::vector getPendingProjectiles() override; + std::vector> getServerBoxes() override; - std::unordered_map getRemotePlayers() override { - return std::unordered_map(); - } + std::vector getPendingDeaths() override; - std::vector> getServerBoxes() override; + std::vector getPendingRespawns() override { + return {}; + } - std::vector getPendingDeaths() override; + std::vector getPendingBoxDestructions() override; - std::vector getPendingRespawns() override { - return {}; - } - - std::vector getPendingBoxDestructions() override; - - void setLocalPlayerState(const ClientState& state) { - localPlayerState = state; - hasLocalPlayerState = true; - } - }; + void setLocalPlayerState(const ClientState& state) { + localPlayerState = state; + hasLocalPlayerState = true; + } + }; } \ No newline at end of file From 4eda57b4e490a9cc9d5d1f739c54ae3c35fb62f4 Mon Sep 17 00:00:00 2001 From: vottozi Date: Thu, 12 Feb 2026 00:08:52 +0600 Subject: [PATCH 03/17] single texture atlas for all font glyphs in TextRenderer --- src/Game.cpp | 4 +- src/render/TextRenderer.cpp | 264 +++++++++++++++++++++++++++++------- src/render/TextRenderer.h | 10 +- 3 files changed, 227 insertions(+), 51 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 5ce7e6c..6b39c63 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -26,8 +26,8 @@ namespace ZL #ifdef EMSCRIPTEN const char* CONST_ZIP_FILE = "resources.zip"; #else - const char* CONST_ZIP_FILE = "C:\\Work\\Projects\\space-game001\\resources.zip"; - //const char* CONST_ZIP_FILE = ""; + // const char* CONST_ZIP_FILE = "C:\\Work\\Projects\\space-game001\\resources.zip"; + const char* CONST_ZIP_FILE = ""; #endif static bool g_exitBgAnimating = false; diff --git a/src/render/TextRenderer.cpp b/src/render/TextRenderer.cpp index 067086e..7cd52c4 100644 --- a/src/render/TextRenderer.cpp +++ b/src/render/TextRenderer.cpp @@ -6,6 +6,8 @@ #include "render/OpenGlExtensions.h" #include #include +#include +#include namespace ZL { @@ -15,7 +17,7 @@ TextRenderer::~TextRenderer() if (kv.second.texID) glDeleteTextures(1, &kv.second.texID); }*/ glyphs.clear(); - + atlasTexture.reset(); textMesh.positionVBO.reset(); /* if (vbo) glDeleteBuffers(1, &vbo); @@ -97,38 +99,188 @@ bool TextRenderer::loadGlyphs(const std::string& ttfPath, int pixelSize, const s } FT_Set_Pixel_Sizes(face, 0, pixelSize); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glyphs.clear(); - // Проходим по стандартным ASCII символам + // glyphs.clear(); + + // Сначала собираем все глифы в память + struct GlyphBitmap { + int width = 0; + int height = 0; + std::vector data; // R8 байты (ширина*height) + Eigen::Vector2f bearing; + unsigned int advance = 0; + }; + + std::vector> glyphList; + glyphList.reserve(128 - 32); + + int maxGlyphHeight = 0; + for (unsigned char c = 32; c < 128; ++c) { - - FT_Load_Char(face, c, FT_LOAD_RENDER); + if (FT_Load_Char(face, c, FT_LOAD_RENDER)) { + // пропускаем если не удалось загрузить, но сохраняем пустой запись с advance + GlyphBitmap gb; + gb.width = 0; + gb.height = 0; + gb.bearing = { 0.f, 0.f }; + gb.advance = 0; + glyphList.emplace_back((char)c, std::move(gb)); + continue; + } - TextureDataStruct glyphData; - glyphData.width = face->glyph->bitmap.width; - glyphData.height = face->glyph->bitmap.rows; - glyphData.format = TextureDataStruct::R8; - glyphData.mipmap = TextureDataStruct::NONE; + GlyphBitmap gb; + gb.width = face->glyph->bitmap.width; + gb.height = face->glyph->bitmap.rows; + gb.bearing = Eigen::Vector2f((float)face->glyph->bitmap_left, (float)face->glyph->bitmap_top); + gb.advance = static_cast(face->glyph->advance.x); - // Копируем буфер FreeType в вектор данных - size_t dataSize = glyphData.width * glyphData.height; - glyphData.data.assign(face->glyph->bitmap.buffer, face->glyph->bitmap.buffer + dataSize); + size_t dataSize = static_cast(gb.width) * static_cast(gb.height); + if (dataSize > 0) { + gb.data.assign(face->glyph->bitmap.buffer, face->glyph->bitmap.buffer + dataSize); + maxGlyphHeight = max(maxGlyphHeight, gb.height); + } - // Теперь создание текстуры — это одна строка! - auto tex = std::make_shared(glyphData); - - GlyphInfo g; - g.texture = tex; - g.size = Eigen::Vector2f((float)face->glyph->bitmap.width, (float)face->glyph->bitmap.rows); - g.bearing = Eigen::Vector2f((float)face->glyph->bitmap_left, (float)face->glyph->bitmap_top); - // Advance во FreeType измеряется в 1/64 пикселя - g.advance = (unsigned int)face->glyph->advance.x; - - glyphs.emplace((char)c, g); + glyphList.emplace_back((char)c, std::move(gb)); } + // Пакуем глифы в один атлас (упрощённый алгоритм строковой укладки) + const int padding = 1; + const int maxAtlasWidth = 1024; // безопасное значение для большинства устройств + int curX = padding; + int curY = padding; + int rowHeight = 0; + int neededWidth = 0; + int neededHeight = 0; + + // Предварительно вычислим требуемый размер, укладывая в maxAtlasWidth + for (auto& p : glyphList) { + const GlyphBitmap& gb = p.second; + int w = gb.width; + int h = gb.height; + if (curX + w + padding > maxAtlasWidth) { + // новая строка + neededWidth = max(neededWidth, curX); + curX = padding; + curY += rowHeight + padding; + rowHeight = 0; + } + curX += w + padding; + rowHeight = max(rowHeight, h); + } + neededWidth = max(neededWidth, curX); + neededHeight = curY + rowHeight + padding; + + // Подгоняем к степеням двух (необязательно, но часто удобно) + auto nextPow2 = [](int v) { + int p = 1; + while (p < v) p <<= 1; + return p; + }; + + atlasWidth = static_cast(nextPow2(max(16, neededWidth))); + atlasHeight = static_cast(nextPow2(max(16, neededHeight))); + + // Ограничение - если получилось слишком большое, попробуем без power-of-two + if (atlasWidth > 4096) atlasWidth = static_cast(neededWidth); + if (atlasHeight > 4096) atlasHeight = static_cast(neededHeight); + + // Создаём буфер атласа, инициализируем нулями (прозрачность) + std::vector atlasData(atlasWidth * atlasHeight, 0); + + // Второй проход - размещаем глифы и заполняем atlasData + curX = padding; + curY = padding; + rowHeight = 0; + + for (auto &p : glyphList) { + char ch = p.first; + GlyphBitmap &gb = p.second; + + if (gb.width == 0 || gb.height == 0) { + // пустой глиф — записываем UV с нулевым размером и метрики + GlyphInfo gi; + gi.size = Eigen::Vector2f(0.f, 0.f); + gi.bearing = gb.bearing; + gi.advance = gb.advance; + gi.uv = Eigen::Vector2f(0.f, 0.f); + gi.uvSize = Eigen::Vector2f(0.f, 0.f); + glyphs.emplace(ch, gi); + continue; + } + + if (curX + gb.width + padding > static_cast(atlasWidth)) { + // новая строка + curX = padding; + curY += rowHeight + padding; + rowHeight = 0; + } + + // Копируем строки глифа в atlasData + for (int row = 0; row < gb.height; ++row) { + // FreeType буфер, как мы ранее использовали, хранит строки подряд. + // Копируем gb.width байт из gb.data на позицию (curX, curY + row) + int destY = curY + row; + int destX = curX; + char* destPtr = atlasData.data() + destY * atlasWidth + destX; + const char* srcPtr = gb.data.data() + row * gb.width; + std::memcpy(destPtr, srcPtr, static_cast(gb.width)); + } + + // Сохраняем информацию о глифе (в пикселях и UV) + GlyphInfo gi; + gi.size = Eigen::Vector2f((float)gb.width, (float)gb.height); + gi.bearing = gb.bearing; + gi.advance = gb.advance; + + // UV: нормализуем относительно размера атласа. Здесь uv указывает на верх-лево. + gi.uv = Eigen::Vector2f((float)curX / (float)atlasWidth, (float)curY / (float)atlasHeight); + gi.uvSize = Eigen::Vector2f((float)gb.width / (float)atlasWidth, (float)gb.height / (float)atlasHeight); + + glyphs.emplace(ch, gi); + + curX += gb.width + padding; + rowHeight = max(rowHeight, gb.height); + } + + // // Проходим по стандартным ASCII символам + // for (unsigned char c = 32; c < 128; ++c) { + // + // FT_Load_Char(face, c, FT_LOAD_RENDER); + + // TextureDataStruct glyphData; + // glyphData.width = face->glyph->bitmap.width; + // glyphData.height = face->glyph->bitmap.rows; + // glyphData.format = TextureDataStruct::R8; + // glyphData.mipmap = TextureDataStruct::NONE; + + // // Копируем буфер FreeType в вектор данных + // size_t dataSize = glyphData.width * glyphData.height; + // glyphData.data.assign(face->glyph->bitmap.buffer, face->glyph->bitmap.buffer + dataSize); + + // // Теперь создание текстуры — это одна строка! + // auto tex = std::make_shared(glyphData); + + //GlyphInfo g; + // g.texture = tex; + // g.size = Eigen::Vector2f((float)face->glyph->bitmap.width, (float)face->glyph->bitmap.rows); + // g.bearing = Eigen::Vector2f((float)face->glyph->bitmap_left, (float)face->glyph->bitmap_top); + // // Advance во FreeType измеряется в 1/64 пикселя + // g.advance = (unsigned int)face->glyph->advance.x; + + // glyphs.emplace((char)c, g); + // } + + // Создаём Texture из atlasData (R8) + TextureDataStruct atlasTex; + atlasTex.width = atlasWidth; + atlasTex.height = atlasHeight; + atlasTex.format = TextureDataStruct::R8; + atlasTex.mipmap = TextureDataStruct::NONE; + atlasTex.data = std::move(atlasData); + + atlasTexture = std::make_shared(atlasTex); + // Очистка FT_Done_Face(face); FT_Done_FreeType(ft); @@ -142,7 +294,7 @@ bool TextRenderer::loadGlyphs(const std::string& ttfPath, int pixelSize, const s void TextRenderer::drawText(const std::string& text, float x, float y, float scale, bool centered, std::array color) { - if (!r || text.empty()) return; + if (!r || text.empty() || !atlasTexture) return; // 1. Считаем ширину для центрирования float totalW = 0.0f; @@ -180,13 +332,27 @@ void TextRenderer::drawText(const std::string& text, float x, float y, float sca textData.PositionData.push_back({ xpos + w, ypos, 0.0f }); textData.PositionData.push_back({ xpos + w, ypos + h, 0.0f }); - // UV-координаты (здесь есть нюанс с атласом, ниже поясню) - textData.TexCoordData.push_back({ 0.0f, 0.0f }); - textData.TexCoordData.push_back({ 0.0f, 1.0f }); - textData.TexCoordData.push_back({ 1.0f, 1.0f }); - textData.TexCoordData.push_back({ 0.0f, 0.0f }); - textData.TexCoordData.push_back({ 1.0f, 1.0f }); - textData.TexCoordData.push_back({ 1.0f, 0.0f }); + // TexCoords — на основе UV позиции и размера в атласе (uv указывает на верх-лево) + float u0 = g.uv.x(); + float v0 = g.uv.y(); + float u1 = u0 + g.uvSize.x(); + float v1 = v0 + g.uvSize.y(); + + //// UV-координаты (здесь есть нюанс с атласом, ниже поясню) + //textData.TexCoordData.push_back({ 0.0f, 0.0f }); + //textData.TexCoordData.push_back({ 0.0f, 1.0f }); + //textData.TexCoordData.push_back({ 1.0f, 1.0f }); + //textData.TexCoordData.push_back({ 0.0f, 0.0f }); + //textData.TexCoordData.push_back({ 1.0f, 1.0f }); + //textData.TexCoordData.push_back({ 1.0f, 0.0f }); + + // Соответствие прежней системе UV: (0,0)=верх-лево, (0,1)=ниж-лево + textData.TexCoordData.push_back({ u0, v0 }); + textData.TexCoordData.push_back({ u0, v1 }); + textData.TexCoordData.push_back({ u1, v1 }); + textData.TexCoordData.push_back({ u0, v0 }); + textData.TexCoordData.push_back({ u1, v1 }); + textData.TexCoordData.push_back({ u1, v0 }); penX += (g.advance >> 6) * scale; } @@ -214,33 +380,35 @@ void TextRenderer::drawText(const std::string& text, float x, float y, float sca r->RenderUniform4fv("uColor", color.data()); glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, atlasTexture->getTexID()); - // ВНИМАНИЕ: Так как у тебя каждый символ — это отдельная текстура, - // нам всё равно придется делать glDrawArrays в цикле, ЛИБО использовать атлас. - // Если оставляем текущую систему с разными текстурами: r->EnableVertexAttribArray("vPosition"); r->EnableVertexAttribArray("vTexCoord"); - for (size_t i = 0; i < text.length(); ++i) { - auto it = glyphs.find(text[i]); - if (it == glyphs.end()) continue; + //for (size_t i = 0; i < text.length(); ++i) { + // auto it = glyphs.find(text[i]); + // if (it == glyphs.end()) continue; - glBindTexture(GL_TEXTURE_2D, it->second.texture->getTexID()); + // glBindTexture(GL_TEXTURE_2D, it->second.texture->getTexID()); - // Отрисовываем по 6 вершин за раз - // Нам нужно вручную биндить VBO, так как DrawVertexRenderStruct рисует всё сразу - glBindBuffer(GL_ARRAY_BUFFER, textMesh.positionVBO->getBuffer()); - r->VertexAttribPointer3fv("vPosition", 0, (const char*)(i * 6 * sizeof(Vector3f))); + // // Отрисовываем по 6 вершин за раз + // // Нам нужно вручную биндить VBO, так как DrawVertexRenderStruct рисует всё сразу + // glBindBuffer(GL_ARRAY_BUFFER, textMesh.positionVBO->getBuffer()); + // r->VertexAttribPointer3fv("vPosition", 0, (const char*)(i * 6 * sizeof(Vector3f))); - glBindBuffer(GL_ARRAY_BUFFER, textMesh.texCoordVBO->getBuffer()); - r->VertexAttribPointer2fv("vTexCoord", 0, (const char*)(i * 6 * sizeof(Vector2f))); + // glBindBuffer(GL_ARRAY_BUFFER, textMesh.texCoordVBO->getBuffer()); + // r->VertexAttribPointer2fv("vTexCoord", 0, (const char*)(i * 6 * sizeof(Vector2f))); - glDrawArrays(GL_TRIANGLES, 0, 6); - } + // glDrawArrays(GL_TRIANGLES, 0, 6); + //} + r->DrawVertexRenderStruct(textMesh); r->DisableVertexAttribArray("vPosition"); r->DisableVertexAttribArray("vTexCoord"); r->shaderManager.PopShader(); + + // Сброс бинда текстуры не обязателен, но можно для чистоты + glBindTexture(GL_TEXTURE_2D, 0); } } // namespace ZL \ No newline at end of file diff --git a/src/render/TextRenderer.h b/src/render/TextRenderer.h index 4f78efc..e55e80e 100644 --- a/src/render/TextRenderer.h +++ b/src/render/TextRenderer.h @@ -12,7 +12,10 @@ namespace ZL { struct GlyphInfo { - std::shared_ptr texture; // Texture for glyph + // std::shared_ptr texture; // Texture for glyph + Eigen::Vector2f uv; // u,v координата левого верхнего угла в атласе (0..1) + Eigen::Vector2f uvSize; // ширина/высота в UV (0..1) + Eigen::Vector2f size; // glyph size in pixels Eigen::Vector2f bearing; // offset from baseline unsigned int advance = 0; // advance.x in 1/64 pixels @@ -37,6 +40,11 @@ private: //unsigned int vao = 0; //unsigned int vbo = 0; + // единый атлас для всех глифов + std::shared_ptr atlasTexture; + size_t atlasWidth = 0; + size_t atlasHeight = 0; + VertexRenderStruct textMesh; std::string shaderName = "text2d"; From b56fafa0e0fdfbb5dea34e16edbd60502417168d Mon Sep 17 00:00:00 2001 From: vottozi Date: Thu, 12 Feb 2026 13:23:16 +0600 Subject: [PATCH 04/17] Add mesh caching for unchanging text labels --- src/Game.cpp | 23 +++++-- src/render/TextRenderer.cpp | 129 ++++++++++++++++++++---------------- src/render/TextRenderer.h | 13 ++++ 3 files changed, 103 insertions(+), 62 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 6b39c63..32b95d7 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -208,7 +208,9 @@ namespace ZL // Можно делать масштаб по дальности: чем дальше — тем меньше. // depth в NDC: ближе к -1 (near) и к 1 (far). Стабильнее считать по расстоянию: float dist = (Environment::shipState.position - boxWorld).norm(); - float scale = std::clamp(120.0f / (dist + 1.0f), 0.6f, 1.2f); + float scaleRaw = 120.0f / (dist + 1.0f); + float scale = std::round(scaleRaw * 10.0f) / 10.0f; + scale = std::clamp(scale, 0.6f, 1.2f); textRenderer->drawText(boxLabels[i], uiX, uiY, scale, /*centered*/true); } @@ -465,9 +467,6 @@ namespace ZL boxAlive.resize(boxCoordsArr.size(), true); ZL::CheckGlError(); - textRenderer = std::make_unique(); - textRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 32, CONST_ZIP_FILE); - ZL::CheckGlError(); boxLabels.clear(); boxLabels.reserve(boxCoordsArr.size()); for (size_t i = 0; i < boxCoordsArr.size(); ++i) { @@ -480,6 +479,14 @@ namespace ZL } renderer.InitOpenGL(); + + // TextRenderer создаём/инициализируем ПОСЛЕ инициализации OpenGL + textRenderer = std::make_unique(); + if (!textRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 32, CONST_ZIP_FILE)) { + std::cerr << "Failed to init TextRenderer\n"; + } + ZL::CheckGlError(); + glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1316,6 +1323,14 @@ namespace ZL if (event.type == SDL_QUIT) { Environment::exitGameLoop = true; } +#if SDL_VERSION_ATLEAST(2,0,5) + else if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) { + // Обновляем размеры и сбрасываем кеш текстов, т.к. меши хранятся в пикселях + Environment::width = event.window.data1; + Environment::height = event.window.data2; + if (textRenderer) textRenderer->ClearCache(); + } +#endif #ifdef __ANDROID__ if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_AC_BACK) { Environment::exitGameLoop = true; diff --git a/src/render/TextRenderer.cpp b/src/render/TextRenderer.cpp index 7cd52c4..4493818 100644 --- a/src/render/TextRenderer.cpp +++ b/src/render/TextRenderer.cpp @@ -62,6 +62,11 @@ bool TextRenderer::init(Renderer& renderer, const std::string& ttfPath, int pixe return true; } +void TextRenderer::ClearCache() +{ + cache.clear(); +} + bool TextRenderer::loadGlyphs(const std::string& ttfPath, int pixelSize, const std::string& zipfilename) { // 1. Загружаем сырые данные из ZIP @@ -296,72 +301,79 @@ void TextRenderer::drawText(const std::string& text, float x, float y, float sca { if (!r || text.empty() || !atlasTexture) return; - // 1. Считаем ширину для центрирования - float totalW = 0.0f; - if (centered) { + // формируем ключ кеша + std::string key = text + "|" + std::to_string(scale) + "|" + (centered ? "1" : "0"); + auto itCache = cache.find(key); + + if (itCache == cache.end()) { + VertexDataStruct textData; + float penX = 0.0f; + float penY = 0.0f; + + float totalW = 0.0f; + float maxH = 0.0f; + for (char ch : text) { - auto it = glyphs.find(ch); - if (it == glyphs.end()) continue; - totalW += (it->second.advance >> 6) * scale; + auto git = glyphs.find(ch); + if (git == glyphs.end()) continue; + const GlyphInfo& g = git->second; + + float xpos = penX + g.bearing.x() * scale; + float ypos = penY - (g.size.y() - g.bearing.y()) * scale; + float w = g.size.x() * scale; + float h = g.size.y() * scale; + + // Добавляем 2 треугольника (6 вершин) для текущего символа + textData.PositionData.push_back({ xpos, ypos + h, 0.0f }); + textData.PositionData.push_back({ xpos, ypos, 0.0f }); + textData.PositionData.push_back({ xpos + w, ypos, 0.0f }); + textData.PositionData.push_back({ xpos, ypos + h, 0.0f }); + textData.PositionData.push_back({ xpos + w, ypos, 0.0f }); + textData.PositionData.push_back({ xpos + w, ypos + h, 0.0f }); + + // TexCoords — на основе UV позиции и размера в атласе (uv указывает на верх-лево) + float u0 = g.uv.x(); + float v0 = g.uv.y(); + float u1 = u0 + g.uvSize.x(); + float v1 = v0 + g.uvSize.y(); + + textData.TexCoordData.push_back({ u0, v0 }); + textData.TexCoordData.push_back({ u0, v1 }); + textData.TexCoordData.push_back({ u1, v1 }); + textData.TexCoordData.push_back({ u0, v0 }); + textData.TexCoordData.push_back({ u1, v1 }); + textData.TexCoordData.push_back({ u1, v0 }); + + penX += (g.advance >> 6) * scale; + totalW = penX; + maxH = max(maxH, h); } - x -= totalW * 0.5f; + + // Сохраняем в кеш + CachedText ct; + ct.width = totalW; + ct.height = maxH; + ct.mesh.AssignFrom(textData); + + auto res = cache.emplace(key, std::move(ct)); + itCache = res.first; } - // 2. Подготовка данных (аналог CreateRect2D, но для всей строки) - VertexDataStruct textData; - float penX = x; - float penY = y; + // Используем кешированный меш + CachedText& cached = itCache->second; - for (char ch : text) { - auto it = glyphs.find(ch); - if (it == glyphs.end()) continue; - - const GlyphInfo& g = it->second; - - float xpos = penX + g.bearing.x() * scale; - float ypos = penY - (g.size.y() - g.bearing.y()) * scale; - float w = g.size.x() * scale; - float h = g.size.y() * scale; - - // Добавляем 2 треугольника (6 вершин) для текущего символа - // Координаты Z ставим 0.0f, так как это 2D - textData.PositionData.push_back({ xpos, ypos + h, 0.0f }); - textData.PositionData.push_back({ xpos, ypos, 0.0f }); - textData.PositionData.push_back({ xpos + w, ypos, 0.0f }); - textData.PositionData.push_back({ xpos, ypos + h, 0.0f }); - textData.PositionData.push_back({ xpos + w, ypos, 0.0f }); - textData.PositionData.push_back({ xpos + w, ypos + h, 0.0f }); - - // TexCoords — на основе UV позиции и размера в атласе (uv указывает на верх-лево) - float u0 = g.uv.x(); - float v0 = g.uv.y(); - float u1 = u0 + g.uvSize.x(); - float v1 = v0 + g.uvSize.y(); - - //// UV-координаты (здесь есть нюанс с атласом, ниже поясню) - //textData.TexCoordData.push_back({ 0.0f, 0.0f }); - //textData.TexCoordData.push_back({ 0.0f, 1.0f }); - //textData.TexCoordData.push_back({ 1.0f, 1.0f }); - //textData.TexCoordData.push_back({ 0.0f, 0.0f }); - //textData.TexCoordData.push_back({ 1.0f, 1.0f }); - //textData.TexCoordData.push_back({ 1.0f, 0.0f }); - - // Соответствие прежней системе UV: (0,0)=верх-лево, (0,1)=ниж-лево - textData.TexCoordData.push_back({ u0, v0 }); - textData.TexCoordData.push_back({ u0, v1 }); - textData.TexCoordData.push_back({ u1, v1 }); - textData.TexCoordData.push_back({ u0, v0 }); - textData.TexCoordData.push_back({ u1, v1 }); - textData.TexCoordData.push_back({ u1, v0 }); - - penX += (g.advance >> 6) * scale; + // Вычисляем смещение для проекции (оставляем Y как есть) + float tx = x; + if (centered) { + tx = x - cached.width * 0.5f; } + float ty = y; // 3. Обновляем VBO через наш стандартный механизм // Примечание: для текста лучше использовать GL_DYNAMIC_DRAW, // но RefreshVBO сейчас жестко зашит на GL_STATIC_DRAW. // Для UI это обычно не критично, если строк не тысячи. - textMesh.AssignFrom(textData); + // textMesh.AssignFrom(textData); // 4. Рендеринг r->shaderManager.PushShader(shaderName); @@ -372,8 +384,9 @@ void TextRenderer::drawText(const std::string& text, float x, float y, float sca Eigen::Matrix4f proj = Eigen::Matrix4f::Identity(); proj(0, 0) = 2.0f / W; proj(1, 1) = 2.0f / H; - proj(0, 3) = -1.0f; - proj(1, 3) = -1.0f; + // Сдвигаем проекцию так, чтобы локальные координаты меша (pen-origin=0,0) оказались в (tx,ty) + proj(0, 3) = -1.0f + 2.0f * (tx) / W; + proj(1, 3) = -1.0f + 2.0f * (ty) / H; r->RenderUniformMatrix4fv("uProjection", false, proj.data()); r->RenderUniform1i("uText", 0); @@ -402,7 +415,7 @@ void TextRenderer::drawText(const std::string& text, float x, float y, float sca // glDrawArrays(GL_TRIANGLES, 0, 6); //} - r->DrawVertexRenderStruct(textMesh); + r->DrawVertexRenderStruct(cached.mesh); r->DisableVertexAttribArray("vPosition"); r->DisableVertexAttribArray("vTexCoord"); diff --git a/src/render/TextRenderer.h b/src/render/TextRenderer.h index e55e80e..d7a138a 100644 --- a/src/render/TextRenderer.h +++ b/src/render/TextRenderer.h @@ -29,6 +29,9 @@ public: bool init(Renderer& renderer, const std::string& ttfPath, int pixelSize, const std::string& zipfilename); void drawText(const std::string& text, float x, float y, float scale, bool centered, std::array color = { 1.f,1.f,1.f,1.f }); + // Clear cached meshes (call on window resize / DPI change) + void ClearCache(); + private: bool loadGlyphs(const std::string& ttfPath, int pixelSize, const std::string& zipfilename); @@ -48,6 +51,16 @@ private: VertexRenderStruct textMesh; std::string shaderName = "text2d"; + + // caching for static texts + struct CachedText { + VertexRenderStruct mesh; + float width = 0.f; // in pixels, total advance + float height = 0.f; // optional, not currently used + }; + + // key: text + "|" + scale + "|" + centered + std::unordered_map cache; }; } // namespace ZL \ No newline at end of file From 9793c5bf06660518c5bbc19fb412c3f79b306129 Mon Sep 17 00:00:00 2001 From: Vlad Date: Thu, 12 Feb 2026 18:13:19 +0600 Subject: [PATCH 05/17] fix npc --- src/Game.cpp | 4 +- src/network/LocalClient.cpp | 93 ++++++++++++++++++++++++++----------- src/network/LocalClient.h | 1 - 3 files changed, 67 insertions(+), 31 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 0e8d9a3..5879c07 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -835,7 +835,7 @@ namespace ZL { if (!textRenderer) return; -#ifdef NETWORK +//#ifdef NETWORK // 2D поверх 3D glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); @@ -882,7 +882,7 @@ namespace ZL glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); -#endif +//#endif } void Game::processTickCount() { diff --git a/src/network/LocalClient.cpp b/src/network/LocalClient.cpp index e0a8d36..5869c6a 100644 --- a/src/network/LocalClient.cpp +++ b/src/network/LocalClient.cpp @@ -68,7 +68,7 @@ namespace ZL { Eigen::Vector3f LocalClient::generateRandomPosition() { std::random_device rd; std::mt19937 gen(rd()); - std::uniform_real_distribution<> distrib(-50.0, 50.0); + std::uniform_real_distribution<> distrib(-500.0, 500.0); return Eigen::Vector3f( (float)distrib(gen), @@ -79,26 +79,24 @@ namespace ZL { void LocalClient::initializeNPCs() { npcs.clear(); - for (int i = 0; i < 3; ++i) { LocalNPC npc; npc.id = 100 + i; - npc.speed = 20.0f + (i * 5.0f); npc.currentState.id = npc.id; npc.currentState.position = generateRandomPosition(); npc.currentState.rotation = Eigen::Matrix3f::Identity(); - npc.currentState.velocity = npc.speed; + npc.currentState.velocity = 0.0f; + npc.currentState.selectedVelocity = 0; + npc.currentState.discreteMag = 0.0f; + npc.currentState.discreteAngle = -1; + npc.currentState.currentAngularVelocity = Eigen::Vector3f::Zero(); + npc.targetPosition = generateRandomPosition(); npc.lastStateUpdateMs = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); npc.stateHistory.add_state(npc.currentState); npcs.push_back(npc); - - std::cout << "LocalClient: Created NPC with id=" << npc.id - << " at pos (" << npc.currentState.position.x() << ", " - << npc.currentState.position.y() << ", " - << npc.currentState.position.z() << ")" << std::endl; } } @@ -108,37 +106,76 @@ namespace ZL { for (auto& npc : npcs) { uint64_t deltaMs = now_ms - npc.lastStateUpdateMs; - float dt = deltaMs / 1000.0f; + if (deltaMs == 0) { + npc.lastStateUpdateMs = now_ms; + continue; + } npc.lastStateUpdateMs = now_ms; - Eigen::Vector3f direction = npc.targetPosition - npc.currentState.position; - float distance = direction.norm(); + Eigen::Vector3f toTarget = npc.targetPosition - npc.currentState.position; + float distance = toTarget.norm(); - if (distance < 5.0f) { + const float ARRIVAL_THRESHOLD = 100.0f; + + if (distance < ARRIVAL_THRESHOLD) { npc.targetPosition = generateRandomPosition(); - direction = npc.targetPosition - npc.currentState.position; - distance = direction.norm(); + toTarget = npc.targetPosition - npc.currentState.position; + distance = toTarget.norm(); } - if (distance > 0.001f) { - direction.normalize(); - npc.currentState.position += direction * npc.speed * dt; - npc.currentState.velocity = npc.speed; + Eigen::Vector3f forwardWorld = -npc.currentState.rotation.col(2); + forwardWorld.normalize(); - Eigen::Vector3f localForward(0.0f, 0.0f, -1.0f); - Eigen::Vector3f worldForward = direction; + Eigen::Vector3f desiredDir = (distance > 0.001f) ? toTarget.normalized() : Eigen::Vector3f::UnitZ(); + float dot = forwardWorld.dot(desiredDir); + float angleErrorRad = std::acos(std::clamp(dot, -1.0f, 1.0f)); - Eigen::Vector3f cross = localForward.cross(worldForward); - float dot = localForward.dot(worldForward); + const float ALIGN_TOLERANCE = 0.15f; - if (cross.norm() > 0.001f) { - float angle = std::atan2(cross.norm(), dot); - cross.normalize(); - Eigen::AngleAxisf aa(angle * 0.05f, cross); - npc.currentState.rotation = npc.currentState.rotation * aa.toRotationMatrix(); + const float HYSTERESIS_FACTOR = 1.35f; + const float SOFT_THRUST_ANGLE = ALIGN_TOLERANCE * HYSTERESIS_FACTOR; + + if (angleErrorRad < ALIGN_TOLERANCE) { + npc.currentState.selectedVelocity = 1; + npc.currentState.discreteMag = 0.0f; + } + else if (angleErrorRad < SOFT_THRUST_ANGLE) { + npc.currentState.selectedVelocity = 1; + npc.currentState.discreteMag = std::min(0.50f, (angleErrorRad - ALIGN_TOLERANCE) * 10.0f); + } + else { + npc.currentState.selectedVelocity = 0; + + Eigen::Vector3f localDesired = npc.currentState.rotation.transpose() * desiredDir; + float dx = localDesired.x(); + float dy = localDesired.y(); + float dz = localDesired.z(); + + float turnX = dy; + float turnY = -dx; + float turnLen = std::sqrt(turnX * turnX + turnY * turnY); + + if (turnLen > 0.0001f) { + turnX /= turnLen; + turnY /= turnLen; + + float rad = std::atan2(turnX, turnY); + int angleDeg = static_cast(std::round(rad * 180.0f / M_PI)); + if (angleDeg < 0) angleDeg += 360; + + npc.currentState.discreteAngle = angleDeg; + npc.currentState.discreteMag = std::min(1.0f, angleErrorRad * 2.2f); + } + else if (angleErrorRad > 0.1f) { + npc.currentState.discreteAngle = 0; + npc.currentState.discreteMag = 1.0f; + } + else { + npc.currentState.discreteMag = 0.0f; } } + npc.currentState.simulate_physics(static_cast(deltaMs)); npc.currentState.lastUpdateServerTime = std::chrono::system_clock::time_point( std::chrono::milliseconds(now_ms)); npc.stateHistory.add_state(npc.currentState); diff --git a/src/network/LocalClient.h b/src/network/LocalClient.h index d94a82d..32fe19a 100644 --- a/src/network/LocalClient.h +++ b/src/network/LocalClient.h @@ -29,7 +29,6 @@ namespace ZL { ClientState currentState; ClientStateInterval stateHistory; Eigen::Vector3f targetPosition; - float speed = 30.0f; uint64_t lastStateUpdateMs = 0; }; From a8700af1d0a7b27b835272ba7041bb66b7b5e6db Mon Sep 17 00:00:00 2001 From: Vlad Date: Fri, 13 Feb 2026 15:40:40 +0600 Subject: [PATCH 06/17] added npc destroy --- src/Game.cpp | 1 + src/network/LocalClient.cpp | 78 +++++++++++++++++----- src/network/LocalClient.h | 125 ++++++++++++++++++------------------ 3 files changed, 126 insertions(+), 78 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 5879c07..662ade7 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -849,6 +849,7 @@ namespace ZL for (auto const& [id, remotePlayer] : remotePlayerStates) { + if (deadRemotePlayers.count(id)) continue; //<<<<<<< HEAD const ClientState& st = remotePlayer; diff --git a/src/network/LocalClient.cpp b/src/network/LocalClient.cpp index 5869c6a..c0a219e 100644 --- a/src/network/LocalClient.cpp +++ b/src/network/LocalClient.cpp @@ -17,7 +17,7 @@ namespace ZL { void LocalClient::generateBoxes() { serverBoxes.clear(); - + std::random_device rd; std::mt19937 gen(rd()); @@ -69,7 +69,7 @@ namespace ZL { std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<> distrib(-500.0, 500.0); - + return Eigen::Vector3f( (float)distrib(gen), (float)distrib(gen), @@ -94,6 +94,7 @@ namespace ZL { npc.targetPosition = generateRandomPosition(); npc.lastStateUpdateMs = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); + npc.destroyed = false; npc.stateHistory.add_state(npc.currentState); npcs.push_back(npc); @@ -105,6 +106,8 @@ namespace ZL { std::chrono::system_clock::now().time_since_epoch()).count(); for (auto& npc : npcs) { + if (npc.destroyed) continue; + uint64_t deltaMs = now_ms - npc.lastStateUpdateMs; if (deltaMs == 0) { npc.lastStateUpdateMs = now_ms; @@ -191,12 +194,12 @@ namespace ZL { void LocalClient::updatePhysics() { auto now_ms = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); - + if (lastUpdateMs == 0) { lastUpdateMs = now_ms; return; } - + uint64_t deltaMs = now_ms - lastUpdateMs; float dt = deltaMs / 1000.0f; lastUpdateMs = now_ms; @@ -229,6 +232,7 @@ namespace ZL { const float projectileHitRadius = 1.5f; const float boxCollisionRadius = 2.0f; const float shipCollisionRadius = 15.0f; + const float npcCollisionRadius = 5.0f; std::vector> boxProjectileCollisions; @@ -266,7 +270,48 @@ namespace ZL { std::cout << "LocalClient: Box " << boxIdx << " destroyed by projectile from player " << projectiles[projIdx].shooterId << std::endl; - if (std::find(projIndicesToRemove.begin(), projIndicesToRemove.end(), (int)projIdx) + if (std::find(projIndicesToRemove.begin(), projIndicesToRemove.end(), (int)projIdx) + == projIndicesToRemove.end()) { + projIndicesToRemove.push_back(static_cast(projIdx)); + } + } + } + + std::vector> npcProjectileCollisions; + + for (size_t ni = 0; ni < npcs.size(); ++ni) { + if (npcs[ni].destroyed) continue; + + for (size_t pi = 0; pi < projectiles.size(); ++pi) { + const auto& pr = projectiles[pi]; + Eigen::Vector3f diff = pr.pos - npcs[ni].currentState.position; + float thresh = npcCollisionRadius + projectileHitRadius; + + if (diff.squaredNorm() <= thresh * thresh) { + npcProjectileCollisions.push_back({ ni, pi }); + } + } + } + + for (const auto& [npcIdx, projIdx] : npcProjectileCollisions) { + if (!npcs[npcIdx].destroyed) { + npcs[npcIdx].destroyed = true; + + DeathInfo death; + death.targetId = npcs[npcIdx].id; + death.serverTime = now_ms; + death.position = npcs[npcIdx].currentState.position; + death.killerId = projectiles[projIdx].shooterId; + + pendingDeaths.push_back(death); + + std::cout << "LocalClient: NPC " << npcs[npcIdx].id << " destroyed by projectile from player " + << projectiles[projIdx].shooterId << " at position (" + << npcs[npcIdx].currentState.position.x() << ", " + << npcs[npcIdx].currentState.position.y() << ", " + << npcs[npcIdx].currentState.position.z() << ")" << std::endl; + + if (std::find(projIndicesToRemove.begin(), projIndicesToRemove.end(), (int)projIdx) == projIndicesToRemove.end()) { projIndicesToRemove.push_back(static_cast(projIdx)); } @@ -317,7 +362,7 @@ namespace ZL { tokens.push_back(token); } return tokens; - }(message, ':'); + }(message, ':'); if (parts.empty()) return; @@ -371,8 +416,8 @@ namespace ZL { pinfo.velocity = velocity; pendingProjectiles.push_back(pinfo); - std::cout << "LocalClient: Created projectile at pos (" << shotPos.x() << ", " - << shotPos.y() << ", " << shotPos.z() << ") vel (" << pr.vel.x() << ", " + std::cout << "LocalClient: Created projectile at pos (" << shotPos.x() << ", " + << shotPos.y() << ", " << shotPos.z() << ") vel (" << pr.vel.x() << ", " << pr.vel.y() << ", " << pr.vel.z() << ")" << std::endl; } } @@ -384,10 +429,18 @@ namespace ZL { return result; } + std::vector LocalClient::getPendingDeaths() { + auto result = pendingDeaths; + pendingDeaths.clear(); + return result; + } + std::unordered_map LocalClient::getRemotePlayers() { std::unordered_map result; for (const auto& npc : npcs) { - result[npc.id] = npc.stateHistory; + if (!npc.destroyed) { + result[npc.id] = npc.stateHistory; + } } return result; } @@ -400,16 +453,9 @@ namespace ZL { return result; } - std::vector LocalClient::getPendingDeaths() { - auto result = pendingDeaths; - pendingDeaths.clear(); - return result; - } - std::vector LocalClient::getPendingBoxDestructions() { auto result = pendingBoxDestructions; pendingBoxDestructions.clear(); return result; } - } \ No newline at end of file diff --git a/src/network/LocalClient.h b/src/network/LocalClient.h index 32fe19a..c8707a4 100644 --- a/src/network/LocalClient.h +++ b/src/network/LocalClient.h @@ -9,78 +9,79 @@ namespace ZL { - struct LocalServerBox { - Eigen::Vector3f position; - Eigen::Matrix3f rotation; - float collisionRadius = 2.0f; - bool destroyed = false; - }; + struct LocalServerBox { + Eigen::Vector3f position; + Eigen::Matrix3f rotation; + float collisionRadius = 2.0f; + bool destroyed = false; + }; - struct LocalProjectile { - int shooterId = -1; - uint64_t spawnMs = 0; - Eigen::Vector3f pos; - Eigen::Vector3f vel; - float lifeMs = 5000.0f; - }; + struct LocalProjectile { + int shooterId = -1; + uint64_t spawnMs = 0; + Eigen::Vector3f pos; + Eigen::Vector3f vel; + float lifeMs = 5000.0f; + }; - struct LocalNPC { - int id = -1; - ClientState currentState; - ClientStateInterval stateHistory; - Eigen::Vector3f targetPosition; - uint64_t lastStateUpdateMs = 0; - }; + struct LocalNPC { + int id = -1; + ClientState currentState; + ClientStateInterval stateHistory; + Eigen::Vector3f targetPosition; + uint64_t lastStateUpdateMs = 0; + bool destroyed = false; + }; - class LocalClient : public INetworkClient { - private: - std::queue messageQueue; - std::vector serverBoxes; - std::vector projectiles; - std::vector pendingProjectiles; - std::vector pendingDeaths; - std::vector pendingBoxDestructions; - std::vector pendingRespawns; - - uint64_t lastUpdateMs = 0; - ClientState localPlayerState; - bool hasLocalPlayerState = false; - - std::vector npcs; - - void updatePhysics(); - void checkCollisions(); - void generateBoxes(); - void initializeNPCs(); - void updateNPCs(); - Eigen::Vector3f generateRandomPosition(); - - public: - void Connect(const std::string& host, uint16_t port) override; + class LocalClient : public INetworkClient { + private: + std::queue messageQueue; + std::vector serverBoxes; + std::vector projectiles; + std::vector pendingProjectiles; + std::vector pendingDeaths; + std::vector pendingBoxDestructions; + std::vector pendingRespawns; - void Poll() override; + uint64_t lastUpdateMs = 0; + ClientState localPlayerState; + bool hasLocalPlayerState = false; - void Send(const std::string& message) override; + std::vector npcs; - bool IsConnected() const override { return true; } - int GetClientId() const override { return 1; } - std::vector getPendingProjectiles() override; + void updatePhysics(); + void checkCollisions(); + void generateBoxes(); + void initializeNPCs(); + void updateNPCs(); + Eigen::Vector3f generateRandomPosition(); - std::unordered_map getRemotePlayers() override; + public: + void Connect(const std::string& host, uint16_t port) override; - std::vector> getServerBoxes() override; + void Poll() override; - std::vector getPendingDeaths() override; + void Send(const std::string& message) override; - std::vector getPendingRespawns() override { - return {}; - } + bool IsConnected() const override { return true; } + int GetClientId() const override { return 1; } + std::vector getPendingProjectiles() override; - std::vector getPendingBoxDestructions() override; + std::unordered_map getRemotePlayers() override; - void setLocalPlayerState(const ClientState& state) { - localPlayerState = state; - hasLocalPlayerState = true; - } - }; + std::vector> getServerBoxes() override; + + std::vector getPendingDeaths() override; + + std::vector getPendingRespawns() override { + return {}; + } + + std::vector getPendingBoxDestructions() override; + + void setLocalPlayerState(const ClientState& state) { + localPlayerState = state; + hasLocalPlayerState = true; + } + }; } \ No newline at end of file From 528c94e921a8e16270e7298b5b10c8a4e3d8d8c9 Mon Sep 17 00:00:00 2001 From: vottozi Date: Thu, 19 Feb 2026 01:13:08 +0600 Subject: [PATCH 07/17] Add enemy target brackets + off-screen arrows --- src/Game.cpp | 288 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/Game.h | 11 ++ 2 files changed, 296 insertions(+), 3 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 32b95d7..e1e2a8c 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -174,6 +174,25 @@ namespace ZL return true; } + bool Game::projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const + { + float aspect = static_cast(Environment::width) / static_cast(Environment::height); + Eigen::Matrix4f V = makeViewMatrix_FromYourCamera(); + Eigen::Matrix4f P = makePerspective(1.0f / 1.5f, aspect, Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); + + Eigen::Vector4f w(world.x(), world.y(), world.z(), 1.0f); + Eigen::Vector4f clip = P * V * w; + + clipW = clip.w(); + if (std::abs(clipW) < 1e-6f) return false; + + Eigen::Vector3f ndc = clip.head<3>() / clipW; + ndcX = ndc.x(); + ndcY = ndc.y(); + ndcZ = ndc.z(); + return true; + } + void Game::drawBoxesLabels() { if (!textRenderer) return; @@ -205,11 +224,9 @@ namespace ZL float uiX = sx; float uiY = sy; // если окажется вверх ногами — замени на (Environment::height - sy) - // Можно делать масштаб по дальности: чем дальше — тем меньше. - // depth в NDC: ближе к -1 (near) и к 1 (far). Стабильнее считать по расстоянию: float dist = (Environment::shipState.position - boxWorld).norm(); float scaleRaw = 120.0f / (dist + 1.0f); - float scale = std::round(scaleRaw * 10.0f) / 10.0f; + float scale = std::round(scaleRaw * 10.0f) / 10.0f; // округление до 0.1 scale = std::clamp(scale, 0.6f, 1.2f); textRenderer->drawText(boxLabels[i], uiX, uiY, scale, /*centered*/true); @@ -738,6 +755,7 @@ namespace ZL drawBoxesLabels(); drawUI(); + drawTargetHud(); CheckGlError(); } @@ -877,6 +895,270 @@ namespace ZL #endif } + int Game::pickTargetId() const + { + int bestId = -1; + constexpr float INF_F = 1e30f; + float bestDistSq = INF_F; + + for (auto const& [id, st] : remotePlayerStates) { + if (deadRemotePlayers.count(id)) continue; + + float d2 = (Environment::shipState.position - st.position).squaredNorm(); + if (d2 < bestDistSq) { + bestDistSq = d2; + bestId = id; + } + } + return bestId; + } + + static VertexDataStruct MakeColoredRect2D(float cx, float cy, float hw, float hh, float z, + const Eigen::Vector4f& rgba) + { + VertexDataStruct v; + // 2 triangles + Vector3f p1{ cx - hw, cy - hh, z }; + Vector3f p2{ cx - hw, cy + hh, z }; + Vector3f p3{ cx + hw, cy + hh, z }; + Vector3f p4{ cx + hw, cy - hh, z }; + + v.PositionData = { p1, p2, p3, p3, p4, p1 }; + + // defaultColor shader likely uses vColor (vec3), но нам нужен alpha. + // У тебя в Renderer есть RenderUniform4fv, но шейдер может брать vColor. + // Поэтому: сделаем ColorData vec3, а alpha дадим через uniform uColor, если есть. + // Если в defaultColor нет uniform uColor — тогда alpha будет 1.0. + // Для совместимости: кладём RGB, alpha будем задавать uniform'ом отдельно. + Vector3f rgb{ rgba.x(), rgba.y(), rgba.z() }; + v.ColorData = { rgb, rgb, rgb, rgb, rgb, rgb }; + return v; + } + + void Game::drawTargetHud() + { + if (!textRenderer) return; + + // 1) выбираем цель + int targetIdNow = pickTargetId(); + if (targetIdNow < 0) { + trackedTargetId = -1; + targetAcquireAnim = 0.f; + targetWasVisible = false; + return; + } + + // если цель сменилась — сброс анимации “схлопывания” + if (trackedTargetId != targetIdNow) { + trackedTargetId = targetIdNow; + targetAcquireAnim = 0.0f; + targetWasVisible = false; + } + + const ClientState& st = remotePlayerStates.at(trackedTargetId); + Vector3f shipWorld = st.position; + + // 2) проекция + float ndcX, ndcY, ndcZ, clipW; + if (!projectToNDC(shipWorld, ndcX, ndcY, ndcZ, clipW)) return; + + // behind camera? + bool behind = (clipW <= 0.0f); + + // on-screen check (NDC) + bool onScreen = (!behind && + ndcX >= -1.0f && ndcX <= 1.0f && + ndcY >= -1.0f && ndcY <= 1.0f); + + // 3) расстояние + float dist = (Environment::shipState.position - shipWorld).norm(); + + // time for arrow bob + float t = static_cast(SDL_GetTicks64()) * 0.001f; + + // 4) Настройки стиля (как X3) + Eigen::Vector4f enemyColor(1.f, 0.f, 0.f, 1.f); // красный + float thickness = 2.0f; // толщина линий (px) + float z = 0.0f; // 2D слой + + // 5) Если цель в кадре: рисуем скобки + if (onScreen) + { + // перевод NDC -> экран (в пикселях) + float sx = (ndcX * 0.5f + 0.5f) * Environment::width; + float sy = (ndcY * 0.5f + 0.5f) * Environment::height; + + // анимация “снаружи внутрь” + // targetAcquireAnim растёт к 1, быстро (похоже на захват) + float dt = 1.0f / 60.0f; // у тебя нет dt в draw, берём константу, выглядит норм + targetAcquireAnim = min(1.0f, targetAcquireAnim + dt * 6.5f); + + // базовый размер рамки в зависимости от дистанции (как у лейблов) + float size = 220.0f / (dist * 0.01f + 1.0f); // подстройка + size = std::clamp(size, 35.0f, 120.0f); // min/max + + // “схлопывание”: сначала больше, потом ближе к кораблю + // expand 1.6 -> 1.0 + float expand = 1.6f - 0.6f * targetAcquireAnim; + + float half = size * expand; + float cornerLen = max(10.0f, half * 0.35f); + + // точки углов + float left = sx - half; + float right = sx + half; + float bottom = sy - half; + float top = sy + half; + + // рисуем 8 тонких прямоугольников (2 на угол) + auto drawBar = [&](float cx, float cy, float w, float h) + { + VertexDataStruct v = MakeColoredRect2D(cx, cy, w * 0.5f, h * 0.5f, z, enemyColor); + hudTempMesh.AssignFrom(v); + renderer.DrawVertexRenderStruct(hudTempMesh); + }; + + // включаем 2D режим + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + renderer.shaderManager.PushShader("defaultColor"); + renderer.PushProjectionMatrix((float)Environment::width, (float)Environment::height, 0.f, 1.f); + renderer.PushMatrix(); + renderer.LoadIdentity(); + + // верх-лево: горизонт + вертикаль + drawBar(left + cornerLen * 0.5f, top, cornerLen, thickness); + drawBar(left, top - cornerLen * 0.5f, thickness, cornerLen); + + // верх-право + drawBar(right - cornerLen * 0.5f, top, cornerLen, thickness); + drawBar(right, top - cornerLen * 0.5f, thickness, cornerLen); + + // низ-лево + drawBar(left + cornerLen * 0.5f, bottom, cornerLen, thickness); + drawBar(left, bottom + cornerLen * 0.5f, thickness, cornerLen); + + // низ-право + drawBar(right - cornerLen * 0.5f, bottom, cornerLen, thickness); + drawBar(right, bottom + cornerLen * 0.5f, thickness, cornerLen); + + renderer.PopMatrix(); + renderer.PopProjectionMatrix(); + renderer.shaderManager.PopShader(); + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + + targetWasVisible = true; + return; + } + + // 6) Если цель offscreen: рисуем стрелку на краю + // dir: куда “смотреть” в NDC + float dirX = ndcX; + float dirY = ndcY; + + // если позади камеры — разворачиваем направление + if (behind) { + dirX = -dirX; + dirY = -dirY; + } + + float len = std::sqrt(dirX * dirX + dirY * dirY); + if (len < 1e-5f) return; + dirX /= len; + dirY /= len; + + // пересечение луча с прямоугольником [-1..1] с отступом + float marginNdc = 0.08f; + float maxX = 1.0f - marginNdc; + float maxY = 1.0f - marginNdc; + + float tx = (std::abs(dirX) < 1e-6f) ? 1e9f : (maxX / std::abs(dirX)); + float ty = (std::abs(dirY) < 1e-6f) ? 1e9f : (maxY / std::abs(dirY)); + float k = min(tx, ty); + + float edgeNdcX = dirX * k; + float edgeNdcY = dirY * k; + + float edgeX = (edgeNdcX * 0.5f + 0.5f) * Environment::width; + float edgeY = (edgeNdcY * 0.5f + 0.5f) * Environment::height; + + // лёгкая анимация “зова”: смещение по направлению + float bob = std::sin(t * 6.0f) * 6.0f; + edgeX += dirX * bob; + edgeY += dirY * bob; + + // стрелка как треугольник + маленький “хвост” + float arrowLen = 26.0f; + float arrowWid = 14.0f; + + // перпендикуляр + float px = -dirY; + float py = dirX; + + Vector3f tip{ edgeX + dirX * arrowLen, edgeY + dirY * arrowLen, z }; + Vector3f left{ edgeX + px * (arrowWid * 0.5f), edgeY + py * (arrowWid * 0.5f), z }; + Vector3f right{ edgeX - px * (arrowWid * 0.5f), edgeY - py * (arrowWid * 0.5f), z }; + + auto drawTri = [&](const Vector3f& a, const Vector3f& b, const Vector3f& c) + { + VertexDataStruct v; + v.PositionData = { a, b, c }; + Vector3f rgb{ enemyColor.x(), enemyColor.y(), enemyColor.z() }; + v.ColorData = { rgb, rgb, rgb }; + hudTempMesh.AssignFrom(v); + renderer.DrawVertexRenderStruct(hudTempMesh); + }; + + auto drawBar = [&](float cx, float cy, float w, float h) + { + VertexDataStruct v = MakeColoredRect2D(cx, cy, w * 0.5f, h * 0.5f, z, enemyColor); + hudTempMesh.AssignFrom(v); + renderer.DrawVertexRenderStruct(hudTempMesh); + }; + + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + renderer.shaderManager.PushShader("defaultColor"); + renderer.PushProjectionMatrix((float)Environment::width, (float)Environment::height, 0.f, 1.f); + renderer.PushMatrix(); + renderer.LoadIdentity(); + + // треугольник-стрелка + drawTri(tip, left, right); + + // “хвост” (короткая черта) + float tailLen = 14.0f; + float tailX = edgeX - dirX * 6.0f; + float tailY = edgeY - dirY * 6.0f; + // хвост рисуем как тонкий прямоугольник, ориентированный примерно по направлению: + // (упрощение: горизонт/вертикаль не поворачиваем, но выглядит ок. Хочешь — сделаем поворот матрицей) + drawBar(tailX, tailY, max(thickness, tailLen), thickness); + + renderer.PopMatrix(); + renderer.PopProjectionMatrix(); + renderer.shaderManager.PopShader(); + + // дистанция рядом со стрелкой + // (у тебя ещё будет “статично под прицелом” — это просто другой TextView / drawText) + { + std::string d = std::to_string((int)dist) + "m"; + float tx = edgeX + px * 18.0f; + float ty = edgeY + py * 18.0f; + textRenderer->drawText(d, tx, ty, 0.6f, true, { 1.f, 0.f, 0.f, 1.f }); + } + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + + targetWasVisible = false; + } + void Game::processTickCount() { if (lastTickCount == 0) { diff --git a/src/Game.h b/src/Game.h index 02711f6..34e1972 100644 --- a/src/Game.h +++ b/src/Game.h @@ -133,7 +133,18 @@ namespace ZL { std::unordered_set deadRemotePlayers; + // --- Target HUD (brackets + offscreen arrow) --- + int trackedTargetId = -1; + bool targetWasVisible = false; + float targetAcquireAnim = 0.0f; // 0..1 схлопывание (0 = далеко, 1 = на месте) + // временный меш для HUD (будем перезаливать VBO маленькими порциями) + VertexRenderStruct hudTempMesh; + + // helpers + bool projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const; + void drawTargetHud(); // рисует рамку или стрелку + int pickTargetId() const; // выбирает цель (пока: ближайший живой удаленный игрок) }; From 7693237aa57d422713a3dc2b53eeb023aa9af848 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 22 Feb 2026 13:29:06 +0300 Subject: [PATCH 08/17] Added websocket --- src/Game.cpp | 3 ++- src/network/WebSocketClientEmscripten.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 9e6c6ee..ac6d462 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -469,7 +469,7 @@ namespace ZL #ifdef NETWORK #ifdef EMSCRIPTEN networkClient = std::make_unique(); - networkClient->Connect("localhost", 8081); + networkClient->Connect("192.168.131.143", 8081); #else networkClient = std::make_unique(taskManager.getIOContext()); networkClient->Connect("127.0.0.1", 8081); @@ -480,6 +480,7 @@ namespace ZL #endif } + void Game::drawCubemap(float skyPercent) { static const std::string defaultShaderName = "default"; diff --git a/src/network/WebSocketClientEmscripten.cpp b/src/network/WebSocketClientEmscripten.cpp index b85f3bf..98044e9 100644 --- a/src/network/WebSocketClientEmscripten.cpp +++ b/src/network/WebSocketClientEmscripten.cpp @@ -7,7 +7,8 @@ namespace ZL { void WebSocketClientEmscripten::Connect(const std::string& host, uint16_t port) { // Формируем URL. Обратите внимание, что в Web часто лучше использовать ws://localhost - std::string url = "ws://" + host + ":" + std::to_string(port); + //std::string url = "ws://" + host + ":" + std::to_string(port); + std::string url = "wss://api.spacegame.fishrungames.com"; EmscriptenWebSocketCreateAttributes attr = { url.c_str(), From efad2dde3e8487841354246bb47171de56ae2d46 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 22 Feb 2026 14:08:12 +0300 Subject: [PATCH 09/17] Restore as it was before --- server/server.cpp | 412 ++++++++++++++++++++++++++-------------------- 1 file changed, 230 insertions(+), 182 deletions(-) diff --git a/server/server.cpp b/server/server.cpp index 8a0ef00..4898cae 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -41,42 +41,6 @@ std::vector split(const std::string& s, char delimiter) { return tokens; } -// Вспомогательная функция для проверки столкновения снаряда с объектом-сферой -bool checkSegmentSphereCollision( - int x, - const Eigen::Vector3f& pStart, - const Eigen::Vector3f& pEnd, - const Eigen::Vector3f& targetCenter, - float combinedRadius) -{ - Eigen::Vector3f segment = pEnd - pStart; - Eigen::Vector3f toTarget = targetCenter - pStart; - - float segmentLenSq = segment.squaredNorm(); - if (segmentLenSq < 1e-6f) { - return toTarget.norm() <= combinedRadius; - } - - // Находим проекцию точки targetCenter на прямую, содержащую отрезок - // t — это нормализованный параметр вдоль отрезка (от 0 до 1) - float t = toTarget.dot(segment) / segmentLenSq; - - // Ограничиваем t, чтобы найти ближайшую точку именно на ОТРЕЗКЕ - t = std::max(0.0f, std::min(1.0f, t)); - - // Ближайшая точка на отрезке к центру цели - Eigen::Vector3f closestPoint = pStart + t * segment; - /* - std::cout << "Collision for box: " << x << " pStart: " << pStart - << " pEnd: " << pEnd - << " targetCenter: " << targetCenter - << " closestPoint: " << closestPoint - << " t: " << t << std::endl; - */ - // Проверяем расстояние от ближайшей точки до центра цели - return (targetCenter - closestPoint).squaredNorm() <= (combinedRadius * combinedRadius); -} - struct ServerBox { Eigen::Vector3f position; Eigen::Matrix3f rotation; @@ -99,6 +63,9 @@ struct BoxDestroyedInfo { int destroyedBy = -1; }; +std::vector g_boxDestructions; +std::mutex g_boxDestructions_mutex; + std::vector g_serverBoxes; std::mutex g_boxes_mutex; @@ -217,14 +184,11 @@ public: timer->expires_after(std::chrono::milliseconds(100)); timer->async_wait([self = shared_from_this(), timer](const boost::system::error_code& ec) { if (!ec) { - int64_t serverNow = std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()).count(); - self->send_message("ID:" + std::to_string(self->id_) + ":" + std::to_string(serverNow)); + self->send_message("ID:" + std::to_string(self->id_)); self->do_read(); } }); } - ClientState get_latest_state(std::chrono::system_clock::time_point now) { if (timedClientStates.timedStates.empty()) { @@ -295,8 +259,6 @@ private: } std::string cleanMessage = msg.substr(0, msg.find("#hash:")); - - std::cout << "Received from player " << id_ << ": " << cleanMessage << std::endl; auto parts = split(cleanMessage, ':'); @@ -427,95 +389,66 @@ void broadcastToAll(const std::string& message) { } } -void checkShipBoxCollisions(std::chrono::system_clock::time_point now, uint64_t now_ms, std::vector& boxDestructions) { - // Внимание: Мьютексы g_boxes_mutex и g_sessions_mutex должны быть захвачены - // внешним кодом в update_world перед вызовом этой функции. +void update_world(net::steady_timer& timer, net::io_context& ioc) { - const float shipCollisionRadius = 15.0f; - const float boxCollisionRadius = 2.0f; - const float thresh = shipCollisionRadius + boxCollisionRadius; - const float threshSq = thresh * thresh; + static auto last_snapshot_time = std::chrono::steady_clock::now(); + auto now = std::chrono::steady_clock::now(); + /*static uint64_t lastTickCount = 0; - for (size_t bi = 0; bi < g_serverBoxes.size(); ++bi) { - if (g_serverBoxes[bi].destroyed) continue; + if (lastTickCount == 0) { + //lastTickCount = SDL_GetTicks64(); + lastTickCount = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch() + ).count(); - // Центр ящика в мировых координатах - Eigen::Vector3f boxWorld = g_serverBoxes[bi].position + Eigen::Vector3f(0.0f, 0.0f, 45000.0f); + lastTickCount = (lastTickCount / 50) * 50; + + return; + } + + + auto newTickCount = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch() + ).count(); + + newTickCount = (newTickCount / 50) * 50; + + int64_t deltaMs = static_cast(newTickCount - lastTickCount); + + std::chrono::system_clock::time_point nowRounded = std::chrono::system_clock::time_point(std::chrono::milliseconds(newTickCount)); + */ + // For each player + // Get letest state + add time (until newTickCount) + // Calculate if collisions with boxes + + + + + // Рассылка Snapshot раз в 1000мс + /* + if (std::chrono::duration_cast(now - last_snapshot_time).count() >= 1000) { + last_snapshot_time = now; + + auto system_now = std::chrono::system_clock::now(); + + std::string snapshot_msg = "SNAPSHOT:" + std::to_string( + std::chrono::duration_cast( + system_now.time_since_epoch()).count() + ); + + std::lock_guard lock(g_sessions_mutex); + + // Формируем общую строку состояний всех игроков + for (auto& session : g_sessions) { + ClientState st = session->get_latest_state(system_now); + snapshot_msg += "|" + std::to_string(session->get_id()) + ":" + st.formPingMessageContent(); + } for (auto& session : g_sessions) { - int playerId = session->get_id(); - - // Пропускаем мертвых игроков - { - // Если g_dead_mutex не захвачен глобально в update_world, раскомментируйте: - // std::lock_guard gd(g_dead_mutex); - if (g_dead_players.count(playerId)) continue; - } - - ClientState shipState; - // Получаем состояние игрока на текущий момент времени сервера - if (!session->fetchStateAtTime(now, shipState)) continue; - - Eigen::Vector3f diff = shipState.position - boxWorld; - - // Проверка столкновения сфер - if (diff.squaredNorm() <= threshSq) { - g_serverBoxes[bi].destroyed = true; - - // Регистрируем уничтожение ящика - BoxDestroyedInfo destruction; - destruction.boxIndex = static_cast(bi); - destruction.serverTime = now_ms; - destruction.position = boxWorld; - destruction.destroyedBy = playerId; - - boxDestructions.push_back(destruction); - - std::cout << "Server: Box " << bi << " smashed by player " << playerId << std::endl; - - // Один ящик не может быть уничтожен дважды за один проход - break; - } + session->send_message(snapshot_msg); } - } -} + }*/ -void dispatchEvents(const std::vector& deathEvents, const std::vector& boxDestructions) { - // 1. Рассылка событий смерти игроков - for (const auto& death : deathEvents) { - std::string deadMsg = "DEAD:" + - std::to_string(death.serverTime) + ":" + - std::to_string(death.targetId) + ":" + - std::to_string(death.position.x()) + ":" + - std::to_string(death.position.y()) + ":" + - std::to_string(death.position.z()) + ":" + - std::to_string(death.killerId); - - broadcastToAll(deadMsg); - - std::cout << "Server: Sent DEAD event - Player " << death.targetId - << " killed by " << death.killerId << std::endl; - } - - // 2. Рассылка событий разрушения ящиков - - for (const auto& destruction : boxDestructions) { - std::string boxMsg = "BOX_DESTROYED:" + - std::to_string(destruction.boxIndex) + ":" + - std::to_string(destruction.serverTime) + ":" + - std::to_string(destruction.position.x()) + ":" + - std::to_string(destruction.position.y()) + ":" + - std::to_string(destruction.position.z()) + ":" + - std::to_string(destruction.destroyedBy); - - broadcastToAll(boxMsg); - - std::cout << "Server: Broadcasted BOX_DESTROYED for box " - << destruction.boxIndex << std::endl; - } -} - -void update_world(net::steady_timer& timer, net::io_context& ioc) { const std::chrono::milliseconds interval(50); timer.expires_after(interval); @@ -523,90 +456,205 @@ void update_world(net::steady_timer& timer, net::io_context& ioc) { if (ec) return; auto now = std::chrono::system_clock::now(); - uint64_t now_ms = std::chrono::duration_cast(now.time_since_epoch()).count(); - float dt = 50.0f / 1000.0f; + uint64_t now_ms = static_cast(std::chrono::duration_cast(now.time_since_epoch()).count()); std::vector deathEvents; - std::vector boxDestructions; - std::vector projectilesToRemove; { - // Захватываем необходимые данные под мьютексами один раз std::lock_guard pl(g_projectiles_mutex); - std::lock_guard bm(g_boxes_mutex); - std::lock_guard sm(g_sessions_mutex); - std::lock_guard gm(g_dead_mutex); + std::vector indicesToRemove; + + float dt = 50.0f / 1000.0f; for (size_t i = 0; i < g_projectiles.size(); ++i) { auto& pr = g_projectiles[i]; - Eigen::Vector3f oldPos = pr.pos; - pr.pos += pr.vel * dt; - Eigen::Vector3f newPos = pr.pos; - // 1. Проверка времени жизни снаряда + pr.pos += pr.vel * dt; + if (now_ms > pr.spawnMs + static_cast(pr.lifeMs)) { - projectilesToRemove.push_back(static_cast(i)); + indicesToRemove.push_back(static_cast(i)); continue; } bool hitDetected = false; - // 2. Проверка коллизий снаряда с игроками (Ray-cast) - for (auto& session : g_sessions) { - int targetId = session->get_id(); - if (targetId == pr.shooterId || g_dead_players.count(targetId)) continue; + { + std::lock_guard lm(g_sessions_mutex); + std::lock_guard gd(g_dead_mutex); - ClientState targetState; - if (!session->fetchStateAtTime(now, targetState)) continue; + for (auto& session : g_sessions) { + int targetId = session->get_id(); - if (checkSegmentSphereCollision(0, oldPos, newPos, targetState.position, 15.0f + 1.5f)) { - deathEvents.push_back({ targetId, now_ms, newPos, pr.shooterId }); - g_dead_players.insert(targetId); - hitDetected = true; - break; + if (targetId == pr.shooterId) continue; + if (g_dead_players.find(targetId) != g_dead_players.end()) continue; + + ClientState targetState; + if (!session->fetchStateAtTime(now, targetState)) continue; + + Eigen::Vector3f diff = pr.pos - targetState.position; + const float shipRadius = 15.0f; + const float projectileRadius = 1.5f; + float combinedRadius = shipRadius + projectileRadius; + + if (diff.squaredNorm() <= combinedRadius * combinedRadius) { + DeathInfo death; + death.targetId = targetId; + death.serverTime = now_ms; + death.position = pr.pos; + death.killerId = pr.shooterId; + + deathEvents.push_back(death); + g_dead_players.insert(targetId); + indicesToRemove.push_back(static_cast(i)); + hitDetected = true; + + std::cout << "Server: *** HIT DETECTED! ***" << std::endl; + std::cout << "Server: Projectile at (" + << pr.pos.x() << ", " << pr.pos.y() << ", " << pr.pos.z() + << ") hit player " << targetId << std::endl; + break; + } } } - if (hitDetected) { - projectilesToRemove.push_back(static_cast(i)); - continue; - } - - // 3. Проверка коллизий снаряда с ящиками (Ray-cast) - for (size_t bi = 0; bi < g_serverBoxes.size(); ++bi) { - if (g_serverBoxes[bi].destroyed) continue; - - // Центр ящика с учетом смещения мира - Eigen::Vector3f boxWorld = g_serverBoxes[bi].position + Eigen::Vector3f(0.0f, 0.0f, 45000.0f); - - if (checkSegmentSphereCollision(bi, oldPos, newPos, boxWorld, 2.0f + 1.5f)) { - g_serverBoxes[bi].destroyed = true; - - boxDestructions.push_back({ static_cast(bi), now_ms, boxWorld, pr.shooterId }); - - hitDetected = true; - break; - } - } - - if (hitDetected) { - projectilesToRemove.push_back(static_cast(i)); - } + if (hitDetected) continue; } - // Удаляем отработавшие снаряды (с конца) - std::sort(projectilesToRemove.rbegin(), projectilesToRemove.rend()); - for (int idx : projectilesToRemove) { - g_projectiles.erase(g_projectiles.begin() + idx); + if (!indicesToRemove.empty()) { + std::sort(indicesToRemove.rbegin(), indicesToRemove.rend()); + for (int idx : indicesToRemove) { + if (idx >= 0 && idx < (int)g_projectiles.size()) { + g_projectiles.erase(g_projectiles.begin() + idx); + } + } } } - // 4. Отдельная проверка столкновения кораблей с ящиками (Point-Sphere) - // Эту логику оставляем отдельно, так как она не привязана к снарядам - checkShipBoxCollisions(now, now_ms, boxDestructions); + { + std::lock_guard bm(g_boxes_mutex); + const float projectileHitRadius = 1.5f; + const float boxCollisionRadius = 2.0f; - // Рассылка событий - dispatchEvents(deathEvents, boxDestructions); + std::vector> boxProjectileCollisions; + + for (size_t bi = 0; bi < g_serverBoxes.size(); ++bi) { + if (g_serverBoxes[bi].destroyed) continue; + + Eigen::Vector3f boxWorld = g_serverBoxes[bi].position + Eigen::Vector3f(0.0f, 6.0f, 45000.0f); + + for (size_t pi = 0; pi < g_projectiles.size(); ++pi) { + const auto& pr = g_projectiles[pi]; + Eigen::Vector3f diff = pr.pos - boxWorld; + float thresh = boxCollisionRadius + projectileHitRadius; + + if (diff.squaredNorm() <= thresh * thresh) { + boxProjectileCollisions.push_back({ bi, pi }); + } + } + } + + for (const auto& [boxIdx, projIdx] : boxProjectileCollisions) { + g_serverBoxes[boxIdx].destroyed = true; + + Eigen::Vector3f boxWorld = g_serverBoxes[boxIdx].position + Eigen::Vector3f(0.0f, 0.0f, 45000.0f); + + BoxDestroyedInfo destruction; + destruction.boxIndex = static_cast(boxIdx); + destruction.serverTime = now_ms; + destruction.position = boxWorld; + destruction.destroyedBy = g_projectiles[projIdx].shooterId; + + { + std::lock_guard dm(g_boxDestructions_mutex); + g_boxDestructions.push_back(destruction); + } + + std::cout << "Server: Box " << boxIdx << " destroyed by projectile from player " + << g_projectiles[projIdx].shooterId << std::endl; + } + } + + { + std::lock_guard bm(g_boxes_mutex); + std::lock_guard lm(g_sessions_mutex); + + const float shipCollisionRadius = 15.0f; + const float boxCollisionRadius = 2.0f; + + for (size_t bi = 0; bi < g_serverBoxes.size(); ++bi) { + if (g_serverBoxes[bi].destroyed) continue; + + Eigen::Vector3f boxWorld = g_serverBoxes[bi].position + Eigen::Vector3f(0.0f, 0.0f, 45000.0f); + + for (auto& session : g_sessions) { + { + std::lock_guard gd(g_dead_mutex); + if (g_dead_players.find(session->get_id()) != g_dead_players.end()) { + continue; + } + } + + ClientState shipState; + if (!session->fetchStateAtTime(now, shipState)) continue; + + Eigen::Vector3f diff = shipState.position - boxWorld; + float thresh = shipCollisionRadius + boxCollisionRadius; + + if (diff.squaredNorm() <= thresh * thresh) { + g_serverBoxes[bi].destroyed = true; + + BoxDestroyedInfo destruction; + destruction.boxIndex = static_cast(bi); + destruction.serverTime = now_ms; + destruction.position = boxWorld; + destruction.destroyedBy = session->get_id(); + + { + std::lock_guard dm(g_boxDestructions_mutex); + g_boxDestructions.push_back(destruction); + } + + std::cout << "Server: Box " << bi << " destroyed by ship collision with player " + << session->get_id() << std::endl; + break; + } + } + } + } + + if (!deathEvents.empty()) { + for (const auto& death : deathEvents) { + std::string deadMsg = "DEAD:" + + std::to_string(death.serverTime) + ":" + + std::to_string(death.targetId) + ":" + + std::to_string(death.position.x()) + ":" + + std::to_string(death.position.y()) + ":" + + std::to_string(death.position.z()) + ":" + + std::to_string(death.killerId); + + broadcastToAll(deadMsg); + + std::cout << "Server: Sent DEAD event - Player " << death.targetId + << " killed by " << death.killerId << std::endl; + } + } + + { + std::lock_guard dm(g_boxDestructions_mutex); + for (const auto& destruction : g_boxDestructions) { + std::string boxMsg = "BOX_DESTROYED:" + + std::to_string(destruction.boxIndex) + ":" + + std::to_string(destruction.serverTime) + ":" + + std::to_string(destruction.position.x()) + ":" + + std::to_string(destruction.position.y()) + ":" + + std::to_string(destruction.position.z()) + ":" + + std::to_string(destruction.destroyedBy); + + broadcastToAll(boxMsg); + std::cout << "Server: Broadcasted BOX_DESTROYED for box " << destruction.boxIndex << std::endl; + } + g_boxDestructions.clear(); + } update_world(timer, ioc); }); From 9c39782729ed08080ad79f976f767a485d5cac58 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 22 Feb 2026 15:53:04 +0300 Subject: [PATCH 10/17] Fixing bug with collisions --- server/server.cpp | 11 +++++++---- src/Game.cpp | 10 +++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/server/server.cpp b/server/server.cpp index 4898cae..687658e 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -340,8 +340,8 @@ private: { const std::vector localOffsets = { - Eigen::Vector3f(-1.5f, 0.9f, 5.0f), - Eigen::Vector3f(1.5f, 0.9f, 5.0f) + Eigen::Vector3f(-1.5f, 0.9f - 6.f, 5.0f), + Eigen::Vector3f(1.5f, 0.9f - 6.f, 5.0f) }; uint64_t now_ms = std::chrono::duration_cast( @@ -532,7 +532,8 @@ void update_world(net::steady_timer& timer, net::io_context& ioc) { { std::lock_guard bm(g_boxes_mutex); - const float projectileHitRadius = 1.5f; + //const float projectileHitRadius = 1.5f; + const float projectileHitRadius = 5.0f; const float boxCollisionRadius = 2.0f; std::vector> boxProjectileCollisions; @@ -540,11 +541,12 @@ void update_world(net::steady_timer& timer, net::io_context& ioc) { for (size_t bi = 0; bi < g_serverBoxes.size(); ++bi) { if (g_serverBoxes[bi].destroyed) continue; - Eigen::Vector3f boxWorld = g_serverBoxes[bi].position + Eigen::Vector3f(0.0f, 6.0f, 45000.0f); + Eigen::Vector3f boxWorld = g_serverBoxes[bi].position + Eigen::Vector3f(0.0f, 0.0f, 45000.0f); for (size_t pi = 0; pi < g_projectiles.size(); ++pi) { const auto& pr = g_projectiles[pi]; Eigen::Vector3f diff = pr.pos - boxWorld; + //std::cout << "diff norm is " << diff.norm() << std::endl; float thresh = boxCollisionRadius + projectileHitRadius; if (diff.squaredNorm() <= thresh * thresh) { @@ -714,6 +716,7 @@ int main() { { std::lock_guard lock(g_boxes_mutex); g_serverBoxes = generateServerBoxes(50); + //g_serverBoxes = generateServerBoxes(1); std::cout << "Generated " << g_serverBoxes.size() << " boxes on server\n"; } net::io_context ioc; diff --git a/src/Game.cpp b/src/Game.cpp index 71e6451..ec7a2d6 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -582,12 +582,14 @@ namespace ZL renderer.LoadIdentity(); renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom }); + renderer.PushMatrix(); renderer.TranslateMatrix({ 0, -6.f, 0 }); //Ship camera offset if (shipAlive) { glBindTexture(GL_TEXTURE_2D, spaceshipTexture->getTexID()); renderer.DrawVertexRenderStruct(spaceship); } + renderer.PopMatrix(); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -597,12 +599,14 @@ namespace ZL } } + projectileEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); + if (shipAlive) { renderer.PushMatrix(); renderer.TranslateMatrix({ 0, 0, 16 }); + renderer.TranslateMatrix({ 0, -6.f, 0 }); sparkEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); renderer.PopMatrix(); - projectileEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); } if (showExplosion) { @@ -1320,8 +1324,8 @@ namespace ZL void Game::fireProjectiles() { std::vector localOffsets = { - Vector3f{ -1.5f, 0.9f, 5.0f }, - Vector3f{ 1.5f, 0.9f, 5.0f } + Vector3f{ -1.5f, 0.9f - 6.f, 5.0f }, + Vector3f{ 1.5f, 0.9f - 6.f, 5.0f } }; const float projectileSpeed = 60.0f; From 0babfff28b3e1f9ace2447648b82e51e58602820 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 22 Feb 2026 19:21:12 +0600 Subject: [PATCH 11/17] added multiplayer menu --- resources/config/multiplayer_menu.json | 105 +++++++++++++++++++++ src/Game.cpp | 81 ++++++++++++---- src/UiManager.cpp | 123 ++++++++++++++++++++++++- src/UiManager.h | 33 ++++++- 4 files changed, 323 insertions(+), 19 deletions(-) create mode 100644 resources/config/multiplayer_menu.json diff --git a/resources/config/multiplayer_menu.json b/resources/config/multiplayer_menu.json new file mode 100644 index 0000000..17bf917 --- /dev/null +++ b/resources/config/multiplayer_menu.json @@ -0,0 +1,105 @@ +{ + "root": { + "type": "LinearLayout", + "x": 0, + "y": 0, + "width": 1920, + "height": 1080, + "orientation": "vertical", + "spacing": 20, + "children": [ + { + "type": "TextView", + "name": "titleText", + "x": 300, + "y": 100, + "width": 1320, + "height": 100, + "text": "Multiplayer", + "fontPath": "resources/fonts/DroidSans.ttf", + "fontSize": 72, + "color": [1, 1, 1, 1], + "centered": true + }, + { + "type": "TextView", + "name": "serverLabel", + "x": 400, + "y": 250, + "width": 1120, + "height": 50, + "text": "Enter server name or IP:", + "fontPath": "resources/fonts/DroidSans.ttf", + "fontSize": 32, + "color": [1, 1, 1, 1], + "centered": false + }, + { + "type": "TextField", + "name": "serverInputField", + "x": 400, + "y": 320, + "width": 1120, + "height": 60, + "placeholder": "Enter server name or IP", + "fontPath": "resources/fonts/DroidSans.ttf", + "fontSize": 28, + "maxLength": 256, + "color": [1, 1, 1, 1], + "placeholderColor": [0.6, 0.6, 0.6, 1], + "backgroundColor": [0.15, 0.15, 0.15, 1], + "borderColor": [0.7, 0.7, 0.7, 1] + }, + { + "type": "LinearLayout", + "x": 400, + "y": 450, + "width": 1120, + "height": 80, + "orientation": "horizontal", + "spacing": 30, + "children": [ + { + "type": "Button", + "name": "connectButton", + "x": 0, + "y": 0, + "width": 530, + "height": 80, + "textures": { + "normal": "resources/main_menu/single.png", + "hover": "resources/main_menu/single.png", + "pressed": "resources/main_menu/single.png" + } + }, + { + "type": "Button", + "name": "backButton", + "x": 590, + "y": 0, + "width": 530, + "height": 80, + "textures": { + "normal": "resources/main_menu/exit.png", + "hover": "resources/main_menu/exit.png", + "pressed": "resources/main_menu/exit.png" + } + } + ] + }, + { + "type": "TextView", + "name": "statusText", + "x": 400, + "y": 580, + "width": 1120, + "height": 50, + "text": "Ready to connect", + "fontPath": "resources/fonts/DroidSans.ttf", + "fontSize": 24, + "color": [0.8, 0.8, 0.8, 1], + "centered": false + } + ] + } + } \ No newline at end of file diff --git a/src/Game.cpp b/src/Game.cpp index 662ade7..4bed430 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -405,10 +405,54 @@ namespace ZL std::cerr << "Single button pressed: " << name << " -> load gameplay UI\n"; loadGameplayUI(); }); - uiManager.setButtonCallback("multiplayerButton", [loadGameplayUI](const std::string& name) { + /*uiManager.setButtonCallback("multiplayerButton", [loadGameplayUI](const std::string& name) { std::cerr << "Multiplayer button pressed: " << name << " -> load gameplay UI\n"; loadGameplayUI(); - }); + });*/ + + uiManager.setButtonCallback("multiplayerButton", [this](const std::string& name) { + std::cerr << "Multiplayer button pressed → opening multiplayer menu\n"; + + uiManager.startAnimationOnNode("playButton", "buttonsExit"); + uiManager.startAnimationOnNode("settingsButton", "buttonsExit"); + uiManager.startAnimationOnNode("multiplayerButton", "buttonsExit"); + uiManager.startAnimationOnNode("exitButton", "buttonsExit"); + + if (uiManager.pushMenuFromFile("resources/config/multiplayer_menu.json", this->renderer, CONST_ZIP_FILE)) { + + // Callback для кнопки подключения + uiManager.setButtonCallback("connectButton", [this](const std::string& buttonName) { + std::string serverAddress = uiManager.getTextFieldValue("serverInputField"); + + if (serverAddress.empty()) { + uiManager.setText("statusText", "Please enter server address"); + return; + } + + uiManager.setText("statusText", "Connecting to " + serverAddress + "..."); + std::cerr << "Connecting to server: " << serverAddress << std::endl; + + // Здесь добавить вашу логику подключения к серверу + // connectToServer(serverAddress); + }); + + // Callback для кнопки назад + uiManager.setButtonCallback("backButton", [this](const std::string& buttonName) { + uiManager.popMenu(); + }); + + // Callback для отслеживания ввода текста + uiManager.setTextFieldCallback("serverInputField", + [this](const std::string& fieldName, const std::string& newText) { + std::cout << "Server input field changed to: " << newText << std::endl; + }); + + std::cerr << "Multiplayer menu loaded successfully\n"; + } + else { + std::cerr << "Failed to load multiplayer menu\n"; + } + }); uiManager.setButtonCallback("exitButton", [](const std::string& name) { std::cerr << "Exit from main menu pressed: " << name << " -> exiting\n"; Environment::exitGameLoop = true; @@ -1338,10 +1382,8 @@ namespace ZL } #endif - #ifdef __ANDROID__ if (event.type == SDL_FINGERDOWN) { - // Координаты Finger в SDL нормализованы от 0.0 до 1.0 int mx = static_cast(event.tfinger.x * Environment::width); int my = static_cast(event.tfinger.y * Environment::height); handleDown(mx, my); @@ -1357,24 +1399,20 @@ namespace ZL handleMotion(mx, my); } #else - if (event.type == SDL_MOUSEBUTTONDOWN) { int mx = event.button.x; int my = event.button.y; handleDown(mx, my); } if (event.type == SDL_MOUSEBUTTONUP) { - int mx = event.button.x; int my = event.button.y; handleUp(mx, my); } if (event.type == SDL_MOUSEMOTION) { - int mx = event.motion.x; int my = event.motion.y; handleMotion(mx, my); - } if (event.type == SDL_MOUSEWHEEL) { @@ -1389,18 +1427,29 @@ namespace ZL Environment::zoom = zoomstep; } } - if (event.type == SDL_KEYUP) - { - if (event.key.keysym.sym == SDLK_i) - { + + // Обработка ввода текста + if (event.type == SDL_KEYDOWN) { + if (event.key.keysym.sym == SDLK_BACKSPACE) { + uiManager.onKeyBackspace(); + } + } + + if (event.type == SDL_TEXTINPUT) { + // Пропускаем ctrl+c и другие команды + if ((event.text.text[0] & 0x80) == 0) { // ASCII символы + uiManager.onKeyPress((unsigned char)event.text.text[0]); + } + } + + if (event.type == SDL_KEYUP) { + if (event.key.keysym.sym == SDLK_i) { x = x + 1; } - if (event.key.keysym.sym == SDLK_k) - { + if (event.key.keysym.sym == SDLK_k) { x = x - 1; } - if (event.key.keysym.sym == SDLK_a) - { + if (event.key.keysym.sym == SDLK_a) { Environment::shipState.position = { 9466.15820, 1046.00159, 18531.2090 }; } } diff --git a/src/UiManager.cpp b/src/UiManager.cpp index 70f1de4..126140a 100644 --- a/src/UiManager.cpp +++ b/src/UiManager.cpp @@ -168,6 +168,20 @@ namespace ZL { renderer.DisableVertexAttribArray(vTexCoordName); } + void UiTextField::draw(Renderer& renderer) const { + if (textRenderer) { + float textX = rect.x + 10.0f; + float textY = rect.y + rect.h / 2.0f; + + if (text.empty()) { + textRenderer->drawText(placeholder, textX, textY, 1.0f, false, placeholderColor); + } + else { + textRenderer->drawText(text, textX, textY, 1.0f, false, color); + } + } + } + void UiManager::loadFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile) { std::string content; try { @@ -207,6 +221,7 @@ namespace ZL { buttons.clear(); sliders.clear(); textViews.clear(); + textFields.clear(); collectButtonsAndSliders(root); nodeActiveAnims.clear(); @@ -277,7 +292,7 @@ namespace ZL { if (!t.contains(key) || !t[key].is_string()) return nullptr; std::string path = t[key].get(); try { - std::cout << "UiManager: --loading texture for button '" << "' : " << path << " Zip file: " << zipFile << std::endl; + std::cout << "UiManager: --loading texture for slider '" << s->name << "' : " << path << " Zip file: " << zipFile << std::endl; auto data = CreateTextureDataFromPng(path.c_str(), zipFile.c_str()); return std::make_shared(data); } @@ -299,6 +314,44 @@ namespace ZL { node->slider = s; } + else if (node->type == "TextField") { + auto tf = std::make_shared(); + tf->name = node->name; + tf->rect = node->rect; + + if (j.contains("placeholder")) tf->placeholder = j["placeholder"].get(); + if (j.contains("fontPath")) tf->fontPath = j["fontPath"].get(); + if (j.contains("fontSize")) tf->fontSize = j["fontSize"].get(); + if (j.contains("maxLength")) tf->maxLength = j["maxLength"].get(); + + if (j.contains("color") && j["color"].is_array() && j["color"].size() == 4) { + for (int i = 0; i < 4; ++i) { + tf->color[i] = j["color"][i].get(); + } + } + if (j.contains("placeholderColor") && j["placeholderColor"].is_array() && j["placeholderColor"].size() == 4) { + for (int i = 0; i < 4; ++i) { + tf->placeholderColor[i] = j["placeholderColor"][i].get(); + } + } + if (j.contains("backgroundColor") && j["backgroundColor"].is_array() && j["backgroundColor"].size() == 4) { + for (int i = 0; i < 4; ++i) { + tf->backgroundColor[i] = j["backgroundColor"][i].get(); + } + } + if (j.contains("borderColor") && j["borderColor"].is_array() && j["borderColor"].size() == 4) { + for (int i = 0; i < 4; ++i) { + tf->borderColor[i] = j["borderColor"][i].get(); + } + } + + tf->textRenderer = std::make_unique(); + if (!tf->textRenderer->init(renderer, tf->fontPath, tf->fontSize, zipFile)) { + std::cerr << "Failed to init TextRenderer for TextField: " << tf->name << std::endl; + } + + node->textField = tf; + } if (j.contains("animations") && j["animations"].is_object()) { for (auto it = j["animations"].begin(); it != j["animations"].end(); ++it) { @@ -406,7 +459,10 @@ namespace ZL { if (node->textView) { textViews.push_back(node->textView); } - for (auto& c : node->children) collectButtonsAndSliders(c); // collectControls + if (node->textField) { + textFields.push_back(node->textField); + } + for (auto& c : node->children) collectButtonsAndSliders(c); } bool UiManager::setButtonCallback(const std::string& name, std::function cb) { @@ -476,13 +532,36 @@ namespace ZL { return true; } + std::shared_ptr UiManager::findTextField(const std::string& name) { + for (auto& tf : textFields) if (tf->name == name) return tf; + return nullptr; + } + + bool UiManager::setTextFieldCallback(const std::string& name, std::function cb) { + auto tf = findTextField(name); + if (!tf) { + std::cerr << "UiManager: setTextFieldCallback failed, textfield not found: " << name << std::endl; + return false; + } + tf->onTextChanged = std::move(cb); + return true; + } + + std::string UiManager::getTextFieldValue(const std::string& name) { + auto tf = findTextField(name); + if (!tf) return ""; + return tf->text; + } + bool UiManager::pushMenuFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile) { MenuState prev; prev.root = root; prev.buttons = buttons; prev.sliders = sliders; + prev.textFields = textFields; prev.pressedButton = pressedButton; prev.pressedSlider = pressedSlider; + prev.focusedTextField = focusedTextField; prev.path = ""; prev.animCallbacks = animCallbacks; @@ -490,6 +569,7 @@ namespace ZL { try { nodeActiveAnims.clear(); animCallbacks.clear(); + focusedTextField = nullptr; for (auto& b : buttons) { if (b) { b->animOffsetX = 0.0f; @@ -523,8 +603,10 @@ namespace ZL { root = s.root; buttons = s.buttons; sliders = s.sliders; + textFields = s.textFields; pressedButton = s.pressedButton; pressedSlider = s.pressedSlider; + focusedTextField = s.focusedTextField; animCallbacks = s.animCallbacks; @@ -565,6 +647,9 @@ namespace ZL { for (const auto& tv : textViews) { tv->draw(renderer); } + for (const auto& tf : textFields) { + tf->draw(renderer); + } renderer.PopMatrix(); renderer.PopProjectionMatrix(); @@ -785,6 +870,16 @@ namespace ZL { break; } } + + for (auto& tf : textFields) { + if (tf->rect.contains((float)x, (float)y)) { + focusedTextField = tf; + tf->focused = true; + } + else { + tf->focused = false; + } + } } void UiManager::onMouseUp(int x, int y) { @@ -806,6 +901,30 @@ namespace ZL { } } + void UiManager::onKeyPress(unsigned char key) { + if (!focusedTextField) return; + + if (key >= 32 && key <= 126) { + if (focusedTextField->text.length() < (size_t)focusedTextField->maxLength) { + focusedTextField->text += key; + if (focusedTextField->onTextChanged) { + focusedTextField->onTextChanged(focusedTextField->name, focusedTextField->text); + } + } + } + } + + void UiManager::onKeyBackspace() { + if (!focusedTextField) return; + + if (!focusedTextField->text.empty()) { + focusedTextField->text.pop_back(); + if (focusedTextField->onTextChanged) { + focusedTextField->onTextChanged(focusedTextField->name, focusedTextField->text); + } + } + } + std::shared_ptr UiManager::findButton(const std::string& name) { for (auto& b : buttons) if (b->name == name) return b; return nullptr; diff --git a/src/UiManager.h b/src/UiManager.h index 5cfe6c8..8fa6e71 100644 --- a/src/UiManager.h +++ b/src/UiManager.h @@ -90,6 +90,26 @@ namespace ZL { } }; + struct UiTextField { + std::string name; + UiRect rect; + std::string text = ""; + std::string placeholder = ""; + std::string fontPath = "resources/fonts/DroidSans.ttf"; + int fontSize = 32; + std::array color = { 1.f, 1.f, 1.f, 1.f }; + std::array placeholderColor = { 0.5f, 0.5f, 0.5f, 1.f }; + std::array backgroundColor = { 0.2f, 0.2f, 0.2f, 1.f }; + std::array borderColor = { 0.5f, 0.5f, 0.5f, 1.f }; + int maxLength = 256; + bool focused = false; + + std::unique_ptr textRenderer; + std::function onTextChanged; + + void draw(Renderer& renderer) const; + }; + struct UiNode { std::string type; UiRect rect; @@ -98,6 +118,7 @@ namespace ZL { std::shared_ptr button; std::shared_ptr slider; std::shared_ptr textView; + std::shared_ptr textField; std::string orientation = "vertical"; float spacing = 0.0f; @@ -126,9 +147,11 @@ namespace ZL { void onMouseMove(int x, int y); void onMouseDown(int x, int y); void onMouseUp(int x, int y); + void onKeyPress(unsigned char key); + void onKeyBackspace(); bool isUiInteraction() const { - return pressedButton != nullptr || pressedSlider != nullptr; + return pressedButton != nullptr || pressedSlider != nullptr || focusedTextField != nullptr; } void stopAllAnimations() { @@ -158,6 +181,10 @@ namespace ZL { std::shared_ptr findTextView(const std::string& name); bool setText(const std::string& name, const std::string& newText); + std::shared_ptr findTextField(const std::string& name); + bool setTextFieldCallback(const std::string& name, std::function cb); + std::string getTextFieldValue(const std::string& name); + bool pushMenuFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile = ""); bool popMenu(); void clearMenuStack(); @@ -200,19 +227,23 @@ namespace ZL { std::vector> buttons; std::vector> sliders; std::vector> textViews; + std::vector> textFields; std::map, std::vector> nodeActiveAnims; std::map, std::function> animCallbacks; // key: (nodeName, animName) std::shared_ptr pressedButton; std::shared_ptr pressedSlider; + std::shared_ptr focusedTextField; struct MenuState { std::shared_ptr root; std::vector> buttons; std::vector> sliders; + std::vector> textFields; std::shared_ptr pressedButton; std::shared_ptr pressedSlider; + std::shared_ptr focusedTextField; std::string path; std::map, std::function> animCallbacks; }; From 1265d87bc5eb6626b9dada95b8dd66abf3bbf1e4 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 22 Feb 2026 18:23:27 +0300 Subject: [PATCH 12/17] Updated UI --- proj-windows/CMakeLists.txt | 6 +- src/Game.cpp | 297 +++++------------------------------- src/Game.h | 19 +-- src/MenuManager.cpp | 196 ++++++++++++++++++++++++ src/MenuManager.h | 38 +++++ src/Space.cpp | 0 src/Space.h | 152 ++++++++++++++++++ src/UiManager.cpp | 137 ++++++++++------- src/UiManager.h | 7 +- src/network/LocalClient.cpp | 6 +- 10 files changed, 526 insertions(+), 332 deletions(-) create mode 100644 src/MenuManager.cpp create mode 100644 src/MenuManager.h create mode 100644 src/Space.cpp create mode 100644 src/Space.h diff --git a/proj-windows/CMakeLists.txt b/proj-windows/CMakeLists.txt index 3d790e0..6210c4b 100644 --- a/proj-windows/CMakeLists.txt +++ b/proj-windows/CMakeLists.txt @@ -63,6 +63,10 @@ add_executable(space-game001 ../src/network/WebSocketClientEmscripten.cpp ../src/render/TextRenderer.h ../src/render/TextRenderer.cpp + ../src/MenuManager.h + ../src/MenuManager.cpp + ../src/Space.h + ../src/Space.cpp ) # Установка проекта по умолчанию для Visual Studio @@ -84,7 +88,7 @@ target_compile_definitions(space-game001 PRIVATE WIN32_LEAN_AND_MEAN PNG_ENABLED SDL_MAIN_HANDLED - NETWORK + #NETWORK # SIMPLIFIED ) diff --git a/src/Game.cpp b/src/Game.cpp index 993dbcb..5600e8b 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -34,7 +34,9 @@ namespace ZL const char* CONST_ZIP_FILE = ""; #endif - static bool g_exitBgAnimating = false; + bool g_exitBgAnimating = false; + + bool firePressed = false; float x = 0; @@ -246,6 +248,7 @@ namespace ZL , newTickCount(0) , lastTickCount(0) , planetObject(renderer, taskManager, mainThreadHandler) + , menuManager(renderer) { projectiles.reserve(maxProjectiles); for (int i = 0; i < maxProjectiles; ++i) { @@ -307,156 +310,29 @@ namespace ZL explosionEmitter.setEmissionPoints(std::vector()); projectileEmitter.setEmissionPoints(std::vector()); - uiManager.loadFromFile("resources/config/main_menu.json", renderer, CONST_ZIP_FILE); - std::function loadGameplayUI; - loadGameplayUI = [this]() { - uiManager.loadFromFile("resources/config/ui.json", renderer, CONST_ZIP_FILE); + menuManager.onRestartPressed = [this]() { + this->shipAlive = true; + this->gameOver = false; + this->showExplosion = false; + this->explosionEmitter.setEmissionPoints(std::vector()); + Environment::shipState.position = Vector3f{ 0, 0, 45000.f }; + Environment::shipState.velocity = 0.0f; + Environment::shipState.rotation = Eigen::Matrix3f::Identity(); + Environment::inverseShipMatrix = Eigen::Matrix3f::Identity(); + Environment::zoom = DEFAULT_ZOOM; + Environment::tapDownHold = false; - auto velocityTv = uiManager.findTextView("velocityText"); - if (velocityTv) { - velocityTv->rect.x = 10.0f; - velocityTv->rect.y = static_cast(Environment::height) - velocityTv->rect.h - 10.0f; - } - else { - std::cerr << "Failed to find velocityText in UI" << std::endl; - } + std::cerr << "Game restarted\n"; + }; - uiManager.startAnimationOnNode("backgroundNode", "bgScroll"); - static bool isExitButtonAnimating = false; - uiManager.setAnimationCallback("settingsButton", "buttonsExit", [this]() { - std::cerr << "Settings button animation finished -> переход в настройки" << std::endl; - if (uiManager.pushMenuFromFile("resources/config/settings.json", this->renderer, CONST_ZIP_FILE)) { - uiManager.setButtonCallback("Opt1", [this](const std::string& n) { - std::cerr << "Opt1 pressed: " << n << std::endl; - }); - uiManager.setButtonCallback("Opt2", [this](const std::string& n) { - std::cerr << "Opt2 pressed: " << n << std::endl; - }); - uiManager.setButtonCallback("backButton", [this](const std::string& n) { - uiManager.stopAllAnimations(); - uiManager.popMenu(); - }); - } - else { - std::cerr << "Failed to open settings menu after animations" << std::endl; - } - }); - - uiManager.setAnimationCallback("exitButton", "bgScroll", []() { - std::cerr << "Exit button bgScroll animation finished" << std::endl; - g_exitBgAnimating = false; - }); - - uiManager.setButtonCallback("playButton", [this](const std::string& name) { - std::cerr << "Play button pressed: " << name << std::endl; - }); - - uiManager.setButtonCallback("settingsButton", [this](const std::string& name) { - std::cerr << "Settings button pressed: " << name << std::endl; - uiManager.startAnimationOnNode("playButton", "buttonsExit"); - uiManager.startAnimationOnNode("settingsButton", "buttonsExit"); - uiManager.startAnimationOnNode("exitButton", "buttonsExit"); - }); - - uiManager.setButtonCallback("exitButton", [this](const std::string& name) { - std::cerr << "Exit button pressed: " << name << std::endl; - - if (!g_exitBgAnimating) { - std::cerr << "start repeat anim bgScroll on exitButton" << std::endl; - g_exitBgAnimating = true; - uiManager.startAnimationOnNode("exitButton", "bgScroll"); - } - else { - std::cerr << "stop repeat anim bgScroll on exitButton" << std::endl; - g_exitBgAnimating = false; - uiManager.stopAnimationOnNode("exitButton", "bgScroll"); - - auto exitButton = uiManager.findButton("exitButton"); - if (exitButton) { - exitButton->animOffsetX = 0.0f; - exitButton->animOffsetY = 0.0f; - exitButton->animScaleX = 1.0f; - exitButton->animScaleY = 1.0f; - exitButton->buildMesh(); - } - } - }); - - uiManager.setButtonCallback("shootButton", [this](const std::string& name) { - firePressed = true; - }); - uiManager.setButtonCallback("shootButton2", [this](const std::string& name) { - firePressed = true; - }); - uiManager.setSliderCallback("velocitySlider", [this](const std::string& name, float value) { - int newVel = roundf(value * 10); - if (newVel > 2) - { - newVel = 2; - } - - if (newVel != Environment::shipState.selectedVelocity) { - newShipVelocity = newVel; - } - }); + menuManager.onVelocityChanged = [this](float newVelocity) { + newShipVelocity = newVelocity; + //Environment::shipState.velocity = newVelocity; + //std::cerr << "Ship velocity changed: " << newVelocity << "\n"; }; + menuManager.setupMenu(); - uiManager.setButtonCallback("singleButton", [loadGameplayUI](const std::string& name) { - std::cerr << "Single button pressed: " << name << " -> load gameplay UI\n"; - loadGameplayUI(); - }); - /*uiManager.setButtonCallback("multiplayerButton", [loadGameplayUI](const std::string& name) { - std::cerr << "Multiplayer button pressed: " << name << " -> load gameplay UI\n"; - loadGameplayUI(); - });*/ - uiManager.setButtonCallback("multiplayerButton", [this](const std::string& name) { - std::cerr << "Multiplayer button pressed → opening multiplayer menu\n"; - - uiManager.startAnimationOnNode("playButton", "buttonsExit"); - uiManager.startAnimationOnNode("settingsButton", "buttonsExit"); - uiManager.startAnimationOnNode("multiplayerButton", "buttonsExit"); - uiManager.startAnimationOnNode("exitButton", "buttonsExit"); - - if (uiManager.pushMenuFromFile("resources/config/multiplayer_menu.json", this->renderer, CONST_ZIP_FILE)) { - - // Callback для кнопки подключения - uiManager.setButtonCallback("connectButton", [this](const std::string& buttonName) { - std::string serverAddress = uiManager.getTextFieldValue("serverInputField"); - - if (serverAddress.empty()) { - uiManager.setText("statusText", "Please enter server address"); - return; - } - - uiManager.setText("statusText", "Connecting to " + serverAddress + "..."); - std::cerr << "Connecting to server: " << serverAddress << std::endl; - - // Здесь добавить вашу логику подключения к серверу - // connectToServer(serverAddress); - }); - - // Callback для кнопки назад - uiManager.setButtonCallback("backButton", [this](const std::string& buttonName) { - uiManager.popMenu(); - }); - - // Callback для отслеживания ввода текста - uiManager.setTextFieldCallback("serverInputField", - [this](const std::string& fieldName, const std::string& newText) { - std::cout << "Server input field changed to: " << newText << std::endl; - }); - - std::cerr << "Multiplayer menu loaded successfully\n"; - } - else { - std::cerr << "Failed to load multiplayer menu\n"; - } - }); - uiManager.setButtonCallback("exitButton", [](const std::string& name) { - std::cerr << "Exit from main menu pressed: " << name << " -> exiting\n"; - Environment::exitGameLoop = true; - }); cubemapTexture = std::make_shared( std::array{ @@ -756,7 +632,7 @@ namespace ZL renderer.DisableVertexAttribArray(vPositionName); renderer.DisableVertexAttribArray(vTexCoordName); glEnable(GL_BLEND); - uiManager.draw(renderer); + menuManager.uiManager.draw(renderer); glDisable(GL_BLEND); renderer.shaderManager.PopShader(); CheckGlError(); @@ -1445,41 +1321,7 @@ namespace ZL std::cerr << "GAME OVER: collision with planet (moved back and exploded)\n"; - if (!uiGameOverShown) { - if (uiManager.pushMenuFromFile("resources/config/game_over.json", this->renderer, CONST_ZIP_FILE)) { - uiManager.setButtonCallback("restartButton", [this](const std::string& name) { - - std::string respawnMsg = "RESPAWN:" + std::to_string(networkClient->GetClientId()); - networkClient->Send(respawnMsg); - - this->shipAlive = true; - this->gameOver = false; - this->uiGameOverShown = false; - this->showExplosion = false; - this->explosionEmitter.setEmissionPoints(std::vector()); - this->deadRemotePlayers.clear(); - - Environment::shipState.position = Vector3f{ 0, 0, 45000.f }; - Environment::shipState.velocity = 0.0f; - Environment::shipState.rotation = Eigen::Matrix3f::Identity(); - Environment::inverseShipMatrix = Eigen::Matrix3f::Identity(); - Environment::zoom = DEFAULT_ZOOM; - Environment::tapDownHold = false; - - uiManager.popMenu(); - std::cerr << "Game restarted\n"; - }); - - uiManager.setButtonCallback("gameOverExitButton", [this](const std::string& name) { - Environment::exitGameLoop = true; - }); - - uiGameOverShown = true; - } - else { - std::cerr << "Failed to load game_over.json\n"; - } - } + menuManager.showGameOver(); } else { bool stoneCollided = false; @@ -1554,34 +1396,7 @@ namespace ZL planetObject.planetStones.statuses[collidedTriIdx] = ChunkStatus::Empty; } - if (!uiGameOverShown) { - if (uiManager.pushMenuFromFile("resources/config/game_over.json", this->renderer, CONST_ZIP_FILE)) { - uiManager.setButtonCallback("restartButton", [this](const std::string& name) { - this->shipAlive = true; - this->gameOver = false; - this->uiGameOverShown = false; - this->showExplosion = false; - this->explosionEmitter.setEmissionPoints(std::vector()); - Environment::shipState.position = Vector3f{ 0, 0, 45000.f }; - Environment::shipState.velocity = 0.0f; - Environment::shipState.rotation = Eigen::Matrix3f::Identity(); - Environment::inverseShipMatrix = Eigen::Matrix3f::Identity(); - Environment::zoom = DEFAULT_ZOOM; - Environment::tapDownHold = false; - uiManager.popMenu(); - std::cerr << "Game restarted\n"; - }); - - uiManager.setButtonCallback("gameOverExitButton", [this](const std::string& name) { - Environment::exitGameLoop = true; - }); - - uiGameOverShown = true; - } - else { - std::cerr << "Failed to load game_over.json\n"; - } - } + menuManager.showGameOver(); } } } @@ -1643,14 +1458,14 @@ namespace ZL // update velocity text if (shipAlive && !gameOver) { - auto velocityTv = uiManager.findTextView("velocityText"); + auto velocityTv = menuManager.uiManager.findTextView("velocityText"); if (velocityTv) { std::string velocityStr = "Velocity: " + std::to_string(static_cast(Environment::shipState.velocity)); - uiManager.setText("velocityText", velocityStr); + menuManager.uiManager.setText("velocityText", velocityStr); } } - uiManager.update(static_cast(delta)); + menuManager.uiManager.update(static_cast(delta)); lastTickCount = newTickCount; } } @@ -1763,14 +1578,14 @@ namespace ZL // Обработка ввода текста if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_BACKSPACE) { - uiManager.onKeyBackspace(); + menuManager.uiManager.onKeyBackspace(); } } if (event.type == SDL_TEXTINPUT) { // Пропускаем ctrl+c и другие команды if ((event.text.text[0] & 0x80) == 0) { // ASCII символы - uiManager.onKeyPress((unsigned char)event.text.text[0]); + menuManager.uiManager.onKeyPress((unsigned char)event.text.text[0]); } } @@ -1903,41 +1718,7 @@ namespace ZL shipAlive = false; gameOver = true; Environment::shipState.velocity = 0.0f; - - if (!uiGameOverShown) { - if (uiManager.pushMenuFromFile("resources/config/game_over.json", - this->renderer, CONST_ZIP_FILE)) { - uiManager.setButtonCallback("restartButton", [this](const std::string& name) { - std::cout << "Client: Restart button clicked, sending RESPAWN" << std::endl; - - std::string respawnMsg = "RESPAWN:" + std::to_string(networkClient->GetClientId()); - networkClient->Send(respawnMsg); - - this->shipAlive = true; - this->gameOver = false; - this->uiGameOverShown = false; - this->showExplosion = false; - this->explosionEmitter.setEmissionPoints(std::vector()); - this->deadRemotePlayers.clear(); - - Environment::shipState.position = Vector3f{ 0, 0, 45000.f }; - Environment::shipState.velocity = 0.0f; - Environment::shipState.rotation = Eigen::Matrix3f::Identity(); - Environment::inverseShipMatrix = Eigen::Matrix3f::Identity(); - Environment::zoom = DEFAULT_ZOOM; - Environment::tapDownHold = false; - - uiManager.popMenu(); - std::cerr << "Game restarted\n"; - }); - - uiManager.setButtonCallback("gameOverExitButton", [this](const std::string& name) { - Environment::exitGameLoop = true; - }); - - uiGameOverShown = true; - } - } + menuManager.showGameOver(); } else { deadRemotePlayers.insert(d.targetId); @@ -1998,22 +1779,22 @@ namespace ZL int uiX = mx; int uiY = Environment::height - my; - uiManager.onMouseDown(uiX, uiY); + menuManager.uiManager.onMouseDown(uiX, uiY); bool uiHandled = false; - for (const auto& button : uiManager.findButton("") ? std::vector>{} : std::vector>{}) { + for (const auto& button : menuManager.uiManager.findButton("") ? std::vector>{} : std::vector>{}) { (void)button; } auto pressedSlider = [&]() -> std::shared_ptr { - for (const auto& slider : uiManager.findSlider("") ? std::vector>{} : std::vector>{}) { + for (const auto& slider : menuManager.uiManager.findSlider("") ? std::vector>{} : std::vector>{}) { (void)slider; } return nullptr; }(); - if (!uiManager.isUiInteraction()) { + if (!menuManager.uiManager.isUiInteraction()) { Environment::tapDownHold = true; Environment::tapDownStartPos(0) = mx; @@ -2029,9 +1810,9 @@ namespace ZL int uiX = mx; int uiY = Environment::height - my; - uiManager.onMouseUp(uiX, uiY); + menuManager.uiManager.onMouseUp(uiX, uiY); - if (!uiManager.isUiInteraction()) { + if (!menuManager.uiManager.isUiInteraction()) { Environment::tapDownHold = false; } } @@ -2041,9 +1822,9 @@ namespace ZL int uiX = mx; int uiY = Environment::height - my; - uiManager.onMouseMove(uiX, uiY); + menuManager.uiManager.onMouseMove(uiX, uiY); - if (Environment::tapDownHold && !uiManager.isUiInteraction()) { + if (Environment::tapDownHold && !menuManager.uiManager.isUiInteraction()) { Environment::tapDownCurrentPos(0) = mx; Environment::tapDownCurrentPos(1) = my; } diff --git a/src/Game.h b/src/Game.h index b49280f..84e3701 100644 --- a/src/Game.h +++ b/src/Game.h @@ -14,19 +14,13 @@ #include #include #include +#include "MenuManager.h" +#include "Space.h" #include namespace ZL { - - struct BoxCoords - { - Vector3f pos; - Matrix3f m; - }; - - class Game { public: Game(); @@ -43,6 +37,8 @@ namespace ZL { MainThreadHandler mainThreadHandler; std::unique_ptr networkClient; + + private: int64_t getSyncTimeMs(); void processTickCount(); @@ -100,7 +96,8 @@ namespace ZL { SparkEmitter projectileEmitter; SparkEmitter explosionEmitter; PlanetObject planetObject; - UiManager uiManager; + + MenuManager menuManager; std::vector> projectiles; std::shared_ptr projectileTexture; @@ -115,12 +112,10 @@ namespace ZL { std::vector boxAlive; float shipCollisionRadius = 15.0f; float boxCollisionRadius = 2.0f; - bool uiGameOverShown = false; + //bool uiGameOverShown = false; bool showExplosion = false; uint64_t lastExplosionTime = 0; const uint64_t explosionDurationMs = 500; - bool firePressed = false; - bool serverBoxesApplied = false; diff --git a/src/MenuManager.cpp b/src/MenuManager.cpp new file mode 100644 index 0000000..af0bcfd --- /dev/null +++ b/src/MenuManager.cpp @@ -0,0 +1,196 @@ +#include "MenuManager.h" + + +namespace ZL { + + MenuManager::MenuManager(Renderer& iRenderer) : + renderer(iRenderer) + { + } + + void MenuManager::setupMenu() + { + + uiManager.loadFromFile("resources/config/main_menu.json", renderer, CONST_ZIP_FILE); + + uiSavedRoot = loadUiFromFile("resources/config/ui.json", renderer, CONST_ZIP_FILE); + + settingsSavedRoot = loadUiFromFile("resources/config/settings.json", renderer, CONST_ZIP_FILE); + + multiplayerSavedRoot = loadUiFromFile("resources/config/multiplayer_menu.json", renderer, CONST_ZIP_FILE); + + gameOverSavedRoot = loadUiFromFile("resources/config/game_over.json", renderer, CONST_ZIP_FILE); + + std::function loadGameplayUI; + loadGameplayUI = [this]() { + uiManager.replaceRoot(uiSavedRoot); + + auto velocityTv = uiManager.findTextView("velocityText"); + if (velocityTv) { + velocityTv->rect.x = 10.0f; + velocityTv->rect.y = static_cast(Environment::height) - velocityTv->rect.h - 10.0f; + } + else { + std::cerr << "Failed to find velocityText in UI" << std::endl; + } + + uiManager.startAnimationOnNode("backgroundNode", "bgScroll"); + static bool isExitButtonAnimating = false; + uiManager.setAnimationCallback("settingsButton", "buttonsExit", [this]() { + std::cerr << "Settings button animation finished -> переход в настройки" << std::endl; + if (uiManager.pushMenuFromSavedRoot(settingsSavedRoot)) { + uiManager.setButtonCallback("Opt1", [this](const std::string& n) { + std::cerr << "Opt1 pressed: " << n << std::endl; + }); + uiManager.setButtonCallback("Opt2", [this](const std::string& n) { + std::cerr << "Opt2 pressed: " << n << std::endl; + }); + uiManager.setButtonCallback("backButton", [this](const std::string& n) { + uiManager.stopAllAnimations(); + uiManager.popMenu(); + }); + } + else { + std::cerr << "Failed to open settings menu after animations" << std::endl; + } + }); + + uiManager.setAnimationCallback("exitButton", "bgScroll", []() { + std::cerr << "Exit button bgScroll animation finished" << std::endl; + g_exitBgAnimating = false; + }); + + uiManager.setButtonCallback("playButton", [this](const std::string& name) { + std::cerr << "Play button pressed: " << name << std::endl; + }); + + uiManager.setButtonCallback("settingsButton", [this](const std::string& name) { + std::cerr << "Settings button pressed: " << name << std::endl; + uiManager.startAnimationOnNode("playButton", "buttonsExit"); + uiManager.startAnimationOnNode("settingsButton", "buttonsExit"); + uiManager.startAnimationOnNode("exitButton", "buttonsExit"); + }); + + uiManager.setButtonCallback("exitButton", [this](const std::string& name) { + std::cerr << "Exit button pressed: " << name << std::endl; + + if (!g_exitBgAnimating) { + std::cerr << "start repeat anim bgScroll on exitButton" << std::endl; + g_exitBgAnimating = true; + uiManager.startAnimationOnNode("exitButton", "bgScroll"); + } + else { + std::cerr << "stop repeat anim bgScroll on exitButton" << std::endl; + g_exitBgAnimating = false; + uiManager.stopAnimationOnNode("exitButton", "bgScroll"); + + auto exitButton = uiManager.findButton("exitButton"); + if (exitButton) { + exitButton->animOffsetX = 0.0f; + exitButton->animOffsetY = 0.0f; + exitButton->animScaleX = 1.0f; + exitButton->animScaleY = 1.0f; + exitButton->buildMesh(); + } + } + }); + + uiManager.setButtonCallback("shootButton", [this](const std::string& name) { + firePressed = true; + }); + uiManager.setButtonCallback("shootButton2", [this](const std::string& name) { + firePressed = true; + }); + uiManager.setSliderCallback("velocitySlider", [this](const std::string& name, float value) { + int newVel = roundf(value * 10); + /*if (newVel > 2) + { + newVel = 2; + }*/ + + if (newVel != Environment::shipState.selectedVelocity) { + onVelocityChanged(newVel); + } + }); + }; + + uiManager.setButtonCallback("singleButton", [loadGameplayUI](const std::string& name) { + std::cerr << "Single button pressed: " << name << " -> load gameplay UI\n"; + loadGameplayUI(); + }); + /*uiManager.setButtonCallback("multiplayerButton", [loadGameplayUI](const std::string& name) { + std::cerr << "Multiplayer button pressed: " << name << " -> load gameplay UI\n"; + loadGameplayUI(); + });*/ + + uiManager.setButtonCallback("multiplayerButton", [this](const std::string& name) { + std::cerr << "Multiplayer button pressed → opening multiplayer menu\n"; + + uiManager.startAnimationOnNode("playButton", "buttonsExit"); + uiManager.startAnimationOnNode("settingsButton", "buttonsExit"); + uiManager.startAnimationOnNode("multiplayerButton", "buttonsExit"); + uiManager.startAnimationOnNode("exitButton", "buttonsExit"); + + if (uiManager.pushMenuFromSavedRoot(multiplayerSavedRoot)) { + + // Callback для кнопки подключения + uiManager.setButtonCallback("connectButton", [this](const std::string& buttonName) { + std::string serverAddress = uiManager.getTextFieldValue("serverInputField"); + + if (serverAddress.empty()) { + uiManager.setText("statusText", "Please enter server address"); + return; + } + + uiManager.setText("statusText", "Connecting to " + serverAddress + "..."); + std::cerr << "Connecting to server: " << serverAddress << std::endl; + + // Здесь добавить вашу логику подключения к серверу + // connectToServer(serverAddress); + }); + + // Callback для кнопки назад + uiManager.setButtonCallback("backButton", [this](const std::string& buttonName) { + uiManager.popMenu(); + }); + + // Callback для отслеживания ввода текста + uiManager.setTextFieldCallback("serverInputField", + [this](const std::string& fieldName, const std::string& newText) { + std::cout << "Server input field changed to: " << newText << std::endl; + }); + + std::cerr << "Multiplayer menu loaded successfully\n"; + } + else { + std::cerr << "Failed to load multiplayer menu\n"; + } + }); + uiManager.setButtonCallback("exitButton", [](const std::string& name) { + std::cerr << "Exit from main menu pressed: " << name << " -> exiting\n"; + Environment::exitGameLoop = true; + }); + } + + void MenuManager::showGameOver() + { + if (!uiGameOverShown) { + if (uiManager.pushMenuFromSavedRoot(gameOverSavedRoot)) { + uiManager.setButtonCallback("restartButton", [this](const std::string& name) { + uiGameOverShown = false; + uiManager.popMenu(); + onRestartPressed(); + }); + + uiManager.setButtonCallback("gameOverExitButton", [this](const std::string& name) { + Environment::exitGameLoop = true; + }); + + uiGameOverShown = true; + } + else { + std::cerr << "Failed to load game_over.json\n"; + } + } + } +} diff --git a/src/MenuManager.h b/src/MenuManager.h new file mode 100644 index 0000000..9ec0296 --- /dev/null +++ b/src/MenuManager.h @@ -0,0 +1,38 @@ +#pragma once +#include "render/Renderer.h" +#include "Environment.h" +#include "render/TextureManager.h" +#include "UiManager.h" + +namespace ZL { + + extern const char* CONST_ZIP_FILE; + extern bool g_exitBgAnimating; + extern bool firePressed; + + class MenuManager + { + protected: + Renderer& renderer; + bool uiGameOverShown = false; + + std::shared_ptr uiSavedRoot; + std::shared_ptr gameOverSavedRoot; + std::shared_ptr settingsSavedRoot; + std::shared_ptr multiplayerSavedRoot; + + public: + UiManager uiManager; + + MenuManager(Renderer& iRenderer); + + void setupMenu(); + + void showGameOver(); + + std::function onRestartPressed; + std::function onVelocityChanged; + + }; +}; + diff --git a/src/Space.cpp b/src/Space.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Space.h b/src/Space.h new file mode 100644 index 0000000..f0d56d1 --- /dev/null +++ b/src/Space.h @@ -0,0 +1,152 @@ +#pragma once + +#include "render/Renderer.h" +#include "Environment.h" +#include "render/TextureManager.h" +#include "SparkEmitter.h" +#include "planet/PlanetObject.h" +#include "UiManager.h" +#include "Projectile.h" +#include "utils/TaskManager.h" +#include "network/NetworkInterface.h" +#include +#include +#include +#include +#include +#include "MenuManager.h" + +#include + +namespace ZL { + + + struct BoxCoords + { + Vector3f pos; + Matrix3f m; + }; + + /* + class Space { + public: + Space(Renderer& iRenderer, TaskManager& iTaskManager, MainThreadHandler& iMainThreadHandler); + ~Space(); + + void setup(); + void update(); + void render(); + + bool shouldExit() const { return Environment::exitGameLoop; } + + Renderer& renderer; + TaskManager& taskManager; + MainThreadHandler& mainThreadHandler; + + private: + int64_t getSyncTimeMs(); + void processTickCount(); + void drawScene(); + void drawCubemap(float skyPercent); + void drawShip(); + void drawBoxes(); + void drawBoxesLabels(); + void drawUI(); + void drawRemoteShips(); + void drawRemoteShipsLabels(); + void fireProjectiles(); + + bool worldToScreen(const Vector3f& world, float& outX, float& outY, float& outDepth) const; + + void handleDown(int mx, int my); + void handleUp(int mx, int my); + void handleMotion(int mx, int my); + + SDL_Window* window; + SDL_GLContext glContext; + + + + int64_t newTickCount; + int64_t lastTickCount; + + std::vector boxCoordsArr; + std::vector boxRenderArr; + + std::vector boxLabels; + std::unique_ptr textRenderer; + + //std::unordered_map latestRemotePlayers; + std::unordered_map remotePlayerStates; + + float newShipVelocity = 0; + + static const size_t CONST_TIMER_INTERVAL = 10; + static const size_t CONST_MAX_TIME_INTERVAL = 1000; + + std::shared_ptr sparkTexture; + std::shared_ptr spaceshipTexture; + std::shared_ptr cubemapTexture; + VertexDataStruct spaceshipBase; + VertexRenderStruct spaceship; + + + VertexRenderStruct cubemap; + + std::shared_ptr boxTexture; + VertexDataStruct boxBase; + + SparkEmitter sparkEmitter; + SparkEmitter projectileEmitter; + SparkEmitter explosionEmitter; + PlanetObject planetObject; + + MenuManager menuManager; + + std::vector> projectiles; + std::shared_ptr projectileTexture; + float projectileCooldownMs = 500.0f; + int64_t lastProjectileFireTime = 0; + int maxProjectiles = 32; + std::vector shipLocalEmissionPoints; + + + bool shipAlive = true; + bool gameOver = false; + std::vector boxAlive; + float shipCollisionRadius = 15.0f; + float boxCollisionRadius = 2.0f; + //bool uiGameOverShown = false; + bool showExplosion = false; + uint64_t lastExplosionTime = 0; + const uint64_t explosionDurationMs = 500; + + bool serverBoxesApplied = false; + + static constexpr float MAX_DIST_SQ = 10000.f * 10000.f; + static constexpr float FADE_START = 6000.f; + static constexpr float FADE_RANGE = 4000.f; + static constexpr float BASE_SCALE = 140.f; + static constexpr float PERSPECTIVE_K = 0.05f; // Tune + static constexpr float MIN_SCALE = 0.4f; + static constexpr float MAX_SCALE = 0.8f; + static constexpr float CLOSE_DIST = 600.0f; + + std::unordered_set deadRemotePlayers; + + // --- Target HUD (brackets + offscreen arrow) --- + int trackedTargetId = -1; + bool targetWasVisible = false; + float targetAcquireAnim = 0.0f; // 0..1 схлопывание (0 = далеко, 1 = на месте) + + // временный меш для HUD (будем перезаливать VBO маленькими порциями) + VertexRenderStruct hudTempMesh; + + // helpers + bool projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const; + void drawTargetHud(); // рисует рамку или стрелку + int pickTargetId() const; // выбирает цель (пока: ближайший живой удаленный игрок) + };*/ + + +} // namespace ZL \ No newline at end of file diff --git a/src/UiManager.cpp b/src/UiManager.cpp index 126140a..d051f8c 100644 --- a/src/UiManager.cpp +++ b/src/UiManager.cpp @@ -182,60 +182,7 @@ namespace ZL { } } - void UiManager::loadFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile) { - std::string content; - try { - if (zipFile.empty()) { - content = readTextFile(path); - } - else { - auto buf = readFileFromZIP(path, zipFile); - if (buf.empty()) { - std::cerr << "UiManager: failed to read " << path << " from zip " << zipFile << std::endl; - throw std::runtime_error("Failed to load UI file: " + path); - } - content.assign(buf.begin(), buf.end()); - } - } - catch (const std::exception& e) { - std::cerr << "UiManager: failed to open " << path << " : " << e.what() << std::endl; - throw std::runtime_error("Failed to load UI file: " + path); - } - - json j; - try { - j = json::parse(content); - } - catch (const std::exception& e) { - std::cerr << "UiManager: json parse error: " << e.what() << std::endl; - throw std::runtime_error("Failed to load UI file: " + path); - } - - if (!j.contains("root") || !j["root"].is_object()) { - std::cerr << "UiManager: root node missing or invalid" << std::endl; - throw std::runtime_error("Failed to load UI file: " + path); - } - - root = parseNode(j["root"], renderer, zipFile); - layoutNode(root); - buttons.clear(); - sliders.clear(); - textViews.clear(); - textFields.clear(); - collectButtonsAndSliders(root); - - nodeActiveAnims.clear(); - - for (auto& b : buttons) { - b->buildMesh(); - } - for (auto& s : sliders) { - s->buildTrackMesh(); - s->buildKnobMesh(); - } - } - - std::shared_ptr UiManager::parseNode(const json& j, Renderer& renderer, const std::string& zipFile) { + std::shared_ptr parseNode(const json& j, Renderer& renderer, const std::string& zipFile) { auto node = std::make_shared(); if (j.contains("type") && j["type"].is_string()) node->type = j["type"].get(); if (j.contains("name") && j["name"].is_string()) node->name = j["name"].get(); @@ -416,6 +363,76 @@ namespace ZL { return node; } + std::shared_ptr loadUiFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile) + { + std::shared_ptr root; + + std::string content; + try { + if (zipFile.empty()) { + content = readTextFile(path); + } + else { + auto buf = readFileFromZIP(path, zipFile); + if (buf.empty()) { + std::cerr << "UiManager: failed to read " << path << " from zip " << zipFile << std::endl; + throw std::runtime_error("Failed to load UI file: " + path); + } + content.assign(buf.begin(), buf.end()); + } + } + catch (const std::exception& e) { + std::cerr << "UiManager: failed to open " << path << " : " << e.what() << std::endl; + throw std::runtime_error("Failed to load UI file: " + path); + } + + json j; + try { + j = json::parse(content); + } + catch (const std::exception& e) { + std::cerr << "UiManager: json parse error: " << e.what() << std::endl; + throw std::runtime_error("Failed to load UI file: " + path); + } + + if (!j.contains("root") || !j["root"].is_object()) { + std::cerr << "UiManager: root node missing or invalid" << std::endl; + throw std::runtime_error("Failed to load UI file: " + path); + } + + root = parseNode(j["root"], renderer, zipFile); + + return root; + } + + void UiManager::replaceRoot(std::shared_ptr newRoot) { + root = newRoot; + layoutNode(root); + buttons.clear(); + sliders.clear(); + textViews.clear(); + textFields.clear(); + collectButtonsAndSliders(root); + + nodeActiveAnims.clear(); + + for (auto& b : buttons) { + b->buildMesh(); + } + for (auto& s : sliders) { + s->buildTrackMesh(); + s->buildKnobMesh(); + } + } + + void UiManager::loadFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile) { + + std::shared_ptr newRoot = loadUiFromFile(path, renderer, zipFile); + replaceRoot(newRoot); + } + + + void UiManager::layoutNode(const std::shared_ptr& node) { for (auto& child : node->children) { child->rect.x += node->rect.x; @@ -553,7 +570,8 @@ namespace ZL { return tf->text; } - bool UiManager::pushMenuFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile) { + bool UiManager::pushMenuFromSavedRoot(std::shared_ptr newRoot) + { MenuState prev; prev.root = root; prev.buttons = buttons; @@ -579,17 +597,22 @@ namespace ZL { } } - loadFromFile(path, renderer, zipFile); + replaceRoot(newRoot); menuStack.push_back(std::move(prev)); return true; } catch (const std::exception& e) { - std::cerr << "UiManager: pushMenuFromFile failed to load " << path << " : " << e.what() << std::endl; + std::cerr << "UiManager: pushMenuFromFile failed to load from root : " << e.what() << std::endl; animCallbacks = prev.animCallbacks; return false; } } + bool UiManager::pushMenuFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile) { + auto newRoot = loadUiFromFile(path, renderer, zipFile); + return pushMenuFromSavedRoot(newRoot); + } + bool UiManager::popMenu() { if (menuStack.empty()) { std::cerr << "UiManager: popMenu called but menu stack is empty" << std::endl; diff --git a/src/UiManager.h b/src/UiManager.h index 8fa6e71..05af33c 100644 --- a/src/UiManager.h +++ b/src/UiManager.h @@ -136,10 +136,15 @@ namespace ZL { std::map animations; }; + std::shared_ptr parseNode(const json& j, Renderer& renderer, const std::string& zipFile); + std::shared_ptr loadUiFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile = ""); + + class UiManager { public: UiManager() = default; + void replaceRoot(std::shared_ptr newRoot); void loadFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile = ""); void draw(Renderer& renderer); @@ -186,6 +191,7 @@ namespace ZL { std::string getTextFieldValue(const std::string& name); bool pushMenuFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile = ""); + bool pushMenuFromSavedRoot(std::shared_ptr newRoot); bool popMenu(); void clearMenuStack(); @@ -196,7 +202,6 @@ namespace ZL { bool setAnimationCallback(const std::string& nodeName, const std::string& animName, std::function cb); private: - std::shared_ptr parseNode(const json& j, Renderer& renderer, const std::string& zipFile); void layoutNode(const std::shared_ptr& node); void collectButtonsAndSliders(const std::shared_ptr& node); diff --git a/src/network/LocalClient.cpp b/src/network/LocalClient.cpp index c0a219e..5336b43 100644 --- a/src/network/LocalClient.cpp +++ b/src/network/LocalClient.cpp @@ -239,7 +239,7 @@ namespace ZL { for (size_t bi = 0; bi < serverBoxes.size(); ++bi) { if (serverBoxes[bi].destroyed) continue; - Eigen::Vector3f boxWorld = serverBoxes[bi].position + Eigen::Vector3f(0.0f, 6.0f, 45000.0f); + Eigen::Vector3f boxWorld = serverBoxes[bi].position + Eigen::Vector3f(0.0f, 0.0f, 45000.0f); for (size_t pi = 0; pi < projectiles.size(); ++pi) { const auto& pr = projectiles[pi]; @@ -387,8 +387,8 @@ namespace ZL { } const std::vector localOffsets = { - Eigen::Vector3f(-1.5f, 0.9f, 5.0f), - Eigen::Vector3f(1.5f, 0.9f, 5.0f) + Eigen::Vector3f(-1.5f, 0.9f - 6.f, 5.0f), + Eigen::Vector3f(1.5f, 0.9f - 6.f, 5.0f) }; uint64_t now_ms = std::chrono::duration_cast( From 5b57696acfab2aacf7affd316e0fb620c2529f55 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 22 Feb 2026 19:15:25 +0300 Subject: [PATCH 13/17] Refactoring major --- src/Game.cpp | 1560 +------------------------------------------------ src/Game.h | 88 +-- src/Space.cpp | 1482 ++++++++++++++++++++++++++++++++++++++++++++++ src/Space.h | 31 +- 4 files changed, 1508 insertions(+), 1653 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 5600e8b..743dc93 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -40,220 +40,14 @@ namespace ZL float x = 0; - Eigen::Quaternionf generateRandomQuaternion(std::mt19937& gen) - { - - std::normal_distribution<> distrib(0.0, 1.0); - - Eigen::Quaternionf randomQuat = { - (float)distrib(gen), - (float)distrib(gen), - (float)distrib(gen), - (float)distrib(gen) - }; - - return randomQuat.normalized(); - } - - std::vector generateRandomBoxCoords(int N) - { - const float MIN_DISTANCE = 3.0f; - const float MIN_DISTANCE_SQUARED = MIN_DISTANCE * MIN_DISTANCE; - const float MIN_COORD = -100.0f; - const float MAX_COORD = 100.0f; - const int MAX_ATTEMPTS = 1000; - std::vector boxCoordsArr; - - std::random_device rd; - std::mt19937 gen(rd()); - - std::uniform_real_distribution<> distrib(MIN_COORD, MAX_COORD); - - int generatedCount = 0; - - while (generatedCount < N) - { - bool accepted = false; - int attempts = 0; - - while (!accepted && attempts < MAX_ATTEMPTS) - { - Vector3f newPos( - (float)distrib(gen), - (float)distrib(gen), - (float)distrib(gen) - ); - - accepted = true; - for (const auto& existingBox : boxCoordsArr) - { - - Vector3f diff = newPos - existingBox.pos; - - float distanceSquared = diff.squaredNorm(); - - if (distanceSquared < MIN_DISTANCE_SQUARED) - { - accepted = false; - break; - } - } - - if (accepted) - { - Eigen::Quaternionf randomQuat = generateRandomQuaternion(gen); - - Matrix3f randomMatrix = randomQuat.toRotationMatrix(); - - boxCoordsArr.emplace_back(BoxCoords{ newPos, randomMatrix }); - generatedCount++; - } - attempts++; - } - - if (!accepted) { - break; - } - } - - return boxCoordsArr; - } - - static Eigen::Matrix4f makeViewMatrix_FromYourCamera() - { - Eigen::Matrix4f Tz = Eigen::Matrix4f::Identity(); - Tz(2, 3) = -1.0f * ZL::Environment::zoom; - - Eigen::Matrix4f R = Eigen::Matrix4f::Identity(); - R.block<3, 3>(0, 0) = ZL::Environment::inverseShipMatrix; - - Eigen::Matrix4f Tship = Eigen::Matrix4f::Identity(); - Tship(0, 3) = -ZL::Environment::shipState.position.x(); - Tship(1, 3) = -ZL::Environment::shipState.position.y(); - Tship(2, 3) = -ZL::Environment::shipState.position.z(); - - return Tz * R * Tship; - } - - static Eigen::Matrix4f makePerspective(float fovyRadians, float aspect, float zNear, float zFar) - { - // Стандартная перспектива - float f = 1.0f / std::tan(fovyRadians * 0.5f); - - Eigen::Matrix4f P = Eigen::Matrix4f::Zero(); - P(0, 0) = f / aspect; - P(1, 1) = f; - P(2, 2) = (zFar + zNear) / (zNear - zFar); - P(2, 3) = (2.0f * zFar * zNear) / (zNear - zFar); - P(3, 2) = -1.0f; - return P; - } - - bool Game::worldToScreen(const Vector3f& world, float& outX, float& outY, float& outDepth) const - { - // Матрицы должны совпасть с drawBoxes/drawShip по смыслу - float aspect = static_cast(Environment::width) / static_cast(Environment::height); - - Eigen::Matrix4f V = makeViewMatrix_FromYourCamera(); - Eigen::Matrix4f P = makePerspective(1.0f / 1.5f, aspect, Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); - - Eigen::Vector4f w(world.x(), world.y(), world.z(), 1.0f); - Eigen::Vector4f clip = P * V * w; - - if (clip.w() <= 0.0001f) return false; // позади камеры - - Eigen::Vector3f ndc = clip.head<3>() / clip.w(); // [-1..1] - outDepth = ndc.z(); - - // В пределах экрана? - // (можно оставить, можно клампить) - float sx = (ndc.x() * 0.5f + 0.5f) * Environment::width; - float sy = (ndc.y() * 0.5f + 0.5f) * Environment::height; - - outX = sx; - outY = sy; - - // Можно отсеять те, что вне: - if (sx < -200 || sx > Environment::width + 200) return false; - if (sy < -200 || sy > Environment::height + 200) return false; - - return true; - } - - bool Game::projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const - { - float aspect = static_cast(Environment::width) / static_cast(Environment::height); - Eigen::Matrix4f V = makeViewMatrix_FromYourCamera(); - Eigen::Matrix4f P = makePerspective(1.0f / 1.5f, aspect, Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); - - Eigen::Vector4f w(world.x(), world.y(), world.z(), 1.0f); - Eigen::Vector4f clip = P * V * w; - - clipW = clip.w(); - if (std::abs(clipW) < 1e-6f) return false; - - Eigen::Vector3f ndc = clip.head<3>() / clipW; - ndcX = ndc.x(); - ndcY = ndc.y(); - ndcZ = ndc.z(); - return true; - } - - void Game::drawBoxesLabels() - { - if (!textRenderer) return; - - // Текст рисуем как 2D поверх всего 3D, но ДО drawUI или после — как хочешь. - // Чтобы подписи были поверх — делай после drawBoxes и до drawUI (как мы и вставили). - - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - for (size_t i = 0; i < boxCoordsArr.size(); ++i) - { - if (i >= boxAlive.size() || !boxAlive[i]) continue; - if (i >= boxLabels.size()) continue; - - // ВАЖНО: твои боксы рисуются с Translate({0,0,45000}) + pos - Vector3f boxWorld = boxCoordsArr[i].pos + Vector3f{ 0.0f, 0.0f, 45000.0f }; - - // Чуть выше бокса по Y (или по Z — как нравится) - Vector3f labelWorld = boxWorld + Vector3f{ 0.0f, 2.2f, 0.0f }; - - float sx, sy, depth; - if (!worldToScreen(labelWorld, sx, sy, depth)) continue; - - // В твоей UI-системе Y обычно перевёрнут (ты делаешь uiY = height - my). - // Наш worldToScreen отдаёт Y в системе "низ=0, верх=height" (NDC->screen). - // Чтобы совпало с твоей UI-логикой, перевернём: - float uiX = sx; - float uiY = sy; // если окажется вверх ногами — замени на (Environment::height - sy) - - float dist = (Environment::shipState.position - boxWorld).norm(); - float scaleRaw = 120.0f / (dist + 1.0f); - float scale = std::round(scaleRaw * 10.0f) / 10.0f; // округление до 0.1 - scale = std::clamp(scale, 0.6f, 1.2f); - - textRenderer->drawText(boxLabels[i], uiX, uiY, scale, /*centered*/true); - } - - glDisable(GL_BLEND); - glEnable(GL_DEPTH_TEST); - } - Game::Game() : window(nullptr) , glContext(nullptr) , newTickCount(0) , lastTickCount(0) - , planetObject(renderer, taskManager, mainThreadHandler) , menuManager(renderer) + , space(renderer, taskManager, mainThreadHandler, networkClient, menuManager) { - projectiles.reserve(maxProjectiles); - for (int i = 0; i < maxProjectiles; ++i) { - projectiles.emplace_back(std::make_unique()); - } } Game::~Game() { @@ -272,9 +66,6 @@ namespace ZL ZL::BindOpenGlFunctions(); ZL::CheckGlError(); - //#ifndef SIMPLIFIED - - #ifdef EMSCRIPTEN renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_web.fragment", CONST_ZIP_FILE); @@ -295,135 +86,10 @@ namespace ZL renderer.shaderManager.AddShaderFromFiles("planetLand", "resources/shaders/planet_land.vertex", "resources/shaders/planet_land_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_desktop.fragment", CONST_ZIP_FILE); #endif - /*#else - renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/default_env.vertex", "resources/shaders/default_env_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "resources/shaders/default_texture.vertex", "resources/shaders/default_texture_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("planetBake", "resources/shaders/default_texture.vertex", "resources/shaders/default_texture_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("planetStone", "resources/shaders/default_texture.vertex", "resources/shaders/default_texture_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("planetLand", "resources/shaders/default_texture.vertex", "resources/shaders/default_texture_web.fragment", CONST_ZIP_FILE); - #endif*/ - bool cfgLoaded = sparkEmitter.loadFromJsonFile("resources/config/spark_config.json", renderer, CONST_ZIP_FILE); - bool projCfgLoaded = projectileEmitter.loadFromJsonFile("resources/config/spark_projectile_config.json", renderer, CONST_ZIP_FILE); - bool explosionCfgLoaded = explosionEmitter.loadFromJsonFile("resources/config/explosion_config.json", renderer, CONST_ZIP_FILE); - explosionEmitter.setEmissionPoints(std::vector()); - projectileEmitter.setEmissionPoints(std::vector()); - - menuManager.onRestartPressed = [this]() { - this->shipAlive = true; - this->gameOver = false; - this->showExplosion = false; - this->explosionEmitter.setEmissionPoints(std::vector()); - Environment::shipState.position = Vector3f{ 0, 0, 45000.f }; - Environment::shipState.velocity = 0.0f; - Environment::shipState.rotation = Eigen::Matrix3f::Identity(); - Environment::inverseShipMatrix = Eigen::Matrix3f::Identity(); - Environment::zoom = DEFAULT_ZOOM; - Environment::tapDownHold = false; - - std::cerr << "Game restarted\n"; - }; - - menuManager.onVelocityChanged = [this](float newVelocity) { - newShipVelocity = newVelocity; - //Environment::shipState.velocity = newVelocity; - //std::cerr << "Ship velocity changed: " << newVelocity << "\n"; - }; menuManager.setupMenu(); - - - - cubemapTexture = std::make_shared( - std::array{ - CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), - CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), - CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), - CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), - CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), - CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE) - }); - - - cubemap.data = ZL::CreateCubemap(500); - cubemap.RefreshVBO(); - - - - //Load texture - - //spaceshipTexture = std::make_unique(CreateTextureDataFromPng("resources/DefaultMaterial_BaseColor_shine.png", CONST_ZIP_FILE)); - //spaceshipBase = LoadFromTextFile02("resources/spaceship006.txt", CONST_ZIP_FILE); - //spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI / 2.0, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); - - //spaceshipTexture = std::make_unique(CreateTextureDataFromPng("./resources/cap_D.png", CONST_ZIP_FILE)); - //spaceshipBase = LoadFromTextFile02("./resources/spaceship006x.txt", CONST_ZIP_FILE); - //spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI / 2.0, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); - - - spaceshipTexture = std::make_unique(CreateTextureDataFromPng("resources/MainCharacter_Base_color_sRGB.png", CONST_ZIP_FILE)); - spaceshipBase = LoadFromTextFile02("resources/spaceshipnew001.txt", CONST_ZIP_FILE); - spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); - - spaceshipBase.Move(Vector3f{ 1.2, 0, -5 }); - - /* - spaceshipTexture = std::make_unique(CreateTextureDataFromPng("resources/Cargo_Base_color_sRGB.png", CONST_ZIP_FILE)); - spaceshipBase = LoadFromTextFile02("resources/cargoship001.txt", CONST_ZIP_FILE); - - auto quat = Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI*0.5, Eigen::Vector3f::UnitZ())); - auto rotMatrix = quat.toRotationMatrix(); - spaceshipBase.RotateByMatrix(rotMatrix); - - auto quat2 = Eigen::Quaternionf(Eigen::AngleAxisf(M_PI*0.5, Eigen::Vector3f::UnitY())); - auto rotMatrix2 = quat2.toRotationMatrix(); - spaceshipBase.RotateByMatrix(rotMatrix2); - - //spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); - */ - spaceship.AssignFrom(spaceshipBase); - spaceship.RefreshVBO(); - - - //Boxes - boxTexture = std::make_unique(CreateTextureDataFromPng("resources/box/box.png", CONST_ZIP_FILE)); - boxBase = LoadFromTextFile02("resources/box/box.txt", CONST_ZIP_FILE); - - boxCoordsArr = generateRandomBoxCoords(50); - boxRenderArr.resize(boxCoordsArr.size()); - for (int i = 0; i < boxCoordsArr.size(); i++) - { - boxRenderArr[i].AssignFrom(boxBase); - //boxRenderArr[i].data = CreateBaseConvexPolyhedron(1999); - boxRenderArr[i].RefreshVBO(); - } - - boxAlive.resize(boxCoordsArr.size(), true); - ZL::CheckGlError(); - boxLabels.clear(); - boxLabels.reserve(boxCoordsArr.size()); - for (size_t i = 0; i < boxCoordsArr.size(); ++i) { - boxLabels.push_back("Box " + std::to_string(i + 1)); - } - - if (!cfgLoaded) - { - throw std::runtime_error("Failed to load spark emitter config file!"); - } - renderer.InitOpenGL(); - - // TextRenderer создаём/инициализируем ПОСЛЕ инициализации OpenGL - textRenderer = std::make_unique(); - if (!textRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 32, CONST_ZIP_FILE)) { - std::cerr << "Failed to init TextRenderer\n"; - } - ZL::CheckGlError(); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - planetObject.init(); + space.setup(); #ifdef NETWORK #ifdef EMSCRIPTEN @@ -440,179 +106,6 @@ namespace ZL } - void Game::drawCubemap(float skyPercent) - { - static const std::string defaultShaderName = "default"; - static const std::string envShaderName = "env_sky"; - static const std::string vPositionName = "vPosition"; - static const std::string vTexCoordName = "vTexCoord"; - static const std::string textureUniformName = "Texture"; - static const std::string skyPercentUniformName = "skyPercent"; - - renderer.shaderManager.PushShader(envShaderName); - renderer.RenderUniform1i(textureUniformName, 0); - renderer.RenderUniform1f(skyPercentUniformName, skyPercent); - renderer.EnableVertexAttribArray(vPositionName); - renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, - static_cast(Environment::width) / static_cast(Environment::height), - Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); - renderer.PushMatrix(); - renderer.LoadIdentity(); - renderer.RotateMatrix(Environment::inverseShipMatrix); - - - Vector3f worldLightDir = Vector3f(1.0f, -1.0f, -1.0f).normalized(); - Matrix3f viewMatrix = Environment::inverseShipMatrix; - Vector3f viewLightDir = (viewMatrix * worldLightDir).normalized(); - - - // Передаем вектор НА источник света - Vector3f lightToSource = -viewLightDir; - renderer.RenderUniform3fv("uLightDirView", lightToSource.data()); - - // 2. Базовый цвет атмосферы (голубой) - Vector3f skyColor = { 0.0f, 0.5f, 1.0f }; - renderer.RenderUniform3fv("uSkyColor", skyColor.data()); - - // 1. Вектор направления от центра планеты к игроку (в мировых координатах) - // Предполагаем, что планета в (0,0,0). Если нет, то (shipPosition - planetCenter) - Vector3f playerDirWorld = Environment::shipState.position.normalized(); - - // 2. Направление света в мировом пространстве - //Vector3f worldLightDir = Vector3f(1.0f, -1.0f, -1.0f).normalized(); - - // 3. Считаем глобальную освещенность для игрока (насколько он на свету) - // Это одно число для всего кадра - float playerLightFactor = playerDirWorld.dot(-worldLightDir); - // Ограничиваем и делаем переход мягче - playerLightFactor = std::clamp((playerLightFactor + 0.2f) / 1.2f, 0.0f, 1.0f); - - renderer.RenderUniform1f("uPlayerLightFactor", playerLightFactor); - renderer.RenderUniform1f("skyPercent", skyPercent); - - CheckGlError(); - - glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture->getTexID()); - renderer.DrawVertexRenderStruct(cubemap); - - CheckGlError(); - - - renderer.PopMatrix(); - renderer.PopProjectionMatrix(); - renderer.DisableVertexAttribArray(vPositionName); - - renderer.shaderManager.PopShader(); - CheckGlError(); - } - - void Game::drawShip() - { - static const std::string defaultShaderName = "default"; - static const std::string envShaderName = "env"; - static const std::string vPositionName = "vPosition"; - static const std::string vTexCoordName = "vTexCoord"; - static const std::string textureUniformName = "Texture"; - - renderer.shaderManager.PushShader(defaultShaderName); - renderer.RenderUniform1i(textureUniformName, 0); - renderer.EnableVertexAttribArray(vPositionName); - renderer.EnableVertexAttribArray(vTexCoordName); - - renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, - static_cast(Environment::width) / static_cast(Environment::height), - Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); - renderer.PushMatrix(); - - renderer.LoadIdentity(); - renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom }); - renderer.PushMatrix(); - renderer.TranslateMatrix({ 0, -6.f, 0 }); //Ship camera offset - - if (shipAlive) { - glBindTexture(GL_TEXTURE_2D, spaceshipTexture->getTexID()); - renderer.DrawVertexRenderStruct(spaceship); - } - renderer.PopMatrix(); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - for (const auto& p : projectiles) { - if (p && p->isActive()) { - p->draw(renderer); - } - } - - projectileEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); - - if (shipAlive) { - renderer.PushMatrix(); - renderer.TranslateMatrix({ 0, 0, 16 }); - renderer.TranslateMatrix({ 0, -6.f, 0 }); - sparkEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); - renderer.PopMatrix(); - } - - if (showExplosion) { - explosionEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); - } - - //glBindTexture(GL_TEXTURE_2D, basePlatformTexture->getTexID()); - //renderer.DrawVertexRenderStruct(basePlatform); - - glDisable(GL_BLEND); - renderer.PopMatrix(); - renderer.PopProjectionMatrix(); - renderer.DisableVertexAttribArray(vPositionName); - renderer.DisableVertexAttribArray(vTexCoordName); - - renderer.shaderManager.PopShader(); - CheckGlError(); - } - - void Game::drawBoxes() - { - static const std::string defaultShaderName = "default"; - static const std::string envShaderName = "env"; - static const std::string vPositionName = "vPosition"; - static const std::string vTexCoordName = "vTexCoord"; - static const std::string textureUniformName = "Texture"; - - renderer.shaderManager.PushShader(defaultShaderName); - renderer.RenderUniform1i(textureUniformName, 0); - renderer.EnableVertexAttribArray(vPositionName); - renderer.EnableVertexAttribArray(vTexCoordName); - - renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, - static_cast(Environment::width) / static_cast(Environment::height), - Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); - - for (int i = 0; i < boxCoordsArr.size(); i++) - { - if (!boxAlive[i]) continue; - renderer.PushMatrix(); - - renderer.LoadIdentity(); - renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom }); - renderer.RotateMatrix(Environment::inverseShipMatrix); - renderer.TranslateMatrix(-Environment::shipState.position); - renderer.TranslateMatrix({ 0.f, 0.f, 45000.f }); - renderer.TranslateMatrix(boxCoordsArr[i].pos); - renderer.RotateMatrix(boxCoordsArr[i].m); - - glBindTexture(GL_TEXTURE_2D, boxTexture->getTexID()); - //glBindTexture(GL_TEXTURE_2D, rockTexture->getTexID()); - renderer.DrawVertexRenderStruct(boxRenderArr[i]); - - renderer.PopMatrix(); - } - renderer.PopProjectionMatrix(); - renderer.DisableVertexAttribArray(vPositionName); - renderer.DisableVertexAttribArray(vTexCoordName); - - renderer.shaderManager.PopShader(); - CheckGlError(); - } void Game::drawUI() { @@ -639,469 +132,22 @@ namespace ZL } void Game::drawScene() { - static const std::string defaultShaderName = "default"; - static const std::string envShaderName = "env"; - static const std::string vPositionName = "vPosition"; - static const std::string vTexCoordName = "vTexCoord"; - static const std::string textureUniformName = "Texture"; - - glClearColor(0.0f, 1.0f, 0.0f, 1.0f); - glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - - glViewport(0, 0, Environment::width, Environment::height); - - CheckGlError(); - - float skyPercent = 0.0; - float distance = planetObject.distanceToPlanetSurface(Environment::shipState.position); - if (distance > 1500.f) - { - skyPercent = 0.0f; - } - else if (distance < 800.f) - { - skyPercent = 1.0f; - } - else - { - skyPercent = (1500.f - distance) / (1500.f - 800.f); - } - - - drawCubemap(skyPercent); - planetObject.draw(renderer); - if (planetObject.distanceToPlanetSurface(Environment::shipState.position) > 100.f) - { - glClear(GL_DEPTH_BUFFER_BIT); - } - - drawRemoteShips(); - drawRemoteShipsLabels(); - drawBoxes(); - drawBoxesLabels(); - drawShip(); + space.drawScene(); drawUI(); - drawTargetHud(); CheckGlError(); } - void Game::drawRemoteShips() { - // Используем те же константы имен для шейдеров, что и в drawShip - static const std::string defaultShaderName = "default"; - static const std::string vPositionName = "vPosition"; - static const std::string vTexCoordName = "vTexCoord"; - static const std::string textureUniformName = "Texture"; - - // Активируем шейдер и текстуру (предполагаем, что меш у всех одинаковый) - renderer.shaderManager.PushShader(defaultShaderName); - renderer.RenderUniform1i(textureUniformName, 0); - - renderer.EnableVertexAttribArray(vPositionName); - renderer.EnableVertexAttribArray(vTexCoordName); - - renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, - static_cast(Environment::width) / static_cast(Environment::height), - Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); - - // Биндим текстуру корабля один раз для всех удаленных игроков (оптимизация батчинга) - glBindTexture(GL_TEXTURE_2D, spaceshipTexture->getTexID()); - - /*auto now = std::chrono::system_clock::now(); - - //Apply server delay: - now -= std::chrono::milliseconds(CLIENT_DELAY); - - latestRemotePlayers = networkClient->getRemotePlayers(); - */ - // Если сервер прислал коробки, применяем их однократно вместо локальной генерации - if (!serverBoxesApplied && networkClient) { - auto sboxes = networkClient->getServerBoxes(); - if (!sboxes.empty()) { - boxCoordsArr.clear(); - for (auto& b : sboxes) { - BoxCoords bc; - bc.pos = b.first; - bc.m = b.second; - boxCoordsArr.push_back(bc); - } - boxRenderArr.resize(boxCoordsArr.size()); - for (int i = 0; i < (int)boxCoordsArr.size(); ++i) { - boxRenderArr[i].AssignFrom(boxBase); - boxRenderArr[i].RefreshVBO(); - } - boxAlive.assign(boxCoordsArr.size(), true); - serverBoxesApplied = true; - } - } - - // Итерируемся по актуальным данным из extrapolateRemotePlayers - for (auto const& [id, remotePlayer] : remotePlayerStates) { - - const ClientState& playerState = remotePlayer; - if (deadRemotePlayers.count(id)) continue; - - renderer.PushMatrix(); - renderer.LoadIdentity(); - - renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom }); - renderer.TranslateMatrix({ 0, -6.f, 0 }); //Ship camera offset - renderer.RotateMatrix(Environment::inverseShipMatrix); - renderer.TranslateMatrix(-Environment::shipState.position); - - - Eigen::Vector3f relativePos = playerState.position;// -Environment::shipPosition; - renderer.TranslateMatrix(relativePos); - - // 3. Поворот врага - renderer.RotateMatrix(playerState.rotation); - - renderer.DrawVertexRenderStruct(spaceship); - renderer.PopMatrix(); - } - - renderer.PopProjectionMatrix(); - renderer.DisableVertexAttribArray(vPositionName); - renderer.DisableVertexAttribArray(vTexCoordName); - renderer.shaderManager.PopShader(); - - CheckGlError(); - } - - void Game::drawRemoteShipsLabels() - { - if (!textRenderer) return; - -//#ifdef NETWORK - // 2D поверх 3D - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - // Берем удаленных игроков - //latestRemotePlayers = networkClient->getRemotePlayers(); - - //auto now = std::chrono::system_clock::now(); - //now -= std::chrono::milliseconds(CLIENT_DELAY); - - for (auto const& [id, remotePlayer] : remotePlayerStates) - { - if (deadRemotePlayers.count(id)) continue; - - //<<<<<<< HEAD - const ClientState& st = remotePlayer; - // Позиция корабля в мире - Vector3f shipWorld = st.position; - - float distSq = (Environment::shipState.position - shipWorld).squaredNorm(); - /*if (distSq > MAX_DIST_SQ) // дальность прорисовки никнейма - continue;*/ - float dist = sqrt(distSq); - float alpha = 1.0f; // постоянная видимость - /*float alpha = std::clamp(1.f - (dist - FADE_START) / FADE_RANGE, 0.f, 1.f); // дальность прорисовки никнейма - if (alpha < 0.01f) - continue; */ - Vector3f labelWorld = shipWorld + Vector3f{ 0.f, -4.f, 0.f }; // регулировка высоты - float sx, sy, depth; - if (!worldToScreen(labelWorld, sx, sy, depth)) - continue; - - float uiX = sx, uiY = sy; - float scale = std::clamp(BASE_SCALE / (dist * PERSPECTIVE_K + 1.f), MIN_SCALE, MAX_SCALE); - - // Дефолтный лейбл - std::string label = "Player (" + std::to_string(st.id) + ") " + std::to_string((int)dist) + "m"; - - // TODO: nickname sync - - textRenderer->drawText(label, uiX + 1.f, uiY + 1.f, scale, true, { 0.f, 0.f, 0.f, alpha }); // color param - textRenderer->drawText(label, uiX, uiY, scale, true, { 1.f, 1.f, 1.f, alpha }); - } - - glDisable(GL_BLEND); - glEnable(GL_DEPTH_TEST); -//#endif - } - int64_t Game::getSyncTimeMs() { int64_t localNow = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); - - //std::cout << "getSyncTimeMs localNow = " << localNow << std::endl; - //std::cout << "getSyncTimeMs getTimeOffset = " << networkClient->getTimeOffset() << std::endl; - // Добавляем смещение, полученное от сервера return localNow + networkClient->getTimeOffset(); // Нужно добавить геттер в интерфейс } - int Game::pickTargetId() const - { - int bestId = -1; - constexpr float INF_F = 1e30f; - float bestDistSq = INF_F; - - for (auto const& [id, st] : remotePlayerStates) { - if (deadRemotePlayers.count(id)) continue; - - float d2 = (Environment::shipState.position - st.position).squaredNorm(); - if (d2 < bestDistSq) { - bestDistSq = d2; - bestId = id; - } - } - return bestId; - } - - static VertexDataStruct MakeColoredRect2D(float cx, float cy, float hw, float hh, float z, - const Eigen::Vector4f& rgba) - { - VertexDataStruct v; - // 2 triangles - Vector3f p1{ cx - hw, cy - hh, z }; - Vector3f p2{ cx - hw, cy + hh, z }; - Vector3f p3{ cx + hw, cy + hh, z }; - Vector3f p4{ cx + hw, cy - hh, z }; - - v.PositionData = { p1, p2, p3, p3, p4, p1 }; - - // defaultColor shader likely uses vColor (vec3), но нам нужен alpha. - // У тебя в Renderer есть RenderUniform4fv, но шейдер может брать vColor. - // Поэтому: сделаем ColorData vec3, а alpha дадим через uniform uColor, если есть. - // Если в defaultColor нет uniform uColor — тогда alpha будет 1.0. - // Для совместимости: кладём RGB, alpha будем задавать uniform'ом отдельно. - Vector3f rgb{ rgba.x(), rgba.y(), rgba.z() }; - v.ColorData = { rgb, rgb, rgb, rgb, rgb, rgb }; - return v; - } - - void Game::drawTargetHud() - { - if (!textRenderer) return; - - // 1) выбираем цель - int targetIdNow = pickTargetId(); - if (targetIdNow < 0) { - trackedTargetId = -1; - targetAcquireAnim = 0.f; - targetWasVisible = false; - return; - } - - // если цель сменилась — сброс анимации “схлопывания” - if (trackedTargetId != targetIdNow) { - trackedTargetId = targetIdNow; - targetAcquireAnim = 0.0f; - targetWasVisible = false; - } - - const ClientState& st = remotePlayerStates.at(trackedTargetId); - Vector3f shipWorld = st.position; - - // 2) проекция - float ndcX, ndcY, ndcZ, clipW; - if (!projectToNDC(shipWorld, ndcX, ndcY, ndcZ, clipW)) return; - - // behind camera? - bool behind = (clipW <= 0.0f); - - // on-screen check (NDC) - bool onScreen = (!behind && - ndcX >= -1.0f && ndcX <= 1.0f && - ndcY >= -1.0f && ndcY <= 1.0f); - - // 3) расстояние - float dist = (Environment::shipState.position - shipWorld).norm(); - - // time for arrow bob - float t = static_cast(SDL_GetTicks64()) * 0.001f; - - // 4) Настройки стиля (как X3) - Eigen::Vector4f enemyColor(1.f, 0.f, 0.f, 1.f); // красный - float thickness = 2.0f; // толщина линий (px) - float z = 0.0f; // 2D слой - - // 5) Если цель в кадре: рисуем скобки - if (onScreen) - { - // перевод NDC -> экран (в пикселях) - float sx = (ndcX * 0.5f + 0.5f) * Environment::width; - float sy = (ndcY * 0.5f + 0.5f) * Environment::height; - - // анимация “снаружи внутрь” - // targetAcquireAnim растёт к 1, быстро (похоже на захват) - float dt = 1.0f / 60.0f; // у тебя нет dt в draw, берём константу, выглядит норм - targetAcquireAnim = min(1.0f, targetAcquireAnim + dt * 6.5f); - - // базовый размер рамки в зависимости от дистанции (как у лейблов) - float size = 220.0f / (dist * 0.01f + 1.0f); // подстройка - size = std::clamp(size, 35.0f, 120.0f); // min/max - - // “схлопывание”: сначала больше, потом ближе к кораблю - // expand 1.6 -> 1.0 - float expand = 1.6f - 0.6f * targetAcquireAnim; - - float half = size * expand; - float cornerLen = max(10.0f, half * 0.35f); - - // точки углов - float left = sx - half; - float right = sx + half; - float bottom = sy - half; - float top = sy + half; - - // рисуем 8 тонких прямоугольников (2 на угол) - auto drawBar = [&](float cx, float cy, float w, float h) - { - VertexDataStruct v = MakeColoredRect2D(cx, cy, w * 0.5f, h * 0.5f, z, enemyColor); - hudTempMesh.AssignFrom(v); - renderer.DrawVertexRenderStruct(hudTempMesh); - }; - - // включаем 2D режим - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - renderer.shaderManager.PushShader("defaultColor"); - renderer.PushProjectionMatrix((float)Environment::width, (float)Environment::height, 0.f, 1.f); - renderer.PushMatrix(); - renderer.LoadIdentity(); - - // верх-лево: горизонт + вертикаль - drawBar(left + cornerLen * 0.5f, top, cornerLen, thickness); - drawBar(left, top - cornerLen * 0.5f, thickness, cornerLen); - - // верх-право - drawBar(right - cornerLen * 0.5f, top, cornerLen, thickness); - drawBar(right, top - cornerLen * 0.5f, thickness, cornerLen); - - // низ-лево - drawBar(left + cornerLen * 0.5f, bottom, cornerLen, thickness); - drawBar(left, bottom + cornerLen * 0.5f, thickness, cornerLen); - - // низ-право - drawBar(right - cornerLen * 0.5f, bottom, cornerLen, thickness); - drawBar(right, bottom + cornerLen * 0.5f, thickness, cornerLen); - - renderer.PopMatrix(); - renderer.PopProjectionMatrix(); - renderer.shaderManager.PopShader(); - - glDisable(GL_BLEND); - glEnable(GL_DEPTH_TEST); - - targetWasVisible = true; - return; - } - - // 6) Если цель offscreen: рисуем стрелку на краю - // dir: куда “смотреть” в NDC - float dirX = ndcX; - float dirY = ndcY; - - // если позади камеры — разворачиваем направление - if (behind) { - dirX = -dirX; - dirY = -dirY; - } - - float len = std::sqrt(dirX * dirX + dirY * dirY); - if (len < 1e-5f) return; - dirX /= len; - dirY /= len; - - // пересечение луча с прямоугольником [-1..1] с отступом - float marginNdc = 0.08f; - float maxX = 1.0f - marginNdc; - float maxY = 1.0f - marginNdc; - - float tx = (std::abs(dirX) < 1e-6f) ? 1e9f : (maxX / std::abs(dirX)); - float ty = (std::abs(dirY) < 1e-6f) ? 1e9f : (maxY / std::abs(dirY)); - float k = min(tx, ty); - - float edgeNdcX = dirX * k; - float edgeNdcY = dirY * k; - - float edgeX = (edgeNdcX * 0.5f + 0.5f) * Environment::width; - float edgeY = (edgeNdcY * 0.5f + 0.5f) * Environment::height; - - // лёгкая анимация “зова”: смещение по направлению - float bob = std::sin(t * 6.0f) * 6.0f; - edgeX += dirX * bob; - edgeY += dirY * bob; - - // стрелка как треугольник + маленький “хвост” - float arrowLen = 26.0f; - float arrowWid = 14.0f; - - // перпендикуляр - float px = -dirY; - float py = dirX; - - Vector3f tip{ edgeX + dirX * arrowLen, edgeY + dirY * arrowLen, z }; - Vector3f left{ edgeX + px * (arrowWid * 0.5f), edgeY + py * (arrowWid * 0.5f), z }; - Vector3f right{ edgeX - px * (arrowWid * 0.5f), edgeY - py * (arrowWid * 0.5f), z }; - - auto drawTri = [&](const Vector3f& a, const Vector3f& b, const Vector3f& c) - { - VertexDataStruct v; - v.PositionData = { a, b, c }; - Vector3f rgb{ enemyColor.x(), enemyColor.y(), enemyColor.z() }; - v.ColorData = { rgb, rgb, rgb }; - hudTempMesh.AssignFrom(v); - renderer.DrawVertexRenderStruct(hudTempMesh); - }; - - auto drawBar = [&](float cx, float cy, float w, float h) - { - VertexDataStruct v = MakeColoredRect2D(cx, cy, w * 0.5f, h * 0.5f, z, enemyColor); - hudTempMesh.AssignFrom(v); - renderer.DrawVertexRenderStruct(hudTempMesh); - }; - - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - renderer.shaderManager.PushShader("defaultColor"); - renderer.PushProjectionMatrix((float)Environment::width, (float)Environment::height, 0.f, 1.f); - renderer.PushMatrix(); - renderer.LoadIdentity(); - - // треугольник-стрелка - drawTri(tip, left, right); - - // “хвост” (короткая черта) - float tailLen = 14.0f; - float tailX = edgeX - dirX * 6.0f; - float tailY = edgeY - dirY * 6.0f; - // хвост рисуем как тонкий прямоугольник, ориентированный примерно по направлению: - // (упрощение: горизонт/вертикаль не поворачиваем, но выглядит ок. Хочешь — сделаем поворот матрицей) - drawBar(tailX, tailY, max(thickness, tailLen), thickness); - - renderer.PopMatrix(); - renderer.PopProjectionMatrix(); - renderer.shaderManager.PopShader(); - - // дистанция рядом со стрелкой - // (у тебя ещё будет “статично под прицелом” — это просто другой TextView / drawText) - { - std::string d = std::to_string((int)dist) + "m"; - float tx = edgeX + px * 18.0f; - float ty = edgeY + py * 18.0f; - textRenderer->drawText(d, tx, ty, 0.6f, true, { 1.f, 0.f, 0.f, 1.f }); - } - - glDisable(GL_BLEND); - glEnable(GL_DEPTH_TEST); - - targetWasVisible = false; - } - void Game::processTickCount() { if (lastTickCount == 0) { - //lastTickCount = SDL_GetTicks64(); lastTickCount = getSyncTimeMs(); lastTickCount = (lastTickCount / 50) * 50; @@ -1109,7 +155,6 @@ namespace ZL return; } - //newTickCount = SDL_GetTicks64(); newTickCount = getSyncTimeMs(); newTickCount = (newTickCount / 50) * 50; @@ -1122,380 +167,13 @@ namespace ZL //throw std::runtime_error("Synchronization is lost"); } - auto now_ms = newTickCount; - - //std::cout << "processTickCount = " << now_ms << std::endl; - - sparkEmitter.update(static_cast(delta)); - planetObject.update(static_cast(delta)); - - if (firePressed) - { - firePressed = false; - if (now_ms - lastProjectileFireTime >= static_cast(projectileCooldownMs)) { - lastProjectileFireTime = now_ms; - const float projectileSpeed = 250.0f; - - this->fireProjectiles(); - - Eigen::Vector3f localForward = { 0, 0, -1 }; - Eigen::Vector3f worldForward = (Environment::shipState.rotation * localForward).normalized(); - - Eigen::Vector3f centerPos = Environment::shipState.position + - Environment::shipState.rotation * Vector3f{ 0, 0.9f, 5.0f }; - - Eigen::Quaternionf q(Environment::shipState.rotation); - float speedToSend = projectileSpeed + Environment::shipState.velocity; - int shotCount = 2; - - std::string fireMsg = "FIRE:" + - std::to_string(now_ms) + ":" + - std::to_string(centerPos.x()) + ":" + - std::to_string(centerPos.y()) + ":" + - std::to_string(centerPos.z()) + ":" + - std::to_string(q.w()) + ":" + - std::to_string(q.x()) + ":" + - std::to_string(q.y()) + ":" + - std::to_string(q.z()) + ":" + - std::to_string(speedToSend) + ":" + - std::to_string(shotCount); - - networkClient->Send(fireMsg); - } - } - - - //Handle input: - - if (newShipVelocity != Environment::shipState.selectedVelocity) - { - Environment::shipState.selectedVelocity = newShipVelocity; - - std::string msg = "UPD:" + std::to_string(now_ms) + ":" + Environment::shipState.formPingMessageContent(); - networkClient->Send(msg); - } - - float discreteMag; - int discreteAngle; - - if (Environment::tapDownHold) { - float diffx = Environment::tapDownCurrentPos(0) - Environment::tapDownStartPos(0); - float diffy = Environment::tapDownCurrentPos(1) - Environment::tapDownStartPos(1); - - float rawMag = sqrtf(diffx * diffx + diffy * diffy); - float maxRadius = 200.0f; // Максимальный вынос джойстика - - if (rawMag > 10.0f) { // Мертвая зона - // 1. Дискретизируем отклонение (0.0 - 1.0 с шагом 0.1) - float normalizedMag = min(rawMag / maxRadius, 1.0f); - discreteMag = std::round(normalizedMag * 10.0f) / 10.0f; - - // 2. Дискретизируем угол (0-359 градусов) - // atan2 возвращает радианы, переводим в градусы - float radians = atan2f(diffy, diffx); - discreteAngle = static_cast(radians * 180.0f / M_PI); - if (discreteAngle < 0) discreteAngle += 360; - - } - else - { - discreteAngle = -1; - discreteMag = 0.0f; - } - } - else - { - discreteAngle = -1; - discreteMag = 0.0f; - } - - - if (discreteAngle != Environment::shipState.discreteAngle || discreteMag != Environment::shipState.discreteMag) { - Environment::shipState.discreteAngle = discreteAngle; - Environment::shipState.discreteMag = discreteMag; - - std::string msg = "UPD:" + std::to_string(now_ms) + ":" + Environment::shipState.formPingMessageContent(); - networkClient->Send(msg); - std::cout << "Sending: " << msg << std::endl; - } - - long long leftoverDelta = delta; - while (leftoverDelta > 0) - { - long long miniDelta = 50; - Environment::shipState.simulate_physics(miniDelta); - leftoverDelta -= miniDelta; - } - Environment::inverseShipMatrix = Environment::shipState.rotation.inverse(); - - static float pingTimer = 0.0f; - pingTimer += delta; - if (pingTimer >= 1000.0f) { - std::string pingMsg = "UPD:" + std::to_string(now_ms) + ":" + Environment::shipState.formPingMessageContent(); - - networkClient->Send(pingMsg); - std::cout << "Sending: " << pingMsg << std::endl; - pingTimer = 0.0f; - } - - - auto latestRemotePlayers = networkClient->getRemotePlayers(); - - std::chrono::system_clock::time_point nowRoundedWithDelay{ std::chrono::milliseconds(newTickCount-CLIENT_DELAY) }; - - - for (auto const& [id, remotePlayer] : latestRemotePlayers) { - - if (!remotePlayer.canFetchClientStateAtTime(nowRoundedWithDelay)) - { - continue; - } - - ClientState playerState = remotePlayer.fetchClientStateAtTime(nowRoundedWithDelay); - - remotePlayerStates[id] = playerState; - - } - - for (auto& p : projectiles) { - if (p && p->isActive()) { - p->update(static_cast(delta), renderer); - } - } - - std::vector projCameraPoints; - for (const auto& p : projectiles) { - if (p && p->isActive()) { - Vector3f worldPos = p->getPosition(); - Vector3f rel = worldPos - Environment::shipState.position; - Vector3f camPos = Environment::inverseShipMatrix * rel; - projCameraPoints.push_back(camPos); - } - } - if (!projCameraPoints.empty()) { - projectileEmitter.setEmissionPoints(projCameraPoints); - projectileEmitter.emit(); - } - else { - projectileEmitter.setEmissionPoints(std::vector()); - } - - std::vector shipCameraPoints; - for (const auto& lp : shipLocalEmissionPoints) { - Vector3f adjusted = lp + Vector3f{ 0.0f, -Environment::zoom * 0.03f, 0.0f }; - shipCameraPoints.push_back(adjusted); - } - if (!shipCameraPoints.empty()) { - sparkEmitter.setEmissionPoints(shipCameraPoints); - } - - sparkEmitter.update(static_cast(delta)); - projectileEmitter.update(static_cast(delta)); - - explosionEmitter.update(static_cast(delta)); - if (showExplosion) { - uint64_t now = SDL_GetTicks64(); - if (lastExplosionTime != 0 && now - lastExplosionTime >= explosionDurationMs) { - showExplosion = false; - explosionEmitter.setEmissionPoints(std::vector()); - explosionEmitter.setUseWorldSpace(false); - } - } - if (shipAlive) { - float distToSurface = planetObject.distanceToPlanetSurface(Environment::shipState.position); - if (distToSurface <= 0.0f) { - - Vector3f dir = (Environment::shipState.position - PlanetData::PLANET_CENTER_OFFSET).normalized(); - Vector3f collisionPoint = PlanetData::PLANET_CENTER_OFFSET + dir * PlanetData::PLANET_RADIUS; - Environment::shipState.position = PlanetData::PLANET_CENTER_OFFSET + dir * (PlanetData::PLANET_RADIUS + shipCollisionRadius + 0.1f); - - shipAlive = false; - gameOver = true; - Environment::shipState.velocity = 0.0f; - showExplosion = true; - - explosionEmitter.setUseWorldSpace(true); - explosionEmitter.setEmissionPoints(std::vector{ collisionPoint }); - explosionEmitter.emit(); - lastExplosionTime = SDL_GetTicks64(); - - std::cerr << "GAME OVER: collision with planet (moved back and exploded)\n"; - - menuManager.showGameOver(); - } - else { - bool stoneCollided = false; - int collidedTriIdx = -1; - Vector3f collidedStonePos = Vector3f{ 0.0f, 0.0f, 0.0f }; - float collidedStoneRadius = 0.0f; - - for (int triIdx : planetObject.triangleIndicesToDraw) { - if (triIdx < 0 || triIdx >= static_cast(planetObject.planetStones.allInstances.size())) - continue; - - if (planetObject.planetStones.statuses.size() <= static_cast(triIdx)) - continue; - - if (planetObject.planetStones.statuses[triIdx] != ChunkStatus::Live) - continue; - - const auto& instances = planetObject.planetStones.allInstances[triIdx]; - for (const auto& inst : instances) { - - Vector3f stoneWorld = inst.position; - Vector3f diff = Environment::shipState.position - stoneWorld; - - float maxScale = (std::max)({ inst.scale(0), inst.scale(1), inst.scale(2) }); - float stoneRadius = StoneParams::BASE_SCALE * maxScale * 0.9f; - float thresh = shipCollisionRadius + stoneRadius; - - if (diff.squaredNorm() <= thresh * thresh) { - stoneCollided = true; - collidedTriIdx = triIdx; - collidedStonePos = stoneWorld; - collidedStoneRadius = stoneRadius; - break; - } - } - - if (stoneCollided) break; - } - - if (stoneCollided) { - Vector3f away = (Environment::shipState.position - collidedStonePos); - if (away.squaredNorm() <= 1e-6f) { - away = Vector3f{ 0.0f, 1.0f, 0.0f }; - } - away.normalize(); - - Environment::shipState.position = collidedStonePos + away * (collidedStoneRadius + shipCollisionRadius + 0.1f); - - shipAlive = false; - gameOver = true; - Environment::shipState.velocity = 0.0f; - showExplosion = true; - - explosionEmitter.setUseWorldSpace(true); - explosionEmitter.setEmissionPoints(std::vector{ collidedStonePos }); - explosionEmitter.emit(); - lastExplosionTime = SDL_GetTicks64(); - - std::cerr << "GAME OVER: collision with stone on triangle " << collidedTriIdx << std::endl; - - if (collidedTriIdx >= 0 && collidedTriIdx < static_cast(planetObject.stonesToRender.size())) { - planetObject.stonesToRender[collidedTriIdx].data.PositionData.clear(); - planetObject.stonesToRender[collidedTriIdx].vao.reset(); - planetObject.stonesToRender[collidedTriIdx].positionVBO.reset(); - planetObject.stonesToRender[collidedTriIdx].normalVBO.reset(); - planetObject.stonesToRender[collidedTriIdx].tangentVBO.reset(); - planetObject.stonesToRender[collidedTriIdx].binormalVBO.reset(); - planetObject.stonesToRender[collidedTriIdx].colorVBO.reset(); - planetObject.stonesToRender[collidedTriIdx].texCoordVBO.reset(); - } - if (collidedTriIdx >= 0 && collidedTriIdx < static_cast(planetObject.planetStones.statuses.size())) { - planetObject.planetStones.statuses[collidedTriIdx] = ChunkStatus::Empty; - } - - menuManager.showGameOver(); - } - } - } - - /*for (int i = 0; i < boxCoordsArr.size(); ++i) { - if (!boxAlive[i]) continue; - Vector3f boxWorld = boxCoordsArr[i].pos + Vector3f{ 0.0f, 0.0f, 45000.0f }; - Vector3f diff = Environment::shipState.position - boxWorld; - float thresh = shipCollisionRadius + boxCollisionRadius; - if (diff.squaredNorm() <= thresh * thresh) { - boxAlive[i] = false; - - boxRenderArr[i].data.PositionData.clear(); - boxRenderArr[i].vao.reset(); - boxRenderArr[i].positionVBO.reset(); - boxRenderArr[i].texCoordVBO.reset(); - showExplosion = true; - - Vector3f rel = boxWorld - Environment::shipState.position; - Vector3f camPos = Environment::inverseShipMatrix * rel; - explosionEmitter.setUseWorldSpace(true); - explosionEmitter.setEmissionPoints(std::vector{ boxWorld }); - explosionEmitter.emit(); - lastExplosionTime = SDL_GetTicks64(); - - std::cerr << "Box destroyed at index " << i << std::endl; - } - } - - const float projectileHitRadius = 1.5f; - for (auto& p : projectiles) { - if (!p || !p->isActive()) continue; - Vector3f ppos = p->getPosition(); - Vector3f projInBoxSpace = Environment::inverseShipMatrix * (ppos - Environment::shipState.position); - for (int i = 0; i < boxCoordsArr.size(); ++i) { - if (!boxAlive[i]) continue; - Vector3f boxWorld = boxCoordsArr[i].pos + Vector3f{ 0.0f, 6.0f, 45000.0f }; - Vector3f dd = ppos - boxWorld; - float thresh = boxCollisionRadius + projectileHitRadius; - if (dd.squaredNorm() <= thresh * thresh) { - boxAlive[i] = false; - boxRenderArr[i].data.PositionData.clear(); - boxRenderArr[i].vao.reset(); - boxRenderArr[i].positionVBO.reset(); - boxRenderArr[i].texCoordVBO.reset(); - - showExplosion = true; - explosionEmitter.setUseWorldSpace(true); - explosionEmitter.setEmissionPoints(std::vector{ boxWorld }); - explosionEmitter.emit(); - lastExplosionTime = SDL_GetTicks64(); - - p->deactivate(); - std::cerr << "Box destroyed by projectile at index " << i << std::endl; - break; - } - } - }*/ - - // update velocity text - if (shipAlive && !gameOver) { - auto velocityTv = menuManager.uiManager.findTextView("velocityText"); - if (velocityTv) { - std::string velocityStr = "Velocity: " + std::to_string(static_cast(Environment::shipState.velocity)); - menuManager.uiManager.setText("velocityText", velocityStr); - } - } + space.processTickCount(newTickCount, delta); menuManager.uiManager.update(static_cast(delta)); lastTickCount = newTickCount; } } - void Game::fireProjectiles() { - std::vector localOffsets = { - Vector3f{ -1.5f, 0.9f - 6.f, 5.0f }, - Vector3f{ 1.5f, 0.9f - 6.f, 5.0f } - }; - - const float projectileSpeed = 60.0f; - const float lifeMs = 5000.0f; - const float size = 0.5f; - - Vector3f localForward = { 0,0,-1 }; - Vector3f worldForward = (Environment::shipState.rotation * localForward).normalized(); - - for (const auto& lo : localOffsets) { - Vector3f worldPos = Environment::shipState.position + Environment::shipState.rotation * lo; - Vector3f worldVel = worldForward * (projectileSpeed + Environment::shipState.velocity); - - for (auto& p : projectiles) { - if (!p->isActive()) { - p->init(worldPos, worldVel, lifeMs, size, projectileTexture, renderer); - break; - } - } - } - } - void Game::render() { SDL_GL_MakeCurrent(ZL::Environment::window, glContext); ZL::CheckGlError(); @@ -1520,7 +198,7 @@ namespace ZL // Обновляем размеры и сбрасываем кеш текстов, т.к. меши хранятся в пикселях Environment::width = event.window.data1; Environment::height = event.window.data2; - if (textRenderer) textRenderer->ClearCache(); + space.clearTextRendererCache(); } #endif #ifdef __ANDROID__ @@ -1615,243 +293,23 @@ namespace ZL } mainThreadHandler.processMainThreadTasks(); - if (networkClient) { - auto pending = networkClient->getPendingProjectiles(); - if (!pending.empty()) { - const float projectileSpeed = 60.0f; - const float lifeMs = 5000.0f; - const float size = 0.5f; - for (const auto& pi : pending) { - const std::vector localOffsets = { - Vector3f{ -1.5f, 0.9f, 5.0f }, - Vector3f{ 1.5f, 0.9f, 5.0f } - //Vector3f{}, - //Vector3f{} - }; - - Vector3f localForward = { 0, 0, -1 }; - Vector3f worldForward = pi.rotation * localForward; - - float len = worldForward.norm(); - if (len <= 1e-6f) { - continue; - } - worldForward /= len; - - Vector3f baseVel = worldForward * pi.velocity; - - for (const auto& off : localOffsets) { - Vector3f shotPos = pi.position + (pi.rotation * off); - - for (auto& p : projectiles) { - if (!p->isActive()) { - p->init(shotPos, baseVel, lifeMs, size, projectileTexture, renderer); - break; - } - } - } - } - /* - auto remotePlayersSnapshot = networkClient->getRemotePlayers(); - for (const auto& pi : pending) { - Eigen::Vector3f dir = pi.direction; - float len = dir.norm(); - if (len <= 1e-6f) continue; - dir /= len; - - Eigen::Matrix3f shooterRot = Eigen::Matrix3f::Identity(); - float shooterVel = 0.0f; - auto it = remotePlayersSnapshot.find(pi.shooterId); - if (it != remotePlayersSnapshot.end()) { - std::chrono::system_clock::time_point pktTime{ std::chrono::milliseconds(pi.clientTime) }; - if (it->second.canFetchClientStateAtTime(pktTime)) { - ClientState shooterState = it->second.fetchClientStateAtTime(pktTime); - shooterRot = shooterState.rotation; - shooterVel = shooterState.velocity; - } - } - - float speedWithOwner = projectileSpeed + shooterVel; - Eigen::Vector3f baseVel = dir * speedWithOwner; - - int shotCount = 2; - - std::vector localOffsets = { - {-1.5f, 0.9f, 5.0f}, - { 1.5f, 0.9f, 5.0f} - }; - - for (int i = 0; i < shotCount; ++i) { - Eigen::Vector3f rotatedOffset = shooterRot * localOffsets[i]; - Eigen::Vector3f shotPos = pi.position + rotatedOffset; - - for (auto& p : projectiles) { - if (!p->isActive()) { - p->init(shotPos, baseVel, lifeMs, size, projectileTexture, renderer); - break; - } - } - } - }*/ - } - // Обработка событий смерти, присланных сервером - auto deaths = networkClient->getPendingDeaths(); - if (!deaths.empty()) { - int localId = networkClient->GetClientId(); - std::cout << "Client: Received " << deaths.size() << " death events" << std::endl; - - for (const auto& d : deaths) { - std::cout << "Client: Processing death - target=" << d.targetId - << ", killer=" << d.killerId << ", pos=(" - << d.position.x() << ", " << d.position.y() << ", " << d.position.z() << ")" << std::endl; - - showExplosion = true; - explosionEmitter.setUseWorldSpace(true); - explosionEmitter.setEmissionPoints(std::vector{ d.position }); - explosionEmitter.emit(); - lastExplosionTime = SDL_GetTicks64(); - std::cout << "Client: Explosion emitted at (" << d.position.x() << ", " - << d.position.y() << ", " << d.position.z() << ")" << std::endl; - - if (d.targetId == localId) { - std::cout << "Client: Local ship destroyed!" << std::endl; - shipAlive = false; - gameOver = true; - Environment::shipState.velocity = 0.0f; - menuManager.showGameOver(); - } - else { - deadRemotePlayers.insert(d.targetId); - std::cout << "Marked remote player " << d.targetId << " as dead" << std::endl; - } - } - } - - auto respawns = networkClient->getPendingRespawns(); - if (!respawns.empty()) { - for (const auto& respawnId : respawns) { - deadRemotePlayers.erase(respawnId); - - auto it = remotePlayerStates.find(respawnId); - if (it != remotePlayerStates.end()) { - it->second.position = Vector3f{ 0.f, 0.f, 45000.f }; - it->second.velocity = 0.0f; - it->second.rotation = Eigen::Matrix3f::Identity(); - } - - std::cout << "Client: Remote player " << respawnId << " respawned, removed from dead list" << std::endl; - } - } - - auto boxDestructions = networkClient->getPendingBoxDestructions(); - if (!boxDestructions.empty()) { - std::cout << "Game: Received " << boxDestructions.size() << " box destruction events" << std::endl; - - for (const auto& destruction : boxDestructions) { - int idx = destruction.boxIndex; - - if (idx >= 0 && idx < (int)boxCoordsArr.size()) { - if (boxAlive[idx]) { - boxAlive[idx] = false; - - boxRenderArr[idx].data.PositionData.clear(); - boxRenderArr[idx].vao.reset(); - boxRenderArr[idx].positionVBO.reset(); - boxRenderArr[idx].texCoordVBO.reset(); - - showExplosion = true; - explosionEmitter.setUseWorldSpace(true); - explosionEmitter.setEmissionPoints(std::vector{ destruction.position }); - explosionEmitter.emit(); - lastExplosionTime = SDL_GetTicks64(); - - std::cout << "Game: Box " << idx << " destroyed by player " - << destruction.destroyedBy << std::endl; - } - } - } - } - } + space.update(); } void Game::handleDown(int mx, int my) { - int uiX = mx; - int uiY = Environment::height - my; - - menuManager.uiManager.onMouseDown(uiX, uiY); - - bool uiHandled = false; - - for (const auto& button : menuManager.uiManager.findButton("") ? std::vector>{} : std::vector>{}) { - (void)button; - } - - auto pressedSlider = [&]() -> std::shared_ptr { - for (const auto& slider : menuManager.uiManager.findSlider("") ? std::vector>{} : std::vector>{}) { - (void)slider; - } - return nullptr; - }(); - - if (!menuManager.uiManager.isUiInteraction()) { - Environment::tapDownHold = true; - - Environment::tapDownStartPos(0) = mx; - Environment::tapDownStartPos(1) = my; - - Environment::tapDownCurrentPos(0) = mx; - Environment::tapDownCurrentPos(1) = my; - } + space.handleDown(mx, my); } void Game::handleUp(int mx, int my) { - int uiX = mx; - int uiY = Environment::height - my; - - menuManager.uiManager.onMouseUp(uiX, uiY); - - if (!menuManager.uiManager.isUiInteraction()) { - Environment::tapDownHold = false; - } + space.handleUp(mx, my); } void Game::handleMotion(int mx, int my) { - int uiX = mx; - int uiY = Environment::height - my; - - menuManager.uiManager.onMouseMove(uiX, uiY); - - if (Environment::tapDownHold && !menuManager.uiManager.isUiInteraction()) { - Environment::tapDownCurrentPos(0) = mx; - Environment::tapDownCurrentPos(1) = my; - } + space.handleMotion(mx, my); } - /* - std::string Game::formPingMessageContent() - { - Eigen::Quaternionf q(Environment::shipMatrix); - - std::string pingMsg = std::to_string(Environment::shipPosition.x()) + ":" - + std::to_string(Environment::shipPosition.y()) + ":" - + std::to_string(Environment::shipPosition.z()) + ":" - + std::to_string(q.w()) + ":" - + std::to_string(q.x()) + ":" - + std::to_string(q.y()) + ":" - + std::to_string(q.z()) + ":" - + std::to_string(Environment::currentAngularVelocity.x()) + ":" - + std::to_string(Environment::currentAngularVelocity.y()) + ":" - + std::to_string(Environment::currentAngularVelocity.z()) + ":" - + std::to_string(Environment::shipVelocity) + ":" - + std::to_string(Environment::shipSelectedVelocity) + ":" - + std::to_string(Environment::lastSentMagnitude) + ":" // Используем те же static переменные из блока ROT - + std::to_string(Environment::lastSentAngle); - - return pingMsg; - }*/ - } // namespace ZL diff --git a/src/Game.h b/src/Game.h index 84e3701..057eb17 100644 --- a/src/Game.h +++ b/src/Game.h @@ -35,113 +35,27 @@ namespace ZL { Renderer renderer; TaskManager taskManager; MainThreadHandler mainThreadHandler; - std::unique_ptr networkClient; - - private: int64_t getSyncTimeMs(); void processTickCount(); void drawScene(); - void drawCubemap(float skyPercent); - void drawShip(); - void drawBoxes(); - void drawBoxesLabels(); void drawUI(); - void drawRemoteShips(); - void drawRemoteShipsLabels(); - void fireProjectiles(); - - bool worldToScreen(const Vector3f& world, float& outX, float& outY, float& outDepth) const; - void handleDown(int mx, int my); void handleUp(int mx, int my); void handleMotion(int mx, int my); SDL_Window* window; SDL_GLContext glContext; - - int64_t newTickCount; int64_t lastTickCount; - std::vector boxCoordsArr; - std::vector boxRenderArr; - - std::vector boxLabels; - std::unique_ptr textRenderer; - - //std::unordered_map latestRemotePlayers; - std::unordered_map remotePlayerStates; - - float newShipVelocity = 0; - static const size_t CONST_TIMER_INTERVAL = 10; static const size_t CONST_MAX_TIME_INTERVAL = 1000; - std::shared_ptr sparkTexture; - std::shared_ptr spaceshipTexture; - std::shared_ptr cubemapTexture; - VertexDataStruct spaceshipBase; - VertexRenderStruct spaceship; - - - VertexRenderStruct cubemap; - - std::shared_ptr boxTexture; - VertexDataStruct boxBase; - - SparkEmitter sparkEmitter; - SparkEmitter projectileEmitter; - SparkEmitter explosionEmitter; - PlanetObject planetObject; - MenuManager menuManager; - - std::vector> projectiles; - std::shared_ptr projectileTexture; - float projectileCooldownMs = 500.0f; - int64_t lastProjectileFireTime = 0; - int maxProjectiles = 32; - std::vector shipLocalEmissionPoints; - - - bool shipAlive = true; - bool gameOver = false; - std::vector boxAlive; - float shipCollisionRadius = 15.0f; - float boxCollisionRadius = 2.0f; - //bool uiGameOverShown = false; - bool showExplosion = false; - uint64_t lastExplosionTime = 0; - const uint64_t explosionDurationMs = 500; - - bool serverBoxesApplied = false; - - static constexpr float MAX_DIST_SQ = 10000.f * 10000.f; - static constexpr float FADE_START = 6000.f; - static constexpr float FADE_RANGE = 4000.f; - static constexpr float BASE_SCALE = 140.f; - static constexpr float PERSPECTIVE_K = 0.05f; // Tune - static constexpr float MIN_SCALE = 0.4f; - static constexpr float MAX_SCALE = 0.8f; - static constexpr float CLOSE_DIST = 600.0f; - - std::unordered_set deadRemotePlayers; - - // --- Target HUD (brackets + offscreen arrow) --- - int trackedTargetId = -1; - bool targetWasVisible = false; - float targetAcquireAnim = 0.0f; // 0..1 схлопывание (0 = далеко, 1 = на месте) - - // временный меш для HUD (будем перезаливать VBO маленькими порциями) - VertexRenderStruct hudTempMesh; - - // helpers - bool projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const; - void drawTargetHud(); // рисует рамку или стрелку - int pickTargetId() const; // выбирает цель (пока: ближайший живой удаленный игрок) + Space space; }; diff --git a/src/Space.cpp b/src/Space.cpp index e69de29..073b1d5 100644 --- a/src/Space.cpp +++ b/src/Space.cpp @@ -0,0 +1,1482 @@ +#include "Space.h" +#include "AnimatedModel.h" +#include "BoneAnimatedModel.h" +#include "planet/PlanetData.h" +#include "utils/Utils.h" +#include "render/OpenGlExtensions.h" +#include +#include "render/TextureManager.h" +#include "TextModel.h" +#include +#include +#include +#include +#ifdef __ANDROID__ +#include +#endif + +#ifdef NETWORK +#ifdef EMSCRIPTEN +#include "network/WebSocketClientEmscripten.h" +#else +#include "network/WebSocketClient.h" +#endif +#else +#include "network/LocalClient.h" +#endif + +namespace ZL +{ + + extern const char* CONST_ZIP_FILE; + + extern bool g_exitBgAnimating; + + extern bool firePressed; + + extern float x; + + Eigen::Quaternionf generateRandomQuaternion(std::mt19937& gen) + { + + std::normal_distribution<> distrib(0.0, 1.0); + + Eigen::Quaternionf randomQuat = { + (float)distrib(gen), + (float)distrib(gen), + (float)distrib(gen), + (float)distrib(gen) + }; + + return randomQuat.normalized(); + } + + std::vector generateRandomBoxCoords(int N) + { + const float MIN_DISTANCE = 3.0f; + const float MIN_DISTANCE_SQUARED = MIN_DISTANCE * MIN_DISTANCE; + const float MIN_COORD = -100.0f; + const float MAX_COORD = 100.0f; + const int MAX_ATTEMPTS = 1000; + std::vector boxCoordsArr; + + std::random_device rd; + std::mt19937 gen(rd()); + + std::uniform_real_distribution<> distrib(MIN_COORD, MAX_COORD); + + int generatedCount = 0; + + while (generatedCount < N) + { + bool accepted = false; + int attempts = 0; + + while (!accepted && attempts < MAX_ATTEMPTS) + { + Vector3f newPos( + (float)distrib(gen), + (float)distrib(gen), + (float)distrib(gen) + ); + + accepted = true; + for (const auto& existingBox : boxCoordsArr) + { + + Vector3f diff = newPos - existingBox.pos; + + float distanceSquared = diff.squaredNorm(); + + if (distanceSquared < MIN_DISTANCE_SQUARED) + { + accepted = false; + break; + } + } + + if (accepted) + { + Eigen::Quaternionf randomQuat = generateRandomQuaternion(gen); + + Matrix3f randomMatrix = randomQuat.toRotationMatrix(); + + boxCoordsArr.emplace_back(BoxCoords{ newPos, randomMatrix }); + generatedCount++; + } + attempts++; + } + + if (!accepted) { + break; + } + } + + return boxCoordsArr; + } + + static Eigen::Matrix4f makeViewMatrix_FromYourCamera() + { + Eigen::Matrix4f Tz = Eigen::Matrix4f::Identity(); + Tz(2, 3) = -1.0f * ZL::Environment::zoom; + + Eigen::Matrix4f R = Eigen::Matrix4f::Identity(); + R.block<3, 3>(0, 0) = ZL::Environment::inverseShipMatrix; + + Eigen::Matrix4f Tship = Eigen::Matrix4f::Identity(); + Tship(0, 3) = -ZL::Environment::shipState.position.x(); + Tship(1, 3) = -ZL::Environment::shipState.position.y(); + Tship(2, 3) = -ZL::Environment::shipState.position.z(); + + return Tz * R * Tship; + } + + static Eigen::Matrix4f makePerspective(float fovyRadians, float aspect, float zNear, float zFar) + { + // Стандартная перспектива + float f = 1.0f / std::tan(fovyRadians * 0.5f); + + Eigen::Matrix4f P = Eigen::Matrix4f::Zero(); + P(0, 0) = f / aspect; + P(1, 1) = f; + P(2, 2) = (zFar + zNear) / (zNear - zFar); + P(2, 3) = (2.0f * zFar * zNear) / (zNear - zFar); + P(3, 2) = -1.0f; + return P; + } + + bool Space::worldToScreen(const Vector3f& world, float& outX, float& outY, float& outDepth) const + { + // Матрицы должны совпасть с drawBoxes/drawShip по смыслу + float aspect = static_cast(Environment::width) / static_cast(Environment::height); + + Eigen::Matrix4f V = makeViewMatrix_FromYourCamera(); + Eigen::Matrix4f P = makePerspective(1.0f / 1.5f, aspect, Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); + + Eigen::Vector4f w(world.x(), world.y(), world.z(), 1.0f); + Eigen::Vector4f clip = P * V * w; + + if (clip.w() <= 0.0001f) return false; // позади камеры + + Eigen::Vector3f ndc = clip.head<3>() / clip.w(); // [-1..1] + outDepth = ndc.z(); + + // В пределах экрана? + // (можно оставить, можно клампить) + float sx = (ndc.x() * 0.5f + 0.5f) * Environment::width; + float sy = (ndc.y() * 0.5f + 0.5f) * Environment::height; + + outX = sx; + outY = sy; + + // Можно отсеять те, что вне: + if (sx < -200 || sx > Environment::width + 200) return false; + if (sy < -200 || sy > Environment::height + 200) return false; + + return true; + } + + bool Space::projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const + { + float aspect = static_cast(Environment::width) / static_cast(Environment::height); + Eigen::Matrix4f V = makeViewMatrix_FromYourCamera(); + Eigen::Matrix4f P = makePerspective(1.0f / 1.5f, aspect, Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); + + Eigen::Vector4f w(world.x(), world.y(), world.z(), 1.0f); + Eigen::Vector4f clip = P * V * w; + + clipW = clip.w(); + if (std::abs(clipW) < 1e-6f) return false; + + Eigen::Vector3f ndc = clip.head<3>() / clipW; + ndcX = ndc.x(); + ndcY = ndc.y(); + ndcZ = ndc.z(); + return true; + } + + void Space::drawBoxesLabels() + { + if (!textRenderer) return; + + // Текст рисуем как 2D поверх всего 3D, но ДО drawUI или после — как хочешь. + // Чтобы подписи были поверх — делай после drawBoxes и до drawUI (как мы и вставили). + + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + for (size_t i = 0; i < boxCoordsArr.size(); ++i) + { + if (i >= boxAlive.size() || !boxAlive[i]) continue; + if (i >= boxLabels.size()) continue; + + // ВАЖНО: твои боксы рисуются с Translate({0,0,45000}) + pos + Vector3f boxWorld = boxCoordsArr[i].pos + Vector3f{ 0.0f, 0.0f, 45000.0f }; + + // Чуть выше бокса по Y (или по Z — как нравится) + Vector3f labelWorld = boxWorld + Vector3f{ 0.0f, 2.2f, 0.0f }; + + float sx, sy, depth; + if (!worldToScreen(labelWorld, sx, sy, depth)) continue; + + // В твоей UI-системе Y обычно перевёрнут (ты делаешь uiY = height - my). + // Наш worldToScreen отдаёт Y в системе "низ=0, верх=height" (NDC->screen). + // Чтобы совпало с твоей UI-логикой, перевернём: + float uiX = sx; + float uiY = sy; // если окажется вверх ногами — замени на (Environment::height - sy) + + float dist = (Environment::shipState.position - boxWorld).norm(); + float scaleRaw = 120.0f / (dist + 1.0f); + float scale = std::round(scaleRaw * 10.0f) / 10.0f; // округление до 0.1 + scale = std::clamp(scale, 0.6f, 1.2f); + + textRenderer->drawText(boxLabels[i], uiX, uiY, scale, /*centered*/true); + } + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + } + + + Space::Space(Renderer& iRenderer, TaskManager& iTaskManager, MainThreadHandler& iMainThreadHandler, std::unique_ptr& iNetworkClient, MenuManager& iMenuManager) + : renderer(iRenderer), + taskManager(iTaskManager), + mainThreadHandler(iMainThreadHandler), + planetObject(renderer, taskManager, mainThreadHandler), + networkClient(iNetworkClient), + menuManager(iMenuManager) + { + projectiles.reserve(maxProjectiles); + for (int i = 0; i < maxProjectiles; ++i) { + projectiles.emplace_back(std::make_unique()); + } + } + + Space::~Space() { + } + + void Space::setup() { + + + menuManager.onRestartPressed = [this]() { + this->shipAlive = true; + this->gameOver = false; + this->showExplosion = false; + this->explosionEmitter.setEmissionPoints(std::vector()); + Environment::shipState.position = Vector3f{ 0, 0, 45000.f }; + Environment::shipState.velocity = 0.0f; + Environment::shipState.rotation = Eigen::Matrix3f::Identity(); + Environment::inverseShipMatrix = Eigen::Matrix3f::Identity(); + Environment::zoom = DEFAULT_ZOOM; + Environment::tapDownHold = false; + + std::cerr << "Game restarted\n"; + }; + + menuManager.onVelocityChanged = [this](float newVelocity) { + newShipVelocity = newVelocity; + }; + + bool cfgLoaded = sparkEmitter.loadFromJsonFile("resources/config/spark_config.json", renderer, CONST_ZIP_FILE); + bool projCfgLoaded = projectileEmitter.loadFromJsonFile("resources/config/spark_projectile_config.json", renderer, CONST_ZIP_FILE); + bool explosionCfgLoaded = explosionEmitter.loadFromJsonFile("resources/config/explosion_config.json", renderer, CONST_ZIP_FILE); + explosionEmitter.setEmissionPoints(std::vector()); + projectileEmitter.setEmissionPoints(std::vector()); + + cubemapTexture = std::make_shared( + std::array{ + CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), + CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), + CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), + CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), + CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE), + CreateTextureDataFromPng("resources/sky/space_red.png", CONST_ZIP_FILE) + }); + + + cubemap.data = ZL::CreateCubemap(500); + cubemap.RefreshVBO(); + + + + //Load texture + spaceshipTexture = std::make_unique(CreateTextureDataFromPng("resources/MainCharacter_Base_color_sRGB.png", CONST_ZIP_FILE)); + spaceshipBase = LoadFromTextFile02("resources/spaceshipnew001.txt", CONST_ZIP_FILE); + spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); + + spaceshipBase.Move(Vector3f{ 1.2, 0, -5 }); + + spaceship.AssignFrom(spaceshipBase); + spaceship.RefreshVBO(); + + + //Boxes + boxTexture = std::make_unique(CreateTextureDataFromPng("resources/box/box.png", CONST_ZIP_FILE)); + boxBase = LoadFromTextFile02("resources/box/box.txt", CONST_ZIP_FILE); + + boxCoordsArr = generateRandomBoxCoords(50); + boxRenderArr.resize(boxCoordsArr.size()); + for (int i = 0; i < boxCoordsArr.size(); i++) + { + boxRenderArr[i].AssignFrom(boxBase); + boxRenderArr[i].RefreshVBO(); + } + + boxAlive.resize(boxCoordsArr.size(), true); + ZL::CheckGlError(); + boxLabels.clear(); + boxLabels.reserve(boxCoordsArr.size()); + for (size_t i = 0; i < boxCoordsArr.size(); ++i) { + boxLabels.push_back("Box " + std::to_string(i + 1)); + } + + if (!cfgLoaded) + { + throw std::runtime_error("Failed to load spark emitter config file!"); + } + + textRenderer = std::make_unique(); + if (!textRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 32, CONST_ZIP_FILE)) { + std::cerr << "Failed to init TextRenderer\n"; + } + ZL::CheckGlError(); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + planetObject.init(); + } + + + void Space::drawCubemap(float skyPercent) + { + static const std::string defaultShaderName = "default"; + static const std::string envShaderName = "env_sky"; + static const std::string vPositionName = "vPosition"; + static const std::string vTexCoordName = "vTexCoord"; + static const std::string textureUniformName = "Texture"; + static const std::string skyPercentUniformName = "skyPercent"; + + renderer.shaderManager.PushShader(envShaderName); + renderer.RenderUniform1i(textureUniformName, 0); + renderer.RenderUniform1f(skyPercentUniformName, skyPercent); + renderer.EnableVertexAttribArray(vPositionName); + renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, + static_cast(Environment::width) / static_cast(Environment::height), + Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); + renderer.PushMatrix(); + renderer.LoadIdentity(); + renderer.RotateMatrix(Environment::inverseShipMatrix); + + + Vector3f worldLightDir = Vector3f(1.0f, -1.0f, -1.0f).normalized(); + Matrix3f viewMatrix = Environment::inverseShipMatrix; + Vector3f viewLightDir = (viewMatrix * worldLightDir).normalized(); + + + // Передаем вектор НА источник света + Vector3f lightToSource = -viewLightDir; + renderer.RenderUniform3fv("uLightDirView", lightToSource.data()); + + // 2. Базовый цвет атмосферы (голубой) + Vector3f skyColor = { 0.0f, 0.5f, 1.0f }; + renderer.RenderUniform3fv("uSkyColor", skyColor.data()); + + // 1. Вектор направления от центра планеты к игроку (в мировых координатах) + // Предполагаем, что планета в (0,0,0). Если нет, то (shipPosition - planetCenter) + Vector3f playerDirWorld = Environment::shipState.position.normalized(); + + // 2. Направление света в мировом пространстве + //Vector3f worldLightDir = Vector3f(1.0f, -1.0f, -1.0f).normalized(); + + // 3. Считаем глобальную освещенность для игрока (насколько он на свету) + // Это одно число для всего кадра + float playerLightFactor = playerDirWorld.dot(-worldLightDir); + // Ограничиваем и делаем переход мягче + playerLightFactor = std::clamp((playerLightFactor + 0.2f) / 1.2f, 0.0f, 1.0f); + + renderer.RenderUniform1f("uPlayerLightFactor", playerLightFactor); + renderer.RenderUniform1f("skyPercent", skyPercent); + + CheckGlError(); + + glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture->getTexID()); + renderer.DrawVertexRenderStruct(cubemap); + + CheckGlError(); + + + renderer.PopMatrix(); + renderer.PopProjectionMatrix(); + renderer.DisableVertexAttribArray(vPositionName); + + renderer.shaderManager.PopShader(); + CheckGlError(); + } + + void Space::drawShip() + { + static const std::string defaultShaderName = "default"; + static const std::string envShaderName = "env"; + static const std::string vPositionName = "vPosition"; + static const std::string vTexCoordName = "vTexCoord"; + static const std::string textureUniformName = "Texture"; + + renderer.shaderManager.PushShader(defaultShaderName); + renderer.RenderUniform1i(textureUniformName, 0); + renderer.EnableVertexAttribArray(vPositionName); + renderer.EnableVertexAttribArray(vTexCoordName); + + renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, + static_cast(Environment::width) / static_cast(Environment::height), + Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); + renderer.PushMatrix(); + + renderer.LoadIdentity(); + renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom }); + renderer.PushMatrix(); + renderer.TranslateMatrix({ 0, -6.f, 0 }); //Ship camera offset + + if (shipAlive) { + glBindTexture(GL_TEXTURE_2D, spaceshipTexture->getTexID()); + renderer.DrawVertexRenderStruct(spaceship); + } + renderer.PopMatrix(); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + for (const auto& p : projectiles) { + if (p && p->isActive()) { + p->draw(renderer); + } + } + + projectileEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); + + if (shipAlive) { + renderer.PushMatrix(); + renderer.TranslateMatrix({ 0, 0, 16 }); + renderer.TranslateMatrix({ 0, -6.f, 0 }); + sparkEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); + renderer.PopMatrix(); + } + + if (showExplosion) { + explosionEmitter.draw(renderer, Environment::zoom, Environment::width, Environment::height); + } + + //glBindTexture(GL_TEXTURE_2D, basePlatformTexture->getTexID()); + //renderer.DrawVertexRenderStruct(basePlatform); + + glDisable(GL_BLEND); + renderer.PopMatrix(); + renderer.PopProjectionMatrix(); + renderer.DisableVertexAttribArray(vPositionName); + renderer.DisableVertexAttribArray(vTexCoordName); + + renderer.shaderManager.PopShader(); + CheckGlError(); + } + + void Space::drawBoxes() + { + static const std::string defaultShaderName = "default"; + static const std::string envShaderName = "env"; + static const std::string vPositionName = "vPosition"; + static const std::string vTexCoordName = "vTexCoord"; + static const std::string textureUniformName = "Texture"; + + renderer.shaderManager.PushShader(defaultShaderName); + renderer.RenderUniform1i(textureUniformName, 0); + renderer.EnableVertexAttribArray(vPositionName); + renderer.EnableVertexAttribArray(vTexCoordName); + + renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, + static_cast(Environment::width) / static_cast(Environment::height), + Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); + + for (int i = 0; i < boxCoordsArr.size(); i++) + { + if (!boxAlive[i]) continue; + renderer.PushMatrix(); + + renderer.LoadIdentity(); + renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom }); + renderer.RotateMatrix(Environment::inverseShipMatrix); + renderer.TranslateMatrix(-Environment::shipState.position); + renderer.TranslateMatrix({ 0.f, 0.f, 45000.f }); + renderer.TranslateMatrix(boxCoordsArr[i].pos); + renderer.RotateMatrix(boxCoordsArr[i].m); + + glBindTexture(GL_TEXTURE_2D, boxTexture->getTexID()); + //glBindTexture(GL_TEXTURE_2D, rockTexture->getTexID()); + renderer.DrawVertexRenderStruct(boxRenderArr[i]); + + renderer.PopMatrix(); + } + renderer.PopProjectionMatrix(); + renderer.DisableVertexAttribArray(vPositionName); + renderer.DisableVertexAttribArray(vTexCoordName); + + renderer.shaderManager.PopShader(); + CheckGlError(); + } + + void Space::drawScene() { + static const std::string defaultShaderName = "default"; + static const std::string envShaderName = "env"; + static const std::string vPositionName = "vPosition"; + static const std::string vTexCoordName = "vTexCoord"; + static const std::string textureUniformName = "Texture"; + + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); + + glViewport(0, 0, Environment::width, Environment::height); + + CheckGlError(); + + float skyPercent = 0.0; + float distance = planetObject.distanceToPlanetSurface(Environment::shipState.position); + if (distance > 1500.f) + { + skyPercent = 0.0f; + } + else if (distance < 800.f) + { + skyPercent = 1.0f; + } + else + { + skyPercent = (1500.f - distance) / (1500.f - 800.f); + } + + + drawCubemap(skyPercent); + planetObject.draw(renderer); + if (planetObject.distanceToPlanetSurface(Environment::shipState.position) > 100.f) + { + glClear(GL_DEPTH_BUFFER_BIT); + } + + drawRemoteShips(); + drawRemoteShipsLabels(); + drawBoxes(); + drawBoxesLabels(); + drawShip(); + + //drawUI(); + drawTargetHud(); + CheckGlError(); + } + + void Space::drawRemoteShips() { + // Используем те же константы имен для шейдеров, что и в drawShip + static const std::string defaultShaderName = "default"; + static const std::string vPositionName = "vPosition"; + static const std::string vTexCoordName = "vTexCoord"; + static const std::string textureUniformName = "Texture"; + + // Активируем шейдер и текстуру (предполагаем, что меш у всех одинаковый) + renderer.shaderManager.PushShader(defaultShaderName); + renderer.RenderUniform1i(textureUniformName, 0); + + renderer.EnableVertexAttribArray(vPositionName); + renderer.EnableVertexAttribArray(vTexCoordName); + + renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, + static_cast(Environment::width) / static_cast(Environment::height), + Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); + + // Биндим текстуру корабля один раз для всех удаленных игроков (оптимизация батчинга) + glBindTexture(GL_TEXTURE_2D, spaceshipTexture->getTexID()); + + // Если сервер прислал коробки, применяем их однократно вместо локальной генерации + if (!serverBoxesApplied && networkClient) { + auto sboxes = networkClient->getServerBoxes(); + if (!sboxes.empty()) { + boxCoordsArr.clear(); + for (auto& b : sboxes) { + BoxCoords bc; + bc.pos = b.first; + bc.m = b.second; + boxCoordsArr.push_back(bc); + } + boxRenderArr.resize(boxCoordsArr.size()); + for (int i = 0; i < (int)boxCoordsArr.size(); ++i) { + boxRenderArr[i].AssignFrom(boxBase); + boxRenderArr[i].RefreshVBO(); + } + boxAlive.assign(boxCoordsArr.size(), true); + serverBoxesApplied = true; + } + } + + // Итерируемся по актуальным данным из extrapolateRemotePlayers + for (auto const& [id, remotePlayer] : remotePlayerStates) { + + const ClientState& playerState = remotePlayer; + if (deadRemotePlayers.count(id)) continue; + + renderer.PushMatrix(); + renderer.LoadIdentity(); + + renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom }); + renderer.TranslateMatrix({ 0, -6.f, 0 }); //Ship camera offset + renderer.RotateMatrix(Environment::inverseShipMatrix); + renderer.TranslateMatrix(-Environment::shipState.position); + + + Eigen::Vector3f relativePos = playerState.position;// -Environment::shipPosition; + renderer.TranslateMatrix(relativePos); + + // 3. Поворот врага + renderer.RotateMatrix(playerState.rotation); + + renderer.DrawVertexRenderStruct(spaceship); + renderer.PopMatrix(); + } + + renderer.PopProjectionMatrix(); + renderer.DisableVertexAttribArray(vPositionName); + renderer.DisableVertexAttribArray(vTexCoordName); + renderer.shaderManager.PopShader(); + + CheckGlError(); + } + + void Space::drawRemoteShipsLabels() + { + if (!textRenderer) return; + + //#ifdef NETWORK + // 2D поверх 3D + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + for (auto const& [id, remotePlayer] : remotePlayerStates) + { + if (deadRemotePlayers.count(id)) continue; + + const ClientState& st = remotePlayer; + // Позиция корабля в мире + Vector3f shipWorld = st.position; + + float distSq = (Environment::shipState.position - shipWorld).squaredNorm(); + /*if (distSq > MAX_DIST_SQ) // дальность прорисовки никнейма + continue;*/ + float dist = sqrt(distSq); + float alpha = 1.0f; // постоянная видимость + /*float alpha = std::clamp(1.f - (dist - FADE_START) / FADE_RANGE, 0.f, 1.f); // дальность прорисовки никнейма + if (alpha < 0.01f) + continue; */ + Vector3f labelWorld = shipWorld + Vector3f{ 0.f, -4.f, 0.f }; // регулировка высоты + float sx, sy, depth; + if (!worldToScreen(labelWorld, sx, sy, depth)) + continue; + + float uiX = sx, uiY = sy; + float scale = std::clamp(BASE_SCALE / (dist * PERSPECTIVE_K + 1.f), MIN_SCALE, MAX_SCALE); + + // Дефолтный лейбл + std::string label = "Player (" + std::to_string(st.id) + ") " + std::to_string((int)dist) + "m"; + + // TODO: nickname sync + + textRenderer->drawText(label, uiX + 1.f, uiY + 1.f, scale, true, { 0.f, 0.f, 0.f, alpha }); // color param + textRenderer->drawText(label, uiX, uiY, scale, true, { 1.f, 1.f, 1.f, alpha }); + } + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + //#endif + } + + int Space::pickTargetId() const + { + int bestId = -1; + constexpr float INF_F = 1e30f; + float bestDistSq = INF_F; + + for (auto const& [id, st] : remotePlayerStates) { + if (deadRemotePlayers.count(id)) continue; + + float d2 = (Environment::shipState.position - st.position).squaredNorm(); + if (d2 < bestDistSq) { + bestDistSq = d2; + bestId = id; + } + } + return bestId; + } + + static VertexDataStruct MakeColoredRect2D(float cx, float cy, float hw, float hh, float z, + const Eigen::Vector4f& rgba) + { + VertexDataStruct v; + // 2 triangles + Vector3f p1{ cx - hw, cy - hh, z }; + Vector3f p2{ cx - hw, cy + hh, z }; + Vector3f p3{ cx + hw, cy + hh, z }; + Vector3f p4{ cx + hw, cy - hh, z }; + + v.PositionData = { p1, p2, p3, p3, p4, p1 }; + + // defaultColor shader likely uses vColor (vec3), но нам нужен alpha. + // У тебя в Renderer есть RenderUniform4fv, но шейдер может брать vColor. + // Поэтому: сделаем ColorData vec3, а alpha дадим через uniform uColor, если есть. + // Если в defaultColor нет uniform uColor — тогда alpha будет 1.0. + // Для совместимости: кладём RGB, alpha будем задавать uniform'ом отдельно. + Vector3f rgb{ rgba.x(), rgba.y(), rgba.z() }; + v.ColorData = { rgb, rgb, rgb, rgb, rgb, rgb }; + return v; + } + + void Space::drawTargetHud() + { + if (!textRenderer) return; + + // 1) выбираем цель + int targetIdNow = pickTargetId(); + if (targetIdNow < 0) { + trackedTargetId = -1; + targetAcquireAnim = 0.f; + targetWasVisible = false; + return; + } + + // если цель сменилась — сброс анимации “схлопывания” + if (trackedTargetId != targetIdNow) { + trackedTargetId = targetIdNow; + targetAcquireAnim = 0.0f; + targetWasVisible = false; + } + + const ClientState& st = remotePlayerStates.at(trackedTargetId); + Vector3f shipWorld = st.position; + + // 2) проекция + float ndcX, ndcY, ndcZ, clipW; + if (!projectToNDC(shipWorld, ndcX, ndcY, ndcZ, clipW)) return; + + // behind camera? + bool behind = (clipW <= 0.0f); + + // on-screen check (NDC) + bool onScreen = (!behind && + ndcX >= -1.0f && ndcX <= 1.0f && + ndcY >= -1.0f && ndcY <= 1.0f); + + // 3) расстояние + float dist = (Environment::shipState.position - shipWorld).norm(); + + // time for arrow bob + float t = static_cast(SDL_GetTicks64()) * 0.001f; + + // 4) Настройки стиля (как X3) + Eigen::Vector4f enemyColor(1.f, 0.f, 0.f, 1.f); // красный + float thickness = 2.0f; // толщина линий (px) + float z = 0.0f; // 2D слой + + // 5) Если цель в кадре: рисуем скобки + if (onScreen) + { + // перевод NDC -> экран (в пикселях) + float sx = (ndcX * 0.5f + 0.5f) * Environment::width; + float sy = (ndcY * 0.5f + 0.5f) * Environment::height; + + // анимация “снаружи внутрь” + // targetAcquireAnim растёт к 1, быстро (похоже на захват) + float dt = 1.0f / 60.0f; // у тебя нет dt в draw, берём константу, выглядит норм + targetAcquireAnim = min(1.0f, targetAcquireAnim + dt * 6.5f); + + // базовый размер рамки в зависимости от дистанции (как у лейблов) + float size = 220.0f / (dist * 0.01f + 1.0f); // подстройка + size = std::clamp(size, 35.0f, 120.0f); // min/max + + // “схлопывание”: сначала больше, потом ближе к кораблю + // expand 1.6 -> 1.0 + float expand = 1.6f - 0.6f * targetAcquireAnim; + + float half = size * expand; + float cornerLen = max(10.0f, half * 0.35f); + + // точки углов + float left = sx - half; + float right = sx + half; + float bottom = sy - half; + float top = sy + half; + + // рисуем 8 тонких прямоугольников (2 на угол) + auto drawBar = [&](float cx, float cy, float w, float h) + { + VertexDataStruct v = MakeColoredRect2D(cx, cy, w * 0.5f, h * 0.5f, z, enemyColor); + hudTempMesh.AssignFrom(v); + renderer.DrawVertexRenderStruct(hudTempMesh); + }; + + // включаем 2D режим + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + renderer.shaderManager.PushShader("defaultColor"); + renderer.PushProjectionMatrix((float)Environment::width, (float)Environment::height, 0.f, 1.f); + renderer.PushMatrix(); + renderer.LoadIdentity(); + + // верх-лево: горизонт + вертикаль + drawBar(left + cornerLen * 0.5f, top, cornerLen, thickness); + drawBar(left, top - cornerLen * 0.5f, thickness, cornerLen); + + // верх-право + drawBar(right - cornerLen * 0.5f, top, cornerLen, thickness); + drawBar(right, top - cornerLen * 0.5f, thickness, cornerLen); + + // низ-лево + drawBar(left + cornerLen * 0.5f, bottom, cornerLen, thickness); + drawBar(left, bottom + cornerLen * 0.5f, thickness, cornerLen); + + // низ-право + drawBar(right - cornerLen * 0.5f, bottom, cornerLen, thickness); + drawBar(right, bottom + cornerLen * 0.5f, thickness, cornerLen); + + renderer.PopMatrix(); + renderer.PopProjectionMatrix(); + renderer.shaderManager.PopShader(); + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + + targetWasVisible = true; + return; + } + + // 6) Если цель offscreen: рисуем стрелку на краю + // dir: куда “смотреть” в NDC + float dirX = ndcX; + float dirY = ndcY; + + // если позади камеры — разворачиваем направление + if (behind) { + dirX = -dirX; + dirY = -dirY; + } + + float len = std::sqrt(dirX * dirX + dirY * dirY); + if (len < 1e-5f) return; + dirX /= len; + dirY /= len; + + // пересечение луча с прямоугольником [-1..1] с отступом + float marginNdc = 0.08f; + float maxX = 1.0f - marginNdc; + float maxY = 1.0f - marginNdc; + + float tx = (std::abs(dirX) < 1e-6f) ? 1e9f : (maxX / std::abs(dirX)); + float ty = (std::abs(dirY) < 1e-6f) ? 1e9f : (maxY / std::abs(dirY)); + float k = min(tx, ty); + + float edgeNdcX = dirX * k; + float edgeNdcY = dirY * k; + + float edgeX = (edgeNdcX * 0.5f + 0.5f) * Environment::width; + float edgeY = (edgeNdcY * 0.5f + 0.5f) * Environment::height; + + // лёгкая анимация “зова”: смещение по направлению + float bob = std::sin(t * 6.0f) * 6.0f; + edgeX += dirX * bob; + edgeY += dirY * bob; + + // стрелка как треугольник + маленький “хвост” + float arrowLen = 26.0f; + float arrowWid = 14.0f; + + // перпендикуляр + float px = -dirY; + float py = dirX; + + Vector3f tip{ edgeX + dirX * arrowLen, edgeY + dirY * arrowLen, z }; + Vector3f left{ edgeX + px * (arrowWid * 0.5f), edgeY + py * (arrowWid * 0.5f), z }; + Vector3f right{ edgeX - px * (arrowWid * 0.5f), edgeY - py * (arrowWid * 0.5f), z }; + + auto drawTri = [&](const Vector3f& a, const Vector3f& b, const Vector3f& c) + { + VertexDataStruct v; + v.PositionData = { a, b, c }; + Vector3f rgb{ enemyColor.x(), enemyColor.y(), enemyColor.z() }; + v.ColorData = { rgb, rgb, rgb }; + hudTempMesh.AssignFrom(v); + renderer.DrawVertexRenderStruct(hudTempMesh); + }; + + auto drawBar = [&](float cx, float cy, float w, float h) + { + VertexDataStruct v = MakeColoredRect2D(cx, cy, w * 0.5f, h * 0.5f, z, enemyColor); + hudTempMesh.AssignFrom(v); + renderer.DrawVertexRenderStruct(hudTempMesh); + }; + + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + renderer.shaderManager.PushShader("defaultColor"); + renderer.PushProjectionMatrix((float)Environment::width, (float)Environment::height, 0.f, 1.f); + renderer.PushMatrix(); + renderer.LoadIdentity(); + + // треугольник-стрелка + drawTri(tip, left, right); + + // “хвост” (короткая черта) + float tailLen = 14.0f; + float tailX = edgeX - dirX * 6.0f; + float tailY = edgeY - dirY * 6.0f; + // хвост рисуем как тонкий прямоугольник, ориентированный примерно по направлению: + // (упрощение: горизонт/вертикаль не поворачиваем, но выглядит ок. Хочешь — сделаем поворот матрицей) + drawBar(tailX, tailY, max(thickness, tailLen), thickness); + + renderer.PopMatrix(); + renderer.PopProjectionMatrix(); + renderer.shaderManager.PopShader(); + + // дистанция рядом со стрелкой + // (у тебя ещё будет “статично под прицелом” — это просто другой TextView / drawText) + { + std::string d = std::to_string((int)dist) + "m"; + float tx = edgeX + px * 18.0f; + float ty = edgeY + py * 18.0f; + textRenderer->drawText(d, tx, ty, 0.6f, true, { 1.f, 0.f, 0.f, 1.f }); + } + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + + targetWasVisible = false; + } + + void Space::processTickCount(int64_t newTickCount, int64_t delta) { + + auto now_ms = newTickCount; + + sparkEmitter.update(static_cast(delta)); + planetObject.update(static_cast(delta)); + + if (firePressed) + { + firePressed = false; + if (now_ms - lastProjectileFireTime >= static_cast(projectileCooldownMs)) { + lastProjectileFireTime = now_ms; + const float projectileSpeed = 250.0f; + + this->fireProjectiles(); + + Eigen::Vector3f localForward = { 0, 0, -1 }; + Eigen::Vector3f worldForward = (Environment::shipState.rotation * localForward).normalized(); + + Eigen::Vector3f centerPos = Environment::shipState.position + + Environment::shipState.rotation * Vector3f{ 0, 0.9f, 5.0f }; + + Eigen::Quaternionf q(Environment::shipState.rotation); + float speedToSend = projectileSpeed + Environment::shipState.velocity; + int shotCount = 2; + + std::string fireMsg = "FIRE:" + + std::to_string(now_ms) + ":" + + std::to_string(centerPos.x()) + ":" + + std::to_string(centerPos.y()) + ":" + + std::to_string(centerPos.z()) + ":" + + std::to_string(q.w()) + ":" + + std::to_string(q.x()) + ":" + + std::to_string(q.y()) + ":" + + std::to_string(q.z()) + ":" + + std::to_string(speedToSend) + ":" + + std::to_string(shotCount); + + networkClient->Send(fireMsg); + } + } + + + //Handle input: + + if (newShipVelocity != Environment::shipState.selectedVelocity) + { + Environment::shipState.selectedVelocity = newShipVelocity; + + std::string msg = "UPD:" + std::to_string(now_ms) + ":" + Environment::shipState.formPingMessageContent(); + networkClient->Send(msg); + } + + float discreteMag; + int discreteAngle; + + if (Environment::tapDownHold) { + float diffx = Environment::tapDownCurrentPos(0) - Environment::tapDownStartPos(0); + float diffy = Environment::tapDownCurrentPos(1) - Environment::tapDownStartPos(1); + + float rawMag = sqrtf(diffx * diffx + diffy * diffy); + float maxRadius = 200.0f; // Максимальный вынос джойстика + + if (rawMag > 10.0f) { // Мертвая зона + // 1. Дискретизируем отклонение (0.0 - 1.0 с шагом 0.1) + float normalizedMag = min(rawMag / maxRadius, 1.0f); + discreteMag = std::round(normalizedMag * 10.0f) / 10.0f; + + // 2. Дискретизируем угол (0-359 градусов) + // atan2 возвращает радианы, переводим в градусы + float radians = atan2f(diffy, diffx); + discreteAngle = static_cast(radians * 180.0f / M_PI); + if (discreteAngle < 0) discreteAngle += 360; + + } + else + { + discreteAngle = -1; + discreteMag = 0.0f; + } + } + else + { + discreteAngle = -1; + discreteMag = 0.0f; + } + + + if (discreteAngle != Environment::shipState.discreteAngle || discreteMag != Environment::shipState.discreteMag) { + Environment::shipState.discreteAngle = discreteAngle; + Environment::shipState.discreteMag = discreteMag; + + std::string msg = "UPD:" + std::to_string(now_ms) + ":" + Environment::shipState.formPingMessageContent(); + networkClient->Send(msg); + std::cout << "Sending: " << msg << std::endl; + } + + long long leftoverDelta = delta; + while (leftoverDelta > 0) + { + long long miniDelta = 50; + Environment::shipState.simulate_physics(miniDelta); + leftoverDelta -= miniDelta; + } + Environment::inverseShipMatrix = Environment::shipState.rotation.inverse(); + + static float pingTimer = 0.0f; + pingTimer += delta; + if (pingTimer >= 1000.0f) { + std::string pingMsg = "UPD:" + std::to_string(now_ms) + ":" + Environment::shipState.formPingMessageContent(); + + networkClient->Send(pingMsg); + std::cout << "Sending: " << pingMsg << std::endl; + pingTimer = 0.0f; + } + + + auto latestRemotePlayers = networkClient->getRemotePlayers(); + + std::chrono::system_clock::time_point nowRoundedWithDelay{ std::chrono::milliseconds(newTickCount - CLIENT_DELAY) }; + + + for (auto const& [id, remotePlayer] : latestRemotePlayers) { + + if (!remotePlayer.canFetchClientStateAtTime(nowRoundedWithDelay)) + { + continue; + } + + ClientState playerState = remotePlayer.fetchClientStateAtTime(nowRoundedWithDelay); + + remotePlayerStates[id] = playerState; + + } + + for (auto& p : projectiles) { + if (p && p->isActive()) { + p->update(static_cast(delta), renderer); + } + } + + std::vector projCameraPoints; + for (const auto& p : projectiles) { + if (p && p->isActive()) { + Vector3f worldPos = p->getPosition(); + Vector3f rel = worldPos - Environment::shipState.position; + Vector3f camPos = Environment::inverseShipMatrix * rel; + projCameraPoints.push_back(camPos); + } + } + if (!projCameraPoints.empty()) { + projectileEmitter.setEmissionPoints(projCameraPoints); + projectileEmitter.emit(); + } + else { + projectileEmitter.setEmissionPoints(std::vector()); + } + + std::vector shipCameraPoints; + for (const auto& lp : shipLocalEmissionPoints) { + Vector3f adjusted = lp + Vector3f{ 0.0f, -Environment::zoom * 0.03f, 0.0f }; + shipCameraPoints.push_back(adjusted); + } + if (!shipCameraPoints.empty()) { + sparkEmitter.setEmissionPoints(shipCameraPoints); + } + + sparkEmitter.update(static_cast(delta)); + projectileEmitter.update(static_cast(delta)); + + explosionEmitter.update(static_cast(delta)); + if (showExplosion) { + uint64_t now = SDL_GetTicks64(); + if (lastExplosionTime != 0 && now - lastExplosionTime >= explosionDurationMs) { + showExplosion = false; + explosionEmitter.setEmissionPoints(std::vector()); + explosionEmitter.setUseWorldSpace(false); + } + } + if (shipAlive) { + float distToSurface = planetObject.distanceToPlanetSurface(Environment::shipState.position); + if (distToSurface <= 0.0f) { + + Vector3f dir = (Environment::shipState.position - PlanetData::PLANET_CENTER_OFFSET).normalized(); + Vector3f collisionPoint = PlanetData::PLANET_CENTER_OFFSET + dir * PlanetData::PLANET_RADIUS; + Environment::shipState.position = PlanetData::PLANET_CENTER_OFFSET + dir * (PlanetData::PLANET_RADIUS + shipCollisionRadius + 0.1f); + + shipAlive = false; + gameOver = true; + Environment::shipState.velocity = 0.0f; + showExplosion = true; + + explosionEmitter.setUseWorldSpace(true); + explosionEmitter.setEmissionPoints(std::vector{ collisionPoint }); + explosionEmitter.emit(); + lastExplosionTime = SDL_GetTicks64(); + + std::cerr << "GAME OVER: collision with planet (moved back and exploded)\n"; + + menuManager.showGameOver(); + } + else { + bool stoneCollided = false; + int collidedTriIdx = -1; + Vector3f collidedStonePos = Vector3f{ 0.0f, 0.0f, 0.0f }; + float collidedStoneRadius = 0.0f; + + for (int triIdx : planetObject.triangleIndicesToDraw) { + if (triIdx < 0 || triIdx >= static_cast(planetObject.planetStones.allInstances.size())) + continue; + + if (planetObject.planetStones.statuses.size() <= static_cast(triIdx)) + continue; + + if (planetObject.planetStones.statuses[triIdx] != ChunkStatus::Live) + continue; + + const auto& instances = planetObject.planetStones.allInstances[triIdx]; + for (const auto& inst : instances) { + + Vector3f stoneWorld = inst.position; + Vector3f diff = Environment::shipState.position - stoneWorld; + + float maxScale = (std::max)({ inst.scale(0), inst.scale(1), inst.scale(2) }); + float stoneRadius = StoneParams::BASE_SCALE * maxScale * 0.9f; + float thresh = shipCollisionRadius + stoneRadius; + + if (diff.squaredNorm() <= thresh * thresh) { + stoneCollided = true; + collidedTriIdx = triIdx; + collidedStonePos = stoneWorld; + collidedStoneRadius = stoneRadius; + break; + } + } + + if (stoneCollided) break; + } + + if (stoneCollided) { + Vector3f away = (Environment::shipState.position - collidedStonePos); + if (away.squaredNorm() <= 1e-6f) { + away = Vector3f{ 0.0f, 1.0f, 0.0f }; + } + away.normalize(); + + Environment::shipState.position = collidedStonePos + away * (collidedStoneRadius + shipCollisionRadius + 0.1f); + + shipAlive = false; + gameOver = true; + Environment::shipState.velocity = 0.0f; + showExplosion = true; + + explosionEmitter.setUseWorldSpace(true); + explosionEmitter.setEmissionPoints(std::vector{ collidedStonePos }); + explosionEmitter.emit(); + lastExplosionTime = SDL_GetTicks64(); + + std::cerr << "GAME OVER: collision with stone on triangle " << collidedTriIdx << std::endl; + + if (collidedTriIdx >= 0 && collidedTriIdx < static_cast(planetObject.stonesToRender.size())) { + planetObject.stonesToRender[collidedTriIdx].data.PositionData.clear(); + planetObject.stonesToRender[collidedTriIdx].vao.reset(); + planetObject.stonesToRender[collidedTriIdx].positionVBO.reset(); + planetObject.stonesToRender[collidedTriIdx].normalVBO.reset(); + planetObject.stonesToRender[collidedTriIdx].tangentVBO.reset(); + planetObject.stonesToRender[collidedTriIdx].binormalVBO.reset(); + planetObject.stonesToRender[collidedTriIdx].colorVBO.reset(); + planetObject.stonesToRender[collidedTriIdx].texCoordVBO.reset(); + } + if (collidedTriIdx >= 0 && collidedTriIdx < static_cast(planetObject.planetStones.statuses.size())) { + planetObject.planetStones.statuses[collidedTriIdx] = ChunkStatus::Empty; + } + + menuManager.showGameOver(); + } + } + } + + // update velocity text + + if (shipAlive && !gameOver) { + auto velocityTv = menuManager.uiManager.findTextView("velocityText"); + if (velocityTv) { + std::string velocityStr = "Velocity: " + std::to_string(static_cast(Environment::shipState.velocity)); + menuManager.uiManager.setText("velocityText", velocityStr); + } + } + + } + + void Space::fireProjectiles() { + std::vector localOffsets = { + Vector3f{ -1.5f, 0.9f - 6.f, 5.0f }, + Vector3f{ 1.5f, 0.9f - 6.f, 5.0f } + }; + + const float projectileSpeed = 60.0f; + const float lifeMs = 5000.0f; + const float size = 0.5f; + + Vector3f localForward = { 0,0,-1 }; + Vector3f worldForward = (Environment::shipState.rotation * localForward).normalized(); + + for (const auto& lo : localOffsets) { + Vector3f worldPos = Environment::shipState.position + Environment::shipState.rotation * lo; + Vector3f worldVel = worldForward * (projectileSpeed + Environment::shipState.velocity); + + for (auto& p : projectiles) { + if (!p->isActive()) { + p->init(worldPos, worldVel, lifeMs, size, projectileTexture, renderer); + break; + } + } + } + } + + + void Space::update() { + if (networkClient) { + auto pending = networkClient->getPendingProjectiles(); + if (!pending.empty()) { + const float projectileSpeed = 60.0f; + const float lifeMs = 5000.0f; + const float size = 0.5f; + for (const auto& pi : pending) { + const std::vector localOffsets = { + Vector3f{ -1.5f, 0.9f, 5.0f }, + Vector3f{ 1.5f, 0.9f, 5.0f } + }; + + Vector3f localForward = { 0, 0, -1 }; + Vector3f worldForward = pi.rotation * localForward; + + float len = worldForward.norm(); + if (len <= 1e-6f) { + continue; + } + worldForward /= len; + + Vector3f baseVel = worldForward * pi.velocity; + + for (const auto& off : localOffsets) { + Vector3f shotPos = pi.position + (pi.rotation * off); + + for (auto& p : projectiles) { + if (!p->isActive()) { + p->init(shotPos, baseVel, lifeMs, size, projectileTexture, renderer); + break; + } + } + } + } + } + // Обработка событий смерти, присланных сервером + auto deaths = networkClient->getPendingDeaths(); + if (!deaths.empty()) { + int localId = networkClient->GetClientId(); + std::cout << "Client: Received " << deaths.size() << " death events" << std::endl; + + for (const auto& d : deaths) { + std::cout << "Client: Processing death - target=" << d.targetId + << ", killer=" << d.killerId << ", pos=(" + << d.position.x() << ", " << d.position.y() << ", " << d.position.z() << ")" << std::endl; + + showExplosion = true; + explosionEmitter.setUseWorldSpace(true); + explosionEmitter.setEmissionPoints(std::vector{ d.position }); + explosionEmitter.emit(); + lastExplosionTime = SDL_GetTicks64(); + std::cout << "Client: Explosion emitted at (" << d.position.x() << ", " + << d.position.y() << ", " << d.position.z() << ")" << std::endl; + + if (d.targetId == localId) { + std::cout << "Client: Local ship destroyed!" << std::endl; + shipAlive = false; + gameOver = true; + Environment::shipState.velocity = 0.0f; + menuManager.showGameOver(); + } + else { + deadRemotePlayers.insert(d.targetId); + std::cout << "Marked remote player " << d.targetId << " as dead" << std::endl; + } + } + } + + auto respawns = networkClient->getPendingRespawns(); + if (!respawns.empty()) { + for (const auto& respawnId : respawns) { + deadRemotePlayers.erase(respawnId); + + auto it = remotePlayerStates.find(respawnId); + if (it != remotePlayerStates.end()) { + it->second.position = Vector3f{ 0.f, 0.f, 45000.f }; + it->second.velocity = 0.0f; + it->second.rotation = Eigen::Matrix3f::Identity(); + } + + std::cout << "Client: Remote player " << respawnId << " respawned, removed from dead list" << std::endl; + } + } + + auto boxDestructions = networkClient->getPendingBoxDestructions(); + if (!boxDestructions.empty()) { + std::cout << "Game: Received " << boxDestructions.size() << " box destruction events" << std::endl; + + for (const auto& destruction : boxDestructions) { + int idx = destruction.boxIndex; + + if (idx >= 0 && idx < (int)boxCoordsArr.size()) { + if (boxAlive[idx]) { + boxAlive[idx] = false; + + boxRenderArr[idx].data.PositionData.clear(); + boxRenderArr[idx].vao.reset(); + boxRenderArr[idx].positionVBO.reset(); + boxRenderArr[idx].texCoordVBO.reset(); + + showExplosion = true; + explosionEmitter.setUseWorldSpace(true); + explosionEmitter.setEmissionPoints(std::vector{ destruction.position }); + explosionEmitter.emit(); + lastExplosionTime = SDL_GetTicks64(); + + std::cout << "Game: Box " << idx << " destroyed by player " + << destruction.destroyedBy << std::endl; + } + } + } + } + } + } + + void Space::handleDown(int mx, int my) + { + int uiX = mx; + int uiY = Environment::height - my; + + menuManager.uiManager.onMouseDown(uiX, uiY); + + bool uiHandled = false; + + for (const auto& button : menuManager.uiManager.findButton("") ? std::vector>{} : std::vector>{}) { + (void)button; + } + + auto pressedSlider = [&]() -> std::shared_ptr { + for (const auto& slider : menuManager.uiManager.findSlider("") ? std::vector>{} : std::vector>{}) { + (void)slider; + } + return nullptr; + }(); + + if (!menuManager.uiManager.isUiInteraction()) { + Environment::tapDownHold = true; + + Environment::tapDownStartPos(0) = mx; + Environment::tapDownStartPos(1) = my; + + Environment::tapDownCurrentPos(0) = mx; + Environment::tapDownCurrentPos(1) = my; + } + } + + void Space::handleUp(int mx, int my) + { + int uiX = mx; + int uiY = Environment::height - my; + + menuManager.uiManager.onMouseUp(uiX, uiY); + + if (!menuManager.uiManager.isUiInteraction()) { + Environment::tapDownHold = false; + } + } + + void Space::handleMotion(int mx, int my) + { + int uiX = mx; + int uiY = Environment::height - my; + + menuManager.uiManager.onMouseMove(uiX, uiY); + + if (Environment::tapDownHold && !menuManager.uiManager.isUiInteraction()) { + Environment::tapDownCurrentPos(0) = mx; + Environment::tapDownCurrentPos(1) = my; + } + } + + void Space::clearTextRendererCache() + { + if (textRenderer) { + textRenderer->ClearCache(); + } + } + + /* + std::string Space::formPingMessageContent() + { + Eigen::Quaternionf q(Environment::shipMatrix); + + std::string pingMsg = std::to_string(Environment::shipPosition.x()) + ":" + + std::to_string(Environment::shipPosition.y()) + ":" + + std::to_string(Environment::shipPosition.z()) + ":" + + std::to_string(q.w()) + ":" + + std::to_string(q.x()) + ":" + + std::to_string(q.y()) + ":" + + std::to_string(q.z()) + ":" + + std::to_string(Environment::currentAngularVelocity.x()) + ":" + + std::to_string(Environment::currentAngularVelocity.y()) + ":" + + std::to_string(Environment::currentAngularVelocity.z()) + ":" + + std::to_string(Environment::shipVelocity) + ":" + + std::to_string(Environment::shipSelectedVelocity) + ":" + + std::to_string(Environment::lastSentMagnitude) + ":" // Используем те же static переменные из блока ROT + + std::to_string(Environment::lastSentAngle); + + return pingMsg; + }*/ + + +} // namespace ZL diff --git a/src/Space.h b/src/Space.h index f0d56d1..993d3e4 100644 --- a/src/Space.h +++ b/src/Space.h @@ -27,31 +27,32 @@ namespace ZL { Matrix3f m; }; - /* + class Space { public: - Space(Renderer& iRenderer, TaskManager& iTaskManager, MainThreadHandler& iMainThreadHandler); + Space(Renderer& iRenderer, TaskManager& iTaskManager, MainThreadHandler& iMainThreadHandler, std::unique_ptr& iNetworkClient, MenuManager& iMenuManager); ~Space(); void setup(); void update(); - void render(); bool shouldExit() const { return Environment::exitGameLoop; } Renderer& renderer; TaskManager& taskManager; MainThreadHandler& mainThreadHandler; + std::unique_ptr& networkClient; + MenuManager& menuManager; - private: - int64_t getSyncTimeMs(); - void processTickCount(); + + public: + void processTickCount(int64_t newTickCount, int64_t delta); void drawScene(); void drawCubemap(float skyPercent); void drawShip(); void drawBoxes(); void drawBoxesLabels(); - void drawUI(); + //void drawUI(); void drawRemoteShips(); void drawRemoteShipsLabels(); void fireProjectiles(); @@ -62,13 +63,13 @@ namespace ZL { void handleUp(int mx, int my); void handleMotion(int mx, int my); - SDL_Window* window; - SDL_GLContext glContext; + //SDL_Window* window; + //SDL_GLContext glContext; - int64_t newTickCount; - int64_t lastTickCount; + //int64_t newTickCount; + //int64_t lastTickCount; std::vector boxCoordsArr; std::vector boxRenderArr; @@ -76,7 +77,6 @@ namespace ZL { std::vector boxLabels; std::unique_ptr textRenderer; - //std::unordered_map latestRemotePlayers; std::unordered_map remotePlayerStates; float newShipVelocity = 0; @@ -101,7 +101,7 @@ namespace ZL { SparkEmitter explosionEmitter; PlanetObject planetObject; - MenuManager menuManager; + //MenuManager menuManager; std::vector> projectiles; std::shared_ptr projectileTexture; @@ -116,7 +116,6 @@ namespace ZL { std::vector boxAlive; float shipCollisionRadius = 15.0f; float boxCollisionRadius = 2.0f; - //bool uiGameOverShown = false; bool showExplosion = false; uint64_t lastExplosionTime = 0; const uint64_t explosionDurationMs = 500; @@ -146,7 +145,9 @@ namespace ZL { bool projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const; void drawTargetHud(); // рисует рамку или стрелку int pickTargetId() const; // выбирает цель (пока: ближайший живой удаленный игрок) - };*/ + + void clearTextRendererCache(); + }; } // namespace ZL \ No newline at end of file From b59a10b7e6114bf839b47d59ad542aa81df0aec2 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 22 Feb 2026 19:50:13 +0300 Subject: [PATCH 14/17] Major refactoring for game menu --- proj-windows/CMakeLists.txt | 2 +- resources/config/main_menu.json | 17 ++++- src/Game.cpp | 129 ++++++++++++++++++++++++-------- src/Game.h | 3 + src/MenuManager.cpp | 16 ++-- src/MenuManager.h | 12 ++- src/Space.cpp | 50 +++---------- src/Space.h | 16 +--- 8 files changed, 142 insertions(+), 103 deletions(-) diff --git a/proj-windows/CMakeLists.txt b/proj-windows/CMakeLists.txt index 6210c4b..90e0f67 100644 --- a/proj-windows/CMakeLists.txt +++ b/proj-windows/CMakeLists.txt @@ -88,7 +88,7 @@ target_compile_definitions(space-game001 PRIVATE WIN32_LEAN_AND_MEAN PNG_ENABLED SDL_MAIN_HANDLED - #NETWORK + NETWORK # SIMPLIFIED ) diff --git a/resources/config/main_menu.json b/resources/config/main_menu.json index 9677e48..1807e74 100644 --- a/resources/config/main_menu.json +++ b/resources/config/main_menu.json @@ -96,11 +96,24 @@ }, { "type": "Button", - "name": "exitButton", + "name": "multiplayerButton2", "x": 409, "y": 218, "width": 382, "height": 56, + "textures": { + "normal": "resources/main_menu/multi.png", + "hover": "resources/main_menu/multi.png", + "pressed": "resources/main_menu/multi.png" + } + }, + { + "type": "Button", + "name": "exitButton", + "x": 409, + "y": 147, + "width": 382, + "height": 56, "textures": { "normal": "resources/main_menu/exit.png", "hover": "resources/main_menu/exit.png", @@ -111,7 +124,7 @@ "type": "Button", "name": "versionLabel", "x": 559.5, - "y": 170, + "y": 99, "width": 81, "height": 9, "textures": { diff --git a/src/Game.cpp b/src/Game.cpp index 743dc93..ceac9ca 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -21,10 +21,11 @@ #else #include "network/WebSocketClient.h" #endif -#else -#include "network/LocalClient.h" #endif +#include "network/LocalClient.h" + + namespace ZL { #ifdef EMSCRIPTEN @@ -34,12 +35,6 @@ namespace ZL const char* CONST_ZIP_FILE = ""; #endif - bool g_exitBgAnimating = false; - - bool firePressed = false; - - float x = 0; - Game::Game() : window(nullptr) , glContext(nullptr) @@ -88,21 +83,30 @@ namespace ZL #endif menuManager.setupMenu(); - renderer.InitOpenGL(); - space.setup(); + menuManager.onSingleplayerPressed = [this]() { + networkClient = std::make_unique(); + networkClient->Connect("", 0); + spaceGameStarted = 1; + }; + + + menuManager.onMultiplayerPressed = [this]() { #ifdef NETWORK #ifdef EMSCRIPTEN - networkClient = std::make_unique(); - networkClient->Connect("192.168.131.143", 8081); + networkClient = std::make_unique(); + networkClient->Connect("192.168.131.143", 8081); #else - networkClient = std::make_unique(taskManager.getIOContext()); - networkClient->Connect("127.0.0.1", 8081); + networkClient = std::make_unique(taskManager.getIOContext()); + networkClient->Connect("127.0.0.1", 8081); #endif -#else - networkClient = std::make_unique(); - networkClient->Connect("", 0); #endif + lastTickCount = 0; + spaceGameStarted = 1; + }; + + renderer.InitOpenGL(); + space.setup(); } @@ -131,9 +135,21 @@ namespace ZL CheckGlError(); } - void Game::drawScene() { + void Game::drawUnderMainMenu() + { + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - space.drawScene(); + } + + void Game::drawScene() { + if (spaceGameStarted) { + space.drawScene(); + } + else + { + drawUnderMainMenu(); + } drawUI(); CheckGlError(); } @@ -142,7 +158,14 @@ namespace ZL int64_t localNow = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); // Добавляем смещение, полученное от сервера - return localNow + networkClient->getTimeOffset(); // Нужно добавить геттер в интерфейс + if (networkClient) + { + return localNow + networkClient->getTimeOffset(); + } + else + { + return localNow; + } } void Game::processTickCount() { @@ -167,8 +190,9 @@ namespace ZL //throw std::runtime_error("Synchronization is lost"); } - space.processTickCount(newTickCount, delta); - + if (spaceGameStarted) { + space.processTickCount(newTickCount, delta); + } menuManager.uiManager.update(static_cast(delta)); lastTickCount = newTickCount; } @@ -268,14 +292,8 @@ namespace ZL } if (event.type == SDL_KEYUP) { - if (event.key.keysym.sym == SDLK_i) { - x = x + 1; - } - if (event.key.keysym.sym == SDLK_k) { - x = x - 1; - } if (event.key.keysym.sym == SDLK_a) { - Environment::shipState.position = { 9466.15820, 1046.00159, 18531.2090 }; + //Environment::shipState.position = { 9466.15820, 1046.00159, 18531.2090 }; } } #endif @@ -293,22 +311,67 @@ namespace ZL } mainThreadHandler.processMainThreadTasks(); - space.update(); + if (spaceGameStarted) { + space.update(); + } } void Game::handleDown(int mx, int my) { - space.handleDown(mx, my); + int uiX = mx; + int uiY = Environment::height - my; + + menuManager.uiManager.onMouseDown(uiX, uiY); + + bool uiHandled = false; + + for (const auto& button : menuManager.uiManager.findButton("") ? std::vector>{} : std::vector>{}) { + (void)button; + } + + auto pressedSlider = [&]() -> std::shared_ptr { + for (const auto& slider : menuManager.uiManager.findSlider("") ? std::vector>{} : std::vector>{}) { + (void)slider; + } + return nullptr; + }(); + + if (!menuManager.uiManager.isUiInteraction()) { + if (spaceGameStarted) { + space.handleDown(mx, my); + } + } + } void Game::handleUp(int mx, int my) { - space.handleUp(mx, my); + int uiX = mx; + int uiY = Environment::height - my; + + menuManager.uiManager.onMouseUp(uiX, uiY); + + if (!menuManager.uiManager.isUiInteraction()) { + if (spaceGameStarted) { + space.handleUp(mx, my); + } + } + } void Game::handleMotion(int mx, int my) { - space.handleMotion(mx, my); + int uiX = mx; + int uiY = Environment::height - my; + + menuManager.uiManager.onMouseMove(uiX, uiY); + + if (!menuManager.uiManager.isUiInteraction()) { + if (spaceGameStarted) { + space.handleMotion(mx, my); + } + } + } diff --git a/src/Game.h b/src/Game.h index 057eb17..a37ef82 100644 --- a/src/Game.h +++ b/src/Game.h @@ -41,6 +41,7 @@ namespace ZL { void processTickCount(); void drawScene(); void drawUI(); + void drawUnderMainMenu(); void handleDown(int mx, int my); void handleUp(int mx, int my); void handleMotion(int mx, int my); @@ -56,6 +57,8 @@ namespace ZL { MenuManager menuManager; Space space; + + int spaceGameStarted = 0; }; diff --git a/src/MenuManager.cpp b/src/MenuManager.cpp index af0bcfd..e14bd56 100644 --- a/src/MenuManager.cpp +++ b/src/MenuManager.cpp @@ -55,7 +55,7 @@ namespace ZL { } }); - uiManager.setAnimationCallback("exitButton", "bgScroll", []() { + uiManager.setAnimationCallback("exitButton", "bgScroll", [this]() { std::cerr << "Exit button bgScroll animation finished" << std::endl; g_exitBgAnimating = false; }); @@ -96,10 +96,10 @@ namespace ZL { }); uiManager.setButtonCallback("shootButton", [this](const std::string& name) { - firePressed = true; + onFirePressed(); }); uiManager.setButtonCallback("shootButton2", [this](const std::string& name) { - firePressed = true; + onFirePressed(); }); uiManager.setSliderCallback("velocitySlider", [this](const std::string& name, float value) { int newVel = roundf(value * 10); @@ -114,16 +114,18 @@ namespace ZL { }); }; - uiManager.setButtonCallback("singleButton", [loadGameplayUI](const std::string& name) { + uiManager.setButtonCallback("singleButton", [loadGameplayUI, this](const std::string& name) { std::cerr << "Single button pressed: " << name << " -> load gameplay UI\n"; loadGameplayUI(); + onSingleplayerPressed(); }); - /*uiManager.setButtonCallback("multiplayerButton", [loadGameplayUI](const std::string& name) { + uiManager.setButtonCallback("multiplayerButton", [loadGameplayUI, this](const std::string& name) { std::cerr << "Multiplayer button pressed: " << name << " -> load gameplay UI\n"; loadGameplayUI(); - });*/ + onMultiplayerPressed(); + }); - uiManager.setButtonCallback("multiplayerButton", [this](const std::string& name) { + uiManager.setButtonCallback("multiplayerButton2", [this](const std::string& name) { std::cerr << "Multiplayer button pressed → opening multiplayer menu\n"; uiManager.startAnimationOnNode("playButton", "buttonsExit"); diff --git a/src/MenuManager.h b/src/MenuManager.h index 9ec0296..7ad6d87 100644 --- a/src/MenuManager.h +++ b/src/MenuManager.h @@ -7,21 +7,21 @@ namespace ZL { extern const char* CONST_ZIP_FILE; - extern bool g_exitBgAnimating; - extern bool firePressed; + //extern bool g_exitBgAnimating; class MenuManager { protected: Renderer& renderer; - bool uiGameOverShown = false; - std::shared_ptr uiSavedRoot; std::shared_ptr gameOverSavedRoot; std::shared_ptr settingsSavedRoot; std::shared_ptr multiplayerSavedRoot; public: + bool uiGameOverShown = false; + bool g_exitBgAnimating = false; + UiManager uiManager; MenuManager(Renderer& iRenderer); @@ -32,6 +32,10 @@ namespace ZL { std::function onRestartPressed; std::function onVelocityChanged; + std::function onFirePressed; + + std::function onSingleplayerPressed; + std::function onMultiplayerPressed; }; }; diff --git a/src/Space.cpp b/src/Space.cpp index 073b1d5..f69e7d0 100644 --- a/src/Space.cpp +++ b/src/Space.cpp @@ -30,10 +30,6 @@ namespace ZL extern const char* CONST_ZIP_FILE; - extern bool g_exitBgAnimating; - - extern bool firePressed; - extern float x; Eigen::Quaternionf generateRandomQuaternion(std::mt19937& gen) @@ -145,7 +141,7 @@ namespace ZL return P; } - bool Space::worldToScreen(const Vector3f& world, float& outX, float& outY, float& outDepth) const + bool worldToScreen(const Vector3f& world, float& outX, float& outY, float& outDepth) { // Матрицы должны совпасть с drawBoxes/drawShip по смыслу float aspect = static_cast(Environment::width) / static_cast(Environment::height); @@ -176,7 +172,7 @@ namespace ZL return true; } - bool Space::projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const + bool projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) { float aspect = static_cast(Environment::width) / static_cast(Environment::height); Eigen::Matrix4f V = makeViewMatrix_FromYourCamera(); @@ -278,6 +274,10 @@ namespace ZL newShipVelocity = newVelocity; }; + menuManager.onFirePressed = [this]() { + firePressed = true; + }; + bool cfgLoaded = sparkEmitter.loadFromJsonFile("resources/config/spark_config.json", renderer, CONST_ZIP_FILE); bool projCfgLoaded = projectileEmitter.loadFromJsonFile("resources/config/spark_projectile_config.json", renderer, CONST_ZIP_FILE); bool explosionCfgLoaded = explosionEmitter.loadFromJsonFile("resources/config/explosion_config.json", renderer, CONST_ZIP_FILE); @@ -566,7 +566,6 @@ namespace ZL drawBoxesLabels(); drawShip(); - //drawUI(); drawTargetHud(); CheckGlError(); } @@ -1394,25 +1393,6 @@ namespace ZL void Space::handleDown(int mx, int my) { - int uiX = mx; - int uiY = Environment::height - my; - - menuManager.uiManager.onMouseDown(uiX, uiY); - - bool uiHandled = false; - - for (const auto& button : menuManager.uiManager.findButton("") ? std::vector>{} : std::vector>{}) { - (void)button; - } - - auto pressedSlider = [&]() -> std::shared_ptr { - for (const auto& slider : menuManager.uiManager.findSlider("") ? std::vector>{} : std::vector>{}) { - (void)slider; - } - return nullptr; - }(); - - if (!menuManager.uiManager.isUiInteraction()) { Environment::tapDownHold = true; Environment::tapDownStartPos(0) = mx; @@ -1420,29 +1400,17 @@ namespace ZL Environment::tapDownCurrentPos(0) = mx; Environment::tapDownCurrentPos(1) = my; - } } void Space::handleUp(int mx, int my) { - int uiX = mx; - int uiY = Environment::height - my; - - menuManager.uiManager.onMouseUp(uiX, uiY); - - if (!menuManager.uiManager.isUiInteraction()) { - Environment::tapDownHold = false; - } + Environment::tapDownHold = false; + } void Space::handleMotion(int mx, int my) { - int uiX = mx; - int uiY = Environment::height - my; - - menuManager.uiManager.onMouseMove(uiX, uiY); - - if (Environment::tapDownHold && !menuManager.uiManager.isUiInteraction()) { + if (Environment::tapDownHold) { Environment::tapDownCurrentPos(0) = mx; Environment::tapDownCurrentPos(1) = my; } diff --git a/src/Space.h b/src/Space.h index 993d3e4..b1f8fed 100644 --- a/src/Space.h +++ b/src/Space.h @@ -36,8 +36,6 @@ namespace ZL { void setup(); void update(); - bool shouldExit() const { return Environment::exitGameLoop; } - Renderer& renderer; TaskManager& taskManager; MainThreadHandler& mainThreadHandler; @@ -52,24 +50,14 @@ namespace ZL { void drawShip(); void drawBoxes(); void drawBoxesLabels(); - //void drawUI(); void drawRemoteShips(); void drawRemoteShipsLabels(); void fireProjectiles(); - bool worldToScreen(const Vector3f& world, float& outX, float& outY, float& outDepth) const; - void handleDown(int mx, int my); void handleUp(int mx, int my); void handleMotion(int mx, int my); - //SDL_Window* window; - //SDL_GLContext glContext; - - - - //int64_t newTickCount; - //int64_t lastTickCount; std::vector boxCoordsArr; std::vector boxRenderArr; @@ -101,8 +89,6 @@ namespace ZL { SparkEmitter explosionEmitter; PlanetObject planetObject; - //MenuManager menuManager; - std::vector> projectiles; std::shared_ptr projectileTexture; float projectileCooldownMs = 500.0f; @@ -113,6 +99,7 @@ namespace ZL { bool shipAlive = true; bool gameOver = false; + bool firePressed = false; std::vector boxAlive; float shipCollisionRadius = 15.0f; float boxCollisionRadius = 2.0f; @@ -142,7 +129,6 @@ namespace ZL { VertexRenderStruct hudTempMesh; // helpers - bool projectToNDC(const Vector3f& world, float& ndcX, float& ndcY, float& ndcZ, float& clipW) const; void drawTargetHud(); // рисует рамку или стрелку int pickTargetId() const; // выбирает цель (пока: ближайший живой удаленный игрок) From d883b582609d9370161d65637b7d25c1c77bf91f Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 22 Feb 2026 20:04:18 +0300 Subject: [PATCH 15/17] Adapt for web --- proj-web/CMakeLists.txt | 4 ++++ resources/gameover.png | 4 ++-- src/Game.cpp | 4 ++-- src/network/WebSocketClientEmscripten.cpp | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/proj-web/CMakeLists.txt b/proj-web/CMakeLists.txt index fd91bc4..e41f118 100644 --- a/proj-web/CMakeLists.txt +++ b/proj-web/CMakeLists.txt @@ -71,6 +71,10 @@ set(SOURCES ../src/network/WebSocketClientEmscripten.cpp ../src/render/TextRenderer.h ../src/render/TextRenderer.cpp + ../src/MenuManager.h + ../src/MenuManager.cpp + ../src/Space.h + ../src/Space.cpp ) add_executable(space-game001 ${SOURCES}) diff --git a/resources/gameover.png b/resources/gameover.png index fa508ac..6927e24 100644 --- a/resources/gameover.png +++ b/resources/gameover.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8298e2d01c6e7a78a2b4983ad5cab42c6ca145979e5dc516f38fb5b72c5be84 -size 9165 +oid sha256:0c3766bd1c76bf888d4d75b949c4949a18e1bfddda04bc868b60fb04ed7046ea +size 21790 diff --git a/src/Game.cpp b/src/Game.cpp index ceac9ca..8cb8f5e 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -95,10 +95,10 @@ namespace ZL #ifdef NETWORK #ifdef EMSCRIPTEN networkClient = std::make_unique(); - networkClient->Connect("192.168.131.143", 8081); + networkClient->Connect("localhost", 8081); #else networkClient = std::make_unique(taskManager.getIOContext()); - networkClient->Connect("127.0.0.1", 8081); + networkClient->Connect("localhost", 8081); #endif #endif lastTickCount = 0; diff --git a/src/network/WebSocketClientEmscripten.cpp b/src/network/WebSocketClientEmscripten.cpp index 98044e9..9534cf0 100644 --- a/src/network/WebSocketClientEmscripten.cpp +++ b/src/network/WebSocketClientEmscripten.cpp @@ -7,8 +7,8 @@ namespace ZL { void WebSocketClientEmscripten::Connect(const std::string& host, uint16_t port) { // Формируем URL. Обратите внимание, что в Web часто лучше использовать ws://localhost - //std::string url = "ws://" + host + ":" + std::to_string(port); - std::string url = "wss://api.spacegame.fishrungames.com"; + std::string url = "ws://" + host + ":" + std::to_string(port); + //std::string url = "wss://api.spacegame.fishrungames.com"; EmscriptenWebSocketCreateAttributes attr = { url.c_str(), From f6cc30a30c1af3b56f19b6be41ffdd2ecc22f594 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 22 Feb 2026 21:20:39 +0300 Subject: [PATCH 16/17] Try out Cursor --- src/network/WebSocketClient.cpp | 91 ++++++++++++----------------- src/network/WebSocketClient.h | 39 +++++++++---- src/network/WebSocketClientBase.cpp | 51 +++++----------- src/network/WebSocketClientBase.h | 23 ++------ 4 files changed, 85 insertions(+), 119 deletions(-) diff --git a/src/network/WebSocketClient.cpp b/src/network/WebSocketClient.cpp index b661890..bdf0232 100644 --- a/src/network/WebSocketClient.cpp +++ b/src/network/WebSocketClient.cpp @@ -1,4 +1,4 @@ -#ifdef NETWORK +#ifdef NETWORK #include "WebSocketClient.h" #include @@ -43,34 +43,22 @@ namespace ZL { } void WebSocketClient::processIncomingMessage(const std::string& msg) { - // Логика парсинга... - /*if (msg.rfind("ID:", 0) == 0) { - clientId = std::stoi(msg.substr(3)); - }*/ - - // Безопасно кладем в очередь для главного потока - std::lock_guard lock(queueMutex); - messageQueue.push(msg); + // Lock-free push: producer (I/O thread) pushes to its buffer + readProducerBuf_.load(std::memory_order_relaxed)->push_back(msg); } void WebSocketClient::Poll() { - std::lock_guard lock(queueMutex); - - while (!messageQueue.empty()) { - /* - auto nowTime = std::chrono::system_clock::now(); - - //Apply server delay: - nowTime -= std::chrono::milliseconds(CLIENT_DELAY); - - auto now_ms = std::chrono::duration_cast( - nowTime.time_since_epoch() - ).count();*/ - std::string msg = messageQueue.front(); - messageQueue.pop(); - + // Lock-free drain: swap consumer buffer with producer if ours is empty, then process all + MessageBuf* c = readConsumerBuf_.load(std::memory_order_acquire); + if (c->empty()) { + MessageBuf* p = readProducerBuf_.exchange(c, std::memory_order_acq_rel); + readConsumerBuf_.store(p, std::memory_order_release); + c = p; + } + for (std::string& msg : *c) { HandlePollMessage(msg); } + c->clear(); } @@ -79,54 +67,49 @@ namespace ZL { if (!connected) return; std::string finalMessage = SignMessage(message); - /* -#ifdef ENABLE_NETWORK_CHECKSUM - // Вычисляем хеш. Для примера используем std::hash, - // но в продакшене лучше взять быструю реализацию типа MurmurHash3. - size_t hashValue = std::hash{}(message + NET_SECRET); + auto ss = std::make_shared(std::move(finalMessage)); - // Преобразуем хеш в hex-строку для передачи - std::stringstream ss_hash; - ss_hash << std::hex << hashValue; + // Lock-free push to write queue + writeProducerBuf_.load(std::memory_order_relaxed)->push_back(ss); - // Добавляем хеш в конец сообщения через разделитель - // Например: "UPD:12345:pos...#hash:a1b2c3d4" - finalMessage += "#hash:" + ss_hash.str(); -#endif -*/ - auto ss = std::make_shared(finalMessage); - - std::lock_guard lock(writeMutex_); - writeQueue_.push(ss); - - // Если сейчас ничего не записывается, инициируем первую запись - if (!isWriting_) { + // Start write chain if not already writing + bool expected = false; + if (isWriting_.compare_exchange_strong(expected, true, std::memory_order_acq_rel)) { doWrite(); } } void WebSocketClient::doWrite() { - // Эта функция всегда вызывается под мьютексом или из колбэка - if (writeQueue_.empty()) { - isWriting_ = false; + // Lock-free: take next message from consumer buffer; swap buffers if drained + WriteBuf* c = writeConsumerBuf_.load(std::memory_order_acquire); + if (currentWriteBuf_ == nullptr || currentWriteIndex_ >= currentWriteBuf_->size()) { + if (currentWriteBuf_) { + currentWriteBuf_->clear(); + } + currentWriteBuf_ = c; + if (currentWriteBuf_->empty()) { + WriteBuf* p = writeProducerBuf_.exchange(currentWriteBuf_, std::memory_order_acq_rel); + writeConsumerBuf_.store(p, std::memory_order_release); + currentWriteBuf_ = p; + } + currentWriteIndex_ = 0; + } + if (currentWriteIndex_ >= currentWriteBuf_->size()) { + isWriting_.store(false, std::memory_order_release); return; } - isWriting_ = true; - auto message = writeQueue_.front(); + std::shared_ptr message = (*currentWriteBuf_)[currentWriteIndex_++]; - // Захватываем self (shared_from_this), чтобы объект не удалился во время записи ws_->async_write( boost::asio::buffer(*message), [this, message](boost::beast::error_code ec, std::size_t) { if (ec) { connected = false; + isWriting_.store(false, std::memory_order_release); return; } - - std::lock_guard lock(writeMutex_); - writeQueue_.pop(); // Удаляем отправленное сообщение - doWrite(); // Проверяем следующее + doWrite(); } ); } diff --git a/src/network/WebSocketClient.h b/src/network/WebSocketClient.h index 23a03c1..5ccb45c 100644 --- a/src/network/WebSocketClient.h +++ b/src/network/WebSocketClient.h @@ -1,9 +1,11 @@ -#pragma once +#pragma once #ifdef NETWORK #include "WebSocketClientBase.h" -#include +#include +#include +#include #include #include #include @@ -11,21 +13,30 @@ namespace ZL { + // Lock-free SPSC double-buffer: producer pushes to one buffer, consumer swaps and drains the other. + // No mutexes; avoids contention under high message load. class WebSocketClient : public WebSocketClientBase { private: - // Переиспользуем io_context из TaskManager boost::asio::io_context& ioc_; - - // Объекты переехали в члены класса std::unique_ptr> ws_; boost::beast::flat_buffer buffer_; - std::queue messageQueue; - std::mutex queueMutex; // Защита для messageQueue + // Incoming messages: I/O thread pushes, main thread drains in Poll() + using MessageBuf = std::vector; + MessageBuf readBuffer0_; + MessageBuf readBuffer1_; + std::atomic readProducerBuf_; + std::atomic readConsumerBuf_; - std::queue> writeQueue_; - bool isWriting_ = false; - std::mutex writeMutex_; // Отдельный мьютекс для очереди записи + // Outgoing messages: main thread pushes in Send(), doWrite()/completion drains + using WriteBuf = std::vector>; + WriteBuf writeBuffer0_; + WriteBuf writeBuffer1_; + std::atomic writeProducerBuf_; + std::atomic writeConsumerBuf_; + WriteBuf* currentWriteBuf_ = nullptr; + size_t currentWriteIndex_ = 0; + std::atomic isWriting_{ false }; bool connected = false; @@ -34,7 +45,13 @@ namespace ZL { void processIncomingMessage(const std::string& msg); public: - explicit WebSocketClient(boost::asio::io_context& ioc) : ioc_(ioc) {} + explicit WebSocketClient(boost::asio::io_context& ioc) + : ioc_(ioc) + , readProducerBuf_(&readBuffer0_) + , readConsumerBuf_(&readBuffer1_) + , writeProducerBuf_(&writeBuffer0_) + , writeConsumerBuf_(&writeBuffer1_) + {} void Connect(const std::string& host, uint16_t port) override; diff --git a/src/network/WebSocketClientBase.cpp b/src/network/WebSocketClientBase.cpp index de4f03b..48b99f2 100644 --- a/src/network/WebSocketClientBase.cpp +++ b/src/network/WebSocketClientBase.cpp @@ -1,4 +1,4 @@ -#ifdef NETWORK +#ifdef NETWORK #include "WebSocketClientBase.h" #include @@ -70,10 +70,7 @@ namespace ZL { } } } - { - std::lock_guard bLock(boxesMutex); - serverBoxes_ = std::move(parsedBoxes); - } + serverBoxes_ = std::move(parsedBoxes); return; } if (msg.rfind("RESPAWN_ACK:", 0) == 0) { @@ -81,14 +78,8 @@ namespace ZL { if (parts.size() >= 2) { try { int respawnedPlayerId = std::stoi(parts[1]); - { - std::lock_guard rLock(respawnMutex_); - pendingRespawns_.push_back(respawnedPlayerId); - } - { - std::lock_guard pLock(playersMutex); - remotePlayers.erase(respawnedPlayerId); - } + pendingRespawns_.push_back(respawnedPlayerId); + remotePlayers.erase(respawnedPlayerId); std::cout << "Client: Received RESPAWN_ACK for player " << respawnedPlayerId << std::endl; } catch (...) {} @@ -110,10 +101,7 @@ namespace ZL { ); destruction.destroyedBy = std::stoi(parts[6]); - { - std::lock_guard lock(boxDestructionsMutex_); - pendingBoxDestructions_.push_back(destruction); - } + pendingBoxDestructions_.push_back(destruction); std::cout << "Client: Received BOX_DESTROYED for box " << destruction.boxIndex << " destroyed by player " << destruction.destroyedBy << std::endl; @@ -146,7 +134,6 @@ namespace ZL { pi.rotation = q.toRotationMatrix(); pi.velocity = std::stof(parts[10]); - std::lock_guard pl(projMutex_); pendingProjectiles_.push_back(pi); } catch (...) {} @@ -168,7 +155,6 @@ namespace ZL { ); di.killerId = std::stoi(parts[6]); - std::lock_guard dl(deathsMutex_); pendingDeaths_.push_back(di); } catch (...) {} @@ -215,9 +201,7 @@ namespace ZL { } { - std::lock_guard pLock(playersMutex); auto& rp = remotePlayers[remoteId]; - rp.add_state(remoteState); } } @@ -243,10 +227,7 @@ namespace ZL { // Используем твой handle_full_sync, начиная со 2-го индекса (пропускаем ID в playerParts) remoteState.handle_full_sync(playerParts, 1); - { - std::lock_guard pLock(playersMutex); - remotePlayers[rId].add_state(remoteState); - } + remotePlayers[rId].add_state(remoteState); } } } @@ -263,30 +244,26 @@ namespace ZL { } std::vector WebSocketClientBase::getPendingProjectiles() { - std::lock_guard lock(projMutex_); - auto copy = pendingProjectiles_; - pendingProjectiles_.clear(); + std::vector copy; + copy.swap(pendingProjectiles_); return copy; } std::vector WebSocketClientBase::getPendingDeaths() { - std::lock_guard lock(deathsMutex_); - auto copy = pendingDeaths_; - pendingDeaths_.clear(); + std::vector copy; + copy.swap(pendingDeaths_); return copy; } std::vector WebSocketClientBase::getPendingRespawns() { - std::lock_guard lock(respawnMutex_); - auto copy = pendingRespawns_; - pendingRespawns_.clear(); + std::vector copy; + copy.swap(pendingRespawns_); return copy; } std::vector WebSocketClientBase::getPendingBoxDestructions() { - std::lock_guard lock(boxDestructionsMutex_); - auto copy = pendingBoxDestructions_; - pendingBoxDestructions_.clear(); + std::vector copy; + copy.swap(pendingBoxDestructions_); return copy; } } diff --git a/src/network/WebSocketClientBase.h b/src/network/WebSocketClientBase.h index 75480c1..1ca30cb 100644 --- a/src/network/WebSocketClientBase.h +++ b/src/network/WebSocketClientBase.h @@ -1,34 +1,25 @@ -#pragma once +#pragma once #include "NetworkInterface.h" -#include -#include +#include +#include namespace ZL { - + // All state in WebSocketClientBase is only accessed from the main thread: + // HandlePollMessage() runs from Poll(), and get*() are called from Game/Space on the main thread. + // No mutexes needed. class WebSocketClientBase : public INetworkClient { protected: - - std::unordered_map remotePlayers; - std::mutex playersMutex; // Серверные коробки std::vector> serverBoxes_; - std::mutex boxesMutex; std::vector pendingProjectiles_; - std::mutex projMutex_; - std::vector pendingDeaths_; - std::mutex deathsMutex_; - std::vector pendingRespawns_; - std::mutex respawnMutex_; - std::vector pendingBoxDestructions_; - std::mutex boxDestructionsMutex_; int clientId = -1; int64_t timeOffset = 0; @@ -42,12 +33,10 @@ namespace ZL { std::string SignMessage(const std::string& msg); std::unordered_map getRemotePlayers() override { - std::lock_guard lock(playersMutex); return remotePlayers; } std::vector> getServerBoxes() override { - std::lock_guard lock(boxesMutex); return serverBoxes_; } From 84006380db6aed8b9d88e8f13efc4130d59e1407 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Mon, 23 Feb 2026 09:55:01 +0300 Subject: [PATCH 17/17] Added loading screen --- resources/loading.png | 3 ++ src/Game.cpp | 84 +++++++++++++++++++++++++++++++++++++------ src/Game.h | 8 +++++ 3 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 resources/loading.png diff --git a/resources/loading.png b/resources/loading.png new file mode 100644 index 0000000..76fa26a --- /dev/null +++ b/resources/loading.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb69fc16814ff0db507965e95df225f1316917b802998e8517242b8ef534e3ea +size 5861 diff --git a/src/Game.cpp b/src/Game.cpp index 8cb8f5e..d6c28c0 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -60,10 +60,31 @@ namespace ZL ZL::BindOpenGlFunctions(); ZL::CheckGlError(); + renderer.InitOpenGL(); #ifdef EMSCRIPTEN renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_web.fragment", CONST_ZIP_FILE); + +#else + renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE); +#endif + + loadingTexture = std::make_unique(CreateTextureDataFromPng("resources/loading.png", CONST_ZIP_FILE)); + loadingMesh.data = CreateRect2D({ Environment::width * 0.5, Environment::height * 0.5 }, { Environment::width * 0.5, Environment::height*0.5 }, 3); + loadingMesh.RefreshVBO(); + + mainThreadHandler.EnqueueMainThreadTask([this]() { + this->setupPart2(); + }); + } + + + void Game::setupPart2() + { + +#ifdef EMSCRIPTEN renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/env_sky.vertex", "resources/shaders/env_sky_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "resources/shaders/defaultAtmosphere.vertex", "resources/shaders/defaultAtmosphere_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetBake", "resources/shaders/planet_bake.vertex", "resources/shaders/planet_bake_web.fragment", CONST_ZIP_FILE); @@ -72,8 +93,6 @@ namespace ZL renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_web.fragment", CONST_ZIP_FILE); #else - renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/env_sky.vertex", "resources/shaders/env_sky_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "resources/shaders/defaultAtmosphere.vertex", "resources/shaders/defaultAtmosphere_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetBake", "resources/shaders/planet_bake.vertex", "resources/shaders/planet_bake_desktop.fragment", CONST_ZIP_FILE); @@ -88,7 +107,7 @@ namespace ZL networkClient = std::make_unique(); networkClient->Connect("", 0); spaceGameStarted = 1; - }; + }; menuManager.onMultiplayerPressed = [this]() { @@ -105,10 +124,11 @@ namespace ZL spaceGameStarted = 1; }; - renderer.InitOpenGL(); - space.setup(); - } + space.setup(); + + loadingCompleted = true; + } void Game::drawUI() @@ -143,14 +163,58 @@ namespace ZL } void Game::drawScene() { - if (spaceGameStarted) { - space.drawScene(); + if (!loadingCompleted) { + drawLoading(); } else { - drawUnderMainMenu(); + + if (spaceGameStarted) { + space.drawScene(); + } + else + { + drawUnderMainMenu(); + } + drawUI(); } - drawUI(); + CheckGlError(); + } + + void Game::drawLoading() + { + static const std::string defaultShaderName = "default"; + static const std::string vPositionName = "vPosition"; + static const std::string vTexCoordName = "vTexCoord"; + static const std::string textureUniformName = "Texture"; + + glClear(GL_DEPTH_BUFFER_BIT); + + renderer.shaderManager.PushShader(defaultShaderName); + renderer.RenderUniform1i(textureUniformName, 0); + renderer.EnableVertexAttribArray(vPositionName); + renderer.EnableVertexAttribArray(vTexCoordName); + + float width = Environment::width; + float height = Environment::height; + + renderer.PushProjectionMatrix( + 0, width, + 0, height, + -10, 10); + + renderer.PushMatrix(); + renderer.LoadIdentity(); + + glBindTexture(GL_TEXTURE_2D, loadingTexture->getTexID()); + renderer.DrawVertexRenderStruct(loadingMesh); + + renderer.PopMatrix(); + renderer.PopProjectionMatrix(); + + renderer.DisableVertexAttribArray(vPositionName); + renderer.DisableVertexAttribArray(vTexCoordName); + renderer.shaderManager.PopShader(); CheckGlError(); } diff --git a/src/Game.h b/src/Game.h index a37ef82..6e0da91 100644 --- a/src/Game.h +++ b/src/Game.h @@ -27,6 +27,7 @@ namespace ZL { ~Game(); void setup(); + void setupPart2(); void update(); void render(); @@ -36,12 +37,19 @@ namespace ZL { TaskManager taskManager; MainThreadHandler mainThreadHandler; std::unique_ptr networkClient; + + + std::shared_ptr loadingTexture; + VertexRenderStruct loadingMesh; + bool loadingCompleted = false; + private: int64_t getSyncTimeMs(); void processTickCount(); void drawScene(); void drawUI(); void drawUnderMainMenu(); + void drawLoading(); void handleDown(int mx, int my); void handleUp(int mx, int my); void handleMotion(int mx, int my);