Merge "DO NOT MERGE Remove graphics.cpp and friends" into oc-dev
am: c4a3020c4d
Change-Id: I4bc2e9c9cc528e9fe35741516065b5ea46179bfe
diff --git a/libs/vr/libdisplay/Android.bp b/libs/vr/libdisplay/Android.bp
index 41baef8..d90521a 100644
--- a/libs/vr/libdisplay/Android.bp
+++ b/libs/vr/libdisplay/Android.bp
@@ -13,15 +13,9 @@
// limitations under the License.
sourceFiles = [
- "native_buffer_queue.cpp",
"display_client.cpp",
"display_manager_client.cpp",
"display_protocol.cpp",
- "dummy_native_window.cpp",
- "frame_history.cpp",
- "gl_fenced_flush.cpp",
- "graphics.cpp",
- "late_latch.cpp",
"vsync_client.cpp",
]
@@ -34,9 +28,6 @@
"libcutils",
"liblog",
"libutils",
- "libEGL",
- "libGLESv2",
- "libvulkan",
"libui",
"libgui",
"libhardware",
@@ -45,10 +36,9 @@
]
staticLibraries = [
- "libbufferhub",
- "libbufferhubqueue",
"libdvrcommon",
- "libdvrgraphics",
+ "libbufferhubqueue",
+ "libbufferhub",
"libvrsensor",
"libpdx_default_transport",
]
@@ -74,27 +64,3 @@
name: "libdisplay",
}
-
-graphicsAppTestFiles = ["tests/graphics_app_tests.cpp"]
-
-cc_test {
- name: "graphics_app_tests",
- tags: ["optional"],
-
- srcs: graphicsAppTestFiles,
-
- shared_libs: sharedLibraries,
-
- static_libs: ["libdisplay"] + staticLibraries,
-}
-
-dummyNativeWindowTestFiles = ["tests/dummy_native_window_tests.cpp"]
-
-cc_test {
- name: "dummy_native_window_tests",
- tags: [ "optional" ],
- srcs: dummyNativeWindowTestFiles,
- shared_libs: sharedLibraries,
- static_libs: [ "libdisplay" ] + staticLibraries,
-}
-
diff --git a/libs/vr/libdisplay/display_client.cpp b/libs/vr/libdisplay/display_client.cpp
index 5c9ebd4..935ca2e 100644
--- a/libs/vr/libdisplay/display_client.cpp
+++ b/libs/vr/libdisplay/display_client.cpp
@@ -9,7 +9,6 @@
#include <mutex>
#include <private/dvr/display_protocol.h>
-#include <private/dvr/late_latch.h>
#include <private/dvr/native_buffer.h>
using android::pdx::ErrorStatus;
diff --git a/libs/vr/libdisplay/dummy_native_window.cpp b/libs/vr/libdisplay/dummy_native_window.cpp
deleted file mode 100644
index 4628b8e..0000000
--- a/libs/vr/libdisplay/dummy_native_window.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#include "include/private/dvr/dummy_native_window.h"
-
-#include <utils/Errors.h>
-
-namespace {
-// Dummy functions required for an ANativeWindow Implementation.
-int F1(struct ANativeWindow*, int) { return 0; }
-int F2(struct ANativeWindow*, struct ANativeWindowBuffer**) { return 0; }
-int F3(struct ANativeWindow*, struct ANativeWindowBuffer*) { return 0; }
-int F4(struct ANativeWindow*, struct ANativeWindowBuffer**, int*) { return 0; }
-int F5(struct ANativeWindow*, struct ANativeWindowBuffer*, int) { return 0; }
-} // anonymous namespace
-
-namespace android {
-namespace dvr {
-
-DummyNativeWindow::DummyNativeWindow() {
- ANativeWindow::setSwapInterval = F1;
- ANativeWindow::dequeueBuffer = F4;
- ANativeWindow::cancelBuffer = F5;
- ANativeWindow::queueBuffer = F5;
- ANativeWindow::query = Query;
- ANativeWindow::perform = Perform;
-
- ANativeWindow::dequeueBuffer_DEPRECATED = F2;
- ANativeWindow::cancelBuffer_DEPRECATED = F3;
- ANativeWindow::lockBuffer_DEPRECATED = F3;
- ANativeWindow::queueBuffer_DEPRECATED = F3;
-}
-
-int DummyNativeWindow::Query(const ANativeWindow*, int what, int* value) {
- switch (what) {
- // This must be 1 in order for eglCreateWindowSurface to not trigger an
- // error
- case NATIVE_WINDOW_IS_VALID:
- *value = 1;
- return NO_ERROR;
- case NATIVE_WINDOW_WIDTH:
- case NATIVE_WINDOW_HEIGHT:
- case NATIVE_WINDOW_FORMAT:
- case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS:
- case NATIVE_WINDOW_CONCRETE_TYPE:
- case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
- case NATIVE_WINDOW_DEFAULT_WIDTH:
- case NATIVE_WINDOW_DEFAULT_HEIGHT:
- case NATIVE_WINDOW_TRANSFORM_HINT:
- *value = 0;
- return NO_ERROR;
- }
-
- *value = 0;
- return BAD_VALUE;
-}
-
-int DummyNativeWindow::Perform(ANativeWindow*, int operation, ...) {
- switch (operation) {
- case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS:
- case NATIVE_WINDOW_SET_BUFFERS_FORMAT:
- case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM:
- case NATIVE_WINDOW_SET_USAGE:
- case NATIVE_WINDOW_CONNECT:
- case NATIVE_WINDOW_DISCONNECT:
- case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY:
- case NATIVE_WINDOW_API_CONNECT:
- case NATIVE_WINDOW_API_DISCONNECT:
- case NATIVE_WINDOW_SET_BUFFER_COUNT:
- case NATIVE_WINDOW_SET_BUFFERS_DATASPACE:
- case NATIVE_WINDOW_SET_SCALING_MODE:
- return NO_ERROR;
- case NATIVE_WINDOW_LOCK:
- case NATIVE_WINDOW_UNLOCK_AND_POST:
- case NATIVE_WINDOW_SET_CROP:
- case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP:
- return INVALID_OPERATION;
- }
- return NAME_NOT_FOUND;
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdisplay/frame_history.cpp b/libs/vr/libdisplay/frame_history.cpp
deleted file mode 100644
index 154afbe..0000000
--- a/libs/vr/libdisplay/frame_history.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-#include <private/dvr/frame_history.h>
-
-#include <errno.h>
-#include <log/log.h>
-#include <sync/sync.h>
-
-#include <pdx/file_handle.h>
-#include <private/dvr/clock_ns.h>
-#include <private/dvr/sync_util.h>
-
-using android::pdx::LocalHandle;
-
-constexpr int kNumFramesToUseForSchedulePrediction = 10;
-constexpr int kDefaultVsyncIntervalPrediction = 1;
-constexpr int kMaxVsyncIntervalPrediction = 4;
-constexpr int kDefaultPendingFrameBufferSize = 10;
-
-namespace android {
-namespace dvr {
-
-FrameHistory::PendingFrame::PendingFrame()
- : start_ns(0), scheduled_vsync(0), scheduled_finish_ns(0) {}
-
-FrameHistory::PendingFrame::PendingFrame(int64_t start_ns,
- uint32_t scheduled_vsync,
- int64_t scheduled_finish_ns,
- LocalHandle&& fence)
- : start_ns(start_ns), scheduled_vsync(scheduled_vsync),
- scheduled_finish_ns(scheduled_finish_ns), fence(std::move(fence)) {}
-
-FrameHistory::FrameHistory() : FrameHistory(kDefaultPendingFrameBufferSize) {}
-
-FrameHistory::FrameHistory(int pending_frame_buffer_size)
- : pending_frames_(pending_frame_buffer_size),
- finished_frames_(pending_frame_buffer_size),
- frame_duration_history_(kNumFramesToUseForSchedulePrediction) {}
-
-void FrameHistory::Reset(int pending_frame_buffer_size) {
- pending_frames_.Reset(pending_frame_buffer_size);
- finished_frames_.Reset(pending_frame_buffer_size);
- frame_duration_history_.Clear();
-}
-
-void FrameHistory::OnFrameStart(uint32_t scheduled_vsync,
- int64_t scheduled_finish_ns) {
- if (!pending_frames_.IsEmpty() && !pending_frames_.Back().fence) {
- // If we don't have a fence set for the previous frame it's because
- // OnFrameStart() was called twice in a row with no OnFrameSubmit() call. In
- // that case throw out the pending frame data for the last frame.
- pending_frames_.PopBack();
- }
-
- if (pending_frames_.IsFull()) {
- ALOGW("Pending frames buffer is full. Discarding pending frame data.");
- }
-
- pending_frames_.Append(PendingFrame(GetSystemClockNs(), scheduled_vsync,
- scheduled_finish_ns, LocalHandle()));
-}
-
-void FrameHistory::OnFrameSubmit(LocalHandle&& fence) {
- // Add the fence to the previous frame data in pending_frames so we can
- // track when it finishes.
- if (!pending_frames_.IsEmpty() && !pending_frames_.Back().fence) {
- if (fence && pending_frames_.Back().scheduled_vsync != UINT32_MAX)
- pending_frames_.Back().fence = std::move(fence);
- else
- pending_frames_.PopBack();
- }
-}
-
-void FrameHistory::CheckForFinishedFrames() {
- if (pending_frames_.IsEmpty())
- return;
-
- android::dvr::FenceInfoBuffer fence_info_buffer;
- while (!pending_frames_.IsEmpty()) {
- const auto& pending_frame = pending_frames_.Front();
- if (!pending_frame.fence) {
- // The frame hasn't been submitted yet, so there's nothing more to do
- break;
- }
-
- int64_t fence_signaled_time = -1;
- int fence = pending_frame.fence.Get();
- int sync_result = sync_wait(fence, 0);
- if (sync_result == 0) {
- int fence_signaled_result =
- GetFenceSignaledTimestamp(fence, &fence_info_buffer,
- &fence_signaled_time);
- if (fence_signaled_result < 0) {
- ALOGE("Failed getting signaled timestamp from fence");
- } else {
- // The frame is finished. Record the duration and move the frame data
- // from pending_frames_ to finished_frames_.
- DvrFrameScheduleResult schedule_result = {};
- schedule_result.vsync_count = pending_frame.scheduled_vsync;
- schedule_result.scheduled_frame_finish_ns =
- pending_frame.scheduled_finish_ns;
- schedule_result.frame_finish_offset_ns =
- fence_signaled_time - pending_frame.scheduled_finish_ns;
- finished_frames_.Append(schedule_result);
- frame_duration_history_.Append(
- fence_signaled_time - pending_frame.start_ns);
- }
- pending_frames_.PopFront();
- } else {
- if (errno != ETIME) {
- ALOGE("sync_wait on frame fence failed. fence=%d errno=%d (%s).",
- fence, errno, strerror(errno));
- }
- break;
- }
- }
-}
-
-int FrameHistory::PredictNextFrameVsyncInterval(int64_t vsync_period_ns) const {
- if (frame_duration_history_.IsEmpty())
- return kDefaultVsyncIntervalPrediction;
-
- double total = 0;
- for (size_t i = 0; i < frame_duration_history_.GetSize(); ++i)
- total += frame_duration_history_.Get(i);
- double avg_duration = total / frame_duration_history_.GetSize();
-
- return std::min(kMaxVsyncIntervalPrediction,
- static_cast<int>(avg_duration / vsync_period_ns) + 1);
-}
-
-int FrameHistory::GetPreviousFrameResults(DvrFrameScheduleResult* results,
- int in_result_count) {
- int out_result_count =
- std::min(in_result_count, static_cast<int>(finished_frames_.GetSize()));
- for (int i = 0; i < out_result_count; ++i) {
- results[i] = finished_frames_.Get(0);
- finished_frames_.PopFront();
- }
- return out_result_count;
-}
-
-uint32_t FrameHistory::GetCurrentFrameVsync() const {
- return pending_frames_.IsEmpty() ?
- UINT32_MAX : pending_frames_.Back().scheduled_vsync;
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdisplay/gl_fenced_flush.cpp b/libs/vr/libdisplay/gl_fenced_flush.cpp
deleted file mode 100644
index c70d554..0000000
--- a/libs/vr/libdisplay/gl_fenced_flush.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "include/private/dvr/gl_fenced_flush.h"
-
-#include <EGL/eglext.h>
-#include <GLES3/gl31.h>
-
-#define ATRACE_TAG ATRACE_TAG_GRAPHICS
-#include <utils/Trace.h>
-
-#include <log/log.h>
-
-using android::pdx::LocalHandle;
-
-namespace android {
-namespace dvr {
-
-LocalHandle CreateGLSyncAndFlush(EGLDisplay display) {
- ATRACE_NAME("CreateGLSyncAndFlush");
-
- EGLint attribs[] = {EGL_SYNC_NATIVE_FENCE_FD_ANDROID,
- EGL_NO_NATIVE_FENCE_FD_ANDROID, EGL_NONE};
- EGLSyncKHR sync_point =
- eglCreateSyncKHR(display, EGL_SYNC_NATIVE_FENCE_ANDROID, attribs);
- glFlush();
- if (sync_point == EGL_NO_SYNC_KHR) {
- ALOGE("sync_point == EGL_NO_SYNC_KHR");
- return LocalHandle();
- }
- EGLint fence_fd = eglDupNativeFenceFDANDROID(display, sync_point);
- eglDestroySyncKHR(display, sync_point);
-
- if (fence_fd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
- ALOGE("fence_fd == EGL_NO_NATIVE_FENCE_FD_ANDROID");
- return LocalHandle();
- }
- return LocalHandle(fence_fd);
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdisplay/graphics.cpp b/libs/vr/libdisplay/graphics.cpp
deleted file mode 100644
index 36f8095..0000000
--- a/libs/vr/libdisplay/graphics.cpp
+++ /dev/null
@@ -1,1607 +0,0 @@
-#include <dvr/graphics.h>
-
-#include <inttypes.h>
-#include <sys/timerfd.h>
-#include <array>
-#include <vector>
-
-#include <log/log.h>
-#include <utils/Trace.h>
-
-#ifndef VK_USE_PLATFORM_ANDROID_KHR
-#define VK_USE_PLATFORM_ANDROID_KHR 1
-#endif
-#include <vulkan/vulkan.h>
-
-#include <dvr/dvr_display_types.h>
-#include <pdx/file_handle.h>
-#include <private/dvr/clock_ns.h>
-#include <private/dvr/debug.h>
-#include <private/dvr/frame_history.h>
-#include <private/dvr/gl_fenced_flush.h>
-#include <private/dvr/graphics/vr_gl_extensions.h>
-#include <private/dvr/graphics_private.h>
-#include <private/dvr/late_latch.h>
-#include <private/dvr/native_buffer_queue.h>
-#include <private/dvr/platform_defines.h>
-#include <private/dvr/sensor_constants.h>
-#include <private/dvr/vsync_client.h>
-
-#include <android/native_window.h>
-
-#ifndef EGL_CONTEXT_MAJOR_VERSION
-#define EGL_CONTEXT_MAJOR_VERSION 0x3098
-#define EGL_CONTEXT_MINOR_VERSION 0x30FB
-#endif
-
-using android::pdx::ErrorStatus;
-using android::pdx::LocalHandle;
-using android::pdx::LocalChannelHandle;
-using android::pdx::Status;
-
-using android::dvr::display::DisplayClient;
-using android::dvr::display::Metrics;
-using android::dvr::display::NativeBufferQueue;
-using android::dvr::display::Surface;
-using android::dvr::display::SurfaceAttribute;
-using android::dvr::display::SurfaceAttributes;
-using android::dvr::display::SurfaceAttributeValue;
-using android::dvr::VSyncClient;
-
-namespace {
-
-// TODO(urbanus): revisit once we have per-platform usage config in place.
-constexpr uint64_t kDefaultDisplaySurfaceUsage =
- GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET |
- GRALLOC1_PRODUCER_USAGE_PRIVATE_1 | GRALLOC1_CONSUMER_USAGE_CLIENT_TARGET |
- GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE;
-constexpr uint32_t kDefaultDisplaySurfaceFormat = HAL_PIXEL_FORMAT_RGBA_8888;
-// TODO(alexst): revisit this count when HW encode is available for casting.
-constexpr size_t kDefaultBufferCount = 4;
-
-// Use with dvrBeginRenderFrame to disable EDS for the current frame.
-constexpr float32x4_t DVR_POSE_NO_EDS = {10.0f, 0.0f, 0.0f, 0.0f};
-
-// Use with dvrBeginRenderFrame to indicate that GPU late-latching is being used
-// for determining the render pose.
-constexpr float32x4_t DVR_POSE_LATE_LATCH = {20.0f, 0.0f, 0.0f, 0.0f};
-
-#ifndef NDEBUG
-
-static const char* GetGlCallbackType(GLenum type) {
- switch (type) {
- case GL_DEBUG_TYPE_ERROR_KHR:
- return "ERROR";
- case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR:
- return "DEPRECATED_BEHAVIOR";
- case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR:
- return "UNDEFINED_BEHAVIOR";
- case GL_DEBUG_TYPE_PORTABILITY_KHR:
- return "PORTABILITY";
- case GL_DEBUG_TYPE_PERFORMANCE_KHR:
- return "PERFORMANCE";
- case GL_DEBUG_TYPE_OTHER_KHR:
- return "OTHER";
- default:
- return "UNKNOWN";
- }
-}
-
-static void on_gl_error(GLenum /*source*/, GLenum type, GLuint /*id*/,
- GLenum severity, GLsizei /*length*/,
- const char* message, const void* /*user_param*/) {
- char msg[400];
- snprintf(msg, sizeof(msg), "[" __FILE__ ":%u] GL %s: %s", __LINE__,
- GetGlCallbackType(type), message);
- switch (severity) {
- case GL_DEBUG_SEVERITY_LOW_KHR:
- ALOGI("%s", msg);
- break;
- case GL_DEBUG_SEVERITY_MEDIUM_KHR:
- ALOGW("%s", msg);
- break;
- case GL_DEBUG_SEVERITY_HIGH_KHR:
- ALOGE("%s", msg);
- break;
- }
- fprintf(stderr, "%s\n", msg);
-}
-
-#endif
-
-int DvrToHalSurfaceFormat(int dvr_surface_format) {
- switch (dvr_surface_format) {
- case DVR_SURFACE_FORMAT_RGBA_8888:
- return HAL_PIXEL_FORMAT_RGBA_8888;
- case DVR_SURFACE_FORMAT_RGB_565:
- return HAL_PIXEL_FORMAT_RGB_565;
- default:
- return HAL_PIXEL_FORMAT_RGBA_8888;
- }
-}
-
-int SelectEGLConfig(EGLDisplay dpy, EGLint* attr, unsigned format,
- EGLConfig* config) {
- std::array<EGLint, 4> desired_rgba;
- switch (format) {
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_BGRA_8888:
- desired_rgba = {{8, 8, 8, 8}};
- break;
- case HAL_PIXEL_FORMAT_RGB_565:
- desired_rgba = {{5, 6, 5, 0}};
- break;
- default:
- ALOGE("Unsupported framebuffer pixel format %d", format);
- return -1;
- }
-
- EGLint max_configs = 0;
- if (eglGetConfigs(dpy, NULL, 0, &max_configs) == EGL_FALSE) {
- ALOGE("No EGL configurations available?!");
- return -1;
- }
-
- std::vector<EGLConfig> configs(max_configs);
-
- EGLint num_configs;
- if (eglChooseConfig(dpy, attr, &configs[0], max_configs, &num_configs) ==
- EGL_FALSE) {
- ALOGE("eglChooseConfig failed");
- return -1;
- }
-
- std::array<EGLint, 4> config_rgba;
- for (int i = 0; i < num_configs; i++) {
- eglGetConfigAttrib(dpy, configs[i], EGL_RED_SIZE, &config_rgba[0]);
- eglGetConfigAttrib(dpy, configs[i], EGL_GREEN_SIZE, &config_rgba[1]);
- eglGetConfigAttrib(dpy, configs[i], EGL_BLUE_SIZE, &config_rgba[2]);
- eglGetConfigAttrib(dpy, configs[i], EGL_ALPHA_SIZE, &config_rgba[3]);
- if (config_rgba == desired_rgba) {
- *config = configs[i];
- return 0;
- }
- }
-
- ALOGE("Cannot find a matching EGL config");
- return -1;
-}
-
-void DestroyEglContext(EGLDisplay egl_display, EGLContext* egl_context) {
- if (*egl_context != EGL_NO_CONTEXT) {
- eglDestroyContext(egl_display, *egl_context);
- *egl_context = EGL_NO_CONTEXT;
- }
-}
-
-// Perform internal initialization. A GL context must be bound to the current
-// thread.
-// @param internally_created_context True if we created and own the GL context,
-// false if it was supplied by the application.
-// @return 0 if init was successful, or a negative error code on failure.
-int InitGl(bool internally_created_context) {
- EGLDisplay egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (egl_display == EGL_NO_DISPLAY) {
- ALOGE("eglGetDisplay failed");
- return -EINVAL;
- }
-
- EGLContext egl_context = eglGetCurrentContext();
- if (egl_context == EGL_NO_CONTEXT) {
- ALOGE("No GL context bound");
- return -EINVAL;
- }
-
- glGetError(); // Clear the error state
- GLint major_version, minor_version;
- glGetIntegerv(GL_MAJOR_VERSION, &major_version);
- glGetIntegerv(GL_MINOR_VERSION, &minor_version);
- if (glGetError() != GL_NO_ERROR) {
- // GL_MAJOR_VERSION and GL_MINOR_VERSION were added in GLES 3. If we get an
- // error querying them it's almost certainly because it's GLES 1 or 2.
- ALOGE("Error getting GL version. Must be GLES 3.2 or greater.");
- return -EINVAL;
- }
-
- if (major_version < 3 || (major_version == 3 && minor_version < 2)) {
- ALOGE("Invalid GL version: %d.%d. Must be GLES 3.2 or greater.",
- major_version, minor_version);
- return -EINVAL;
- }
-
-#ifndef NDEBUG
- if (internally_created_context) {
- // Enable verbose GL debug output.
- glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR);
- glDebugMessageCallbackKHR(on_gl_error, NULL);
- GLuint unused_ids = 0;
- glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0,
- &unused_ids, GL_TRUE);
- }
-#else
- (void)internally_created_context;
-#endif
-
- load_gl_extensions();
- return 0;
-}
-
-int CreateEglContext(EGLDisplay egl_display, DvrSurfaceParameter* parameters,
- EGLContext* egl_context) {
- *egl_context = EGL_NO_CONTEXT;
-
- EGLint major, minor;
- if (!eglInitialize(egl_display, &major, &minor)) {
- ALOGE("Failed to initialize EGL");
- return -ENXIO;
- }
-
- ALOGI("EGL version: %d.%d\n", major, minor);
-
- int buffer_format = kDefaultDisplaySurfaceFormat;
-
- for (auto p = parameters; p && p->key != DVR_SURFACE_PARAMETER_NONE; ++p) {
- switch (p->key) {
- case DVR_SURFACE_PARAMETER_FORMAT_IN:
- buffer_format = DvrToHalSurfaceFormat(p->value);
- break;
- }
- }
-
- EGLint config_attrs[] = {EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE};
- EGLConfig config = {0};
-
- int ret = SelectEGLConfig(egl_display, config_attrs, buffer_format, &config);
- if (ret < 0)
- return ret;
-
- ALOGI("EGL SelectEGLConfig ok.\n");
-
- EGLint context_attrs[] = {EGL_CONTEXT_MAJOR_VERSION,
- 3,
- EGL_CONTEXT_MINOR_VERSION,
- 2,
-#ifndef NDEBUG
- EGL_CONTEXT_FLAGS_KHR,
- EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR,
-#endif
- EGL_NONE};
-
- *egl_context =
- eglCreateContext(egl_display, config, EGL_NO_CONTEXT, context_attrs);
- if (*egl_context == EGL_NO_CONTEXT) {
- ALOGE("eglCreateContext failed");
- return -ENXIO;
- }
-
- ALOGI("eglCreateContext ok.\n");
-
- if (!eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE,
- *egl_context)) {
- ALOGE("eglMakeCurrent failed");
- DestroyEglContext(egl_display, egl_context);
- return -EINVAL;
- }
-
- return 0;
-}
-
-// Utility structure to hold info related to creating a surface.
-struct SurfaceResult {
- std::shared_ptr<Surface> surface;
- Metrics metrics;
- uint32_t width;
- uint32_t height;
- uint32_t format;
- uint64_t usage;
- size_t capacity;
- int geometry;
- bool direct_surface;
-};
-
-Status<std::tuple<std::shared_ptr<android::dvr::ProducerQueue>,
- std::shared_ptr<android::dvr::BufferProducer>,
- volatile DisplaySurfaceMetadata*>>
-CreateMetadataBuffer(const std::shared_ptr<Surface>& surface,
- bool direct_surface) {
- std::shared_ptr<android::dvr::ProducerQueue> queue;
- std::shared_ptr<android::dvr::BufferProducer> buffer;
-
- if (!direct_surface) {
- auto queue_status = surface->CreateQueue(
- sizeof(DisplaySurfaceMetadata), 1, 1, HAL_PIXEL_FORMAT_BLOB,
- GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET |
- GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN |
- GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER,
- 1);
- if (!queue_status) {
- ALOGE("CreateMetadataBuffer: Failed to create queue: %s",
- queue_status.GetErrorMessage().c_str());
- return queue_status.error_status();
- }
-
- queue = queue_status.take();
- LocalHandle fence;
- size_t slot;
- auto buffer_status = queue->Dequeue(-1, &slot, &fence);
- if (!buffer_status) {
- ALOGE("CreateMetadataBuffer: Failed to dequeue buffer: %s",
- buffer_status.GetErrorMessage().c_str());
- return buffer_status.error_status();
- }
- buffer = buffer_status.take();
- } else {
- buffer = android::dvr::BufferProducer::CreateUncachedBlob(
- sizeof(DisplaySurfaceMetadata));
- if (!buffer) {
- ALOGE("CreateMetadataBuffer: Failed to create stand-in buffer!");
- return ErrorStatus(ENOMEM);
- }
- }
-
- void* address = nullptr;
- int ret =
- buffer->GetBlobReadWritePointer(sizeof(DisplaySurfaceMetadata), &address);
-
- if (ret < 0) {
- ALOGE("CreateMetadataBuffer: Failed to map buffer: %s", strerror(-ret));
- return ErrorStatus(-ret);
- }
-
- // Post the buffer so that the compositor can retrieve it from the consumer
- // queue.
- ret = buffer->Post<void>(LocalHandle{});
- if (ret < 0) {
- ALOGE("CreateMetadataBuffer: Failed to post buffer: %s", strerror(-ret));
- return ErrorStatus(-ret);
- }
-
- ALOGD_IF(TRACE, "CreateMetadataBuffer: queue_id=%d buffer_id=%d address=%p",
- queue ? queue->id() : -1, buffer->id(), address);
- return {{std::move(queue), std::move(buffer),
- static_cast<DisplaySurfaceMetadata*>(address)}};
-}
-
-} // anonymous namespace
-
-Status<SurfaceResult> CreateSurface(struct DvrSurfaceParameter* parameters) {
- int error;
- auto client = DisplayClient::Create(&error);
- if (!client) {
- ALOGE("CreateApplicationSurface: Failed to create display client!");
- return ErrorStatus(error);
- }
-
- auto metrics_status = client->GetDisplayMetrics();
- if (!metrics_status) {
- ALOGE("CreateApplicationSurface: Failed to get display metrics: %s",
- metrics_status.GetErrorMessage().c_str());
- return metrics_status.error_status();
- }
-
- // Parameters that may be modified by the parameters array. Some of these are
- // here for future expansion.
-
- uint32_t request_width = metrics_status.get().display_width;
- uint32_t request_height = metrics_status.get().display_width;
- uint32_t request_format = kDefaultDisplaySurfaceFormat;
- uint64_t request_usage = kDefaultDisplaySurfaceUsage;
- size_t request_capacity = kDefaultBufferCount;
- int request_geometry = DVR_SURFACE_GEOMETRY_SINGLE;
- bool disable_distortion = false;
- bool disable_stabilization = false;
- bool disable_cac = false;
- bool request_visible = false;
- bool vertical_flip = false;
- bool direct_surface = false;
- int request_z_order = 0;
-
- // Handle parameter inputs.
- for (auto p = parameters; p && p->key != DVR_SURFACE_PARAMETER_NONE; ++p) {
- switch (p->key) {
- case DVR_SURFACE_PARAMETER_DISABLE_DISTORTION_IN:
- disable_distortion = !!p->value;
- break;
- case DVR_SURFACE_PARAMETER_DISABLE_STABILIZATION_IN:
- disable_stabilization = !!p->value;
- break;
- case DVR_SURFACE_PARAMETER_DISABLE_CAC_IN:
- disable_cac = !!p->value;
- break;
- case DVR_SURFACE_PARAMETER_VISIBLE_IN:
- request_visible = !!p->value;
- break;
- case DVR_SURFACE_PARAMETER_Z_ORDER_IN:
- request_z_order = p->value;
- break;
- case DVR_SURFACE_PARAMETER_VERTICAL_FLIP_IN:
- vertical_flip = !!p->value;
- break;
- case DVR_SURFACE_PARAMETER_DIRECT_IN:
- direct_surface = !!p->value;
- break;
- case DVR_SURFACE_PARAMETER_WIDTH_IN:
- request_width = p->value;
- break;
- case DVR_SURFACE_PARAMETER_HEIGHT_IN:
- request_height = p->value;
- break;
- case DVR_SURFACE_PARAMETER_FORMAT_IN:
- request_format = p->value;
- break;
- case DVR_SURFACE_PARAMETER_GEOMETRY_IN:
- request_geometry = p->value;
- break;
- case DVR_SURFACE_PARAMETER_ENABLE_LATE_LATCH_IN:
- case DVR_SURFACE_PARAMETER_CREATE_GL_CONTEXT_IN:
- case DVR_SURFACE_PARAMETER_DISPLAY_WIDTH_OUT:
- case DVR_SURFACE_PARAMETER_DISPLAY_HEIGHT_OUT:
- case DVR_SURFACE_PARAMETER_SURFACE_WIDTH_OUT:
- case DVR_SURFACE_PARAMETER_SURFACE_HEIGHT_OUT:
- case DVR_SURFACE_PARAMETER_INTER_LENS_METERS_OUT:
- case DVR_SURFACE_PARAMETER_LEFT_FOV_LRBT_OUT:
- case DVR_SURFACE_PARAMETER_RIGHT_FOV_LRBT_OUT:
- case DVR_SURFACE_PARAMETER_VSYNC_PERIOD_OUT:
- case DVR_SURFACE_PARAMETER_SURFACE_TEXTURE_TARGET_TYPE_OUT:
- case DVR_SURFACE_PARAMETER_SURFACE_TEXTURE_TARGET_ID_OUT:
- case DVR_SURFACE_PARAMETER_GRAPHICS_API_IN:
- case DVR_SURFACE_PARAMETER_VK_INSTANCE_IN:
- case DVR_SURFACE_PARAMETER_VK_PHYSICAL_DEVICE_IN:
- case DVR_SURFACE_PARAMETER_VK_DEVICE_IN:
- case DVR_SURFACE_PARAMETER_VK_PRESENT_QUEUE_IN:
- case DVR_SURFACE_PARAMETER_VK_PRESENT_QUEUE_FAMILY_IN:
- case DVR_SURFACE_PARAMETER_VK_SWAPCHAIN_IMAGE_COUNT_OUT:
- case DVR_SURFACE_PARAMETER_VK_SWAPCHAIN_IMAGE_FORMAT_OUT:
- break;
- default:
- ALOGE(
- "CreateSurface: Invalid display surface parameter: key=%d "
- "value=%" PRId64,
- p->key, p->value);
- return ErrorStatus(EINVAL);
- }
- }
-
- // TODO(eieio): Setup a "surface flags" attribute based on the surface
- // parameters gathered above.
- SurfaceAttributes surface_attributes;
-
- surface_attributes[SurfaceAttribute::Direct] = direct_surface;
- surface_attributes[SurfaceAttribute::Visible] = request_visible;
- surface_attributes[SurfaceAttribute::ZOrder] = request_z_order;
-
- auto surface_status = Surface::CreateSurface(surface_attributes);
- if (!surface_status) {
- ALOGE("CreateSurface: Failed to create surface: %s",
- surface_status.GetErrorMessage().c_str());
- return surface_status.error_status();
- }
-
- return {{surface_status.take(), metrics_status.get(), request_width,
- request_height, request_format, request_usage, request_capacity,
- request_geometry, direct_surface}};
-}
-
-// TODO(hendrikw): When we remove the calls to this in native_window.cpp, move
-// this back into the anonymous namespace
-Status<SurfaceResult> CreateApplicationSurface(
- struct DvrSurfaceParameter* parameters) {
- auto surface_status = CreateSurface(parameters);
- if (!surface_status)
- return surface_status;
-
- // Handle parameter output requests down here so we can return surface info.
- for (auto p = parameters; p && p->key != DVR_SURFACE_PARAMETER_NONE; ++p) {
- switch (p->key) {
- case DVR_SURFACE_PARAMETER_DISPLAY_WIDTH_OUT:
- *static_cast<int32_t*>(p->value_out) =
- surface_status.get().metrics.display_width;
- break;
- case DVR_SURFACE_PARAMETER_DISPLAY_HEIGHT_OUT:
- *static_cast<int32_t*>(p->value_out) =
- surface_status.get().metrics.display_height;
- break;
- case DVR_SURFACE_PARAMETER_VSYNC_PERIOD_OUT:
- *static_cast<uint64_t*>(p->value_out) =
- surface_status.get().metrics.vsync_period_ns;
- break;
- case DVR_SURFACE_PARAMETER_SURFACE_WIDTH_OUT:
- *static_cast<uint32_t*>(p->value_out) = surface_status.get().width;
- break;
- case DVR_SURFACE_PARAMETER_SURFACE_HEIGHT_OUT:
- *static_cast<uint32_t*>(p->value_out) = surface_status.get().height;
- break;
-
- default:
- break;
- }
- }
-
- return surface_status;
-}
-
-extern "C" int dvrGetNativeDisplayDimensions(int* display_width,
- int* display_height) {
- int error = 0;
- auto client = DisplayClient::Create(&error);
- if (!client) {
- ALOGE("dvrGetNativeDisplayDimensions: Failed to create display client!");
- return -error;
- }
-
- auto metrics_status = client->GetDisplayMetrics();
- if (!metrics_status) {
- ALOGE("dvrGetNativeDisplayDimensions: Failed to get display metrics: %s",
- metrics_status.GetErrorMessage().c_str());
- return -metrics_status.error();
- }
-
- *display_width = static_cast<int>(metrics_status.get().display_width);
- *display_height = static_cast<int>(metrics_status.get().display_height);
- return 0;
-}
-
-struct DvrGraphicsContext : public android::ANativeObjectBase<
- ANativeWindow, DvrGraphicsContext,
- android::LightRefBase<DvrGraphicsContext>> {
- public:
- DvrGraphicsContext();
- ~DvrGraphicsContext();
-
- int graphics_api; // DVR_SURFACE_GRAPHICS_API_*
-
- // GL specific members.
- struct {
- EGLDisplay egl_display;
- EGLContext egl_context;
- bool owns_egl_context;
- GLuint texture_id[kSurfaceViewMaxCount];
- int texture_count;
- GLenum texture_target_type;
- } gl;
-
- // VK specific members
- struct {
- // These objects are passed in by the application, and are NOT owned
- // by the context.
- VkInstance instance;
- VkPhysicalDevice physical_device;
- VkDevice device;
- VkQueue present_queue;
- uint32_t present_queue_family;
- const VkAllocationCallbacks* allocation_callbacks;
- // These objects are owned by the context.
- ANativeWindow* window;
- VkSurfaceKHR surface;
- VkSwapchainKHR swapchain;
- std::vector<VkImage> swapchain_images;
- std::vector<VkImageView> swapchain_image_views;
- } vk;
-
- // Display surface, metrics, and buffer management members.
- std::shared_ptr<Surface> display_surface;
- uint32_t width;
- uint32_t height;
- uint32_t format;
- Metrics display_metrics;
- std::unique_ptr<NativeBufferQueue> buffer_queue;
- android::dvr::NativeBufferProducer* current_buffer;
- bool buffer_already_posted;
-
- // Synchronization members.
- std::unique_ptr<android::dvr::VSyncClient> vsync_client;
- LocalHandle timerfd;
-
- android::dvr::FrameHistory frame_history;
-
- // Metadata queue and buffer.
- // TODO(eieio): Remove the queue once one-off buffers are supported as a
- // surface primitive element.
- std::shared_ptr<android::dvr::ProducerQueue> metadata_queue;
- std::shared_ptr<android::dvr::BufferProducer> metadata_buffer;
- // Mapped surface metadata (ie: for pose delivery with presented frames).
- volatile DisplaySurfaceMetadata* surface_metadata;
-
- // LateLatch support.
- std::unique_ptr<android::dvr::LateLatch> late_latch;
-
- private:
- // ANativeWindow function implementations
- std::mutex lock_;
- int Post(android::dvr::NativeBufferProducer* buffer, int fence_fd);
- static int SetSwapInterval(ANativeWindow* window, int interval);
- static int DequeueBuffer(ANativeWindow* window, ANativeWindowBuffer** buffer,
- int* fence_fd);
- static int QueueBuffer(ANativeWindow* window, ANativeWindowBuffer* buffer,
- int fence_fd);
- static int CancelBuffer(ANativeWindow* window, ANativeWindowBuffer* buffer,
- int fence_fd);
- static int Query(const ANativeWindow* window, int what, int* value);
- static int Perform(ANativeWindow* window, int operation, ...);
- static int DequeueBuffer_DEPRECATED(ANativeWindow* window,
- ANativeWindowBuffer** buffer);
- static int CancelBuffer_DEPRECATED(ANativeWindow* window,
- ANativeWindowBuffer* buffer);
- static int QueueBuffer_DEPRECATED(ANativeWindow* window,
- ANativeWindowBuffer* buffer);
- static int LockBuffer_DEPRECATED(ANativeWindow* window,
- ANativeWindowBuffer* buffer);
-
- DvrGraphicsContext(const DvrGraphicsContext&) = delete;
- void operator=(const DvrGraphicsContext&) = delete;
-};
-
-DvrGraphicsContext::DvrGraphicsContext()
- : graphics_api(DVR_GRAPHICS_API_GLES),
- gl{},
- vk{},
- current_buffer(nullptr),
- buffer_already_posted(false),
- surface_metadata(nullptr) {
- gl.egl_display = EGL_NO_DISPLAY;
- gl.egl_context = EGL_NO_CONTEXT;
- gl.owns_egl_context = true;
- gl.texture_target_type = GL_TEXTURE_2D;
-
- ANativeWindow::setSwapInterval = SetSwapInterval;
- ANativeWindow::dequeueBuffer = DequeueBuffer;
- ANativeWindow::cancelBuffer = CancelBuffer;
- ANativeWindow::queueBuffer = QueueBuffer;
- ANativeWindow::query = Query;
- ANativeWindow::perform = Perform;
-
- ANativeWindow::dequeueBuffer_DEPRECATED = DequeueBuffer_DEPRECATED;
- ANativeWindow::cancelBuffer_DEPRECATED = CancelBuffer_DEPRECATED;
- ANativeWindow::lockBuffer_DEPRECATED = LockBuffer_DEPRECATED;
- ANativeWindow::queueBuffer_DEPRECATED = QueueBuffer_DEPRECATED;
-}
-
-DvrGraphicsContext::~DvrGraphicsContext() {
- if (graphics_api == DVR_GRAPHICS_API_GLES) {
- glDeleteTextures(gl.texture_count, gl.texture_id);
- if (gl.owns_egl_context)
- DestroyEglContext(gl.egl_display, &gl.egl_context);
- } else if (graphics_api == DVR_GRAPHICS_API_VULKAN) {
- if (vk.swapchain != VK_NULL_HANDLE) {
- for (auto view : vk.swapchain_image_views) {
- vkDestroyImageView(vk.device, view, vk.allocation_callbacks);
- }
- vkDestroySwapchainKHR(vk.device, vk.swapchain, vk.allocation_callbacks);
- vkDestroySurfaceKHR(vk.instance, vk.surface, vk.allocation_callbacks);
- delete vk.window;
- }
- }
-}
-
-int dvrGraphicsContextCreate(struct DvrSurfaceParameter* parameters,
- DvrGraphicsContext** return_graphics_context) {
- auto context = std::make_unique<DvrGraphicsContext>();
-
- // See whether we're using GL or Vulkan
- for (auto p = parameters; p && p->key != DVR_SURFACE_PARAMETER_NONE; ++p) {
- switch (p->key) {
- case DVR_SURFACE_PARAMETER_GRAPHICS_API_IN:
- context->graphics_api = p->value;
- break;
- }
- }
-
- if (context->graphics_api == DVR_GRAPHICS_API_GLES) {
- context->gl.egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (context->gl.egl_display == EGL_NO_DISPLAY) {
- ALOGE("eglGetDisplay failed");
- return -ENXIO;
- }
-
- // See if we should create a GL context
- for (auto p = parameters; p && p->key != DVR_SURFACE_PARAMETER_NONE; ++p) {
- switch (p->key) {
- case DVR_SURFACE_PARAMETER_CREATE_GL_CONTEXT_IN:
- context->gl.owns_egl_context = p->value != 0;
- break;
- }
- }
-
- if (context->gl.owns_egl_context) {
- int ret = CreateEglContext(context->gl.egl_display, parameters,
- &context->gl.egl_context);
- if (ret < 0)
- return ret;
- } else {
- context->gl.egl_context = eglGetCurrentContext();
- }
-
- int ret = InitGl(context->gl.owns_egl_context);
- if (ret < 0)
- return ret;
- } else if (context->graphics_api == DVR_GRAPHICS_API_VULKAN) {
- for (auto p = parameters; p && p->key != DVR_SURFACE_PARAMETER_NONE; ++p) {
- switch (p->key) {
- case DVR_SURFACE_PARAMETER_VK_INSTANCE_IN:
- context->vk.instance = reinterpret_cast<VkInstance>(p->value);
- break;
- case DVR_SURFACE_PARAMETER_VK_PHYSICAL_DEVICE_IN:
- context->vk.physical_device =
- reinterpret_cast<VkPhysicalDevice>(p->value);
- break;
- case DVR_SURFACE_PARAMETER_VK_DEVICE_IN:
- context->vk.device = reinterpret_cast<VkDevice>(p->value);
- break;
- case DVR_SURFACE_PARAMETER_VK_PRESENT_QUEUE_IN:
- context->vk.present_queue = reinterpret_cast<VkQueue>(p->value);
- break;
- case DVR_SURFACE_PARAMETER_VK_PRESENT_QUEUE_FAMILY_IN:
- context->vk.present_queue_family = static_cast<uint32_t>(p->value);
- break;
- }
- }
- } else {
- ALOGE("Error: invalid graphics API type");
- return -EINVAL;
- }
-
- auto surface_status = CreateApplicationSurface(parameters);
- if (!surface_status) {
- ALOGE("dvrGraphicsContextCreate: Failed to create surface: %s",
- surface_status.GetErrorMessage().c_str());
- return -surface_status.error();
- }
-
- auto surface_result = surface_status.take();
-
- context->display_surface = surface_result.surface;
- context->display_metrics = surface_result.metrics;
- context->width = surface_result.width;
- context->height = surface_result.height;
- context->format = surface_result.format;
-
- // Create an empty queue. NativeBufferQueue allocates the buffers for this
- // queue.
- auto queue_status = context->display_surface->CreateQueue();
- if (!queue_status) {
- ALOGE("dvrGraphicsContextCreate: Failed to create queue: %s",
- queue_status.GetErrorMessage().c_str());
- return -queue_status.error();
- }
-
- context->buffer_queue.reset(new NativeBufferQueue(
- context->gl.egl_display, queue_status.take(), surface_result.width,
- surface_result.height, surface_result.format, surface_result.usage,
- surface_result.capacity));
-
- // Create the metadata buffer.
- auto metadata_status = CreateMetadataBuffer(context->display_surface,
- surface_result.direct_surface);
- if (!metadata_status) {
- ALOGE("dvrGraphicsContextCreate: Failed to create metadata buffer: %s",
- metadata_status.GetErrorMessage().c_str());
- return -metadata_status.error();
- }
- std::tie(context->metadata_queue, context->metadata_buffer,
- context->surface_metadata) = metadata_status.take();
-
- // The way the call sequence works we need 1 more than the buffer queue
- // capacity to store data for all pending frames
- context->frame_history.Reset(context->buffer_queue->capacity() + 1);
-
- context->vsync_client = VSyncClient::Create();
- if (!context->vsync_client) {
- ALOGE("dvrGraphicsContextCreate: failed to create vsync client");
- return -ECOMM;
- }
-
- context->timerfd.Reset(timerfd_create(CLOCK_MONOTONIC, 0));
- if (!context->timerfd) {
- ALOGE("dvrGraphicsContextCreate: timerfd_create failed because: %s",
- strerror(errno));
- return -EPERM;
- }
-
- if (context->graphics_api == DVR_GRAPHICS_API_GLES) {
- context->gl.texture_count =
- (surface_result.geometry == DVR_SURFACE_GEOMETRY_SEPARATE_2) ? 2 : 1;
-
- // Create the GL textures.
- glGenTextures(context->gl.texture_count, context->gl.texture_id);
-
- // We must make sure that we have at least one buffer allocated at this time
- // so that anyone who tries to bind an FBO to context->texture_id
- // will not get an incomplete buffer.
- context->current_buffer = context->buffer_queue->Dequeue();
- LOG_ALWAYS_FATAL_IF(context->gl.texture_count != 1);
- for (int i = 0; i < context->gl.texture_count; ++i) {
- glBindTexture(context->gl.texture_target_type, context->gl.texture_id[i]);
- glEGLImageTargetTexture2DOES(context->gl.texture_target_type,
- context->current_buffer->image_khr(i));
- }
- glBindTexture(context->gl.texture_target_type, 0);
- CHECK_GL();
-
- bool is_late_latch = false;
-
- // Pass back the texture target type and id.
- for (auto p = parameters; p && p->key != DVR_SURFACE_PARAMETER_NONE; ++p) {
- switch (p->key) {
- case DVR_SURFACE_PARAMETER_ENABLE_LATE_LATCH_IN:
- is_late_latch = !!p->value;
- break;
- case DVR_SURFACE_PARAMETER_SURFACE_TEXTURE_TARGET_TYPE_OUT:
- *static_cast<GLenum*>(p->value_out) = context->gl.texture_target_type;
- break;
- case DVR_SURFACE_PARAMETER_SURFACE_TEXTURE_TARGET_ID_OUT:
- for (int i = 0; i < context->gl.texture_count; ++i) {
- *(static_cast<GLuint*>(p->value_out) + i) =
- context->gl.texture_id[i];
- }
- break;
- }
- }
-
- // Initialize late latch.
- if (is_late_latch) {
- LocalHandle fd = context->metadata_buffer->GetBlobFd();
- context->late_latch.reset(
- new android::dvr::LateLatch(true, std::move(fd)));
- }
- } else if (context->graphics_api == DVR_GRAPHICS_API_VULKAN) {
- VkResult result = VK_SUCCESS;
- // Create a VkSurfaceKHR from the ANativeWindow.
- VkAndroidSurfaceCreateInfoKHR android_surface_ci = {};
- android_surface_ci.sType =
- VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
- android_surface_ci.window = context.get();
- result = vkCreateAndroidSurfaceKHR(
- context->vk.instance, &android_surface_ci,
- context->vk.allocation_callbacks, &context->vk.surface);
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- VkBool32 surface_supports_present = VK_FALSE;
- result = vkGetPhysicalDeviceSurfaceSupportKHR(
- context->vk.physical_device, context->vk.present_queue_family,
- context->vk.surface, &surface_supports_present);
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- if (!surface_supports_present) {
- ALOGE("Error: provided queue family (%u) does not support presentation",
- context->vk.present_queue_family);
- return -EPERM;
- }
- VkSurfaceCapabilitiesKHR surface_capabilities = {};
- result = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
- context->vk.physical_device, context->vk.surface,
- &surface_capabilities);
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- // Determine the swapchain image format.
- uint32_t device_surface_format_count = 0;
- result = vkGetPhysicalDeviceSurfaceFormatsKHR(
- context->vk.physical_device, context->vk.surface,
- &device_surface_format_count, nullptr);
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- std::vector<VkSurfaceFormatKHR> device_surface_formats(
- device_surface_format_count);
- result = vkGetPhysicalDeviceSurfaceFormatsKHR(
- context->vk.physical_device, context->vk.surface,
- &device_surface_format_count, device_surface_formats.data());
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- LOG_ALWAYS_FATAL_IF(device_surface_format_count == 0U);
- LOG_ALWAYS_FATAL_IF(device_surface_formats[0].format ==
- VK_FORMAT_UNDEFINED);
- VkSurfaceFormatKHR present_surface_format = device_surface_formats[0];
- // Determine the swapchain present mode.
- // TODO(cort): query device_present_modes to make sure MAILBOX is supported.
- // But according to libvulkan, it is.
- uint32_t device_present_mode_count = 0;
- result = vkGetPhysicalDeviceSurfacePresentModesKHR(
- context->vk.physical_device, context->vk.surface,
- &device_present_mode_count, nullptr);
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- std::vector<VkPresentModeKHR> device_present_modes(
- device_present_mode_count);
- result = vkGetPhysicalDeviceSurfacePresentModesKHR(
- context->vk.physical_device, context->vk.surface,
- &device_present_mode_count, device_present_modes.data());
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- VkPresentModeKHR present_mode = VK_PRESENT_MODE_MAILBOX_KHR;
- // Extract presentation surface extents, image count, transform, usages,
- // etc.
- LOG_ALWAYS_FATAL_IF(
- static_cast<int>(surface_capabilities.currentExtent.width) == -1 ||
- static_cast<int>(surface_capabilities.currentExtent.height) == -1);
- VkExtent2D swapchain_extent = surface_capabilities.currentExtent;
-
- uint32_t desired_image_count = surface_capabilities.minImageCount;
- if (surface_capabilities.maxImageCount > 0 &&
- desired_image_count > surface_capabilities.maxImageCount) {
- desired_image_count = surface_capabilities.maxImageCount;
- }
- VkSurfaceTransformFlagBitsKHR surface_transform =
- surface_capabilities.currentTransform;
- VkImageUsageFlags image_usage_flags =
- surface_capabilities.supportedUsageFlags;
- LOG_ALWAYS_FATAL_IF(surface_capabilities.supportedCompositeAlpha ==
- static_cast<VkFlags>(0));
- VkCompositeAlphaFlagBitsKHR composite_alpha =
- VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
- if (!(surface_capabilities.supportedCompositeAlpha &
- VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR)) {
- composite_alpha = VkCompositeAlphaFlagBitsKHR(
- static_cast<int>(surface_capabilities.supportedCompositeAlpha) &
- -static_cast<int>(surface_capabilities.supportedCompositeAlpha));
- }
- // Create VkSwapchainKHR
- VkSwapchainCreateInfoKHR swapchain_ci = {};
- swapchain_ci.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
- swapchain_ci.pNext = nullptr;
- swapchain_ci.surface = context->vk.surface;
- swapchain_ci.minImageCount = desired_image_count;
- swapchain_ci.imageFormat = present_surface_format.format;
- swapchain_ci.imageColorSpace = present_surface_format.colorSpace;
- swapchain_ci.imageExtent.width = swapchain_extent.width;
- swapchain_ci.imageExtent.height = swapchain_extent.height;
- swapchain_ci.imageUsage = image_usage_flags;
- swapchain_ci.preTransform = surface_transform;
- swapchain_ci.compositeAlpha = composite_alpha;
- swapchain_ci.imageArrayLayers = 1;
- swapchain_ci.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
- swapchain_ci.queueFamilyIndexCount = 0;
- swapchain_ci.pQueueFamilyIndices = nullptr;
- swapchain_ci.presentMode = present_mode;
- swapchain_ci.clipped = VK_TRUE;
- swapchain_ci.oldSwapchain = VK_NULL_HANDLE;
- result = vkCreateSwapchainKHR(context->vk.device, &swapchain_ci,
- context->vk.allocation_callbacks,
- &context->vk.swapchain);
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- // Create swapchain image views
- uint32_t image_count = 0;
- result = vkGetSwapchainImagesKHR(context->vk.device, context->vk.swapchain,
- &image_count, nullptr);
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- LOG_ALWAYS_FATAL_IF(image_count == 0U);
- context->vk.swapchain_images.resize(image_count);
- result = vkGetSwapchainImagesKHR(context->vk.device, context->vk.swapchain,
- &image_count,
- context->vk.swapchain_images.data());
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- context->vk.swapchain_image_views.resize(image_count);
- VkImageViewCreateInfo image_view_ci = {};
- image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
- image_view_ci.pNext = nullptr;
- image_view_ci.flags = 0;
- image_view_ci.format = swapchain_ci.imageFormat;
- image_view_ci.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
- image_view_ci.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
- image_view_ci.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
- image_view_ci.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
- image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- image_view_ci.subresourceRange.baseMipLevel = 0;
- image_view_ci.subresourceRange.levelCount = 1;
- image_view_ci.subresourceRange.baseArrayLayer = 0;
- image_view_ci.subresourceRange.layerCount = 1;
- image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
- image_view_ci.image = VK_NULL_HANDLE; // filled in below
- for (uint32_t i = 0; i < image_count; ++i) {
- image_view_ci.image = context->vk.swapchain_images[i];
- result = vkCreateImageView(context->vk.device, &image_view_ci,
- context->vk.allocation_callbacks,
- &context->vk.swapchain_image_views[i]);
- LOG_ALWAYS_FATAL_IF(result != VK_SUCCESS);
- }
- // Fill in any requested output parameters.
- for (auto p = parameters; p && p->key != DVR_SURFACE_PARAMETER_NONE; ++p) {
- switch (p->key) {
- case DVR_SURFACE_PARAMETER_VK_SWAPCHAIN_IMAGE_COUNT_OUT:
- *static_cast<uint32_t*>(p->value_out) = image_count;
- break;
- case DVR_SURFACE_PARAMETER_VK_SWAPCHAIN_IMAGE_FORMAT_OUT:
- *static_cast<VkFormat*>(p->value_out) = swapchain_ci.imageFormat;
- break;
- }
- }
- }
-
- *return_graphics_context = context.release();
- return 0;
-}
-
-void dvrGraphicsContextDestroy(DvrGraphicsContext* graphics_context) {
- delete graphics_context;
-}
-
-// ANativeWindow function implementations. These should only be used
-// by the Vulkan path.
-int DvrGraphicsContext::Post(android::dvr::NativeBufferProducer* buffer,
- int fence_fd) {
- LOG_ALWAYS_FATAL_IF(graphics_api != DVR_GRAPHICS_API_VULKAN);
- ATRACE_NAME(__PRETTY_FUNCTION__);
- ALOGI_IF(TRACE, "DvrGraphicsContext::Post: buffer_id=%d, fence_fd=%d",
- buffer->buffer()->id(), fence_fd);
- ALOGW_IF(!display_surface->visible(),
- "DvrGraphicsContext::Post: Posting buffer on invisible surface!!!");
- // The NativeBufferProducer closes the fence fd, so dup it for tracking in the
- // frame history.
- frame_history.OnFrameSubmit(LocalHandle::AsDuplicate(fence_fd));
- int result = buffer->Post(fence_fd, 0);
- return result;
-}
-
-int DvrGraphicsContext::SetSwapInterval(ANativeWindow* window, int interval) {
- ALOGI_IF(TRACE, "SetSwapInterval: window=%p interval=%d", window, interval);
- DvrGraphicsContext* self = getSelf(window);
- (void)self;
- LOG_ALWAYS_FATAL_IF(self->graphics_api != DVR_GRAPHICS_API_VULKAN);
- return android::NO_ERROR;
-}
-
-int DvrGraphicsContext::DequeueBuffer(ANativeWindow* window,
- ANativeWindowBuffer** buffer,
- int* fence_fd) {
- ATRACE_NAME(__PRETTY_FUNCTION__);
-
- DvrGraphicsContext* self = getSelf(window);
- LOG_ALWAYS_FATAL_IF(self->graphics_api != DVR_GRAPHICS_API_VULKAN);
- std::lock_guard<std::mutex> autolock(self->lock_);
-
- if (!self->current_buffer) {
- self->current_buffer = self->buffer_queue->Dequeue();
- }
- ATRACE_ASYNC_BEGIN("BufferDraw", self->current_buffer->buffer()->id());
- *fence_fd = self->current_buffer->ClaimReleaseFence().Release();
- *buffer = self->current_buffer;
-
- ALOGI_IF(TRACE, "DvrGraphicsContext::DequeueBuffer: fence_fd=%d", *fence_fd);
- return android::NO_ERROR;
-}
-
-int DvrGraphicsContext::QueueBuffer(ANativeWindow* window,
- ANativeWindowBuffer* buffer, int fence_fd) {
- ATRACE_NAME("NativeWindow::QueueBuffer");
- ALOGI_IF(TRACE, "NativeWindow::QueueBuffer: fence_fd=%d", fence_fd);
-
- DvrGraphicsContext* self = getSelf(window);
- LOG_ALWAYS_FATAL_IF(self->graphics_api != DVR_GRAPHICS_API_VULKAN);
- std::lock_guard<std::mutex> autolock(self->lock_);
-
- android::dvr::NativeBufferProducer* native_buffer =
- static_cast<android::dvr::NativeBufferProducer*>(buffer);
- ATRACE_ASYNC_END("BufferDraw", native_buffer->buffer()->id());
- bool do_post = true;
- if (self->buffer_already_posted) {
- // Check that the buffer is the one we expect, but handle it if this happens
- // in production by allowing this buffer to post on top of the previous one.
- LOG_FATAL_IF(native_buffer != self->current_buffer);
- if (native_buffer == self->current_buffer) {
- do_post = false;
- if (fence_fd >= 0)
- close(fence_fd);
- }
- }
- if (do_post) {
- ATRACE_ASYNC_BEGIN("BufferPost", native_buffer->buffer()->id());
- self->Post(native_buffer, fence_fd);
- }
- self->buffer_already_posted = false;
- self->current_buffer = nullptr;
-
- return android::NO_ERROR;
-}
-
-int DvrGraphicsContext::CancelBuffer(ANativeWindow* window,
- ANativeWindowBuffer* buffer,
- int fence_fd) {
- ATRACE_NAME("DvrGraphicsContext::CancelBuffer");
- ALOGI_IF(TRACE, "DvrGraphicsContext::CancelBuffer: fence_fd: %d", fence_fd);
-
- DvrGraphicsContext* self = getSelf(window);
- LOG_ALWAYS_FATAL_IF(self->graphics_api != DVR_GRAPHICS_API_VULKAN);
- std::lock_guard<std::mutex> autolock(self->lock_);
-
- android::dvr::NativeBufferProducer* native_buffer =
- static_cast<android::dvr::NativeBufferProducer*>(buffer);
- ATRACE_ASYNC_END("BufferDraw", native_buffer->buffer()->id());
- ATRACE_INT("CancelBuffer", native_buffer->buffer()->id());
- bool do_enqueue = true;
- if (self->buffer_already_posted) {
- // Check that the buffer is the one we expect, but handle it if this happens
- // in production by returning this buffer to the buffer queue.
- LOG_FATAL_IF(native_buffer != self->current_buffer);
- if (native_buffer == self->current_buffer) {
- do_enqueue = false;
- }
- }
- if (do_enqueue) {
- self->buffer_queue->Enqueue(native_buffer);
- }
- if (fence_fd >= 0)
- close(fence_fd);
- self->buffer_already_posted = false;
- self->current_buffer = nullptr;
-
- return android::NO_ERROR;
-}
-
-int DvrGraphicsContext::Query(const ANativeWindow* window, int what,
- int* value) {
- DvrGraphicsContext* self = getSelf(const_cast<ANativeWindow*>(window));
- LOG_ALWAYS_FATAL_IF(self->graphics_api != DVR_GRAPHICS_API_VULKAN);
- std::lock_guard<std::mutex> autolock(self->lock_);
-
- switch (what) {
- case NATIVE_WINDOW_WIDTH:
- *value = self->width;
- return android::NO_ERROR;
- case NATIVE_WINDOW_HEIGHT:
- *value = self->height;
- return android::NO_ERROR;
- case NATIVE_WINDOW_FORMAT:
- *value = self->format;
- return android::NO_ERROR;
- case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS:
- *value = 1;
- return android::NO_ERROR;
- case NATIVE_WINDOW_CONCRETE_TYPE:
- *value = NATIVE_WINDOW_SURFACE;
- return android::NO_ERROR;
- case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
- *value = 1;
- return android::NO_ERROR;
- case NATIVE_WINDOW_DEFAULT_WIDTH:
- *value = self->width;
- return android::NO_ERROR;
- case NATIVE_WINDOW_DEFAULT_HEIGHT:
- *value = self->height;
- return android::NO_ERROR;
- case NATIVE_WINDOW_TRANSFORM_HINT:
- *value = 0;
- return android::NO_ERROR;
- }
-
- *value = 0;
- return android::BAD_VALUE;
-}
-
-int DvrGraphicsContext::Perform(ANativeWindow* window, int operation, ...) {
- DvrGraphicsContext* self = getSelf(window);
- LOG_ALWAYS_FATAL_IF(self->graphics_api != DVR_GRAPHICS_API_VULKAN);
- std::lock_guard<std::mutex> autolock(self->lock_);
-
- va_list args;
- va_start(args, operation);
-
- // TODO(eieio): The following operations are not used at this time. They are
- // included here to help document which operations may be useful and what
- // parameters they take.
- switch (operation) {
- case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: {
- int w = va_arg(args, int);
- int h = va_arg(args, int);
- ALOGD_IF(TRACE, "NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: w=%d h=%d", w, h);
- return android::NO_ERROR;
- }
-
- case NATIVE_WINDOW_SET_BUFFERS_FORMAT: {
- int format = va_arg(args, int);
- ALOGD_IF(TRACE, "NATIVE_WINDOW_SET_BUFFERS_FORMAT: format=%d", format);
- return android::NO_ERROR;
- }
-
- case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: {
- int transform = va_arg(args, int);
- ALOGD_IF(TRACE, "NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: transform=%d",
- transform);
- return android::NO_ERROR;
- }
-
- case NATIVE_WINDOW_SET_USAGE: {
- int usage = va_arg(args, int);
- ALOGD_IF(TRACE, "NATIVE_WINDOW_SET_USAGE: usage=%d", usage);
- return android::NO_ERROR;
- }
-
- case NATIVE_WINDOW_CONNECT:
- case NATIVE_WINDOW_DISCONNECT:
- case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY:
- case NATIVE_WINDOW_API_CONNECT:
- case NATIVE_WINDOW_API_DISCONNECT:
- // TODO(eieio): we should implement these
- return android::NO_ERROR;
-
- case NATIVE_WINDOW_SET_BUFFER_COUNT: {
- int buffer_count = va_arg(args, int);
- ALOGD_IF(TRACE, "NATIVE_WINDOW_SET_BUFFER_COUNT: bufferCount=%d",
- buffer_count);
- return android::NO_ERROR;
- }
- case NATIVE_WINDOW_SET_BUFFERS_DATASPACE: {
- android_dataspace_t data_space =
- static_cast<android_dataspace_t>(va_arg(args, int));
- ALOGD_IF(TRACE, "NATIVE_WINDOW_SET_BUFFERS_DATASPACE: dataSpace=%d",
- data_space);
- return android::NO_ERROR;
- }
- case NATIVE_WINDOW_SET_SCALING_MODE: {
- int mode = va_arg(args, int);
- ALOGD_IF(TRACE, "NATIVE_WINDOW_SET_SCALING_MODE: mode=%d", mode);
- return android::NO_ERROR;
- }
-
- case NATIVE_WINDOW_LOCK:
- case NATIVE_WINDOW_UNLOCK_AND_POST:
- case NATIVE_WINDOW_SET_CROP:
- case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP:
- return android::INVALID_OPERATION;
- }
-
- return android::NAME_NOT_FOUND;
-}
-
-int DvrGraphicsContext::DequeueBuffer_DEPRECATED(ANativeWindow* window,
- ANativeWindowBuffer** buffer) {
- int fence_fd = -1;
- int ret = DequeueBuffer(window, buffer, &fence_fd);
-
- // wait for fence
- if (ret == android::NO_ERROR && fence_fd != -1)
- close(fence_fd);
-
- return ret;
-}
-
-int DvrGraphicsContext::CancelBuffer_DEPRECATED(ANativeWindow* window,
- ANativeWindowBuffer* buffer) {
- return CancelBuffer(window, buffer, -1);
-}
-
-int DvrGraphicsContext::QueueBuffer_DEPRECATED(ANativeWindow* window,
- ANativeWindowBuffer* buffer) {
- return QueueBuffer(window, buffer, -1);
-}
-
-int DvrGraphicsContext::LockBuffer_DEPRECATED(ANativeWindow* /*window*/,
- ANativeWindowBuffer* /*buffer*/) {
- return android::NO_ERROR;
-}
-// End ANativeWindow implementation
-
-int dvrSetEdsPose(DvrGraphicsContext* graphics_context,
- float32x4_t render_pose_orientation,
- float32x4_t render_pose_translation) {
- ATRACE_NAME("dvrSetEdsPose");
- if (!graphics_context->current_buffer) {
- ALOGE("dvrBeginRenderFrame must be called before dvrSetEdsPose");
- return -EPERM;
- }
-
- // When late-latching is enabled, the pose buffer is written by the GPU, so
- // we don't touch it here.
- float32x4_t is_late_latch = DVR_POSE_LATE_LATCH;
- if (render_pose_orientation[0] != is_late_latch[0]) {
- volatile DisplaySurfaceMetadata* data = graphics_context->surface_metadata;
- uint32_t buffer_index = 0;
- ALOGE_IF(TRACE, "write pose index %d %f %f", buffer_index,
- render_pose_orientation[0], render_pose_orientation[1]);
- data->orientation[buffer_index] = render_pose_orientation;
- data->translation[buffer_index] = render_pose_translation;
- }
-
- return 0;
-}
-
-int dvrBeginRenderFrameEds(DvrGraphicsContext* graphics_context,
- float32x4_t render_pose_orientation,
- float32x4_t render_pose_translation) {
- ATRACE_NAME("dvrBeginRenderFrameEds");
- LOG_ALWAYS_FATAL_IF(graphics_context->graphics_api != DVR_GRAPHICS_API_GLES);
- CHECK_GL();
- // Grab a buffer from the queue and set its pose.
- if (!graphics_context->current_buffer) {
- graphics_context->current_buffer =
- graphics_context->buffer_queue->Dequeue();
- }
-
- int ret = dvrSetEdsPose(graphics_context, render_pose_orientation,
- render_pose_translation);
- if (ret < 0)
- return ret;
-
- ATRACE_ASYNC_BEGIN("BufferDraw",
- graphics_context->current_buffer->buffer()->id());
-
- {
- ATRACE_NAME("glEGLImageTargetTexture2DOES");
- // Bind the texture to the latest buffer in the queue.
- for (int i = 0; i < graphics_context->gl.texture_count; ++i) {
- glBindTexture(graphics_context->gl.texture_target_type,
- graphics_context->gl.texture_id[i]);
- glEGLImageTargetTexture2DOES(
- graphics_context->gl.texture_target_type,
- graphics_context->current_buffer->image_khr(i));
- }
- glBindTexture(graphics_context->gl.texture_target_type, 0);
- }
- CHECK_GL();
- return 0;
-}
-
-int dvrBeginRenderFrameEdsVk(DvrGraphicsContext* graphics_context,
- float32x4_t render_pose_orientation,
- float32x4_t render_pose_translation,
- VkSemaphore acquire_semaphore,
- VkFence acquire_fence,
- uint32_t* swapchain_image_index,
- VkImageView* swapchain_image_view) {
- ATRACE_NAME("dvrBeginRenderFrameEds");
- LOG_ALWAYS_FATAL_IF(graphics_context->graphics_api !=
- DVR_GRAPHICS_API_VULKAN);
-
- // Acquire a swapchain image. This calls Dequeue() internally.
- VkResult result = vkAcquireNextImageKHR(
- graphics_context->vk.device, graphics_context->vk.swapchain, UINT64_MAX,
- acquire_semaphore, acquire_fence, swapchain_image_index);
- if (result != VK_SUCCESS)
- return -EINVAL;
-
- // Set the pose pose.
- int ret = dvrSetEdsPose(graphics_context, render_pose_orientation,
- render_pose_translation);
- if (ret < 0)
- return ret;
- *swapchain_image_view =
- graphics_context->vk.swapchain_image_views[*swapchain_image_index];
- return 0;
-}
-
-int dvrBeginRenderFrame(DvrGraphicsContext* graphics_context) {
- return dvrBeginRenderFrameEds(graphics_context, DVR_POSE_NO_EDS,
- DVR_POSE_NO_EDS);
-}
-int dvrBeginRenderFrameVk(DvrGraphicsContext* graphics_context,
- VkSemaphore acquire_semaphore, VkFence acquire_fence,
- uint32_t* swapchain_image_index,
- VkImageView* swapchain_image_view) {
- return dvrBeginRenderFrameEdsVk(
- graphics_context, DVR_POSE_NO_EDS, DVR_POSE_NO_EDS, acquire_semaphore,
- acquire_fence, swapchain_image_index, swapchain_image_view);
-}
-
-int dvrBeginRenderFrameLateLatch(DvrGraphicsContext* graphics_context,
- uint32_t /*flags*/,
- uint32_t target_vsync_count, int num_views,
- const float** projection_matrices,
- const float** eye_from_head_matrices,
- const float** pose_offset_matrices,
- uint32_t* out_late_latch_buffer_id) {
- if (!graphics_context->late_latch) {
- return -EPERM;
- }
- if (num_views > DVR_GRAPHICS_SURFACE_MAX_VIEWS) {
- ALOGE("dvrBeginRenderFrameLateLatch called with too many views.");
- return -EINVAL;
- }
- dvrBeginRenderFrameEds(graphics_context, DVR_POSE_LATE_LATCH,
- DVR_POSE_LATE_LATCH);
- auto& ll = graphics_context->late_latch;
- // TODO(jbates) Need to change this shader so that it dumps the single
- // captured pose for both eyes into the display surface metadata buffer at
- // the right index.
- android::dvr::LateLatchInput input;
- memset(&input, 0, sizeof(input));
- for (int i = 0; i < num_views; ++i) {
- memcpy(input.proj_mat + i, *(projection_matrices + i), 16 * sizeof(float));
- memcpy(input.eye_from_head_mat + i, *(eye_from_head_matrices + i),
- 16 * sizeof(float));
- memcpy(input.pose_offset + i, *(pose_offset_matrices + i),
- 16 * sizeof(float));
- }
- input.pose_index =
- target_vsync_count & android::dvr::kPoseAsyncBufferIndexMask;
- input.render_pose_index =
- graphics_context->current_buffer->surface_buffer_index();
- ll->AddLateLatch(input);
- *out_late_latch_buffer_id = ll->output_buffer_id();
- return 0;
-}
-
-extern "C" int dvrGraphicsWaitNextFrame(
- DvrGraphicsContext* graphics_context, int64_t start_delay_ns,
- DvrFrameSchedule* out_next_frame_schedule) {
- start_delay_ns = std::max(start_delay_ns, static_cast<int64_t>(0));
-
- // We only do one-shot timers:
- int64_t wake_time_ns = 0;
-
- uint32_t current_frame_vsync;
- int64_t current_frame_scheduled_finish_ns;
- int64_t vsync_period_ns;
-
- int fetch_schedule_result = graphics_context->vsync_client->GetSchedInfo(
- &vsync_period_ns, ¤t_frame_scheduled_finish_ns,
- ¤t_frame_vsync);
- if (fetch_schedule_result == 0) {
- wake_time_ns = current_frame_scheduled_finish_ns + start_delay_ns;
- // If the last wakeup time is still in the future, use it instead to avoid
- // major schedule jumps when applications call WaitNextFrame with
- // aggressive offsets.
- int64_t now = android::dvr::GetSystemClockNs();
- if (android::dvr::TimestampGT(wake_time_ns - vsync_period_ns, now)) {
- wake_time_ns -= vsync_period_ns;
- --current_frame_vsync;
- }
- // If the next wakeup time is in the past, add a vsync period to keep the
- // application on schedule.
- if (android::dvr::TimestampLT(wake_time_ns, now)) {
- wake_time_ns += vsync_period_ns;
- ++current_frame_vsync;
- }
- } else {
- ALOGE("Error getting frame schedule because: %s",
- strerror(-fetch_schedule_result));
- // Sleep for a vsync period to avoid cascading failure.
- wake_time_ns = android::dvr::GetSystemClockNs() +
- graphics_context->display_metrics.vsync_period_ns;
- }
-
- // Adjust nsec to [0..999,999,999].
- struct itimerspec wake_time;
- wake_time.it_interval.tv_sec = 0;
- wake_time.it_interval.tv_nsec = 0;
- wake_time.it_value = android::dvr::NsToTimespec(wake_time_ns);
- bool sleep_result =
- timerfd_settime(graphics_context->timerfd.Get(), TFD_TIMER_ABSTIME,
- &wake_time, nullptr) == 0;
- if (sleep_result) {
- ATRACE_NAME("sleep");
- uint64_t expirations = 0;
- sleep_result = read(graphics_context->timerfd.Get(), &expirations,
- sizeof(uint64_t)) == sizeof(uint64_t);
- if (!sleep_result) {
- ALOGE("Error: timerfd read failed");
- }
- } else {
- ALOGE("Error: timerfd_settime failed because: %s", strerror(errno));
- }
-
- auto& frame_history = graphics_context->frame_history;
- frame_history.CheckForFinishedFrames();
- if (fetch_schedule_result == 0) {
- uint32_t next_frame_vsync =
- current_frame_vsync +
- frame_history.PredictNextFrameVsyncInterval(vsync_period_ns);
- int64_t next_frame_scheduled_finish =
- (wake_time_ns - start_delay_ns) + vsync_period_ns;
- frame_history.OnFrameStart(next_frame_vsync, next_frame_scheduled_finish);
- if (out_next_frame_schedule) {
- out_next_frame_schedule->vsync_count = next_frame_vsync;
- out_next_frame_schedule->scheduled_frame_finish_ns =
- next_frame_scheduled_finish;
- }
- } else {
- frame_history.OnFrameStart(UINT32_MAX, -1);
- }
-
- return (fetch_schedule_result == 0 && sleep_result) ? 0 : -1;
-}
-
-extern "C" void dvrGraphicsPostEarly(DvrGraphicsContext* graphics_context) {
- ATRACE_NAME("dvrGraphicsPostEarly");
- ALOGI_IF(TRACE, "dvrGraphicsPostEarly");
-
- LOG_ALWAYS_FATAL_IF(graphics_context->graphics_api != DVR_GRAPHICS_API_GLES);
-
- // Note that this function can be called before or after
- // dvrBeginRenderFrame.
- if (!graphics_context->buffer_already_posted) {
- graphics_context->buffer_already_posted = true;
-
- if (!graphics_context->current_buffer) {
- graphics_context->current_buffer =
- graphics_context->buffer_queue->Dequeue();
- }
-
- auto buffer = graphics_context->current_buffer->buffer().get();
- ATRACE_ASYNC_BEGIN("BufferPost", buffer->id());
- int result = buffer->Post<void>(LocalHandle());
- if (result < 0)
- ALOGE("Buffer post failed: %d (%s)", result, strerror(-result));
- }
-}
-
-int dvrPresent(DvrGraphicsContext* graphics_context) {
- LOG_ALWAYS_FATAL_IF(graphics_context->graphics_api != DVR_GRAPHICS_API_GLES);
-
- std::array<char, 128> buf;
- snprintf(buf.data(), buf.size(), "dvrPresent|vsync=%d|",
- graphics_context->frame_history.GetCurrentFrameVsync());
- ATRACE_NAME(buf.data());
-
- if (!graphics_context->current_buffer) {
- ALOGE("Error: dvrPresent called without dvrBeginRenderFrame");
- return -EPERM;
- }
-
- LocalHandle fence_fd =
- android::dvr::CreateGLSyncAndFlush(graphics_context->gl.egl_display);
-
- ALOGI_IF(TRACE, "PostBuffer: buffer_id=%d, fence_fd=%d",
- graphics_context->current_buffer->buffer()->id(), fence_fd.Get());
- ALOGW_IF(!graphics_context->display_surface->visible(),
- "PostBuffer: Posting buffer on invisible surface!!!");
-
- auto buffer = graphics_context->current_buffer->buffer().get();
- ATRACE_ASYNC_END("BufferDraw", buffer->id());
- if (!graphics_context->buffer_already_posted) {
- ATRACE_ASYNC_BEGIN("BufferPost", buffer->id());
- int result = buffer->Post<void>(fence_fd);
- if (result < 0)
- ALOGE("Buffer post failed: %d (%s)", result, strerror(-result));
- }
-
- graphics_context->frame_history.OnFrameSubmit(std::move(fence_fd));
- graphics_context->buffer_already_posted = false;
- graphics_context->current_buffer = nullptr;
- return 0;
-}
-
-int dvrPresentVk(DvrGraphicsContext* graphics_context,
- VkSemaphore submit_semaphore, uint32_t swapchain_image_index) {
- LOG_ALWAYS_FATAL_IF(graphics_context->graphics_api !=
- DVR_GRAPHICS_API_VULKAN);
-
- std::array<char, 128> buf;
- snprintf(buf.data(), buf.size(), "dvrPresent|vsync=%d|",
- graphics_context->frame_history.GetCurrentFrameVsync());
- ATRACE_NAME(buf.data());
-
- if (!graphics_context->current_buffer) {
- ALOGE("Error: dvrPresentVk called without dvrBeginRenderFrameVk");
- return -EPERM;
- }
-
- // Present the specified image. Internally, this gets a fence from the
- // Vulkan driver and passes it to DvrGraphicsContext::Post(),
- // which in turn passes it to buffer->Post() and adds it to frame_history.
- VkPresentInfoKHR present_info = {};
- present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
- present_info.swapchainCount = 1;
- present_info.pSwapchains = &graphics_context->vk.swapchain;
- present_info.pImageIndices = &swapchain_image_index;
- present_info.waitSemaphoreCount =
- (submit_semaphore != VK_NULL_HANDLE) ? 1 : 0;
- present_info.pWaitSemaphores = &submit_semaphore;
- VkResult result =
- vkQueuePresentKHR(graphics_context->vk.present_queue, &present_info);
- if (result != VK_SUCCESS) {
- return -EINVAL;
- }
-
- return 0;
-}
-
-extern "C" int dvrGetFrameScheduleResults(DvrGraphicsContext* context,
- DvrFrameScheduleResult* results,
- int in_result_count) {
- if (!context || !results)
- return -EINVAL;
-
- return context->frame_history.GetPreviousFrameResults(results,
- in_result_count);
-}
-
-extern "C" void dvrGraphicsSurfaceSetVisible(
- DvrGraphicsContext* graphics_context, int visible) {
- graphics_context->display_surface->SetVisible(visible);
-}
-
-extern "C" int dvrGraphicsSurfaceGetVisible(
- DvrGraphicsContext* graphics_context) {
- return !!graphics_context->display_surface->visible();
-}
-
-extern "C" void dvrGraphicsSurfaceSetZOrder(
- DvrGraphicsContext* graphics_context, int z_order) {
- graphics_context->display_surface->SetZOrder(z_order);
-}
-
-extern "C" int dvrGraphicsSurfaceGetZOrder(
- DvrGraphicsContext* graphics_context) {
- return graphics_context->display_surface->z_order();
-}
diff --git a/libs/vr/libdisplay/include/dvr/graphics.h b/libs/vr/libdisplay/include/dvr/graphics.h
deleted file mode 100644
index c83a698..0000000
--- a/libs/vr/libdisplay/include/dvr/graphics.h
+++ /dev/null
@@ -1,450 +0,0 @@
-#ifndef DVR_GRAPHICS_H_
-#define DVR_GRAPHICS_H_
-
-#include <EGL/egl.h>
-#include <sys/cdefs.h>
-
-#ifdef __ARM_NEON
-#include <arm_neon.h>
-#else
-#ifndef __FLOAT32X4T_86
-#define __FLOAT32X4T_86
-typedef float float32x4_t __attribute__((__vector_size__(16)));
-typedef struct float32x4x4_t { float32x4_t val[4]; };
-#endif
-#endif
-
-#ifndef VK_USE_PLATFORM_ANDROID_KHR
-#define VK_USE_PLATFORM_ANDROID_KHR 1
-#endif
-#include <vulkan/vulkan.h>
-
-__BEGIN_DECLS
-
-// Display surface parameters used to specify display surface options.
-enum {
- DVR_SURFACE_PARAMETER_NONE = 0,
- // WIDTH
- DVR_SURFACE_PARAMETER_WIDTH_IN,
- // HEIGHT
- DVR_SURFACE_PARAMETER_HEIGHT_IN,
- // DISABLE_DISTORTION
- DVR_SURFACE_PARAMETER_DISABLE_DISTORTION_IN,
- // DISABLE_STABILIZATION
- DVR_SURFACE_PARAMETER_DISABLE_STABILIZATION_IN,
- // Disable chromatic aberration correction
- DVR_SURFACE_PARAMETER_DISABLE_CAC_IN,
- // ENABLE_LATE_LATCH: Enable late latching of pose data for application
- // GPU shaders.
- DVR_SURFACE_PARAMETER_ENABLE_LATE_LATCH_IN,
- // VISIBLE
- DVR_SURFACE_PARAMETER_VISIBLE_IN,
- // Z_ORDER
- DVR_SURFACE_PARAMETER_Z_ORDER_IN,
- // EXCLUDE_FROM_BLUR
- DVR_SURFACE_PARAMETER_EXCLUDE_FROM_BLUR_IN,
- // BLUR_BEHIND
- DVR_SURFACE_PARAMETER_BLUR_BEHIND_IN,
- // DISPLAY_WIDTH
- DVR_SURFACE_PARAMETER_DISPLAY_WIDTH_OUT,
- // DISPLAY_HEIGHT
- DVR_SURFACE_PARAMETER_DISPLAY_HEIGHT_OUT,
- // SURFACE_WIDTH: Returns width of allocated surface buffer.
- DVR_SURFACE_PARAMETER_SURFACE_WIDTH_OUT,
- // SURFACE_HEIGHT: Returns height of allocated surface buffer.
- DVR_SURFACE_PARAMETER_SURFACE_HEIGHT_OUT,
- // INTER_LENS_METERS: Returns float value in meters, the distance between
- // lenses.
- DVR_SURFACE_PARAMETER_INTER_LENS_METERS_OUT,
- // LEFT_FOV_LRBT: Return storage must have room for array of 4 floats (in
- // radians). The layout is left, right, bottom, top as indicated by LRBT.
- DVR_SURFACE_PARAMETER_LEFT_FOV_LRBT_OUT,
- // RIGHT_FOV_LRBT: Return storage must have room for array of 4 floats (in
- // radians). The layout is left, right, bottom, top as indicated by LRBT.
- DVR_SURFACE_PARAMETER_RIGHT_FOV_LRBT_OUT,
- // VSYNC_PERIOD: Returns the period of the display refresh (in
- // nanoseconds per refresh), as a 64-bit unsigned integer.
- DVR_SURFACE_PARAMETER_VSYNC_PERIOD_OUT,
- // SURFACE_TEXTURE_TARGET_TYPE: Returns the type of texture used as the render
- // target.
- DVR_SURFACE_PARAMETER_SURFACE_TEXTURE_TARGET_TYPE_OUT,
- // SURFACE_TEXTURE_TARGET_ID: Returns the texture ID used as the render
- // target.
- DVR_SURFACE_PARAMETER_SURFACE_TEXTURE_TARGET_ID_OUT,
- // Whether the surface needs to be flipped vertically before display. Default
- // is 0.
- DVR_SURFACE_PARAMETER_VERTICAL_FLIP_IN,
- // A bool indicating whether or not to create a GL context for the surface.
- // 0: don't create a context
- // Non-zero: create a context.
- // Default is 1.
- // If this value is 0, there must be a GLES 3.2 or greater context bound on
- // the current thread at the time dvrGraphicsContextCreate is called.
- DVR_SURFACE_PARAMETER_CREATE_GL_CONTEXT_IN,
- // Specify one of DVR_SURFACE_GEOMETRY_*.
- DVR_SURFACE_PARAMETER_GEOMETRY_IN,
- // FORMAT: One of DVR_SURFACE_FORMAT_RGBA_8888 or DVR_SURFACE_FORMAT_RGB_565.
- // Default is DVR_SURFACE_FORMAT_RGBA_8888.
- DVR_SURFACE_PARAMETER_FORMAT_IN,
- // GRAPHICS_API: One of DVR_SURFACE_GRAPHICS_API_GLES or
- // DVR_SURFACE_GRAPHICS_API_VULKAN. Default is GLES.
- DVR_SURFACE_PARAMETER_GRAPHICS_API_IN,
- // VK_INSTANCE: In Vulkan mode, the application creates a VkInstance and
- // passes it in.
- DVR_SURFACE_PARAMETER_VK_INSTANCE_IN,
- // VK_PHYSICAL_DEVICE: In Vulkan mode, the application passes in the
- // PhysicalDevice handle corresponding to the logical device passed to
- // VK_DEVICE.
- DVR_SURFACE_PARAMETER_VK_PHYSICAL_DEVICE_IN,
- // VK_DEVICE: In Vulkan mode, the application creates a VkDevice and
- // passes it in.
- DVR_SURFACE_PARAMETER_VK_DEVICE_IN,
- // VK_PRESENT_QUEUE: In Vulkan mode, the application selects a
- // presentation-compatible VkQueue and passes it in.
- DVR_SURFACE_PARAMETER_VK_PRESENT_QUEUE_IN,
- // VK_PRESENT_QUEUE_FAMILY: In Vulkan mode, the application passes in the
- // index of the queue family containing the VkQueue passed to
- // VK_PRESENT_QUEUE.
- DVR_SURFACE_PARAMETER_VK_PRESENT_QUEUE_FAMILY_IN,
- // VK_SWAPCHAIN_IMAGE_COUNT: In Vulkan mode, the number of swapchain images
- // will be returned here.
- DVR_SURFACE_PARAMETER_VK_SWAPCHAIN_IMAGE_COUNT_OUT,
- // VK_SWAPCHAIN_IMAGE_FORMAT: In Vulkan mode, the VkFormat of the swapchain
- // images will be returned here.
- DVR_SURFACE_PARAMETER_VK_SWAPCHAIN_IMAGE_FORMAT_OUT,
- // DIRECT: Whether the surface goes directly to the display or to the
- // compositor. Default is 0 (compositor). Only processes with either uid=root
- // (test tools) or uid validated by IsTrustedUid() may set this to 1.
- DVR_SURFACE_PARAMETER_DIRECT_IN,
-};
-
-enum {
- // Default surface type. One wide buffer with the left eye view in the left
- // half and the right eye view in the right half.
- DVR_SURFACE_GEOMETRY_SINGLE,
- // Separate buffers, one per eye. The width parameters still refer to the
- // total width (2 * eye view width).
- DVR_SURFACE_GEOMETRY_SEPARATE_2,
-};
-
-// Surface format. Gvr only supports RGBA_8888 and RGB_565 for now, so those are
-// the only formats we provide here.
-enum {
- DVR_SURFACE_FORMAT_RGBA_8888,
- DVR_SURFACE_FORMAT_RGB_565,
-};
-
-enum {
- // Graphics contexts are created for OpenGL ES client applications by default.
- DVR_GRAPHICS_API_GLES,
- // Create the graphics context for Vulkan client applications.
- DVR_GRAPHICS_API_VULKAN,
-};
-
-#define DVR_SURFACE_PARAMETER_IN(name, value) \
- { DVR_SURFACE_PARAMETER_##name##_IN, (value), NULL }
-#define DVR_SURFACE_PARAMETER_OUT(name, value) \
- { DVR_SURFACE_PARAMETER_##name##_OUT, 0, (value) }
-#define DVR_SURFACE_PARAMETER_LIST_END \
- { DVR_SURFACE_PARAMETER_NONE, 0, NULL }
-
-struct DvrSurfaceParameter {
- int32_t key;
- int64_t value;
- void* value_out;
-};
-
-// This is a convenience struct to hold the relevant information of the HMD
-// lenses.
-struct DvrLensInfo {
- float inter_lens_meters;
- float left_fov[4];
- float right_fov[4];
-};
-
-int dvrGetNativeDisplayDimensions(int* native_width, int* native_height);
-
-typedef struct DvrReadBuffer DvrReadBuffer;
-
-// Opaque struct that represents a graphics context, the texture swap chain,
-// and surfaces.
-typedef struct DvrGraphicsContext DvrGraphicsContext;
-
-// Create the graphics context. with the given parameters. The list of
-// parameters is terminated with an entry where key ==
-// DVR_SURFACE_PARAMETER_NONE. For example, the parameters array could be built
-// as follows:
-// int display_width = 0, display_height = 0;
-// int surface_width = 0, surface_height = 0;
-// float inter_lens_meters = 0.0f;
-// float left_fov[4] = {0.0f};
-// float right_fov[4] = {0.0f};
-// int disable_warp = 0;
-// DvrSurfaceParameter surface_params[] = {
-// DVR_SURFACE_PARAMETER_IN(DISABLE_DISTORTION, disable_warp),
-// DVR_SURFACE_PARAMETER_OUT(DISPLAY_WIDTH, &display_width),
-// DVR_SURFACE_PARAMETER_OUT(DISPLAY_HEIGHT, &display_height),
-// DVR_SURFACE_PARAMETER_OUT(SURFACE_WIDTH, &surface_width),
-// DVR_SURFACE_PARAMETER_OUT(SURFACE_HEIGHT, &surface_height),
-// DVR_SURFACE_PARAMETER_OUT(INTER_LENS_METERS, &inter_lens_meters),
-// DVR_SURFACE_PARAMETER_OUT(LEFT_FOV_LRBT, left_fov),
-// DVR_SURFACE_PARAMETER_OUT(RIGHT_FOV_LRBT, right_fov),
-// DVR_SURFACE_PARAMETER_LIST_END,
-// };
-int dvrGraphicsContextCreate(struct DvrSurfaceParameter* parameters,
- DvrGraphicsContext** return_graphics_context);
-
-// Destroy the graphics context.
-void dvrGraphicsContextDestroy(DvrGraphicsContext* graphics_context);
-
-// For every frame a schedule is decided by the system compositor. A sample
-// schedule for two frames is shown below.
-//
-// | | |
-// |-----------------|------|-----------------|------|
-// | | |
-// V0 A1 V1 A2 V2
-//
-// V0, V1, and V2 are display vsync events. Vsync events are uniquely identified
-// throughout the DVR system by a vsync count maintained by the system
-// compositor.
-//
-// A1 and A2 indicate when the application should finish rendering its frame,
-// including all GPU work. Under normal circumstances the scheduled finish
-// finish time will be set a few milliseconds before the vsync time, to give the
-// compositor time to perform distortion and EDS on the app's buffer. For apps
-// that don't use system distortion the scheduled frame finish time will be
-// closer to the vsync time. Other factors can also effect the scheduled frame
-// finish time, e.g. whether or not the System UI is being displayed.
-typedef struct DvrFrameSchedule {
- // vsync_count is used as a frame identifier.
- uint32_t vsync_count;
-
- // The time when the app should finish rendering its frame, including all GPU
- // work.
- int64_t scheduled_frame_finish_ns;
-} DvrFrameSchedule;
-
-// Sleep until it's time to render the next frame. This should be the first
-// function called as part of an app's render loop, which normally looks like
-// this:
-//
-// while (1) {
-// DvrFrameSchedule schedule;
-// dvrGraphicsWaitNextFrame(..., &schedule); // Sleep until it's time to
-// // render the next frame
-// pose = dvrPoseGet(schedule.vsync_count);
-// dvrBeginRenderFrame(...);
-// <render a frame using the pose>
-// dvrPresent(...); // Post the buffer
-// }
-//
-// |start_delay_ns| adjusts how long this function blocks the app from starting
-// its next frame. If |start_delay_ns| is 0, the function waits until the
-// scheduled frame finish time for the current frame, which gives the app one
-// full vsync period to render the next frame. If the app needs less than a full
-// vysnc period to render the frame, pass in a non-zero |start_delay_ns| to
-// delay the start of frame rendering further. For example, if the vsync period
-// is 11.1ms and the app takes 6ms to render a frame, consider setting this to
-// 5ms (note that the value is in nanoseconds, so 5,000,000ns) so that the app
-// finishes the frame closer to the scheduled frame finish time. Delaying the
-// start of rendering allows the app to use a more up-to-date pose for
-// rendering.
-// |start_delay_ns| must be a positive value or 0. If you're unsure what to set
-// for |start_delay_ns|, use 0.
-//
-// |out_next_frame_schedule| is an output parameter that will contain the
-// schedule for the next frame. It can be null. This function returns a negative
-// error code on failure.
-int dvrGraphicsWaitNextFrame(DvrGraphicsContext* graphics_context,
- int64_t start_delay_ns,
- DvrFrameSchedule* out_next_frame_schedule);
-
-// Prepares the graphics context's texture for rendering. This function should
-// be called once for each frame, ideally immediately before the first GL call
-// on the framebuffer which wraps the surface texture.
-//
-// For GL contexts, GL states are modified as follows by this function:
-// glBindTexture(GL_TEXTURE_2D, 0);
-//
-// @param[in] graphics_context The DvrGraphicsContext.
-// @param[in] render_pose_orientation Head pose orientation that rendering for
-// this frame will be based off of. This must be an unmodified value
-// from DvrPoseAsync, returned by dvrPoseGet.
-// @param[in] render_pose_translation Head pose translation that rendering for
-// this frame will be based off of. This must be an unmodified value
-// from DvrPoseAsync, returned by dvrPoseGet.
-// @return 0 on success or a negative error code on failure.
-// Check GL errors with glGetError for other error conditions.
-int dvrBeginRenderFrameEds(DvrGraphicsContext* graphics_context,
- float32x4_t render_pose_orientation,
- float32x4_t render_pose_translation);
-int dvrBeginRenderFrameEdsVk(DvrGraphicsContext* graphics_context,
- float32x4_t render_pose_orientation,
- float32x4_t render_pose_translation,
- VkSemaphore acquire_semaphore,
- VkFence acquire_fence,
- uint32_t* swapchain_image_index,
- VkImageView* swapchain_image_view);
-// Same as dvrBeginRenderFrameEds, but with no EDS (asynchronous reprojection).
-//
-// For GL contexts, GL states are modified as follows by this function:
-// glBindTexture(GL_TEXTURE_2D, 0);
-//
-// @param[in] graphics_context The DvrGraphicsContext.
-// @return 0 on success or a negative error code on failure.
-// Check GL errors with glGetError for other error conditions.
-int dvrBeginRenderFrame(DvrGraphicsContext* graphics_context);
-int dvrBeginRenderFrameVk(DvrGraphicsContext* graphics_context,
- VkSemaphore acquire_semaphore, VkFence acquire_fence,
- uint32_t* swapchain_image_index,
- VkImageView* swapchain_image_view);
-
-// Maximum number of views per surface buffer (for multiview, multi-eye, etc).
-#define DVR_GRAPHICS_SURFACE_MAX_VIEWS 4
-
-// Output data format of late latch shader. The application can bind all or part
-// of this data with the buffer ID returned by dvrBeginRenderFrameLateLatch.
-// This struct is compatible with std140 layout for use from shaders.
-struct __attribute__((__packed__)) DvrGraphicsLateLatchData {
- // Column-major order.
- float view_proj_matrix[DVR_GRAPHICS_SURFACE_MAX_VIEWS][16];
- // Column-major order.
- float view_matrix[DVR_GRAPHICS_SURFACE_MAX_VIEWS][16];
- // Quaternion for pose orientation from start space.
- float pose_orientation[4];
- // Pose translation from start space.
- float pose_translation[4];
-};
-
-// Begin render frame with late latching of pose data. This kicks off a compute
-// shader that will read the latest head pose and then compute and output
-// matrices that can be used by application shaders.
-//
-// Matrices are computed with the following pseudo code.
-// Pose pose = getLateLatchPose();
-// out.pose_orientation = pose.orientation;
-// out.pose_translation = pose.translation;
-// mat4 head_from_center = ComputeInverseMatrix(pose);
-// for each view:
-// out.viewMatrix[view] =
-// eye_from_head_matrices[view] * head_from_center *
-// pose_offset_matrices[view];
-// out.viewProjMatrix[view] =
-// projection_matrices[view] * out.viewMatrix[view];
-//
-// For GL contexts, GL states are modified as follows by this function:
-// glBindTexture(GL_TEXTURE_2D, 0);
-// glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);
-// glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, 0);
-// glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, 0);
-// glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, 0);
-// glUseProgram(0);
-//
-// @param[in] graphics_context The DvrGraphicsContext.
-// @param[in] flags Specify 0.
-// @param[in] target_vsync_count The target vsync count that this frame will
-// display at. This is used for pose prediction.
-// @param[in] num_views Number of matrices in each of the following matrix array
-// parameters. Typically 2 for left and right eye views. Maximum is
-// DVR_GRAPHICS_SURFACE_MAX_VIEWS.
-// @param[in] projection_matrices Array of pointers to |num_views| matrices with
-// column-major layout. These are the application projection
-// matrices.
-// @param[in] eye_from_head_matrices Array of pointers to |num_views| matrices
-// with column-major layout. See pseudo code for how these are used.
-// @param[in] pose_offset_matrices Array of pointers to |num_views| matrices
-// with column-major layout. See pseudo code for how these are used.
-// @param[out] out_late_latch_buffer_id The GL buffer ID of the output buffer of
-// of type DvrGraphicsLateLatchData.
-// @return 0 on success or a negative error code on failure.
-// Check GL errors with glGetError for other error conditions.
-int dvrBeginRenderFrameLateLatch(DvrGraphicsContext* graphics_context,
- uint32_t flags, uint32_t target_vsync_count,
- int num_views,
- const float** projection_matrices,
- const float** eye_from_head_matrices,
- const float** pose_offset_matrices,
- uint32_t* out_late_latch_buffer_id);
-
-// Present a frame for display.
-// This call is normally non-blocking, unless the internal buffer queue is full.
-// @return 0 on success or a negative error code on failure.
-int dvrPresent(DvrGraphicsContext* graphics_context);
-int dvrPresentVk(DvrGraphicsContext* graphics_context,
- VkSemaphore submit_semaphore, uint32_t swapchain_image_index);
-
-// Post the next buffer early. This allows the application to race with either
-// the async EDS process or the scanline for applications that are not using
-// system distortion. When this is called, the next buffer in the queue is
-// posted for display. It is up to the application to kick its GPU rendering
-// work in time. If the rendering is incomplete there will be significant,
-// undesirable tearing artifacts.
-// It is not recommended to use this feature with system distortion.
-void dvrGraphicsPostEarly(DvrGraphicsContext* graphics_context);
-
-// Used to retrieve frame measurement timings from dvrGetFrameScheduleResults().
-typedef struct DvrFrameScheduleResult {
- // vsync_count is used as a frame identifier.
- uint32_t vsync_count;
-
- // The app's scheduled frame finish time.
- int64_t scheduled_frame_finish_ns;
-
- // The difference (in nanoseconds) between the scheduled finish time and the
- // actual finish time.
- //
- // A value of +2ms for frame_finish_offset_ns indicates the app's frame was
- // late and may have been skipped by the compositor for that vsync. A value of
- // -1ms indicates the app's frame finished just ahead of schedule, as
- // desired. A value of -6ms indicates the app's frame finished well ahead of
- // schedule for that vsync. In that case the app may have unnecessary visual
- // latency. Consider using the start_delay_ns parameter in
- // dvrGraphicsWaitNextFrame() to align the app's frame finish time closer to
- // the scheduled finish time.
- int64_t frame_finish_offset_ns;
-} DvrFrameScheduleResult;
-
-// Retrieve the latest frame schedule results for the app. To collect all the
-// results this should be called each frame. The results for each frame are
-// returned only once.
-// The number of results written to |results| is returned on success, or a
-// negative error code on failure.
-// |graphics_context| is the context to retrieve frame schedule results for.
-// |results| is an array that will contain the frame schedule results.
-// |result_count| is the size of the |results| array. It's recommended to pass
-// in an array with 2 elements to ensure results for all frames are collected.
-int dvrGetFrameScheduleResults(DvrGraphicsContext* graphics_context,
- DvrFrameScheduleResult* results,
- int result_count);
-
-// Make the surface visible or hidden based on |visible|.
-// 0: hidden, Non-zero: visible.
-void dvrGraphicsSurfaceSetVisible(DvrGraphicsContext* graphics_context,
- int visible);
-
-// Returns surface visilibity last requested by the client.
-int dvrGraphicsSurfaceGetVisible(DvrGraphicsContext* graphics_context);
-
-// Returns surface z order last requested by the client.
-int dvrGraphicsSurfaceGetZOrder(DvrGraphicsContext* graphics_context);
-
-// Sets the compositor z-order of the surface. Higher values display on
-// top of lower values.
-void dvrGraphicsSurfaceSetZOrder(DvrGraphicsContext* graphics_context,
- int z_order);
-
-typedef struct DvrVideoMeshSurface DvrVideoMeshSurface;
-
-DvrVideoMeshSurface* dvrGraphicsVideoMeshSurfaceCreate(
- DvrGraphicsContext* graphics_context);
-void dvrGraphicsVideoMeshSurfaceDestroy(DvrVideoMeshSurface* surface);
-
-// Present a VideoMeshSurface with the current video mesh transfromation matrix.
-void dvrGraphicsVideoMeshSurfacePresent(DvrGraphicsContext* graphics_context,
- DvrVideoMeshSurface* surface,
- const int eye, const float* transform);
-
-__END_DECLS
-
-#endif // DVR_GRAPHICS_H_
diff --git a/libs/vr/libdisplay/include/private/dvr/dummy_native_window.h b/libs/vr/libdisplay/include/private/dvr/dummy_native_window.h
deleted file mode 100644
index b03eeaa..0000000
--- a/libs/vr/libdisplay/include/private/dvr/dummy_native_window.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef ANDROID_DVR_DUMMY_NATIVE_WINDOW_H_
-#define ANDROID_DVR_DUMMY_NATIVE_WINDOW_H_
-
-#include <android/native_window.h>
-#include <ui/ANativeObjectBase.h>
-
-namespace android {
-namespace dvr {
-
-// DummyNativeWindow is an implementation of ANativeWindow that is
-// essentially empty and is used as a surface placeholder during context
-// creation for contexts that we don't intend to call eglSwapBuffers on.
-class DummyNativeWindow
- : public ANativeObjectBase<ANativeWindow, DummyNativeWindow,
- LightRefBase<DummyNativeWindow> > {
- public:
- DummyNativeWindow();
-
- private:
- static int Query(const ANativeWindow* window, int what, int* value);
- static int Perform(ANativeWindow* window, int operation, ...);
-
- DummyNativeWindow(const DummyNativeWindow&) = delete;
- void operator=(DummyNativeWindow&) = delete;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_DUMMY_NATIVE_WINDOW_H_
diff --git a/libs/vr/libdisplay/include/private/dvr/frame_history.h b/libs/vr/libdisplay/include/private/dvr/frame_history.h
deleted file mode 100644
index 53e0717..0000000
--- a/libs/vr/libdisplay/include/private/dvr/frame_history.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef ANDROID_DVR_FRAME_HISTORY_H_
-#define ANDROID_DVR_FRAME_HISTORY_H_
-
-#include <dvr/graphics.h>
-#include <pdx/file_handle.h>
-#include <private/dvr/ring_buffer.h>
-
-namespace android {
-namespace dvr {
-
-// FrameHistory tracks frame times from the start of rendering commands to when
-// the buffer is ready.
-class FrameHistory {
- public:
- FrameHistory();
- explicit FrameHistory(int pending_frame_buffer_size);
-
- void Reset(int pending_frame_buffer_size);
-
- // Call when starting rendering commands (i.e. dvrBeginRenderFrame).
- void OnFrameStart(uint32_t scheduled_vsync, int64_t scheduled_finish_ns);
-
- // Call when rendering commands are finished (i.e. dvrPresent).
- void OnFrameSubmit(android::pdx::LocalHandle&& fence);
-
- // Call once per frame to see if any pending frames have finished.
- void CheckForFinishedFrames();
-
- // Uses the recently completed frame render times to predict how long the next
- // frame will take, in vsync intervals. For example if the predicted frame
- // time is 10ms and the vsync interval is 11ms, this will return 1. If the
- // predicted frame time is 12ms and the vsync interval is 11ms, this will
- // return 2.
- int PredictNextFrameVsyncInterval(int64_t vsync_period_ns) const;
-
- // Returns results for recently completed frames. Each frame's result is
- // returned only once.
- int GetPreviousFrameResults(DvrFrameScheduleResult* results,
- int result_count);
-
- // Gets the vsync count for the most recently started frame. If there are no
- // started frames this will return UINT32_MAX.
- uint32_t GetCurrentFrameVsync() const;
-
- private:
- struct PendingFrame {
- int64_t start_ns;
- uint32_t scheduled_vsync;
- int64_t scheduled_finish_ns;
- android::pdx::LocalHandle fence;
-
- PendingFrame();
- PendingFrame(int64_t start_ns, uint32_t scheduled_vsync,
- int64_t scheduled_finish_ns,
- android::pdx::LocalHandle&& fence);
-
- PendingFrame(PendingFrame&&) = default;
- PendingFrame& operator=(PendingFrame&&) = default;
- PendingFrame(const PendingFrame&) = delete;
- PendingFrame& operator=(const PendingFrame&) = delete;
- };
-
- RingBuffer<PendingFrame> pending_frames_;
- RingBuffer<DvrFrameScheduleResult> finished_frames_;
- RingBuffer<int64_t> frame_duration_history_;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_FRAME_HISTORY_H_
diff --git a/libs/vr/libdisplay/include/private/dvr/gl_fenced_flush.h b/libs/vr/libdisplay/include/private/dvr/gl_fenced_flush.h
deleted file mode 100644
index 1d75335..0000000
--- a/libs/vr/libdisplay/include/private/dvr/gl_fenced_flush.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef ANDROID_DVR_GL_FENCED_FLUSH_H_
-#define ANDROID_DVR_GL_FENCED_FLUSH_H_
-
-#include <EGL/egl.h>
-#include <pdx/file_handle.h>
-
-namespace android {
-namespace dvr {
-
-// Creates a EGL_SYNC_NATIVE_FENCE_ANDROID and flushes. Returns the fence as a
-// file descriptor.
-pdx::LocalHandle CreateGLSyncAndFlush(EGLDisplay display);
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_GL_FENCED_FLUSH_H_
diff --git a/libs/vr/libdisplay/include/private/dvr/graphics_private.h b/libs/vr/libdisplay/include/private/dvr/graphics_private.h
deleted file mode 100644
index a08b0df..0000000
--- a/libs/vr/libdisplay/include/private/dvr/graphics_private.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef ANDROID_DVR_GRAPHICS_PRIVATE_H_
-#define ANDROID_DVR_GRAPHICS_PRIVATE_H_
-
-#ifdef __ARM_NEON
-#include <arm_neon.h>
-#else
-#ifndef __FLOAT32X4T_86
-#define __FLOAT32X4T_86
-typedef float float32x4_t __attribute__ ((__vector_size__ (16)));
-typedef struct float32x4x4_t { float32x4_t val[4]; };
-#endif
-#endif
-
-#include <sys/cdefs.h>
-
-#include <dvr/graphics.h>
-
-__BEGIN_DECLS
-
-#define kSurfaceBufferMaxCount 4
-#define kSurfaceViewMaxCount 4
-
-struct __attribute__((packed, aligned(16))) DisplaySurfaceMetadata {
- // Array of orientations and translations corresponding with surface buffers.
- // The index is associated with each allocated buffer by DisplaySurface and
- // communicated to clients.
- // The maximum number of buffers is hard coded here as 4 so that we can bind
- // this data structure in GPU shaders.
- float32x4_t orientation[kSurfaceBufferMaxCount];
- float32x4_t translation[kSurfaceBufferMaxCount];
-};
-
-// Sets the pose used by the system for EDS. If dvrBeginRenderFrameEds() or
-// dvrBeginRenderFrameLateLatch() are called instead of dvrBeginRenderFrame()
-// it's not necessary to call this function. If this function is used, the call
-// must be made after dvrBeginRenderFrame() and before dvrPresent().
-//
-// @param[in] graphics_context The DvrGraphicsContext.
-// @param[in] render_pose_orientation Head pose orientation that rendering for
-// this frame will be based off of. This must be an unmodified value
-// from DvrPoseAsync, returned by dvrPoseGet.
-// @param[in] render_pose_translation Head pose translation that rendering for
-// this frame will be based off of. This must be an unmodified value
-// from DvrPoseAsync, returned by dvrPoseGet.
-// @return 0 on success or a negative error code on failure.
-int dvrSetEdsPose(DvrGraphicsContext* graphics_context,
- float32x4_t render_pose_orientation,
- float32x4_t render_pose_translation);
-
-__END_DECLS
-
-#endif // ANDROID_DVR_GRAPHICS_PRIVATE_H_
diff --git a/libs/vr/libdisplay/include/private/dvr/late_latch.h b/libs/vr/libdisplay/include/private/dvr/late_latch.h
deleted file mode 100644
index c91d15c..0000000
--- a/libs/vr/libdisplay/include/private/dvr/late_latch.h
+++ /dev/null
@@ -1,190 +0,0 @@
-#ifndef ANDROID_DVR_LATE_LATCH_H_
-#define ANDROID_DVR_LATE_LATCH_H_
-
-#include <atomic>
-#include <thread>
-#include <vector>
-
-#include <dvr/dvr_display_types.h>
-#include <dvr/pose_client.h>
-#include <pdx/file_handle.h>
-#include <private/dvr/graphics/shader_program.h>
-#include <private/dvr/graphics/vr_gl_extensions.h>
-#include <private/dvr/graphics_private.h>
-#include <private/dvr/types.h>
-
-struct DvrPose;
-
-namespace android {
-namespace dvr {
-
-// Input data for late latch compute shader.
-struct LateLatchInput {
- // For app late latch:
- mat4 eye_from_head_mat[kSurfaceViewMaxCount];
- mat4 proj_mat[kSurfaceViewMaxCount];
- mat4 pose_offset[kSurfaceViewMaxCount];
- // For EDS late latch only:
- mat4 eds_mat1[kSurfaceViewMaxCount];
- mat4 eds_mat2[kSurfaceViewMaxCount];
- // For both app and EDS late latch:
- uint32_t pose_index;
- uint32_t render_pose_index;
-};
-
-// Output data for late latch shader. The application can use all or part of
-// this data by calling LateLatch::BindUniformBuffer.
-// This struct matches the layout of DvrGraphicsLateLatchData.
-struct LateLatchOutput {
- mat4 view_proj_matrix[kSurfaceViewMaxCount];
- mat4 view_matrix[kSurfaceViewMaxCount];
- vec4 pose_quaternion;
- vec4 pose_translation;
-};
-
-// LateLatch provides a facility for GL workloads to acquire a late-adjusted
-// model-view projection matrix, adjusted based on the position/quaternion pose
-// read from a buffer that is being written to asynchronously. The adjusted
-// MVP matrix is written to a GL buffer object via GL transform feedback.
-class LateLatch {
- public:
- enum BufferType {
- kViewProjMatrix,
- kViewMatrix,
- kPoseQuaternion,
- kPoseTranslation,
- // Max transform feedback count is 4, so no more buffers can go here.
- kNumBuffers,
- };
-
- static size_t GetBufferSize(BufferType type) {
- switch (type) {
- default:
- case kViewProjMatrix:
- case kViewMatrix:
- return 4 * 4 * sizeof(float);
- case kPoseQuaternion:
- case kPoseTranslation:
- return 4 * sizeof(float);
- }
- }
-
- static size_t GetBufferOffset(BufferType type, int view) {
- switch (type) {
- default:
- case kViewProjMatrix:
- return offsetof(LateLatchOutput, view_proj_matrix) +
- GetBufferSize(type) * view;
- case kViewMatrix:
- return offsetof(LateLatchOutput, view_matrix) +
- GetBufferSize(type) * view;
- case kPoseQuaternion:
- return offsetof(LateLatchOutput, pose_quaternion);
- case kPoseTranslation:
- return offsetof(LateLatchOutput, pose_translation);
- }
- }
-
- explicit LateLatch(bool is_app_late_latch);
- LateLatch(bool is_app_late_latch, pdx::LocalHandle&& surface_metadata_fd);
- ~LateLatch();
-
- // Bind the late-latch output data as a GL_UNIFORM_BUFFER. For example,
- // to bind just the view_matrix from the output:
- // BindUniformBuffer(BINDING, offsetof(LateLatchOutput, view_matrix),
- // sizeof(mat4));
- // buffer_index is the index of one of the output buffers if more than 1 were
- // requested in the constructor.
- void BindUniformBuffer(GLuint ubo_binding, size_t offset, size_t size) const {
- glBindBufferRange(GL_UNIFORM_BUFFER, ubo_binding, output_buffer_id_, offset,
- size);
- }
-
- void BindUniformBuffer(GLuint ubo_binding, BufferType type, int view) const {
- glBindBufferRange(GL_UNIFORM_BUFFER, ubo_binding, output_buffer_id_,
- GetBufferOffset(type, view), GetBufferSize(type));
- }
-
- GLuint output_buffer_id() const { return output_buffer_id_; }
-
- void UnbindUniformBuffer(GLuint ubo_binding) const {
- glBindBufferBase(GL_UNIFORM_BUFFER, ubo_binding, 0);
- }
-
- void CaptureOutputData(LateLatchOutput* data) const;
-
- // Add the late latch GL commands for this frame. This should be done just
- // before the first application draw calls that are dependent on the head
- // latest head pose.
- //
- // For efficiency, the application projection and eye_from_head matrices are
- // passed through the late latch shader and output in various combinations to
- // allow for both simple application vertex shaders that can take the view-
- // projection matrix as-is and shaders that need to access the view matrix
- // separately.
- //
- // GL state must be reset to default for this call.
- void AddLateLatch(const LateLatchInput& data) const;
-
- // After calling AddEdsLateLatch one or more times, this method must be called
- // to add the necessary GL memory barrier to ensure late latch outputs are
- // written before the EDS and warp shaders read them.
- void PostEdsLateLatchBarrier() const {
- // The transform feedback buffer is going to be read as a uniform by EDS,
- // so we need a uniform memory barrier.
- glMemoryBarrier(GL_UNIFORM_BARRIER_BIT);
- }
-
- // Typically not for use by application code. This method adds the EDS late
- // latch that will adjust the application framebuffer with the latest head
- // pose.
- // buffer_index is the index of one of the output buffers if more than 1 were
- // requested in the constructor.
- void AddEdsLateLatch(const LateLatchInput& data,
- GLuint render_pose_buffer_object) const;
-
- // For debugging purposes, capture the output during the next call to
- // AddLateLatch. Set to NULL to reset.
- void SetLateLatchDataCapture(LateLatchOutput* app_late_latch) {
- app_late_latch_output_ = app_late_latch;
- }
-
- // For debugging purposes, capture the output during the next call to
- // AddEdsLateLatch. Set to NULL to reset.
- void SetEdsLateLatchDataCapture(LateLatchOutput* eds_late_latch) {
- eds_late_latch_output_ = eds_late_latch;
- }
-
- private:
- LateLatch(const LateLatch&) = delete;
- LateLatch& operator=(const LateLatch&) = delete;
-
- void LoadLateLatchShader();
-
- // Late latch shader.
- ShaderProgram late_latch_program_;
-
- // Async pose ring buffer object.
- GLuint pose_buffer_object_;
-
- GLuint metadata_buffer_id_;
-
- // Pose matrix buffers
- GLuint input_buffer_id_;
- GLuint output_buffer_id_;
-
- bool is_app_late_latch_;
- // During development, these can be used to capture the pose output data.
- LateLatchOutput* app_late_latch_output_;
- LateLatchOutput* eds_late_latch_output_;
-
- DvrPose* pose_client_;
-
- pdx::LocalHandle surface_metadata_fd_;
- pdx::LocalHandle pose_buffer_fd_;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_LATE_LATCH_H_
diff --git a/libs/vr/libdisplay/include/private/dvr/native_buffer_queue.h b/libs/vr/libdisplay/include/private/dvr/native_buffer_queue.h
deleted file mode 100644
index a260f17..0000000
--- a/libs/vr/libdisplay/include/private/dvr/native_buffer_queue.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef ANDROID_DVR_NATIVE_BUFFER_QUEUE_H_
-#define ANDROID_DVR_NATIVE_BUFFER_QUEUE_H_
-
-#include <semaphore.h>
-
-#include <mutex>
-#include <vector>
-
-#include <private/dvr/native_buffer.h>
-#include <private/dvr/ring_buffer.h>
-
-#include "display_client.h"
-
-namespace android {
-namespace dvr {
-namespace display {
-
-// A wrapper over dvr::ProducerQueue that caches EGLImage.
-class NativeBufferQueue {
- public:
- NativeBufferQueue(EGLDisplay display,
- const std::shared_ptr<ProducerQueue>& producer_queue,
- uint32_t width, uint32_t height, uint32_t format,
- uint64_t usage, size_t capacity);
-
- uint32_t width() const { return width_; }
- uint32_t height() const { return height_; }
- uint32_t format() const { return format_; }
- uint64_t usage() const { return usage_; }
- size_t capacity() const { return producer_queue_->capacity(); }
-
- // Dequeue a buffer from the free queue, blocking until one is available.
- NativeBufferProducer* Dequeue();
-
- // An noop here to keep Vulkan path in GraphicsContext happy.
- // TODO(jwcai, cort) Move Vulkan path into GVR/Google3.
- void Enqueue(NativeBufferProducer* /*buffer*/) {}
-
- private:
- EGLDisplay display_;
- uint32_t width_;
- uint32_t height_;
- uint32_t format_;
- uint64_t usage_;
- std::shared_ptr<ProducerQueue> producer_queue_;
- std::vector<sp<NativeBufferProducer>> buffers_;
-
- NativeBufferQueue(const NativeBufferQueue&) = delete;
- void operator=(const NativeBufferQueue&) = delete;
-};
-
-} // namespace display
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_NATIVE_BUFFER_QUEUE_H_
diff --git a/libs/vr/libdisplay/late_latch.cpp b/libs/vr/libdisplay/late_latch.cpp
deleted file mode 100644
index e67f009..0000000
--- a/libs/vr/libdisplay/late_latch.cpp
+++ /dev/null
@@ -1,460 +0,0 @@
-#include "include/private/dvr/late_latch.h"
-
-#include <unistd.h>
-
-#include <fstream>
-#include <iostream>
-#include <string>
-
-#include <log/log.h>
-#include <private/dvr/clock_ns.h>
-#include <private/dvr/debug.h>
-#include <private/dvr/graphics/gpu_profiler.h>
-#include <private/dvr/pose_client_internal.h>
-#include <private/dvr/sensor_constants.h>
-#include <private/dvr/types.h>
-
-#define PRINT_MATRIX 0
-
-#if PRINT_MATRIX
-#ifndef LOG_TAG
-#define LOG_TAG "latelatch"
-#endif
-
-#define PE(str, ...) \
- fprintf(stderr, "[%s:%d] " str, __FILE__, __LINE__, ##__VA_ARGS__); \
- ALOGI("[%s:%d] " str, __FILE__, __LINE__, ##__VA_ARGS__)
-
-#define PV4(v) PE(#v "=%f,%f,%f,%f\n", v[0], v[1], v[2], v[3]);
-#define PM4(m) \
- PE(#m ":\n %f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n", \
- m(0, 0), m(0, 1), m(0, 2), m(0, 3), m(1, 0), m(1, 1), m(1, 2), m(1, 3), \
- m(2, 0), m(2, 1), m(2, 2), m(2, 3), m(3, 0), m(3, 1), m(3, 2), m(3, 3))
-#endif // PRINT_MATRIX
-
-#define STRINGIFY2(s) #s
-#define STRINGIFY(s) STRINGIFY2(s)
-
-// Compute shader bindings.
-// GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS must be at least 8 for GLES 3.1.
-#define POSE_BINDING 0
-#define RENDER_POSE_BINDING 1
-#define INPUT_BINDING 2
-#define OUTPUT_BINDING 3
-
-using android::pdx::LocalHandle;
-
-namespace {
-
-static const std::string kShaderLateLatch = R"( // NOLINT
- struct Pose {
- vec4 quat;
- vec3 pos;
- };
-
- // Must match DvrPoseAsync C struct.
- struct DvrPoseAsync {
- vec4 orientation;
- vec4 translation;
- vec4 right_orientation;
- vec4 right_translation;
- vec4 angular_velocity;
- vec4 velocity;
- vec4 reserved[2];
- };
-
- // Must match LateLatchInputData C struct.
- layout(binding = INPUT_BINDING, std140)
- buffer InputData {
- mat4 uEyeFromHeadMat[kSurfaceViewMaxCount];
- mat4 uProjMat[kSurfaceViewMaxCount];
- mat4 uPoseOffset[kSurfaceViewMaxCount];
- mat4 uEdsMat1[kSurfaceViewMaxCount];
- mat4 uEdsMat2[kSurfaceViewMaxCount];
- uint uPoseIndex;
- uint uRenderPoseIndex;
- } bIn;
-
- // std140 is to layout the structure in a consistent, standard way so we
- // can access it from C++.
- // This structure exactly matches the pose ring buffer in pose_client.h.
- layout(binding = POSE_BINDING, std140)
- buffer PoseBuffer {
- DvrPoseAsync data[kPoseAsyncBufferTotalCount];
- } bPose;
-
- // Must stay in sync with DisplaySurfaceMetadata C struct.
- // GPU thread 0 will exclusively read in a pose and capture it
- // into this array.
- layout(binding = RENDER_POSE_BINDING, std140)
- buffer DisplaySurfaceMetadata {
- vec4 orientation[kSurfaceBufferMaxCount];
- vec4 translation[kSurfaceBufferMaxCount];
- } bSurfaceData;
-
- // Must stay in sync with DisplaySurfaceMetadata C struct.
- // Each thread writes to a vertic
- layout(binding = OUTPUT_BINDING, std140)
- buffer Output {
- mat4 viewProjMatrix[kSurfaceViewMaxCount];
- mat4 viewMatrix[kSurfaceViewMaxCount];
- vec4 quaternion;
- vec4 translation;
- } bOut;
-
- // Thread 0 will also store the single quat/pos pair in shared variables
- // for the other threads to use (left and right eye in this array).
- shared Pose sharedPose[2];
-
- // Rotate v1 by the given quaternion. This is based on mathfu's
- // Quaternion::Rotate function. It is the typical implementation of this
- // operation. Eigen has a similar method (Quaternion::_transformVector) that
- // supposedly requires fewer operations, but I am skeptical of optimizing
- // shader code without proper profiling first.
- vec3 rotate(vec4 quat, vec3 v1) {
- float ss = 2.0 * quat.w;
- vec3 v = quat.xyz;
- return ss * cross(v, v1) + (ss * quat.w - 1.0) * v1 +
- 2.0 * dot(v, v1) * v;
- }
-
- // See Eigen Quaternion::conjugate;
- // Note that this isn't a true multiplicative inverse unless you can guarantee
- // quat is also normalized, but that typically isn't an issue for our
- // purposes.
- vec4 quatInvert(vec4 quat) {
- return vec4(-quat.xyz, quat.w);
- }
-
- // This is based on mathfu's Quaternion::operator*(Quaternion)
- // Eigen's version is mathematically equivalent, just notationally different.
- vec4 quatMul(vec4 q1, vec4 q2) {
- return vec4(q1.w * q2.xyz + q2.w * q1.xyz + cross(q1.xyz, q2.xyz),
- q1.w * q2.w - dot(q1.xyz, q2.xyz));
- }
-
- // Equivalent to pose.h GetObjectFromReferenceMatrix.
- mat4 getInverseMatrix(Pose pose) {
- // Invert quaternion and store fields the way Eigen does so we can
- // keep in sync with Eigen methods easier.
- vec4 quatInv = quatInvert(pose.quat);
- vec3 v = quatInv.xyz;
- float s = quatInv.w;
- // Convert quaternion to matrix. See Eigen Quaternion::toRotationMatrix()
- float x2 = v.x * v.x, y2 = v.y * v.y, z2 = v.z * v.z;
- float sx = s * v.x, sy = s * v.y, sz = s * v.z;
- float xz = v.x * v.z, yz = v.y * v.z, xy = v.x * v.y;
- // Inverse translation.
- vec3 point = -pose.pos;
-
- return
- mat4(1.0 - 2.0 * (y2 + z2), 2.0 * (xy + sz), 2.0 * (xz - sy), 0.0,
- 2.0 * (xy - sz), 1.0 - 2.0 * (x2 + z2), 2.0 * (sx + yz), 0.0,
- 2.0 * (sy + xz), 2.0 * (yz - sx), 1.0 - 2.0 * (x2 + y2), 0.0,
- 0.0, 0.0, 0.0, 1.0)*
- mat4(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
- point.x, point.y, point.z, 1.0);
- }
-
- void appLateLatch() {
- uint poseIndex = (gl_LocalInvocationIndex & uint(1));
- mat4 head_from_center = getInverseMatrix(sharedPose[poseIndex]);
- bOut.viewMatrix[gl_LocalInvocationIndex] =
- bIn.uEyeFromHeadMat[gl_LocalInvocationIndex] *
- head_from_center * bIn.uPoseOffset[gl_LocalInvocationIndex];
- bOut.viewProjMatrix[gl_LocalInvocationIndex] =
- bIn.uProjMat[gl_LocalInvocationIndex] *
- bOut.viewMatrix[gl_LocalInvocationIndex];
- }
-
- // Extract the app frame's pose.
- Pose getPoseFromApp() {
- Pose p;
- p.quat = bSurfaceData.orientation[bIn.uRenderPoseIndex];
- p.pos = bSurfaceData.translation[bIn.uRenderPoseIndex].xyz;
- return p;
- }
-
- // See Posef::GetPoseOffset.
- Pose getPoseOffset(Pose p1, Pose p2) {
- Pose p;
- p.quat = quatMul(quatInvert(p2.quat), p1.quat);
- // TODO(jbates) Consider enabling positional EDS when it is better
- // tested.
- // p.pos = p2.pos - p1.pos;
- p.pos = vec3(0.0);
- return p;
- }
-
- void edsLateLatch() {
- Pose pose1 = getPoseFromApp();
- Pose correction;
- // Ignore the texture pose if the quat is not unit-length.
- float tex_quat_length = length(pose1.quat);
- uint poseIndex = (gl_LocalInvocationIndex & uint(1));
- if (abs(tex_quat_length - 1.0) < 0.001)
- correction = getPoseOffset(pose1, sharedPose[poseIndex]);
- else
- correction = Pose(vec4(0, 0, 0, 1), vec3(0, 0, 0));
- mat4 eye_old_from_eye_new_matrix = getInverseMatrix(correction);
- bOut.viewProjMatrix[gl_LocalInvocationIndex] =
- bIn.uEdsMat1[gl_LocalInvocationIndex] *
- eye_old_from_eye_new_matrix * bIn.uEdsMat2[gl_LocalInvocationIndex];
- // Currently unused, except for debugging:
- bOut.viewMatrix[gl_LocalInvocationIndex] = eye_old_from_eye_new_matrix;
- }
-
- // One thread per surface view.
- layout (local_size_x = kSurfaceViewMaxCount, local_size_y = 1,
- local_size_z = 1) in;
-
- void main() {
- // First, thread 0 late latches pose and stores it into various places.
- if (gl_LocalInvocationIndex == uint(0)) {
- sharedPose[0].quat = bPose.data[bIn.uPoseIndex].orientation;
- sharedPose[0].pos = bPose.data[bIn.uPoseIndex].translation.xyz;
- sharedPose[1].quat = bPose.data[bIn.uPoseIndex].right_orientation;
- sharedPose[1].pos = bPose.data[bIn.uPoseIndex].right_translation.xyz;
- if (IS_APP_LATE_LATCH) {
- bSurfaceData.orientation[bIn.uRenderPoseIndex] = sharedPose[0].quat;
- bSurfaceData.translation[bIn.uRenderPoseIndex] = vec4(sharedPose[0].pos, 0.0);
- // TODO(jbates) implement app late-latch support for separate eye poses.
- // App late latch currently uses the same pose for both eye views.
- sharedPose[1] = sharedPose[0];
- }
- bOut.quaternion = sharedPose[0].quat;
- bOut.translation = vec4(sharedPose[0].pos, 0.0);
- }
-
- // Memory barrier to make sure all threads can see prior writes.
- memoryBarrierShared();
-
- // Execution barrier to block all threads here until all threads have
- // reached this point -- ensures the late latching is done.
- barrier();
-
- if (IS_APP_LATE_LATCH)
- appLateLatch();
- else
- edsLateLatch();
- }
-)";
-
-} // anonymous namespace
-
-namespace android {
-namespace dvr {
-
-LateLatch::LateLatch(bool is_app_late_latch)
- : LateLatch(is_app_late_latch, LocalHandle()) {}
-
-LateLatch::LateLatch(bool is_app_late_latch,
- LocalHandle&& surface_metadata_fd)
- : is_app_late_latch_(is_app_late_latch),
- app_late_latch_output_(NULL),
- eds_late_latch_output_(NULL),
- surface_metadata_fd_(std::move(surface_metadata_fd)) {
- CHECK_GL();
- glGenBuffers(1, &input_buffer_id_);
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, input_buffer_id_);
- glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(LateLatchInput), nullptr,
- GL_DYNAMIC_DRAW);
- glGenBuffers(1, &output_buffer_id_);
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, output_buffer_id_);
- glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(LateLatchOutput), nullptr,
- GL_DYNAMIC_COPY);
- CHECK_GL();
-
- pose_client_ = dvrPoseCreate();
- if (!pose_client_) {
- ALOGE("LateLatch Error: failed to create pose client");
- } else {
- int ret = privateDvrPoseGetRingBufferFd(pose_client_, &pose_buffer_fd_);
- if (ret < 0) {
- ALOGE("LateLatch Error: failed to get pose ring buffer");
- }
- }
-
- glGenBuffers(1, &pose_buffer_object_);
- glGenBuffers(1, &metadata_buffer_id_);
- if (!glBindSharedBufferQCOM) {
- ALOGE("Error: Missing gralloc buffer extension, no pose data");
- } else {
- if (pose_buffer_fd_) {
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, pose_buffer_object_);
- glBindSharedBufferQCOM(GL_SHADER_STORAGE_BUFFER,
- kPoseAsyncBufferTotalCount * sizeof(DvrPoseAsync),
- pose_buffer_fd_.Get());
- }
- CHECK_GL();
- }
-
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, metadata_buffer_id_);
- if (surface_metadata_fd_ && glBindSharedBufferQCOM) {
- glBindSharedBufferQCOM(GL_SHADER_STORAGE_BUFFER,
- sizeof(DisplaySurfaceMetadata),
- surface_metadata_fd_.Get());
- } else {
- // Fall back on internal metadata buffer when none provided, for example
- // when distortion is done in the application process.
- glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(DisplaySurfaceMetadata),
- nullptr, GL_DYNAMIC_COPY);
- }
- CHECK_GL();
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
-
- CHECK_GL();
- LoadLateLatchShader();
-}
-
-LateLatch::~LateLatch() {
- glDeleteBuffers(1, &metadata_buffer_id_);
- glDeleteBuffers(1, &input_buffer_id_);
- glDeleteBuffers(1, &output_buffer_id_);
- glDeleteBuffers(1, &pose_buffer_object_);
- dvrPoseDestroy(pose_client_);
-}
-
-void LateLatch::LoadLateLatchShader() {
- std::string str;
- str += "\n#define POSE_BINDING " STRINGIFY(POSE_BINDING);
- str += "\n#define RENDER_POSE_BINDING " STRINGIFY(RENDER_POSE_BINDING);
- str += "\n#define INPUT_BINDING " STRINGIFY(INPUT_BINDING);
- str += "\n#define OUTPUT_BINDING " STRINGIFY(OUTPUT_BINDING);
- str += "\n#define kPoseAsyncBufferTotalCount " STRINGIFY(
- kPoseAsyncBufferTotalCount);
- str += "\n#define kSurfaceBufferMaxCount " STRINGIFY(kSurfaceBufferMaxCount);
- str += "\n#define kSurfaceBufferMaxCount " STRINGIFY(kSurfaceBufferMaxCount);
- str += "\n#define kSurfaceViewMaxCount " STRINGIFY(kSurfaceViewMaxCount);
- str += "\n#define IS_APP_LATE_LATCH ";
- str += is_app_late_latch_ ? "true" : "false";
- str += "\n";
- str += kShaderLateLatch;
- late_latch_program_.Link(str);
- CHECK_GL();
-}
-
-void LateLatch::CaptureOutputData(LateLatchOutput* data) const {
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, output_buffer_id_);
- LateLatchOutput* out_data = static_cast<LateLatchOutput*>(glMapBufferRange(
- GL_SHADER_STORAGE_BUFFER, 0, sizeof(LateLatchOutput), GL_MAP_READ_BIT));
- *data = *out_data;
- glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
- CHECK_GL();
-}
-
-void LateLatch::AddLateLatch(const LateLatchInput& data) const {
- LOG_ALWAYS_FATAL_IF(!is_app_late_latch_);
- CHECK_GL();
- late_latch_program_.Use();
-
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, RENDER_POSE_BINDING,
- metadata_buffer_id_);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, POSE_BINDING, pose_buffer_object_);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, OUTPUT_BINDING, output_buffer_id_);
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, input_buffer_id_);
- LateLatchInput* adata = (LateLatchInput*)glMapBufferRange(
- GL_SHADER_STORAGE_BUFFER, 0, sizeof(LateLatchInput),
- GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
- if (adata)
- *adata = data;
- else
- ALOGE("Error: LateLatchInput gl mapping is null");
- glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, INPUT_BINDING, input_buffer_id_);
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
- CHECK_GL();
-
- // The output buffer is going to be written but it may be read by
- // earlier shaders, so we need a shader storage memory barrier.
- glMemoryBarrier(GL_SHADER_STORAGE_BUFFER);
-
- glDispatchCompute(1, 1, 1);
- CHECK_GL();
-
- // The transform feedback buffer is going to be read as a uniform by the app,
- // so we need a uniform memory barrier.
- glMemoryBarrier(GL_UNIFORM_BARRIER_BIT);
-
- if (app_late_latch_output_) {
- // Capture the output data:
- CaptureOutputData(app_late_latch_output_);
- }
-#if PRINT_MATRIX
- // Print the composed matrix to stderr:
- LateLatchOutput out_data;
- CaptureOutputData(&out_data);
- CHECK_GL();
- PE("LL APP slot:%d\n", data.render_pose_index);
- PM4(data.proj_mat[0]);
- PM4(out_data.view_proj_matrix[0]);
- PM4(out_data.view_proj_matrix[1]);
- PM4(out_data.view_proj_matrix[2]);
- PM4(out_data.view_proj_matrix[3]);
- PM4(out_data.view_matrix[0]);
- PM4(out_data.view_matrix[1]);
- PM4(out_data.view_matrix[2]);
- PM4(out_data.view_matrix[3]);
- PV4(out_data.pose_quaternion);
- PV4(out_data.pose_translation);
-#endif
-
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, RENDER_POSE_BINDING, 0);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, POSE_BINDING, 0);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, OUTPUT_BINDING, 0);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, INPUT_BINDING, 0);
- glUseProgram(0);
-}
-
-void LateLatch::AddEdsLateLatch(const LateLatchInput& data,
- GLuint render_pose_buffer_object) const {
- LOG_ALWAYS_FATAL_IF(is_app_late_latch_);
- late_latch_program_.Use();
-
- // Fall back on internal buffer when none is provided.
- if (!render_pose_buffer_object)
- render_pose_buffer_object = metadata_buffer_id_;
-
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, RENDER_POSE_BINDING,
- render_pose_buffer_object);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, POSE_BINDING, pose_buffer_object_);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, OUTPUT_BINDING, output_buffer_id_);
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, input_buffer_id_);
- LateLatchInput* adata = (LateLatchInput*)glMapBufferRange(
- GL_SHADER_STORAGE_BUFFER, 0, sizeof(LateLatchInput),
- GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
- *adata = data;
- glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, INPUT_BINDING, input_buffer_id_);
- CHECK_GL();
-
- glDispatchCompute(1, 1, 1);
- CHECK_GL();
-
- if (eds_late_latch_output_) {
- // Capture the output data:
- CaptureOutputData(eds_late_latch_output_);
- }
-#if PRINT_MATRIX
- // Print the composed matrix to stderr:
- LateLatchOutput out_data;
- CaptureOutputData(&out_data);
- CHECK_GL();
- PE("LL EDS\n");
- PM4(out_data.view_proj_matrix[0]);
- PM4(out_data.view_matrix[0]);
- PV4(out_data.pose_quaternion);
- PV4(out_data.pose_translation);
-#endif
-
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, RENDER_POSE_BINDING, 0);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, POSE_BINDING, 0);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, OUTPUT_BINDING, 0);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, INPUT_BINDING, 0);
- glUseProgram(0);
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdisplay/native_buffer_queue.cpp b/libs/vr/libdisplay/native_buffer_queue.cpp
deleted file mode 100644
index 1bb05d8..0000000
--- a/libs/vr/libdisplay/native_buffer_queue.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "include/private/dvr/native_buffer_queue.h"
-
-#include <log/log.h>
-#include <sys/epoll.h>
-#define ATRACE_TAG ATRACE_TAG_GRAPHICS
-#include <utils/Trace.h>
-
-#include <array>
-
-#include <dvr/dvr_display_types.h>
-
-namespace android {
-namespace dvr {
-namespace display {
-
-NativeBufferQueue::NativeBufferQueue(
- EGLDisplay display, const std::shared_ptr<ProducerQueue>& producer_queue,
- uint32_t width, uint32_t height, uint32_t format, uint64_t usage,
- size_t capacity)
- : display_(display),
- width_(width),
- height_(height),
- format_(format),
- usage_(usage),
- producer_queue_(producer_queue),
- buffers_(capacity) {
- for (size_t i = 0; i < capacity; i++) {
- size_t slot;
- // TODO(jwcai) Should change to use BufferViewPort's spec to config.
- const int ret = producer_queue_->AllocateBuffer(width_, height_, 1, format_,
- usage_, &slot);
- if (ret < 0) {
- ALOGE(
- "NativeBufferQueue::NativeBufferQueue: Failed to allocate buffer: %s",
- strerror(-ret));
- return;
- }
-
- ALOGD_IF(TRACE, "NativeBufferQueue::NativeBufferQueue: slot=%zu", slot);
- }
-}
-
-NativeBufferProducer* NativeBufferQueue::Dequeue() {
- ATRACE_NAME("NativeBufferQueue::Dequeue");
- size_t slot;
- pdx::LocalHandle fence;
- auto buffer_status = producer_queue_->Dequeue(-1, &slot, &fence);
- if (!buffer_status) {
- ALOGE("NativeBufferQueue::Dequeue: Failed to dequeue buffer: %s",
- buffer_status.GetErrorMessage().c_str());
- return nullptr;
- }
-
- if (buffers_[slot] == nullptr)
- buffers_[slot] =
- new NativeBufferProducer(buffer_status.take(), display_, slot);
-
- ALOGD_IF(TRACE, "NativeBufferQueue::Dequeue: slot=%zu buffer=%p", slot,
- buffers_[slot].get());
- return buffers_[slot].get();
-}
-
-} // namespace display
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdisplay/tests/dummy_native_window_tests.cpp b/libs/vr/libdisplay/tests/dummy_native_window_tests.cpp
deleted file mode 100644
index 5f3ff53..0000000
--- a/libs/vr/libdisplay/tests/dummy_native_window_tests.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <private/dvr/dummy_native_window.h>
-#include <gtest/gtest.h>
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <GLES2/gl2.h>
-
-class DummyNativeWindowTests : public ::testing::Test {
- public:
- EGLDisplay display_;
- bool initialized_;
-
- DummyNativeWindowTests()
- : display_(nullptr)
- , initialized_(false)
- {
- }
-
- virtual void SetUp() {
- display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
- ASSERT_NE(nullptr, display_);
- initialized_ = eglInitialize(display_, nullptr, nullptr);
-
- ASSERT_TRUE(initialized_);
- }
-
- virtual void TearDown() {
- if (display_ && initialized_) {
- eglTerminate(display_);
- }
- }
-};
-
-// Test that eglCreateWindowSurface works with DummyNativeWindow
-TEST_F(DummyNativeWindowTests, TryCreateEglWindow) {
- EGLint attribs[] = {
- EGL_NONE,
- };
-
- EGLint num_configs;
- EGLConfig config;
- ASSERT_TRUE(eglChooseConfig(display_, attribs, &config, 1, &num_configs));
-
- std::unique_ptr<android::dvr::DummyNativeWindow> dummy_window(
- new android::dvr::DummyNativeWindow());
-
- EGLint context_attribs[] = {
- EGL_NONE,
- };
-
- EGLSurface surface = eglCreateWindowSurface(display_, config,
- dummy_window.get(),
- context_attribs);
-
- EXPECT_NE(nullptr, surface);
-
- bool destroyed = eglDestroySurface(display_, surface);
-
- EXPECT_TRUE(destroyed);
-}
-
diff --git a/libs/vr/libdisplay/tests/graphics_app_tests.cpp b/libs/vr/libdisplay/tests/graphics_app_tests.cpp
deleted file mode 100644
index c592ba9..0000000
--- a/libs/vr/libdisplay/tests/graphics_app_tests.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-#include <dvr/graphics.h>
-#include <gtest/gtest.h>
-
-TEST(GraphicsAppTests, GetNativeDisplayDimensions) {
- int width, height;
- dvrGetNativeDisplayDimensions(&width, &height);
- EXPECT_GT(width, 0);
- EXPECT_GT(height, 0);
-}
-
-// TODO(jpoichet) How to check it worked?
-TEST(GraphicsAppTests, GraphicsSurfaceSetVisible) {
- DvrSurfaceParameter surface_params[] = {DVR_SURFACE_PARAMETER_LIST_END};
- DvrGraphicsContext* context = nullptr;
- int result = dvrGraphicsContextCreate(surface_params, &context);
- ASSERT_GE(result, 0);
- ASSERT_NE(context, nullptr);
- dvrGraphicsSurfaceSetVisible(context, 0);
- dvrGraphicsSurfaceSetVisible(context, 1);
- dvrGraphicsSurfaceSetVisible(context, 2);
-}
-
-// TODO(jpoichet) How to check it worked?
-TEST(GraphicsAppTests, GraphicsSurfaceSetZOrder) {
- DvrSurfaceParameter surface_params[] = {DVR_SURFACE_PARAMETER_LIST_END};
- DvrGraphicsContext* context = nullptr;
- int result = dvrGraphicsContextCreate(surface_params, &context);
- ASSERT_GE(result, 0);
- ASSERT_NE(context, nullptr);
- dvrGraphicsSurfaceSetZOrder(context, -1);
- dvrGraphicsSurfaceSetZOrder(context, 0);
- dvrGraphicsSurfaceSetZOrder(context, 1);
- dvrGraphicsSurfaceSetZOrder(context, 2);
-}
-
-TEST(GraphicsAppTests, GraphicsContext) {
- DvrGraphicsContext* context = 0;
- int display_width = 0, display_height = 0;
- int surface_width = 0, surface_height = 0;
- float inter_lens_meters = 0.0f;
- float left_fov[4] = {0.0f};
- float right_fov[4] = {0.0f};
- uint64_t vsync_period = 0;
- int disable_warp = 0;
- DvrSurfaceParameter surface_params[] = {
- DVR_SURFACE_PARAMETER_IN(DISABLE_DISTORTION, disable_warp),
- DVR_SURFACE_PARAMETER_OUT(DISPLAY_WIDTH, &display_width),
- DVR_SURFACE_PARAMETER_OUT(DISPLAY_HEIGHT, &display_height),
- DVR_SURFACE_PARAMETER_OUT(SURFACE_WIDTH, &surface_width),
- DVR_SURFACE_PARAMETER_OUT(SURFACE_HEIGHT, &surface_height),
- DVR_SURFACE_PARAMETER_OUT(INTER_LENS_METERS, &inter_lens_meters),
- DVR_SURFACE_PARAMETER_OUT(LEFT_FOV_LRBT, left_fov),
- DVR_SURFACE_PARAMETER_OUT(RIGHT_FOV_LRBT, right_fov),
- DVR_SURFACE_PARAMETER_OUT(VSYNC_PERIOD, &vsync_period),
- DVR_SURFACE_PARAMETER_LIST_END,
- };
- dvrGraphicsContextCreate(surface_params, &context);
- EXPECT_NE(nullptr, context);
-
- dvrGraphicsSurfaceSetVisible(context, 1);
-
- DvrFrameSchedule schedule;
- int wait_result = dvrGraphicsWaitNextFrame(context, 0, &schedule);
- EXPECT_EQ(wait_result, 0);
- EXPECT_GE(schedule.vsync_count, 0u);
-
- dvrBeginRenderFrame(context);
-
- // Check range of vsync period from 60fps to 100fps.
- // TODO(jbates) Once we have stable hardware, clamp this range down further.
- EXPECT_LE(vsync_period, 1000000000ul / 60ul);
- EXPECT_GE(vsync_period, 1000000000ul / 100ul);
-
- dvrPresent(context);
- dvrGraphicsContextDestroy(context);
-}
-
-TEST(GraphicsAppTests, CustomSurfaceSize) {
- DvrGraphicsContext* context = 0;
- int display_width = 0, display_height = 0;
- int surface_width = 0, surface_height = 0;
- float inter_lens_meters = 0.0f;
- float left_fov[4] = {0.0f};
- float right_fov[4] = {0.0f};
- int disable_warp = 0;
- int req_width = 256, req_height = 128;
- DvrSurfaceParameter surface_params[] = {
- DVR_SURFACE_PARAMETER_IN(WIDTH, req_width),
- DVR_SURFACE_PARAMETER_IN(HEIGHT, req_height),
- DVR_SURFACE_PARAMETER_IN(DISABLE_DISTORTION, disable_warp),
- DVR_SURFACE_PARAMETER_OUT(DISPLAY_WIDTH, &display_width),
- DVR_SURFACE_PARAMETER_OUT(DISPLAY_HEIGHT, &display_height),
- DVR_SURFACE_PARAMETER_OUT(SURFACE_WIDTH, &surface_width),
- DVR_SURFACE_PARAMETER_OUT(SURFACE_HEIGHT, &surface_height),
- DVR_SURFACE_PARAMETER_OUT(INTER_LENS_METERS, &inter_lens_meters),
- DVR_SURFACE_PARAMETER_OUT(LEFT_FOV_LRBT, left_fov),
- DVR_SURFACE_PARAMETER_OUT(RIGHT_FOV_LRBT, right_fov),
- DVR_SURFACE_PARAMETER_LIST_END,
- };
- dvrGraphicsContextCreate(surface_params, &context);
- EXPECT_NE(nullptr, context);
-
- EXPECT_EQ(req_width, surface_width);
- EXPECT_EQ(req_height, surface_height);
- dvrGraphicsContextDestroy(context);
-}
-
diff --git a/libs/vr/libdvrcommon/Android.bp b/libs/vr/libdvrcommon/Android.bp
index eb78348..527cdbd 100644
--- a/libs/vr/libdvrcommon/Android.bp
+++ b/libs/vr/libdvrcommon/Android.bp
@@ -12,11 +12,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-sourceFiles = [
- "frame_time_history.cpp",
- "sync_util.cpp",
-]
-
localIncludeFiles = [
"include",
]
@@ -40,7 +35,6 @@
]
cc_library {
- srcs: sourceFiles,
local_include_dirs: localIncludeFiles,
cflags: [
@@ -49,8 +43,6 @@
],
export_include_dirs: localIncludeFiles,
- shared_libs: sharedLibraries,
- static_libs: staticLibraries,
header_libs: headerLibraries,
export_header_lib_headers: headerLibraries,
diff --git a/libs/vr/libdvrcommon/frame_time_history.cpp b/libs/vr/libdvrcommon/frame_time_history.cpp
deleted file mode 100644
index d4718a9..0000000
--- a/libs/vr/libdvrcommon/frame_time_history.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <private/dvr/frame_time_history.h>
-
-#include <log/log.h>
-
-namespace android {
-namespace dvr {
-
-void FrameTimeHistory::AddSample(int64_t frame_time) {
- if (size_ == frame_times_.size()) {
- int64_t expired_frame_time = frame_times_[start_];
- frame_times_[start_] = frame_time;
- start_ = (start_ + 1) % frame_times_.size();
- total_frame_time_ -= expired_frame_time;
- } else {
- frame_times_[(start_ + size_) % frame_times_.size()] = frame_time;
- size_++;
- }
- total_frame_time_ += frame_time;
-}
-
-int FrameTimeHistory::GetSampleCount() const { return size_; }
-
-int64_t FrameTimeHistory::GetAverage() const {
- LOG_ALWAYS_FATAL_IF(size_ == 0);
- return total_frame_time_ / size_;
-}
-
-void FrameTimeHistory::ResetWithSeed(int64_t frame_time_seed) {
- start_ = 0;
- size_ = frame_times_.size();
- for (size_t i = 0; i < size_; ++i)
- frame_times_[i] = frame_time_seed;
- total_frame_time_ = frame_time_seed * size_;
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdvrcommon/include/private/dvr/frame_time_history.h b/libs/vr/libdvrcommon/include/private/dvr/frame_time_history.h
deleted file mode 100644
index 008c636..0000000
--- a/libs/vr/libdvrcommon/include/private/dvr/frame_time_history.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef ANDROID_DVR_FRAME_TIME_HISTORY_H_
-#define ANDROID_DVR_FRAME_TIME_HISTORY_H_
-
-#include <stdint.h>
-
-#include <array>
-
-namespace android {
-namespace dvr {
-
-// Maintains frame time history and provides averaging utility methods.
-class FrameTimeHistory {
- public:
- void AddSample(int64_t frame_time);
- int GetSampleCount() const;
- int64_t GetAverage() const;
- float GetAverageFps() const {
- return 1000000000.0f / static_cast<float>(GetAverage());
- }
- void ResetWithSeed(int64_t frame_time_seed);
-
- private:
- static constexpr int kFrameTimeHistoryNumSamples = 30;
- std::array<int64_t, kFrameTimeHistoryNumSamples> frame_times_;
- int start_ = 0;
- size_t size_ = 0;
- int64_t total_frame_time_ = 0;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_FRAME_TIME_HISTORY_H_
diff --git a/libs/vr/libdvrcommon/include/private/dvr/sync_util.h b/libs/vr/libdvrcommon/include/private/dvr/sync_util.h
deleted file mode 100644
index c6911bc..0000000
--- a/libs/vr/libdvrcommon/include/private/dvr/sync_util.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef ANDROID_DVR_SYNC_UTIL_H_
-#define ANDROID_DVR_SYNC_UTIL_H_
-
-#include <cstdint>
-#include <type_traits>
-
-namespace android {
-namespace dvr {
-
-constexpr size_t kFenceInfoBufferSize = 4096;
-
-// This buffer is eventually mapped to a sync_fence_info_data struct (from
-// sync.h), whose largest member is a uint32_t. We align to 8 bytes to be extra
-// cautious.
-using FenceInfoBuffer = std::aligned_storage<kFenceInfoBufferSize, 8>::type;
-
-// Get fence info. Internally this works just like sync_fence_info(), except the
-// caller supplies a memory buffer instead of allocating memory.
-// On success, returns 0. On error, -1 is returned, and errno is set.
-int GetSyncFenceInfo(int fence_fd, FenceInfoBuffer* buffer);
-
-// Returns the timestamp when the fence was first signaled. buffer is used as
-// described in GetSyncFenceInfo().
-// On success, returns 0. On error, -1 is returned, and errno is set.
-int GetFenceSignaledTimestamp(int fence_fd, FenceInfoBuffer* buffer,
- int64_t* timestamp);
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_SYNC_UTIL_H_
diff --git a/libs/vr/libdvrcommon/sync_util.cpp b/libs/vr/libdvrcommon/sync_util.cpp
deleted file mode 100644
index 3637936..0000000
--- a/libs/vr/libdvrcommon/sync_util.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-#include "include/private/dvr/sync_util.h"
-
-#include <errno.h>
-#include <sys/ioctl.h>
-
-// TODO: http://b/33239638 Move GetSyncFenceInfo() into upstream libsync instead
-// of duplicating functionality and structure definitions from it.
-struct sync_fence_info_data {
- uint32_t len;
- char name[32];
- int32_t status;
- uint8_t pt_info[0];
-};
-
-struct sync_pt_info {
- uint32_t len;
- char obj_name[32];
- char driver_name[32];
- int32_t status;
- uint64_t timestamp_ns;
- uint8_t driver_data[0];
-};
-
-#define SYNC_IOC_MAGIC '>'
-#define SYNC_IOC_WAIT _IOW(SYNC_IOC_MAGIC, 0, __s32)
-#define SYNC_IOC_MERGE _IOWR(SYNC_IOC_MAGIC, 1, struct sync_merge_data)
-#define SYNC_IOC_FENCE_INFO _IOWR(SYNC_IOC_MAGIC, 2, struct sync_fence_info_data)
-
-namespace android {
-namespace dvr {
-
-namespace {
-
-// This is copied from sync_pt_info() in libsync/sync.c. It's been cleaned up to
-// remove lint warnings.
-sync_pt_info* GetSyncPtInfo(sync_fence_info_data* info, sync_pt_info* itr) {
- if (itr == nullptr)
- itr = reinterpret_cast<sync_pt_info*>(info->pt_info);
- else
- itr = reinterpret_cast<sync_pt_info*>(reinterpret_cast<uint8_t*>(itr) +
- itr->len);
-
- if (reinterpret_cast<uint8_t*>(itr) - reinterpret_cast<uint8_t*>(info) >=
- static_cast<int>(info->len))
- return nullptr;
-
- return itr;
-}
-
-} // namespace
-
-int GetSyncFenceInfo(int fence_fd, FenceInfoBuffer* buffer) {
- // If the implementation of sync_fence_info() in libsync/sync.c changes, this
- // function should be changed to match.
- if (buffer == nullptr) {
- errno = EINVAL;
- return -1;
- }
-
- sync_fence_info_data* fence_info =
- reinterpret_cast<sync_fence_info_data*>(buffer);
- fence_info->len = kFenceInfoBufferSize;
- return ioctl(fence_fd, SYNC_IOC_FENCE_INFO, fence_info);
-}
-
-int GetFenceSignaledTimestamp(int fence_fd, FenceInfoBuffer* buffer,
- int64_t* timestamp) {
- int result = GetSyncFenceInfo(fence_fd, buffer);
- if (result < 0)
- return result;
-
- sync_fence_info_data* fence_info =
- reinterpret_cast<sync_fence_info_data*>(buffer);
- struct sync_pt_info* pt_info = nullptr;
- while ((pt_info = GetSyncPtInfo(fence_info, pt_info)) != nullptr) {
- if (pt_info->status == 1) {
- *timestamp = pt_info->timestamp_ns;
- return 0;
- }
- }
-
- errno = EAGAIN;
- return -1;
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdvrgraphics/Android.bp b/libs/vr/libdvrgraphics/Android.bp
deleted file mode 100644
index 73a8bf8..0000000
--- a/libs/vr/libdvrgraphics/Android.bp
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-sourceFiles = [
- "blur.cpp",
- "debug_text.cpp",
- "egl_image.cpp",
- "gpu_profiler.cpp",
- "shader_program.cpp",
- "timer_query.cpp",
- "vr_gl_extensions.cpp",
-]
-
-localIncludeFiles = [
- "include",
-]
-
-staticLibraries = [
- "libbufferhub",
- "libdvrcommon",
- "libpdx_default_transport",
-]
-
-sharedLibraries = [
- "libcutils",
- "libbase",
- "libEGL",
- "libGLESv2",
- "libpng",
- "liblog",
-]
-
-cc_library_static {
- srcs: sourceFiles,
- cflags: [
- "-DGL_GLEXT_PROTOTYPES",
- "-DEGL_EGLEXT_PROTOTYPES",
- ],
- export_include_dirs: localIncludeFiles,
- shared_libs: sharedLibraries,
- static_libs: staticLibraries,
- // Rather than add this header-file-only library to all users of libdvrgraphics,
- // include it here.
- whole_static_libs: ["libarect"],
- name: "libdvrgraphics",
-}
diff --git a/libs/vr/libdvrgraphics/assets/controller_proto2.png b/libs/vr/libdvrgraphics/assets/controller_proto2.png
deleted file mode 100644
index ffcb646..0000000
--- a/libs/vr/libdvrgraphics/assets/controller_proto2.png
+++ /dev/null
Binary files differ
diff --git a/libs/vr/libdvrgraphics/assets/controller_proto2_body.obj b/libs/vr/libdvrgraphics/assets/controller_proto2_body.obj
deleted file mode 100644
index 4e54900..0000000
--- a/libs/vr/libdvrgraphics/assets/controller_proto2_body.obj
+++ /dev/null
@@ -1,5018 +0,0 @@
-# This file uses centimeters as units for non-parametric coordinates.
-
-v 0.001777 0.012900 0.101619
-v -0.005750 0.012900 0.096150
-v -0.004652 0.012900 0.092770
-v 0.005750 0.012900 0.096150
-v 0.004652 0.012900 0.099530
-v -0.001777 0.012900 0.090681
-v 0.004652 0.012900 0.092770
-v 0.001777 0.012900 0.090681
-v -0.001777 0.012900 0.101619
-v -0.004652 0.012900 0.099530
-v -0.001777 0.012900 0.073181
-v -0.004652 0.012900 0.075270
-v 0.001777 0.012900 0.073181
-v 0.004652 0.012900 0.075270
-v 0.005750 0.012900 0.078650
-v 0.004652 0.012900 0.082030
-v -0.005750 0.012900 0.078650
-v -0.004652 0.012900 0.082030
-v -0.001777 0.012900 0.084119
-v 0.001777 0.012900 0.084119
-v -0.016000 0.012900 0.050841
-v 0.016000 0.012900 0.050835
-v 0.013856 0.012900 0.058900
-v 0.008000 0.012900 0.064756
-v -0.000000 0.012900 0.066900
-v -0.008000 0.012900 0.064756
-v -0.013856 0.012900 0.058900
-v 0.008000 0.012900 0.037044
-v -0.008000 0.012900 0.037044
-v -0.013856 0.012900 0.042900
-v 0.000000 0.012900 0.034900
-v 0.013856 0.012900 0.042900
-v -0.020000 0.006760 0.075600
-v -0.020000 0.006760 -0.012398
-v -0.018877 -0.001982 0.044797
-v -0.018480 -0.003505 0.048732
-v -0.018777 -0.001945 0.075600
-v -0.017726 -0.003833 0.163093
-v -0.013161 -0.013053 0.058159
-v -0.016670 -0.008191 0.054819
-v -0.016119 -0.008731 0.075600
-v -0.009698 -0.015662 0.059338
-v -0.012025 -0.013632 0.075600
-v -0.006504 -0.016678 0.075600
-v -0.000000 -0.017750 0.075600
-v -0.000000 -0.015479 0.162587
-v 0.006873 -0.016611 0.058552
-v 0.005238 -0.017469 0.059981
-v -0.000000 -0.018152 0.060190
-v -0.006874 -0.016610 0.058551
-v -0.005577 -0.017375 0.059951
-v -0.000001 -0.017790 0.058889
-v -0.017783 -0.005639 0.052082
-v -0.016159 -0.008440 0.053561
-v -0.018202 -0.002766 0.042130
-v -0.019040 -0.001282 0.040457
-v -0.019004 -0.001521 0.036065
-v -0.019278 -0.000710 -0.012015
-v -0.018775 -0.002635 0.031956
-v -0.018323 -0.004451 0.028346
-v -0.017636 -0.005173 0.029543
-v -0.015438 -0.011195 0.021684
-v -0.017576 -0.006793 0.025305
-v -0.017651 -0.007495 -0.011666
-v -0.016133 -0.009192 0.024525
-v -0.009254 -0.016963 0.019047
-v -0.012694 -0.014052 0.021271
-v -0.014657 -0.012757 -0.011402
-v -0.012775 -0.014437 0.019994
-v -0.004877 -0.018641 0.018555
-v 0.000000 -0.019243 0.018406
-v -0.004053 -0.017659 -0.013120
-v 0.000000 -0.020012 -0.011045
-v -0.007741 -0.016386 -0.013187
-v -0.007793 -0.018450 -0.011122
-v -0.011145 -0.016607 -0.011212
-v -0.013377 -0.011450 -0.013446
-v -0.017416 0.000890 -0.014092
-v -0.010471 -0.009590 0.164744
-v -0.020000 0.006760 0.163598
-v -0.017045 0.000607 0.165278
-v -0.019121 0.000433 0.163292
-v -0.012455 -0.011131 0.162773
-v -0.015399 -0.007954 0.162910
-v -0.011105 -0.009754 0.164735
-v -0.008928 -0.013453 0.162674
-v -0.004759 -0.014945 0.162610
-v 0.000000 -0.013582 0.164534
-v -0.016850 0.012900 -0.012204
-v -0.016850 0.011003 -0.014204
-v -0.017833 0.012745 0.163406
-v -0.016850 0.011003 0.165404
-v 0.016850 0.011003 0.165404
-v 0.016850 0.012900 0.163404
-v -0.016850 0.012900 0.163404
-v -0.018496 0.012405 0.163413
-v -0.019171 0.011802 0.163424
-v -0.017585 0.010679 0.165421
-v -0.019183 0.011788 -0.012224
-v -0.019646 0.010959 0.163436
-v -0.017717 0.010496 0.165430
-v -0.019850 0.009900 -0.012263
-v -0.017851 0.009891 0.165462
-v -0.019850 0.009900 0.163463
-v -0.017851 0.009891 -0.014262
-v -0.019650 0.010946 -0.012236
-v -0.018511 0.012395 -0.012213
-v -0.017342 0.010872 -0.014211
-v -0.017849 0.012739 -0.012207
-v 0.019850 0.009900 -0.012263
-v 0.019850 0.009900 0.163463
-v 0.019652 0.010946 0.163437
-v 0.019180 0.011789 0.163424
-v 0.019649 0.010953 -0.012236
-v 0.017351 0.010866 0.165411
-v 0.018506 0.012398 0.163413
-v 0.017845 0.012741 0.163406
-v 0.018501 0.012401 -0.012213
-v 0.016850 0.012900 -0.012204
-v 0.016850 0.011003 -0.014204
-v 0.017836 0.012745 -0.012207
-v 0.017359 0.010861 -0.014211
-v 0.019174 0.011796 -0.012224
-v 0.020000 0.006760 -0.012398
-v 0.020000 0.006760 0.075600
-v 0.020000 0.006760 0.163598
-v 0.017851 0.009891 0.165462
-v 0.004914 -0.018632 0.018558
-v 0.012694 -0.014513 0.019962
-v 0.009842 -0.017439 -0.011172
-v 0.009194 -0.016995 0.019036
-v 0.012696 -0.014051 0.021272
-v 0.016134 -0.009190 0.024527
-v 0.018283 -0.005474 -0.011769
-v 0.015491 -0.011112 0.021736
-v 0.017878 -0.005923 0.026303
-v 0.016851 -0.008573 0.023600
-v 0.018521 -0.003703 0.029628
-v 0.019042 -0.001309 0.037868
-v 0.018891 -0.002096 0.033543
-v 0.018999 -0.001456 0.042247
-v 0.018278 -0.004181 0.049954
-v 0.018757 -0.002471 0.046344
-v 0.017676 -0.004685 0.048340
-v 0.018202 -0.002767 0.042132
-v 0.017483 -0.006410 0.053015
-v 0.016158 -0.008441 0.053562
-v 0.016251 -0.008973 0.055490
-v 0.013246 -0.012968 0.058115
-v 0.012687 -0.013111 0.057055
-v 0.009848 -0.015576 0.059304
-v 0.006504 -0.016678 0.075600
-v 0.012025 -0.013632 0.075600
-v 0.012453 -0.011132 0.162773
-v 0.015398 -0.007956 0.162909
-v 0.018777 -0.001945 0.075600
-v 0.016119 -0.008731 0.075600
-v 0.017726 -0.003834 0.163093
-v 0.016090 -0.005051 -0.013781
-v 0.019494 0.000840 -0.012095
-v 0.014597 -0.009662 -0.013539
-v 0.015987 -0.010626 -0.011508
-v 0.012048 -0.013130 -0.013358
-v 0.012738 -0.015322 -0.011275
-v 0.004233 -0.017617 -0.013122
-v 0.004123 -0.019588 -0.011066
-v 0.008927 -0.013454 0.162674
-v 0.004758 -0.014945 0.162610
-v 0.007966 -0.011801 0.164627
-v 0.011095 -0.009763 0.164734
-v -0.016170 0.000544 0.165275
-v 0.019122 0.000435 0.163292
-v -0.000000 -0.018116 -0.013096
-v 0.008618 -0.015654 -0.013225
-v -0.018000 0.006760 -0.014400
-v -0.016263 -0.005366 -0.013764
-v -0.010678 -0.014560 -0.013283
-v 0.018001 0.006760 -0.014400
-v 0.017116 0.010978 -0.014205
-v -0.017101 0.010981 -0.014205
-v -0.017576 0.010688 -0.014220
-v -0.017712 0.010505 -0.014230
-v 0.017851 0.009891 -0.014262
-v 0.017713 0.010505 -0.014230
-v -0.000000 -0.016565 0.057943
-v 0.005098 -0.015909 0.057716
-v -0.012314 -0.011868 0.055681
-v 0.012233 -0.011949 0.055734
-v -0.009091 -0.014324 0.057057
-v 0.009220 -0.014251 0.057022
-v -0.014780 -0.008209 0.052349
-v 0.014512 -0.008747 0.052978
-v 0.015923 -0.005957 0.049562
-v 0.016463 -0.004315 0.046176
-v -0.016130 -0.005374 0.048538
-v 0.016787 -0.003149 0.038024
-v -0.016587 -0.003874 0.044839
-v 0.016736 -0.003311 0.042260
-v 0.016623 -0.003908 0.033843
-v -0.016780 -0.003141 0.040668
-v 0.016216 -0.005454 0.030112
-v 0.018185 -0.002935 0.035641
-v 0.015501 -0.007542 0.027010
-v 0.014368 -0.009927 0.024580
-v -0.015201 -0.008261 0.026184
-v 0.017637 -0.005172 0.029546
-v 0.011788 -0.013271 0.022276
-v 0.008677 -0.015490 0.021243
-v 0.006874 -0.017616 0.019963
-v 0.004690 -0.016976 0.020729
-v -0.008734 -0.015460 0.021254
-v -0.000000 -0.017541 0.020568
-v 0.000001 -0.018813 0.019687
-v -0.006872 -0.017617 0.019962
-v -0.004662 -0.016983 0.020727
-v -0.011831 -0.013230 0.022299
-v -0.014150 -0.010300 0.024269
-v -0.016017 -0.006100 0.029007
-v -0.018185 -0.002936 0.035639
-v -0.016751 -0.003331 0.036408
-v -0.016508 -0.004384 0.032442
-v -0.017676 -0.004684 0.048338
-v -0.012688 -0.013110 0.057054
-v -0.005290 -0.015857 0.057697
-v -0.017359 0.010861 0.165411
-v -0.017114 0.010978 0.165405
-v 0.017105 0.010980 0.165405
-v 0.017998 0.006760 0.165600
-v 0.013678 -0.007019 0.164878
-v 0.017042 0.000595 0.165277
-v -0.017998 0.006760 0.165600
-v 0.004260 -0.013110 0.164559
-v -0.004262 -0.013110 0.164559
-v -0.007973 -0.011798 0.164627
-v -0.013690 -0.007003 0.164879
-v 0.014199 0.012900 0.042702
-v 0.000000 0.012900 0.034505
-v -0.014199 0.012900 0.042702
-v -0.008198 0.012900 0.036701
-v 0.008198 0.012900 0.036701
-v -0.014199 0.012900 0.059098
-v -0.008198 0.012900 0.065099
-v -0.000000 0.012900 0.067295
-v 0.008198 0.012900 0.065099
-v 0.014199 0.012900 0.059098
-v -0.001880 0.012900 0.072863
-v -0.004923 0.012900 0.075074
-v 0.001880 0.012900 0.072863
-v 0.004923 0.012900 0.075074
-v 0.006085 0.012900 0.078650
-v 0.004923 0.012900 0.082227
-v -0.006085 0.012900 0.078650
-v -0.004923 0.012900 0.082227
-v -0.001880 0.012900 0.084437
-v 0.001880 0.012900 0.084437
-v -0.005003 0.012900 0.099785
-v -0.001911 0.012900 0.102031
-v 0.001911 0.012900 0.090269
-v 0.005003 0.012900 0.092515
-v -0.001911 0.012900 0.090269
-v 0.005003 0.012900 0.099785
-v 0.006184 0.012900 0.096150
-v -0.005003 0.012900 0.092515
-v -0.006184 0.012900 0.096150
-v 0.001911 0.012900 0.102031
-v 0.017551 0.010715 -0.014201
-v 0.017144 0.009891 -0.014262
-v 0.017010 0.010505 -0.014230
-v 0.017287 0.006760 -0.014400
-v -0.017159 0.009891 -0.014262
-v -0.017025 0.010505 -0.014230
-v -0.017302 0.006760 -0.014400
-v -0.003838 -0.017246 -0.013142
-v -0.007274 -0.016060 -0.013204
-v -0.012667 -0.011115 -0.013463
-v -0.016493 0.001142 -0.014106
-v 0.015107 -0.004951 -0.013786
-v 0.013539 -0.009795 -0.013532
-v 0.011678 -0.012609 -0.013385
-v 0.003882 -0.017207 -0.013144
-v -0.000062 -0.017671 -0.013120
-v 0.008313 -0.015223 -0.013248
-v -0.015318 -0.005229 -0.013772
-v -0.010464 -0.013804 -0.013322
-v -0.003962 -0.019557 -0.011198
-v 0.016850 0.012900 0.075600
-v 0.019850 0.009900 0.075600
-v 0.019177 0.011793 0.075600
-v 0.018504 0.012399 0.075600
-v 0.019650 0.010950 0.075600
-v -0.016850 0.012900 0.075600
-v -0.019177 0.011795 0.075600
-v -0.017841 0.012742 0.075600
-v -0.019850 0.009900 0.075600
-v -0.019648 0.010952 0.075600
-v -0.018504 0.012400 0.075600
-v 0.017708 0.010514 0.165429
-v 0.017545 0.010700 0.165401
-v 0.017078 0.010513 0.165429
-v 0.017357 0.006760 0.165600
-v 0.017216 0.009891 0.165462
-v -0.017229 0.009891 0.165462
-v -0.017370 0.006760 0.165600
-v -0.017099 0.010496 0.165430
-v -0.000000 -0.013199 0.164554
-v 0.007511 -0.011520 0.164642
-v 0.010461 -0.009598 0.164743
-v 0.012897 -0.007011 0.164878
-v 0.016165 0.000533 0.165274
-v 0.004017 -0.012754 0.164578
-v -0.004019 -0.012754 0.164578
-v -0.007518 -0.011517 0.164642
-v -0.012909 -0.006996 0.164879
-v 0.000000 0.012900 0.163404
-v 0.000000 0.011003 0.165404
-v -0.000006 0.009891 0.165462
-v -0.000006 0.006760 0.165600
-v -0.000010 0.010505 0.165429
-v -0.000003 0.000539 0.165274
-v -0.000006 -0.007003 0.164879
-v -0.000005 -0.009594 0.164743
-v -0.000003 -0.011518 0.164642
-v -0.016850 0.012900 0.031793
-v -0.020000 0.006760 0.031793
-v 0.020000 0.006760 0.031793
-v 0.016850 0.012900 0.031793
-v -0.019181 0.011791 0.031793
-v -0.017846 0.012740 0.031793
-v 0.018502 0.012400 0.031793
-v 0.019650 0.010952 0.031793
-v 0.017838 0.012744 0.031793
-v 0.019850 0.009900 0.031793
-v 0.019175 0.011795 0.031793
-v -0.019850 0.009900 0.031793
-v -0.019650 0.010948 0.031793
-v -0.018509 0.012397 0.031793
-v -0.019180 0.011791 0.037044
-v -0.020000 0.006760 0.037044
-v -0.017846 0.012741 0.037044
-v -0.016850 0.012900 0.037044
-v -0.019850 0.009900 0.037044
-v -0.019649 0.010948 0.037044
-v -0.018508 0.012397 0.037044
-v -0.014664 -0.003820 0.165046
-v 0.014655 -0.003835 0.165045
-v 0.015513 -0.003806 0.165046
-v -0.015521 -0.003790 0.165047
-v -0.000004 -0.003827 0.165045
-v 0.000251 -0.015641 -0.013226
-v -0.019850 0.009900 0.043222
-v -0.019649 0.010949 0.043222
-v -0.018507 0.012398 0.043222
-v -0.019180 0.011792 0.043222
-v -0.020000 0.006760 0.043222
-v -0.017845 0.012741 0.043222
-v -0.019850 0.009900 0.050841
-v -0.019649 0.010950 0.050841
-v -0.018506 0.012398 0.050841
-v -0.019179 0.011793 0.050841
-v -0.020000 0.006760 0.050841
-v -0.017844 0.012741 0.050841
-v -0.016850 0.012900 0.050841
-v -0.019850 0.009900 0.059353
-v -0.019649 0.010951 0.059352
-v -0.018505 0.012399 0.059353
-v -0.019178 0.011794 0.059352
-v -0.020000 0.006760 0.059352
-v -0.017843 0.012741 0.059352
-v 0.020000 0.006760 0.025653
-v -0.016850 0.012900 0.025680
-v -0.020000 0.006760 0.025653
-v 0.016850 0.012900 0.025680
-v -0.019181 0.011790 0.025677
-v -0.017847 0.012740 0.025679
-v 0.018502 0.012401 0.025678
-v 0.019650 0.010952 0.025675
-v 0.017837 0.012744 0.025679
-v 0.000251 -0.013207 -0.013354
-v 0.000000 0.012900 -0.012204
-v 0.000000 0.012900 0.025680
-v 0.000251 -0.010455 -0.013498
-v -0.000007 0.010505 -0.014230
-v -0.000008 0.009891 -0.014262
-v 0.019850 0.009900 0.025671
-v 0.019175 0.011795 0.025677
-v -0.019850 0.009900 0.025671
-v -0.019650 0.010948 0.025675
-v -0.018509 0.012396 0.025678
-v 0.017448 -0.005338 0.075600
-v 0.019388 0.002407 0.075600
-v 0.017236 0.000838 -0.014090
-v 0.016380 0.000959 -0.014096
-v 0.020000 0.006760 0.037056
-v 0.019850 0.009900 0.037056
-v 0.019175 0.011795 0.037056
-v 0.018502 0.012400 0.037056
-v 0.019650 0.010952 0.037056
-v 0.020000 0.006760 0.043243
-v 0.019850 0.009900 0.043243
-v 0.019176 0.011794 0.043243
-v 0.018502 0.012400 0.043243
-v 0.019650 0.010951 0.043243
-v 0.016395 0.012900 0.050834
-v 0.020000 0.006760 0.050835
-v 0.019850 0.009900 0.050835
-v 0.019176 0.011794 0.050835
-v 0.018503 0.012400 0.050835
-v 0.019650 0.010951 0.050836
-v 0.017838 0.012744 0.043243
-v 0.016850 0.012900 0.037044
-v 0.017838 0.012744 0.037044
-v 0.000251 0.006760 -0.014400
-v 0.000251 -0.005090 -0.013779
-v 0.016850 0.012900 0.050835
-v 0.017838 0.012744 0.050835
-v 0.016850 0.012900 0.043243
-v 0.017838 0.012744 0.075600
-v 0.000251 0.001050 -0.014101
-v -0.017448 -0.005338 0.075600
-v -0.019388 0.002407 0.075600
-v 0.020000 0.006760 0.059351
-v 0.019850 0.009900 0.059351
-v 0.019176 0.011793 0.059351
-v 0.018503 0.012400 0.059351
-v 0.019650 0.010951 0.059351
-v 0.017838 0.012744 0.059351
-v 0.016850 0.012900 0.059351
-v -0.016850 0.012900 0.043222
-v 0.000000 0.011003 -0.014204
-v 0.018424 -0.002660 0.026136
-v -0.016395 0.012900 0.050840
-v -0.016850 0.012900 0.059352
-v -0.009165 0.012900 0.107061
-v 0.018510 -0.002803 0.055317
-v 0.009165 0.012900 0.107061
-v 0.000000 0.012900 0.107061
-v -0.016000 0.009159 0.050841
-v 0.016000 0.009159 0.050835
-v 0.013856 0.009159 0.058900
-v 0.008000 0.009159 0.064756
-v -0.000000 0.009159 0.066900
-v -0.008000 0.009159 0.064756
-v -0.013856 0.009159 0.058900
-v 0.008000 0.009159 0.037044
-v -0.008000 0.009159 0.037044
-v -0.013856 0.009159 0.042900
-v 0.000000 0.009159 0.034900
-v 0.013856 0.009159 0.042900
-v 0.001777 0.009159 0.101619
-v -0.005750 0.009159 0.096150
-v -0.004652 0.009159 0.092770
-v 0.005750 0.009159 0.096150
-v 0.004652 0.009159 0.099530
-v -0.001777 0.009159 0.090681
-v 0.004652 0.009159 0.092770
-v 0.001777 0.009159 0.090681
-v -0.001777 0.009159 0.101619
-v -0.004652 0.009159 0.099530
-v -0.001777 0.009159 0.073181
-v -0.004652 0.009159 0.075270
-v 0.001777 0.009159 0.073181
-v 0.004652 0.009159 0.075270
-v 0.005750 0.009159 0.078650
-v 0.004652 0.009159 0.082030
-v -0.005750 0.009159 0.078650
-v -0.004652 0.009159 0.082030
-v -0.001777 0.009159 0.084119
-v 0.001777 0.009159 0.084119
-v 0.019986 0.007045 -0.012386
-v -0.017987 0.007044 -0.014388
-v 0.017344 0.007044 0.165587
-v 0.017987 0.007044 -0.014388
-v -0.019986 0.007045 -0.012386
-v 0.017985 0.007044 0.165587
-v 0.019986 0.007044 0.163586
-v -0.017985 0.007044 0.165587
-v -0.019986 0.007044 0.163586
-v 0.017274 0.007044 -0.014388
-v -0.017289 0.007044 -0.014388
-v 0.019986 0.007045 0.075600
-v -0.019986 0.007045 0.075600
-v -0.017357 0.007044 0.165587
-v -0.000006 0.007044 0.165587
-v -0.019986 0.007045 0.031793
-v 0.019986 0.007045 0.031793
-v -0.019986 0.007045 0.037044
-v 0.000227 0.007044 -0.014388
-v -0.019986 0.007045 0.043222
-v -0.019986 0.007045 0.050841
-v -0.019986 0.007045 0.059352
-v 0.019986 0.007045 0.025654
-v -0.019986 0.007045 0.025654
-v 0.019986 0.007045 0.037056
-v 0.019986 0.007045 0.043243
-v 0.019986 0.007045 0.050835
-v 0.019986 0.007045 0.059351
-v -0.019559 0.006736 0.075337
-v -0.019559 0.006736 -0.011771
-v -0.019559 0.006736 0.163028
-v 0.019559 0.006736 -0.011771
-v 0.019559 0.006736 0.075337
-v 0.019559 0.006736 0.163028
-v -0.017603 0.006736 -0.013672
-v 0.017604 0.006736 -0.013672
-v 0.017935 0.006736 0.165023
-v -0.017935 0.006736 0.165023
-v 0.016906 0.006736 -0.013672
-v -0.016920 0.006736 -0.013672
-v 0.017297 0.006736 0.165023
-v -0.017309 0.006736 0.165023
-v -0.000006 0.006736 0.165023
-v -0.019559 0.006736 0.031683
-v 0.019559 0.006736 0.031683
-v -0.019559 0.006736 0.036915
-v -0.019559 0.006736 0.043072
-v -0.019559 0.006736 0.050664
-v -0.019559 0.006736 0.059146
-v 0.019559 0.006736 0.025563
-v -0.019559 0.006736 0.025563
-v 0.019559 0.006736 0.036927
-v 0.019559 0.006736 0.043092
-v 0.019559 0.006736 0.050658
-v 0.000245 0.006736 -0.013672
-v 0.019559 0.006736 0.059144
-v 0.019545 0.007020 -0.011759
-v -0.017590 0.007019 -0.013660
-v 0.017284 0.007019 0.165011
-v 0.017590 0.007019 -0.013660
-v -0.019545 0.007020 -0.011759
-v 0.017922 0.007019 0.165011
-v 0.019545 0.007020 0.163016
-v -0.017922 0.007019 0.165011
-v -0.019545 0.007020 0.163016
-v 0.016893 0.007019 -0.013660
-v -0.016908 0.007019 -0.013660
-v 0.019545 0.007020 0.075337
-v -0.019545 0.007020 0.075337
-v -0.017297 0.007019 0.165011
-v -0.000006 0.007019 0.165011
-v -0.019545 0.007020 0.031683
-v 0.019545 0.007020 0.031683
-v -0.019545 0.007020 0.036915
-v 0.000222 0.007019 -0.013660
-v -0.019545 0.007020 0.043072
-v -0.019545 0.007020 0.050664
-v -0.019545 0.007020 0.059146
-v 0.019545 0.007020 0.025565
-v -0.019545 0.007020 0.025565
-v 0.019545 0.007020 0.036927
-v 0.019545 0.007020 0.043092
-v 0.019545 0.007020 0.050658
-v 0.019545 0.007020 0.059144
-v -0.017984 0.007113 -0.014384
-v 0.017341 0.007113 0.165584
-v -0.019983 0.007114 -0.012383
-v -0.019983 0.007114 0.163583
-v 0.019983 0.007114 0.075600
-v -0.000006 0.007113 0.165584
-v -0.019983 0.007114 0.031793
-v -0.019983 0.007114 0.037044
-v -0.019983 0.007114 0.043222
-v -0.019983 0.007114 0.050841
-v -0.019983 0.007114 0.059352
-v -0.019983 0.007114 0.025655
-v 0.019983 0.007114 -0.012383
-v 0.017984 0.007113 -0.014384
-v 0.017981 0.007113 0.165584
-v 0.019983 0.007114 0.163583
-v -0.017981 0.007113 0.165584
-v 0.017271 0.007113 -0.014384
-v -0.017286 0.007113 -0.014384
-v -0.019983 0.007114 0.075600
-v -0.017354 0.007113 0.165584
-v 0.019983 0.007114 0.031793
-v 0.000221 0.007113 -0.014384
-v 0.019983 0.007114 0.025655
-v 0.019983 0.007114 0.037056
-v 0.019983 0.007114 0.043243
-v 0.019983 0.007114 0.050835
-v 0.019983 0.007114 0.059351
-v -0.017987 0.006687 0.165596
-v -0.019990 0.006685 0.163594
-v 0.017987 0.006687 0.165596
-v -0.019991 0.006672 -0.012393
-v 0.017992 0.006690 -0.014396
-v -0.017994 0.006691 -0.014396
-v 0.019990 0.006685 0.163594
-v -0.019993 0.006709 0.075600
-v 0.019994 0.006690 -0.012394
-v -0.017293 0.006694 -0.014397
-v 0.017343 0.006687 0.165596
-v -0.017356 0.006687 0.165596
-v -0.000006 0.006687 0.165596
-v -0.019987 0.006657 0.050770
-v 0.000251 0.006693 -0.014396
-v -0.019989 0.006665 0.043189
-v -0.019988 0.006662 0.037032
-v -0.019986 0.006649 0.031795
-v -0.019980 0.006628 0.025684
-v 0.019993 0.006709 0.075600
-v 0.017276 0.006692 -0.014396
-v 0.019981 0.006649 0.025658
-v 0.019985 0.006651 0.050782
-v 0.019989 0.006665 0.037065
-v 0.019987 0.006656 0.031814
-v 0.019988 0.006663 0.043231
-v -0.019982 0.006639 0.059227
-v 0.019982 0.006647 0.059303
-vt 0.554694 0.657391
-vt 0.433825 0.577068
-vt 0.537413 0.732767
-vt 0.171840 0.756473
-vt 0.004212 0.517422
-vt 0.508978 0.054638
-vt 0.392232 0.366129
-vt 0.535955 0.277647
-vt 0.676569 0.426611
-vt 0.570944 0.608854
-vt 0.657163 0.340708
-vt 0.197012 0.750978
-vt 0.634797 0.224341
-vt 0.536619 0.527298
-vt 0.536314 0.531147
-vt 0.536640 0.005947
-vt 0.644694 0.154642
-vt 0.655354 0.714621
-vt 0.454133 0.386270
-vt 0.251537 0.915962
-vt 0.562843 0.123107
-vt 0.676441 0.480812
-vt 0.655355 0.642524
-vt 0.637665 0.486200
-vt 0.432241 0.529792
-vt 0.433661 0.200774
-vt 0.633750 0.219086
-vt 0.454217 0.366000
-vt 0.347872 0.351543
-vt 0.532084 0.715142
-vt 0.083498 0.916082
-vt 0.432769 0.139167
-vt 0.029777 0.173023
-vt 0.971059 0.270165
-vt 0.196511 0.924853
-vt 0.069097 0.789362
-vt 0.432118 0.226219
-vt 0.960817 0.525768
-vt 0.062888 0.898170
-vt 0.751919 0.532438
-vt 0.645243 0.032928
-vt 0.536503 0.029725
-vt 0.107693 0.763735
-vt 0.746048 0.263094
-vt 0.039255 0.237927
-vt 0.745523 0.377500
-vt 0.794566 0.698936
-vt 0.748277 0.502909
-vt 0.981678 0.688262
-vt 0.655395 0.610961
-vt 0.014520 0.474610
-vt 0.967778 0.039348
-vt 0.955233 0.260973
-vt 0.015769 0.092595
-vt 0.634942 0.252270
-vt 0.709424 0.528492
-vt 0.674041 0.251333
-vt 0.637096 0.502534
-vt 0.535204 0.530002
-vt 0.273950 0.423995
-vt 0.635823 0.535625
-vt 0.359047 0.385937
-vt 0.553218 0.164920
-vt 0.192800 0.757975
-vt 0.634735 0.222563
-vt 0.535521 0.522712
-vt 0.329998 0.345864
-vt 0.029987 0.504457
-vt 0.004768 0.505706
-vt 0.299688 0.366041
-vt 0.595338 0.596712
-vt 0.023828 0.663170
-vt 0.537897 0.678838
-vt 0.961468 0.192683
-vt 0.971275 0.266931
-vt 0.304474 0.848948
-vt 0.031633 0.458764
-vt 0.747975 0.497125
-vt 0.283964 0.890144
-vt 0.960814 0.228346
-vt 0.361245 0.386645
-vt 0.349320 0.402955
-vt 0.330282 0.408849
-vt 0.039492 0.241423
-vt 0.536760 0.713602
-vt 0.442348 0.349999
-vt 0.102746 0.756393
-vt 0.016753 0.149163
-vt 0.214218 0.745926
-vt 0.750133 0.062884
-vt 0.609524 0.161420
-vt 0.014526 0.472387
-vt 0.977669 0.236466
-vt 0.030308 0.150596
-vt 0.297338 0.894235
-vt 0.019649 0.278496
-vt 0.546671 0.126797
-vt 0.015396 0.168157
-vt 0.212882 0.760696
-vt 0.787316 0.081761
-vt 0.012582 0.624053
-vt 0.774112 0.718076
-vt 0.727050 0.629840
-vt 0.099210 0.924604
-vt 0.284711 0.787354
-vt 0.984125 0.711960
-vt 0.983477 0.045252
-vt 0.709486 0.537653
-vt 0.706809 0.620714
-vt 0.775145 0.106442
-vt 0.316737 0.380021
-vt 0.539605 0.004563
-vt 0.696671 0.159777
-vt 0.434073 0.229407
-vt 0.392184 0.386776
-vt 0.748928 0.228219
-vt 0.330347 0.406689
-vt 0.774356 0.710607
-vt 0.539622 0.459478
-vt 0.070462 0.768085
-vt 0.433350 0.596419
-vt 0.017375 0.271882
-vt 0.988091 0.736164
-vt 0.038080 0.286727
-vt 0.956653 0.498984
-vt 0.643348 0.004427
-vt 0.567158 0.121473
-vt 0.004703 0.376145
-vt 0.536588 0.737505
-vt 0.490932 0.375868
-vt 0.675853 0.533596
-vt 0.636743 0.530371
-vt 0.590770 0.475309
-vt 0.538671 0.024090
-vt 0.538521 0.033513
-vt 0.043277 0.857867
-vt 0.749450 0.032688
-vt 0.645173 0.029445
-vt 0.754393 0.023111
-vt 0.589149 0.533687
-vt 0.013383 0.242884
-vt 0.779461 0.710223
-vt 0.531271 0.710635
-vt 0.587157 0.229693
-vt 0.438687 0.371517
-vt 0.674437 0.267925
-vt 0.655378 0.678955
-vt 0.732820 0.609916
-vt 0.709914 0.619362
-vt 0.756039 0.657320
-vt 0.736972 0.091197
-vt 0.261922 0.777755
-vt 0.428189 0.680875
-vt 0.774985 0.650207
-vt 0.566885 0.642223
-vt 0.265301 0.924613
-vt 0.534033 0.735766
-vt 0.403920 0.403362
-vt 0.534025 0.222534
-vt 0.344296 0.372255
-vt 0.423430 0.342895
-vt 0.751600 0.028401
-vt 0.674169 0.257466
-vt 0.655361 0.630077
-vt 0.040907 0.832261
-vt 0.588054 0.224282
-vt 0.954687 0.488290
-vt 0.536350 0.710608
-vt 0.635114 0.258340
-vt 0.434245 0.524422
-vt 0.455933 0.365409
-vt 0.098472 0.751315
-vt 0.034060 0.471008
-vt 0.971354 0.487374
-vt 0.550671 0.093325
-vt 0.277201 0.909329
-vt 0.025321 0.643014
-vt 0.709536 0.503914
-vt 0.984312 0.378254
-vt 0.979750 0.666962
-vt 0.978251 0.601641
-vt 0.709493 0.536905
-vt 0.751446 0.535548
-vt 0.751236 0.536631
-vt 0.746915 0.245359
-vt 0.970965 0.268624
-vt 0.708384 0.222919
-vt 0.549232 0.313231
-vt 0.055990 0.784833
-vt 0.691240 0.378056
-vt 0.009608 0.248066
-vt 0.587869 0.259631
-vt 0.329955 0.343701
-vt 0.432345 0.236884
-vt 0.012306 0.642800
-vt 0.013446 0.468400
-vt 0.962921 0.644716
-vt 0.761952 0.657429
-vt 0.956562 0.255253
-vt 0.682882 0.614869
-vt 0.655394 0.612791
-vt 0.038668 0.275454
-vt 0.154653 0.930696
-vt 0.603935 0.620730
-vt 0.971265 0.271920
-vt 0.980807 0.074201
-vt 0.008589 0.510309
-vt 0.423159 0.409961
-vt 0.979928 0.526074
-vt 0.746895 0.027032
-vt 0.639296 0.291549
-vt 0.707748 0.267567
-vt 0.655352 0.710416
-vt 0.302023 0.385460
-vt 0.978558 0.100001
-vt 0.707715 0.257157
-vt 0.709559 0.481150
-vt 0.678586 0.427749
-vt 0.538563 0.295323
-vt 0.589068 0.302785
-vt 0.321827 0.363518
-vt 0.749767 0.224348
-vt 0.004374 0.516796
-vt 0.537692 0.481776
-vt 0.707680 0.218088
-vt 0.540126 0.738139
-vt 0.095330 0.906145
-vt 0.051304 0.864865
-vt 0.748400 0.008421
-vt 0.749619 0.003632
-vt 0.748082 0.003099
-vt 0.538111 0.005071
-vt 0.541146 0.004472
-vt 0.677240 0.327978
-vt 0.531948 0.713658
-vt 0.655397 0.737485
-vt 0.673187 0.226015
-vt 0.521964 0.411128
-vt 0.979908 0.525604
-vt 0.423475 0.344711
-vt 0.749228 0.023240
-vt 0.274018 0.328282
-vt 0.802967 0.001424
-vt 0.290863 0.785753
-vt 0.311067 0.849306
-vt 0.772869 0.678776
-vt 0.774077 0.718536
-vt 0.526667 0.101677
-vt 0.249993 0.755988
-vt 0.971146 0.485923
-vt 0.779256 0.718195
-vt 0.531589 0.718580
-vt 0.954594 0.266047
-vt 0.433746 0.277285
-vt 0.409325 0.371161
-vt 0.009620 0.247452
-vt 0.330149 0.391516
-vt 0.339081 0.364414
-vt 0.956471 0.519081
-vt 0.025901 0.623647
-vt 0.116296 0.915735
-vt 0.309020 0.825194
-vt 0.008185 0.682350
-vt 0.036461 0.262598
-vt 0.955339 0.493327
-vt 0.676143 0.497530
-vt 0.009030 0.235849
-vt 0.709533 0.487456
-vt 0.535066 0.255380
-vt 0.348072 0.401160
-vt 0.531348 0.710226
-vt 0.636835 0.509223
-vt 0.034995 0.511718
-vt 0.301854 0.366717
-vt 0.536597 0.028305
-vt 0.029675 0.195353
-vt 0.643361 0.009756
-vt 0.536889 0.498065
-vt 0.655354 0.713178
-vt 0.405161 0.350797
-vt 0.590859 0.472850
-vt 0.433423 0.363566
-vt 0.299959 0.386171
-vt 0.972895 0.491371
-vt 0.008259 0.560156
-vt 0.250249 0.930884
-vt 0.297009 0.848558
-vt 0.978844 0.242936
-vt 0.956744 0.521765
-vt 0.432278 0.615510
-vt 0.028368 0.091511
-vt 0.428819 0.074182
-vt 0.300447 0.816374
-vt 0.590645 0.478125
-vt 0.675014 0.537098
-vt 0.588282 0.276082
-vt 0.779220 0.718583
-vt 0.016948 0.111647
-vt 0.525790 0.653731
-vt 0.278146 0.791181
-vt 0.746247 0.257677
-vt 0.533658 0.024110
-vt 0.011107 0.662066
-vt 0.434475 0.469057
-vt 0.033360 0.231697
-vt 0.584750 0.152850
-vt 0.544124 0.678517
-vt 0.503025 0.726987
-vt 0.134691 0.743314
-vt 0.971919 0.480712
-vt 0.361166 0.366144
-vt 0.718219 0.130605
-vt 0.536565 0.504705
-vt 0.633687 0.219826
-vt 0.588135 0.269890
-vt 0.641617 0.463663
-vt 0.640483 0.461614
-vt 0.629973 0.443284
-vt 0.423192 0.408130
-vt 0.645562 0.061918
-vt 0.540987 0.029754
-vt 0.047483 0.832403
-vt 0.645257 0.034371
-vt 0.056776 0.856726
-vt 0.749529 0.032224
-vt 0.754691 0.032153
-vt 0.538302 0.738043
-vt 0.744670 0.062316
-vt 0.533634 0.024500
-vt 0.012978 0.193447
-vt 0.174444 0.741716
-vt 0.544872 0.094017
-vt 0.644305 0.152511
-vt 0.676009 0.503630
-vt 0.248607 0.770773
-vt 0.684540 0.613164
-vt 0.538354 0.735708
-vt 0.803117 0.754596
-vt 0.216163 0.923612
-vt 0.509042 0.698525
-vt 0.534821 0.009833
-vt 0.589833 0.530107
-vt 0.655353 0.732167
-vt 0.977857 0.519571
-vt 0.579456 0.137911
-vt 0.231654 0.764947
-vt 0.034543 0.248596
-vt 0.533591 0.223650
-vt 0.432271 0.234785
-vt 0.434126 0.231462
-vt 0.688923 0.378114
-vt 0.708399 0.221031
-vt 0.034526 0.247939
-vt 0.292615 0.871304
-vt 0.971832 0.273596
-vt 0.799650 0.030402
-vt 0.425214 0.041700
-vt 0.670522 0.152200
-vt 0.695412 0.140669
-vt 0.707712 0.251038
-vt 0.707717 0.244226
-vt 0.676339 0.487134
-vt 0.432252 0.527666
-vt 0.650571 0.588307
-vt 0.311618 0.402432
-vt 0.422919 0.392337
-vt 0.979884 0.228177
-vt 0.535566 0.521602
-vt 0.588120 0.226046
-vt 0.674953 0.536432
-vt 0.628248 0.312708
-vt 0.745517 0.158086
-vt 0.637511 0.490851
-vt 0.954561 0.483546
-vt 0.977404 0.126169
-vt 0.766630 0.678460
-vt 0.020850 0.685237
-vt 0.954700 0.274866
-vt 0.116373 0.930626
-vt 0.778725 0.715144
-vt 0.434018 0.475875
-vt 0.969029 0.717057
-vt 0.504650 0.422273
-vt 0.414114 0.388961
-vt 0.536884 0.715094
-vt 0.658207 0.416637
-vt 0.749371 0.218152
-vt 0.961663 0.611119
-vt 0.707784 0.273832
-vt 0.591159 0.451477
-vt 0.589762 0.500619
-vt 0.033419 0.483409
-vt 0.302237 0.803799
-vt 0.349132 0.349732
-vt 0.502727 0.423468
-vt 0.404913 0.402032
-vt 0.393972 0.366687
-vt 0.359063 0.366870
-vt 0.580721 0.134282
-vt 0.432424 0.518965
-vt 0.029970 0.505122
-vt 0.666956 0.165275
-vt 0.130987 0.758053
-vt 0.033282 0.230988
-vt 0.165394 0.748950
-vt 0.959856 0.239506
-vt 0.673878 0.244528
-vt 0.978602 0.155059
-vt 0.194514 0.939639
-vt 0.432109 0.224126
-vt 0.248619 0.924770
-vt 0.214068 0.938346
-vt 0.743041 0.091680
-vt 0.707623 0.226473
-vt 0.672964 0.217825
-vt 0.408922 0.380917
-vt 0.013225 0.240276
-vt 0.637100 0.165993
-vt 0.019745 0.376348
-vt 0.537181 0.492060
-vt 0.501237 0.328565
-vt 0.971142 0.484002
-vt 0.025254 0.580845
-vt 0.046237 0.804550
-vt 0.799776 0.726015
-vt 0.019320 0.282406
-vt 0.747751 0.491741
-vt 0.747616 0.487298
-vt 0.751529 0.622943
-vt 0.965817 0.694833
-vt 0.775565 0.736773
-vt 0.977723 0.517740
-vt 0.535534 0.266906
-vt 0.536475 0.710112
-vt 0.708447 0.598419
-vt 0.511184 0.375053
-vt 0.588948 0.525537
-vt 0.134639 0.935257
-vt 0.232458 0.750383
-vt 0.977806 0.234635
-vt 0.587127 0.228828
-vt 0.774231 0.710110
-vt 0.033491 0.465502
-vt 0.564276 0.141784
-vt 0.012884 0.072516
-vt 0.961373 0.155913
-vt 0.433206 0.265388
-vt 0.587707 0.253630
-vt 0.667836 0.379009
-vt 0.673044 0.218479
-vt 0.393842 0.386229
-vt 0.673938 0.221318
-vt 0.978894 0.511274
-vt 0.134723 0.920201
-vt 0.533909 0.231992
-vt 0.587527 0.246988
-vt 0.424401 0.360512
-vt 0.779539 0.710633
-vt 0.773947 0.713601
-vt 0.431307 0.106060
-vt 0.019614 0.280387
-vt 0.548780 0.657506
-vt 0.288979 0.807196
-vt 0.031882 0.490231
-vt 0.962067 0.124384
-vt 0.234728 0.920862
-vt 0.627895 0.614871
-vt 0.443320 0.348593
-vt 0.537398 0.293340
-vt 0.432080 0.389619
-vt 0.424600 0.713567
-vt 0.534800 0.248802
-vt 0.723508 0.150293
-vt 0.535050 0.228106
-vt 0.707636 0.225824
-vt 0.772427 0.738055
-vt 0.312856 0.400772
-vt 0.675128 0.528262
-vt 0.029839 0.111471
-vt 0.028708 0.522273
-vt 0.433635 0.553350
-vt 0.014258 0.476311
-vt 0.954473 0.270805
-vt 0.283724 0.911294
-vt 0.273718 0.376163
-vt 0.668375 0.150233
-vt 0.715959 0.128100
-vt 0.680454 0.591088
-vt 0.055062 0.799398
-vt 0.050889 0.880505
-vt 0.754359 0.022717
-vt 0.754641 0.032550
-vt 0.533543 0.033869
-vt 0.538652 0.024553
-vt 0.541071 0.028294
-vt 0.330471 0.361139
-vt 0.747009 0.028476
-vt 0.432501 0.516834
-vt 0.116076 0.745878
-vt 0.588015 0.265250
-vt 0.586855 0.221581
-vt 0.778862 0.713659
-vt 0.956688 0.232390
-vt 0.488712 0.375927
-vt 0.503327 0.028036
-vt 0.321776 0.388098
-vt 0.636669 0.532149
-vt 0.773290 0.732766
-vt 0.748710 0.509329
-vt 0.709556 0.510690
-vt 0.034108 0.477084
-vt 0.634733 0.245542
-vt 0.025427 0.069662
-vt 0.978682 0.641721
-vt 0.731380 0.629037
-vt 0.749174 0.642084
-vt 0.709440 0.529141
-vt 0.674539 0.274234
-vt 0.621388 0.590325
-vt 0.019365 0.276651
-vt 0.776699 0.735852
-vt 0.637867 0.479935
-vt 0.520882 0.339321
-vt 0.750975 0.527204
-vt 0.645827 0.091805
-vt 0.646015 0.117769
-vt 0.971376 0.482292
-vt 0.434189 0.283992
-vt 0.590404 0.484365
-vt 0.959832 0.514154
-vt 0.675237 0.329210
-vt 0.979708 0.191026
-vt 0.437733 0.381368
-vt 0.675843 0.510408
-vt 0.503178 0.329675
-vt 0.025798 0.603493
-vt 0.794708 0.056991
-vt 0.012105 0.604851
-vt 0.017221 0.130184
-vt 0.747482 0.481345
-vt 0.955680 0.473929
-vt 0.745821 0.273495
-vt 0.536629 0.718536
-vt 0.232684 0.935844
-vt 0.185956 0.932429
-vt 0.134021 0.750309
-vt 0.014205 0.470309
-vt 0.770665 0.738140
-vt 0.589917 0.528339
-vt 0.710195 0.532052
-vt 0.434300 0.522334
-vt 0.532968 0.732810
-vt 0.217665 0.930945
-vt 0.579339 0.629079
-vt 0.037980 0.269265
-vt 0.588604 0.532806
-vt 0.030407 0.130646
-vt 0.967376 0.378295
-vt 0.635602 0.534880
-vt 0.433742 0.481481
-vt 0.432791 0.251722
-vt 0.551499 0.623682
-vt 0.675115 0.528897
-vt 0.415208 0.363401
-vt 0.655354 0.708970
-vt 0.673197 0.226652
-vt 0.534984 0.226345
-vt 0.533870 0.230887
-vt 0.774148 0.737529
-vt 0.537461 0.486426
-vt 0.655372 0.620846
-vt 0.710214 0.533946
-vt 0.075712 0.892473
-vt 0.455878 0.386811
-vt 0.635263 0.264024
-vt 0.709525 0.492136
-vt 0.535309 0.261328
-vt 0.540765 0.457546
-vt 0.638200 0.293545
-vt 0.004754 0.505085
-vt 0.536594 0.718076
-vt 0.066970 0.894065
-vt 0.539219 0.009858
-vt 0.064045 0.876558
-vt 0.535776 0.006830
-vt 0.540046 0.006873
-vt 0.752926 0.008342
-vt 0.751905 0.005321
-vt 0.747505 0.005422
-vt 0.643330 0.006812
-vt 0.750869 0.004295
-vt 0.978763 0.243402
-vt 0.748979 0.227388
-vt 0.551316 0.438743
-vt 0.655353 0.717380
-vt 0.516716 0.079815
-vt 0.637316 0.496500
-vt 0.515915 0.675884
-vt 0.750919 0.526369
-vt 0.746520 0.251844
-vt 0.154248 0.923133
-vt 0.194581 0.743421
-vt 0.962073 0.571203
-vt 0.038629 0.281388
-vt 0.295445 0.826673
-vt 0.534980 0.736642
-vt 0.434221 0.177364
-vt 0.537481 0.063633
-vt 0.979562 0.563043
-vt 0.959789 0.240026
-vt 0.074590 0.772179
-vt 0.018629 0.284195
-vt 0.962374 0.092665
-vt 0.433210 0.494645
-vt 0.258438 0.767007
-vt 0.727350 0.114562
-vt 0.697277 0.142739
-vt 0.597429 0.146563
-vt 0.433479 0.271736
-vt 0.635940 0.526832
-vt 0.344015 0.381758
-vt 0.590218 0.488996
-vt 0.589506 0.507278
-vt 0.442222 0.402540
-vt 0.538004 0.475527
-vt 0.588362 0.278896
-vt 0.316426 0.370673
-vt 0.746434 0.003017
-vt 0.275577 0.770394
-vt 0.646095 0.131027
-vt 0.676255 0.491827
-vt 0.773822 0.715094
-vt 0.296673 0.882054
-vt 0.777827 0.732811
-vt 0.786819 0.673874
-vt 0.433003 0.501783
-vt 0.763117 0.122406
-vt 0.123327 0.925350
-vt 0.743824 0.642148
-vt 0.600829 0.619378
-vt 0.655353 0.718823
-vt 0.588988 0.524669
-vt 0.009192 0.236470
-vt 0.154071 0.741716
-vt 0.772291 0.735789
-vt 0.587238 0.220708
-vt 0.978813 0.510808
-vt 0.561531 0.642164
-vt 0.093101 0.914476
-vt 0.271514 0.904463
-vt 0.175243 0.924813
-vt 0.988091 0.019862
-vt 0.745931 0.267570
-vt 0.600260 0.144983
-vt 0.619960 0.152558
-vt 0.621256 0.150570
-vt 0.749384 0.219039
-vt 0.311290 0.349875
-vt 0.536696 0.525523
-vt 0.589997 0.494618
-vt 0.635522 0.274981
-vt 0.533504 0.033479
-vt 0.538597 0.033956
-vt 0.543337 0.062375
-vt 0.749193 0.022772
-vt 0.733832 0.113928
-vt 0.751479 0.026980
-vt 0.644841 0.023120
-vt 0.645011 0.024559
-vt 0.645013 0.028037
-vt 0.535718 0.271520
-vt 0.956413 0.235079
-vt 0.433777 0.158150
-vt 0.054858 0.832802
-vt 0.150736 0.756501
-vt 0.655325 0.735104
-vt 0.745790 0.137738
-vt 0.633948 0.227137
-vt 0.008436 0.512945
-vt 0.633970 0.227876
-vt 0.312513 0.351535
-vt 0.955625 0.280389
-vt 0.751786 0.530237
-vt 0.960831 0.526445
-vt 0.588393 0.281351
-vt 0.034756 0.515254
-vt 0.979851 0.228650
-vt 0.174079 0.939853
-vt 0.583671 0.629880
-vt 0.954771 0.479510
-vt 0.010724 0.585680
-vt 0.430716 0.648801
-vt 0.971613 0.739967
-vt 0.306608 0.873583
-vt 0.012346 0.481019
-vt 0.626238 0.613166
-vt 0.709525 0.497824
-vt 0.404167 0.349459
-vt 0.960824 0.227823
-vt 0.673972 0.223152
-vt 0.655367 0.657822
-vt 0.432992 0.258751
-vt 0.971547 0.015732
-vt 0.228014 0.756387
-vt 0.083275 0.774579
-vt 0.060100 0.807273
-vt 0.025131 0.558293
-vt 0.963614 0.073193
-vt 0.154068 0.937899
-vt 0.972835 0.262921
-vt 0.674278 0.263197
-vt 0.707728 0.262864
-vt 0.749885 0.222152
-vt 0.635912 0.527572
-vt 0.707545 0.217380
-vt 0.646161 0.142743
-vt 0.338718 0.389165
-vt 0.675893 0.531763
-vt 0.959900 0.514674
-vt 0.531552 0.718192
-vt 0.635378 0.268715
-vt 0.443290 0.404005
-vt 0.036256 0.293301
-vt 0.028786 0.521557
-vt 0.963982 0.673742
-vt 0.433455 0.487915
-vn -0.521090 0.772906 0.362053
-vn -0.285351 0.888921 0.358321
-vn -0.567682 0.823248 0.000000
-vn -0.311600 0.950213 0.000000
-vn 0.372764 -0.088140 -0.923731
-vn 0.321855 0.605804 -0.727606
-vn 0.913199 -0.133217 -0.385123
-vn 0.747977 0.586436 -0.310843
-vn -0.992997 0.118139 0.000000
-vn -0.992990 0.118199 0.000000
-vn -0.939966 0.341268 0.000000
-vn -0.939891 0.341476 0.000000
-vn -0.782058 0.623205 0.000000
-vn -0.569305 0.822126 0.000000
-vn -0.782234 0.622985 0.000000
-vn -0.569521 0.821977 0.000000
-vn -0.870160 0.331315 0.364764
-vn -0.720412 0.591619 0.361930
-vn -0.939332 0.343010 0.000000
-vn -0.780839 0.624732 0.000000
-vn -0.984672 -0.174417 0.000336
-vn -0.952300 -0.305104 0.005982
-vn -0.902001 -0.203565 0.380730
-vn -0.857846 -0.346612 0.379420
-vn -0.250746 -0.957540 -0.142281
-vn -0.297408 -0.954362 0.027223
-vn -0.513463 -0.830318 -0.216629
-vn -0.581935 -0.812903 0.023255
-vn -0.778583 -0.505372 0.372032
-vn -0.857846 -0.346612 0.379420
-vn -0.886617 -0.462368 0.011231
-vn -0.952300 -0.305104 0.005982
-vn -0.660766 -0.650298 0.374834
-vn -0.778583 -0.505372 0.372032
-vn -0.788745 -0.614540 0.014893
-vn -0.886617 -0.462368 0.011231
-vn 0.000000 -0.925801 0.378011
-vn -0.000855 -0.999608 0.027986
-vn 0.238233 -0.894792 0.377614
-vn 0.296405 -0.954678 0.027101
-vn 0.296405 -0.954678 0.027101
-vn -0.000855 -0.999608 0.027986
-vn 0.231212 -0.957992 -0.169686
-vn 0.004517 -0.992742 -0.120182
-vn -0.238259 -0.894775 0.377637
-vn -0.471889 -0.796857 0.377279
-vn -0.297408 -0.954362 0.027223
-vn -0.581935 -0.812903 0.023255
-vn 0.581567 -0.813174 0.022981
-vn 0.296405 -0.954678 0.027101
-vn 0.511229 -0.844469 -0.159738
-vn 0.231212 -0.957992 -0.169686
-vn 0.238233 -0.894792 0.377614
-vn 0.296405 -0.954678 0.027101
-vn 0.471859 -0.796889 0.377249
-vn 0.581567 -0.813174 0.022981
-vn 0.007019 -0.844861 -0.534939
-vn 0.004517 -0.992742 -0.120182
-vn -0.250746 -0.957540 -0.142281
-vn 0.241984 -0.835699 -0.493002
-vn 0.231212 -0.957992 -0.169686
-vn 0.004517 -0.992742 -0.120182
-vn 0.007019 -0.844861 -0.534939
-vn 0.241984 -0.835699 -0.493002
-vn 0.004517 -0.992742 -0.120182
-vn -0.243419 -0.829015 -0.503470
-vn -0.250746 -0.957540 -0.142281
-vn -0.513463 -0.830318 -0.216629
-vn -0.243419 -0.829015 -0.503470
-vn 0.007019 -0.844861 -0.534939
-vn -0.250746 -0.957540 -0.142281
-vn -0.243419 -0.829015 -0.503470
-vn -0.513463 -0.830318 -0.216629
-vn -0.710895 -0.695605 -0.103736
-vn -0.460262 -0.773604 -0.435541
-vn -0.710895 -0.695605 -0.103736
-vn -0.849339 -0.521933 -0.078800
-vn -0.243419 -0.829015 -0.503470
-vn -0.710895 -0.695605 -0.103736
-vn -0.460262 -0.773604 -0.435541
-vn -0.604308 -0.711613 -0.358355
-vn -0.849339 -0.521933 -0.078800
-vn -0.913458 -0.399399 -0.077945
-vn -0.460262 -0.773604 -0.435541
-vn -0.849339 -0.521933 -0.078800
-vn -0.604308 -0.711613 -0.358355
-vn -0.639161 -0.723760 -0.260084
-vn -0.913458 -0.399399 -0.077945
-vn -0.939019 -0.338459 -0.060733
-vn -0.604308 -0.711613 -0.358355
-vn -0.913458 -0.399399 -0.077945
-vn -0.639161 -0.723760 -0.260084
-vn -0.639161 -0.723760 -0.260084
-vn -0.939019 -0.338459 -0.060733
-vn -0.949451 -0.312272 -0.032076
-vn -0.648624 -0.756632 -0.082432
-vn -0.949451 -0.312272 -0.032076
-vn -0.954279 -0.298907 0.002472
-vn -0.639161 -0.723760 -0.260084
-vn -0.949451 -0.312272 -0.032076
-vn -0.648624 -0.756632 -0.082432
-vn 0.028932 0.428152 -0.903243
-vn 0.000000 0.418594 -0.908174
-vn 0.068943 0.929284 -0.362875
-vn 0.000000 0.928819 -0.370533
-vn -0.648624 -0.756632 -0.082432
-vn -0.954279 -0.298907 0.002472
-vn -0.951202 -0.308125 0.016572
-vn -0.647672 -0.752810 0.117467
-vn -0.951202 -0.308125 0.016572
-vn -0.949874 -0.309738 0.042452
-vn -0.859060 -0.359823 -0.364066
-vn -0.899920 -0.425957 0.093297
-vn -0.909937 -0.184063 -0.371666
-vn -0.939317 -0.333574 0.080082
-vn -0.648624 -0.756632 -0.082432
-vn -0.951202 -0.308125 0.016572
-vn -0.647672 -0.752810 0.117467
-vn -0.638581 -0.710667 0.295241
-vn -0.949874 -0.309738 0.042452
-vn -0.939317 -0.333574 0.080082
-vn -0.647672 -0.752810 0.117467
-vn -0.949874 -0.309738 0.042452
-vn -0.638581 -0.710667 0.295241
-vn -0.758811 -0.548713 -0.350885
-vn -0.782121 -0.606665 0.142282
-vn -0.859060 -0.359823 -0.364066
-vn -0.899920 -0.425957 0.093297
-vn -0.638581 -0.710667 0.295241
-vn -0.939317 -0.333574 0.080082
-vn -0.899920 -0.425957 0.093297
-vn -0.609223 -0.680913 0.406454
-vn -0.899920 -0.425957 0.093297
-vn -0.782121 -0.606665 0.142282
-vn -0.638581 -0.710667 0.295241
-vn -0.899920 -0.425957 0.093297
-vn -0.609223 -0.680913 0.406454
-vn -0.467923 -0.734358 0.491698
-vn -0.782121 -0.606665 0.142282
-vn -0.633088 -0.762062 0.135871
-vn -0.609223 -0.680913 0.406454
-vn -0.782121 -0.606665 0.142282
-vn -0.467923 -0.734358 0.491698
-vn -0.584690 -0.736127 -0.340962
-vn -0.633088 -0.762062 0.135871
-vn -0.758811 -0.548713 -0.350885
-vn -0.782121 -0.606665 0.142282
-vn -0.467923 -0.734358 0.491698
-vn -0.633088 -0.762062 0.135871
-vn -0.429001 -0.879885 0.204353
-vn -0.429001 -0.879885 0.204353
-vn -0.382251 -0.857281 -0.344896
-vn -0.200814 -0.956675 0.210824
-vn -0.191601 -0.913507 -0.358878
-vn -0.237198 -0.806417 0.541691
-vn -0.429001 -0.879885 0.204353
-vn -0.200814 -0.956675 0.210824
-vn -0.467923 -0.734358 0.491698
-vn -0.429001 -0.879885 0.204353
-vn -0.237198 -0.806417 0.541691
-vn 0.000702 -0.938897 -0.344197
-vn -0.001221 -0.985450 0.169959
-vn -0.191601 -0.913507 -0.358878
-vn -0.200814 -0.956675 0.210824
-vn -0.001221 -0.985450 0.169959
-vn 0.000275 -0.811299 0.584631
-vn -0.200814 -0.956675 0.210824
-vn 0.000702 -0.938897 -0.344197
-vn -0.191601 -0.913507 -0.358878
-vn 0.002747 -0.441857 -0.897081
-vn -0.087345 -0.430315 -0.898443
-vn 0.212324 -0.913234 -0.347739
-vn 0.439571 -0.822101 -0.361838
-vn 0.209422 -0.955035 0.209880
-vn 0.453122 -0.859397 0.236892
-vn 0.000275 -0.811299 0.584631
-vn -0.001221 -0.985450 0.169959
-vn 0.209422 -0.955035 0.209880
-vn -0.277025 -0.360404 -0.890711
-vn -0.171580 -0.405969 -0.897636
-vn -0.584690 -0.736127 -0.340962
-vn -0.382251 -0.857281 -0.344896
-vn 0.106113 -0.434098 -0.894594
-vn 0.212324 -0.913234 -0.347739
-vn 0.002747 -0.441857 -0.897081
-vn 0.000702 -0.938897 -0.344197
-vn -0.342519 -0.277268 -0.897666
-vn -0.277025 -0.360404 -0.890711
-vn -0.758811 -0.548713 -0.350885
-vn -0.584690 -0.736127 -0.340962
-vn -0.386469 -0.166759 -0.907102
-vn -0.342519 -0.277268 -0.897666
-vn -0.859060 -0.359823 -0.364066
-vn -0.758811 -0.548713 -0.350885
-vn -0.991137 -0.132636 -0.007416
-vn -0.734553 0.678551 -0.000092
-vn -0.991018 -0.133704 -0.002472
-vn -0.734685 0.678408 0.000000
-vn 0.319082 -0.282245 0.904723
-vn 0.000000 -0.052339 0.998629
-vn 0.253949 -0.348223 0.902358
-vn 0.000000 -0.052402 0.998626
-vn 0.311907 -0.598482 -0.737925
-vn 0.739459 -0.596169 -0.312703
-vn 0.233778 -0.773910 -0.588566
-vn 0.590148 -0.771523 -0.237652
-vn -0.087286 -0.425991 0.900507
-vn 0.000000 -0.434743 0.900555
-vn 0.000000 -0.052096 0.998642
-vn 0.000000 -0.052157 0.998639
-vn 0.377487 -0.139135 0.915503
-vn 0.000000 -0.052309 0.998631
-vn 0.352987 -0.211408 0.911431
-vn 0.000000 -0.052309 0.998631
-vn -0.254165 -0.348043 0.902367
-vn -0.174140 -0.397386 0.900977
-vn 0.000031 -0.052432 0.998624
-vn -0.000031 -0.052432 0.998624
-vn -0.319323 -0.281907 0.904744
-vn -0.353195 -0.211129 0.911415
-vn -0.778583 -0.505372 0.372032
-vn -0.857846 -0.346612 0.379420
-vn 0.253949 -0.348223 0.902358
-vn 0.660743 -0.650336 0.374808
-vn 0.319082 -0.282245 0.904723
-vn 0.778579 -0.505401 0.372000
-vn -0.353195 -0.211129 0.911415
-vn -0.377613 -0.138923 0.915483
-vn -0.857846 -0.346612 0.379420
-vn -0.902001 -0.203565 0.380730
-vn 0.000000 -0.434743 0.900555
-vn -0.087286 -0.425991 0.900507
-vn 0.000000 -0.925801 0.378011
-vn -0.238259 -0.894775 0.377637
-vn -0.174140 -0.397386 0.900977
-vn -0.254165 -0.348043 0.902367
-vn -0.471889 -0.796857 0.377279
-vn -0.660766 -0.650298 0.374834
-vn 0.238233 -0.894792 0.377614
-vn 0.087254 -0.426017 0.900498
-vn 0.000000 -0.925801 0.378011
-vn 0.000000 -0.434743 0.900555
-vn -0.254165 -0.348043 0.902367
-vn -0.319323 -0.281907 0.904744
-vn -0.660766 -0.650298 0.374834
-vn -0.778583 -0.505372 0.372032
-vn -0.919299 0.124793 0.373250
-vn -0.395796 0.091006 0.913818
-vn -0.870160 0.331315 0.364764
-vn -0.392471 0.192390 0.899418
-vn 0.396049 0.205456 0.894948
-vn 0.396174 0.091223 0.913633
-vn 0.867846 0.335834 0.366140
-vn 0.919256 0.124211 0.373550
-vn -0.312362 0.298720 0.901774
-vn -0.720412 0.591619 0.361930
-vn -0.392471 0.192390 0.899418
-vn -0.870160 0.331315 0.364764
-vn -0.992942 0.118598 0.000000
-vn -0.919299 0.124793 0.373250
-vn -0.939332 0.343010 0.000000
-vn -0.870160 0.331315 0.364764
-vn -0.285351 0.888921 0.358321
-vn -0.122289 0.433856 0.892645
-vn -0.069248 0.929275 0.362841
-vn -0.029177 0.427853 0.903377
-vn -0.782587 0.622541 0.000000
-vn -0.569973 0.821663 0.000000
-vn -0.722183 0.589362 -0.362083
-vn -0.523403 0.771371 -0.361988
-vn -0.313581 0.949562 0.000000
-vn -0.079471 0.996837 0.000000
-vn -0.287517 0.888248 -0.358259
-vn -0.070103 0.929281 -0.362660
-vn -0.122289 0.433856 0.892645
-vn -0.285351 0.888921 0.358321
-vn -0.224988 0.373677 0.899859
-vn -0.521090 0.772906 0.362053
-vn -0.569973 0.821663 0.000000
-vn -0.313581 0.949562 0.000000
-vn -0.523403 0.771371 -0.361988
-vn -0.287517 0.888248 -0.358259
-vn -0.939966 0.341268 0.000000
-vn -0.782587 0.622541 0.000000
-vn -0.870643 0.329573 -0.365189
-vn -0.722183 0.589362 -0.362083
-vn -0.285351 0.888921 0.358321
-vn -0.069248 0.929275 0.362841
-vn -0.311600 0.950213 0.000000
-vn -0.078738 0.996895 0.000000
-vn -0.224988 0.373677 0.899859
-vn -0.521090 0.772906 0.362053
-vn -0.312362 0.298720 0.901774
-vn -0.720412 0.591619 0.361930
-vn -0.312152 0.299273 -0.901663
-vn -0.393298 0.193094 -0.898906
-vn -0.722183 0.589362 -0.362083
-vn -0.870643 0.329573 -0.365189
-vn -0.720412 0.591619 0.361930
-vn -0.521090 0.772906 0.362053
-vn -0.780839 0.624732 0.000000
-vn -0.567682 0.823248 0.000000
-vn -0.224897 0.374747 -0.899436
-vn -0.312152 0.299273 -0.901663
-vn -0.523403 0.771371 -0.361988
-vn -0.722183 0.589362 -0.362083
-vn -0.121224 0.433042 -0.893185
-vn -0.224897 0.374747 -0.899436
-vn -0.287517 0.888248 -0.358259
-vn -0.523403 0.771371 -0.361988
-vn -0.029329 0.427604 -0.903490
-vn -0.121224 0.433042 -0.893185
-vn -0.070103 0.929281 -0.362660
-vn -0.287517 0.888248 -0.358259
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.992997 0.118139 0.000000
-vn -0.992990 0.118199 0.000000
-vn 0.000000 0.052309 -0.998631
-vn 0.000000 0.048190 -0.998838
-vn -0.393298 0.193094 -0.898906
-vn -0.396046 0.091008 -0.913710
-vn -0.734964 0.678106 0.000061
-vn -0.670866 0.741578 0.000000
-vn -0.730909 0.682475 0.000000
-vn -0.670866 0.741578 0.000000
-vn 0.029085 0.427176 0.903701
-vn 0.121893 0.433583 0.892832
-vn 0.069399 0.929325 0.362684
-vn 0.286943 0.888480 0.358145
-vn 0.720131 0.591401 0.362843
-vn 0.527037 0.768230 0.363393
-vn 0.320333 0.310109 0.895108
-vn 0.235030 0.375908 0.896356
-vn 0.121893 0.433583 0.892832
-vn 0.235030 0.375908 0.896356
-vn 0.286943 0.888480 0.358145
-vn 0.527037 0.768230 0.363393
-vn 0.939143 0.343526 0.000000
-vn 0.993040 0.117774 0.000000
-vn 0.868458 0.334950 -0.365499
-vn 0.919351 0.124242 -0.373307
-vn 0.310045 -0.595674 0.740976
-vn 0.000000 -0.675817 0.737069
-vn 0.263930 -0.785352 0.559967
-vn 0.000000 -0.675849 0.737040
-vn 0.568602 0.822613 0.000000
-vn 0.780351 0.625342 0.000000
-vn 0.524598 0.770401 -0.362326
-vn 0.719155 0.592775 -0.362538
-vn 0.780351 0.625342 0.000000
-vn 0.939143 0.343526 0.000000
-vn 0.719155 0.592775 -0.362538
-vn 0.868458 0.334950 -0.365499
-vn 0.867846 0.335834 0.366140
-vn 0.720131 0.591401 0.362843
-vn 0.396049 0.205456 0.894948
-vn 0.320333 0.310109 0.895108
-vn 0.311536 0.950234 0.000000
-vn 0.568602 0.822613 0.000000
-vn 0.286295 0.888581 -0.358411
-vn 0.524598 0.770401 -0.362326
-vn 0.078190 0.996939 0.000000
-vn 0.311536 0.950234 0.000000
-vn 0.068943 0.929284 -0.362875
-vn 0.286295 0.888581 -0.358411
-vn 0.325795 0.316060 -0.891046
-vn 0.719155 0.592775 -0.362538
-vn 0.392297 0.200055 -0.897820
-vn 0.868458 0.334950 -0.365499
-vn -0.381763 0.058475 0.922409
-vn 0.000000 0.044008 0.999031
-vn -0.395796 0.091006 0.913818
-vn 0.000000 0.048434 0.998826
-vn 0.939246 0.343245 0.000000
-vn 0.993048 0.117711 0.000000
-vn 0.939213 0.343335 0.000000
-vn 0.993044 0.117741 0.000000
-vn -0.353195 -0.211129 0.911415
-vn -0.319323 -0.281907 0.904744
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052279 0.998633
-vn 0.239788 -0.804483 0.543423
-vn 0.209422 -0.955035 0.209880
-vn 0.453122 -0.859397 0.236892
-vn 0.239788 -0.804483 0.543423
-vn 0.000275 -0.811299 0.584631
-vn 0.209422 -0.955035 0.209880
-vn 0.640223 -0.679501 -0.358321
-vn 0.802405 -0.482688 -0.350938
-vn 0.640007 -0.753384 0.151006
-vn 0.797224 -0.586336 0.143685
-vn 0.239788 -0.804483 0.543423
-vn 0.453122 -0.859397 0.236892
-vn 0.640007 -0.753384 0.151006
-vn 0.466575 -0.738743 0.486381
-vn 0.640007 -0.753384 0.151006
-vn 0.797224 -0.586336 0.143685
-vn 0.466575 -0.738743 0.486381
-vn 0.239788 -0.804483 0.543423
-vn 0.640007 -0.753384 0.151006
-vn 0.596342 -0.683993 0.420155
-vn 0.797224 -0.586336 0.143685
-vn 0.897571 -0.428521 0.103613
-vn 0.596342 -0.683993 0.420155
-vn 0.466575 -0.738743 0.486381
-vn 0.797224 -0.586336 0.143685
-vn 0.366104 -0.154792 -0.917610
-vn 0.877705 -0.298509 -0.374869
-vn 0.374497 -0.244701 -0.894356
-vn 0.802405 -0.482688 -0.350938
-vn 0.596342 -0.683993 0.420155
-vn 0.897571 -0.428521 0.103613
-vn 0.934625 -0.355612 0.004151
-vn 0.897571 -0.428521 0.103613
-vn 0.797224 -0.586336 0.143685
-vn 0.877705 -0.298509 -0.374869
-vn 0.802405 -0.482688 -0.350938
-vn 0.638345 -0.713270 0.289416
-vn 0.934625 -0.355612 0.004151
-vn 0.949811 -0.310561 0.037569
-vn 0.638345 -0.713270 0.289416
-vn 0.596342 -0.683993 0.420155
-vn 0.934625 -0.355612 0.004151
-vn 0.638345 -0.713270 0.289416
-vn 0.949811 -0.310561 0.037569
-vn 0.950440 -0.308980 0.034579
-vn 0.985937 -0.163336 -0.035341
-vn 0.897571 -0.428521 0.103613
-vn 0.904830 -0.170541 -0.390126
-vn 0.877705 -0.298509 -0.374869
-vn 0.650787 -0.750218 0.116827
-vn 0.950440 -0.308980 0.034579
-vn 0.957065 -0.289866 0.002228
-vn 0.650787 -0.750218 0.116827
-vn 0.638345 -0.713270 0.289416
-vn 0.950440 -0.308980 0.034579
-vn 0.650787 -0.750218 0.116827
-vn 0.957065 -0.289866 0.002228
-vn 0.949985 -0.312053 -0.012299
-vn 0.649294 -0.756172 -0.081364
-vn 0.949985 -0.312053 -0.012299
-vn 0.946362 -0.321059 -0.036318
-vn 0.649294 -0.756172 -0.081364
-vn 0.650787 -0.750218 0.116827
-vn 0.949985 -0.312053 -0.012299
-vn 0.912059 -0.149299 0.381914
-vn 0.989641 -0.143562 -0.000641
-vn 0.750260 0.586248 0.305652
-vn 0.738513 0.674239 0.000000
-vn 0.637546 -0.726174 -0.257307
-vn 0.946362 -0.321059 -0.036318
-vn 0.922100 -0.382311 -0.059756
-vn 0.637546 -0.726174 -0.257307
-vn 0.649294 -0.756172 -0.081364
-vn 0.946362 -0.321059 -0.036318
-vn 0.946362 -0.321059 -0.036318
-vn 0.981702 -0.190316 0.006439
-vn 0.922100 -0.382311 -0.059756
-vn 0.637546 -0.726174 -0.257307
-vn 0.922100 -0.382311 -0.059756
-vn 0.898822 -0.432030 -0.073948
-vn 0.898822 -0.432030 -0.073948
-vn 0.951306 -0.308211 0.004853
-vn 0.834906 -0.542718 -0.091587
-vn 0.884960 -0.465507 0.012208
-vn 0.602210 -0.707044 -0.370720
-vn 0.898822 -0.432030 -0.073948
-vn 0.834906 -0.542718 -0.091587
-vn 0.602210 -0.707044 -0.370720
-vn 0.637546 -0.726174 -0.257307
-vn 0.898822 -0.432030 -0.073948
-vn 0.834906 -0.542718 -0.091587
-vn 0.884960 -0.465507 0.012208
-vn 0.726236 -0.680854 -0.094976
-vn 0.789045 -0.614139 0.015504
-vn 0.602210 -0.707044 -0.370720
-vn 0.834906 -0.542718 -0.091587
-vn 0.726236 -0.680854 -0.094976
-vn 0.789045 -0.614139 0.015504
-vn 0.581567 -0.813174 0.022981
-vn 0.726236 -0.680854 -0.094976
-vn 0.511229 -0.844469 -0.159738
-vn 0.461423 -0.761703 -0.454861
-vn 0.726236 -0.680854 -0.094976
-vn 0.511229 -0.844469 -0.159738
-vn 0.461423 -0.761703 -0.454861
-vn 0.602210 -0.707044 -0.370720
-vn 0.726236 -0.680854 -0.094976
-vn -0.513463 -0.830318 -0.216629
-vn -0.581935 -0.812903 0.023255
-vn -0.710895 -0.695605 -0.103736
-vn -0.788745 -0.614540 0.014893
-vn 0.241984 -0.835699 -0.493002
-vn 0.511229 -0.844469 -0.159738
-vn 0.231212 -0.957992 -0.169686
-vn 0.241984 -0.835699 -0.493002
-vn 0.461423 -0.761703 -0.454861
-vn 0.511229 -0.844469 -0.159738
-vn 0.471859 -0.796889 0.377249
-vn 0.581567 -0.813174 0.022981
-vn 0.660743 -0.650336 0.374808
-vn 0.789045 -0.614139 0.015504
-vn -0.471889 -0.796857 0.377279
-vn -0.660766 -0.650298 0.374834
-vn -0.581935 -0.812903 0.023255
-vn -0.788745 -0.614540 0.014893
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 0.699991 -0.714152
-vn 0.000000 0.699991 -0.714152
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn -0.171580 -0.405969 -0.897636
-vn -0.087345 -0.430315 -0.898443
-vn -0.382251 -0.857281 -0.344896
-vn -0.191601 -0.913507 -0.358878
-vn 0.087254 -0.426017 0.900498
-vn 0.238233 -0.894792 0.377614
-vn 0.173990 -0.397360 0.901018
-vn 0.471859 -0.796889 0.377249
-vn 0.173990 -0.397360 0.901018
-vn 0.471859 -0.796889 0.377249
-vn 0.253949 -0.348223 0.902358
-vn 0.660743 -0.650336 0.374808
-vn 0.319082 -0.282245 0.904723
-vn 0.778579 -0.505401 0.372000
-vn 0.352987 -0.211408 0.911431
-vn 0.857781 -0.346641 0.379541
-vn 0.901970 -0.203534 0.380821
-vn 0.377487 -0.139135 0.915503
-vn 0.857781 -0.346641 0.379541
-vn 0.352987 -0.211408 0.911431
-vn 0.375234 -0.102697 0.921223
-vn 0.912059 -0.149299 0.381914
-vn 0.329149 0.602020 0.727484
-vn 0.750260 0.586248 0.305652
-vn 0.122871 0.434167 -0.892414
-vn 0.286295 0.888581 -0.358411
-vn 0.228679 0.372332 -0.899486
-vn 0.524598 0.770401 -0.362326
-vn 0.028932 0.428152 -0.903243
-vn 0.068943 0.929284 -0.362875
-vn 0.122871 0.434167 -0.892414
-vn 0.286295 0.888581 -0.358411
-vn -0.048831 -0.536314 -0.842605
-vn 0.048037 -0.537777 -0.841717
-vn -0.000397 -0.487642 -0.873044
-vn 0.241984 -0.835699 -0.493002
-vn 0.048037 -0.537777 -0.841717
-vn 0.120276 -0.592529 -0.796519
-vn 0.007019 -0.844861 -0.534939
-vn 0.048037 -0.537777 -0.841717
-vn 0.241984 -0.835699 -0.493002
-vn -0.127296 -0.607792 0.783827
-vn -0.114081 -0.538145 0.835096
-vn 0.133795 -0.607355 0.783083
-vn 0.113316 -0.537375 0.835696
-vn 0.461423 -0.761703 -0.454861
-vn 0.120276 -0.592529 -0.796519
-vn 0.138436 -0.667855 -0.731304
-vn 0.241984 -0.835699 -0.493002
-vn 0.120276 -0.592529 -0.796519
-vn 0.461423 -0.761703 -0.454861
-vn -0.171456 -0.865459 -0.470726
-vn 0.147194 -0.854141 -0.498775
-vn -0.176492 -0.781012 -0.599058
-vn 0.183848 -0.767314 -0.614352
-vn 0.602210 -0.707044 -0.370720
-vn 0.138436 -0.667855 -0.731304
-vn 0.183848 -0.767314 -0.614352
-vn 0.461423 -0.761703 -0.454861
-vn 0.138436 -0.667855 -0.731304
-vn 0.602210 -0.707044 -0.370720
-vn -0.154304 -0.850013 0.503654
-vn 0.165595 -0.881167 0.442857
-vn -0.123083 -0.939557 0.319503
-vn 0.105839 -0.942204 0.317883
-vn 0.602210 -0.707044 -0.370720
-vn 0.183848 -0.767314 -0.614352
-vn 0.147194 -0.854141 -0.498775
-vn -0.123083 -0.939557 0.319503
-vn 0.105839 -0.942204 0.317883
-vn -0.165385 -0.979921 0.111366
-vn 0.128944 -0.988856 0.074406
-vn 0.637546 -0.726174 -0.257307
-vn 0.147194 -0.854141 -0.498775
-vn 0.095371 -0.953529 -0.285809
-vn 0.602210 -0.707044 -0.370720
-vn 0.147194 -0.854141 -0.498775
-vn 0.637546 -0.726174 -0.257307
-vn -0.121832 -0.784555 0.607972
-vn 0.125158 -0.786652 0.604577
-vn -0.154304 -0.850013 0.503654
-vn 0.165595 -0.881167 0.442857
-vn 0.637546 -0.726174 -0.257307
-vn 0.095371 -0.953529 -0.285809
-vn 0.166633 -0.977095 -0.132361
-vn -0.127296 -0.607792 0.783827
-vn 0.133795 -0.607355 0.783083
-vn -0.157268 -0.676224 0.719714
-vn 0.172404 -0.693613 0.699412
-vn 0.649294 -0.756172 -0.081364
-vn 0.166633 -0.977095 -0.132361
-vn 0.128944 -0.988856 0.074406
-vn 0.637546 -0.726174 -0.257307
-vn 0.166633 -0.977095 -0.132361
-vn 0.649294 -0.756172 -0.081364
-vn -0.140114 -0.669504 -0.729474
-vn 0.138436 -0.667855 -0.731304
-vn -0.119057 -0.591407 -0.797536
-vn 0.120276 -0.592529 -0.796519
-vn 0.650787 -0.750218 0.116827
-vn 0.128944 -0.988856 0.074406
-vn 0.105839 -0.942204 0.317883
-vn 0.649294 -0.756172 -0.081364
-vn 0.128944 -0.988856 0.074406
-vn 0.650787 -0.750218 0.116827
-vn -0.165385 -0.979921 0.111366
-vn 0.128944 -0.988856 0.074406
-vn -0.145208 -0.987646 -0.058901
-vn 0.166633 -0.977095 -0.132361
-vn 0.650787 -0.750218 0.116827
-vn 0.105839 -0.942204 0.317883
-vn 0.165595 -0.881167 0.442857
-vn -0.123999 -0.951033 -0.283125
-vn 0.095371 -0.953529 -0.285809
-vn -0.171456 -0.865459 -0.470726
-vn 0.147194 -0.854141 -0.498775
-vn 0.638345 -0.713270 0.289416
-vn 0.165595 -0.881167 0.442857
-vn 0.125158 -0.786652 0.604577
-vn 0.650787 -0.750218 0.116827
-vn 0.165595 -0.881167 0.442857
-vn 0.638345 -0.713270 0.289416
-vn 0.596342 -0.683993 0.420155
-vn 0.125158 -0.786652 0.604577
-vn 0.172404 -0.693613 0.699412
-vn 0.638345 -0.713270 0.289416
-vn 0.125158 -0.786652 0.604577
-vn 0.596342 -0.683993 0.420155
-vn -0.145208 -0.987646 -0.058901
-vn 0.166633 -0.977095 -0.132361
-vn -0.123999 -0.951033 -0.283125
-vn 0.095371 -0.953529 -0.285809
-vn 0.596342 -0.683993 0.420155
-vn 0.172404 -0.693613 0.699412
-vn 0.133795 -0.607355 0.783083
-vn -0.114081 -0.538145 0.835096
-vn -0.046175 -0.491786 0.869491
-vn 0.113316 -0.537375 0.835696
-vn 0.046267 -0.491606 0.869588
-vn 0.466575 -0.738743 0.486381
-vn 0.133795 -0.607355 0.783083
-vn 0.113316 -0.537375 0.835696
-vn 0.596342 -0.683993 0.420155
-vn 0.133795 -0.607355 0.783083
-vn 0.466575 -0.738743 0.486381
-vn 0.239788 -0.804483 0.543423
-vn 0.113316 -0.537375 0.835696
-vn 0.046267 -0.491606 0.869588
-vn 0.466575 -0.738743 0.486381
-vn 0.113316 -0.537375 0.835696
-vn 0.239788 -0.804483 0.543423
-vn -0.046175 -0.491786 0.869491
-vn 0.000031 -0.438709 0.898629
-vn 0.046267 -0.491606 0.869588
-vn 0.239788 -0.804483 0.543423
-vn 0.046267 -0.491606 0.869588
-vn 0.000275 -0.811299 0.584631
-vn -0.237198 -0.806417 0.541691
-vn -0.046175 -0.491786 0.869491
-vn -0.114081 -0.538145 0.835096
-vn 0.000275 -0.811299 0.584631
-vn -0.237198 -0.806417 0.541691
-vn -0.200814 -0.956675 0.210824
-vn -0.237198 -0.806417 0.541691
-vn 0.000275 -0.811299 0.584631
-vn -0.046175 -0.491786 0.869491
-vn -0.467923 -0.734358 0.491698
-vn -0.114081 -0.538145 0.835096
-vn -0.127296 -0.607792 0.783827
-vn -0.467923 -0.734358 0.491698
-vn -0.237198 -0.806417 0.541691
-vn -0.114081 -0.538145 0.835096
-vn -0.467923 -0.734358 0.491698
-vn -0.127296 -0.607792 0.783827
-vn -0.157268 -0.676224 0.719714
-vn -0.609223 -0.680913 0.406454
-vn -0.157268 -0.676224 0.719714
-vn -0.121832 -0.784555 0.607972
-vn -0.609223 -0.680913 0.406454
-vn -0.467923 -0.734358 0.491698
-vn -0.157268 -0.676224 0.719714
-vn -0.609223 -0.680913 0.406454
-vn -0.121832 -0.784555 0.607972
-vn -0.154304 -0.850013 0.503654
-vn -0.638581 -0.710667 0.295241
-vn -0.154304 -0.850013 0.503654
-vn -0.123083 -0.939557 0.319503
-vn -0.638581 -0.710667 0.295241
-vn -0.609223 -0.680913 0.406454
-vn -0.154304 -0.850013 0.503654
-vn -0.647672 -0.752810 0.117467
-vn -0.123083 -0.939557 0.319503
-vn -0.165385 -0.979921 0.111366
-vn -0.647672 -0.752810 0.117467
-vn -0.638581 -0.710667 0.295241
-vn -0.123083 -0.939557 0.319503
-vn -0.647672 -0.752810 0.117467
-vn -0.165385 -0.979921 0.111366
-vn -0.145208 -0.987646 -0.058901
-vn -0.648624 -0.756632 -0.082432
-vn -0.145208 -0.987646 -0.058901
-vn -0.123999 -0.951033 -0.283125
-vn -0.648624 -0.756632 -0.082432
-vn -0.647672 -0.752810 0.117467
-vn -0.145208 -0.987646 -0.058901
-vn -0.639161 -0.723760 -0.260084
-vn -0.123999 -0.951033 -0.283125
-vn -0.171456 -0.865459 -0.470726
-vn -0.639161 -0.723760 -0.260084
-vn -0.648624 -0.756632 -0.082432
-vn -0.123999 -0.951033 -0.283125
-vn -0.639161 -0.723760 -0.260084
-vn -0.171456 -0.865459 -0.470726
-vn -0.176492 -0.781012 -0.599058
-vn -0.604308 -0.711613 -0.358355
-vn -0.639161 -0.723760 -0.260084
-vn -0.176492 -0.781012 -0.599058
-vn -0.460262 -0.773604 -0.435541
-vn -0.140114 -0.669504 -0.729474
-vn -0.119057 -0.591407 -0.797536
-vn -0.460262 -0.773604 -0.435541
-vn -0.604308 -0.711613 -0.358355
-vn -0.140114 -0.669504 -0.729474
-vn -0.243419 -0.829015 -0.503470
-vn -0.119057 -0.591407 -0.797536
-vn -0.048831 -0.536314 -0.842605
-vn -0.243419 -0.829015 -0.503470
-vn -0.460262 -0.773604 -0.435541
-vn -0.119057 -0.591407 -0.797536
-vn -0.243419 -0.829015 -0.503470
-vn -0.048831 -0.536314 -0.842605
-vn 0.007019 -0.844861 -0.534939
-vn -0.745103 0.591285 -0.308552
-vn -0.734685 0.678408 0.000000
-vn -0.500057 0.836990 -0.222241
-vn -0.670866 0.741578 0.000000
-vn 0.253949 -0.348223 0.902358
-vn 0.000000 -0.052402 0.998626
-vn 0.173990 -0.397360 0.901018
-vn 0.000031 -0.052339 0.998629
-vn 0.381762 0.058535 0.922405
-vn 0.396174 0.091223 0.913633
-vn 0.000000 0.044038 0.999030
-vn 0.000000 0.048464 0.998825
-vn 0.000000 0.052126 0.998641
-vn -0.392471 0.192390 0.899418
-vn 0.000000 0.048434 0.998826
-vn -0.395796 0.091006 0.913818
-vn -0.381975 0.058596 -0.922313
-vn -0.396046 0.091008 -0.913710
-vn 0.000000 0.043978 -0.999033
-vn 0.000000 0.048190 -0.998838
-vn -0.316758 0.606690 -0.729103
-vn -0.214888 0.828363 -0.517338
-vn 0.000000 0.699991 -0.714152
-vn 0.000000 0.732851 -0.680389
-vn -0.393298 0.193094 -0.898906
-vn -0.396046 0.091008 -0.913710
-vn -0.870643 0.329573 -0.365189
-vn -0.919325 0.124518 -0.373278
-vn 0.173990 -0.397360 0.901018
-vn 0.000031 -0.052339 0.998629
-vn 0.087254 -0.426017 0.900498
-vn 0.000000 -0.052126 0.998641
-vn -0.912094 -0.149238 0.381855
-vn -0.902001 -0.203565 0.380730
-vn -0.375319 -0.102543 0.921206
-vn -0.377613 -0.138923 0.915483
-vn 0.000000 0.044008 0.999031
-vn 0.000000 0.044069 0.999029
-vn 0.000000 0.048434 0.998826
-vn 0.000000 0.048434 0.998826
-vn 0.000000 0.048160 -0.998840
-vn 0.395989 0.090856 -0.913750
-vn 0.000000 0.043978 -0.999033
-vn 0.382011 0.058628 -0.922296
-vn -0.319323 -0.281907 0.904744
-vn -0.254165 -0.348043 0.902367
-vn 0.000000 -0.052279 0.998633
-vn 0.000031 -0.052432 0.998624
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078433 0.996919 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.719155 0.592775 -0.362538
-vn 0.325795 0.316060 -0.891046
-vn 0.524598 0.770401 -0.362326
-vn 0.228679 0.372332 -0.899486
-vn 0.919351 0.124242 -0.373307
-vn 0.395989 0.090856 -0.913750
-vn 0.868458 0.334950 -0.365499
-vn 0.392297 0.200055 -0.897820
-vn 0.998866 0.047610 0.000000
-vn 0.993055 0.117650 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993066 0.117560 0.000000
-vn 0.395989 0.090856 -0.913750
-vn 0.000000 0.048160 -0.998840
-vn 0.392297 0.200055 -0.897820
-vn 0.002930 0.055209 -0.998470
-vn -0.316758 0.606690 -0.729103
-vn -0.745103 0.591285 -0.308552
-vn -0.214888 0.828363 -0.517338
-vn -0.500057 0.836990 -0.222241
-vn 0.000000 0.052279 -0.998633
-vn 0.000000 0.048190 -0.998838
-vn 0.000000 0.052309 -0.998631
-vn 0.000000 0.048190 -0.998838
-vn 0.392297 0.200055 -0.897820
-vn 0.002930 0.055209 -0.998470
-vn 0.325795 0.316060 -0.891046
-vn 0.228679 0.372332 -0.899486
-vn 0.228679 0.372332 -0.899486
-vn 0.002930 0.055209 -0.998470
-vn 0.122871 0.434167 -0.892414
-vn 0.028932 0.428152 -0.903243
-vn -0.393298 0.193094 -0.898906
-vn -0.312152 0.299273 -0.901663
-vn 0.000000 0.052309 -0.998631
-vn -0.224897 0.374747 -0.899436
-vn -0.029329 0.427604 -0.903490
-vn 0.000000 0.052309 -0.998631
-vn -0.121224 0.433042 -0.893185
-vn -0.224897 0.374747 -0.899436
-vn 0.000000 0.418594 -0.908174
-vn 0.028932 0.428152 -0.903243
-vn 0.000000 0.052279 -0.998633
-vn 0.002930 0.055209 -0.998470
-vn 0.184245 -0.380941 -0.906056
-vn 0.106113 -0.434098 -0.894594
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn -0.171580 -0.405969 -0.897636
-vn -0.277025 -0.360404 -0.890711
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.366104 -0.154792 -0.917610
-vn 0.374497 -0.244701 -0.894356
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn -0.386469 -0.166759 -0.907102
-vn 0.000000 -0.052309 -0.998631
-vn -0.342519 -0.277268 -0.897666
-vn 0.000000 -0.052309 -0.998631
-vn 0.106113 -0.434098 -0.894594
-vn 0.002747 -0.441857 -0.897081
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052339 -0.998629
-vn -0.277025 -0.360404 -0.890711
-vn -0.342519 -0.277268 -0.897666
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn -0.386469 -0.166759 -0.907102
-vn -0.385668 -0.101262 -0.917064
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn -0.171580 -0.405969 -0.897636
-vn 0.000000 -0.052309 -0.998631
-vn -0.087345 -0.430315 -0.898443
-vn 0.000000 -0.052339 -0.998629
-vn 0.184245 -0.380941 -0.906056
-vn 0.000000 -0.052309 -0.998631
-vn 0.304368 -0.320665 -0.896958
-vn 0.000000 -0.052339 -0.998629
-vn -0.087345 -0.430315 -0.898443
-vn 0.000000 -0.052339 -0.998629
-vn 0.002747 -0.441857 -0.897081
-vn 0.000000 -0.052339 -0.998629
-vn 0.374497 -0.244701 -0.894356
-vn 0.304368 -0.320665 -0.896958
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 0.699991 -0.714152
-vn 0.372764 -0.088140 -0.923731
-vn 0.321855 0.605804 -0.727606
-vn -0.316758 0.606690 -0.729103
-vn 0.000000 0.699991 -0.714152
-vn -0.379990 -0.085209 -0.921058
-vn 0.000000 -0.052309 -0.998631
-vn 0.209422 -0.955035 0.209880
-vn -0.001221 -0.985450 0.169959
-vn 0.212324 -0.913234 -0.347739
-vn 0.000702 -0.938897 -0.344197
-vn 0.184245 -0.380941 -0.906056
-vn 0.439571 -0.822101 -0.361838
-vn 0.106113 -0.434098 -0.894594
-vn 0.212324 -0.913234 -0.347739
-vn 0.720131 0.591401 0.362843
-vn 0.867846 0.335834 0.366140
-vn 0.781137 0.624360 0.000000
-vn 0.939468 0.342637 0.000000
-vn 0.527037 0.768230 0.363393
-vn 0.720131 0.591401 0.362843
-vn 0.569396 0.822064 0.000000
-vn 0.781137 0.624360 0.000000
-vn 0.867846 0.335834 0.366140
-vn 0.919256 0.124211 0.373550
-vn 0.939468 0.342637 0.000000
-vn 0.993066 0.117560 0.000000
-vn 0.993066 0.117560 0.000000
-vn 0.919256 0.124211 0.373550
-vn 0.998866 0.047610 0.000000
-vn 0.922245 0.060458 0.381850
-vn -0.992964 0.118414 0.000000
-vn -0.992942 0.118598 0.000000
-vn -0.939600 0.342275 0.000000
-vn -0.939332 0.343010 0.000000
-vn 0.780580 0.625056 0.000000
-vn 0.939246 0.343245 0.000000
-vn 0.780499 0.625156 0.000000
-vn 0.939213 0.343335 0.000000
-vn 0.000000 0.928845 0.370470
-vn 0.000000 0.418172 0.908368
-vn 0.069399 0.929325 0.362684
-vn 0.029085 0.427176 0.903701
-vn 0.396174 0.091223 0.913633
-vn 0.396049 0.205456 0.894948
-vn 0.000000 0.048464 0.998825
-vn 0.003998 0.056093 0.998418
-vn 0.000000 0.052005 0.998647
-vn 0.000000 0.052126 0.998641
-vn 0.000000 0.048434 0.998826
-vn 0.000000 0.048434 0.998826
-vn -0.392471 0.192390 0.899418
-vn 0.000000 0.052126 0.998641
-vn -0.312362 0.298720 0.901774
-vn -0.224988 0.373677 0.899859
-vn -0.029177 0.427853 0.903377
-vn -0.122289 0.433856 0.892645
-vn 0.000000 0.052126 0.998641
-vn -0.224988 0.373677 0.899859
-vn 0.396049 0.205456 0.894948
-vn 0.320333 0.310109 0.895108
-vn 0.003998 0.056093 0.998418
-vn 0.235030 0.375908 0.896356
-vn 0.235030 0.375908 0.896356
-vn 0.121893 0.433583 0.892832
-vn 0.003998 0.056093 0.998418
-vn 0.029085 0.427176 0.903701
-vn 0.000000 0.418172 0.908368
-vn 0.000000 0.052005 0.998647
-vn 0.029085 0.427176 0.903701
-vn 0.003998 0.056093 0.998418
-vn -0.174140 -0.397386 0.900977
-vn -0.087286 -0.425991 0.900507
-vn -0.000031 -0.052432 0.998624
-vn 0.000000 -0.052096 0.998642
-vn 0.087254 -0.426017 0.900498
-vn 0.000000 -0.052126 0.998641
-vn 0.000000 -0.434743 0.900555
-vn 0.000000 -0.052157 0.998639
-vn 0.000000 -0.052309 0.998631
-vn 0.377487 -0.139135 0.915503
-vn 0.000000 -0.052370 0.998628
-vn 0.375234 -0.102697 0.921223
-vn 0.000000 -0.052279 0.998633
-vn 0.000000 0.703021 0.711169
-vn -0.375319 -0.102543 0.921206
-vn -0.329091 0.602117 0.727430
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052339 0.998629
-vn 0.000000 -0.052370 0.998628
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052339 0.998629
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052463 0.998623
-vn 0.000000 -0.052402 0.998626
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052339 0.998629
-vn 0.000000 -0.052248 0.998634
-vn 0.000031 -0.052339 0.998629
-vn 0.000000 -0.052463 0.998623
-vn 0.000000 -0.052402 0.998626
-vn 0.000031 -0.052432 0.998624
-vn -0.000031 -0.052432 0.998624
-vn 0.000000 -0.052463 0.998623
-vn 0.000000 -0.052248 0.998634
-vn 0.000000 -0.052279 0.998633
-vn 0.000031 -0.052432 0.998624
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052463 0.998623
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052279 0.998633
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052279 0.998633
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052339 0.998629
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 0.052126 0.998641
-vn 0.000000 0.052005 0.998647
-vn -0.029177 0.427853 0.903377
-vn 0.000000 0.418172 0.908368
-vn 0.000000 0.048464 0.998825
-vn 0.003998 0.056093 0.998418
-vn 0.000000 0.048434 0.998826
-vn 0.000000 0.052005 0.998647
-vn -0.069248 0.929275 0.362841
-vn -0.029177 0.427853 0.903377
-vn 0.000000 0.928845 0.370470
-vn 0.000000 0.418172 0.908368
-vn 0.000031 -0.052339 0.998629
-vn 0.000000 -0.052248 0.998634
-vn 0.000000 -0.052126 0.998641
-vn 0.000000 -0.052157 0.998639
-vn -0.000031 -0.052432 0.998624
-vn 0.000000 -0.052096 0.998642
-vn 0.000000 -0.052248 0.998634
-vn 0.000000 -0.052157 0.998639
-vn 0.660743 -0.650336 0.374808
-vn 0.789045 -0.614139 0.015504
-vn 0.778579 -0.505401 0.372000
-vn 0.884960 -0.465507 0.012208
-vn 0.310045 -0.595674 0.740976
-vn 0.263930 -0.785352 0.559967
-vn 0.741037 -0.593385 0.314257
-vn 0.621805 -0.753893 0.212141
-vn -0.157268 -0.676224 0.719714
-vn 0.172404 -0.693613 0.699412
-vn -0.121832 -0.784555 0.607972
-vn 0.125158 -0.786652 0.604577
-vn -0.048831 -0.536314 -0.842605
-vn -0.119057 -0.591407 -0.797536
-vn 0.048037 -0.537777 -0.841717
-vn 0.120276 -0.592529 -0.796519
-vn 0.007019 -0.844861 -0.534939
-vn -0.000397 -0.487642 -0.873044
-vn 0.048037 -0.537777 -0.841717
-vn 0.007019 -0.844861 -0.534939
-vn -0.048831 -0.536314 -0.842605
-vn -0.000397 -0.487642 -0.873044
-vn 0.000275 -0.811299 0.584631
-vn 0.046267 -0.491606 0.869588
-vn 0.000031 -0.438709 0.898629
-vn 0.000275 -0.811299 0.584631
-vn 0.000031 -0.438709 0.898629
-vn -0.046175 -0.491786 0.869491
-vn 0.439571 -0.822101 -0.361838
-vn 0.640223 -0.679501 -0.358321
-vn 0.453122 -0.859397 0.236892
-vn 0.640007 -0.753384 0.151006
-vn 0.304368 -0.320665 -0.896958
-vn 0.640223 -0.679501 -0.358321
-vn 0.184245 -0.380941 -0.906056
-vn 0.439571 -0.822101 -0.361838
-vn 0.374497 -0.244701 -0.894356
-vn 0.802405 -0.482688 -0.350938
-vn 0.304368 -0.320665 -0.896958
-vn 0.640223 -0.679501 -0.358321
-vn -0.382251 -0.857281 -0.344896
-vn -0.429001 -0.879885 0.204353
-vn -0.584690 -0.736127 -0.340962
-vn -0.633088 -0.762062 0.135871
-vn -0.176492 -0.781012 -0.599058
-vn 0.183848 -0.767314 -0.614352
-vn -0.140114 -0.669504 -0.729474
-vn 0.138436 -0.667855 -0.731304
-vn -0.604308 -0.711613 -0.358355
-vn -0.176492 -0.781012 -0.599058
-vn -0.140114 -0.669504 -0.729474
-vn 0.004517 -0.992742 -0.120182
-vn -0.000855 -0.999608 0.027986
-vn -0.250746 -0.957540 -0.142281
-vn -0.297408 -0.954362 0.027223
-vn 0.568818 0.822464 0.000000
-vn 0.780580 0.625056 0.000000
-vn 0.568762 0.822502 0.000000
-vn 0.780499 0.625156 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.992964 0.118414 0.000000
-vn -0.992942 0.118598 0.000000
-vn 0.780499 0.625156 0.000000
-vn 0.939213 0.343335 0.000000
-vn 0.780446 0.625223 0.000000
-vn 0.939190 0.343399 0.000000
-vn 0.568762 0.822502 0.000000
-vn 0.780499 0.625156 0.000000
-vn 0.568692 0.822550 0.000000
-vn 0.780446 0.625223 0.000000
-vn 0.939213 0.343335 0.000000
-vn 0.993044 0.117741 0.000000
-vn 0.939190 0.343399 0.000000
-vn 0.993044 0.117741 0.000000
-vn -0.939844 0.341603 0.000000
-vn -0.782234 0.622985 0.000000
-vn -0.939891 0.341476 0.000000
-vn -0.782382 0.622799 0.000000
-vn -0.569521 0.821977 0.000000
-vn -0.313186 0.949692 0.000000
-vn -0.569702 0.821851 0.000000
-vn -0.313370 0.949631 0.000000
-vn -0.313186 0.949692 0.000000
-vn -0.079319 0.996849 0.000000
-vn -0.313370 0.949631 0.000000
-vn -0.079380 0.996844 0.000000
-vn -0.782234 0.622985 0.000000
-vn -0.569521 0.821977 0.000000
-vn -0.782382 0.622799 0.000000
-vn -0.569702 0.821851 0.000000
-vn -0.569305 0.822126 0.000000
-vn -0.313003 0.949752 0.000000
-vn -0.569521 0.821977 0.000000
-vn -0.313186 0.949692 0.000000
-vn -0.939778 0.341785 0.000000
-vn -0.782058 0.623205 0.000000
-vn -0.939844 0.341603 0.000000
-vn -0.782234 0.622985 0.000000
-vn -0.992990 0.118199 0.000000
-vn -0.992986 0.118229 0.000000
-vn -0.939891 0.341476 0.000000
-vn -0.939844 0.341603 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993040 0.117774 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993044 0.117741 0.000000
-vn -0.912094 -0.149238 0.381855
-vn -0.750227 0.586307 0.305621
-vn -0.990001 -0.141058 -0.000305
-vn -0.737682 0.675148 0.000000
-vn -0.991137 -0.132636 -0.007416
-vn -0.992570 -0.121649 -0.002442
-vn -0.734553 0.678551 -0.000092
-vn -0.730939 0.682443 -0.000031
-vn -0.992527 -0.122013 0.001740
-vn -0.992570 -0.121649 -0.002442
-vn -0.954279 -0.298907 0.002472
-vn -0.951202 -0.308125 0.016572
-vn -0.087286 -0.425991 0.900507
-vn -0.174140 -0.397386 0.900977
-vn -0.238259 -0.894775 0.377637
-vn -0.471889 -0.796857 0.377279
-vn 0.000000 -0.925801 0.378011
-vn -0.238259 -0.894775 0.377637
-vn -0.000855 -0.999608 0.027986
-vn -0.297408 -0.954362 0.027223
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn -0.377613 -0.138923 0.915483
-vn -0.353195 -0.211129 0.911415
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052309 0.998631
-vn 0.352987 -0.211408 0.911431
-vn 0.000000 -0.052309 0.998631
-vn 0.319082 -0.282245 0.904723
-vn 0.000000 -0.052339 0.998629
-vn -0.849339 -0.521933 -0.078800
-vn -0.710895 -0.695605 -0.103736
-vn -0.886617 -0.462368 0.011231
-vn -0.788745 -0.614540 0.014893
-vn 0.000000 0.048160 -0.998840
-vn 0.000000 0.048190 -0.998838
-vn 0.002930 0.055209 -0.998470
-vn 0.000000 0.052279 -0.998633
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn -0.916742 -0.125557 -0.379234
-vn -0.909937 -0.184063 -0.371666
-vn -0.991018 -0.133704 -0.002472
-vn -0.939317 -0.333574 0.080082
-vn -0.939703 0.341993 0.000000
-vn -0.781842 0.623477 0.000000
-vn -0.939778 0.341785 0.000000
-vn -0.782058 0.623205 0.000000
-vn -0.569034 0.822314 0.000000
-vn -0.312756 0.949834 0.000000
-vn -0.569305 0.822126 0.000000
-vn -0.313003 0.949752 0.000000
-vn -0.992986 0.118229 0.000000
-vn -0.992979 0.118293 0.000000
-vn -0.939844 0.341603 0.000000
-vn -0.939778 0.341785 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.992990 0.118199 0.000000
-vn -0.992986 0.118229 0.000000
-vn -0.781842 0.623477 0.000000
-vn -0.569034 0.822314 0.000000
-vn -0.782058 0.623205 0.000000
-vn -0.569305 0.822126 0.000000
-vn -0.781571 0.623816 0.000000
-vn -0.568658 0.822574 0.000000
-vn -0.781842 0.623477 0.000000
-vn -0.569034 0.822314 0.000000
-vn -0.079471 0.996837 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.070103 0.929281 -0.362660
-vn 0.000000 0.928819 -0.370533
-vn -0.568658 0.822574 0.000000
-vn -0.312453 0.949933 0.000000
-vn -0.569034 0.822314 0.000000
-vn -0.312756 0.949834 0.000000
-vn -0.939600 0.342275 0.000000
-vn -0.781571 0.623816 0.000000
-vn -0.939703 0.341993 0.000000
-vn -0.781842 0.623477 0.000000
-vn -0.992979 0.118293 0.000000
-vn -0.992975 0.118323 0.000000
-vn -0.939778 0.341785 0.000000
-vn -0.939703 0.341993 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.992986 0.118229 0.000000
-vn -0.992979 0.118293 0.000000
-vn -0.939332 0.343010 0.000000
-vn -0.780839 0.624732 0.000000
-vn -0.939600 0.342275 0.000000
-vn -0.781571 0.623816 0.000000
-vn -0.567682 0.823248 0.000000
-vn -0.311600 0.950213 0.000000
-vn -0.568658 0.822574 0.000000
-vn -0.312453 0.949933 0.000000
-vn -0.780839 0.624732 0.000000
-vn -0.567682 0.823248 0.000000
-vn -0.781571 0.623816 0.000000
-vn -0.568658 0.822574 0.000000
-vn -0.992975 0.118323 0.000000
-vn -0.992964 0.118414 0.000000
-vn -0.939703 0.341993 0.000000
-vn -0.939600 0.342275 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.992979 0.118293 0.000000
-vn -0.992975 0.118323 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.992975 0.118323 0.000000
-vn -0.992964 0.118414 0.000000
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn -0.079471 0.996837 0.000000
-vn -0.079380 0.996844 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 0.699991 -0.714152
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 0.699991 -0.714152
-vn 0.078190 0.996939 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.311664 0.950192 0.000000
-vn 0.078190 0.996939 0.000000
-vn 0.311536 0.950234 0.000000
-vn 0.311664 0.950192 0.000000
-vn 0.568692 0.822550 0.000000
-vn 0.311536 0.950234 0.000000
-vn 0.568602 0.822613 0.000000
-vn 0.780446 0.625223 0.000000
-vn 0.939190 0.343399 0.000000
-vn 0.780351 0.625342 0.000000
-vn 0.939143 0.343526 0.000000
-vn 0.568692 0.822550 0.000000
-vn 0.780446 0.625223 0.000000
-vn 0.568602 0.822613 0.000000
-vn 0.780351 0.625342 0.000000
-vn 0.939190 0.343399 0.000000
-vn 0.993044 0.117741 0.000000
-vn 0.939143 0.343526 0.000000
-vn 0.993040 0.117774 0.000000
-vn -0.939891 0.341476 0.000000
-vn -0.782382 0.622799 0.000000
-vn -0.939966 0.341268 0.000000
-vn -0.782587 0.622541 0.000000
-vn -0.569702 0.821851 0.000000
-vn -0.313370 0.949631 0.000000
-vn -0.569973 0.821663 0.000000
-vn -0.313581 0.949562 0.000000
-vn -0.313370 0.949631 0.000000
-vn -0.079380 0.996844 0.000000
-vn -0.313581 0.949562 0.000000
-vn -0.079471 0.996837 0.000000
-vn -0.782382 0.622799 0.000000
-vn -0.569702 0.821851 0.000000
-vn -0.782587 0.622541 0.000000
-vn -0.569973 0.821663 0.000000
-vn -0.919325 0.124518 -0.373278
-vn -0.992997 0.118139 0.000000
-vn -0.870643 0.329573 -0.365189
-vn -0.939966 0.341268 0.000000
-vn 0.922348 0.060580 -0.381580
-vn 0.919351 0.124242 -0.373307
-vn 0.998866 0.047610 0.000000
-vn 0.993040 0.117774 0.000000
-vn -0.734964 0.678106 0.000061
-vn -0.730909 0.682475 0.000000
-vn -0.990831 -0.134986 0.005646
-vn -0.992527 -0.122013 0.001740
-vn -0.379990 -0.085209 -0.921058
-vn -0.916742 -0.125557 -0.379234
-vn -0.316758 0.606690 -0.729103
-vn -0.745103 0.591285 -0.308552
-vn 0.990046 -0.140663 -0.004853
-vn 0.913199 -0.133217 -0.385123
-vn 0.737157 0.675722 -0.000092
-vn 0.747977 0.586436 -0.310843
-vn 0.778579 -0.505401 0.372000
-vn 0.884960 -0.465507 0.012208
-vn 0.857781 -0.346641 0.379541
-vn 0.951306 -0.308211 0.004853
-vn 0.984351 -0.176215 -0.001099
-vn 0.901970 -0.203534 0.380821
-vn 0.951306 -0.308211 0.004853
-vn 0.857781 -0.346641 0.379541
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.366104 -0.154792 -0.917610
-vn 0.362879 -0.103340 -0.926089
-vn 0.904830 -0.170541 -0.390126
-vn 0.877705 -0.298509 -0.374869
-vn 0.362879 -0.103340 -0.926089
-vn 0.366104 -0.154792 -0.917610
-vn -0.385668 -0.101262 -0.917064
-vn -0.386469 -0.166759 -0.907102
-vn -0.909937 -0.184063 -0.371666
-vn -0.859060 -0.359823 -0.364066
-vn 0.897571 -0.428521 0.103613
-vn 0.985937 -0.163336 -0.035341
-vn 0.934625 -0.355612 0.004151
-vn -0.922339 0.060549 -0.381607
-vn -0.998866 0.047610 0.000000
-vn -0.919325 0.124518 -0.373278
-vn -0.992997 0.118139 0.000000
-vn 0.568888 0.822415 0.000000
-vn 0.780675 0.624937 0.000000
-vn 0.568818 0.822464 0.000000
-vn 0.780580 0.625056 0.000000
-vn 0.780675 0.624937 0.000000
-vn 0.939279 0.343154 0.000000
-vn 0.780580 0.625056 0.000000
-vn 0.939246 0.343245 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993044 0.117741 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993044 0.117741 0.000000
-vn 0.939279 0.343154 0.000000
-vn 0.993052 0.117681 0.000000
-vn 0.939246 0.343245 0.000000
-vn 0.993048 0.117711 0.000000
-vn 0.939335 0.343000 0.000000
-vn 0.993055 0.117650 0.000000
-vn 0.939279 0.343154 0.000000
-vn 0.993052 0.117681 0.000000
-vn 0.780797 0.624784 0.000000
-vn 0.939335 0.343000 0.000000
-vn 0.780675 0.624937 0.000000
-vn 0.939279 0.343154 0.000000
-vn 0.568999 0.822338 0.000000
-vn 0.780797 0.624784 0.000000
-vn 0.568888 0.822415 0.000000
-vn 0.780675 0.624937 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993044 0.117741 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993048 0.117711 0.000000
-vn -0.311879 -0.598488 -0.737932
-vn 0.000000 -0.679106 -0.734040
-vn -0.233778 -0.773910 -0.588566
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 1.000000 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.000000 0.418594 -0.908174
-vn 0.000000 0.052279 -0.998633
-vn -0.029329 0.427604 -0.903490
-vn 0.000000 0.052309 -0.998631
-vn 0.311664 0.950192 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.311692 0.950183 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.311692 0.950183 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.311692 0.950183 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.069399 0.929325 0.362684
-vn 0.286943 0.888480 0.358145
-vn 0.078433 0.996919 0.000000
-vn 0.312178 0.950024 0.000000
-vn 0.286943 0.888480 0.358145
-vn 0.527037 0.768230 0.363393
-vn 0.312178 0.950024 0.000000
-vn 0.569396 0.822064 0.000000
-vn 0.992243 -0.124275 0.003082
-vn 0.992707 -0.120552 -0.000946
-vn 0.731704 0.681622 0.000031
-vn 0.730525 0.682886 0.000000
-vn 0.568762 0.822502 0.000000
-vn 0.568692 0.822550 0.000000
-vn 0.311692 0.950183 0.000000
-vn 0.311664 0.950192 0.000000
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.992707 -0.120552 -0.000946
-vn 0.990875 -0.134469 -0.009247
-vn 0.730525 0.682886 0.000000
-vn 0.735447 0.677583 -0.000153
-vn 0.311756 0.950162 0.000000
-vn 0.568999 0.822338 0.000000
-vn 0.311720 0.950174 0.000000
-vn 0.568888 0.822415 0.000000
-vn 0.311756 0.950162 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.312178 0.950024 0.000000
-vn 0.078433 0.996919 0.000000
-vn 0.311692 0.950183 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.311720 0.950174 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.568818 0.822464 0.000000
-vn 0.568762 0.822502 0.000000
-vn 0.311692 0.950183 0.000000
-vn 0.311692 0.950183 0.000000
-vn 0.311720 0.950174 0.000000
-vn 0.568888 0.822415 0.000000
-vn 0.311692 0.950183 0.000000
-vn 0.568818 0.822464 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078433 0.996919 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.079319 0.996849 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.079380 0.996844 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.886617 -0.462368 0.011231
-vn -0.952300 -0.305104 0.005982
-vn -0.849339 -0.521933 -0.078800
-vn -0.913458 -0.399399 -0.077945
-vn -0.952300 -0.305104 0.005982
-vn -0.984672 -0.174417 0.000336
-vn -0.913458 -0.399399 -0.077945
-vn -0.939019 -0.338459 -0.060733
-vn -0.990831 -0.134986 0.005646
-vn -0.989839 -0.142190 0.001251
-vn -0.734964 0.678106 0.000061
-vn -0.738163 0.674622 0.000000
-vn -0.990001 -0.141058 -0.000305
-vn -0.989839 -0.142190 0.001251
-vn -0.984672 -0.174417 0.000336
-vn -0.939019 -0.338459 -0.060733
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.000000 0.418594 -0.908174
-vn -0.029329 0.427604 -0.903490
-vn 0.000000 0.928819 -0.370533
-vn -0.070103 0.929281 -0.362660
-vn 0.078220 0.996936 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.311720 0.950174 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.311756 0.950162 0.000000
-vn 0.078220 0.996936 0.000000
-vn 0.312178 0.950024 0.000000
-vn 0.569396 0.822064 0.000000
-vn 0.311756 0.950162 0.000000
-vn 0.568999 0.822338 0.000000
-vn 0.569396 0.822064 0.000000
-vn 0.781137 0.624360 0.000000
-vn 0.568999 0.822338 0.000000
-vn 0.780797 0.624784 0.000000
-vn 0.781137 0.624360 0.000000
-vn 0.939468 0.342637 0.000000
-vn 0.780797 0.624784 0.000000
-vn 0.939335 0.343000 0.000000
-vn 0.939468 0.342637 0.000000
-vn 0.993066 0.117560 0.000000
-vn 0.939335 0.343000 0.000000
-vn 0.993055 0.117650 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993048 0.117711 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993052 0.117681 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.078738 0.996895 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 1.000000 0.000000
-vn 0.078190 0.996939 0.000000
-vn 0.000000 0.928819 -0.370533
-vn 0.068943 0.929284 -0.362875
-vn -0.079165 0.996861 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.079259 0.996854 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.079044 0.996871 0.000000
-vn -0.079165 0.996861 0.000000
-vn -0.313003 0.949752 0.000000
-vn -0.079259 0.996854 0.000000
-vn -0.313186 0.949692 0.000000
-vn -0.079319 0.996849 0.000000
-vn -0.312756 0.949834 0.000000
-vn -0.079165 0.996861 0.000000
-vn -0.313003 0.949752 0.000000
-vn -0.079259 0.996854 0.000000
-vn -0.312453 0.949933 0.000000
-vn -0.079044 0.996871 0.000000
-vn -0.312756 0.949834 0.000000
-vn -0.079165 0.996861 0.000000
-vn -0.311600 0.950213 0.000000
-vn -0.078738 0.996895 0.000000
-vn -0.312453 0.949933 0.000000
-vn -0.079044 0.996871 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.079319 0.996849 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.079259 0.996854 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.078738 0.996895 0.000000
-vn -0.079044 0.996871 0.000000
-vn 0.949811 -0.310561 0.037569
-vn 0.934625 -0.355612 0.004151
-vn 0.985937 -0.163336 -0.035341
-vn 0.950440 -0.308980 0.034579
-vn 0.949811 -0.310561 0.037569
-vn 0.985937 -0.163336 -0.035341
-vn 0.990046 -0.140663 -0.004853
-vn 0.990875 -0.134469 -0.009247
-vn 0.985937 -0.163336 -0.035341
-vn 0.950440 -0.308980 0.034579
-vn 0.992243 -0.124275 0.003082
-vn 0.731704 0.681622 0.000031
-vn 0.990438 -0.137855 0.005310
-vn 0.736588 0.676342 0.000092
-vn 0.990438 -0.137855 0.005310
-vn 0.736588 0.676342 0.000092
-vn 0.989089 -0.147315 0.001312
-vn 0.739720 0.672914 0.000000
-vn 0.989641 -0.143562 -0.000641
-vn 0.984351 -0.176215 -0.001099
-vn 0.989089 -0.147315 0.001312
-vn 0.981702 -0.190316 0.006439
-vn 0.898822 -0.432030 -0.073948
-vn 0.981702 -0.190316 0.006439
-vn 0.951306 -0.308211 0.004853
-vn 0.984351 -0.176215 -0.001099
-vn 0.898822 -0.432030 -0.073948
-vn 0.922100 -0.382311 -0.059756
-vn 0.981702 -0.190316 0.006439
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 -0.052339 -0.998629
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.078738 0.996895 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.078433 0.996919 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.069399 0.929325 0.362684
-vn 0.078433 0.996919 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.078738 0.996895 0.000000
-vn -0.069248 0.929275 0.362841
-vn 0.000000 1.000000 0.000000
-vn -0.069248 0.929275 0.362841
-vn 0.000000 0.928845 0.370470
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.069399 0.929325 0.362684
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.928845 0.370470
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.552338 0.770490 -0.318225
-vn 0.000000 1.000000 0.000000
-vn 0.318864 0.770272 -0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.318864 0.770272 -0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.770266 -0.637723
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.770266 -0.637723
-vn 0.000000 1.000000 0.000000
-vn -0.318864 0.770272 -0.552274
-vn 0.000000 1.000000 0.000000
-vn -0.318864 0.770272 -0.552274
-vn 0.000000 1.000000 0.000000
-vn -0.552336 0.770518 -0.318162
-vn 0.000000 1.000000 0.000000
-vn -0.552336 0.770518 -0.318162
-vn 0.000000 1.000000 0.000000
-vn -0.637722 0.770266 0.001282
-vn 0.000000 1.000000 0.000000
-vn -0.637722 0.770266 0.001282
-vn 0.000000 1.000000 0.000000
-vn -0.552246 0.770001 0.319567
-vn 0.000000 1.000000 0.000000
-vn -0.552246 0.770001 0.319567
-vn 0.000000 1.000000 0.000000
-vn -0.318864 0.770272 0.552274
-vn 0.000000 1.000000 0.000000
-vn -0.318864 0.770272 0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.770266 0.637723
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.770266 0.637723
-vn 0.000000 1.000000 0.000000
-vn 0.318864 0.770272 0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.318864 0.770272 0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.552244 0.770028 0.319505
-vn 0.000000 1.000000 0.000000
-vn 0.552244 0.770028 0.319505
-vn 0.000000 1.000000 0.000000
-vn 0.637722 0.770266 0.001160
-vn 0.000000 1.000000 0.000000
-vn 0.637722 0.770266 0.001160
-vn 0.000000 1.000000 0.000000
-vn 0.552338 0.770490 -0.318225
-vn 0.000000 1.000000 0.000000
-vn 0.318864 0.770272 0.552274
-vn 0.552244 0.770028 0.319505
-vn 0.499989 -0.000000 0.866032
-vn 0.865566 -0.000000 0.500796
-vn -0.552246 0.770001 0.319567
-vn -0.318864 0.770272 0.552274
-vn -0.865518 -0.000000 0.500877
-vn -0.499989 -0.000000 0.866032
-vn 0.000000 0.770266 0.637723
-vn 0.318864 0.770272 0.552274
-vn 0.000000 -0.000000 1.000000
-vn 0.499989 -0.000000 0.866032
-vn -0.318864 0.770272 -0.552274
-vn -0.552336 0.770518 -0.318162
-vn -0.499989 0.000000 -0.866032
-vn -0.866523 0.000000 -0.499137
-vn 0.318864 0.770272 -0.552274
-vn 0.000000 0.770266 -0.637723
-vn 0.499989 0.000000 -0.866032
-vn 0.000000 0.000000 -1.000000
-vn 0.637722 0.770266 0.001160
-vn 0.552338 0.770490 -0.318225
-vn 0.999998 -0.000000 0.001831
-vn 0.866482 0.000000 -0.499209
-vn -0.552336 0.770518 -0.318162
-vn -0.637722 0.770266 0.001282
-vn -0.866523 0.000000 -0.499137
-vn -0.999998 -0.000000 0.002014
-vn -0.637722 0.770266 0.001282
-vn -0.552246 0.770001 0.319567
-vn -0.999998 -0.000000 0.002014
-vn -0.865518 -0.000000 0.500877
-vn -0.318864 0.770272 0.552274
-vn 0.000000 0.770266 0.637723
-vn -0.499989 -0.000000 0.866032
-vn 0.000000 -0.000000 1.000000
-vn 0.552338 0.770490 -0.318225
-vn 0.318864 0.770272 -0.552274
-vn 0.866482 0.000000 -0.499209
-vn 0.499989 0.000000 -0.866032
-vn 0.552244 0.770028 0.319505
-vn 0.637722 0.770266 0.001160
-vn 0.865566 -0.000000 0.500796
-vn 0.999998 -0.000000 0.001831
-vn 0.000000 0.770266 -0.637723
-vn -0.318864 0.770272 -0.552274
-vn 0.000000 0.000000 -1.000000
-vn -0.499989 0.000000 -0.866032
-vn 0.502506 0.783714 -0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.191936 0.783706 -0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.191936 0.783706 -0.590733
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 -0.590733
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 -0.590733
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 -0.365076
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 -0.365076
-vn 0.000000 1.000000 0.000000
-vn -0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.502506 0.783714 -0.365076
-vn 0.000000 1.000000 0.000000
-vn -0.191964 0.783728 -0.590695
-vn 0.000000 1.000000 0.000000
-vn -0.502529 0.783702 -0.365070
-vn 0.000000 1.000000 0.000000
-vn -0.502529 0.783702 -0.365070
-vn 0.000000 1.000000 0.000000
-vn -0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.502529 0.783702 -0.365070
-vn 0.000000 1.000000 0.000000
-vn 0.502529 0.783702 -0.365070
-vn 0.000000 1.000000 0.000000
-vn 0.191964 0.783728 -0.590695
-vn 0.000000 1.000000 0.000000
-vn 0.191964 0.783728 -0.590695
-vn 0.000000 1.000000 0.000000
-vn -0.191964 0.783728 -0.590695
-vn 0.000000 1.000000 0.000000
-vn -0.621130 0.783707 0.000000
-vn -0.502506 0.783714 0.365076
-vn -1.000000 0.000000 0.000000
-vn -0.809030 -0.000000 0.587767
-vn -0.502506 0.783714 0.365076
-vn -0.191936 0.783706 0.590733
-vn -0.809030 -0.000000 0.587767
-vn -0.309004 -0.000000 0.951061
-vn 0.502529 0.783702 -0.365070
-vn 0.191964 0.783728 -0.590695
-vn 0.809045 0.000000 -0.587747
-vn 0.309068 0.000000 -0.951040
-vn -0.502529 0.783702 -0.365070
-vn -0.621130 0.783707 0.000000
-vn -0.809045 0.000000 -0.587747
-vn -1.000000 0.000000 0.000000
-vn 0.191964 0.783728 -0.590695
-vn -0.191964 0.783728 -0.590695
-vn 0.309068 0.000000 -0.951040
-vn -0.309068 0.000000 -0.951040
-vn -0.191936 0.783706 0.590733
-vn 0.191936 0.783706 0.590733
-vn -0.309004 -0.000000 0.951061
-vn 0.309004 -0.000000 0.951061
-vn 0.502506 0.783714 0.365076
-vn 0.621130 0.783707 0.000000
-vn 0.809030 -0.000000 0.587767
-vn 1.000000 0.000000 0.000000
-vn 0.191936 0.783706 0.590733
-vn 0.502506 0.783714 0.365076
-vn 0.309004 -0.000000 0.951061
-vn 0.809030 -0.000000 0.587767
-vn 0.621130 0.783707 0.000000
-vn 0.502529 0.783702 -0.365070
-vn 1.000000 0.000000 0.000000
-vn 0.809045 0.000000 -0.587747
-vn -0.191964 0.783728 -0.590695
-vn -0.502529 0.783702 -0.365070
-vn -0.309068 0.000000 -0.951040
-vn -0.809045 0.000000 -0.587747
-vn -0.502506 0.783714 0.365076
-vn -0.191936 0.783706 0.590733
-vn -0.809030 -0.000000 0.587767
-vn -0.309004 -0.000000 0.951061
-vn -0.191936 0.783706 0.590733
-vn 0.191936 0.783706 0.590733
-vn -0.309004 -0.000000 0.951061
-vn 0.309004 -0.000000 0.951061
-vn -0.621130 0.783707 0.000000
-vn -0.502506 0.783714 0.365076
-vn -1.000000 0.000000 0.000000
-vn -0.809030 -0.000000 0.587767
-vn 0.621130 0.783707 0.000000
-vn 0.502506 0.783714 -0.365076
-vn 1.000000 0.000000 0.000000
-vn 0.809030 0.000000 -0.587767
-vn 0.191936 0.783706 0.590733
-vn 0.502506 0.783714 0.365076
-vn 0.309004 -0.000000 0.951061
-vn 0.809030 -0.000000 0.587767
-vn 0.502506 0.783714 0.365076
-vn 0.621130 0.783707 0.000000
-vn 0.809030 -0.000000 0.587767
-vn 1.000000 0.000000 0.000000
-vn -0.191936 0.783706 -0.590733
-vn -0.502506 0.783714 -0.365076
-vn -0.309004 0.000000 -0.951061
-vn -0.809030 0.000000 -0.587767
-vn 0.191936 0.783706 -0.590733
-vn -0.191936 0.783706 -0.590733
-vn 0.309004 0.000000 -0.951061
-vn -0.309004 0.000000 -0.951061
-vn 0.502506 0.783714 -0.365076
-vn 0.191936 0.783706 -0.590733
-vn 0.809030 0.000000 -0.587767
-vn 0.309004 0.000000 -0.951061
-vn -0.502506 0.783714 -0.365076
-vn -0.621130 0.783707 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -1.000000 0.000000 0.000000
-vn -0.730909 0.682475 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.730939 0.682443 -0.000031
-vn -0.670866 0.741578 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993052 0.117681 0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.993055 0.117650 0.000000
-vn -0.737682 0.675148 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.738163 0.674622 0.000000
-vn -0.670866 0.741578 0.000000
-vn 0.735447 0.677583 -0.000153
-vn 0.737157 0.675722 -0.000092
-vn 0.670866 0.741578 0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.000000 0.699991 -0.714152
-vn 0.000000 0.732851 -0.680389
-vn 0.000000 0.699991 -0.714152
-vn 0.000000 0.732866 -0.680373
-vn 0.000000 -0.675849 0.737040
-vn 0.000000 -0.675849 0.737040
-vn 0.000000 -0.675817 0.737069
-vn 0.000000 -0.675866 0.737025
-vn 0.321855 0.605804 -0.727606
-vn 0.000000 0.699991 -0.714152
-vn 0.214916 0.828380 -0.517299
-vn 0.000000 0.732866 -0.680373
-vn -0.329091 0.602117 0.727430
-vn 0.000000 0.703021 0.711169
-vn -0.230361 0.846581 0.479828
-vn 0.000000 0.736456 0.676486
-vn 0.329149 0.602020 0.727484
-vn 0.230361 0.846581 0.479828
-vn 0.000000 0.702975 0.711215
-vn 0.000000 0.736456 0.676486
-vn -0.311879 -0.598488 -0.737932
-vn -0.233778 -0.773910 -0.588566
-vn -0.739452 -0.596163 -0.312731
-vn -0.590148 -0.771523 -0.237652
-vn 0.311907 -0.598482 -0.737925
-vn 0.233778 -0.773910 -0.588566
-vn 0.000000 -0.679106 -0.734040
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 0.699991 -0.714152
-vn 0.000000 0.699991 -0.714152
-vn 0.000000 0.732866 -0.680373
-vn 0.000000 0.732866 -0.680373
-vn 0.000000 0.043978 -0.999033
-vn 0.000000 0.043978 -0.999033
-vn 0.000000 -0.679106 -0.734040
-vn 0.000000 -0.679106 -0.734040
-vn 0.738513 0.674239 0.000000
-vn 0.739720 0.672914 0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.670866 0.741578 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.922245 0.060458 0.381850
-vn -0.741037 -0.593385 0.314257
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn -0.730939 0.682443 -0.000031
-vn -0.670866 0.741578 0.000000
-vn -0.734553 0.678551 -0.000092
-vn -0.670866 0.741578 0.000000
-vn 0.741037 -0.593385 0.314257
-vn 0.621805 -0.753893 0.212141
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn -0.922245 0.060458 0.381850
-vn -0.741037 -0.593385 0.314257
-vn -0.381763 0.058475 0.922409
-vn -0.310013 -0.595732 0.740942
-vn 0.750260 0.586248 0.305652
-vn 0.738513 0.674239 0.000000
-vn 0.531041 0.824090 0.197157
-vn 0.670866 0.741578 0.000000
-vn -0.310013 -0.595732 0.740942
-vn -0.741037 -0.593385 0.314257
-vn -0.263930 -0.785352 0.559967
-vn -0.621790 -0.753906 0.212136
-vn -0.381975 0.058596 -0.922313
-vn -0.311879 -0.598488 -0.737932
-vn -0.922339 0.060549 -0.381607
-vn -0.739452 -0.596163 -0.312731
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn 0.922245 0.060458 0.381850
-vn 0.381762 0.058535 0.922405
-vn 0.741037 -0.593385 0.314257
-vn 0.310045 -0.595674 0.740976
-vn 0.922348 0.060580 -0.381580
-vn 0.739459 -0.596169 -0.312703
-vn 0.382011 0.058628 -0.922296
-vn 0.311907 -0.598482 -0.737925
-vn 0.736588 0.676342 0.000092
-vn 0.731704 0.681622 0.000031
-vn 0.670866 0.741578 0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.000000 0.043978 -0.999033
-vn 0.000000 0.043978 -0.999033
-vn 0.000000 -0.679106 -0.734040
-vn 0.000000 -0.679106 -0.734040
-vn -0.741037 -0.593385 0.314257
-vn -0.742650 -0.669679 -0.000000
-vn -0.621790 -0.753906 0.212136
-vn -0.742346 -0.670016 -0.000000
-vn 0.000000 -0.675866 0.737025
-vn 0.000000 0.736456 0.676486
-vn 0.000000 -0.675849 0.737040
-vn 0.000000 0.736456 0.676486
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 0.732866 -0.680373
-vn 0.000000 0.732866 -0.680373
-vn 0.500093 0.836968 -0.222243
-vn 0.214916 0.828380 -0.517299
-vn 0.590148 -0.771523 -0.237652
-vn 0.233778 -0.773910 -0.588566
-vn 0.621805 -0.753893 0.212141
-vn 0.263930 -0.785352 0.559967
-vn 0.531041 0.824090 0.197157
-vn 0.230361 0.846581 0.479828
-vn -0.233778 -0.773910 -0.588566
-vn -0.214888 0.828363 -0.517338
-vn -0.590148 -0.771523 -0.237652
-vn -0.500057 0.836990 -0.222241
-vn -0.621790 -0.753906 0.212136
-vn -0.531041 0.824090 0.197157
-vn -0.263930 -0.785352 0.559967
-vn -0.230361 0.846581 0.479828
-vn -0.742346 -0.670016 -0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.621790 -0.753906 0.212136
-vn -0.531041 0.824090 0.197157
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 0.732851 -0.680389
-vn 0.000000 0.732866 -0.680373
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn -0.500057 0.836990 -0.222241
-vn -0.670866 0.741578 0.000000
-vn -0.590148 -0.771523 -0.237652
-vn -0.742346 -0.670016 -0.000000
-vn 0.500093 0.836968 -0.222243
-vn 0.590148 -0.771523 -0.237652
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.531041 0.824090 0.197157
-vn 0.621805 -0.753893 0.212141
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.000000 -0.679867 -0.733336
-vn 0.233778 -0.773910 -0.588566
-vn 0.000000 0.732866 -0.680373
-vn 0.214916 0.828380 -0.517299
-vn 0.000000 0.736456 0.676486
-vn 0.000000 0.736456 0.676486
-vn 0.000000 -0.675849 0.737040
-vn 0.000000 -0.675866 0.737025
-vn -0.214888 0.828363 -0.517338
-vn -0.233778 -0.773910 -0.588566
-vn 0.000000 0.732851 -0.680389
-vn 0.000000 -0.679867 -0.733336
-vn 0.230361 0.846581 0.479828
-vn 0.263930 -0.785352 0.559967
-vn 0.000000 0.736456 0.676486
-vn 0.000000 -0.675849 0.737040
-vn -0.230361 0.846581 0.479828
-vn 0.000000 0.736456 0.676486
-vn -0.263930 -0.785352 0.559967
-vn 0.000000 -0.675849 0.737040
-vn -0.670866 0.741578 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn 0.730525 0.682886 0.000000
-vn 0.735447 0.677583 -0.000153
-vn 0.670866 0.741578 0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.329149 0.602020 0.727484
-vn 0.750260 0.586248 0.305652
-vn 0.230361 0.846581 0.479828
-vn 0.531041 0.824090 0.197157
-vn 0.000000 -0.679106 -0.734040
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 -0.679106 -0.734040
-vn 0.000000 -0.679867 -0.733336
-vn -0.329091 0.602117 0.727430
-vn -0.230361 0.846581 0.479828
-vn -0.750227 0.586307 0.305621
-vn -0.531041 0.824090 0.197157
-vn -0.310013 -0.595732 0.740942
-vn -0.263930 -0.785352 0.559967
-vn 0.000000 -0.675849 0.737040
-vn 0.000000 -0.675849 0.737040
-vn 0.000000 -0.675817 0.737069
-vn 0.000000 -0.675817 0.737069
-vn 0.000000 -0.675849 0.737040
-vn 0.000000 -0.675866 0.737025
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn 0.000000 -0.679106 -0.734040
-vn 0.000000 -0.679106 -0.734040
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 -0.679867 -0.733336
-vn 0.000000 0.703021 0.711169
-vn 0.000000 0.702990 0.711200
-vn 0.000000 0.736456 0.676486
-vn 0.000000 0.736456 0.676486
-vn 0.747977 0.586436 -0.310843
-vn 0.500093 0.836968 -0.222243
-vn 0.737157 0.675722 -0.000092
-vn 0.670866 0.741578 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.000000 0.702975 0.711215
-vn 0.000000 0.736456 0.676486
-vn 0.000000 0.702990 0.711200
-vn 0.000000 0.736456 0.676486
-vn -0.734553 0.678551 -0.000092
-vn -0.670866 0.741578 0.000000
-vn -0.734685 0.678408 0.000000
-vn -0.670866 0.741578 0.000000
-vn 0.321855 0.605804 -0.727606
-vn 0.214916 0.828380 -0.517299
-vn 0.747977 0.586436 -0.310843
-vn 0.500093 0.836968 -0.222243
-vn 0.731704 0.681622 0.000031
-vn 0.730525 0.682886 0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.670866 0.741578 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn -0.739452 -0.596163 -0.312731
-vn -0.590148 -0.771523 -0.237652
-vn -0.742650 -0.669679 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn 0.739459 -0.596169 -0.312703
-vn 0.742650 -0.669679 -0.000000
-vn 0.590148 -0.771523 -0.237652
-vn 0.742346 -0.670016 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.738163 0.674622 0.000000
-vn -0.670866 0.741578 0.000000
-vn -0.734964 0.678106 0.000061
-vn -0.670866 0.741578 0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn 0.739720 0.672914 0.000000
-vn 0.736588 0.676342 0.000092
-vn 0.670866 0.741578 0.000000
-vn 0.670866 0.741578 0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.742346 -0.670016 -0.000000
-vn -0.750227 0.586307 0.305621
-vn -0.531041 0.824090 0.197157
-vn -0.737682 0.675148 0.000000
-vn -0.670866 0.741578 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.742346 -0.670016 -0.000000
-vn 0.000000 0.044038 0.999030
-vn 0.000000 0.044069 0.999029
-vn 0.000000 -0.675817 0.737069
-vn 0.000000 -0.675817 0.737069
-vn 0.000000 0.048434 0.998826
-vn 0.000000 0.044069 0.999029
-vn 0.000000 0.048464 0.998825
-vn 0.000000 0.044038 0.999030
-vn 0.000000 0.048190 -0.998838
-vn 0.000000 0.048160 -0.998840
-vn 0.000000 0.043978 -0.999033
-vn 0.000000 0.043978 -0.999033
-vn 0.922348 0.060580 -0.381580
-vn 0.382011 0.058628 -0.922296
-vn 0.919351 0.124242 -0.373307
-vn 0.395989 0.090856 -0.913750
-vn 0.396174 0.091223 0.913633
-vn 0.381762 0.058535 0.922405
-vn 0.919256 0.124211 0.373550
-vn 0.922245 0.060458 0.381850
-vn -0.396046 0.091008 -0.913710
-vn -0.381975 0.058596 -0.922313
-vn -0.919325 0.124518 -0.373278
-vn -0.922339 0.060549 -0.381607
-vn -0.922245 0.060458 0.381850
-vn -0.381763 0.058475 0.922409
-vn -0.919299 0.124793 0.373250
-vn -0.395796 0.091006 0.913818
-vn -0.992942 0.118598 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.919299 0.124793 0.373250
-vn -0.922245 0.060458 0.381850
-vn 0.000000 0.048190 -0.998838
-vn 0.000000 0.048190 -0.998838
-vn 0.000000 0.043978 -0.999033
-vn 0.000000 0.043978 -0.999033
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn -0.739452 -0.596163 -0.312731
-vn -0.742650 -0.669679 -0.000000
-vn -0.922339 0.060549 -0.381607
-vn -0.998866 0.047610 0.000000
-vn 0.739459 -0.596169 -0.312703
-vn 0.922348 0.060580 -0.381580
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.741037 -0.593385 0.314257
-vn 0.922245 0.060458 0.381850
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.742650 -0.669679 -0.000000
-vn 0.998866 0.047610 0.000000
-vn 0.000000 0.043978 -0.999033
-vn 0.382011 0.058628 -0.922296
-vn 0.000000 -0.679106 -0.734040
-vn 0.311907 -0.598482 -0.737925
-vn 0.000000 -0.675849 0.737040
-vn 0.000000 -0.675817 0.737069
-vn 0.000000 0.044008 0.999031
-vn 0.000000 0.044069 0.999029
-vn -0.311879 -0.598488 -0.737932
-vn -0.381975 0.058596 -0.922313
-vn 0.000000 -0.679106 -0.734040
-vn 0.000000 0.043978 -0.999033
-vn 0.310045 -0.595674 0.740976
-vn 0.381762 0.058535 0.922405
-vn 0.000000 -0.675817 0.737069
-vn 0.000000 0.044038 0.999030
-vn -0.310013 -0.595732 0.740942
-vn 0.000000 -0.675849 0.737040
-vn -0.381763 0.058475 0.922409
-vn 0.000000 0.044008 0.999031
-vn -0.742650 -0.669679 -0.000000
-vn -0.742650 -0.669679 -0.000000
-vn -0.998866 0.047610 0.000000
-vn -0.998866 0.047610 0.000000
-vn 0.738513 0.674239 0.000000
-vn 0.989641 -0.143562 -0.000641
-vn 0.739720 0.672914 0.000000
-vn 0.989089 -0.147315 0.001312
-vn 0.946362 -0.321059 -0.036318
-vn 0.990438 -0.137855 0.005310
-vn 0.981702 -0.190316 0.006439
-vn 0.989089 -0.147315 0.001312
-vn 0.949985 -0.312053 -0.012299
-vn 0.992243 -0.124275 0.003082
-vn 0.946362 -0.321059 -0.036318
-vn 0.990438 -0.137855 0.005310
-vn 0.737157 0.675722 -0.000092
-vn 0.735447 0.677583 -0.000153
-vn 0.990046 -0.140663 -0.004853
-vn 0.990875 -0.134469 -0.009247
-vn -0.737682 0.675148 0.000000
-vn -0.738163 0.674622 0.000000
-vn -0.990001 -0.141058 -0.000305
-vn -0.989839 -0.142190 0.001251
-vn -0.949451 -0.312272 -0.032076
-vn -0.939019 -0.338459 -0.060733
-vn -0.990831 -0.134986 0.005646
-vn -0.989839 -0.142190 0.001251
-vn 0.957065 -0.289866 0.002228
-vn 0.950440 -0.308980 0.034579
-vn 0.992707 -0.120552 -0.000946
-vn 0.990875 -0.134469 -0.009247
-vn 0.949985 -0.312053 -0.012299
-vn 0.957065 -0.289866 0.002228
-vn 0.992243 -0.124275 0.003082
-vn 0.992707 -0.120552 -0.000946
-vn 0.985937 -0.163336 -0.035341
-vn 0.904830 -0.170541 -0.390126
-vn 0.990046 -0.140663 -0.004853
-vn 0.913199 -0.133217 -0.385123
-vn -0.909937 -0.184063 -0.371666
-vn -0.916742 -0.125557 -0.379234
-vn -0.385668 -0.101262 -0.917064
-vn -0.379990 -0.085209 -0.921058
-vn -0.990831 -0.134986 0.005646
-vn -0.992527 -0.122013 0.001740
-vn -0.949451 -0.312272 -0.032076
-vn -0.954279 -0.298907 0.002472
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn -0.745103 0.591285 -0.308552
-vn -0.916742 -0.125557 -0.379234
-vn -0.734685 0.678408 0.000000
-vn -0.991018 -0.133704 -0.002472
-vn -0.730909 0.682475 0.000000
-vn -0.730939 0.682443 -0.000031
-vn -0.992527 -0.122013 0.001740
-vn -0.992570 -0.121649 -0.002442
-vn -0.949874 -0.309738 0.042452
-vn -0.951202 -0.308125 0.016572
-vn -0.991137 -0.132636 -0.007416
-vn -0.992570 -0.121649 -0.002442
-vn -0.912094 -0.149238 0.381855
-vn -0.990001 -0.141058 -0.000305
-vn -0.902001 -0.203565 0.380730
-vn -0.984672 -0.174417 0.000336
-vn 0.000000 0.703021 0.711169
-vn 0.000000 -0.052279 0.998633
-vn 0.000000 0.702990 0.711200
-vn 0.000000 -0.052339 0.998629
-vn 0.000000 -0.052339 0.998629
-vn 0.000000 -0.052370 0.998628
-vn 0.000000 0.702990 0.711200
-vn 0.000000 0.702975 0.711215
-vn 0.000000 -0.052309 0.998631
-vn 0.000000 -0.052279 0.998633
-vn -0.377613 -0.138923 0.915483
-vn -0.375319 -0.102543 0.921206
-vn 0.000000 -0.052370 0.998628
-vn 0.375234 -0.102697 0.921223
-vn 0.000000 0.702975 0.711215
-vn 0.329149 0.602020 0.727484
-vn -0.385668 -0.101262 -0.917064
-vn -0.379990 -0.085209 -0.921058
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.362879 -0.103340 -0.926089
-vn 0.372764 -0.088140 -0.923731
-vn -0.750227 0.586307 0.305621
-vn -0.912094 -0.149238 0.381855
-vn -0.329091 0.602117 0.727430
-vn -0.375319 -0.102543 0.921206
-vn 0.377487 -0.139135 0.915503
-vn 0.901970 -0.203534 0.380821
-vn 0.375234 -0.102697 0.921223
-vn 0.912059 -0.149299 0.381914
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.000000 -0.052309 -0.998631
-vn 0.984351 -0.176215 -0.001099
-vn 0.989641 -0.143562 -0.000641
-vn 0.901970 -0.203534 0.380821
-vn 0.912059 -0.149299 0.381914
-vn -0.991137 -0.132636 -0.007416
-vn -0.991018 -0.133704 -0.002472
-vn -0.949874 -0.309738 0.042452
-vn -0.939317 -0.333574 0.080082
-vn 0.362879 -0.103340 -0.926089
-vn 0.372764 -0.088140 -0.923731
-vn 0.904830 -0.170541 -0.390126
-vn 0.913199 -0.133217 -0.385123
-f 96/173/1 91/443/2 296/560/3
-f 296/560/3 91/443/2 293/381/4
-f 585/367/5 178/687/6 589/699/7
-f 589/699/7 178/687/6 124/80/8
-f 386/509/9 334/510/10 387/48/11
-f 387/48/11 334/510/10 335/178/12
-f 353/597/13 352/373/14 337/266/15
-f 337/266/15 352/373/14 343/631/16
-f 100/392/17 97/511/18 295/614/19
-f 295/614/19 97/511/18 292/726/20
-f 420/481/21 37/2/22 82/707/23
-f 82/707/23 37/2/22 38/423/24
-f 51/340/25 44/153/26 42/598/27
-f 42/598/27 44/153/26 43/692/28
-f 84/536/29 38/423/30 419/121/31
-f 419/121/31 38/423/30 37/2/32
-f 83/260/33 84/536/34 41/290/35
-f 41/290/35 84/536/34 419/121/36
-f 46/513/37 45/357/38 168/291/39
-f 168/291/39 45/357/38 152/292/40
-f 152/292/41 45/357/42 48/6/43
-f 48/6/43 45/357/42 49/505/44
-f 87/72/45 86/177/46 44/153/47
-f 44/153/47 86/177/46 43/692/48
-f 153/460/49 152/292/50 151/596/51
-f 151/596/51 152/292/50 48/6/52
-f 168/291/53 152/292/54 167/479/55
-f 167/479/55 152/292/54 153/460/56
-f 52/322/57 49/165/58 51/424/59
-f 47/228/60 48/136/61 49/165/62
-f 52/322/63 47/228/64 49/165/65
-f 50/489/66 51/424/67 42/189/68
-f 50/489/69 52/322/70 51/424/71
-f 50/489/72 42/189/73 39/120/74
-f 223/611/75 39/120/76 40/172/77
-f 50/489/78 39/120/79 223/611/80
-f 54/87/81 40/172/82 53/499/83
-f 223/611/84 40/172/85 54/87/86
-f 222/546/87 53/499/88 36/309/89
-f 54/87/90 53/499/91 222/546/92
-f 222/546/93 36/309/94 35/644/95
-f 55/405/96 35/644/97 56/331/98
-f 222/546/99 35/644/100 55/405/101
-f 120/355/102 429/179/103 119/682/104
-f 119/682/104 429/179/103 379/558/105
-f 55/405/106 56/331/107 57/602/108
-f 219/12/109 57/602/110 59/89/111
-f 64/388/112 63/429/113 58/603/114
-f 58/603/114 63/429/113 60/148/115
-f 55/405/116 57/602/117 219/12/118
-f 61/704/119 59/89/120 60/439/121
-f 219/12/122 59/89/123 61/704/124
-f 68/197/125 62/154/126 64/388/127
-f 64/388/127 62/154/126 63/429/128
-f 61/704/129 60/439/130 63/249/131
-f 65/615/132 63/249/133 62/629/134
-f 61/704/135 63/249/136 65/615/137
-f 67/105/138 62/629/139 69/244/140
-f 65/615/141 62/629/142 67/105/143
-f 76/725/144 69/635/145 68/197/146
-f 68/197/146 69/635/145 62/154/147
-f 67/105/148 69/244/149 66/393/150
-f 66/47/151 75/430/152 70/425/153
-f 70/425/153 75/430/152 285/382/154
-f 214/293/155 66/393/156 70/262/157
-f 67/105/158 66/393/159 214/293/160
-f 73/693/161 71/338/162 285/382/163
-f 285/382/163 71/338/162 70/425/164
-f 71/245/165 213/76/166 70/262/167
-f 73/693/168 285/382/169 173/123/170
-f 173/123/170 285/382/169 72/106/171
-f 166/52/172 130/708/173 128/356/174
-f 128/356/174 130/708/173 131/537/175
-f 213/76/176 71/245/177 128/694/178
-f 177/180/179 74/49/180 76/725/181
-f 76/725/181 74/49/180 75/430/182
-f 165/107/183 166/52/184 173/652/185
-f 173/652/185 166/52/184 73/703/186
-f 77/514/187 177/180/188 68/197/189
-f 68/197/189 177/180/188 76/725/190
-f 176/181/191 77/514/192 64/388/193
-f 64/388/193 77/514/192 68/197/194
-f 598/108/195 324/182/196 599/184/197
-f 599/184/197 324/182/196 371/183/198
-f 229/516/199 308/639/200 170/515/201
-f 170/515/201 308/639/200 307/103/202
-f 472/288/203 469/406/204 528/93/205
-f 528/93/205 469/406/204 525/672/206
-f 233/696/207 88/50/208 311/467/209
-f 311/467/209 88/50/208 305/201/210
-f 230/246/211 309/376/212 346/198/213
-f 346/198/213 309/376/212 345/150/214
-f 85/554/215 234/640/216 79/689/217
-f 79/689/217 234/640/216 312/204/218
-f 235/538/219 347/691/220 84/536/221
-f 84/536/221 347/691/220 38/423/222
-f 170/539/223 154/557/224 229/88/225
-f 229/88/225 154/557/224 155/94/226
-f 347/691/227 81/285/228 38/423/229
-f 38/423/229 81/285/228 82/707/230
-f 88/263/231 233/303/232 46/377/233
-f 46/377/233 233/303/232 87/72/234
-f 234/195/235 85/101/236 86/177/237
-f 86/177/237 85/101/236 83/260/238
-f 168/291/239 232/54/240 46/513/241
-f 46/513/241 232/54/240 88/445/242
-f 85/101/243 235/538/244 83/260/245
-f 83/260/245 235/538/244 84/536/246
-f 104/464/247 103/695/248 100/392/249
-f 100/392/249 103/695/248 101/482/250
-f 297/520/251 127/122/252 112/555/253
-f 112/555/253 127/122/252 111/264/254
-f 98/51/255 97/511/256 101/482/257
-f 101/482/257 97/511/256 100/392/258
-f 294/636/259 104/464/260 295/614/261
-f 295/614/261 104/464/260 100/392/262
-f 91/443/263 226/547/264 95/77/265
-f 95/77/265 226/547/264 92/196/266
-f 373/78/267 388/427/268 99/167/269
-f 99/167/269 388/427/268 107/374/270
-f 374/428/271 370/540/272 109/690/273
-f 109/690/273 370/540/272 89/541/274
-f 226/547/275 91/443/276 225/92/277
-f 225/92/277 91/443/276 96/173/278
-f 388/427/279 374/428/280 107/374/281
-f 107/374/281 374/428/280 109/690/282
-f 387/48/283 373/78/284 106/265/285
-f 106/265/285 373/78/284 99/167/286
-f 91/443/287 95/77/288 293/381/289
-f 293/381/289 95/77/288 291/304/290
-f 225/92/291 96/173/292 98/51/293
-f 98/51/293 96/173/292 97/511/294
-f 181/250/295 182/174/296 99/167/297
-f 99/167/297 182/174/296 106/265/298
-f 97/511/299 96/173/300 292/726/301
-f 292/726/301 96/173/300 296/560/302
-f 108/422/303 181/250/304 107/374/305
-f 107/374/305 181/250/304 99/167/306
-f 180/527/307 108/422/308 109/690/309
-f 109/690/309 108/422/308 107/374/310
-f 90/310/311 180/527/312 89/541/313
-f 89/541/313 180/527/312 109/690/314
-f 564/599/315 559/56/316 386/509/317
-f 386/509/317 559/56/316 334/510/318
-f 271/586/319 270/583/320 182/585/321
-f 182/585/321 270/583/320 105/341/322
-f 360/556/323 516/342/324 354/559/325
-f 354/559/325 516/342/324 515/507/326
-f 93/612/327 227/426/328 94/723/329
-f 94/723/329 227/426/328 117/124/330
-f 113/202/331 116/604/332 298/96/333
-f 298/96/333 116/604/332 115/461/334
-f 227/426/335 115/461/336 117/124/337
-f 117/124/337 115/461/336 116/604/338
-f 376/600/339 384/185/340 114/53/341
-f 114/53/341 384/185/340 110/199/342
-f 474/251/343 471/102/344 530/380/345
-f 530/380/345 471/102/344 527/632/346
-f 375/44/347 385/301/348 118/483/349
-f 118/483/349 385/301/348 123/253/350
-f 385/301/351 376/600/352 123/253/353
-f 123/253/353 376/600/352 114/53/354
-f 112/555/355 113/202/356 297/520/357
-f 297/520/357 113/202/356 298/96/358
-f 377/653/359 375/44/360 121/378/361
-f 121/378/361 375/44/360 118/483/362
-f 372/542/363 377/653/364 119/682/365
-f 119/682/365 377/653/364 121/378/366
-f 266/186/367 123/253/368 184/75/369
-f 184/75/369 123/253/368 114/53/370
-f 569/252/371 573/543/372 103/552/373
-f 103/552/373 573/543/372 302/3/374
-f 402/55/375 399/512/376 397/57/377
-f 397/57/377 399/512/376 394/407/378
-f 347/462/379 235/648/380 344/1/381
-f 344/1/381 235/648/380 313/155/382
-f 209/633/383 128/694/384 131/95/385
-f 209/633/386 213/76/387 128/694/388
-f 164/613/389 162/465/390 129/100/391
-f 129/100/391 162/465/390 135/110/392
-f 209/633/393 131/95/394 129/484/395
-f 132/176/396 129/484/397 135/156/398
-f 132/176/399 209/633/400 129/484/401
-f 133/411/402 135/156/403 137/286/404
-f 133/411/405 132/176/406 135/156/407
-f 159/408/408 134/446/409 161/375/410
-f 161/375/410 134/446/409 162/465/411
-f 133/411/412 137/286/413 136/544/414
-f 137/637/415 135/110/416 134/446/417
-f 134/446/417 135/110/416 162/465/418
-f 206/553/419 136/544/420 138/412/421
-f 206/553/422 133/411/423 136/544/424
-f 206/553/425 138/412/426 140/409/427
-f 430/372/428 137/637/429 160/74/430
-f 160/74/430 137/637/429 134/446/431
-f 202/545/432 140/409/433 139/688/434
-f 202/545/435 206/553/436 140/409/437
-f 202/545/438 139/688/439 141/709/440
-f 145/203/441 141/709/442 143/438/443
-f 145/203/444 202/545/445 141/709/446
-f 587/404/447 600/410/448 126/305/449
-f 126/305/449 600/410/448 125/37/450
-f 144/638/451 143/438/452 142/379/453
-f 144/638/454 145/203/455 143/438/456
-f 143/91/457 434/63/458 142/306/459
-f 144/638/460 142/379/461 146/104/462
-f 146/444/463 156/607/464 148/97/465
-f 148/97/465 156/607/464 389/673/466
-f 147/649/467 146/104/468 148/31/469
-f 147/649/470 144/638/471 146/104/472
-f 148/97/473 389/673/474 149/248/475
-f 149/248/475 389/673/474 157/32/476
-f 147/649/477 148/31/478 149/39/479
-f 157/32/480 153/460/481 149/248/482
-f 149/248/482 153/460/481 151/596/483
-f 150/582/484 149/39/485 151/490/486
-f 150/582/487 147/649/488 149/39/489
-f 42/598/490 43/692/491 39/299/492
-f 39/299/492 43/692/491 41/290/493
-f 47/228/494 151/490/495 48/136/496
-f 47/228/497 150/582/498 151/490/499
-f 167/479/500 153/460/501 154/557/502
-f 154/557/502 153/460/501 157/32/503
-f 86/177/504 83/260/505 43/692/506
-f 43/692/506 83/260/505 41/290/507
-f 277/151/508 278/616/509 413/525/510
-f 413/525/510 278/616/509 381/526/511
-f 595/323/512 590/663/513 412/41/514
-f 412/41/514 590/663/513 272/135/515
-f 413/525/516 283/175/517 418/320/518
-f 418/320/518 283/175/517 276/664/519
-f 74/49/520 72/106/521 75/430/522
-f 75/430/522 72/106/521 285/382/523
-f 232/54/524 168/291/525 169/298/526
-f 169/298/526 168/291/525 167/479/527
-f 169/298/528 167/479/529 170/539/530
-f 170/539/530 167/479/529 154/557/531
-f 229/88/532 155/94/533 346/98/534
-f 346/98/534 155/94/533 158/33/535
-f 172/276/536 230/330/537 158/33/538
-f 158/33/538 230/330/537 346/98/539
-f 583/267/540 587/404/541 228/643/542
-f 228/643/542 587/404/541 126/305/543
-f 179/205/544 121/378/545 122/34/546
-f 122/34/546 121/378/545 118/483/547
-f 120/355/548 119/682/549 179/205/550
-f 179/205/550 119/682/549 121/378/551
-f 224/706/552 186/324/553 185/674/554
-f 47/228/555 186/324/556 190/584/557
-f 52/322/558 186/324/559 47/228/560
-f 216/300/561 211/463/562 207/650/563
-f 207/650/563 211/463/562 208/79/564
-f 150/582/565 190/584/566 188/573/567
-f 47/228/568 190/584/569 150/582/570
-f 195/403/571 193/261/572 191/43/573
-f 191/43/573 193/261/572 192/227/574
-f 147/649/575 188/573/576 192/227/577
-f 150/582/578 188/573/579 147/649/580
-f 218/346/581 201/339/582 221/99/583
-f 221/99/583 201/339/582 199/35/584
-f 147/649/585 192/227/586 193/261/587
-f 221/99/588 199/35/589 220/64/590
-f 220/64/590 199/35/589 196/651/591
-f 144/638/592 193/261/593 194/454/594
-f 147/649/595 193/261/596 144/638/597
-f 205/335/598 203/466/599 218/346/600
-f 218/346/600 203/466/599 201/339/601
-f 144/638/602 194/454/603 198/601/604
-f 216/300/605 207/650/606 217/152/607
-f 217/152/607 207/650/606 204/20/608
-f 145/203/609 198/601/610 196/651/611
-f 144/638/612 198/601/613 145/203/614
-f 187/705/615 188/573/616 189/36/617
-f 189/36/617 188/573/616 190/584/618
-f 202/545/619 196/651/620 199/35/621
-f 145/203/622 196/651/623 202/545/624
-f 220/64/625 196/651/626 200/4/627
-f 200/4/627 196/651/626 198/601/628
-f 202/545/629 199/35/630 201/339/631
-f 197/675/632 194/454/633 195/403/634
-f 195/403/634 194/454/633 193/261/635
-f 206/553/636 201/339/637 203/466/638
-f 202/545/639 201/339/640 206/553/641
-f 133/411/642 203/466/643 204/20/644
-f 206/553/645 203/466/646 133/411/647
-f 200/4/648 198/601/649 197/675/650
-f 197/675/650 198/601/649 194/454/651
-f 133/411/652 204/20/653 207/650/654
-f 211/463/655 215/605/656 208/79/657
-f 208/79/657 215/605/656 210/354/658
-f 132/176/659 207/650/660 208/79/661
-f 133/411/662 207/650/663 132/176/664
-f 209/633/665 208/79/666 210/354/667
-f 132/176/668 208/79/669 209/633/670
-f 215/605/671 212/287/672 210/354/673
-f 209/633/674 210/354/675 213/76/676
-f 214/293/677 215/605/678 211/463/679
-f 213/76/680 214/293/681 70/262/682
-f 214/293/683 213/76/684 215/605/685
-f 67/105/686 211/463/687 216/300/688
-f 67/105/689 214/293/690 211/463/691
-f 67/105/692 216/300/693 217/152/694
-f 65/615/695 217/152/696 205/335/697
-f 65/615/698 67/105/699 217/152/700
-f 65/615/701 205/335/702 218/346/703
-f 61/704/704 218/346/705 221/99/706
-f 61/704/707 65/615/708 218/346/709
-f 219/12/710 221/99/711 220/64/712
-f 219/12/713 61/704/714 221/99/715
-f 219/12/716 220/64/717 200/4/718
-f 55/405/719 200/4/720 197/675/721
-f 55/405/722 219/12/723 200/4/724
-f 222/546/725 197/675/726 195/403/727
-f 222/546/728 55/405/729 197/675/730
-f 222/546/731 195/403/732 191/43/733
-f 54/87/734 222/546/735 191/43/736
-f 223/611/737 187/705/738 189/36/739
-f 223/611/740 54/87/741 187/705/742
-f 50/489/743 189/36/744 224/706/745
-f 50/489/746 223/611/747 189/36/748
-f 50/489/749 224/706/750 52/322/751
-f 34/38/752 371/183/753 498/289/754
-f 498/289/754 371/183/753 519/40/755
-f 170/515/756 307/103/757 169/149/758
-f 169/149/758 307/103/757 306/109/759
-f 567/297/760 127/634/761 554/247/762
-f 554/247/762 127/634/761 301/508/763
-f 304/337/764 101/157/765 302/3/766
-f 302/3/766 101/157/765 103/552/767
-f 553/302/768 105/341/769 571/134/770
-f 571/134/770 105/341/769 270/583/771
-f 175/662/772 503/42/773 272/135/774
-f 272/135/774 503/42/773 508/321/775
-f 182/174/776 105/284/777 106/265/778
-f 106/265/778 105/284/777 102/125/779
-f 169/149/780 306/109/781 232/336/782
-f 232/336/782 306/109/781 310/200/783
-f 582/480/784 82/707/785 581/5/786
-f 581/5/786 82/707/785 81/285/787
-f 573/543/788 558/641/789 302/3/790
-f 302/3/790 558/641/789 316/343/791
-f 267/229/792 183/587/793 570/665/794
-f 570/665/794 183/587/793 566/491/795
-f 235/648/796 85/554/797 313/155/798
-f 313/155/798 85/554/797 79/689/799
-f 254/115/800 260/81/801 255/7/802
-f 255/7/802 260/81/801 258/311/803
-f 255/7/804 258/311/805 251/698/806
-f 251/698/806 258/311/805 259/394/807
-f 263/82/808 260/81/809 253/158/810
-f 253/158/810 260/81/809 254/115/811
-f 264/83/812 263/82/813 252/208/814
-f 252/208/814 263/82/813 253/158/815
-f 251/698/816 259/394/817 250/161/818
-f 250/161/818 259/394/817 262/193/819
-f 248/171/820 243/504/821 246/574/822
-f 244/421/823 243/504/824 249/468/825
-f 249/468/825 243/504/824 248/171/826
-f 242/395/827 247/722/828 243/504/829
-f 243/504/829 247/722/828 246/574/830
-f 244/421/831 286/528/832 245/469/833
-f 245/469/833 286/528/832 427/8/834
-f 265/70/835 257/283/836 436/485/837
-f 123/253/838 266/186/839 118/483/840
-f 118/483/840 266/186/839 122/34/841
-f 110/199/842 183/710/843 114/53/844
-f 114/53/844 183/710/843 184/75/845
-f 580/455/846 422/472/847 557/194/848
-f 557/194/848 422/472/847 287/561/849
-f 183/587/850 267/229/851 184/588/852
-f 184/588/852 267/229/851 268/589/853
-f 175/239/854 34/38/855 503/344/856
-f 503/344/856 34/38/855 498/289/857
-f 382/590/858 383/277/859 271/586/860
-f 271/586/860 383/277/859 270/583/861
-f 184/588/862 268/589/863 266/591/864
-f 122/230/865 266/591/864 268/589/863
-f 122/230/866 268/589/867 179/231/868
-f 179/231/868 268/589/867 120/628/869
-f 182/585/870 181/16/871 271/586/872
-f 181/16/871 108/232/873 271/586/872
-f 90/233/874 271/586/875 180/112/876
-f 180/112/876 271/586/875 108/232/877
-f 429/126/878 120/628/879 382/590/880
-f 382/590/880 120/628/879 268/589/881
-f 174/617/882 165/358/883 282/359/884
-f 282/359/884 165/358/883 280/486/885
-f 74/618/886 177/345/887 274/654/888
-f 274/654/888 177/345/887 284/399/889
-f 159/413/890 161/666/891 277/151/892
-f 277/151/892 161/666/891 278/616/893
-f 176/332/894 283/175/895 77/21/896
-f 77/21/896 283/175/895 275/127/897
-f 165/358/898 173/17/899 280/486/900
-f 280/486/900 173/17/899 281/333/901
-f 177/345/902 77/21/903 284/399/904
-f 284/399/904 77/21/903 275/127/905
-f 176/332/906 78/608/907 283/175/908
-f 283/175/908 78/608/907 276/664/909
-f 74/618/910 274/654/911 72/655/912
-f 72/655/912 274/654/911 273/656/913
-f 174/617/914 282/359/915 163/312/916
-f 163/312/916 282/359/915 279/487/917
-f 72/655/918 273/656/919 173/17/920
-f 173/17/920 273/656/919 281/333/921
-f 161/666/922 163/312/923 278/616/924
-f 278/616/924 163/312/923 279/487/925
-f 601/137/926 269/325/927 585/492/928
-f 585/492/928 269/325/927 178/326/929
-f 175/662/930 272/135/931 586/493/932
-f 586/493/932 272/135/931 590/663/933
-f 128/356/934 71/243/935 166/52/936
-f 166/52/936 71/243/935 73/703/937
-f 174/206/938 130/708/939 165/107/940
-f 165/107/940 130/708/939 166/52/941
-f 113/202/942 112/555/943 288/447/944
-f 288/447/944 112/555/943 290/702/945
-f 116/604/946 113/202/947 289/619/948
-f 289/619/948 113/202/947 288/447/949
-f 112/555/950 111/264/951 290/702/952
-f 290/702/952 111/264/951 287/561/953
-f 287/561/954 111/264/955 557/194/956
-f 557/194/956 111/264/955 568/347/957
-f 363/313/958 294/636/959 364/278/960
-f 364/278/960 294/636/959 295/614/961
-f 400/169/962 402/55/963 395/163/964
-f 395/163/964 402/55/963 397/57/965
-f 314/419/966 315/128/967 94/723/968
-f 94/723/968 315/128/967 93/612/969
-f 127/634/970 297/521/971 301/508/972
-f 301/508/972 297/521/971 299/645/973
-f 318/676/974 304/337/975 316/343/976
-f 316/343/976 304/337/975 302/3/977
-f 101/157/978 304/337/979 98/606/980
-f 98/606/980 304/337/979 225/129/981
-f 92/226/982 226/327/983 304/337/984
-f 304/337/984 226/327/983 225/129/985
-f 297/521/986 298/431/987 299/645/988
-f 298/431/987 115/569/989 299/645/988
-f 115/569/990 227/476/991 299/645/992
-f 299/645/992 227/476/991 93/548/993
-f 315/236/994 318/676/995 93/548/996
-f 93/548/996 318/676/995 299/645/997
-f 234/640/998 233/696/999 312/204/1000
-f 312/204/1000 233/696/999 311/467/1001
-f 232/336/1002 310/200/1003 88/50/1004
-f 88/50/1004 310/200/1003 305/201/1005
-f 309/376/1006 230/246/1007 591/442/1008
-f 591/442/1008 230/246/1007 583/142/1009
-f 592/434/1010 303/168/1011 581/271/1012
-f 581/271/1012 303/168/1011 231/143/1013
-f 319/147/1014 309/376/1015 593/565/1016
-f 593/565/1016 309/376/1015 591/442/1017
-f 320/23/1018 308/639/1019 348/701/1020
-f 348/701/1020 308/639/1019 345/150/1021
-f 321/164/1022 307/103/1023 320/23/1024
-f 320/23/1024 307/103/1023 308/639/1025
-f 322/571/1026 306/109/1027 321/164/1028
-f 321/164/1028 306/109/1027 307/103/1029
-f 79/689/1030 312/204/1031 321/164/1032
-f 321/164/1032 312/204/1031 322/571/1033
-f 313/155/1034 79/689/1035 320/23/1036
-f 320/23/1036 79/689/1035 321/164/1037
-f 344/1/1038 313/155/1039 348/701/1040
-f 348/701/1040 313/155/1039 320/23/1041
-f 592/434/1042 171/307/1043 593/565/1044
-f 593/565/1044 171/307/1043 319/147/1045
-f 304/337/1046 318/676/1047 92/226/1048
-f 92/226/1048 318/676/1047 315/236/1049
-f 301/508/1050 299/645/1051 316/343/1052
-f 316/343/1052 299/645/1051 318/676/1053
-f 95/77/1054 92/196/1055 314/419/1056
-f 314/419/1056 92/196/1055 315/128/1057
-f 306/109/1058 322/571/1059 310/200/1060
-f 310/200/1060 322/571/1059 305/201/1061
-f 312/204/1062 311/467/1063 322/571/1064
-f 322/571/1064 311/467/1063 305/201/1065
-f 154/557/1066 157/32/1067 155/94/1068
-f 155/94/1068 157/32/1067 389/673/1069
-f 474/256/1070 530/141/1071 475/353/1072
-f 475/353/1072 530/141/1071 531/84/1073
-f 217/152/1074 204/20/1075 205/335/1076
-f 205/335/1076 204/20/1075 203/466/1077
-f 224/706/1078 189/36/1079 186/324/1080
-f 186/324/1080 189/36/1079 190/584/1081
-f 52/322/1082 185/674/1083 186/324/1084
-f 52/322/1085 224/706/1086 185/674/1087
-f 213/76/1088 210/354/1089 212/287/1090
-f 213/76/1091 212/287/1092 215/605/1093
-f 130/708/1094 164/613/1095 131/537/1096
-f 131/537/1096 164/613/1095 129/100/1097
-f 163/215/1098 164/613/1099 174/206/1100
-f 174/206/1100 164/613/1099 130/708/1101
-f 161/375/1102 162/465/1103 163/215/1104
-f 163/215/1104 162/465/1103 164/613/1105
-f 75/430/1106 66/47/1107 76/725/1108
-f 76/725/1108 66/47/1107 69/635/1109
-f 191/43/1110 192/227/1111 187/705/1112
-f 187/705/1112 192/227/1111 188/573/1113
-f 54/87/1114 191/43/1115 187/705/1116
-f 49/308/1117 45/471/1118 51/340/1119
-f 51/340/1119 45/471/1118 44/153/1120
-f 401/575/1121 400/169/1122 396/711/1123
-f 396/711/1123 400/169/1122 395/163/1124
-f 563/368/1125 572/498/1126 363/313/1127
-f 363/313/1127 572/498/1126 294/636/1128
-f 395/163/1129 397/57/1130 333/216/1131
-f 333/216/1131 397/57/1130 330/360/1132
-f 396/711/1133 395/163/1134 329/712/1135
-f 329/712/1135 395/163/1134 333/216/1136
-f 397/57/1137 394/407/1138 330/360/1139
-f 330/360/1139 394/407/1138 332/361/1140
-f 342/334/1141 337/266/1142 335/178/1143
-f 335/178/1143 337/266/1142 327/697/1144
-f 343/631/1145 339/362/1146 336/576/1147
-f 336/576/1147 339/362/1146 328/268/1148
-f 339/362/1149 340/22/1150 328/268/1151
-f 328/268/1151 340/22/1150 323/217/1152
-f 337/266/1153 343/631/1154 327/697/1155
-f 327/697/1155 343/631/1154 336/576/1156
-f 352/373/1157 355/24/1158 343/631/1159
-f 343/631/1159 355/24/1158 339/362/1160
-f 351/58/1161 353/597/1162 342/334/1163
-f 342/334/1163 353/597/1162 337/266/1164
-f 334/510/1165 341/534/1166 335/178/1167
-f 335/178/1167 341/534/1166 342/334/1168
-f 576/116/1169 384/185/1170 574/414/1171
-f 574/414/1171 384/185/1170 332/361/1172
-f 582/480/1173 80/724/1174 588/25/1175
-f 588/25/1175 80/724/1174 33/363/1176
-f 598/108/1177 597/295/1178 324/182/1179
-f 324/182/1179 597/295/1178 338/370/1180
-f 596/61/1181 597/295/1182 56/364/1183
-f 56/364/1183 597/295/1182 57/488/1184
-f 233/303/1185 234/195/1186 87/72/1187
-f 87/72/1187 234/195/1186 86/177/1188
-f 46/377/1189 87/72/1190 45/471/1191
-f 45/471/1191 87/72/1190 44/153/1192
-f 171/307/1193 344/1/1194 319/147/1195
-f 319/147/1195 344/1/1194 348/701/1196
-f 348/701/1197 345/150/1198 319/147/1199
-f 319/147/1199 345/150/1198 309/376/1200
-f 81/73/1201 347/462/1202 171/307/1203
-f 171/307/1203 347/462/1202 344/1/1204
-f 346/198/1205 345/150/1206 229/516/1207
-f 229/516/1207 345/150/1206 308/639/1208
-f 40/562/1209 39/299/1210 419/121/1211
-f 419/121/1211 39/299/1210 41/290/1212
-f 267/229/1213 383/277/1214 268/589/1215
-f 268/589/1215 383/277/1214 382/590/1216
-f 284/399/1217 378/630/1218 274/654/1219
-f 274/654/1219 378/630/1218 349/716/1220
-f 584/684/1221 58/603/1222 599/184/1223
-f 599/184/1223 58/603/1222 60/148/1224
-f 357/391/1225 359/660/1226 351/58/1227
-f 351/58/1227 359/660/1226 353/597/1228
-f 358/622/1229 361/529/1230 352/373/1231
-f 352/373/1231 361/529/1230 355/24/1232
-f 341/534/1233 350/272/1234 342/334/1235
-f 342/334/1235 350/272/1234 351/58/1236
-f 559/56/1237 560/478/1238 334/510/1239
-f 334/510/1239 560/478/1238 341/534/1240
-f 359/660/1241 358/622/1242 353/597/1243
-f 353/597/1243 358/622/1242 352/373/1244
-f 366/420/1245 365/570/1246 359/660/1247
-f 359/660/1247 365/570/1246 358/622/1248
-f 370/540/1249 380/46/1250 89/541/1251
-f 89/541/1251 380/46/1250 379/558/1252
-f 365/570/1253 368/224/1254 358/622/1255
-f 358/622/1255 368/224/1254 361/529/1256
-f 364/278/1257 366/420/1258 357/391/1259
-f 357/391/1259 366/420/1258 359/660/1260
-f 350/272/1261 356/623/1262 351/58/1263
-f 351/58/1263 356/623/1262 357/391/1264
-f 560/478/1265 561/620/1266 341/534/1267
-f 341/534/1267 561/620/1266 350/272/1268
-f 295/614/1269 292/726/1270 364/278/1271
-f 364/278/1271 292/726/1270 366/420/1272
-f 296/560/1273 293/381/1274 365/570/1275
-f 365/570/1275 293/381/1274 368/224/1276
-f 292/726/1277 296/560/1278 366/420/1279
-f 366/420/1279 296/560/1278 365/570/1280
-f 356/623/1281 363/313/1282 357/391/1283
-f 357/391/1283 363/313/1282 364/278/1284
-f 561/620/1285 562/642/1286 350/272/1287
-f 350/272/1287 562/642/1286 356/623/1288
-f 562/642/1289 563/368/1290 356/623/1291
-f 356/623/1291 563/368/1290 363/313/1292
-f 378/630/1293 381/526/1294 279/487/1295
-f 279/487/1295 381/526/1294 278/616/1296
-f 392/328/1297 277/151/1298 418/320/1299
-f 418/320/1299 277/151/1298 413/525/1300
-f 370/540/1301 323/217/1302 380/46/1303
-f 380/46/1303 323/217/1302 237/190/1304
-f 595/323/1305 412/41/1306 601/137/1307
-f 601/137/1307 412/41/1306 269/325/1308
-f 372/542/1309 380/46/1310 326/389/1311
-f 326/389/1311 380/46/1310 237/190/1312
-f 326/389/1313 331/212/1314 372/542/1315
-f 372/542/1315 331/212/1314 377/653/1316
-f 331/212/1317 329/712/1318 377/653/1319
-f 377/653/1319 329/712/1318 375/44/1320
-f 333/216/1321 330/360/1322 385/301/1323
-f 385/301/1323 330/360/1322 376/600/1324
-f 329/712/1325 333/216/1326 375/44/1327
-f 375/44/1327 333/216/1326 385/301/1328
-f 330/360/1329 332/361/1330 376/600/1331
-f 376/600/1331 332/361/1330 384/185/1332
-f 335/178/1333 327/697/1334 387/48/1335
-f 387/48/1335 327/697/1334 373/78/1336
-f 336/576/1337 328/268/1338 388/427/1339
-f 388/427/1339 328/268/1338 374/428/1340
-f 328/268/1341 323/217/1342 374/428/1343
-f 374/428/1343 323/217/1342 370/540/1344
-f 327/697/1345 336/576/1346 373/78/1347
-f 373/78/1347 336/576/1346 388/427/1348
-f 102/125/1349 386/509/1350 106/265/1351
-f 106/265/1351 386/509/1350 387/48/1352
-f 565/610/1353 110/199/1354 576/116/1355
-f 576/116/1355 110/199/1354 384/185/1356
-f 360/556/1357 354/559/1358 594/140/1359
-f 594/140/1359 354/559/1358 596/61/1360
-f 586/209/1361 584/684/1362 175/239/1363
-f 175/239/1363 584/684/1362 34/38/1364
-f 602/387/1365 589/699/1366 369/657/1367
-f 369/657/1367 589/699/1366 124/80/1368
-f 155/94/1369 389/673/1370 158/33/1371
-f 158/33/1371 389/673/1370 156/607/1372
-f 390/26/1373 172/276/1374 156/607/1375
-f 156/607/1375 172/276/1374 158/33/1376
-f 277/151/1377 392/328/1378 159/413/1379
-f 159/413/1379 392/328/1378 391/90/1380
-f 160/74/1381 134/446/1382 391/532/1383
-f 391/532/1383 134/446/1382 159/408/1384
-f 78/609/1385 176/181/1386 58/603/1387
-f 58/603/1387 176/181/1386 64/388/1388
-f 137/637/1389 430/372/1390 136/677/1391
-f 555/530/1392 564/599/1393 102/125/1394
-f 102/125/1394 564/599/1393 386/509/1395
-f 407/500/1396 406/192/1397 401/575/1398
-f 401/575/1398 406/192/1397 400/169/1399
-f 406/192/1400 408/448/1401 400/169/1402
-f 400/169/1402 408/448/1401 402/55/1403
-f 574/414/1404 332/361/1405 577/566/1406
-f 577/566/1406 332/361/1405 394/407/1407
-f 408/448/1408 405/456/1409 402/55/1410
-f 402/55/1410 405/456/1409 399/512/1411
-f 425/269/1412 422/472/1413 408/448/1414
-f 408/448/1414 422/472/1413 405/456/1415
-f 423/577/1416 425/269/1417 406/192/1418
-f 406/192/1418 425/269/1417 408/448/1419
-f 424/433/1420 423/577/1421 407/500/1422
-f 407/500/1422 423/577/1421 406/192/1423
-f 577/566/1424 394/407/1425 578/680/1426
-f 578/680/1426 394/407/1425 399/512/1427
-f 470/329/1428 479/494/1429 526/275/1430
-f 526/275/1430 479/494/1429 535/495/1431
-f 245/469/1432 427/8/1433 403/626/1434
-f 403/626/1434 427/8/1433 414/296/1435
-f 429/126/1436 382/590/1437 90/233/1438
-f 90/233/1438 382/590/1437 271/586/1439
-f 331/212/1440 326/389/1441 411/146/1442
-f 411/146/1442 326/389/1441 410/518/1443
-f 411/146/1444 410/518/1445 409/721/1446
-f 409/721/1446 410/518/1445 416/661/1447
-f 94/723/1448 117/124/1449 286/528/1450
-f 286/528/1450 117/124/1449 417/254/1451
-f 117/124/1452 116/604/1453 417/254/1454
-f 417/254/1454 116/604/1453 289/619/1455
-f 606/27/1456 604/415/1457 398/314/1458
-f 398/314/1458 604/415/1457 393/450/1459
-f 396/711/1460 329/712/1461 411/146/1462
-f 411/146/1462 329/712/1461 331/212/1463
-f 283/175/1464 413/525/1465 275/127/1466
-f 275/127/1466 413/525/1465 381/526/1467
-f 604/415/1468 605/715/1469 393/450/1470
-f 393/450/1470 605/715/1469 325/225/1471
-f 426/671/1472 424/433/1473 415/315/1474
-f 415/315/1474 424/433/1473 407/500/1475
-f 426/671/1476 427/8/1477 417/254/1478
-f 417/254/1478 427/8/1477 286/528/1479
-f 409/721/1480 416/661/1481 415/315/1482
-f 415/315/1482 416/661/1481 414/296/1483
-f 401/575/1484 396/711/1485 409/721/1486
-f 409/721/1486 396/711/1485 411/146/1487
-f 415/315/1488 407/500/1489 409/721/1490
-f 409/721/1490 407/500/1489 401/575/1491
-f 244/421/1492 249/468/1493 286/528/1494
-f 286/528/1494 249/468/1493 250/161/1495
-f 340/22/1496 239/218/1497 323/217/1498
-f 323/217/1498 239/218/1497 237/190/1499
-f 416/661/1500 410/518/1501 236/211/1502
-f 236/211/1502 410/518/1501 240/234/1503
-f 419/121/1504 37/2/1505 40/562/1506
-f 40/562/1506 37/2/1505 53/10/1507
-f 37/2/1508 420/481/1509 53/10/1510
-f 53/10/1510 420/481/1509 36/71/1511
-f 594/140/1512 607/15/1513 360/556/1514
-f 360/556/1514 607/15/1513 367/59/1515
-f 588/25/1516 607/15/1517 420/481/1518
-f 420/481/1518 607/15/1517 36/71/1519
-f 237/190/1520 240/234/1521 326/389/1522
-f 326/389/1522 240/234/1521 410/518/1523
-f 429/179/1524 90/310/1525 379/558/1526
-f 379/558/1526 90/310/1525 89/541/1527
-f 414/296/1528 416/661/1529 403/626/1530
-f 403/626/1530 416/661/1529 236/211/1531
-f 415/315/1532 414/296/1533 426/671/1534
-f 426/671/1534 414/296/1533 427/8/1535
-f 417/254/1536 289/619/1537 426/671/1538
-f 426/671/1538 289/619/1537 424/433/1539
-f 289/619/1540 288/447/1541 424/433/1542
-f 424/433/1542 288/447/1541 423/577/1543
-f 288/447/1544 290/702/1545 423/577/1546
-f 423/577/1546 290/702/1545 425/269/1547
-f 290/702/1548 287/561/1549 425/269/1550
-f 425/269/1550 287/561/1549 422/472/1551
-f 578/680/1552 399/512/1553 579/144/1554
-f 579/144/1554 399/512/1553 405/456/1555
-f 252/208/1556 247/722/1557 291/304/1558
-f 291/304/1558 247/722/1557 242/395/1559
-f 378/630/1560 284/399/1561 381/526/1562
-f 381/526/1562 284/399/1561 275/127/1563
-f 349/716/1564 378/630/1565 282/359/1566
-f 282/359/1566 378/630/1565 279/487/1567
-f 380/46/1568 372/542/1569 379/558/1570
-f 379/558/1570 372/542/1569 119/682/1571
-f 362/294/1572 431/133/1573 428/522/1574
-f 428/522/1574 431/133/1573 238/316/1575
-f 241/119/1576 431/133/1577 432/625/1578
-f 432/625/1578 431/133/1577 362/294/1579
-f 355/24/1580 428/522/1581 339/362/1582
-f 339/362/1582 428/522/1581 340/22/1583
-f 361/529/1584 362/294/1585 355/24/1586
-f 355/24/1586 362/294/1585 428/522/1587
-f 368/224/1588 432/625/1589 361/529/1590
-f 361/529/1590 432/625/1589 362/294/1591
-f 293/381/1592 291/304/1593 368/224/1594
-f 368/224/1594 291/304/1593 432/625/1595
-f 239/218/1596 340/22/1597 238/316/1598
-f 238/316/1598 340/22/1597 428/522/1599
-f 242/395/1600 241/119/1601 291/304/1602
-f 291/304/1602 241/119/1601 432/625/1603
-f 138/473/1604 136/677/1605 430/372/1606
-f 140/113/1607 138/473/1608 430/372/1609
-f 602/387/1610 605/715/1611 430/372/1612
-f 430/372/1612 605/715/1611 140/113/1613
-f 606/27/1614 398/314/1615 603/646/1616
-f 603/646/1616 398/314/1615 404/501/1617
-f 603/646/1618 404/501/1619 608/159/1620
-f 608/159/1620 404/501/1619 421/348/1621
-f 600/410/1622 390/26/1623 608/159/1624
-f 608/159/1624 390/26/1623 434/63/1625
-f 146/444/1626 434/63/1627 156/607/1628
-f 156/607/1628 434/63/1627 390/26/1629
-f 146/444/1630 142/306/1631 434/63/1632
-f 274/654/1633 349/716/1634 273/656/1635
-f 273/656/1635 349/716/1634 281/333/1636
-f 282/359/1637 280/486/1638 349/716/1639
-f 349/716/1639 280/486/1638 281/333/1640
-f 433/60/1641 436/485/1642 256/365/1643
-f 256/365/1643 436/485/1642 257/283/1644
-f 262/193/1645 261/658/1646 435/242/1647
-f 264/83/1648 433/60/1649 256/365/1650
-f 252/208/1651 291/304/1652 264/83/1653
-f 264/83/1653 291/304/1652 433/60/1654
-f 435/242/1655 286/528/1656 262/193/1657
-f 262/193/1657 286/528/1656 250/161/1658
-f 94/723/1659 286/528/1660 435/242/1661
-f 291/304/1662 95/77/1663 433/60/1664
-f 95/77/1665 314/419/1666 433/60/1667
-f 433/60/1667 314/419/1666 436/485/1668
-f 94/723/1669 435/242/1670 314/419/1671
-f 314/419/1671 435/242/1670 436/485/1672
-f 265/70/1673 436/485/1674 261/658/1675
-f 261/658/1675 436/485/1674 435/242/1676
-f 27/578/1677 241/119/1678 26/383/1679
-f 26/383/1679 241/119/1678 242/395/1680
-f 26/383/1681 242/395/1682 25/130/1683
-f 25/130/1683 242/395/1682 243/504/1684
-f 25/130/1685 243/504/1686 24/535/1687
-f 24/535/1687 243/504/1686 244/421/1688
-f 24/535/1689 244/421/1690 23/219/1691
-f 23/219/1691 244/421/1690 245/469/1692
-f 23/219/1693 245/469/1694 22/685/1695
-f 22/685/1695 245/469/1694 403/626/1696
-f 22/685/1697 403/626/1698 32/579/1699
-f 32/579/1699 403/626/1698 236/211/1700
-f 32/579/1701 236/211/1702 28/531/1703
-f 28/531/1703 236/211/1702 240/234/1704
-f 28/531/1705 240/234/1706 31/351/1707
-f 31/351/1707 240/234/1706 237/190/1708
-f 31/351/1709 237/190/1710 29/9/1711
-f 29/9/1711 237/190/1710 239/218/1712
-f 29/9/1713 239/218/1714 30/317/1715
-f 30/317/1715 239/218/1714 238/316/1716
-f 30/317/1717 238/316/1718 21/281/1719
-f 21/281/1719 238/316/1718 431/133/1720
-f 21/281/1721 431/133/1722 27/578/1723
-f 27/578/1723 431/133/1722 241/119/1724
-f 29/9/1725 30/317/1726 445/386/1727
-f 445/386/1727 30/317/1726 446/318/1728
-f 32/579/1729 28/531/1730 448/371/1731
-f 448/371/1731 28/531/1730 444/11/1732
-f 31/351/1733 29/9/1734 447/449/1735
-f 447/449/1735 29/9/1734 445/386/1736
-f 24/535/1737 23/219/1738 440/523/1739
-f 440/523/1739 23/219/1738 439/188/1740
-f 26/383/1741 25/130/1742 442/238/1743
-f 442/238/1743 25/130/1742 441/436/1744
-f 21/281/1745 27/578/1746 437/390/1747
-f 437/390/1747 27/578/1746 443/594/1748
-f 23/219/1749 22/685/1750 439/188/1751
-f 439/188/1751 22/685/1750 438/220/1752
-f 22/685/1753 32/579/1754 438/220/1755
-f 438/220/1755 32/579/1754 448/371/1756
-f 28/531/1757 31/351/1758 444/11/1759
-f 444/11/1759 31/351/1758 447/449/1760
-f 27/578/1761 26/383/1762 443/594/1763
-f 443/594/1763 26/383/1762 442/238/1764
-f 30/317/1765 21/281/1766 446/318/1767
-f 446/318/1767 21/281/1766 437/390/1768
-f 25/130/1769 24/535/1770 441/436/1771
-f 441/436/1771 24/535/1770 440/523/1772
-f 18/396/1773 253/158/1774 19/451/1775
-f 19/451/1775 253/158/1774 254/115/1776
-f 19/451/1777 254/115/1778 20/397/1779
-f 20/397/1779 254/115/1778 255/7/1780
-f 20/397/1781 255/7/1782 16/280/1783
-f 16/280/1783 255/7/1782 251/698/1784
-f 16/280/1785 251/698/1786 15/240/1787
-f 15/240/1787 251/698/1786 250/161/1788
-f 15/240/1789 250/161/1790 14/86/1791
-f 14/86/1791 250/161/1790 249/468/1792
-f 14/86/1793 249/468/1794 13/28/1795
-f 13/28/1795 249/468/1794 248/171/1796
-f 13/28/1797 248/171/1798 11/19/1799
-f 11/19/1799 248/171/1798 246/574/1800
-f 11/19/1801 246/574/1802 12/624/1803
-f 12/624/1803 246/574/1802 247/722/1804
-f 12/624/1805 247/722/1806 17/319/1807
-f 17/319/1807 247/722/1806 252/208/1808
-f 17/319/1809 252/208/1810 18/396/1811
-f 18/396/1811 252/208/1810 253/158/1812
-f 1/274/1813 265/70/1814 5/681/1815
-f 5/681/1815 265/70/1814 261/658/1816
-f 5/681/1817 261/658/1818 4/67/1819
-f 4/67/1819 261/658/1818 262/193/1820
-f 4/67/1821 262/193/1822 7/29/1823
-f 7/29/1823 262/193/1822 259/394/1824
-f 7/29/1825 259/394/1826 8/398/1827
-f 8/398/1827 259/394/1826 258/311/1828
-f 8/398/1829 258/311/1830 6/62/1831
-f 6/62/1831 258/311/1830 260/81/1832
-f 6/62/1833 260/81/1834 3/270/1835
-f 3/270/1835 260/81/1834 263/82/1836
-f 3/270/1837 263/82/1838 2/117/1839
-f 2/117/1839 263/82/1838 264/83/1840
-f 2/117/1841 264/83/1842 10/477/1843
-f 10/477/1843 264/83/1842 256/365/1844
-f 10/477/1845 256/365/1846 9/214/1847
-f 9/214/1847 256/365/1846 257/283/1848
-f 9/214/1849 257/283/1850 1/274/1851
-f 1/274/1851 257/283/1850 265/70/1852
-f 4/67/1853 7/29/1854 452/496/1855
-f 452/496/1855 7/29/1854 455/258/1856
-f 7/29/1857 8/398/1858 455/258/1859
-f 455/258/1859 8/398/1858 456/160/1860
-f 10/477/1861 9/214/1862 458/506/1863
-f 458/506/1863 9/214/1862 457/111/1864
-f 5/681/1865 4/67/1866 453/221/1867
-f 453/221/1867 4/67/1866 452/496/1868
-f 9/214/1869 1/274/1870 457/111/1871
-f 457/111/1871 1/274/1870 449/627/1872
-f 8/398/1873 6/62/1874 456/160/1875
-f 456/160/1875 6/62/1874 454/621/1876
-f 3/270/1877 2/117/1878 451/717/1879
-f 451/717/1879 2/117/1878 450/257/1880
-f 6/62/1881 3/270/1882 454/621/1883
-f 454/621/1883 3/270/1882 451/717/1884
-f 2/117/1885 10/477/1886 450/257/1887
-f 450/257/1887 10/477/1886 458/506/1888
-f 1/274/1889 5/681/1890 449/627/1891
-f 449/627/1891 5/681/1890 453/221/1892
-f 14/86/1893 13/28/1894 462/282/1895
-f 462/282/1895 13/28/1894 461/145/1896
-f 13/28/1897 11/19/1898 461/145/1899
-f 461/145/1899 11/19/1898 459/533/1900
-f 15/240/1901 14/86/1902 463/457/1903
-f 463/457/1903 14/86/1902 462/282/1904
-f 17/319/1905 18/396/1906 465/366/1907
-f 465/366/1907 18/396/1906 466/384/1908
-f 11/19/1909 12/624/1910 459/533/1911
-f 459/533/1911 12/624/1910 460/470/1912
-f 12/624/1913 17/319/1914 460/470/1915
-f 460/470/1915 17/319/1914 465/366/1916
-f 20/397/1917 16/280/1918 468/255/1919
-f 468/255/1919 16/280/1918 464/564/1920
-f 19/451/1921 20/397/1922 467/416/1923
-f 467/416/1923 20/397/1922 468/255/1924
-f 18/396/1925 19/451/1926 466/384/1927
-f 466/384/1927 19/451/1926 467/416/1928
-f 16/280/1929 15/240/1930 464/564/1931
-f 464/564/1931 15/240/1930 463/457/1932
-f 354/559/1933 515/507/1934 338/370/1935
-f 338/370/1935 515/507/1934 514/131/1936
-f 579/144/1937 405/456/1938 580/455/1939
-f 580/455/1939 405/456/1938 422/472/1940
-f 33/363/1941 497/170/1942 367/59/1943
-f 367/59/1943 497/170/1942 517/14/1944
-f 325/225/1945 369/657/1946 513/352/1947
-f 513/352/1947 369/657/1946 518/713/1948
-f 272/135/1949 508/321/1950 412/41/1951
-f 412/41/1951 508/321/1950 523/138/1952
-f 482/581/1953 538/385/1954 483/595/1955
-f 483/595/1955 538/385/1954 539/18/1956
-f 178/326/1957 269/325/1958 504/162/1959
-f 504/162/1959 269/325/1958 507/497/1960
-f 231/143/1961 303/168/1962 506/235/1963
-f 506/235/1963 303/168/1962 510/85/1964
-f 228/458/1965 505/502/1966 300/118/1967
-f 300/118/1967 505/502/1966 509/459/1968
-f 470/453/1969 526/432/1970 473/719/1971
-f 473/719/1971 526/432/1970 529/259/1972
-f 472/139/1973 528/667/1974 478/241/1975
-f 478/241/1975 528/667/1974 534/210/1976
-f 269/325/1977 412/41/1978 507/497/1979
-f 507/497/1979 412/41/1978 523/138/1980
-f 571/134/1981 575/668/1982 479/494/1983
-f 479/494/1983 575/668/1982 487/669/1984
-f 125/37/1985 421/348/1986 501/114/1987
-f 501/114/1987 421/348/1986 524/567/1988
-f 572/498/1989 481/400/1990 556/68/1991
-f 556/68/1991 481/400/1990 477/401/1992
-f 480/349/1993 536/350/1994 496/568/1995
-f 496/568/1995 536/350/1994 552/474/1996
-f 338/370/1997 514/131/1998 324/182/1999
-f 324/182/1999 514/131/1998 512/572/2000
-f 475/353/2001 531/84/2002 480/349/2003
-f 480/349/2003 531/84/2002 536/350/2004
-f 556/68/2005 477/401/2006 569/580/2007
-f 569/580/2007 477/401/2006 476/69/2008
-f 126/305/2009 125/37/2010 502/45/2011
-f 502/45/2011 125/37/2010 501/114/2012
-f 476/69/2013 477/401/2014 532/207/2015
-f 532/207/2015 477/401/2014 533/273/2016
-f 553/647/2017 470/453/2018 555/530/2019
-f 555/530/2019 470/453/2018 473/719/2020
-f 481/400/2021 490/66/2022 537/551/2023
-f 537/551/2023 490/66/2022 546/659/2024
-f 568/347/2025 567/191/2026 475/353/2027
-f 475/353/2027 567/191/2026 474/256/2028
-f 565/610/2029 469/406/2030 566/592/2031
-f 566/592/2031 469/406/2030 472/288/2032
-f 404/501/2033 398/314/2034 522/166/2035
-f 522/166/2035 398/314/2034 521/65/2036
-f 575/668/2037 570/665/2038 487/669/2039
-f 487/669/2039 570/665/2038 478/241/2040
-f 477/401/2041 481/400/2042 533/273/2043
-f 533/273/2043 481/400/2042 537/551/2044
-f 539/18/2045 511/279/2046 527/632/2047
-f 527/632/2047 511/279/2046 509/459/2048
-f 543/670/2049 534/210/2050 523/138/2051
-f 523/138/2051 534/210/2050 507/497/2052
-f 500/503/2053 504/440/2054 525/672/2055
-f 525/672/2055 504/440/2054 528/93/2056
-f 531/84/2057 530/141/2058 502/45/2059
-f 502/45/2059 530/141/2058 505/417/2060
-f 526/432/2061 503/344/2062 529/259/2063
-f 529/259/2063 503/344/2062 498/289/2064
-f 533/273/2065 499/686/2066 532/207/2067
-f 532/207/2067 499/686/2066 506/679/2068
-f 537/551/2069 497/170/2070 533/273/2071
-f 533/273/2071 497/170/2070 499/686/2072
-f 535/495/2073 543/670/2074 508/321/2075
-f 508/321/2075 543/670/2074 523/138/2076
-f 522/166/2077 551/369/2078 524/567/2079
-f 524/567/2079 551/369/2078 552/474/2080
-f 521/65/2081 550/13/2082 522/166/2083
-f 522/166/2083 550/13/2082 551/369/2084
-f 520/452/2085 549/700/2086 521/65/2087
-f 521/65/2087 549/700/2086 550/13/2088
-f 513/352/2089 541/187/2090 520/452/2091
-f 520/452/2091 541/187/2090 549/700/2092
-f 498/289/2093 519/40/2094 529/259/2095
-f 529/259/2095 519/40/2094 548/683/2096
-f 500/503/2097 525/672/2098 518/713/2099
-f 518/713/2099 525/672/2098 547/222/2100
-f 516/342/2101 517/14/2102 545/549/2103
-f 545/549/2103 517/14/2102 546/659/2104
-f 515/507/2105 516/342/2106 544/132/2107
-f 544/132/2107 516/342/2106 545/549/2108
-f 514/131/2109 515/507/2110 542/718/2111
-f 542/718/2111 515/507/2110 544/132/2112
-f 512/572/2113 514/131/2114 540/550/2115
-f 540/550/2115 514/131/2114 542/718/2116
-f 518/713/2117 547/222/2118 513/352/2119
-f 513/352/2119 547/222/2118 541/187/2120
-f 517/14/2121 497/170/2122 546/659/2123
-f 546/659/2123 497/170/2122 537/551/2124
-f 501/114/2125 536/350/2126 502/45/2127
-f 502/45/2127 536/350/2126 531/84/2128
-f 524/567/2129 552/474/2130 501/114/2131
-f 501/114/2131 552/474/2130 536/350/2132
-f 534/210/2133 528/667/2134 507/497/2135
-f 507/497/2135 528/667/2134 504/162/2136
-f 510/85/2137 511/279/2138 538/385/2139
-f 538/385/2139 511/279/2138 539/18/2140
-f 503/42/2141 526/275/2142 508/321/2143
-f 508/321/2143 526/275/2142 535/495/2144
-f 505/502/2145 530/380/2146 509/459/2147
-f 509/459/2147 530/380/2146 527/632/2148
-f 506/235/2149 510/85/2150 532/30/2151
-f 532/30/2151 510/85/2150 538/385/2152
-f 519/40/2153 512/572/2154 548/683/2155
-f 548/683/2155 512/572/2154 540/550/2156
-f 393/450/2157 325/225/2158 520/452/2159
-f 520/452/2159 325/225/2158 513/352/2160
-f 228/643/2161 126/305/2162 505/417/2163
-f 505/417/2163 126/305/2162 502/45/2164
-f 478/241/2165 534/210/2166 487/669/2167
-f 487/669/2167 534/210/2166 543/670/2168
-f 231/223/2169 506/679/2170 80/724/2171
-f 80/724/2171 506/679/2170 499/686/2172
-f 476/720/2173 532/30/2174 482/581/2175
-f 482/581/2175 532/30/2174 538/385/2176
-f 471/102/2177 483/595/2178 527/632/2179
-f 527/632/2179 483/595/2178 539/18/2180
-f 496/568/2181 552/474/2182 495/441/2183
-f 495/441/2183 552/474/2182 551/369/2184
-f 484/517/2185 492/524/2186 540/550/2187
-f 540/550/2187 492/524/2186 548/683/2188
-f 479/494/2189 487/669/2190 535/495/2191
-f 535/495/2191 487/669/2190 543/670/2192
-f 303/168/2193 317/213/2194 510/85/2195
-f 510/85/2195 317/213/2194 511/279/2196
-f 124/80/2197 500/503/2198 369/657/2199
-f 369/657/2199 500/503/2198 518/713/2200
-f 495/441/2201 551/369/2202 494/678/2203
-f 494/678/2203 551/369/2202 550/13/2204
-f 494/678/2205 550/13/2206 493/237/2207
-f 493/237/2207 550/13/2206 549/700/2208
-f 300/118/2209 509/459/2210 317/213/2211
-f 317/213/2211 509/459/2210 511/279/2212
-f 324/182/2213 512/572/2214 371/183/2215
-f 371/183/2215 512/572/2214 519/40/2216
-f 178/687/2217 504/440/2218 124/80/2219
-f 124/80/2219 504/440/2218 500/503/2220
-f 398/314/2221 393/450/2222 521/65/2223
-f 521/65/2223 393/450/2222 520/452/2224
-f 493/237/2225 549/700/2226 485/475/2227
-f 485/475/2227 549/700/2226 541/187/2228
-f 473/719/2229 529/259/2230 492/524/2231
-f 492/524/2231 529/259/2230 548/683/2232
-f 469/406/2233 491/593/2234 525/672/2235
-f 525/672/2235 491/593/2234 547/222/2236
-f 490/66/2237 489/437/2238 546/659/2239
-f 546/659/2239 489/437/2238 545/549/2240
-f 367/59/2241 517/14/2242 360/556/2243
-f 360/556/2243 517/14/2242 516/342/2244
-f 489/437/2245 488/714/2246 545/549/2247
-f 545/549/2247 488/714/2246 544/132/2248
-f 421/348/2249 404/501/2250 524/567/2251
-f 524/567/2251 404/501/2250 522/166/2252
-f 488/714/2253 486/563/2254 544/132/2255
-f 544/132/2255 486/563/2254 542/718/2256
-f 486/563/2257 484/517/2258 542/718/2259
-f 542/718/2259 484/517/2258 540/550/2260
-f 80/724/2261 499/686/2262 33/363/2263
-f 33/363/2263 499/686/2262 497/170/2264
-f 485/475/2265 541/187/2266 491/593/2267
-f 491/593/2267 541/187/2266 547/222/2268
-f 554/247/2269 558/641/2270 471/102/2271
-f 471/102/2271 558/641/2270 483/595/2272
-f 316/343/2273 558/641/2274 301/508/2275
-f 301/508/2275 558/641/2274 554/247/2276
-f 383/277/2277 267/229/2278 575/668/2279
-f 575/668/2279 267/229/2278 570/665/2280
-f 565/610/2281 566/592/2282 110/199/2283
-f 110/199/2283 566/592/2282 183/710/2284
-f 127/122/2285 567/191/2286 111/264/2287
-f 111/264/2287 567/191/2286 568/347/2288
-f 105/284/2289 553/647/2290 102/125/2291
-f 102/125/2291 553/647/2290 555/530/2292
-f 556/68/2293 569/580/2294 104/464/2295
-f 104/464/2295 569/580/2294 103/695/2296
-f 294/636/2297 572/498/2298 104/464/2299
-f 104/464/2299 572/498/2298 556/68/2300
-f 270/583/2301 383/277/2302 571/134/2303
-f 571/134/2303 383/277/2302 575/668/2304
-f 495/441/2305 579/144/2306 496/568/2307
-f 496/568/2307 579/144/2306 580/455/2308
-f 494/678/2309 578/680/2310 495/441/2311
-f 495/441/2311 578/680/2310 579/144/2312
-f 493/237/2313 577/566/2314 494/678/2315
-f 494/678/2315 577/566/2314 578/680/2316
-f 485/475/2317 574/414/2318 493/237/2319
-f 493/237/2319 574/414/2318 577/566/2320
-f 473/719/2321 492/524/2322 555/530/2323
-f 555/530/2323 492/524/2322 564/599/2324
-f 469/406/2325 565/610/2326 491/593/2327
-f 491/593/2327 565/610/2326 576/116/2328
-f 489/437/2329 490/66/2330 562/642/2331
-f 562/642/2331 490/66/2330 563/368/2332
-f 488/714/2333 489/437/2334 561/620/2335
-f 561/620/2335 489/437/2334 562/642/2336
-f 486/563/2337 488/714/2338 560/478/2339
-f 560/478/2339 488/714/2338 561/620/2340
-f 484/517/2341 486/563/2342 559/56/2343
-f 559/56/2343 486/563/2342 560/478/2344
-f 491/593/2345 576/116/2346 485/475/2347
-f 485/475/2347 576/116/2346 574/414/2348
-f 490/66/2349 481/400/2350 563/368/2351
-f 563/368/2351 481/400/2350 572/498/2352
-f 480/349/2353 557/194/2354 475/353/2355
-f 475/353/2355 557/194/2354 568/347/2356
-f 496/568/2357 580/455/2358 480/349/2359
-f 480/349/2359 580/455/2358 557/194/2360
-f 570/665/2361 566/491/2362 478/241/2363
-f 478/241/2363 566/491/2362 472/139/2364
-f 482/581/2365 483/595/2366 573/543/2367
-f 573/543/2367 483/595/2366 558/641/2368
-f 470/329/2369 553/302/2370 479/494/2371
-f 479/494/2371 553/302/2370 571/134/2372
-f 474/251/2373 567/297/2374 471/102/2375
-f 471/102/2375 567/297/2374 554/247/2376
-f 476/720/2377 482/581/2378 569/252/2379
-f 569/252/2379 482/581/2378 573/543/2380
-f 492/524/2381 484/517/2382 564/599/2383
-f 564/599/2383 484/517/2382 559/56/2384
-f 125/37/2385 600/410/2386 421/348/2387
-f 421/348/2387 600/410/2386 608/159/2388
-f 143/91/2389 603/646/2390 434/63/2391
-f 434/63/2391 603/646/2390 608/159/2392
-f 141/418/2393 606/27/2394 143/91/2395
-f 143/91/2395 606/27/2394 603/646/2396
-f 369/657/2397 325/225/2398 602/387/2399
-f 602/387/2399 325/225/2398 605/715/2400
-f 33/363/2401 367/59/2402 588/25/2403
-f 588/25/2403 367/59/2402 607/15/2404
-f 35/519/2405 36/71/2406 594/140/2407
-f 594/140/2407 36/71/2406 607/15/2408
-f 139/402/2409 140/113/2410 604/415/2411
-f 604/415/2411 140/113/2410 605/715/2412
-f 141/418/2413 139/402/2414 606/27/2415
-f 606/27/2415 139/402/2414 604/415/2416
-f 430/372/2417 160/74/2418 602/387/2419
-f 602/387/2419 160/74/2418 589/699/2420
-f 58/603/2421 584/684/2422 78/609/2423
-f 78/609/2423 584/684/2422 586/209/2424
-f 594/140/2425 596/61/2426 35/519/2427
-f 35/519/2427 596/61/2426 56/364/2428
-f 418/320/2429 595/323/2430 392/328/2431
-f 392/328/2431 595/323/2430 601/137/2432
-f 34/38/2433 584/684/2434 371/183/2435
-f 371/183/2435 584/684/2434 599/184/2436
-f 354/559/2437 338/370/2438 596/61/2439
-f 596/61/2439 338/370/2438 597/295/2440
-f 59/435/2441 57/488/2442 598/108/2443
-f 598/108/2443 57/488/2442 597/295/2444
-f 582/480/2445 588/25/2446 82/707/2447
-f 82/707/2447 588/25/2446 420/481/2448
-f 303/168/2449 592/434/2450 317/213/2451
-f 317/213/2451 592/434/2450 593/565/2452
-f 593/565/2453 591/442/2454 317/213/2455
-f 317/213/2455 591/442/2454 300/118/2456
-f 171/307/2457 592/434/2458 81/73/2459
-f 81/73/2459 592/434/2458 581/271/2460
-f 591/442/2461 583/142/2462 300/118/2463
-f 300/118/2463 583/142/2462 228/458/2464
-f 78/608/2465 586/493/2466 276/664/2467
-f 276/664/2467 586/493/2466 590/663/2468
-f 392/328/2469 601/137/2470 391/90/2471
-f 391/90/2471 601/137/2470 585/492/2472
-f 80/724/2473 582/480/2474 231/223/2475
-f 231/223/2475 582/480/2474 581/5/2476
-f 230/330/2477 172/276/2478 583/267/2479
-f 583/267/2479 172/276/2478 587/404/2480
-f 418/320/2481 276/664/2482 595/323/2483
-f 595/323/2483 276/664/2482 590/663/2484
-f 390/26/2485 600/410/2486 172/276/2487
-f 172/276/2487 600/410/2486 587/404/2488
-f 598/108/2489 599/184/2490 59/435/2491
-f 59/435/2491 599/184/2490 60/148/2492
-f 391/532/2493 585/367/2494 160/74/2495
-f 160/74/2495 585/367/2494 589/699/2496
diff --git a/libs/vr/libdvrgraphics/assets/controller_proto2_button.obj b/libs/vr/libdvrgraphics/assets/controller_proto2_button.obj
deleted file mode 100644
index 2057c27..0000000
--- a/libs/vr/libdvrgraphics/assets/controller_proto2_button.obj
+++ /dev/null
@@ -1,595 +0,0 @@
-# This file uses centimeters as units for non-parametric coordinates.
-
-v -0.003544 0.012417 0.078987
-v -0.003544 0.013694 0.078987
-v -0.003544 0.012417 0.078281
-v -0.003544 0.013694 0.078281
-v 0.003544 0.012417 0.078987
-v 0.003544 0.013694 0.078987
-v 0.003544 0.012417 0.078281
-v 0.003544 0.013694 0.078281
-v -0.003685 0.013694 0.078769
-v -0.003685 0.013694 0.078498
-v -0.003685 0.012417 0.078498
-v -0.003685 0.012417 0.078769
-v 0.003685 0.013694 0.078498
-v 0.003685 0.013694 0.078769
-v 0.003685 0.012417 0.078769
-v 0.003685 0.012417 0.078498
-v 0.005601 0.013400 0.078650
-v 0.004531 0.013400 0.081942
-v 0.004531 0.013400 0.075358
-v -0.001731 0.013400 0.073324
-v -0.005601 0.013400 0.078650
-v -0.001731 0.013400 0.083977
-v 0.001731 0.013400 0.083977
-v -0.004531 0.013400 0.081942
-v 0.001731 0.013400 0.073324
-v -0.004531 0.013400 0.075358
-v 0.005463 0.013400 0.078650
-v 0.004420 0.013400 0.081861
-v 0.004420 0.013400 0.075439
-v -0.001688 0.013400 0.073454
-v -0.005463 0.013400 0.078650
-v -0.001688 0.013400 0.083846
-v 0.001688 0.013400 0.083846
-v -0.004420 0.013400 0.081861
-v 0.001688 0.013400 0.073454
-v -0.004420 0.013400 0.075439
-v 0.000000 0.013400 0.078650
-v -0.003544 0.013694 0.078987
-v 0.005601 0.008414 0.078650
-v 0.004531 0.008414 0.081942
-v 0.004531 0.008414 0.075358
-v -0.001731 0.008414 0.073324
-v -0.005601 0.008414 0.078650
-v -0.001731 0.008414 0.083977
-v 0.001731 0.008414 0.083977
-v -0.004531 0.008414 0.081942
-v 0.001731 0.008414 0.073324
-v -0.004531 0.008414 0.075358
-v 0.007115 0.008414 0.078650
-v 0.005756 0.008414 0.082832
-v 0.005756 0.008414 0.074468
-v -0.002199 0.008414 0.071883
-v -0.007115 0.008414 0.078650
-v -0.002199 0.008414 0.085417
-v 0.002199 0.008414 0.085417
-v -0.005756 0.008414 0.082832
-v 0.002199 0.008414 0.071883
-v -0.005756 0.008414 0.074468
-v -0.001731 0.013280 0.083977
-v 0.001731 0.013280 0.083977
-v 0.005601 0.013280 0.078650
-v 0.004531 0.013280 0.075358
-v 0.001731 0.013280 0.073324
-v -0.004531 0.013280 0.081942
-v -0.005601 0.013280 0.078650
-v -0.004531 0.013280 0.075358
-v -0.001731 0.013280 0.073324
-v 0.004531 0.013280 0.081942
-v -0.001731 0.008498 0.083977
-v 0.005601 0.008498 0.078650
-v -0.004531 0.008498 0.081942
-v -0.005601 0.008498 0.078650
-v -0.004531 0.008498 0.075358
-v -0.001731 0.008498 0.073324
-v 0.004531 0.008498 0.081942
-v 0.001731 0.008498 0.083977
-v 0.004531 0.008498 0.075358
-v 0.001731 0.008498 0.073324
-vt 0.842894 0.803524
-vt 0.835648 0.808965
-vt 0.842327 0.831331
-vt 0.887089 0.817309
-vt 0.918325 0.883860
-vt 0.914475 0.893532
-vt 0.851925 0.804110
-vt 0.831948 0.817360
-vt 0.834920 0.826127
-vt 0.835239 0.825914
-vt 0.861947 0.818080
-vt 0.858905 0.826714
-vt 0.796511 0.818262
-vt 0.834940 0.856335
-vt 0.851468 0.832257
-vt 0.879150 0.794052
-vt 0.814609 0.794688
-vt 0.879631 0.793683
-vt 0.859802 0.855418
-vt 0.918325 0.877630
-vt 0.952893 0.877630
-vt 0.917637 0.875247
-vt 0.860005 0.855991
-vt 0.953582 0.876570
-vt 0.954157 0.893532
-vt 0.914475 0.887302
-vt 0.915739 0.887302
-vt 0.831492 0.866397
-vt 0.859621 0.809104
-vt 0.814110 0.794343
-vt 0.955480 0.893532
-vt 0.918325 0.874188
-vt 0.952893 0.874188
-vt 0.953582 0.875247
-vt 0.953582 0.886243
-vt 0.917637 0.886242
-vt 0.953582 0.884920
-vt 0.917637 0.884919
-vt 0.897742 0.817179
-vt 0.842083 0.832031
-vt 0.835347 0.808727
-vt 0.842998 0.803894
-vt 0.842194 0.831691
-vt 0.880142 0.841098
-vt 0.835113 0.855751
-vt 0.952893 0.883860
-vt 0.917637 0.876570
-vt 0.830731 0.769044
-vt 0.852058 0.803750
-vt 0.835058 0.808516
-vt 0.852169 0.803410
-vt 0.887696 0.817293
-vt 0.806054 0.847763
-vt 0.814622 0.841758
-vt 0.888895 0.846984
-vt 0.862304 0.818081
-vt 0.805357 0.788458
-vt 0.815102 0.841390
-vt 0.956743 0.887302
-vt 0.956743 0.893532
-vt 0.851358 0.831917
-vt 0.862760 0.769044
-vt 0.954157 0.887302
-vt 0.915739 0.893532
-vt 0.859312 0.779106
-vt 0.806556 0.818148
-vt 0.834631 0.826337
-vt 0.859194 0.826925
-vt 0.859332 0.809314
-vt 0.859013 0.809527
-vt 0.832305 0.817361
-vt 0.832688 0.817376
-vt 0.847126 0.817721
-vt 0.859139 0.779690
-vt 0.834450 0.780024
-vt 0.834248 0.779451
-vt 0.807163 0.818133
-vt 0.863522 0.866397
-vt 0.952893 0.893532
-vt 0.917062 0.887302
-vt 0.918325 0.887302
-vt 0.918325 0.893532
-vt 0.917062 0.893532
-vt 0.952893 0.887302
-vt 0.955480 0.887302
-vt 0.879643 0.840753
-vt 0.888198 0.787678
-vt 0.861564 0.818065
-vt 0.842784 0.803184
-vt 0.851254 0.831547
-vt 0.858604 0.826476
-vn -0.838651 0.000004 -0.544669
-vn -0.838651 0.000004 -0.544669
-vn -0.838651 0.000004 -0.544669
-vn -0.838651 0.000004 -0.544669
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.838651 0.000004 0.544669
-vn 0.838651 0.000004 0.544669
-vn 0.838651 0.000004 0.544669
-vn 0.838651 0.000004 0.544669
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.838651 -0.000004 -0.544669
-vn 0.838651 -0.000004 -0.544669
-vn 0.838651 -0.000004 -0.544669
-vn 0.838651 -0.000004 -0.544669
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn -0.838651 -0.000004 0.544669
-vn -0.838651 -0.000004 0.544669
-vn -0.838651 -0.000004 0.544669
-vn -0.838651 -0.000004 0.544669
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn 0.619120 0.643718 -0.449797
-vn 0.236462 0.643710 -0.727821
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.619120 0.643718 0.449797
-vn -0.236462 0.643710 0.727821
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.236462 0.643710 -0.727821
-vn -0.236462 0.643710 -0.727821
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.765269 0.643711 0.000000
-vn 0.619120 0.643718 -0.449797
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.236462 0.643710 -0.727821
-vn -0.619120 0.643718 -0.449797
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.236462 0.643710 0.727821
-vn 0.236462 0.643710 0.727821
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.236462 0.643710 0.727821
-vn 0.619120 0.643718 0.449797
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.619120 0.643718 0.449797
-vn 0.765269 0.643711 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.765269 0.643711 0.000000
-vn -0.619120 0.643718 0.449797
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.619120 0.643718 -0.449797
-vn -0.765269 0.643711 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.309004 -0.000000 0.951061
-vn -0.309004 -0.000000 0.951061
-vn 0.191936 0.783706 0.590733
-vn -0.191936 0.783706 0.590733
-vn 0.809030 0.000000 -0.587767
-vn 1.000000 0.000000 0.000000
-vn 0.502506 0.783714 -0.365076
-vn 0.621130 0.783707 0.000000
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 0.000000 -0.587767
-vn 0.191936 0.783706 -0.590733
-vn 0.502506 0.783714 -0.365076
-vn -0.309004 -0.000000 0.951061
-vn -0.809030 -0.000000 0.587767
-vn -0.191936 0.783706 0.590733
-vn -0.502506 0.783714 0.365076
-vn -0.809030 -0.000000 0.587767
-vn -1.000000 0.000000 0.000000
-vn -0.502506 0.783714 0.365076
-vn -0.621130 0.783707 0.000000
-vn -1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -0.621130 0.783707 0.000000
-vn -0.502506 0.783714 -0.365076
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn -0.502506 0.783714 -0.365076
-vn -0.191936 0.783706 -0.590733
-vn 1.000000 0.000000 0.000000
-vn 0.809030 -0.000000 0.587767
-vn 0.621130 0.783707 0.000000
-vn 0.502506 0.783714 0.365076
-vn 0.809030 -0.000000 0.587767
-vn 0.309004 -0.000000 0.951061
-vn 0.502506 0.783714 0.365076
-vn 0.191936 0.783706 0.590733
-vn -0.309004 0.000000 -0.951061
-vn 0.309004 0.000000 -0.951061
-vn -0.191936 0.783706 -0.590733
-vn 0.191936 0.783706 -0.590733
-vn 0.621130 0.783707 0.000000
-vn 0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.502506 0.783714 0.365076
-vn 0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 -0.590733
-vn 0.191936 0.783706 -0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.191936 0.783706 0.590733
-vn -0.191936 0.783706 0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.502506 0.783714 -0.365076
-vn 0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.191936 0.783706 -0.590733
-vn 0.502506 0.783714 -0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 0.590733
-vn -0.502506 0.783714 0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 0.365076
-vn -0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.621130 0.783707 0.000000
-vn -0.502506 0.783714 -0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 -0.365076
-vn -0.191936 0.783706 -0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.236462 0.643710 -0.727821
-vn 0.236462 0.643710 -0.727821
-vn -0.309004 0.000000 -0.951061
-vn 0.309004 0.000000 -0.951061
-vn 0.619120 0.643718 0.449797
-vn 0.236462 0.643710 0.727821
-vn 0.809030 -0.000000 0.587767
-vn 0.309004 -0.000000 0.951061
-vn 0.765269 0.643711 0.000000
-vn 0.619120 0.643718 0.449797
-vn 1.000000 0.000000 0.000000
-vn 0.809030 -0.000000 0.587767
-vn -0.619120 0.643718 -0.449797
-vn -0.236462 0.643710 -0.727821
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn -0.765269 0.643711 0.000000
-vn -0.619120 0.643718 -0.449797
-vn -1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -0.619120 0.643718 0.449797
-vn -0.765269 0.643711 0.000000
-vn -0.809030 -0.000000 0.587767
-vn -1.000000 0.000000 0.000000
-vn -0.236462 0.643710 0.727821
-vn -0.619120 0.643718 0.449797
-vn -0.309004 -0.000000 0.951061
-vn -0.809030 -0.000000 0.587767
-vn 0.236462 0.643710 -0.727821
-vn 0.619120 0.643718 -0.449797
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 0.000000 -0.587767
-vn 0.619120 0.643718 -0.449797
-vn 0.765269 0.643711 0.000000
-vn 0.809030 0.000000 -0.587767
-vn 1.000000 0.000000 0.000000
-vn 0.236462 0.643710 0.727821
-vn -0.236462 0.643710 0.727821
-vn 0.309004 -0.000000 0.951061
-vn -0.309004 -0.000000 0.951061
-vn -0.309004 0.000000 -0.951061
-vn 0.309004 0.000000 -0.951061
-vn -0.309004 0.000000 -0.951061
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 -0.000000 0.587767
-vn 0.309004 -0.000000 0.951061
-vn 0.809030 -0.000000 0.587767
-vn 0.309004 -0.000000 0.951061
-vn 1.000000 0.000000 0.000000
-vn 0.809030 -0.000000 0.587767
-vn 1.000000 0.000000 0.000000
-vn 0.809030 -0.000000 0.587767
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn -1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -0.809030 -0.000000 0.587767
-vn -1.000000 0.000000 0.000000
-vn -0.809030 -0.000000 0.587767
-vn -1.000000 0.000000 0.000000
-vn -0.309004 -0.000000 0.951061
-vn -0.809030 -0.000000 0.587767
-vn -0.309004 -0.000000 0.951061
-vn -0.809030 -0.000000 0.587767
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 0.000000 -0.587767
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 0.000000 -0.587767
-vn 0.809030 0.000000 -0.587767
-vn 1.000000 0.000000 0.000000
-vn 0.809030 0.000000 -0.587767
-vn 1.000000 0.000000 0.000000
-vn 0.309004 -0.000000 0.951061
-vn -0.309004 -0.000000 0.951061
-vn 0.309004 -0.000000 0.951061
-vn -0.309004 -0.000000 0.951061
-f 10/80/1 4/81/2 11/83/3
-f 11/83/3 4/81/2 3/82/4
-f 4/81/5 8/84/6 3/82/7
-f 3/82/7 8/84/6 7/79/8
-f 14/85/9 6/59/10 15/31/11
-f 15/31/11 6/59/10 5/60/12
-f 6/46/13 2/5/14 5/21/15
-f 5/21/15 2/5/14 1/20/16
-f 11/22/17 3/32/18 16/34/19
-f 16/34/19 3/32/18 7/33/20
-f 13/35/21 8/84/22 10/36/23
-f 10/36/23 8/84/22 4/81/24
-f 6/46/25 14/37/26 2/5/27
-f 2/5/27 14/37/26 9/38/28
-f 14/37/29 13/35/30 9/38/31
-f 9/38/31 13/35/30 10/36/32
-f 1/20/33 12/47/34 5/21/35
-f 5/21/35 12/47/34 15/24/36
-f 12/47/37 11/22/38 15/24/39
-f 15/24/39 11/22/38 16/34/40
-f 8/84/41 13/63/42 7/79/43
-f 7/79/43 13/63/42 16/25/44
-f 13/63/45 14/85/46 16/25/47
-f 16/25/47 14/85/46 15/31/48
-f 2/26/49 9/27/50 1/6/51
-f 1/6/51 9/27/50 12/64/52
-f 9/27/53 10/80/54 12/64/55
-f 12/64/55 10/80/54 11/83/56
-f 19/12/57 25/61/58 29/91/59
-f 29/91/59 25/61/58 35/90/60
-f 24/41/61 22/1/62 34/2/63
-f 34/2/63 22/1/62 32/42/64
-f 25/61/65 20/43/66 35/90/67
-f 35/90/67 20/43/66 30/3/68
-f 17/11/69 19/12/70 27/88/71
-f 27/88/71 19/12/70 29/91/72
-f 20/43/73 26/9/74 30/3/75
-f 30/3/75 26/9/74 36/10/76
-f 22/1/77 23/49/78 32/42/79
-f 32/42/79 23/49/78 33/7/80
-f 23/49/81 18/69/82 33/7/83
-f 33/7/83 18/69/82 28/70/84
-f 18/69/85 17/11/86 28/70/87
-f 28/70/87 17/11/86 27/88/88
-f 21/71/89 24/41/90 31/72/91
-f 31/72/91 24/41/90 34/2/92
-f 26/9/93 21/71/94 36/10/95
-f 36/10/95 21/71/94 31/72/96
-f 33/7/97 28/70/98 37/73/99
-f 35/90/100 30/3/101 37/73/102
-f 32/42/103 33/7/104 37/73/105
-f 27/88/106 29/91/107 37/73/108
-f 29/91/109 35/90/110 37/73/111
-f 34/2/112 32/42/113 37/73/114
-f 31/72/115 34/2/116 37/73/117
-f 36/10/118 31/72/119 37/73/120
-f 30/3/121 36/10/122 37/73/123
-f 28/70/124 27/88/125 37/73/126
-f 76/74/127 69/75/128 45/65/129
-f 45/65/129 69/75/128 44/76/130
-f 77/86/131 70/4/132 41/44/133
-f 41/44/133 70/4/132 39/52/134
-f 78/19/135 77/86/136 47/23/137
-f 47/23/137 77/86/136 41/44/138
-f 69/75/139 71/17/140 44/76/141
-f 44/76/141 71/17/140 46/30/142
-f 71/17/143 72/77/144 46/30/145
-f 46/30/145 72/77/144 43/66/146
-f 72/77/147 73/58/148 43/66/149
-f 43/66/149 73/58/148 48/54/150
-f 73/58/151 74/45/152 48/54/153
-f 48/54/153 74/45/152 42/14/154
-f 70/4/155 75/16/156 39/52/157
-f 39/52/157 75/16/156 40/18/158
-f 75/16/159 76/74/160 40/18/161
-f 40/18/161 76/74/160 45/65/162
-f 74/45/163 78/19/164 42/14/165
-f 42/14/165 78/19/164 47/23/166
-f 39/52/167 40/18/168 49/39/169
-f 49/39/169 40/18/168 50/87/170
-f 40/18/171 45/65/172 50/87/173
-f 50/87/173 45/65/172 55/62/174
-f 42/14/175 47/23/176 52/28/177
-f 52/28/177 47/23/176 57/78/178
-f 45/65/179 44/76/180 55/62/181
-f 55/62/181 44/76/180 54/48/182
-f 41/44/183 39/52/184 51/55/185
-f 51/55/185 39/52/184 49/39/186
-f 47/23/187 41/44/188 57/78/189
-f 57/78/189 41/44/188 51/55/190
-f 44/76/191 46/30/192 54/48/193
-f 54/48/193 46/30/192 56/57/194
-f 46/30/195 43/66/196 56/57/197
-f 56/57/197 43/66/196 53/13/198
-f 43/66/199 48/54/200 53/13/201
-f 53/13/201 48/54/200 58/53/202
-f 48/54/203 42/14/204 58/53/205
-f 58/53/205 42/14/204 52/28/206
-f 20/43/207 25/61/208 67/40/209
-f 67/40/209 25/61/208 63/15/210
-f 18/69/211 23/49/212 68/29/213
-f 68/29/213 23/49/212 60/51/214
-f 17/11/215 18/69/216 61/56/217
-f 61/56/217 18/69/216 68/29/218
-f 26/9/219 20/43/220 66/67/221
-f 66/67/221 20/43/220 67/40/222
-f 21/71/223 26/9/224 65/8/225
-f 65/8/225 26/9/224 66/67/226
-f 24/41/227 21/71/228 64/50/229
-f 64/50/229 21/71/228 65/8/230
-f 22/1/231 24/41/232 59/89/233
-f 59/89/233 24/41/232 64/50/234
-f 25/61/235 19/12/236 63/15/237
-f 63/15/237 19/12/236 62/68/238
-f 19/12/239 17/11/240 62/68/241
-f 62/68/241 17/11/240 61/56/242
-f 23/49/243 22/1/244 60/51/245
-f 60/51/245 22/1/244 59/89/246
-f 67/40/247 63/15/248 74/45/249
-f 74/45/249 63/15/248 78/19/250
-f 68/29/251 60/51/252 75/16/253
-f 75/16/253 60/51/252 76/74/254
-f 61/56/255 68/29/256 70/4/257
-f 70/4/257 68/29/256 75/16/258
-f 66/67/259 67/40/260 73/58/261
-f 73/58/261 67/40/260 74/45/262
-f 65/8/263 66/67/264 72/77/265
-f 72/77/265 66/67/264 73/58/266
-f 64/50/267 65/8/268 71/17/269
-f 71/17/269 65/8/268 72/77/270
-f 59/89/271 64/50/272 69/75/273
-f 69/75/273 64/50/272 71/17/274
-f 63/15/275 62/68/276 78/19/277
-f 78/19/277 62/68/276 77/86/278
-f 62/68/279 61/56/280 77/86/281
-f 77/86/281 61/56/280 70/4/282
-f 60/51/283 59/89/284 76/74/285
-f 76/74/285 59/89/284 69/75/286
diff --git a/libs/vr/libdvrgraphics/assets/controller_proto2_button2.obj b/libs/vr/libdvrgraphics/assets/controller_proto2_button2.obj
deleted file mode 100644
index 2f3bd1e..0000000
--- a/libs/vr/libdvrgraphics/assets/controller_proto2_button2.obj
+++ /dev/null
@@ -1,794 +0,0 @@
-# This file uses centimeters as units for non-parametric coordinates.
-
-v 0.001731 0.013400 0.090823
-v -0.005601 0.013400 0.096150
-v 0.001731 0.013400 0.101477
-v -0.004531 0.013400 0.099442
-v 0.004531 0.013400 0.099442
-v 0.005601 0.013400 0.096150
-v -0.001731 0.013400 0.101477
-v -0.001731 0.013400 0.090823
-v 0.004531 0.013400 0.092858
-v -0.004531 0.013400 0.092858
-v 0.001690 0.013400 0.090950
-v -0.005467 0.013400 0.096150
-v 0.001690 0.013400 0.101350
-v -0.004423 0.013400 0.099364
-v 0.004423 0.013400 0.099364
-v 0.005467 0.013400 0.096150
-v -0.001690 0.013400 0.101350
-v -0.001690 0.013400 0.090950
-v 0.004423 0.013400 0.092936
-v -0.004423 0.013400 0.092936
-v 0.000000 0.013400 0.096150
-v 0.001731 0.008414 0.090823
-v -0.005601 0.008414 0.096150
-v 0.001731 0.008414 0.101477
-v -0.004531 0.008414 0.099442
-v 0.004531 0.008414 0.099442
-v 0.005601 0.008414 0.096150
-v -0.001731 0.008414 0.101477
-v -0.001731 0.008414 0.090823
-v 0.004531 0.008414 0.092858
-v -0.004531 0.008414 0.092858
-v 0.002212 0.008414 0.089341
-v -0.007159 0.008414 0.096150
-v 0.002212 0.008414 0.102959
-v -0.005792 0.008414 0.100358
-v 0.005792 0.008414 0.100358
-v 0.007159 0.008414 0.096150
-v -0.002212 0.008414 0.102959
-v -0.002212 0.008414 0.089341
-v 0.005792 0.008414 0.091942
-v -0.005792 0.008414 0.091942
-v -0.001731 0.013209 0.101477
-v 0.001731 0.013209 0.101477
-v -0.004531 0.013209 0.099442
-v -0.005601 0.013209 0.096150
-v -0.004531 0.013209 0.092858
-v 0.004531 0.013209 0.092858
-v 0.005601 0.013209 0.096150
-v 0.004531 0.013209 0.099442
-v -0.001731 0.013209 0.090823
-v 0.001731 0.013209 0.090823
-v 0.001731 0.008535 0.101477
-v -0.005601 0.008535 0.096150
-v 0.004531 0.008535 0.099442
-v 0.001731 0.008535 0.090823
-v -0.001731 0.008535 0.101477
-v -0.004531 0.008535 0.099442
-v -0.004531 0.008535 0.092858
-v 0.004531 0.008535 0.092858
-v 0.005601 0.008535 0.096150
-v -0.001731 0.008535 0.090823
-v 0.001108 0.013694 0.092741
-v -0.003585 0.013694 0.096150
-v 0.001108 0.013694 0.099560
-v -0.002900 0.013694 0.098257
-v 0.002900 0.013694 0.098257
-v 0.003585 0.013694 0.096150
-v -0.001108 0.013694 0.099560
-v -0.001108 0.013694 0.092741
-v 0.002900 0.013694 0.094043
-v -0.002900 0.013694 0.094043
-v 0.000955 0.013694 0.093211
-v -0.003090 0.013694 0.096150
-v 0.000955 0.013694 0.099090
-v -0.002500 0.013694 0.097967
-v 0.002500 0.013694 0.097967
-v 0.003090 0.013694 0.096150
-v -0.000955 0.013694 0.099090
-v -0.000955 0.013694 0.093211
-v 0.002500 0.013694 0.094334
-v -0.002500 0.013694 0.094334
-v 0.001108 0.012417 0.092741
-v -0.003585 0.012417 0.096150
-v 0.001108 0.012417 0.099560
-v -0.002900 0.012417 0.098257
-v 0.002900 0.012417 0.098257
-v 0.003585 0.012417 0.096150
-v -0.001108 0.012417 0.099560
-v -0.001108 0.012417 0.092741
-v 0.002900 0.012417 0.094043
-v -0.002900 0.012417 0.094043
-v 0.000955 0.012417 0.093211
-v -0.003090 0.012417 0.096150
-v 0.000955 0.012417 0.099090
-v -0.002500 0.012417 0.097967
-v 0.002500 0.012417 0.097967
-v 0.003090 0.012417 0.096150
-v -0.000955 0.012417 0.099090
-v -0.000955 0.012417 0.093211
-v 0.002500 0.012417 0.094334
-v -0.002500 0.012417 0.094334
-vt 0.932232 0.937151
-vt 0.945647 0.941314
-vt 0.825593 0.923815
-vt 0.788802 0.909064
-vt 0.935598 0.930484
-vt 0.909311 0.932196
-vt 0.907009 0.929014
-vt 0.922229 0.927744
-vt 0.923371 0.959651
-vt 0.926270 0.980012
-vt 0.923981 0.964843
-vt 0.907571 0.956084
-vt 0.910064 0.946637
-vt 0.932187 0.961332
-vt 0.913791 0.964746
-vt 0.931115 0.938999
-vt 0.906593 0.976987
-vt 0.814667 0.938118
-vt 0.907941 0.945842
-vt 0.817792 0.929265
-vt 0.924220 0.967204
-vt 0.899768 0.959058
-vt 0.834177 0.952426
-vt 0.841570 0.947355
-vt 0.817336 0.900595
-vt 0.797907 0.915598
-vt 0.841862 0.947586
-vt 0.797489 0.962416
-vt 0.863053 0.962016
-vt 0.842840 0.976907
-vt 0.845500 0.938935
-vt 0.900358 0.943670
-vt 0.896353 0.942255
-vt 0.950018 0.956861
-vt 0.914874 0.948129
-vt 0.914648 0.953699
-vt 0.937578 0.926986
-vt 0.925672 0.975465
-vt 0.931991 0.947345
-vt 0.825215 0.952174
-vt 0.842325 0.930150
-vt 0.842016 0.930356
-vt 0.834916 0.924929
-vt 0.844928 0.938934
-vt 0.844556 0.938918
-vt 0.830059 0.938555
-vt 0.790654 0.938738
-vt 0.933703 0.963036
-vt 0.936911 0.954039
-vt 0.813826 0.890060
-vt 0.797202 0.915105
-vt 0.861850 0.915045
-vt 0.817977 0.976306
-vt 0.798179 0.961897
-vt 0.789797 0.938756
-vt 0.842554 0.976087
-vt 0.841940 0.901082
-vt 0.845641 0.890060
-vt 0.950018 0.939483
-vt 0.932035 0.952826
-vt 0.835221 0.924030
-vt 0.909829 0.955422
-vt 0.895358 0.960445
-vt 0.915261 0.939767
-vt 0.923140 0.936945
-vt 0.936417 0.945527
-vt 0.938885 0.954567
-vt 0.909516 0.972375
-vt 0.817813 0.946906
-vt 0.818124 0.946700
-vt 0.917914 0.958206
-vt 0.923549 0.941808
-vt 0.928754 0.943094
-vt 0.846431 0.987663
-vt 0.870407 0.938130
-vt 0.817616 0.901404
-vt 0.842181 0.900257
-vt 0.862534 0.914520
-vt 0.869546 0.938152
-vt 0.834277 0.952786
-vt 0.862338 0.961524
-vt 0.923050 0.934996
-vt 0.915227 0.962597
-vt 0.946468 0.956010
-vt 0.928741 0.957476
-vt 0.922006 0.924371
-vt 0.939379 0.968571
-vt 0.918286 0.943618
-vt 0.942241 0.971610
-vt 0.814114 0.987501
-vt 0.788568 0.968560
-vt 0.779102 0.938526
-vt 0.870794 0.908363
-vt 0.881150 0.937707
-vt 0.834453 0.953332
-vt 0.824904 0.953069
-vt 0.842788 0.929814
-vt 0.842325 0.947924
-vt 0.817349 0.947240
-vt 0.835045 0.924577
-vt 0.825883 0.924738
-vt 0.815235 0.938118
-vt 0.818251 0.929599
-vt 0.818529 0.929812
-vt 0.815603 0.938133
-vt 0.825771 0.924361
-vt 0.825084 0.952524
-vt 0.938637 0.944674
-vt 0.914016 0.937979
-vt 0.872150 0.968124
-vt 0.817725 0.977137
-vn -0.765269 0.643711 0.000000
-vn -0.619128 0.643727 0.449773
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.619128 0.643727 0.449773
-vn -0.236496 0.643720 0.727801
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.236462 0.643710 -0.727821
-vn -0.619120 0.643718 -0.449797
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.619120 0.643718 -0.449797
-vn 0.236462 0.643710 -0.727821
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.236496 0.643720 0.727801
-vn 0.619128 0.643727 0.449773
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.236462 0.643710 -0.727821
-vn -0.236462 0.643710 -0.727821
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.619128 0.643727 0.449773
-vn 0.765269 0.643711 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.236496 0.643720 0.727801
-vn 0.236496 0.643720 0.727801
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.619120 0.643718 -0.449797
-vn -0.765269 0.643711 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.765269 0.643711 0.000000
-vn 0.619120 0.643718 -0.449797
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -0.621130 0.783707 0.000000
-vn -0.502506 0.783714 -0.365076
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 0.000000 -0.587767
-vn 0.191936 0.783706 -0.590733
-vn 0.502506 0.783714 -0.365076
-vn 0.309041 -0.000000 0.951049
-vn -0.309041 -0.000000 0.951049
-vn 0.191935 0.783732 0.590698
-vn -0.191935 0.783732 0.590698
-vn -0.309041 -0.000000 0.951049
-vn -0.809045 -0.000000 0.587747
-vn -0.191935 0.783732 0.590698
-vn -0.502529 0.783702 0.365070
-vn 0.809045 -0.000000 0.587747
-vn 0.309041 -0.000000 0.951049
-vn 0.502529 0.783702 0.365070
-vn 0.191935 0.783732 0.590698
-vn -0.809045 -0.000000 0.587747
-vn -1.000000 0.000000 0.000000
-vn -0.502529 0.783702 0.365070
-vn -0.621130 0.783707 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn -0.502506 0.783714 -0.365076
-vn -0.191936 0.783706 -0.590733
-vn 0.809030 0.000000 -0.587767
-vn 1.000000 0.000000 0.000000
-vn 0.502506 0.783714 -0.365076
-vn 0.621130 0.783707 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.809045 -0.000000 0.587747
-vn 0.621130 0.783707 0.000000
-vn 0.502529 0.783702 0.365070
-vn -0.309004 0.000000 -0.951061
-vn 0.309004 0.000000 -0.951061
-vn -0.191936 0.783706 -0.590733
-vn 0.191936 0.783706 -0.590733
-vn 0.191936 0.783706 -0.590733
-vn 0.502506 0.783714 -0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.191935 0.783732 0.590698
-vn -0.191935 0.783732 0.590698
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.191935 0.783732 0.590698
-vn -0.502529 0.783702 0.365070
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.502506 0.783714 -0.365076
-vn -0.191936 0.783706 -0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.502529 0.783702 0.365070
-vn -0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.502529 0.783702 0.365070
-vn 0.191935 0.783732 0.590698
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.191936 0.783706 -0.590733
-vn 0.191936 0.783706 -0.590733
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.621130 0.783707 0.000000
-vn 0.502529 0.783702 0.365070
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.502506 0.783714 -0.365076
-vn 0.621130 0.783707 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.621130 0.783707 0.000000
-vn -0.502506 0.783714 -0.365076
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.236462 0.643710 -0.727821
-vn 0.236462 0.643710 -0.727821
-vn -0.309004 0.000000 -0.951061
-vn 0.309004 0.000000 -0.951061
-vn 0.765269 0.643711 0.000000
-vn 0.619128 0.643727 0.449773
-vn 1.000000 0.000000 0.000000
-vn 0.809045 -0.000000 0.587747
-vn 0.619120 0.643718 -0.449797
-vn 0.765269 0.643711 0.000000
-vn 0.809030 0.000000 -0.587767
-vn 1.000000 0.000000 0.000000
-vn -0.619120 0.643718 -0.449797
-vn -0.236462 0.643710 -0.727821
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn -0.619128 0.643727 0.449773
-vn -0.765269 0.643711 0.000000
-vn -0.809045 -0.000000 0.587747
-vn -1.000000 0.000000 0.000000
-vn 0.619128 0.643727 0.449773
-vn 0.236496 0.643720 0.727801
-vn 0.809045 -0.000000 0.587747
-vn 0.309041 -0.000000 0.951049
-vn -0.236496 0.643720 0.727801
-vn -0.619128 0.643727 0.449773
-vn -0.309041 -0.000000 0.951049
-vn -0.809045 -0.000000 0.587747
-vn 0.236496 0.643720 0.727801
-vn -0.236496 0.643720 0.727801
-vn 0.309041 -0.000000 0.951049
-vn -0.309041 -0.000000 0.951049
-vn 0.236462 0.643710 -0.727821
-vn 0.619120 0.643718 -0.449797
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 0.000000 -0.587767
-vn -0.765269 0.643711 0.000000
-vn -0.619120 0.643718 -0.449797
-vn -1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn 0.309004 0.000000 -0.951061
-vn -0.309004 0.000000 -0.951061
-vn 0.309004 0.000000 -0.951061
-vn 1.000000 0.000000 0.000000
-vn 0.809045 -0.000000 0.587747
-vn 1.000000 0.000000 0.000000
-vn 0.809045 -0.000000 0.587747
-vn 0.809030 0.000000 -0.587767
-vn 1.000000 0.000000 0.000000
-vn 0.809030 0.000000 -0.587767
-vn 1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn -0.809030 0.000000 -0.587767
-vn -0.309004 0.000000 -0.951061
-vn -0.809045 -0.000000 0.587747
-vn -1.000000 0.000000 0.000000
-vn -0.809045 -0.000000 0.587747
-vn -1.000000 0.000000 0.000000
-vn 0.809045 -0.000000 0.587747
-vn 0.309041 -0.000000 0.951049
-vn 0.809045 -0.000000 0.587747
-vn 0.309041 -0.000000 0.951049
-vn -0.309041 -0.000000 0.951049
-vn -0.809045 -0.000000 0.587747
-vn -0.309041 -0.000000 0.951049
-vn -0.809045 -0.000000 0.587747
-vn 0.309041 -0.000000 0.951049
-vn -0.309041 -0.000000 0.951049
-vn 0.309041 -0.000000 0.951049
-vn -0.309041 -0.000000 0.951049
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 0.000000 -0.587767
-vn 0.309004 0.000000 -0.951061
-vn 0.809030 0.000000 -0.587767
-vn -1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn -1.000000 0.000000 0.000000
-vn -0.809030 0.000000 -0.587767
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.000000 1.000000 0.000000
-vn -0.000000 1.000000 0.000000
-vn -0.000000 1.000000 0.000000
-vn -0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.000000 1.000000 0.000000
-vn -0.000000 1.000000 0.000000
-vn -0.000000 1.000000 0.000000
-vn -0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn -0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.587858 0.000000 -0.808964
-vn 0.587858 0.000000 -0.808964
-vn 0.587858 0.000000 -0.808964
-vn 0.587858 0.000000 -0.808964
-vn 0.951057 -0.000000 0.309014
-vn 0.951057 -0.000000 0.309014
-vn 0.951057 -0.000000 0.309014
-vn 0.951057 -0.000000 0.309014
-vn -0.587858 0.000000 -0.808964
-vn -0.587858 0.000000 -0.808964
-vn -0.587858 0.000000 -0.808964
-vn -0.587858 0.000000 -0.808964
-vn 0.951058 0.000000 -0.309013
-vn 0.951058 0.000000 -0.309013
-vn 0.951058 0.000000 -0.309013
-vn 0.951058 0.000000 -0.309013
-vn -0.587785 0.000000 -0.809017
-vn -0.587785 0.000000 -0.809017
-vn -0.587785 0.000000 -0.809017
-vn -0.587785 0.000000 -0.809017
-vn 0.951057 0.000000 -0.309014
-vn 0.951057 0.000000 -0.309014
-vn 0.951057 0.000000 -0.309014
-vn 0.951057 0.000000 -0.309014
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn -0.951057 0.000000 -0.309014
-vn -0.951057 0.000000 -0.309014
-vn -0.951057 0.000000 -0.309014
-vn -0.951057 0.000000 -0.309014
-vn 0.587785 0.000000 -0.809017
-vn 0.587785 0.000000 -0.809017
-vn 0.587785 0.000000 -0.809017
-vn 0.587785 0.000000 -0.809017
-vn -0.951058 0.000000 -0.309013
-vn -0.951058 0.000000 -0.309013
-vn -0.951058 0.000000 -0.309013
-vn -0.951058 0.000000 -0.309013
-vn -0.951058 -0.000000 0.309012
-vn -0.951058 -0.000000 0.309012
-vn -0.951058 -0.000000 0.309012
-vn -0.951058 -0.000000 0.309012
-vn 0.587785 -0.000000 0.809018
-vn 0.587785 -0.000000 0.809018
-vn 0.587785 -0.000000 0.809018
-vn 0.587785 -0.000000 0.809018
-vn -0.587857 -0.000000 0.808965
-vn -0.587857 -0.000000 0.808965
-vn -0.587857 -0.000000 0.808965
-vn -0.587857 -0.000000 0.808965
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.000000 -0.000000 1.000000
-vn 0.587857 -0.000000 0.808965
-vn 0.587857 -0.000000 0.808965
-vn 0.587857 -0.000000 0.808965
-vn 0.587857 -0.000000 0.808965
-vn -0.587785 -0.000000 0.809018
-vn -0.587785 -0.000000 0.809018
-vn -0.587785 -0.000000 0.809018
-vn -0.587785 -0.000000 0.809018
-vn 0.951058 -0.000000 0.309012
-vn 0.951058 -0.000000 0.309012
-vn 0.951058 -0.000000 0.309012
-vn 0.951058 -0.000000 0.309012
-vn -0.951057 -0.000000 0.309014
-vn -0.951057 -0.000000 0.309014
-vn -0.951057 -0.000000 0.309014
-vn -0.951057 -0.000000 0.309014
-f 2/102/1 4/103/2 12/105/3
-f 12/105/3 4/103/2 14/104/4
-f 4/103/5 7/106/6 14/104/7
-f 14/104/7 7/106/6 17/101/8
-f 8/107/9 10/69/10 18/40/11
-f 18/40/11 10/69/10 20/70/12
-f 9/27/13 1/80/14 19/24/15
-f 19/24/15 1/80/14 11/23/16
-f 3/100/17 5/41/18 13/43/19
-f 13/43/19 5/41/18 15/42/20
-f 1/80/21 8/107/22 11/23/23
-f 11/23/23 8/107/22 18/40/24
-f 5/41/25 6/44/26 15/42/27
-f 15/42/27 6/44/26 16/45/28
-f 7/106/29 3/100/30 17/101/31
-f 17/101/31 3/100/30 13/43/32
-f 10/69/33 2/102/34 20/70/35
-f 20/70/35 2/102/34 12/105/36
-f 6/44/37 9/27/38 16/45/39
-f 16/45/39 9/27/38 19/24/40
-f 12/105/41 14/104/42 21/46/43
-f 18/40/44 20/70/45 21/46/46
-f 14/104/47 17/101/48 21/46/49
-f 13/43/50 15/42/51 21/46/52
-f 15/42/53 16/45/54 21/46/55
-f 17/101/56 13/43/57 21/46/58
-f 16/45/59 19/24/60 21/46/61
-f 19/24/62 11/23/63 21/46/64
-f 11/23/65 18/40/66 21/46/67
-f 20/70/68 12/105/69 21/46/70
-f 53/47/71 58/54/72 23/55/73
-f 23/55/73 58/54/72 31/28/74
-f 55/56/75 59/81/76 22/30/77
-f 22/30/77 59/81/76 30/29/78
-f 52/57/79 56/76/80 24/77/81
-f 24/77/81 56/76/80 28/25/82
-f 56/76/83 57/26/84 28/25/85
-f 28/25/85 57/26/84 25/51/86
-f 54/52/87 52/57/88 26/78/89
-f 26/78/89 52/57/88 24/77/90
-f 57/26/91 53/47/92 25/51/93
-f 25/51/93 53/47/92 23/55/94
-f 58/54/95 61/53/96 31/28/97
-f 31/28/97 61/53/96 29/111/98
-f 59/81/99 60/79/100 30/29/101
-f 30/29/101 60/79/100 27/75/102
-f 60/79/103 54/52/104 27/75/105
-f 27/75/105 54/52/104 26/78/106
-f 61/53/107 55/56/108 29/111/109
-f 29/111/109 55/56/108 22/30/110
-f 22/30/111 30/29/112 32/74/113
-f 32/74/113 30/29/112 40/110/114
-f 24/77/115 28/25/116 34/58/117
-f 34/58/117 28/25/116 38/50/118
-f 28/25/119 25/51/120 38/50/121
-f 38/50/121 25/51/120 35/4/122
-f 31/28/123 29/111/124 41/91/125
-f 41/91/125 29/111/124 39/90/126
-f 25/51/127 23/55/128 35/4/129
-f 35/4/129 23/55/128 33/92/130
-f 26/78/131 24/77/132 36/93/133
-f 36/93/133 24/77/132 34/58/134
-f 29/111/135 22/30/136 39/90/137
-f 39/90/137 22/30/136 32/74/138
-f 27/75/139 26/78/140 37/94/141
-f 37/94/141 26/78/140 36/93/142
-f 30/29/143 27/75/144 40/110/145
-f 40/110/145 27/75/144 37/94/146
-f 23/55/147 31/28/148 33/92/149
-f 33/92/149 31/28/148 41/91/150
-f 8/107/151 1/80/152 50/96/153
-f 50/96/153 1/80/152 51/95/154
-f 6/44/155 5/41/156 48/31/157
-f 48/31/157 5/41/156 49/97/158
-f 9/27/159 6/44/160 47/98/161
-f 47/98/161 6/44/160 48/31/162
-f 10/69/163 8/107/164 46/99/165
-f 46/99/165 8/107/164 50/96/166
-f 4/103/167 2/102/168 44/20/169
-f 44/20/169 2/102/168 45/18/170
-f 5/41/171 3/100/172 49/97/173
-f 49/97/173 3/100/172 43/61/174
-f 7/106/175 4/103/176 42/3/177
-f 42/3/177 4/103/176 44/20/178
-f 3/100/179 7/106/180 43/61/181
-f 43/61/181 7/106/180 42/3/182
-f 1/80/183 9/27/184 51/95/185
-f 51/95/185 9/27/184 47/98/186
-f 2/102/187 10/69/188 45/18/189
-f 45/18/189 10/69/188 46/99/190
-f 50/96/191 51/95/192 61/53/193
-f 61/53/193 51/95/192 55/56/194
-f 48/31/195 49/97/196 60/79/197
-f 60/79/197 49/97/196 54/52/198
-f 47/98/199 48/31/200 59/81/201
-f 59/81/201 48/31/200 60/79/202
-f 46/99/203 50/96/204 58/54/205
-f 58/54/205 50/96/204 61/53/206
-f 44/20/207 45/18/208 57/26/209
-f 57/26/209 45/18/208 53/47/210
-f 49/97/211 43/61/212 54/52/213
-f 54/52/213 43/61/212 52/57/214
-f 42/3/215 44/20/216 56/76/217
-f 56/76/217 44/20/216 57/26/218
-f 43/61/219 42/3/220 52/57/221
-f 52/57/221 42/3/220 56/76/222
-f 51/95/223 47/98/224 55/56/225
-f 55/56/225 47/98/224 59/81/226
-f 45/18/227 46/99/228 53/47/229
-f 53/47/229 46/99/228 58/54/230
-f 62/15/231 69/12/232 72/83/233
-f 72/83/233 69/12/232 79/62/234
-f 64/108/235 74/66/236 68/1/237
-f 68/1/237 74/66/236 78/16/238
-f 63/109/239 65/82/240 73/64/241
-f 73/64/241 65/82/240 75/65/242
-f 63/109/243 73/64/244 71/19/245
-f 71/19/245 73/64/244 81/13/246
-f 62/15/247 72/83/248 70/21/249
-f 70/21/249 72/83/248 80/11/250
-f 66/67/251 67/48/252 76/49/253
-f 76/49/253 67/48/252 77/14/254
-f 65/82/255 68/1/256 75/65/257
-f 75/65/257 68/1/256 78/16/258
-f 69/12/259 71/19/260 79/62/261
-f 79/62/261 71/19/260 81/13/262
-f 67/48/263 70/21/264 77/14/265
-f 77/14/265 70/21/264 80/11/266
-f 64/108/267 66/67/268 74/66/269
-f 74/66/269 66/67/268 76/49/270
-f 82/68/271 92/17/272 89/22/273
-f 89/22/273 92/17/272 99/63/274
-f 84/2/275 88/5/276 94/59/277
-f 94/59/277 88/5/276 98/37/278
-f 83/6/279 93/7/280 85/8/281
-f 85/8/281 93/7/280 95/86/282
-f 83/6/283 91/32/284 93/7/285
-f 93/7/285 91/32/284 101/33/286
-f 82/68/287 90/38/288 92/17/289
-f 92/17/289 90/38/288 100/10/290
-f 86/84/291 96/34/292 87/87/293
-f 87/87/293 96/34/292 97/89/294
-f 85/8/295 95/86/296 88/5/297
-f 88/5/297 95/86/296 98/37/298
-f 89/22/299 99/63/300 91/32/301
-f 91/32/301 99/63/300 101/33/302
-f 87/87/303 97/89/304 90/38/305
-f 90/38/305 97/89/304 100/10/306
-f 84/2/307 94/59/308 86/84/309
-f 86/84/309 94/59/308 96/34/310
-f 75/65/311 78/16/312 95/72/313
-f 95/72/313 78/16/312 98/73/314
-f 67/48/315 66/67/316 87/87/317
-f 87/87/317 66/67/316 86/84/318
-f 74/66/319 76/49/320 94/39/321
-f 94/39/321 76/49/320 96/60/322
-f 70/21/323 67/48/324 90/38/325
-f 90/38/325 67/48/324 87/87/326
-f 71/19/327 69/12/328 91/32/329
-f 91/32/329 69/12/328 89/22/330
-f 73/64/331 75/65/332 93/88/333
-f 93/88/333 75/65/332 95/72/334
-f 64/108/335 68/1/336 84/2/337
-f 84/2/337 68/1/336 88/5/338
-f 69/12/339 62/15/340 89/22/341
-f 89/22/341 62/15/340 82/68/342
-f 76/49/343 77/14/344 96/60/345
-f 96/60/345 77/14/344 97/85/346
-f 62/15/347 70/21/348 82/68/349
-f 82/68/349 70/21/348 90/38/350
-f 63/109/351 71/19/352 83/6/353
-f 83/6/353 71/19/352 91/32/354
-f 77/14/355 80/11/356 97/85/357
-f 97/85/357 80/11/356 100/9/358
-f 79/62/359 81/13/360 99/36/361
-f 99/36/361 81/13/360 101/35/362
-f 68/1/363 65/82/364 88/5/365
-f 88/5/365 65/82/364 85/8/366
-f 78/16/367 74/66/368 98/73/369
-f 98/73/369 74/66/368 94/39/370
-f 72/83/371 79/62/372 92/71/373
-f 92/71/373 79/62/372 99/36/374
-f 66/67/375 64/108/376 86/84/377
-f 86/84/377 64/108/376 84/2/378
-f 80/11/379 72/83/380 100/9/381
-f 100/9/381 72/83/380 92/71/382
-f 81/13/383 73/64/384 101/35/385
-f 101/35/385 73/64/384 93/88/386
-f 65/82/387 63/109/388 85/8/389
-f 85/8/389 63/109/388 83/6/390
diff --git a/libs/vr/libdvrgraphics/assets/controller_proto2_joystick.obj b/libs/vr/libdvrgraphics/assets/controller_proto2_joystick.obj
deleted file mode 100644
index c4daae3..0000000
--- a/libs/vr/libdvrgraphics/assets/controller_proto2_joystick.obj
+++ /dev/null
@@ -1,556 +0,0 @@
-# This file uses centimeters as units for non-parametric coordinates.
-
-v 0.013683 0.008414 0.043000
-v 0.013683 0.013400 0.058800
-v 0.013683 0.008414 0.058800
-v 0.013683 0.013400 0.043000
-v -0.013683 0.013400 0.043000
-v -0.015800 0.013400 0.050900
-v 0.007900 0.013400 0.064583
-v 0.015800 0.013400 0.050900
-v -0.013683 0.013400 0.058800
-v -0.007900 0.013400 0.064583
-v -0.000000 0.013400 0.066700
-v 0.007900 0.013400 0.037217
-v 0.000000 0.013400 0.035100
-v -0.007900 0.013400 0.037217
-v 0.013247 0.013400 0.058548
-v 0.013247 0.013400 0.043252
-v -0.013247 0.013400 0.043252
-v -0.015297 0.013400 0.050900
-v 0.007648 0.013400 0.064148
-v 0.015297 0.013400 0.050900
-v -0.013247 0.013400 0.058548
-v -0.007648 0.013400 0.064148
-v -0.000000 0.013400 0.066197
-v 0.007648 0.013400 0.037652
-v 0.000000 0.013400 0.035603
-v -0.007648 0.013400 0.037652
-v 0.000000 0.013400 0.050900
-v -0.013683 0.008414 0.043000
-v -0.015800 0.008414 0.050900
-v 0.007900 0.008414 0.064583
-v 0.015800 0.008414 0.050900
-v -0.013683 0.008414 0.058800
-v -0.007900 0.008414 0.064583
-v -0.000000 0.008414 0.066700
-v 0.007900 0.008414 0.037217
-v 0.000000 0.008414 0.035100
-v -0.007900 0.008414 0.037217
-v 0.015123 0.008414 0.042169
-v 0.015123 0.008414 0.059631
-v -0.015123 0.008414 0.042169
-v -0.017462 0.008414 0.050900
-v 0.008731 0.008414 0.066023
-v 0.017462 0.008414 0.050900
-v -0.015123 0.008414 0.059631
-v -0.008731 0.008414 0.066023
-v -0.000000 0.008414 0.068362
-v 0.008731 0.008414 0.035777
-v 0.000000 0.008414 0.033438
-v -0.008731 0.008414 0.035777
-v -0.007900 0.013082 0.037217
-v 0.000000 0.013082 0.035100
-v 0.007900 0.013082 0.037217
-v -0.000000 0.013082 0.066700
-v -0.007900 0.013082 0.064583
-v -0.013683 0.013082 0.058800
-v 0.013683 0.013082 0.043000
-v 0.015800 0.013082 0.050900
-v 0.013683 0.013082 0.058800
-v 0.007900 0.013082 0.064583
-v -0.015800 0.013082 0.050900
-v -0.013683 0.013082 0.043000
-v -0.007900 0.008785 0.064583
-v 0.015800 0.008785 0.050900
-v 0.007900 0.008785 0.064583
-v -0.013683 0.008785 0.043000
-v -0.007900 0.008785 0.037217
-v 0.000000 0.008785 0.035100
-v 0.007900 0.008785 0.037217
-v -0.000000 0.008785 0.066700
-v -0.013683 0.008785 0.058800
-v 0.013683 0.008785 0.043000
-v 0.013683 0.008785 0.058800
-v -0.015800 0.008785 0.050900
-vt 0.598611 0.792613
-vt 0.581181 0.842714
-vt 0.572095 0.840361
-vt 0.583337 0.843249
-vt 0.583900 0.891691
-vt 0.740650 0.932332
-vt 0.764677 0.890275
-vt 0.764114 0.841833
-vt 0.623873 0.817102
-vt 0.649036 0.776482
-vt 0.607278 0.849202
-vt 0.609406 0.849762
-vt 0.609695 0.884296
-vt 0.626984 0.914208
-vt 0.624971 0.818153
-vt 0.626666 0.819833
-vt 0.740622 0.848600
-vt 0.740736 0.884322
-vt 0.738608 0.883762
-vt 0.738319 0.849228
-vt 0.742081 0.848175
-vt 0.605933 0.885349
-vt 0.698978 0.957041
-vt 0.724141 0.916422
-vt 0.650543 0.957262
-vt 0.691947 0.798514
-vt 0.742213 0.884683
-vt 0.697472 0.776262
-vt 0.657036 0.931225
-vt 0.691585 0.931208
-vt 0.625435 0.915771
-vt 0.747828 0.791704
-vt 0.766832 0.890810
-vt 0.766241 0.841221
-vt 0.775920 0.838541
-vt 0.775919 0.893164
-vt 0.741246 0.798397
-vt 0.607392 0.884924
-vt 0.739706 0.799996
-vt 0.723631 0.816655
-vt 0.655425 0.798733
-vt 0.650009 0.959409
-vt 0.647491 0.969131
-vt 0.648421 0.774349
-vt 0.700524 0.764393
-vt 0.674007 0.866762
-vt 0.699593 0.959175
-vt 0.742243 0.933868
-vt 0.749403 0.940910
-vt 0.702098 0.968221
-vt 0.581773 0.892303
-vt 0.606768 0.935127
-vt 0.600187 0.941819
-vt 0.572095 0.894983
-vt 0.698005 0.774114
-vt 0.607364 0.801191
-vt 0.692589 0.934791
-vt 0.656067 0.935009
-vt 0.608309 0.933528
-vt 0.605801 0.848841
-vt 0.624384 0.916869
-vt 0.692164 0.933331
-vt 0.656428 0.933533
-vt 0.655850 0.800192
-vt 0.691586 0.799991
-vt 0.690978 0.802299
-vt 0.656429 0.802316
-vt 0.723043 0.915371
-vt 0.721348 0.913691
-vt 0.722579 0.817753
-vt 0.721030 0.819316
-vt 0.645916 0.765302
-vt 0.605771 0.799655
-vn 0.552274 0.770272 0.318864
-vn 0.318864 0.770272 0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.318864 0.770272 0.552274
-vn 0.000000 0.770266 0.637723
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.378558 0.653230 -0.655732
-vn -0.655715 0.653243 -0.378566
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.655715 0.653243 -0.378566
-vn 0.378558 0.653230 -0.655732
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.378558 0.653230 -0.655732
-vn 0.000000 0.653236 -0.757154
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.653236 -0.757154
-vn -0.378558 0.653230 -0.655732
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.655715 0.653243 -0.378566
-vn -0.757167 0.653221 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.378558 0.653230 0.655732
-vn 0.655715 0.653243 0.378566
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.655715 0.653243 0.378566
-vn -0.378558 0.653230 0.655732
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.757167 0.653221 0.000000
-vn 0.655715 0.653243 -0.378566
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.653236 0.757154
-vn 0.378558 0.653230 0.655732
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.378558 0.653230 0.655732
-vn 0.000000 0.653236 0.757154
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.655715 0.653243 0.378566
-vn 0.757167 0.653221 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.757167 0.653221 0.000000
-vn -0.655715 0.653243 0.378566
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.552274 0.770272 -0.318864
-vn 0.637723 0.770266 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.318864 0.770272 -0.552274
-vn 0.000000 0.770266 -0.637723
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.770266 0.637723
-vn -0.318864 0.770272 0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.318864 0.770272 -0.552274
-vn 0.552274 0.770272 -0.318864
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.318864 0.770272 0.552274
-vn -0.552274 0.770272 0.318864
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.552274 0.770272 0.318864
-vn -0.637723 0.770266 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.552274 0.770272 -0.318864
-vn -0.318864 0.770272 -0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.637723 0.770266 0.000000
-vn 0.552274 0.770272 0.318864
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn 0.000000 0.770266 -0.637723
-vn 0.318864 0.770272 -0.552274
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.637723 0.770266 0.000000
-vn -0.552274 0.770272 -0.318864
-vn 0.000000 1.000000 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.866032 0.000000 -0.499989
-vn -0.499989 0.000000 -0.866032
-vn -0.552274 0.770272 -0.318864
-vn -0.318864 0.770272 -0.552274
-vn 1.000000 0.000000 0.000000
-vn 0.866032 -0.000000 0.499989
-vn 0.637723 0.770266 0.000000
-vn 0.552274 0.770272 0.318864
-vn 0.499989 -0.000000 0.866032
-vn 0.000000 -0.000000 1.000000
-vn 0.318864 0.770272 0.552274
-vn 0.000000 0.770266 0.637723
-vn -0.499989 0.000000 -0.866032
-vn 0.000000 0.000000 -1.000000
-vn -0.318864 0.770272 -0.552274
-vn 0.000000 0.770266 -0.637723
-vn 0.000000 0.000000 -1.000000
-vn 0.499989 0.000000 -0.866032
-vn 0.000000 0.770266 -0.637723
-vn 0.318864 0.770272 -0.552274
-vn 0.499989 0.000000 -0.866032
-vn 0.866032 0.000000 -0.499989
-vn 0.318864 0.770272 -0.552274
-vn 0.552274 0.770272 -0.318864
-vn -0.499989 -0.000000 0.866032
-vn -0.866032 -0.000000 0.499989
-vn -0.318864 0.770272 0.552274
-vn -0.552274 0.770272 0.318864
-vn 0.000000 -0.000000 1.000000
-vn -0.499989 -0.000000 0.866032
-vn 0.000000 0.770266 0.637723
-vn -0.318864 0.770272 0.552274
-vn -0.866032 -0.000000 0.499989
-vn -1.000000 0.000000 0.000000
-vn -0.552274 0.770272 0.318864
-vn -0.637723 0.770266 0.000000
-vn 0.866032 0.000000 -0.499989
-vn 1.000000 0.000000 0.000000
-vn 0.552274 0.770272 -0.318864
-vn 0.637723 0.770266 0.000000
-vn 0.866032 -0.000000 0.499989
-vn 0.499989 -0.000000 0.866032
-vn 0.552274 0.770272 0.318864
-vn 0.318864 0.770272 0.552274
-vn -1.000000 0.000000 0.000000
-vn -0.866032 0.000000 -0.499989
-vn -0.637723 0.770266 0.000000
-vn -0.552274 0.770272 -0.318864
-vn -0.757167 0.653221 0.000000
-vn -0.655715 0.653243 -0.378566
-vn -1.000000 0.000000 0.000000
-vn -0.866032 0.000000 -0.499989
-vn 0.655715 0.653243 0.378566
-vn 0.378558 0.653230 0.655732
-vn 0.866032 -0.000000 0.499989
-vn 0.499989 -0.000000 0.866032
-vn 0.655715 0.653243 -0.378566
-vn 0.757167 0.653221 0.000000
-vn 0.866032 0.000000 -0.499989
-vn 1.000000 0.000000 0.000000
-vn -0.655715 0.653243 0.378566
-vn -0.757167 0.653221 0.000000
-vn -0.866032 -0.000000 0.499989
-vn -1.000000 0.000000 0.000000
-vn 0.000000 0.653236 0.757154
-vn -0.378558 0.653230 0.655732
-vn 0.000000 -0.000000 1.000000
-vn -0.499989 -0.000000 0.866032
-vn -0.378558 0.653230 0.655732
-vn -0.655715 0.653243 0.378566
-vn -0.499989 -0.000000 0.866032
-vn -0.866032 -0.000000 0.499989
-vn 0.378558 0.653230 -0.655732
-vn 0.655715 0.653243 -0.378566
-vn 0.499989 0.000000 -0.866032
-vn 0.866032 0.000000 -0.499989
-vn 0.000000 0.653236 -0.757154
-vn 0.378558 0.653230 -0.655732
-vn 0.000000 0.000000 -1.000000
-vn 0.499989 0.000000 -0.866032
-vn -0.378558 0.653230 -0.655732
-vn 0.000000 0.653236 -0.757154
-vn -0.499989 0.000000 -0.866032
-vn 0.000000 0.000000 -1.000000
-vn 0.378558 0.653230 0.655732
-vn 0.000000 0.653236 0.757154
-vn 0.499989 -0.000000 0.866032
-vn 0.000000 -0.000000 1.000000
-vn 0.757167 0.653221 0.000000
-vn 0.655715 0.653243 0.378566
-vn 1.000000 0.000000 0.000000
-vn 0.866032 -0.000000 0.499989
-vn -0.655715 0.653243 -0.378566
-vn -0.378558 0.653230 -0.655732
-vn -0.866032 0.000000 -0.499989
-vn -0.499989 0.000000 -0.866032
-vn -1.000000 0.000000 0.000000
-vn -0.866032 0.000000 -0.499989
-vn -1.000000 0.000000 0.000000
-vn -0.866032 0.000000 -0.499989
-vn 0.866032 -0.000000 0.499989
-vn 0.499989 -0.000000 0.866032
-vn 0.866032 -0.000000 0.499989
-vn 0.499989 -0.000000 0.866032
-vn 0.866032 0.000000 -0.499989
-vn 1.000000 0.000000 0.000000
-vn 0.866032 0.000000 -0.499989
-vn 1.000000 0.000000 0.000000
-vn -0.866032 -0.000000 0.499989
-vn -1.000000 0.000000 0.000000
-vn -0.866032 -0.000000 0.499989
-vn -1.000000 0.000000 0.000000
-vn 0.000000 -0.000000 1.000000
-vn -0.499989 -0.000000 0.866032
-vn 0.000000 -0.000000 1.000000
-vn -0.499989 -0.000000 0.866032
-vn -0.499989 -0.000000 0.866032
-vn -0.866032 -0.000000 0.499989
-vn -0.499989 -0.000000 0.866032
-vn -0.866032 -0.000000 0.499989
-vn 0.499989 0.000000 -0.866032
-vn 0.866032 0.000000 -0.499989
-vn 0.499989 0.000000 -0.866032
-vn 0.866032 0.000000 -0.499989
-vn 0.000000 0.000000 -1.000000
-vn 0.499989 0.000000 -0.866032
-vn 0.000000 0.000000 -1.000000
-vn 0.499989 0.000000 -0.866032
-vn -0.499989 0.000000 -0.866032
-vn 0.000000 0.000000 -1.000000
-vn -0.499989 0.000000 -0.866032
-vn 0.000000 0.000000 -1.000000
-vn 0.499989 -0.000000 0.866032
-vn 0.000000 -0.000000 1.000000
-vn 0.499989 -0.000000 0.866032
-vn 0.000000 -0.000000 1.000000
-vn 1.000000 0.000000 0.000000
-vn 0.866032 -0.000000 0.499989
-vn 1.000000 0.000000 0.000000
-vn 0.866032 -0.000000 0.499989
-vn -0.866032 0.000000 -0.499989
-vn -0.499989 0.000000 -0.866032
-vn -0.866032 0.000000 -0.499989
-vn -0.499989 0.000000 -0.866032
-f 3/33/1 30/34/2 39/36/3
-f 39/36/3 30/34/2 42/35/4
-f 30/34/5 34/37/6 42/35/7
-f 42/35/7 34/37/6 46/32/8
-f 14/38/9 5/11/10 26/13/11
-f 26/13/11 5/11/10 17/12/12
-f 4/62/13 12/63/14 16/30/15
-f 16/30/15 12/63/14 24/29/16
-f 12/63/17 13/31/18 24/29/19
-f 24/29/19 13/31/18 25/14/20
-f 13/31/21 14/38/22 25/14/23
-f 25/14/23 14/38/22 26/13/24
-f 5/11/25 6/15/26 17/12/27
-f 17/12/27 6/15/26 18/16/28
-f 7/17/29 2/18/30 19/20/31
-f 19/20/31 2/18/30 15/19/32
-f 9/64/33 10/65/34 21/67/35
-f 21/67/35 10/65/34 22/66/36
-f 8/68/37 4/62/38 20/69/39
-f 20/69/39 4/62/38 16/30/40
-f 11/70/41 7/17/42 23/71/43
-f 23/71/43 7/17/42 19/20/44
-f 10/65/45 11/70/46 22/66/47
-f 22/66/47 11/70/46 23/71/48
-f 2/18/49 8/68/50 15/19/51
-f 15/19/51 8/68/50 20/69/52
-f 6/15/53 9/64/54 18/16/55
-f 18/16/55 9/64/54 21/67/56
-f 20/69/57 16/30/58 27/46/59
-f 19/20/60 15/19/61 27/46/62
-f 16/30/63 24/29/64 27/46/65
-f 22/66/66 23/71/67 27/46/68
-f 21/67/69 22/66/70 27/46/71
-f 18/16/72 21/67/73 27/46/74
-f 23/71/75 19/20/76 27/46/77
-f 26/13/78 17/12/79 27/46/80
-f 24/29/81 25/14/82 27/46/83
-f 15/19/84 20/69/85 27/46/86
-f 17/12/87 18/16/88 27/46/89
-f 25/14/90 26/13/91 27/46/92
-f 1/47/93 31/48/94 38/50/95
-f 38/50/95 31/48/94 43/49/96
-f 37/51/97 36/52/98 49/54/99
-f 49/54/99 36/52/98 48/53/100
-f 34/37/101 33/55/102 46/32/103
-f 46/32/103 33/55/102 45/45/104
-f 35/42/105 1/47/106 47/43/107
-f 47/43/107 1/47/106 38/50/108
-f 33/55/109 32/44/110 45/45/111
-f 45/45/111 32/44/110 44/72/112
-f 32/44/113 29/73/114 44/72/115
-f 44/72/115 29/73/114 41/1/116
-f 28/2/117 37/51/118 40/3/119
-f 40/3/119 37/51/118 49/54/120
-f 31/48/121 3/33/122 43/49/123
-f 43/49/123 3/33/122 39/36/124
-f 36/52/125 35/42/126 48/53/127
-f 48/53/127 35/42/126 47/43/128
-f 29/73/129 28/2/130 41/1/131
-f 41/1/131 28/2/130 40/3/132
-f 65/4/133 66/5/134 28/2/135
-f 28/2/135 66/5/134 37/51/136
-f 63/6/137 72/7/138 31/48/139
-f 31/48/139 72/7/138 3/33/140
-f 64/8/141 69/39/142 30/34/143
-f 30/34/143 69/39/142 34/37/144
-f 66/5/145 67/59/146 37/51/147
-f 37/51/147 67/59/146 36/52/148
-f 67/59/149 68/25/150 36/52/151
-f 36/52/151 68/25/150 35/42/152
-f 68/25/153 71/23/154 35/42/155
-f 35/42/155 71/23/154 1/47/156
-f 62/28/157 70/10/158 33/55/159
-f 33/55/159 70/10/158 32/44/160
-f 69/39/161 62/28/162 34/37/163
-f 34/37/163 62/28/162 33/55/164
-f 70/10/165 73/56/166 32/44/167
-f 32/44/167 73/56/166 29/73/168
-f 71/23/169 63/6/170 1/47/171
-f 1/47/171 63/6/170 31/48/172
-f 72/7/173 64/8/174 3/33/175
-f 3/33/175 64/8/174 30/34/176
-f 73/56/177 65/4/178 29/73/179
-f 29/73/179 65/4/178 28/2/180
-f 6/15/181 5/11/182 60/9/183
-f 60/9/183 5/11/182 61/60/184
-f 2/18/185 7/17/186 58/27/187
-f 58/27/187 7/17/186 59/21/188
-f 4/62/189 8/68/190 56/57/191
-f 56/57/191 8/68/190 57/24/192
-f 9/64/193 6/15/194 55/41/195
-f 55/41/195 6/15/194 60/9/196
-f 11/70/197 10/65/198 53/40/199
-f 53/40/199 10/65/198 54/26/200
-f 10/65/201 9/64/202 54/26/203
-f 54/26/203 9/64/202 55/41/204
-f 12/63/205 4/62/206 52/58/207
-f 52/58/207 4/62/206 56/57/208
-f 13/31/209 12/63/210 51/61/211
-f 51/61/211 12/63/210 52/58/212
-f 14/38/213 13/31/214 50/22/215
-f 50/22/215 13/31/214 51/61/216
-f 7/17/217 11/70/218 59/21/219
-f 59/21/219 11/70/218 53/40/220
-f 8/68/221 2/18/222 57/24/223
-f 57/24/223 2/18/222 58/27/224
-f 5/11/225 14/38/226 61/60/227
-f 61/60/227 14/38/226 50/22/228
-f 60/9/229 61/60/230 73/56/231
-f 73/56/231 61/60/230 65/4/232
-f 58/27/233 59/21/234 72/7/235
-f 72/7/235 59/21/234 64/8/236
-f 56/57/237 57/24/238 71/23/239
-f 71/23/239 57/24/238 63/6/240
-f 55/41/241 60/9/242 70/10/243
-f 70/10/243 60/9/242 73/56/244
-f 53/40/245 54/26/246 69/39/247
-f 69/39/247 54/26/246 62/28/248
-f 54/26/249 55/41/250 62/28/251
-f 62/28/251 55/41/250 70/10/252
-f 52/58/253 56/57/254 68/25/255
-f 68/25/255 56/57/254 71/23/256
-f 51/61/257 52/58/258 67/59/259
-f 67/59/259 52/58/258 68/25/260
-f 50/22/261 51/61/262 66/5/263
-f 66/5/263 51/61/262 67/59/264
-f 59/21/265 53/40/266 64/8/267
-f 64/8/267 53/40/266 69/39/268
-f 57/24/269 58/27/270 63/6/271
-f 63/6/271 58/27/270 72/7/272
-f 61/60/273 50/22/274 65/4/275
-f 65/4/275 50/22/274 66/5/276
diff --git a/libs/vr/libdvrgraphics/assets/controller_proto2_trigger.obj b/libs/vr/libdvrgraphics/assets/controller_proto2_trigger.obj
deleted file mode 100644
index 7b87239..0000000
--- a/libs/vr/libdvrgraphics/assets/controller_proto2_trigger.obj
+++ /dev/null
@@ -1,1240 +0,0 @@
-# This file uses centimeters as units for non-parametric coordinates.
-
-v 0.012469 0.002342 0.063363
-v 0.009351 -0.007408 0.065472
-v 0.010658 -0.006647 0.065307
-v 0.006441 -0.008510 0.065710
-v 0.003284 -0.009190 0.065857
-v 0.012469 -0.001545 0.064204
-v 0.012469 -0.003489 0.064624
-v 0.012469 0.002342 0.037855
-v 0.012469 0.002342 0.035622
-v 0.012469 0.002342 0.040088
-v 0.012469 0.002342 0.042320
-v 0.010019 -0.002861 0.035742
-v 0.010019 -0.009748 0.045459
-v 0.008153 -0.014181 0.046940
-v 0.006671 -0.015226 0.047180
-v 0.010019 -0.012511 0.046558
-v 0.010019 -0.004041 0.040214
-v 0.010019 -0.007400 0.044006
-v 0.010019 -0.005473 0.042235
-v 0.010019 -0.003159 0.038022
-v 0.004895 -0.016332 0.047274
-v 0.002649 -0.002861 0.035742
-v 0.002649 -0.009748 0.045459
-v 0.002649 -0.014181 0.046940
-v 0.002649 -0.015226 0.047180
-v 0.002649 -0.012511 0.046558
-v 0.002649 -0.004041 0.040214
-v 0.002649 -0.007400 0.044006
-v 0.002649 -0.005473 0.042235
-v 0.002649 -0.003159 0.038022
-v 0.002649 -0.016789 0.047312
-v 0.012469 -0.001216 0.035704
-v 0.012469 -0.001420 0.037969
-v 0.012469 -0.002023 0.040174
-v 0.012469 -0.003002 0.042262
-v 0.010658 -0.013756 0.048907
-v 0.003284 -0.017321 0.049383
-v 0.006441 -0.016360 0.049298
-v 0.009351 -0.014801 0.049145
-v 0.012469 -0.009331 0.047481
-v 0.012469 -0.006949 0.046118
-v 0.012469 0.002342 0.046118
-v 0.012469 -0.001298 0.035706
-v 0.011089 -0.002861 0.035742
-v 0.012469 -0.001595 0.037974
-v 0.011089 -0.003159 0.038022
-v 0.012469 -0.002483 0.040183
-v 0.011089 -0.004041 0.040214
-v 0.012469 -0.003949 0.042252
-v 0.011089 -0.005473 0.042235
-v 0.012469 -0.007147 0.045190
-v 0.011089 -0.007400 0.044006
-v 0.012469 -0.009503 0.046649
-v 0.011089 -0.009748 0.045459
-v 0.011089 -0.012511 0.046558
-v 0.012469 -0.010955 0.047226
-v 0.011466 -0.013144 0.048119
-v 0.011466 -0.006105 0.065190
-v 0.012469 -0.004454 0.064833
-v 0.007971 -0.015226 0.047180
-v 0.009351 -0.014935 0.048529
-v 0.010658 -0.013889 0.048289
-v 0.009277 -0.014181 0.046940
-v 0.003284 -0.017462 0.048733
-v 0.002990 -0.017308 0.047351
-v 0.006441 -0.016497 0.048661
-v 0.005551 -0.016526 0.047290
-v 0.012469 -0.010781 0.048032
-v 0.011466 -0.013010 0.048737
-v 0.000000 -0.003159 0.038022
-v 0.000000 -0.009748 0.045459
-v 0.000000 -0.007400 0.044006
-v 0.000000 -0.002861 0.035742
-v 0.000000 -0.009419 0.065907
-v 0.000000 -0.005473 0.042235
-v -0.012469 0.002342 0.063363
-v 0.000000 -0.014181 0.046940
-v 0.000000 -0.015226 0.047180
-v 0.000000 -0.012511 0.046558
-v 0.000000 -0.004041 0.040214
-v 0.000000 -0.016789 0.047312
-v -0.009351 -0.007408 0.065472
-v -0.010658 -0.006647 0.065307
-v -0.006441 -0.008510 0.065710
-v -0.003284 -0.009190 0.065857
-v -0.012469 -0.001545 0.064204
-v -0.012469 -0.003489 0.064624
-v -0.012469 0.002342 0.037855
-v -0.012469 0.002342 0.035622
-v -0.012469 0.002342 0.040088
-v -0.012469 0.002342 0.042320
-v -0.010019 -0.002861 0.035742
-v -0.010019 -0.009748 0.045459
-v -0.008153 -0.014181 0.046940
-v -0.006671 -0.015226 0.047180
-v -0.010019 -0.012511 0.046558
-v -0.010019 -0.004041 0.040214
-v -0.010019 -0.007400 0.044006
-v -0.010019 -0.005473 0.042235
-v -0.010019 -0.003159 0.038022
-v -0.004895 -0.016332 0.047274
-v -0.002649 -0.002861 0.035742
-v -0.002649 -0.009748 0.045459
-v -0.002649 -0.014181 0.046940
-v -0.002649 -0.015226 0.047180
-v -0.002649 -0.012511 0.046558
-v -0.002649 -0.004041 0.040214
-v -0.002649 -0.007400 0.044006
-v -0.002649 -0.005473 0.042235
-v -0.002649 -0.003159 0.038022
-v -0.002649 -0.016789 0.047312
-v -0.012469 -0.001216 0.035704
-v -0.012469 -0.001420 0.037969
-v -0.012469 -0.002023 0.040174
-v -0.012469 -0.003002 0.042262
-v -0.010658 -0.013756 0.048907
-v 0.000000 -0.017646 0.049412
-v -0.003284 -0.017321 0.049383
-v -0.006441 -0.016360 0.049298
-v -0.009351 -0.014801 0.049145
-v -0.012469 -0.009331 0.047481
-v -0.012469 -0.006949 0.046118
-v -0.012469 0.002342 0.046118
-v -0.012469 -0.001298 0.035706
-v -0.011089 -0.002861 0.035742
-v -0.012469 -0.001595 0.037974
-v -0.011089 -0.003159 0.038022
-v -0.012469 -0.002483 0.040183
-v -0.011089 -0.004041 0.040214
-v -0.012469 -0.003949 0.042252
-v -0.011089 -0.005473 0.042235
-v -0.012469 -0.007147 0.045190
-v -0.011089 -0.007400 0.044006
-v -0.012469 -0.009503 0.046649
-v -0.011089 -0.009748 0.045459
-v -0.011089 -0.012511 0.046558
-v -0.012469 -0.010955 0.047226
-v -0.011466 -0.013144 0.048119
-v -0.011466 -0.006105 0.065190
-v -0.012469 -0.004454 0.064833
-v -0.007971 -0.015226 0.047180
-v -0.009351 -0.014935 0.048529
-v -0.010658 -0.013889 0.048289
-v -0.009277 -0.014181 0.046940
-v -0.003284 -0.017462 0.048733
-v -0.002990 -0.017308 0.047351
-v 0.000000 -0.017604 0.047373
-v 0.000000 -0.017787 0.048757
-v -0.006441 -0.016497 0.048661
-v -0.005551 -0.016526 0.047290
-v -0.012469 -0.010781 0.048032
-v -0.011466 -0.013010 0.048737
-v 0.000000 -0.016909 0.052819
-v 0.003284 -0.016586 0.052783
-v 0.006441 -0.015629 0.052675
-v 0.012469 -0.008622 0.050921
-v 0.012469 -0.006181 0.049710
-v 0.012469 0.002342 0.049484
-v 0.010658 -0.013032 0.052252
-v 0.009351 -0.014078 0.052488
-v 0.011466 -0.012286 0.052084
-v 0.012469 -0.010048 0.051420
-v -0.003284 -0.016586 0.052783
-v -0.006441 -0.015629 0.052675
-v -0.012469 -0.008622 0.050921
-v -0.012469 -0.006181 0.049710
-v -0.012469 0.002342 0.049484
-v -0.010658 -0.013032 0.052252
-v -0.009351 -0.014078 0.052488
-v -0.011466 -0.012286 0.052084
-v -0.012469 -0.010048 0.051420
-vt 0.389626 0.855156
-vt 0.390521 0.876103
-vt 0.497178 0.870536
-vt 0.484333 0.855130
-vt 0.412289 0.967976
-vt 0.478403 0.774806
-vt 0.463433 0.778867
-vt 0.412380 0.809901
-vt 0.409798 0.834762
-vt 0.396714 0.803798
-vt 0.445493 0.843045
-vt 0.390505 0.834206
-vt 0.408648 0.830875
-vt 0.389815 0.844760
-vt 0.330514 0.823054
-vt 0.432027 0.965825
-vt 0.391682 0.823360
-vt 0.437068 0.901524
-vt 0.402269 0.864596
-vt 0.493086 0.959935
-vt 0.480141 0.959822
-vt 0.407446 0.893095
-vt 0.404279 0.890129
-vt 0.494272 0.915752
-vt 0.405408 0.893816
-vt 0.445499 0.867230
-vt 0.458613 0.855135
-vt 0.434528 0.906466
-vt 0.478084 0.921347
-vt 0.433534 0.865962
-vt 0.458054 0.868399
-vt 0.392761 0.817328
-vt 0.404255 0.820169
-vt 0.336182 0.937153
-vt 0.405821 0.786943
-vt 0.413215 0.855147
-vt 0.416743 0.904914
-vt 0.413479 0.906889
-vt 0.389822 0.865551
-vt 0.328339 0.855183
-vt 0.406268 0.863663
-vt 0.405868 0.923348
-vt 0.393637 0.897111
-vt 0.478510 0.773673
-vt 0.409635 0.808495
-vt 0.403113 0.836120
-vt 0.402263 0.845706
-vt 0.407910 0.840728
-vt 0.497174 0.839720
-vt 0.478060 0.788901
-vt 0.329051 0.838946
-vt 0.334987 0.787175
-vt 0.401168 0.835782
-vt 0.448778 0.784859
-vt 0.447886 0.797316
-vt 0.462582 0.792299
-vt 0.412210 0.742297
-vt 0.422076 0.845553
-vt 0.416711 0.805374
-vt 0.464373 0.798874
-vt 0.431956 0.744434
-vt 0.450212 0.930782
-vt 0.427474 0.913081
-vt 0.423235 0.915539
-vt 0.399149 0.912516
-vt 0.335447 0.927703
-vt 0.335050 0.923173
-vt 0.412698 0.863505
-vt 0.416158 0.863975
-vt 0.411799 0.881077
-vt 0.409812 0.875534
-vt 0.493410 0.773030
-vt 0.413445 0.803401
-vt 0.402794 0.825572
-vt 0.437042 0.808751
-vt 0.400328 0.864755
-vt 0.408394 0.855149
-vt 0.333617 0.909517
-vt 0.332644 0.902621
-vt 0.403126 0.874181
-vt 0.422082 0.864736
-vt 0.416711 0.855146
-vt 0.402042 0.855151
-vt 0.422934 0.899416
-vt 0.334248 0.913876
-vt 0.450172 0.779477
-vt 0.493052 0.750284
-vt 0.458048 0.841870
-vt 0.433528 0.844320
-vt 0.434498 0.803810
-vt 0.494257 0.794492
-vt 0.410463 0.825689
-vt 0.415040 0.889351
-vt 0.471407 0.855132
-vt 0.446098 0.855138
-vt 0.479212 0.914296
-vt 0.493852 0.922939
-vt 0.410483 0.884606
-vt 0.447916 0.912950
-vt 0.434120 0.855141
-vt 0.470937 0.869361
-vt 0.406318 0.889536
-vt 0.493399 0.772491
-vt 0.332599 0.807735
-vt 0.467185 0.749518
-vt 0.413259 0.817561
-vt 0.393606 0.813194
-vt 0.423197 0.794742
-vt 0.479191 0.795954
-vt 0.406262 0.846637
-vt 0.406068 0.855150
-vt 0.407893 0.847406
-vt 0.406295 0.820760
-vt 0.406924 0.838997
-vt 0.399108 0.797782
-vt 0.422669 0.855144
-vt 0.407898 0.862892
-vt 0.391706 0.886948
-vt 0.401182 0.874520
-vt 0.404771 0.884253
-vt 0.483983 0.870072
-vt 0.400087 0.855152
-vt 0.329066 0.871418
-vt 0.330545 0.887307
-vt 0.497404 0.855128
-vt 0.416152 0.846318
-vt 0.454204 0.747884
-vt 0.404751 0.826046
-vt 0.411782 0.829217
-vt 0.400321 0.845549
-vt 0.463943 0.775990
-vt 0.337941 0.751811
-vt 0.333566 0.800837
-vt 0.412692 0.846790
-vt 0.483978 0.840187
-vt 0.334192 0.796476
-vt 0.493834 0.787302
-vt 0.450179 0.803181
-vt 0.408665 0.879421
-vt 0.406935 0.871302
-vt 0.407920 0.869569
-vt 0.467237 0.960717
-vt 0.454263 0.962359
-vt 0.450205 0.907085
-vt 0.464397 0.911384
-vt 0.462610 0.917958
-vt 0.402814 0.884728
-vt 0.425386 0.895350
-vt 0.336106 0.773189
-vt 0.422907 0.810868
-vt 0.338033 0.958524
-vt 0.412410 0.900390
-vt 0.409666 0.901797
-vt 0.396751 0.906503
-vt 0.463979 0.934259
-vt 0.478433 0.935435
-vt 0.493434 0.937204
-vt 0.493422 0.937742
-vt 0.478541 0.936568
-vt 0.463468 0.931384
-vt 0.448815 0.925403
-vt 0.427439 0.797198
-vt 0.480098 0.750404
-vt 0.425362 0.814933
-vt 0.335380 0.782643
-vt 0.470932 0.840902
-vt 0.405382 0.816481
-vt 0.415019 0.820940
-vt 0.407421 0.817201
-vt 0.392788 0.892978
-vt 0.413283 0.892731
-vn 0.941739 -0.326680 -0.080053
-vn 0.945242 -0.323626 -0.042239
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.933306 -0.319627 -0.163644
-vn 0.941739 -0.326680 -0.080053
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.919246 -0.303577 -0.250656
-vn 0.933306 -0.319627 -0.163644
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.911448 -0.243205 -0.331832
-vn 0.919246 -0.303577 -0.250656
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.911448 -0.243205 -0.331832
-vn 1.000000 0.000000 0.000000
-vn 0.916678 -0.176432 -0.358571
-vn 1.000000 0.000000 0.000000
-vn 0.916678 -0.176432 -0.358571
-vn 1.000000 0.000000 0.000000
-vn 0.910980 -0.276630 -0.305928
-vn 0.979394 -0.197399 0.042666
-vn 0.973672 -0.216165 0.072360
-vn 1.000000 0.000000 0.000000
-vn 0.978343 -0.189186 0.083988
-vn 1.000000 0.000000 0.000000
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.223005 -0.974817
-vn 0.161752 -0.860157 0.483701
-vn 0.000000 -0.869145 0.494557
-vn 0.178204 -0.920500 0.347740
-vn 0.000000 -0.934880 0.354963
-vn 0.325059 -0.831219 0.451012
-vn 0.161752 -0.860157 0.483701
-vn 0.352896 -0.876974 0.326161
-vn 0.178204 -0.920500 0.347740
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.154215 -0.988037
-vn -0.000092 -0.079746 -0.996815
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.079380 -0.996844
-vn 0.596627 -0.720598 0.353234
-vn 0.491395 -0.774189 0.398951
-vn 0.629820 -0.732455 0.258526
-vn 0.520259 -0.802134 0.293106
-vn 0.352896 -0.876974 0.326161
-vn 0.520259 -0.802134 0.293106
-vn 0.325059 -0.831219 0.451012
-vn 0.491395 -0.774189 0.398951
-vn 0.382681 -0.903004 0.195293
-vn 0.195076 -0.958627 0.207314
-vn 0.395898 -0.918084 -0.019654
-vn 0.200818 -0.979187 0.029421
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.291820 -0.619012 -0.729154
-vn 0.221873 -0.646208 -0.730197
-vn 0.000000 -0.154215 -0.988037
-vn -0.000244 -0.081790 -0.996650
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.877817 -0.478995
-vn 0.341206 -0.695262 -0.632605
-vn 0.383839 -0.804668 -0.452965
-vn 0.395898 -0.918084 -0.019654
-vn 0.552792 -0.829295 -0.081791
-vn 0.382681 -0.903004 0.195293
-vn 0.555564 -0.812685 0.175758
-vn 0.772999 -0.620157 -0.133706
-vn 0.819595 -0.559998 0.121101
-vn 0.635399 -0.761197 -0.129796
-vn 0.661102 -0.733340 0.158607
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.991581 -0.129491
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.991581 -0.129491
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.991581 -0.129491
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.991581 -0.129491
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.449678 -0.893191
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.449678 -0.893191
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.154215 -0.988037
-vn -0.000244 -0.081790 -0.996650
-vn 0.000000 -0.154215 -0.988037
-vn -0.000092 -0.079746 -0.996815
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.223005 -0.974817
-vn 0.195076 -0.958627 0.207314
-vn 0.000000 -0.977405 0.211375
-vn 0.200818 -0.979187 0.029421
-vn 0.000000 -0.999153 0.041139
-vn 0.221873 -0.646208 -0.730197
-vn 0.120368 -0.692302 -0.711498
-vn -0.000244 -0.081790 -0.996650
-vn -0.000092 -0.079746 -0.996815
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.750417 -0.660964
-vn 0.333728 -0.575562 -0.746561
-vn 0.341206 -0.695262 -0.632605
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.991581 -0.129491
-vn 0.412992 -0.879180 -0.237657
-vn 0.422817 -0.898585 -0.117347
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.967377 -0.253342
-vn 0.383839 -0.804668 -0.452965
-vn 0.412992 -0.879180 -0.237657
-vn 0.457368 -0.496250 -0.737936
-vn 0.313953 -0.551668 -0.772720
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.449666 -0.893197
-vn 0.457368 -0.496250 -0.737936
-vn 0.350609 -0.424894 -0.834589
-vn 0.635399 -0.761197 -0.129796
-vn 0.661102 -0.733340 0.158607
-vn 0.552792 -0.829295 -0.081791
-vn 0.555564 -0.812685 0.175758
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.223005 -0.974817
-vn 0.291820 -0.619012 -0.729154
-vn 0.313953 -0.551668 -0.772720
-vn 0.120368 -0.692302 -0.711498
-vn 0.000000 -0.707900 -0.706313
-vn -0.000092 -0.079746 -0.996815
-vn 0.000000 -0.079380 -0.996844
-vn 0.788994 -0.557075 0.259142
-vn 0.596627 -0.720598 0.353234
-vn 0.791884 -0.577089 0.199718
-vn 0.629820 -0.732455 0.258526
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.604128 -0.796887
-vn 0.350609 -0.424894 -0.834589
-vn 0.333728 -0.575562 -0.746561
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.457368 -0.496250 -0.737936
-vn 0.910980 -0.276630 -0.305928
-vn 0.772999 -0.620157 -0.133706
-vn 0.313953 -0.551668 -0.772720
-vn 0.457368 -0.496250 -0.737936
-vn 0.635399 -0.761197 -0.129796
-vn 0.772999 -0.620157 -0.133706
-vn 0.945242 -0.323626 -0.042239
-vn 0.941739 -0.326680 -0.080053
-vn 0.422817 -0.898585 -0.117347
-vn 0.412992 -0.879180 -0.237657
-vn 0.941739 -0.326680 -0.080053
-vn 0.933306 -0.319627 -0.163644
-vn 0.412992 -0.879180 -0.237657
-vn 0.383839 -0.804668 -0.452965
-vn 0.933306 -0.319627 -0.163644
-vn 0.919246 -0.303577 -0.250656
-vn 0.383839 -0.804668 -0.452965
-vn 0.341206 -0.695262 -0.632605
-vn 0.919246 -0.303577 -0.250656
-vn 0.911448 -0.243205 -0.331832
-vn 0.341206 -0.695262 -0.632605
-vn 0.333728 -0.575562 -0.746561
-vn 0.916678 -0.176432 -0.358571
-vn 0.350609 -0.424894 -0.834589
-vn 0.911448 -0.243205 -0.331832
-vn 0.333728 -0.575562 -0.746561
-vn 0.916678 -0.176432 -0.358571
-vn 0.910980 -0.276630 -0.305928
-vn 0.350609 -0.424894 -0.834589
-vn 0.457368 -0.496250 -0.737936
-vn 0.819595 -0.559998 0.121101
-vn 0.772999 -0.620157 -0.133706
-vn 0.979394 -0.197399 0.042666
-vn 0.910980 -0.276630 -0.305928
-vn 0.552792 -0.829295 -0.081791
-vn 0.395898 -0.918084 -0.019654
-vn 0.291820 -0.619012 -0.729154
-vn 0.221873 -0.646208 -0.730197
-vn 0.395898 -0.918084 -0.019654
-vn 0.200818 -0.979187 0.029421
-vn 0.221873 -0.646208 -0.730197
-vn 0.120368 -0.692302 -0.711498
-vn 0.200818 -0.979187 0.029421
-vn 0.000000 -0.999153 0.041139
-vn 0.120368 -0.692302 -0.711498
-vn 0.000000 -0.707900 -0.706313
-vn 0.291820 -0.619012 -0.729154
-vn 0.313953 -0.551668 -0.772720
-vn 0.552792 -0.829295 -0.081791
-vn 0.635399 -0.761197 -0.129796
-vn 0.791884 -0.577089 0.199718
-vn 0.819595 -0.559998 0.121101
-vn 0.973672 -0.216165 0.072360
-vn 0.979394 -0.197399 0.042666
-vn -0.941739 -0.326680 -0.080053
-vn -1.000000 0.000000 0.000000
-vn -0.945242 -0.323626 -0.042239
-vn -1.000000 0.000000 0.000000
-vn -0.933306 -0.319627 -0.163644
-vn -1.000000 0.000000 0.000000
-vn -0.941739 -0.326680 -0.080053
-vn -1.000000 0.000000 0.000000
-vn -0.919246 -0.303577 -0.250656
-vn -1.000000 0.000000 0.000000
-vn -0.933306 -0.319627 -0.163644
-vn -1.000000 0.000000 0.000000
-vn -0.911448 -0.243205 -0.331832
-vn -1.000000 0.000000 0.000000
-vn -0.919246 -0.303577 -0.250656
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -0.916678 -0.176432 -0.358571
-vn -0.911448 -0.243205 -0.331832
-vn -0.979394 -0.197399 0.042666
-vn -1.000000 0.000000 0.000000
-vn -0.910980 -0.276630 -0.305928
-vn -0.916678 -0.176432 -0.358571
-vn -0.973672 -0.216165 0.072360
-vn -0.978343 -0.189186 0.083988
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.934880 0.354963
-vn 0.000000 -0.869145 0.494557
-vn -0.178204 -0.920500 0.347740
-vn -0.161752 -0.860157 0.483701
-vn -0.178204 -0.920500 0.347740
-vn -0.161752 -0.860157 0.483701
-vn -0.352896 -0.876974 0.326161
-vn -0.325059 -0.831219 0.451012
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.154215 -0.988037
-vn 0.000092 -0.079746 -0.996815
-vn 0.000000 -0.079380 -0.996844
-vn -0.520259 -0.802134 0.293106
-vn -0.491395 -0.774189 0.398951
-vn -0.629820 -0.732455 0.258526
-vn -0.596627 -0.720598 0.353234
-vn -0.352896 -0.876974 0.326161
-vn -0.325059 -0.831219 0.451012
-vn -0.520259 -0.802134 0.293106
-vn -0.491395 -0.774189 0.398951
-vn -0.200818 -0.979187 0.029421
-vn -0.195076 -0.958627 0.207314
-vn -0.395898 -0.918084 -0.019654
-vn -0.382681 -0.903004 0.195293
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -0.291820 -0.619012 -0.729154
-vn 0.000000 -0.154215 -0.988037
-vn -0.221873 -0.646208 -0.730197
-vn 0.000244 -0.081790 -0.996650
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn 0.000000 -0.750417 -0.660964
-vn -0.341206 -0.695262 -0.632605
-vn 0.000000 -0.877817 -0.478995
-vn -0.383839 -0.804668 -0.452965
-vn -0.395898 -0.918084 -0.019654
-vn -0.382681 -0.903004 0.195293
-vn -0.552792 -0.829295 -0.081791
-vn -0.555564 -0.812685 0.175758
-vn -0.772999 -0.620157 -0.133706
-vn -0.635399 -0.761197 -0.129796
-vn -0.819595 -0.559998 0.121101
-vn -0.661102 -0.733340 0.158607
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.991581 -0.129491
-vn 0.000000 -0.991581 -0.129491
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.991581 -0.129491
-vn 0.000000 -0.991581 -0.129491
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.967377 -0.253342
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.877817 -0.478995
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.750417 -0.660964
-vn 0.000000 -0.449678 -0.893191
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.604128 -0.796887
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.449678 -0.893191
-vn 0.000000 -0.449666 -0.893197
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.154215 -0.988037
-vn 0.000244 -0.081790 -0.996650
-vn 0.000092 -0.079746 -0.996815
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.297194 -0.954817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.154215 -0.988037
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.999153 0.041139
-vn 0.000000 -0.977405 0.211375
-vn -0.200818 -0.979187 0.029421
-vn -0.195076 -0.958627 0.207314
-vn -0.221873 -0.646208 -0.730197
-vn 0.000244 -0.081790 -0.996650
-vn -0.120368 -0.692302 -0.711498
-vn 0.000092 -0.079746 -0.996815
-vn 0.000000 -0.604128 -0.796887
-vn -0.333728 -0.575562 -0.746561
-vn 0.000000 -0.750417 -0.660964
-vn -0.341206 -0.695262 -0.632605
-vn 0.000000 -0.967377 -0.253342
-vn -0.412992 -0.879180 -0.237657
-vn 0.000000 -0.991581 -0.129491
-vn -0.422817 -0.898585 -0.117347
-vn 0.000000 -0.877817 -0.478995
-vn -0.383839 -0.804668 -0.452965
-vn 0.000000 -0.967377 -0.253342
-vn -0.412992 -0.879180 -0.237657
-vn -0.457368 -0.496250 -0.737936
-vn 0.000000 -0.297194 -0.954817
-vn -0.313953 -0.551668 -0.772720
-vn 0.000000 -0.223005 -0.974817
-vn 0.000000 -0.297194 -0.954817
-vn -0.457368 -0.496250 -0.737936
-vn 0.000000 -0.449666 -0.893197
-vn -0.350609 -0.424894 -0.834589
-vn -0.635399 -0.761197 -0.129796
-vn -0.552792 -0.829295 -0.081791
-vn -0.661102 -0.733340 0.158607
-vn -0.555564 -0.812685 0.175758
-vn 0.000000 -0.154215 -0.988037
-vn -0.291820 -0.619012 -0.729154
-vn 0.000000 -0.223005 -0.974817
-vn -0.313953 -0.551668 -0.772720
-vn -0.120368 -0.692302 -0.711498
-vn 0.000092 -0.079746 -0.996815
-vn 0.000000 -0.707900 -0.706313
-vn 0.000000 -0.079380 -0.996844
-vn -0.629820 -0.732455 0.258526
-vn -0.596627 -0.720598 0.353234
-vn -0.791884 -0.577089 0.199718
-vn -0.788994 -0.557075 0.259142
-vn 0.000000 -0.449666 -0.893197
-vn -0.350609 -0.424894 -0.834589
-vn 0.000000 -0.604128 -0.796887
-vn -0.333728 -0.575562 -0.746561
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -0.457368 -0.496250 -0.737936
-vn -0.772999 -0.620157 -0.133706
-vn -0.910980 -0.276630 -0.305928
-vn -0.313953 -0.551668 -0.772720
-vn -0.635399 -0.761197 -0.129796
-vn -0.457368 -0.496250 -0.737936
-vn -0.772999 -0.620157 -0.133706
-vn -0.945242 -0.323626 -0.042239
-vn -0.422817 -0.898585 -0.117347
-vn -0.941739 -0.326680 -0.080053
-vn -0.412992 -0.879180 -0.237657
-vn -0.941739 -0.326680 -0.080053
-vn -0.412992 -0.879180 -0.237657
-vn -0.933306 -0.319627 -0.163644
-vn -0.383839 -0.804668 -0.452965
-vn -0.933306 -0.319627 -0.163644
-vn -0.383839 -0.804668 -0.452965
-vn -0.919246 -0.303577 -0.250656
-vn -0.341206 -0.695262 -0.632605
-vn -0.919246 -0.303577 -0.250656
-vn -0.341206 -0.695262 -0.632605
-vn -0.911448 -0.243205 -0.331832
-vn -0.333728 -0.575562 -0.746561
-vn -0.333728 -0.575562 -0.746561
-vn -0.350609 -0.424894 -0.834589
-vn -0.911448 -0.243205 -0.331832
-vn -0.916678 -0.176432 -0.358571
-vn -0.916678 -0.176432 -0.358571
-vn -0.350609 -0.424894 -0.834589
-vn -0.910980 -0.276630 -0.305928
-vn -0.457368 -0.496250 -0.737936
-vn -0.819595 -0.559998 0.121101
-vn -0.979394 -0.197399 0.042666
-vn -0.772999 -0.620157 -0.133706
-vn -0.910980 -0.276630 -0.305928
-vn -0.552792 -0.829295 -0.081791
-vn -0.291820 -0.619012 -0.729154
-vn -0.395898 -0.918084 -0.019654
-vn -0.221873 -0.646208 -0.730197
-vn -0.395898 -0.918084 -0.019654
-vn -0.221873 -0.646208 -0.730197
-vn -0.200818 -0.979187 0.029421
-vn -0.120368 -0.692302 -0.711498
-vn -0.200818 -0.979187 0.029421
-vn -0.120368 -0.692302 -0.711498
-vn 0.000000 -0.999153 0.041139
-vn 0.000000 -0.707900 -0.706313
-vn -0.291820 -0.619012 -0.729154
-vn -0.552792 -0.829295 -0.081791
-vn -0.313953 -0.551668 -0.772720
-vn -0.635399 -0.761197 -0.129796
-vn -0.791884 -0.577089 0.199718
-vn -0.973672 -0.216165 0.072360
-vn -0.819595 -0.559998 0.121101
-vn -0.979394 -0.197399 0.042666
-vn -0.978343 -0.189186 0.083988
-vn -0.973672 -0.216165 0.072360
-vn -0.788994 -0.557075 0.259142
-vn -0.791884 -0.577089 0.199718
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -0.819595 -0.559998 0.121101
-vn -0.661102 -0.733340 0.158607
-vn -0.791884 -0.577089 0.199718
-vn -0.629820 -0.732455 0.258526
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -0.382681 -0.903004 0.195293
-vn -0.352896 -0.876974 0.326161
-vn -0.555564 -0.812685 0.175758
-vn -0.520259 -0.802134 0.293106
-vn -0.661102 -0.733340 0.158607
-vn -0.555564 -0.812685 0.175758
-vn -0.629820 -0.732455 0.258526
-vn -0.520259 -0.802134 0.293106
-vn -0.195076 -0.958627 0.207314
-vn -0.178204 -0.920500 0.347740
-vn -0.382681 -0.903004 0.195293
-vn -0.352896 -0.876974 0.326161
-vn 0.000000 -0.977405 0.211375
-vn 0.000000 -0.934880 0.354963
-vn -0.195076 -0.958627 0.207314
-vn -0.178204 -0.920500 0.347740
-vn -0.973672 -0.216165 0.072360
-vn -1.000000 0.000000 0.000000
-vn -0.979394 -0.197399 0.042666
-vn -1.000000 0.000000 0.000000
-vn 0.791884 -0.577089 0.199718
-vn 0.973672 -0.216165 0.072360
-vn 0.788994 -0.557075 0.259142
-vn 0.978343 -0.189186 0.083988
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.819595 -0.559998 0.121101
-vn 0.791884 -0.577089 0.199718
-vn 0.661102 -0.733340 0.158607
-vn 0.629820 -0.732455 0.258526
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.382681 -0.903004 0.195293
-vn 0.555564 -0.812685 0.175758
-vn 0.352896 -0.876974 0.326161
-vn 0.520259 -0.802134 0.293106
-vn 0.661102 -0.733340 0.158607
-vn 0.629820 -0.732455 0.258526
-vn 0.555564 -0.812685 0.175758
-vn 0.520259 -0.802134 0.293106
-vn 0.352896 -0.876974 0.326161
-vn 0.178204 -0.920500 0.347740
-vn 0.382681 -0.903004 0.195293
-vn 0.195076 -0.958627 0.207314
-vn 0.178204 -0.920500 0.347740
-vn 0.000000 -0.934880 0.354963
-vn 0.195076 -0.958627 0.207314
-vn 0.000000 -0.977405 0.211375
-vn 1.000000 0.000000 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.979394 -0.197399 0.042666
-vn 0.973672 -0.216165 0.072360
-f 45/156/1 43/157/2 33/159/3
-f 33/159/3 43/157/2 32/158/4
-f 47/160/5 45/156/6 34/155/7
-f 34/155/7 45/156/6 33/159/8
-f 49/161/9 47/160/10 35/62/11
-f 35/62/11 47/160/10 34/155/12
-f 51/63/13 49/161/14 41/64/15
-f 41/64/15 49/161/14 35/62/16
-f 51/63/17 41/64/18 53/37/19
-f 53/37/19 41/64/18 40/38/20
-f 53/37/21 40/38/22 56/152/23
-f 56/152/23 40/38/22 68/153/24
-f 162/154/25 156/65/26 59/67/27
-f 59/67/27 156/65/26 7/66/28
-f 25/68/29 24/69/30 15/71/31
-f 15/71/31 24/69/30 14/70/32
-f 5/123/33 74/40/34 154/39/35
-f 154/39/35 74/40/34 153/1/36
-f 4/124/37 5/123/38 155/2/39
-f 155/2/39 5/123/38 154/39/40
-f 26/81/41 24/69/42 79/116/43
-f 79/116/43 24/69/42 77/82/44
-f 25/68/45 31/117/46 78/36/47
-f 78/36/47 31/117/46 81/77/48
-f 3/78/49 2/79/50 159/170/51
-f 159/170/51 2/79/50 160/118/52
-f 155/2/53 160/118/54 4/124/55
-f 4/124/55 160/118/54 2/79/56
-f 38/119/57 37/76/58 66/80/59
-f 66/80/59 37/76/58 64/19/60
-f 33/159/61 32/158/62 8/21/63
-f 8/21/63 32/158/62 9/20/64
-f 157/42/65 6/34/66 156/65/67
-f 156/65/67 6/34/66 7/66/68
-f 60/139/69 67/140/70 15/71/71
-f 15/71/71 67/140/70 21/141/72
-f 35/62/73 34/155/74 11/143/75
-f 11/143/75 34/155/74 10/142/76
-f 34/155/77 33/159/78 10/142/79
-f 10/142/79 33/159/78 8/21/80
-f 19/144/81 17/145/82 50/99/83
-f 50/99/83 17/145/82 48/146/84
-f 66/80/85 61/120/86 38/119/87
-f 38/119/87 61/120/86 39/147/88
-f 57/22/89 69/25/90 62/102/91
-f 62/102/91 69/25/90 36/23/92
-f 26/81/93 23/30/94 16/93/95
-f 16/93/95 23/30/94 13/148/96
-f 23/30/97 28/26/98 13/148/99
-f 13/148/99 28/26/98 18/18/100
-f 28/26/101 29/31/102 18/18/103
-f 18/18/103 29/31/102 19/144/104
-f 29/31/105 27/101/106 19/144/107
-f 19/144/107 27/101/106 17/145/108
-f 27/101/109 30/121/110 17/145/111
-f 17/145/111 30/121/110 20/96/112
-f 30/121/113 22/3/114 20/96/115
-f 20/96/115 22/3/114 12/24/116
-f 70/4/117 73/125/118 30/121/119
-f 30/121/119 73/125/118 22/3/120
-f 80/94/121 70/4/122 27/101/123
-f 27/101/123 70/4/122 30/121/124
-f 75/27/125 80/94/126 29/31/127
-f 29/31/127 80/94/126 27/101/128
-f 72/95/129 75/27/130 28/26/131
-f 28/26/131 75/27/130 29/31/132
-f 71/100/133 72/95/134 23/30/135
-f 23/30/135 72/95/134 28/26/136
-f 79/116/137 71/100/138 26/81/139
-f 26/81/139 71/100/138 23/30/140
-f 15/71/141 21/141/142 25/68/143
-f 25/68/143 21/141/142 31/117/144
-f 16/93/145 14/70/146 26/81/147
-f 26/81/147 14/70/146 24/69/148
-f 78/36/149 77/82/150 25/68/151
-f 25/68/151 77/82/150 24/69/152
-f 37/76/153 117/122/154 64/19/155
-f 64/19/155 117/122/154 148/83/156
-f 67/140/157 65/41/158 21/141/159
-f 21/141/159 65/41/158 31/117/160
-f 18/18/161 19/144/162 52/28/163
-f 52/28/163 19/144/162 50/99/164
-f 20/96/165 12/24/166 46/29/167
-f 46/29/167 12/24/166 44/97/168
-f 17/145/169 20/96/170 48/146/171
-f 48/146/171 20/96/170 46/29/172
-f 55/171/173 63/98/174 16/93/175
-f 16/93/175 63/98/174 14/70/176
-f 16/93/177 13/148/178 55/171/179
-f 55/171/179 13/148/178 54/84/180
-f 62/102/181 36/23/182 61/120/183
-f 61/120/183 36/23/182 39/147/184
-f 15/71/185 14/70/186 60/139/187
-f 60/139/187 14/70/186 63/98/188
-f 65/41/189 147/111/190 31/117/191
-f 31/117/191 147/111/190 81/77/192
-f 58/85/193 3/78/194 161/43/195
-f 161/43/195 3/78/194 159/170/196
-f 13/148/197 18/18/198 54/84/199
-f 54/84/199 18/18/198 52/28/200
-f 11/143/201 42/16/202 35/62/203
-f 35/62/203 42/16/202 41/64/204
-f 41/64/205 42/16/206 157/42/207
-f 157/42/207 42/16/206 158/5/208
-f 55/171/209 56/152/210 57/22/211
-f 63/98/212 55/171/213 62/102/214
-f 62/102/214 55/171/213 57/22/215
-f 43/157/216 45/156/217 44/97/218
-f 44/97/218 45/156/217 46/29/219
-f 45/156/220 47/160/221 46/29/222
-f 46/29/222 47/160/221 48/146/223
-f 47/160/224 49/161/225 48/146/226
-f 48/146/226 49/161/225 50/99/227
-f 49/161/228 51/63/229 50/99/230
-f 50/99/230 51/63/229 52/28/231
-f 53/37/232 54/84/233 51/63/234
-f 51/63/234 54/84/233 52/28/235
-f 53/37/236 56/152/237 54/84/238
-f 54/84/238 56/152/237 55/171/239
-f 69/25/240 57/22/241 68/153/242
-f 68/153/242 57/22/241 56/152/243
-f 61/120/244 66/80/245 60/139/246
-f 60/139/246 66/80/245 67/140/247
-f 66/80/248 64/19/249 67/140/250
-f 67/140/250 64/19/249 65/41/251
-f 64/19/252 148/83/253 65/41/254
-f 65/41/254 148/83/253 147/111/255
-f 60/139/256 63/98/257 61/120/258
-f 61/120/258 63/98/257 62/102/259
-f 161/43/260 69/25/261 162/154/262
-f 162/154/262 69/25/261 68/153/263
-f 126/6/264 113/44/265 124/72/266
-f 124/72/266 113/44/265 112/103/267
-f 128/7/268 114/131/269 126/6/270
-f 126/6/270 114/131/269 113/44/271
-f 130/54/272 115/86/273 128/7/274
-f 128/7/274 115/86/273 114/131/275
-f 132/162/276 122/108/277 130/54/278
-f 130/54/278 122/108/277 115/86/279
-f 121/73/280 122/108/281 134/59/282
-f 134/59/282 122/108/281 132/162/283
-f 151/45/284 121/73/285 137/8/286
-f 137/8/286 121/73/285 134/59/287
-f 171/10/288 140/52/289 165/115/290
-f 165/115/290 140/52/289 87/165/291
-f 105/134/292 95/9/293 104/126/294
-f 104/126/294 95/9/293 94/129/295
-f 153/1/296 74/40/297 163/14/298
-f 163/14/298 74/40/297 85/51/299
-f 163/14/300 85/51/301 164/12/302
-f 164/12/302 85/51/301 84/15/303
-f 106/58/304 79/116/305 104/126/306
-f 104/126/306 79/116/305 77/82/307
-f 105/134/308 78/36/309 111/112/310
-f 111/112/310 78/36/309 81/77/311
-f 169/17/312 82/104/313 168/32/314
-f 168/32/314 82/104/313 83/133/315
-f 164/12/316 84/15/317 169/17/318
-f 169/17/318 84/15/317 82/104/319
-f 145/47/320 118/130/321 149/46/322
-f 149/46/322 118/130/321 119/53/323
-f 113/44/324 88/163/325 112/103/326
-f 112/103/326 88/163/325 89/87/327
-f 87/165/328 86/149/329 165/115/330
-f 165/115/330 86/149/329 166/35/331
-f 141/13/332 95/9/333 150/114/334
-f 150/114/334 95/9/333 101/48/335
-f 115/86/336 91/127/337 114/131/338
-f 114/131/338 91/127/337 90/105/339
-f 114/131/340 90/105/341 113/44/342
-f 113/44/342 90/105/341 88/163/343
-f 99/138/344 131/55/345 97/60/346
-f 97/60/346 131/55/345 129/56/347
-f 149/46/348 119/53/349 142/128/350
-f 142/128/350 119/53/349 120/74/351
-f 138/169/352 143/113/353 152/167/354
-f 152/167/354 143/113/353 116/33/355
-f 106/58/356 96/168/357 103/89/358
-f 103/89/358 96/168/357 93/164/359
-f 103/89/360 93/164/361 108/11/362
-f 108/11/362 93/164/361 98/75/363
-f 108/11/364 98/75/365 109/88/366
-f 109/88/366 98/75/365 99/138/367
-f 109/88/368 99/138/369 107/166/370
-f 107/166/370 99/138/369 97/60/371
-f 107/166/372 97/60/373 110/135/374
-f 110/135/374 97/60/373 100/109/375
-f 110/135/376 100/109/377 102/49/378
-f 102/49/378 100/109/377 92/91/379
-f 70/4/380 110/135/381 73/125/382
-f 73/125/382 110/135/381 102/49/383
-f 80/94/384 107/166/385 70/4/386
-f 70/4/386 107/166/385 110/135/387
-f 75/27/388 109/88/389 80/94/390
-f 80/94/390 109/88/389 107/166/391
-f 72/95/392 108/11/393 75/27/394
-f 75/27/394 108/11/393 109/88/395
-f 71/100/396 103/89/397 72/95/398
-f 72/95/398 103/89/397 108/11/399
-f 79/116/400 106/58/401 71/100/402
-f 71/100/402 106/58/401 103/89/403
-f 95/9/404 105/134/405 101/48/406
-f 101/48/406 105/134/405 111/112/407
-f 96/168/408 106/58/409 94/129/410
-f 94/129/410 106/58/409 104/126/411
-f 78/36/412 105/134/413 77/82/414
-f 77/82/414 105/134/413 104/126/415
-f 148/83/416 117/122/417 145/47/418
-f 145/47/418 117/122/417 118/130/419
-f 150/114/420 101/48/421 146/110/422
-f 146/110/422 101/48/421 111/112/423
-f 98/75/424 133/90/425 99/138/426
-f 99/138/426 133/90/425 131/55/427
-f 100/109/428 127/50/429 92/91/430
-f 92/91/430 127/50/429 125/137/431
-f 97/60/432 129/56/433 100/109/434
-f 100/109/434 129/56/433 127/50/435
-f 136/106/436 96/168/437 144/92/438
-f 144/92/438 96/168/437 94/129/439
-f 96/168/440 136/106/441 93/164/442
-f 93/164/442 136/106/441 135/150/443
-f 143/113/444 142/128/445 116/33/446
-f 116/33/446 142/128/445 120/74/447
-f 95/9/448 141/13/449 94/129/450
-f 94/129/450 141/13/449 144/92/451
-f 146/110/452 111/112/453 147/111/454
-f 147/111/454 111/112/453 81/77/455
-f 168/32/456 83/133/457 170/107/458
-f 170/107/458 83/133/457 139/136/459
-f 93/164/460 135/150/461 98/75/462
-f 98/75/462 135/150/461 133/90/463
-f 91/127/464 115/86/465 123/61/466
-f 123/61/466 115/86/465 122/108/467
-f 167/57/468 123/61/469 166/35/470
-f 166/35/470 123/61/469 122/108/471
-f 136/106/472 138/169/473 137/8/474
-f 144/92/475 143/113/476 136/106/477
-f 136/106/477 143/113/476 138/169/478
-f 124/72/479 125/137/480 126/6/481
-f 126/6/481 125/137/480 127/50/482
-f 126/6/483 127/50/484 128/7/485
-f 128/7/485 127/50/484 129/56/486
-f 128/7/487 129/56/488 130/54/489
-f 130/54/489 129/56/488 131/55/490
-f 130/54/491 131/55/492 132/162/493
-f 132/162/493 131/55/492 133/90/494
-f 133/90/495 135/150/496 132/162/497
-f 132/162/497 135/150/496 134/59/498
-f 134/59/499 135/150/500 137/8/501
-f 137/8/501 135/150/500 136/106/502
-f 152/167/503 151/45/504 138/169/505
-f 138/169/505 151/45/504 137/8/506
-f 142/128/507 141/13/508 149/46/509
-f 149/46/509 141/13/508 150/114/510
-f 149/46/511 150/114/512 145/47/513
-f 145/47/513 150/114/512 146/110/514
-f 145/47/515 146/110/516 148/83/517
-f 148/83/517 146/110/516 147/111/518
-f 141/13/519 142/128/520 144/92/521
-f 144/92/521 142/128/520 143/113/522
-f 170/107/523 171/10/524 152/167/525
-f 152/167/525 171/10/524 151/45/526
-f 140/52/527 171/10/528 139/136/529
-f 139/136/529 171/10/528 170/107/530
-f 76/132/531 167/57/532 86/149/533
-f 86/149/533 167/57/532 166/35/534
-f 152/167/535 116/33/536 170/107/537
-f 170/107/537 116/33/536 168/32/538
-f 165/115/539 166/35/540 121/73/541
-f 121/73/541 166/35/540 122/108/542
-f 119/53/543 164/12/544 120/74/545
-f 120/74/545 164/12/544 169/17/546
-f 116/33/547 120/74/548 168/32/549
-f 168/32/549 120/74/548 169/17/550
-f 118/130/551 163/14/552 119/53/553
-f 119/53/553 163/14/552 164/12/554
-f 117/122/555 153/1/556 118/130/557
-f 118/130/557 153/1/556 163/14/558
-f 171/10/559 165/115/560 151/45/561
-f 151/45/561 165/115/560 121/73/562
-f 161/43/563 162/154/564 58/85/565
-f 58/85/565 162/154/564 59/67/566
-f 157/42/567 158/5/568 6/34/569
-f 6/34/569 158/5/568 1/151/570
-f 69/25/571 161/43/572 36/23/573
-f 36/23/573 161/43/572 159/170/574
-f 41/64/575 157/42/576 40/38/577
-f 40/38/577 157/42/576 156/65/578
-f 38/119/579 39/147/580 155/2/581
-f 155/2/581 39/147/580 160/118/582
-f 36/23/583 159/170/584 39/147/585
-f 39/147/585 159/170/584 160/118/586
-f 155/2/587 154/39/588 38/119/589
-f 38/119/589 154/39/588 37/76/590
-f 154/39/591 153/1/592 37/76/593
-f 37/76/593 153/1/592 117/122/594
-f 40/38/595 156/65/596 68/153/597
-f 68/153/597 156/65/596 162/154/598
diff --git a/libs/vr/libdvrgraphics/assets/laser.obj b/libs/vr/libdvrgraphics/assets/laser.obj
deleted file mode 100644
index 32737e4..0000000
--- a/libs/vr/libdvrgraphics/assets/laser.obj
+++ /dev/null
@@ -1,28 +0,0 @@
-# This file uses centimeters as units for non-parametric coordinates.
-
-v -0.010000 -0.000000 -1.000000
-v 0.010000 -0.000000 -1.000000
-v -0.010000 -0.000000 0.000000
-v 0.010000 -0.000000 0.000000
-v 0.000000 0.010000 -1.000000
-v 0.000000 -0.010000 -1.000000
-v 0.000000 0.010000 -0.000000
-v 0.000000 -0.010000 0.000000
-vt 0.000000 0.000000
-vt 1.000000 0.000000
-vt 0.000000 1.000000
-vt 1.000000 1.000000
-vt 0.000000 0.000000
-vt 1.000000 0.000000
-vt 1.000000 1.000000
-vt 0.000000 1.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn 0.000000 -1.000000 -0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-vn -1.000000 0.000000 0.000000
-f 1/1/1 2/2/2 4/4/3 3/3/4
-f 5/5/5 6/6/6 8/7/7 7/8/8
diff --git a/libs/vr/libdvrgraphics/assets/laser.png b/libs/vr/libdvrgraphics/assets/laser.png
deleted file mode 100644
index a96c68d..0000000
--- a/libs/vr/libdvrgraphics/assets/laser.png
+++ /dev/null
Binary files differ
diff --git a/libs/vr/libdvrgraphics/blur.cpp b/libs/vr/libdvrgraphics/blur.cpp
deleted file mode 100644
index 90e271e..0000000
--- a/libs/vr/libdvrgraphics/blur.cpp
+++ /dev/null
@@ -1,246 +0,0 @@
-#include "include/private/dvr/graphics/blur.h"
-
-// clang-format off
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <GLES2/gl2.h>
-// clang-format on
-#include <hardware/gralloc.h>
-
-#include <string>
-
-#include <log/log.h>
-#include <private/dvr/debug.h>
-#include <private/dvr/graphics/egl_image.h>
-#include <private/dvr/graphics/shader_program.h>
-#include <private/dvr/types.h>
-
-#define POSITION_ATTR 0
-#define OFFSET_BINDING 0
-#define SAMPLER_BINDING 1
-
-namespace {
-
-std::string screen_space_vert_shader = SHADER0([]() { // NOLINT
- layout(location = 0) in vec4 position_uv;
- out vec2 texCoords;
-
- void main() {
- gl_Position = vec4(position_uv.xy, 0.0, 1.0);
- texCoords = position_uv.zw;
- }
-});
-
-std::string kawase_blur_frag_shader = SHADER0([]() { // NOLINT
- precision mediump float;
- layout(location = 0) uniform vec2 uSampleOffsets[4];
- layout(binding = 1) uniform APP_SAMPLER_2D uTexture;
- in vec2 texCoords;
- out vec4 color;
-
- void main() {
- vec2 tc = texCoords;
- color = texture(uTexture, tc + uSampleOffsets[0]);
- color += texture(uTexture, tc + uSampleOffsets[1]);
- color += texture(uTexture, tc + uSampleOffsets[2]);
- color += texture(uTexture, tc + uSampleOffsets[3]);
- color *= (1.0 / 4.0);
- }
-});
-
-constexpr int g_num_samples = 4;
-
-// Modified kernel patterns originally based on:
-// https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms
-// The modification is left and right rotations of the 3rd and 4th patterns.
-const android::dvr::vec2 g_blur_samples[][g_num_samples] = {
- {{0.5f, 0.5f}, {-0.5f, 0.5f}, {0.5f, -0.5f}, {-0.5f, -0.5f}},
- {{1.5f, 1.5f}, {-1.5f, 1.5f}, {1.5f, -1.5f}, {-1.5f, -1.5f}},
- {{2.5f, 1.5f}, {-1.5f, 2.5f}, {1.5f, -2.5f}, {-2.5f, -1.5f}},
- {{2.5f, 3.5f}, {-3.5f, 2.5f}, {3.5f, -2.5f}, {-2.5f, -3.5f}},
- // Last pass disabled, because it is more blur than we need.
- // {{3.5f, 3.5f}, {-3.5f, 3.5f}, {3.5f, -3.5f}, {-3.5f, -3.5f}},
-};
-
-} // namespace
-
-namespace android {
-namespace dvr {
-
-Blur::Blur(int w, int h, GLuint source_texture, GLint source_texture_target,
- GLint target_texture_target, bool is_external, EGLDisplay display,
- int num_blur_outputs)
- : display_(display),
- target_texture_target_(target_texture_target),
- width_(w),
- height_(h),
- fbo_q_free_(1 + num_blur_outputs) {
- LOG_ALWAYS_FATAL_IF(num_blur_outputs <= 0);
- source_fbo_ =
- CreateFbo(w, h, source_texture, source_texture_target, is_external);
- fbo_half_ = CreateFbo(w / 2, h / 2, 0, target_texture_target, is_external);
- // Create the quarter res fbos.
- for (size_t i = 0; i < fbo_q_free_.GetCapacity(); ++i)
- fbo_q_.push_back(
- CreateFbo(w / 4, h / 4, 0, target_texture_target, is_external));
- scale_ = 1.0f;
-}
-
-Blur::~Blur() {
- glFinish();
- glDeleteFramebuffers(1, &source_fbo_.fbo);
- glDeleteFramebuffers(1, &fbo_half_.fbo);
- // Note: source_fbo_.texture is not deleted because it was created externally.
- glDeleteTextures(1, &fbo_half_.texture);
- if (fbo_half_.egl_image)
- eglDestroyImageKHR(display_, fbo_half_.egl_image);
- for (const auto& fbo : fbo_q_) {
- glDeleteFramebuffers(1, &fbo.fbo);
- glDeleteTextures(1, &fbo.texture);
- if (fbo.egl_image)
- eglDestroyImageKHR(display_, fbo.egl_image);
- }
- CHECK_GL();
-}
-
-void Blur::StartFrame() {
- fbo_q_free_.Clear();
- for (const auto& fbo : fbo_q_)
- fbo_q_free_.Append(fbo);
-}
-
-GLuint Blur::DrawBlur(GLuint source_texture) {
- LOG_ALWAYS_FATAL_IF(fbo_q_free_.GetSize() < 2);
-
- // Downsample to half w x half h.
- glBindFramebuffer(GL_READ_FRAMEBUFFER, source_fbo_.fbo);
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_half_.fbo);
- glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- target_texture_target_, source_texture, 0);
- glBlitFramebuffer(0, 0, width_, height_, 0, 0, width_ / 2, height_ / 2,
- GL_COLOR_BUFFER_BIT, GL_LINEAR);
- CHECK_GL();
-
- // Downsample to quarter w x quarter h.
- glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_half_.fbo);
- Fbo fbo_out = fbo_q_free_.Front();
- fbo_q_free_.PopFront();
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_out.fbo);
- glBlitFramebuffer(0, 0, width_ / 2, height_ / 2, 0, 0, width_ / 4,
- height_ / 4, GL_COLOR_BUFFER_BIT, GL_LINEAR);
- glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
- CHECK_GL();
-
- // Blur shader is initialized statically to share between multiple blur
- // instances.
- static ShaderProgram kawase_prog[2];
- int prog_index = (target_texture_target_ == GL_TEXTURE_EXTERNAL_OES) ? 1 : 0;
- if (!kawase_prog[prog_index].IsUsable()) {
- std::string prefix = "#version 310 es\n";
- if (target_texture_target_ == GL_TEXTURE_EXTERNAL_OES) {
- prefix += "#extension GL_OES_EGL_image_external_essl3 : require\n";
- prefix += "#define APP_SAMPLER_2D samplerExternalOES\n";
- } else {
- prefix += "#define APP_SAMPLER_2D sampler2D\n";
- }
- std::string vert = prefix + screen_space_vert_shader;
- std::string frag = prefix + kawase_blur_frag_shader;
- kawase_prog[prog_index].Link(vert, frag);
- CHECK_GL();
- }
-
- int blur_w = width_ / 4;
- int blur_h = height_ / 4;
- float pix_w = 1.0f / static_cast<float>(blur_w);
- float pix_h = 1.0f / static_cast<float>(blur_h);
- vec2 pixel_size(pix_w, pix_h);
- constexpr int num_passes = sizeof(g_blur_samples) / sizeof(g_blur_samples[0]);
- vec2 blur_offsets[num_passes][g_num_samples];
- for (int i = 0; i < num_passes; ++i) {
- for (int dir = 0; dir < g_num_samples; ++dir) {
- blur_offsets[i][dir] = pixel_size.array() *
- g_blur_samples[i][dir].array() * scale_;
- }
- }
-
- kawase_prog[prog_index].Use();
-
- vec4 screen_tri_strip[4] = {vec4(-1, 1, 0, 1), vec4(-1, -1, 0, 0),
- vec4(1, 1, 1, 1), vec4(1, -1, 1, 0)};
-
- glViewport(0, 0, blur_w, blur_h);
- glVertexAttribPointer(POSITION_ATTR, 4, GL_FLOAT, GL_FALSE, sizeof(vec4),
- screen_tri_strip);
- glEnableVertexAttribArray(POSITION_ATTR);
- CHECK_GL();
-
- // Ping-pong between fbos from fbo_q_free_ to compute the passes.
- Fbo fbo_in = fbo_out;
- for (int i = 0; i < num_passes; ++i) {
- fbo_out = fbo_q_free_.Front();
- fbo_q_free_.PopFront();
- glBindFramebuffer(GL_FRAMEBUFFER, fbo_out.fbo);
- glActiveTexture(GL_TEXTURE0 + SAMPLER_BINDING);
- glBindTexture(target_texture_target_, fbo_in.texture);
- glUniform2fv(OFFSET_BINDING, 4, &blur_offsets[i][0][0]);
- glClear(GL_COLOR_BUFFER_BIT);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- CHECK_GL();
- // Put fbo_in back into the free fbo pool.
- fbo_q_free_.Append(fbo_in);
- // Next iteration's in buffer is this iteration's out buffer.
- fbo_in = fbo_out;
- }
- glDisableVertexAttribArray(POSITION_ATTR);
- glBindTexture(target_texture_target_, 0);
- glUseProgram(0);
- glActiveTexture(GL_TEXTURE0);
- CHECK_GL();
- // fbo_out remains out of the fbo_q_free_ list, since the application will be
- // using it as a texture.
- return fbo_out.texture;
-}
-
-Blur::Fbo Blur::CreateFbo(int w, int h, GLuint source_texture, GLint tex_target,
- bool is_external) {
- Fbo fbo;
- glGenFramebuffers(1, &fbo.fbo);
- if (source_texture) {
- fbo.texture = source_texture;
- } else {
- glGenTextures(1, &fbo.texture);
- }
-
- glBindFramebuffer(GL_FRAMEBUFFER, fbo.fbo);
- CHECK_GL();
-
- if (!source_texture) {
- glBindTexture(tex_target, fbo.texture);
- glTexParameteri(tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- if (is_external) {
- fbo.egl_image =
- CreateEglImage(display_, w, h, HAL_PIXEL_FORMAT_RGBA_8888,
- GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_HW_RENDER);
- glEGLImageTargetTexture2DOES(tex_target, fbo.egl_image);
- } else {
- glTexImage2D(tex_target, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE,
- nullptr);
- }
- }
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex_target,
- fbo.texture, 0);
- CHECK_GL();
- CHECK_GL_FBO();
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- return fbo;
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdvrgraphics/debug_text.cpp b/libs/vr/libdvrgraphics/debug_text.cpp
deleted file mode 100644
index 1875b14..0000000
--- a/libs/vr/libdvrgraphics/debug_text.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-#include "include/private/dvr/graphics/debug_text.h"
-
-#include <algorithm>
-
-#include <private/dvr/debug.h>
-
-namespace android {
-namespace dvr {
-namespace {
-
-// 658x11 alpha texture with ascii characters starting with !: "!"#$%&'("...
-// Each character is 7x11 pixels, monospace.
-// clang-format off
-const uint8_t ascii_texture[] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xff,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x49,0x92,0x49,0x92,0x00,0x00,0x24,0xdb,0xff,0xff,0xdb,0x00,0x49,0xff,0x49,0x00,0x24,0xb6,0x00,0x00,0x6d,0xff,0xff,0x49,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0xff,0x49,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0xb6,0xdb,0xb6,0x00,0x00,0x00,0x24,0xb6,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xb6,0x24,0x00,0x00,0xff,0xff,0xff,0xb6,0x24,0x00,0x00,0x00,0x00,0x00,0x6d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x6d,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x24,0xdb,0xff,0xdb,0x24,0x00,0x00,0x24,0xdb,0xff,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xff,0xff,0x6d,0x00,0x00,0x00,0x6d,0xff,0xff,0x92,0x00,0x00,0x00,0x00,0x24,0xff,0x24,0x00,0x00,0x00,0xff,0xff,0xff,0xdb,0x49,0x00,0x00,0x24,0xb6,0xff,0xff,0xb6,0x00,0x00,0xff,0xff,0xdb,0x6d,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x24,0xb6,0xff,0xff,0xdb,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x6d,0x6d,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x49,0x00,0x49,0xff,0x00,0x00,0xff,0x6d,0x00,0x00,0xff,0x00,0x00,0x00,0xb6,0xdb,0xb6,0x00,0x00,0x00,0xff,0xff,0xff,0xdb,0x24,0x00,0x00,0x00,0xb6,0xdb,0xb6,0x00,0x00,0x00,0xff,0xff,0xff,0xdb,0x49,0x00,0x00,0x24,0xb6,0xff,0xff,0xdb,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xb6,0x24,0x00,0x24,0xb6,0x00,0x00,0xdb,0x24,0x00,0x24,0xdb,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xdb,0x6d,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x92,0x6d,0x92,0x6d,0x00,0x00,0xdb,0x6d,0xff,0x00,0x00,0x00,0xb6,0x24,0xb6,0x00,0xb6,0x24,0x00,0x00,0xff,0x24,0x24,0xb6,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x24,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0xb6,0xff,0xb6,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0x92,0x6d,0x00,0x6d,0x92,0x00,0x00,0xb6,0x24,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xdb,0x00,0x00,0x00,0x00,0x00,0x49,0xff,0x00,0x00,0x00,0x00,0x24,0xb6,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x49,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xb6,0x00,0x00,0xff,0x49,0x00,0x49,0xff,0x00,0x00,0xb6,0x6d,0x00,0x49,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x24,0x00,0x00,0x00,0x00,0x92,0x00,0x24,0xff,0x00,0x00,0x24,0xdb,0x24,0x00,0xdb,0x6d,0x00,0x00,0x00,0x6d,0xff,0x6d,0x00,0x00,0x00,0xff,0x00,0x00,0x49,0xff,0x00,0x00,0xdb,0x6d,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x24,0xdb,0x49,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x6d,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x6d,0x6d,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xb6,0x00,0x92,0xff,0x00,0x00,0xff,0xdb,0x00,0x00,0xff,0x00,0x00,0x92,0x6d,0x00,0x6d,0x92,0x00,0x00,0xff,0x00,0x00,0x49,0xff,0x00,0x00,0x92,0x6d,0x00,0x6d,0x92,0x00,0x00,0xff,0x00,0x00,0x49,0xff,0x00,0x00,0xdb,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xb6,0x49,0x00,0x49,0xb6,0x00,0x00,0xdb,0x24,0x00,0x00,0xdb,0x00,0x00,0x24,0xb6,0x00,0xb6,0x24,0x00,0x00,0x6d,0x92,0x00,0x92,0x6d,0x00,0x00,0x00,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x92,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x49,0xb6,0x00,0xb6,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0xb6,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0x49,0xff,0x00,0x00,0x00,0xb6,0x24,0xb6,0x24,0xb6,0x00,0x00,0x00,0xb6,0x49,0xdb,0x49,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x92,0x00,0x00,0x00,0x00,0xb6,0xff,0xb6,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x24,0x92,0xb6,0x00,0x00,0x00,0x00,0xdb,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0x00,0x00,0xb6,0x49,0x00,0x49,0xb6,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x24,0xb6,0xb6,0x24,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x24,0xb6,0xb6,0x24,0x00,0x00,0x00,0x00,0x49,0xdb,0x00,0x00,0xb6,0x6d,0x6d,0xff,0x92,0xdb,0x00,0x00,0x00,0xb6,0x92,0xb6,0x00,0x00,0x00,0xff,0x00,0x00,0x49,0xdb,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x49,0xdb,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x6d,0x6d,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xb6,0x49,0xb6,0xff,0x00,0x00,0xff,0xb6,0x49,0x00,0xff,0x00,0x00,0xdb,0x24,0x00,0x24,0xdb,0x00,0x00,0xff,0x00,0x00,0x49,0xdb,0x00,0x00,0xdb,0x24,0x00,0x24,0xdb,0x00,0x00,0xff,0x00,0x00,0x49,0xdb,0x00,0x00,0xdb,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x6d,0x92,0x00,0x92,0x6d,0x00,0x00,0x92,0x24,0x00,0x00,0xdb,0x00,0x00,0x00,0xb6,0x6d,0xb6,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xb6,0x24,0x00,0x24,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0xff,0xff,0xdb,0x49,0x00,0x00,0xff,0x6d,0xff,0xdb,0x24,0x00,0x00,0x00,0x92,0xff,0xff,0xdb,0x00,0x00,0x24,0xdb,0xff,0x6d,0xff,0x00,0x00,0x00,0xb6,0xff,0xdb,0x24,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x49,0xff,0xdb,0xb6,0xff,0x00,0x00,0xff,0x00,0x92,0xb6,0x24,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x6d,0x6d,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0xb6,0x6d,0xdb,0x49,0x00,0x00,0xff,0x00,0x92,0xb6,0x24,0x00,0x00,0x00,0xb6,0xff,0xb6,0x00,0x00,0x00,0xff,0x6d,0xff,0xdb,0x24,0x00,0x00,0x24,0xdb,0xff,0x6d,0xff,0x00,0x00,0x00,0xff,0x49,0xff,0xdb,0x00,0x00,0x49,0xdb,0xff,0xff,0xdb,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xdb,0x24,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xb6,0x49,0x00,0x49,0xb6,0x00,0x00,0xdb,0x24,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x24,0xdb,0xff,0x49,0x00,0x00,0x49,0xff,0x49,0xb6,0x24,0x00,0x00,0x00,0x6d,0xff,0x6d,0x00,0x24,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xb6,0x49,0xff,0x49,0xb6,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0xff,0x00,0xb6,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xb6,0x24,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xdb,0x24,0x00,0x00,0xff,0x92,0xff,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0xdb,0xff,0xdb,0x00,0x00,0x00,0xdb,0x6d,0x00,0x92,0xff,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0xff,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xff,0x00,0x00,0x00,0x49,0xff,0x24,0x00,0x00,0xdb,0x00,0xdb,0xdb,0x49,0xff,0x00,0x00,0x00,0xff,0x24,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x24,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6d,0xb6,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x6d,0xff,0x6d,0xff,0x00,0x00,0xff,0x24,0xdb,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xdb,0x24,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0x92,0x00,0x00,0x00,0x24,0xdb,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x24,0xdb,0x00,0xdb,0x24,0x00,0x00,0x6d,0x6d,0xff,0x24,0xb6,0x00,0x00,0x00,0x24,0xff,0x24,0x00,0x00,0x00,0x00,0x92,0xdb,0x92,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xff,0x00,0x00,0xff,0x92,0x00,0x49,0xb6,0x00,0x00,0x92,0x6d,0x00,0x00,0x00,0x00,0x00,0xb6,0x92,0x00,0x6d,0xff,0x00,0x00,0xb6,0x49,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x24,0x24,0xff,0x00,0x00,0x00,0xff,0xb6,0x00,0x49,0xdb,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x49,0xff,0x49,0xdb,0x00,0x00,0xff,0xb6,0x00,0x49,0xdb,0x00,0x00,0xb6,0x92,0x00,0x92,0xb6,0x00,0x00,0xff,0x6d,0x00,0x92,0xb6,0x00,0x00,0xb6,0x92,0x00,0x6d,0xff,0x00,0x00,0x00,0xff,0xb6,0x00,0x00,0x00,0x00,0xff,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x6d,0x6d,0x00,0x6d,0x92,0x00,0x00,0xdb,0x24,0x00,0x24,0xdb,0x00,0x00,0x00,0xdb,0x24,0xdb,0x00,0x00,0x00,0x6d,0x6d,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0x00,0xb6,0x24,0x00,0x00,0x00,0x49,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xb6,0x24,0xb6,0x00,0x00,0x00,0x00,0x00,0xff,0xdb,0x49,0x00,0x00,0x00,0x24,0xb6,0x49,0xff,0x49,0x49,0xdb,0x49,0xdb,0x00,0xb6,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0x00,0x00,0x00,0x00,0xff,0x00,0xb6,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0x24,0x92,0xb6,0x00,0x00,0x92,0x6d,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x6d,0xdb,0x00,0x00,0xff,0x92,0x00,0x6d,0xdb,0x00,0x00,0x00,0x00,0x92,0x6d,0x00,0x00,0x00,0xb6,0x6d,0x00,0x6d,0xb6,0x00,0x00,0x24,0xdb,0xff,0x92,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xdb,0xb6,0x24,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x24,0xb6,0xdb,0x49,0x00,0x00,0x00,0xff,0x24,0x00,0x00,0x00,0xff,0x00,0xff,0xdb,0x24,0xff,0x00,0x00,0x24,0xdb,0x00,0xdb,0x24,0x00,0x00,0xff,0x00,0x00,0x92,0xb6,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x49,0xb6,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6d,0xb6,0x49,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x24,0xff,0x24,0xff,0x00,0x00,0xff,0x00,0xb6,0x24,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0xb6,0x49,0x00,0x00,0x00,0x00,0x00,0x6d,0xdb,0x24,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x24,0xff,0x00,0x00,0x00,0x49,0xb6,0xff,0x6d,0x92,0x00,0x00,0x00,0x24,0xff,0x24,0x00,0x00,0x00,0x00,0x24,0xff,0x24,0x00,0x00,0x00,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x92,0xdb,0xff,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xdb,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x24,0x24,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x6d,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x49,0xdb,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xdb,0x00,0xdb,0x24,0x00,0x00,0xb6,0x49,0x92,0x49,0xb6,0x00,0x00,0x00,0x49,0xff,0x49,0x00,0x00,0x00,0x00,0xdb,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x92,0x6d,0x00,0x00,0x00,0x00,0xff,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xff,0x00,0x00,0x49,0xb6,0x92,0x24,0x00,0x92,0x00
- ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0xb6,0x24,0xb6,0x24,0xb6,0xff,0x00,0x00,0x24,0xb6,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x49,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0xdb,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x49,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0xff,0x6d,0xb6,0x00,0x00,0x6d,0xff,0xff,0xff,0x6d,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x49,0xdb,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x24,0xdb,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xdb,0x24,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x49,0xb6,0xff,0x00,0x00,0xdb,0x24,0x00,0x24,0xdb,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x24,0xff,0x00,0x00,0xff,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x24,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xb6,0xb6,0xb6,0x00,0x00,0x00,0x00,0xdb,0xdb,0xdb,0x6d,0x00,0x00,0x00,0xb6,0x6d,0xb6,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x92,0x24,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xdb,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x49,0xff,0xff,0x49,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x92,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xdb,0x6d,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xdb,0x49,0xdb,0x00,0x00,0x00,0x92,0x92,0xff,0xdb,0x92,0x00,0x00,0x00,0x49,0xff,0x49,0x00,0x00,0x00,0x00,0xb6,0x49,0xdb,0x00,0x00,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0x00,0x49,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0x00,0x00,0x92,0x00,0x24,0x92,0xb6,0x49,0x00
- ,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0xb6,0x49,0x00,0x00,0x00,0x00,0x00,0xff,0x6d,0xdb,0x00,0x00,0x24,0xb6,0x00,0xb6,0x24,0xb6,0xdb,0x6d,0x00,0x24,0xdb,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x92,0x6d,0x00,0x00,0x00,0x00,0x00,0x92,0x6d,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x49,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x6d,0xb6,0x00,0x00,0x6d,0x92,0x00,0x24,0xdb,0x00,0x00,0x00,0x49,0x92,0x00,0x00,0x00,0x00,0xdb,0x6d,0x00,0x6d,0xdb,0x00,0x00,0x00,0x00,0x24,0xdb,0x49,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0xdb,0x49,0xb6,0xdb,0xdb,0x00,0x00,0x00,0xb6,0x49,0x00,0x49,0xb6,0x00,0x00,0xff,0x00,0x00,0x92,0xdb,0x00,0x00,0xdb,0x6d,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x24,0xdb,0x49,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x6d,0x00,0x24,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xdb,0x00,0x00,0x00,0xff,0x00,0x00,0x24,0xdb,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xdb,0xff,0x00,0x00,0x92,0x6d,0x00,0x6d,0x92,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x6d,0x00,0x6d,0xb6,0x00,0x00,0xff,0x00,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0x6d,0xdb,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xdb,0x6d,0x00,0x6d,0xdb,0x00,0x00,0x00,0x6d,0xff,0x6d,0x00,0x00,0x00,0x00,0xff,0x92,0xff,0x49,0x00,0x00,0x24,0xb6,0x00,0xb6,0x24,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x92,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x24,0x00,0x92,0xff,0x00,0x00,0xff,0x92,0x00,0x49,0xb6,0x00,0x00,0x92,0x6d,0x00,0x00,0x00,0x00,0x00,0xb6,0x92,0x00,0x6d,0xff,0x00,0x00,0x92,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xb6,0x49,0x00,0x6d,0xb6,0x00,0x00,0xff,0x6d,0x00,0x92,0xb6,0x00,0x00,0xb6,0x92,0x00,0x6d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xff,0x00,0x00,0x00,0x00,0xff,0x24,0x00,0x00,0x00,0xff,0x49,0x00,0xb6,0xff,0x00,0x00,0x00,0x6d,0xff,0x6d,0x00,0x00,0x00,0x6d,0xff,0xb6,0xff,0x49,0x00,0x00,0x00,0xdb,0x24,0xdb,0x00,0x00,0x00,0x00,0x6d,0xff,0x6d,0x00,0x00,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xb6,0x24,0x00,0x00,0xb6,0x24,0x00,0x49,0xff,0x49,0x24,0xb6,0xff,0xdb,0x49,0x49,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0xdb,0xb6,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xdb,0x00,0x00,0x00,0x00,0xdb,0xdb,0xff,0x49,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x24,0xdb,0xff,0xdb,0x24,0x00,0x00,0xff,0xff,0xff,0x6d,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x49,0xff,0x24,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xdb,0x00,0x00,0xff,0xff,0xff,0xb6,0x00,0x00,0x00,0x24,0xb6,0xff,0xff,0xb6,0x00,0x00,0xff,0xff,0xdb,0x6d,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0xff,0xff,0x92,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0xdb,0xff,0xdb,0x49,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x49,0x92,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x6d,0xff,0x00,0x00,0x00,0xb6,0xdb,0xb6,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0xdb,0xff,0x24,0x00,0x00,0xff,0x00,0x00,0x00,0x6d,0x92,0x00,0xff,0xff,0xff,0xb6,0x24,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x24,0xdb,0xff,0xdb,0x24,0x00,0x00,0x00,0x24,0xff,0x24,0x00,0x00,0x00,0x00,0xdb,0x49,0xff,0x49,0x00,0x00,0xb6,0x24,0x00,0x24,0xb6,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xff,0xdb,0x6d,0xff,0x00,0x00,0xff,0x6d,0xff,0xdb,0x00,0x00,0x00,0x00,0x92,0xff,0xff,0xff,0x00,0x00,0x24,0xdb,0xff,0x6d,0xff,0x00,0x00,0x00,0x92,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x92,0xff,0xff,0xff,0xb6,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xb6,0xdb,0xb6,0x00,0x00,0x00,0xff,0x6d,0xff,0xdb,0x00,0x00,0x00,0x24,0xdb,0xff,0x6d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xdb,0x49,0x00,0x00,0x00,0x00,0x49,0xff,0xff,0x00,0x00,0x49,0xb6,0x92,0x24,0xff,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x49,0xff,0x00,0xff,0x24,0x00,0x00,0xb6,0x49,0x00,0x49,0xb6,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x24,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x49,0x00,0x49,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x24,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x24,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x92,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xff,0xff,0xb6,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-};
-// clang-format on
-
-constexpr char kTextureFirstChar = '!';
-constexpr char kTextureLastChar = '~';
-constexpr int kTextureTotalChars = kTextureLastChar - kTextureFirstChar + 1;
-constexpr int kCharWidth = 7;
-constexpr int kCharHeight = 11;
-constexpr int kTextureWidth = kTextureTotalChars * kCharWidth;
-constexpr int kTextureHeight = kCharHeight;
-
-std::string vert_shader = SHADER0([]() { // NOLINT
- layout(location = 0) in vec2 position;
- layout(location = 1) in vec2 uv;
-
- out vec2 texCoords;
-
- void main() {
- gl_Position = vec4(position, 0.0, 1.0f);
- texCoords = vec2(uv.x, 1.0 - uv.y);
- }
-});
-
-// Uniform locations used in the following shader
-#define UNIFORM_LOCATION_DIGITS 0
-#define UNIFORM_LOCATION_COLOR 1
-
-std::string frag_shader = SHADER0([]() { // NOLINT
- precision mediump float;
-
- out vec4 color;
- in vec2 texCoords;
- layout(location = 0) uniform sampler2D digitsTexture;
- layout(location = 1) uniform vec4 mixColor;
-
- void main() {
- float alpha = texture(digitsTexture, texCoords).r;
- color = vec4(mixColor.rgb, alpha * mixColor.a);
- }
-});
-
-} // anonymous namespace
-
-void DebugText::SetViewportSize(int viewport_width, int viewport_height) {
- pixel_size_screen_space_ = vec2(2.0f / static_cast<float>(viewport_width),
- 2.0f / static_cast<float>(viewport_height));
-}
-
-DebugText::DebugText(int max_digits, int viewport_width, int viewport_height) {
- max_digits_ = max_digits;
- SetViewportSize(viewport_width, viewport_height);
-
- shader_.Link(vert_shader, frag_shader);
- shader_.Use();
- glUniform1i(UNIFORM_LOCATION_DIGITS, 0);
-
- // Num quads * 6 vertices per quad.
- mesh_.SetVertices(max_digits * 6, nullptr, GL_TRIANGLES, GL_DYNAMIC_DRAW);
-
- glGenTextures(1, &texture_);
- glBindTexture(GL_TEXTURE_2D, texture_);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, kTextureWidth, kTextureHeight, 0,
- GL_RED, GL_UNSIGNED_BYTE, ascii_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glBindTexture(GL_TEXTURE_2D, 0);
- CHECK_GL();
-}
-
-DebugText::~DebugText() {}
-
-void DebugText::Draw(float x, float y, float scale, float r, float g, float b,
- float a, const char* str, float stereo_offset,
- uint8_t axis) {
- assert(axis < 2);
- shader_.Use();
- glUniform4f(UNIFORM_LOCATION_COLOR, r, g, b, a);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, texture_);
- CHECK_GL();
-
- float px = x;
- float py = y;
- float x_advance = scale * static_cast<float>(kCharWidth);
- float y_advance = 0.0f;
- float x_height = 0.0f;
- float y_height = scale * static_cast<float>(kCharHeight);
- if (axis) {
- std::swap(x_advance, y_advance);
- std::swap(x_height, y_height);
- }
- x_advance *= pixel_size_screen_space_[0];
- x_height *= pixel_size_screen_space_[0];
- y_advance *= pixel_size_screen_space_[1];
- y_height *= pixel_size_screen_space_[1];
- int max_digits = stereo_offset != 0.0f ? max_digits_ / 2 : max_digits_;
- int len = std::min(max_digits, static_cast<int>(strlen(str)));
-
- int num_quads = stereo_offset != 0.0f ? len * 2 : len;
- std::tuple<vec2, vec2>* vbo =
- mesh_.Map(GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT, num_quads * 6);
-
- int v = 0;
- for (int i = 0; i < len; ++i) {
- char digit = str[i];
- if (digit == '\n') {
- if (axis == 0) {
- py += y_height;
- px = x;
- } else {
- px -= x_height;
- py = y;
- }
- continue;
- }
- if (digit < kTextureFirstChar || digit > kTextureLastChar) {
- px += x_advance;
- py += y_advance;
- continue;
- }
-
- int tex_digit = digit - kTextureFirstChar;
-
- // Add screenspace tri vertices in CCW order starting with bottom left.
- float tx =
- static_cast<float>(tex_digit) / static_cast<float>(kTextureTotalChars);
- float tx2 = tx + 1.0f / static_cast<float>(kTextureTotalChars);
- vbo[v * 6 + 0] = {vec2(px, py), vec2(tx, 0.0f)};
- vbo[v * 6 + 1] = {vec2(px + x_advance, py + y_advance), vec2(tx2, 0.0f)};
- vbo[v * 6 + 2] = {
- vec2(px + x_advance + x_height, py + y_advance + y_height),
- vec2(tx2, 1.0f)};
- vbo[v * 6 + 3] = vbo[v * 6 + 0];
- vbo[v * 6 + 4] = vbo[v * 6 + 2];
- vbo[v * 6 + 5] = {vec2(px + x_height, py + y_height), vec2(tx, 1.0f)};
- px += x_advance;
- py += y_advance;
- ++v;
- }
-
- if (stereo_offset != 0.0f) {
- int num_chars = v;
- for (int i = 0; i < num_chars; ++i) {
- for (int j = 0; j < 6; ++j) {
- vbo[v * 6 + j] = vbo[i * 6 + j];
- // The 0th tuple element is the vertex position vec2.
- std::get<0>(vbo[v * 6 + j])[axis] += stereo_offset;
- }
- ++v;
- }
- }
-
- mesh_.Unmap();
-
- mesh_.Draw(v * 6);
- glBindTexture(GL_TEXTURE_2D, texture_);
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdvrgraphics/egl_image.cpp b/libs/vr/libdvrgraphics/egl_image.cpp
deleted file mode 100644
index 26d68cd..0000000
--- a/libs/vr/libdvrgraphics/egl_image.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "include/private/dvr/graphics/egl_image.h"
-
-#include <hardware/gralloc.h>
-
-#include <memory>
-
-#include <private/dvr/native_buffer.h>
-
-namespace android {
-namespace dvr {
-
-EGLImageKHR CreateEglImage(EGLDisplay dpy, int width, int height, int format,
- int usage) {
- auto image = std::make_shared<IonBuffer>(width, height, format, usage);
-
- return eglCreateImageKHR(
- dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
- static_cast<ANativeWindowBuffer*>(new NativeBuffer(image)), nullptr);
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdvrgraphics/gpu_profiler.cpp b/libs/vr/libdvrgraphics/gpu_profiler.cpp
deleted file mode 100644
index c8c978d..0000000
--- a/libs/vr/libdvrgraphics/gpu_profiler.cpp
+++ /dev/null
@@ -1,296 +0,0 @@
-#include "include/private/dvr/graphics/gpu_profiler.h"
-
-#include <log/log.h>
-
-#include <private/dvr/clock_ns.h>
-
-namespace android {
-namespace dvr {
-
-namespace {
-
-constexpr int kMaxPendingQueries = 32;
-
-} // anonynmous namespace
-
-static int64_t AdjustTimerQueryToNs(int64_t gpu_time) { return gpu_time; }
-
-void GpuProfiler::TimerData::reset() {
- total_elapsed_ns = 0;
- num_events = 0;
-}
-
-void GpuProfiler::TimerData::print(const char* name) const {
- ALOGI("GPU_TIME[%s]: %f ms", name,
- (float)((double)total_elapsed_ns / 1000000.0 / (double)num_events));
-}
-
-// Enter a scope, records the timestamp for later matching with leave.
-void GpuProfiler::TimerData::enter(int64_t timestamp_ns) {
- entered = true;
- enter_timestamp_ns = timestamp_ns;
-}
-
-// Compute the elapsed time for the scope.
-void GpuProfiler::TimerData::leave(int64_t timestamp_ns, const char* name,
- std::weak_ptr<int64_t> duration_ns,
- int print_period) {
- if (!entered) {
- // We got the leave event but are missing the enter. This can happen if
- // OnPendingQueryOverflow() is called, or if the calls to enter()/leave()
- // aren't properly balanced. Ignore the call but print a warning.
- ALOGW("Ignoring GpuProfiler::TimerData::leave event with no enter event");
- return;
- }
- entered = false;
-
- int64_t elapsed = timestamp_ns - enter_timestamp_ns;
- if (elapsed > 1000 * 1000 * 1000) {
- // More than one second, drop it as invalid data.
- return;
- }
- if (auto out_ns = duration_ns.lock()) {
- *out_ns = elapsed;
- }
- total_elapsed_ns += elapsed;
- if (print_period > 0 && ++num_events >= print_period) {
- print(name);
- reset();
- }
-}
-
-GpuProfiler* GpuProfiler::Get() {
- static GpuProfiler* profiler = new GpuProfiler();
- return profiler;
-}
-
-GpuProfiler::GpuProfiler()
- : enable_gpu_tracing_(true),
- has_gl_context_(false),
- sync_with_cpu_time_(false),
- gl_timer_offset_ns_(0) {
-}
-
-GpuProfiler::~GpuProfiler() { Clear(); }
-
-bool GpuProfiler::IsGpuProfilingSupported() const {
- // TODO(jbates) check for GL_EXT_disjoint_timer_query
- return true;
-}
-
-GLuint GpuProfiler::TryAllocateGlQueryId() {
- if (pending_gpu_queries_.size() >= kMaxPendingQueries)
- OnPendingQueryOverflow();
-
- GLuint query_id = 0;
- if (gl_timer_query_id_pool_.empty()) {
- glGenQueries(1, &query_id);
- } else {
- query_id = gl_timer_query_id_pool_.top();
- gl_timer_query_id_pool_.pop();
- }
- return query_id;
-}
-
-void GpuProfiler::EnterGlScope(const char* scope_name) {
- GLuint query_id = TryAllocateGlQueryId();
- if (query_id != 0) {
- glQueryCounter(query_id, GL_TIMESTAMP_EXT);
- pending_gpu_queries_.push_back(
- GpuTimerQuery(GetSystemClockNs(), scope_name, std::weak_ptr<int64_t>(),
- -1, query_id, GpuTimerQuery::kQueryBeginScope));
- }
-}
-
-void GpuProfiler::LeaveGlScope(const char* scope_name,
- std::weak_ptr<int64_t> duration_ns,
- int print_period) {
- GLuint query_id = TryAllocateGlQueryId();
- if (query_id != 0) {
- glQueryCounter(query_id, GL_TIMESTAMP_EXT);
- pending_gpu_queries_.push_back(
- GpuTimerQuery(GetSystemClockNs(), scope_name, duration_ns, print_period,
- query_id, GpuTimerQuery::kQueryEndScope));
- }
-}
-
-void GpuProfiler::OnGlContextCreated() {
- has_gl_context_ = true;
- gl_timer_offset_ns_ = 0;
- SyncGlTimebase();
-}
-
-void GpuProfiler::OnGlContextDestroyed() {
- has_gl_context_ = false;
- Clear();
-}
-
-void GpuProfiler::Clear() {
- events_.clear();
- for (auto& query : pending_gpu_queries_)
- glDeleteQueries(1, &query.query_id);
- pending_gpu_queries_.clear();
- while (!gl_timer_query_id_pool_.empty()) {
- GLuint id = gl_timer_query_id_pool_.top();
- gl_timer_query_id_pool_.pop();
- glDeleteQueries(1, &id);
- }
-}
-
-void GpuProfiler::OnPendingQueryOverflow() {
- ALOGW("Reached limit of %d pending queries in GpuProfiler."
- " Clearing all queries.", kMaxPendingQueries);
- Clear();
-}
-
-void GpuProfiler::SyncGlTimebase() {
- if (!sync_with_cpu_time_) {
- return;
- }
-
- // Clear disjoint error status.
- // This error status indicates that we need to ignore the result of the
- // timer query because of some kind of disjoint GPU event such as heat
- // throttling.
- GLint disjoint = 0;
- glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint);
-
- // Try to get the current GL timestamp. Since the GPU can supposedly fail to
- // produce a timestamp occasionally we try a few times before giving up.
- int attempts_remaining = 3;
- do {
- GLint64 gl_timestamp = 0;
- glGetInteger64v(GL_TIMESTAMP_EXT, &gl_timestamp);
- gl_timestamp = AdjustTimerQueryToNs(gl_timestamp);
-
- // Now get the CPU timebase.
- int64_t cpu_timebase_ns = static_cast<int64_t>(GetSystemClockNs());
-
- disjoint = 0;
- glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint);
- if (!disjoint) {
- gl_timer_offset_ns_ = cpu_timebase_ns - gl_timestamp;
- break;
- }
- ALOGW("WARNING: Skipping disjoint GPU timestamp");
- } while (--attempts_remaining > 0);
-
- if (attempts_remaining == 0) {
- ALOGE("ERROR: Failed to sync GL timebase due to disjoint results\n");
- gl_timer_offset_ns_ = 0;
- }
-}
-
-void GpuProfiler::QueryFrameBegin() {
- GLuint begin_frame_id = TryAllocateGlQueryId();
- if (begin_frame_id != 0) {
- glQueryCounter(begin_frame_id, GL_TIMESTAMP_EXT);
- pending_gpu_queries_.push_back(
- GpuTimerQuery(GetSystemClockNs(), 0, std::weak_ptr<int64_t>(), -1,
- begin_frame_id, GpuTimerQuery::kQueryBeginFrame));
- }
-}
-
-void GpuProfiler::PollGlTimerQueries() {
- if (!enabled()) {
- return;
- }
-
-#ifdef ENABLE_DISJOINT_TIMER_IGNORING
- bool has_checked_disjoint = false;
- bool was_disjoint = false;
-#endif
- for (;;) {
- if (pending_gpu_queries_.empty()) {
- // No queries pending.
- return;
- }
-
- GpuTimerQuery query = pending_gpu_queries_.front();
-
- GLint available = 0;
- glGetQueryObjectiv(query.query_id, GL_QUERY_RESULT_AVAILABLE_EXT,
- &available);
- if (!available) {
- // No queries available.
- return;
- }
-
- // Found an available query, remove it from pending queue.
- pending_gpu_queries_.pop_front();
- gl_timer_query_id_pool_.push(query.query_id);
-
-#ifdef ENABLE_DISJOINT_TIMER_IGNORING
- if (!has_checked_disjoint) {
- // Check if we need to ignore the result of the timer query because
- // of some kind of disjoint GPU event such as heat throttling.
- // If so, we ignore all events that are available during this loop.
- has_checked_disjoint = true;
- GLint disjoint_occurred = 0;
- glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_occurred);
- was_disjoint = !!disjoint_occurred;
- if (was_disjoint) {
- ALOGW("Skipping disjoint GPU events");
- }
- }
-
- if (was_disjoint) {
- continue;
- }
-#endif
-
- GLint64 timestamp_ns = 0;
- glGetQueryObjecti64v(query.query_id, GL_QUERY_RESULT_EXT, ×tamp_ns);
- timestamp_ns = AdjustTimerQueryToNs(timestamp_ns);
-
- int64_t adjusted_timestamp_ns;
-
- if (sync_with_cpu_time_) {
- adjusted_timestamp_ns = timestamp_ns + gl_timer_offset_ns_;
-
- if (query.type == GpuTimerQuery::kQueryBeginFrame ||
- query.type == GpuTimerQuery::kQueryBeginScope) {
- if (adjusted_timestamp_ns < query.timestamp_ns) {
- // GPU clock is behind, adjust our offset to correct it.
- gl_timer_offset_ns_ += query.timestamp_ns - adjusted_timestamp_ns;
- adjusted_timestamp_ns = query.timestamp_ns;
- }
- }
- } else {
- adjusted_timestamp_ns = timestamp_ns;
- }
-
- switch (query.type) {
- case GpuTimerQuery::kQueryBeginFrame:
- break;
- case GpuTimerQuery::kQueryBeginScope:
- events_[query.scope_name].enter(adjusted_timestamp_ns);
- break;
- case GpuTimerQuery::kQueryEndScope:
- events_[query.scope_name].leave(adjusted_timestamp_ns, query.scope_name,
- query.duration_ns, query.print_period);
- break;
- }
- }
-}
-
-void GpuProfiler::FinishGlTimerQueries() {
- if (!enabled()) {
- return;
- }
-
- glFlush();
- PollGlTimerQueries();
- int max_iterations = 100;
- while (!pending_gpu_queries_.empty()) {
- if (--max_iterations <= 0) {
- ALOGE("Error: GL timer queries failed to finish.");
- break;
- }
- PollGlTimerQueries();
- usleep(1000);
- }
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/blur.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/blur.h
deleted file mode 100644
index c1c2b91..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/blur.h
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef ANDROID_DVR_GRAPHICS_BLUR_H_
-#define ANDROID_DVR_GRAPHICS_BLUR_H_
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GLES2/gl2.h>
-
-#include <algorithm>
-#include <vector>
-
-#include <private/dvr/ring_buffer.h>
-
-namespace android {
-namespace dvr {
-
-class Blur {
- public:
- // Construct a blur kernel for GL that works on source textures of the given
- // size. The given source_texture is configured for linear filtering.
- // |source_texture_target| is for |source_texture| while
- // |target_texture_target| is used for all the intermediate and output
- // buffers.
- // |num_blur_outputs| determines how many blurs this instance can be used for
- // in a single frame.
- Blur(int w, int h, GLuint source_texture, GLint source_texture_target,
- GLint target_texture_target, bool is_external, EGLDisplay display,
- int num_blur_outputs);
- ~Blur();
-
- // Place all output textures back into the FBO pool for a new frame.
- // Call this at the start of each frame before doing one or more blurs.
- void StartFrame();
-
- // Draw a multipass blur from the given source_texture. The resulting texture
- // is returned. The given source_texture is configured for linear filtering.
- // A segfault will occur if the application calls DrawBlur more times than
- // |num_blur_outputs| without calling StartFrame.
- // It is up to the calling code to change the framebuffer after this method.
- GLuint DrawBlur(GLuint source_texture);
-
- float width() const { return width_; }
- float height() const { return height_; }
- float scale() const { return scale_; }
-
- // Set the scale of the blur, usually between 0 and 1. This is only useful for
- // animation.
- // At the steady state, the scale should be set to 1. To change the steady
- // state blur appearance, the kernel patterns in DrawBlur should be modified
- // instead of using scale.
- void set_scale(float scale) { scale_ = scale; }
-
- // Animate the blur by |delta|. Clamp the result between |low| and |high|.
- // Recommended range is between 0 and 1, but other values will also work.
- void animate(float delta, float low, float high) {
- scale_ += delta;
- scale_ = std::min(high, std::max(low, scale_));
- }
-
- private:
- struct Fbo {
- Fbo() : fbo(0), renderbuffer(0), texture(0), egl_image(0) {}
- GLuint fbo;
- GLuint renderbuffer;
- GLuint texture;
- EGLImageKHR egl_image;
- };
-
- Fbo CreateFbo(int w, int h, GLuint source_texture, GLint tex_target,
- bool is_external);
-
- // EGL display for when target texture format is EGL image.
- EGLDisplay display_;
- GLint target_texture_target_;
- int width_;
- int height_;
- Fbo source_fbo_;
- Fbo fbo_half_;
- std::vector<Fbo> fbo_q_;
- RingBuffer<Fbo> fbo_q_free_;
- float scale_;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_GRAPHICS_BLUR_H_
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/debug_text.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/debug_text.h
deleted file mode 100644
index bbe891b..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/debug_text.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef ANDROID_DVR_GRAPHICS_FPS_GRAPH_H
-#define ANDROID_DVR_GRAPHICS_FPS_GRAPH_H
-
-#include <private/dvr/graphics/mesh.h>
-#include <private/dvr/graphics/shader_program.h>
-
-namespace android {
-namespace dvr {
-
-// Debug text class that draws small text with Open GL.
-class DebugText {
- public:
- DebugText(int max_digits, int viewport_width, int viewport_height);
- ~DebugText();
-
- void SetViewportSize(int viewport_width, int viewport_height);
-
- // Draw text at given screen-space location, scale and color.
- // A |scale| of 1.0 means 1:1 pixel mapping with current viewport size.
- // If |stereo_offset| is not zero, the string will be rendered again
- // with the given offset for stereo rendering. The stereo axis can be on
- // screenspace x or y axis, which is given by |axis| as 0 or 1,
- // respectively. |axis| also determines the direction that text is rendered.
- void Draw(float x, float y, float scale, float r, float g, float b, float a,
- const char* str, float stereo_offset, uint8_t axis);
-
- // Helper that draws green text at render target resolution.
- void Draw(float x, float y, const char* str, float stereo_offset,
- uint8_t axis) {
- Draw(x, y, 1.0f, 0, 1, 0, 1, str, stereo_offset, axis);
- }
-
- private:
- int max_digits_;
- vec2 pixel_size_screen_space_;
- ShaderProgram shader_;
- GLuint texture_;
- Mesh<vec2, vec2> mesh_;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_GRAPHICS_FPS_GRAPH_H
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/egl_image.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/egl_image.h
deleted file mode 100644
index 59de61e..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/egl_image.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef ANDROID_DVR_GRAPHICS_EGL_IMAGE_H_
-#define ANDROID_DVR_GRAPHICS_EGL_IMAGE_H_
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-namespace android {
-namespace dvr {
-
-// Create an EGLImage with texture storage defined by the given format and
-// usage flags.
-// For example, to create an RGBA texture for rendering to, specify:
-// format = HAL_PIXEL_FORMAT_RGBA_8888;
-// usage = GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_HW_RENDER;
-EGLImageKHR CreateEglImage(EGLDisplay dpy, int width, int height, int format,
- int usage);
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_GRAPHICS_EGL_IMAGE_H_
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/gpu_profiler.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/gpu_profiler.h
deleted file mode 100644
index c6e752b..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/gpu_profiler.h
+++ /dev/null
@@ -1,236 +0,0 @@
-#ifndef ANDROID_DVR_GPU_PROFILER_H_
-#define ANDROID_DVR_GPU_PROFILER_H_
-
-// This file contains classes and macros related to run-time performance
-// profiling of GPU processing.
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <stack>
-#include <vector>
-
-#include <private/dvr/graphics/vr_gl_extensions.h>
-
-namespace android {
-namespace dvr {
-
-// While enabled, GL commands will be submitted each frame to query timestamps
-// of GPU workloads that have been traced using the ION_PROFILE_GPU macro
-// defined below.
-//
-// Basic workflow:
-// - have the app framework call PollGlTimerQueries at the start of each frame.
-// - place ION_PROFILE_GPU("MyGlWorkload") at the start of code scopes where
-// GL draw commands are performed that you want to trace.
-class GpuProfiler {
- public:
- // Gets the GpuProfiler singleton instance.
- static GpuProfiler* Get();
-
- GpuProfiler();
- ~GpuProfiler();
-
- bool IsGpuProfilingSupported() const;
-
- // Enables runtime GPU tracing. While enabled, GL commands will be submitted
- // each frame to query timestamps of GPU workloads that have been traced using
- // one of the TRACE_GPU* macros defined below.
- void SetEnableGpuTracing(bool enabled) { enable_gpu_tracing_ = enabled; }
-
- bool enabled() const { return enable_gpu_tracing_ && has_gl_context_; }
-
- // Attempt to keep the GPU times in sync with CPU times.
- void SetEnableSyncCpuTime(bool enabled) { sync_with_cpu_time_ = enabled; }
-
- // When sync cpu time is enabled because of mobile GPU timer query issues,
- // it can sometimes help to put a beginning timer query at the start of the
- // frame to sync the CPU time when GPU work begins.
- void QueryFrameBegin();
-
- // Polls (non-blocking) for completed GL timer query data and adds events into
- // the trace buffer. Must call once close to the start of each frame.
- void PollGlTimerQueries();
-
- // Call glFinish and process all pending timer queries.
- void FinishGlTimerQueries();
-
- // Records the beginning of a scoped GL trace event.
- void EnterGlScope(const char* scope_name);
-
- // Records the end of a scoped GL trace event.
- void LeaveGlScope(const char* scope_name, std::weak_ptr<int64_t> duration_ns,
- int print_period);
-
- // Must be called when the GL context is created. The GpuProfiler will be
- // inactive until this is called.
- void OnGlContextCreated();
-
- // Must be called before the GL context is destroyed. The GpuProfiler will be
- // inactive until a call to OnGlContextCreated().
- void OnGlContextDestroyed();
-
- private:
- // Data to queue the pending GPU timer queries that need to be polled
- // for completion.
- struct GpuTimerQuery {
- enum QueryType {
- kQueryBeginFrame,
- kQueryBeginScope,
- kQueryEndScope,
- };
-
- // scope_id is only required for kQueryBeginScope query types.
- GpuTimerQuery(int64_t timestamp_ns, const char* scope_name,
- std::weak_ptr<int64_t> duration_ns, int print_period,
- GLuint query_id, QueryType type)
- : timestamp_ns(timestamp_ns),
- scope_name(scope_name),
- duration_ns(duration_ns),
- print_period(print_period),
- query_id(query_id),
- type(type) {}
-
- int64_t timestamp_ns;
- const char* scope_name;
- std::weak_ptr<int64_t> duration_ns;
- int print_period;
- GLuint query_id;
- QueryType type;
- };
-
- // Struct that tracks timing data for a particular trace scope.
- struct TimerData {
- void reset();
-
- // Print the profiling data.
- void print(const char* name) const;
-
- // Enter a scope, records the timestamp for later matching with leave.
- void enter(int64_t timestamp_ns);
-
- // Compute the elapsed time for the scope.
- void leave(int64_t timestamp_ns, const char* name,
- std::weak_ptr<int64_t> duration_ns, int print_period);
-
- bool entered = false;
- int64_t total_elapsed_ns = 0;
- int64_t enter_timestamp_ns = 0;
- int num_events = 0;
- };
-
- // Clear out events and free GL resources.
- void Clear();
-
- // Called when we detect that we've overflowed the pending query queue. This
- // shouldn't occur in practice, and probably indicates some internal
- // mismanagement of the gl query objects.
- void OnPendingQueryOverflow();
-
- // Synchronises the GL timebase with the CallTraceManager timebase.
- void SyncGlTimebase();
-
- // Returns a GL timer query ID if possible. Otherwise returns 0.
- GLuint TryAllocateGlQueryId();
-
- // Setting for enabling GPU tracing.
- bool enable_gpu_tracing_;
-
- // True if we have a GL context, false otherwise. When the GpuProfiler is
- // first created we assume no GL context.
- bool has_gl_context_;
-
- // Setting for synchronizing GPU timestamps with CPU time.
- bool sync_with_cpu_time_;
-
- // Nanosecond offset to the GL timebase to compute the CallTraceManager time.
- int64_t gl_timer_offset_ns_;
-
- std::map<const char*, TimerData> events_;
-
- // For GPU event TraceRecords, this tracks the pending queries that will
- // be asynchronously polled (in order) and then added to the TraceRecorder
- // buffer with the GPU timestamps.
- std::deque<GpuTimerQuery> pending_gpu_queries_;
-
- // Available ids for use with GLTimerQuery as needed. This will generally
- // reach a steady state after a few frames. Always push and pop from the back
- // to avoid shifting the vector.
- std::stack<GLuint, std::vector<GLuint> > gl_timer_query_id_pool_;
-};
-
-// Traces the GPU start and end times of the GL commands submitted in the
-// same scope. Typically used via the TRACE_GPU macro.
-class ScopedGlTracer {
- public:
- ScopedGlTracer(const char* name, std::weak_ptr<int64_t> duration_ns,
- int print_period, bool finish)
- : name_(name),
- duration_ns_(duration_ns),
- print_period_(print_period),
- is_finish_(finish) {
- GpuProfiler* profiler = GpuProfiler::Get();
- if (profiler->enabled()) {
- profiler->EnterGlScope(name);
- }
- }
-
- ~ScopedGlTracer() {
- GpuProfiler* profiler = GpuProfiler::Get();
- if (profiler->enabled()) {
- profiler->LeaveGlScope(name_, duration_ns_, print_period_);
- if (is_finish_) {
- GpuProfiler::Get()->FinishGlTimerQueries();
- }
- }
- }
-
- private:
- const char* name_;
- std::weak_ptr<int64_t> duration_ns_;
- int print_period_;
- bool is_finish_;
-};
-
-} // namespace dvr
-} // namespace android
-
-#define PROFILING_PASTE1(x, y) x##y
-#define PROFILING_PASTE2(x, y) PROFILING_PASTE1(x, y)
-#define PROFILING_PASTE3(x) PROFILING_PASTE2(x, __LINE__)
-
-// This macro can be used in any GL operation scope to trace the resulting
-// GPU work. The argument must be a literal string. Specify the number of frames
-// to wait before printing an average result in the num_frames_period argument.
-#define TRACE_GPU_PRINT(group_name, num_frames_period) \
- (void)group_name " must be a literal string."; \
- android::dvr::ScopedGlTracer PROFILING_PASTE3(gpu_tracer_)( \
- group_name, std::weak_ptr<int64_t>(), num_frames_period, false)
-
-// This macro can be used in any GL operation scope to trace the resulting
-// GPU work. The argument must be a literal string. The duration parameter
-// is a weak_ptr to a int64_t that will receive duration values asynchronously
-// during calls to PollGlTimerQueries.
-#define TRACE_GPU(group_name, duration_ns_weak_ptr) \
- (void)group_name " must be a literal string."; \
- android::dvr::ScopedGlTracer PROFILING_PASTE3(gpu_tracer_)( \
- group_name, duration_ns_weak_ptr, -1, false)
-
-// This macro can be used in any GL operation scope to trace the resulting
-// GPU work. The argument must be a literal string. Specify the number of frames
-// to wait before printing an average result in the num_frames_period argument.
-#define TRACE_GPU_PRINT_FINISH(group_name) \
- (void)group_name " must be a literal string."; \
- android::dvr::ScopedGlTracer PROFILING_PASTE3(gpu_tracer_)( \
- group_name, std::weak_ptr<int64_t>(), 1, true)
-
-// This macro can be used in any GL operation scope to trace the resulting
-// GPU work. The argument must be a literal string. The duration parameter
-// is a weak_ptr to a int64_t that will receive duration values asynchronously
-// during calls to PollGlTimerQueries.
-#define TRACE_GPU_FINISH(group_name, duration_ns_weak_ptr) \
- (void)group_name " must be a literal string."; \
- android::dvr::ScopedGlTracer PROFILING_PASTE3(gpu_tracer_)( \
- group_name, duration_ns_weak_ptr, -1, true)
-
-#endif // ANDROID_DVR_GPU_PROFILER_H_
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/indexed_mesh.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/indexed_mesh.h
deleted file mode 100644
index 7e74a75..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/indexed_mesh.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef ANDROID_DVR_GRAPHICS_INDEXED_MESH_H_
-#define ANDROID_DVR_GRAPHICS_INDEXED_MESH_H_
-
-#include <private/dvr/graphics/vertex_attributes.h>
-#include <private/dvr/types.h>
-
-#include <EGL/egl.h>
-#include <GLES3/gl3.h>
-#include <tuple>
-
-namespace android {
-namespace dvr {
-
-namespace Details {
-
-// We can have 16 and 32bit indices.
-template <typename T>
-GLenum GetIndexType();
-template <>
-inline GLenum GetIndexType<uint16_t>() {
- return GL_UNSIGNED_SHORT;
-}
-template <>
-inline GLenum GetIndexType<uint32_t>() {
- return GL_UNSIGNED_INT;
-}
-
-} // namespace Details
-
-template <typename INDEX_TYPE, typename... Attributes>
-class IndexedMesh {
- public:
- static const int attribute_size = sizeof(std::tuple<Attributes...>);
-
- IndexedMesh() {}
- IndexedMesh(INDEX_TYPE number_of_vertices, const void* vertices,
- INDEX_TYPE number_of_indices, const void* indices) {
- SetVertices(number_of_vertices, vertices, number_of_indices, indices);
- }
-
- IndexedMesh(INDEX_TYPE number_of_vertices, const void* vertices,
- INDEX_TYPE number_of_indices, const void* indices,
- GLenum element_type) {
- SetVertices(number_of_vertices, vertices, number_of_indices, indices,
- element_type);
- }
-
- IndexedMesh(IndexedMesh&& to_move) { Swap(to_move); }
-
- ~IndexedMesh() { DeleteGLData(); }
-
- IndexedMesh& operator=(IndexedMesh&& to_move) {
- Swap(to_move);
- return *this;
- }
-
- operator bool() const { return mesh_vbo_ != 0; }
-
- void Swap(IndexedMesh& to_swap) {
- std::swap(mesh_vbo_, to_swap.mesh_vbo_);
- std::swap(mesh_vao_, to_swap.mesh_vao_);
- std::swap(mesh_ibo_, to_swap.mesh_ibo_);
- std::swap(number_of_indices_, to_swap.number_of_indices_);
- std::swap(element_type_, to_swap.element_type_);
- }
-
- void Draw() {
- if (!mesh_vbo_)
- return;
-
- glBindVertexArray(mesh_vao_);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh_ibo_);
-
- glDrawElements(element_type_, number_of_indices_,
- Details::GetIndexType<INDEX_TYPE>(), nullptr);
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
- }
-
- void SetVertices(INDEX_TYPE number_of_vertices, const void* vertices,
- INDEX_TYPE number_of_indices, const void* indices,
- GLenum element_type) {
- element_type_ = element_type;
- SetVertices(number_of_vertices, vertices, number_of_indices, indices);
- }
-
- void SetVertices(INDEX_TYPE number_of_vertices, const void* vertices,
- INDEX_TYPE number_of_indices, const void* indices) {
- DeleteGLData();
- number_of_indices_ = number_of_indices;
- glGenBuffers(1, &mesh_vbo_);
- glGenVertexArrays(1, &mesh_vao_);
- glGenBuffers(1, &mesh_ibo_);
- glBindVertexArray(mesh_vao_);
-
- glBindBuffer(GL_ARRAY_BUFFER, mesh_vbo_);
- glBufferData(GL_ARRAY_BUFFER, attribute_size * number_of_vertices, vertices,
- GL_STATIC_DRAW);
-
- SetupAttributes();
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh_ibo_);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER,
- sizeof(INDEX_TYPE) * number_of_indices_, indices,
- GL_STATIC_DRAW);
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
- }
-
- size_t GetAttributesSize() const { return attribute_size; }
-
- private:
- IndexedMesh(const IndexedMesh&) = delete;
- IndexedMesh& operator=(const IndexedMesh&) = delete;
-
- void DeleteGLData() {
- if (mesh_vbo_) {
- glDeleteBuffers(1, &mesh_vbo_);
- glDeleteVertexArrays(1, &mesh_vao_);
- glDeleteBuffers(1, &mesh_ibo_);
- mesh_vbo_ = 0;
- mesh_vao_ = 0;
- mesh_ibo_ = 0;
- number_of_indices_ = 0;
- }
- }
-
- void SetupAttributes() {
- const auto size = std::tuple_size<std::tuple<Attributes...>>::value;
- Details::VertexAttribHelper<size - 1, Attributes...>{}();
- }
-
- private:
- GLuint mesh_vbo_ = 0;
- GLuint mesh_vao_ = 0;
- GLuint mesh_ibo_ = 0;
- INDEX_TYPE number_of_indices_ = 0;
-
- GLenum element_type_ = GL_TRIANGLES;
-};
-
-template <typename... Attributes>
-using Indexed16Mesh = IndexedMesh<uint16_t, Attributes...>;
-
-template <typename... Attributes>
-using Indexed32Mesh = IndexedMesh<uint32_t, Attributes...>;
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_GRAPHICS_INDEXED_MESH_H_
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/mesh.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/mesh.h
deleted file mode 100644
index 45bc108..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/mesh.h
+++ /dev/null
@@ -1,128 +0,0 @@
-#ifndef ANDROID_DVR_GRAPHICS_MESH_H_
-#define ANDROID_DVR_GRAPHICS_MESH_H_
-
-#include <private/dvr/graphics/vertex_attributes.h>
-#include <private/dvr/types.h>
-
-#include <EGL/egl.h>
-#include <GLES3/gl3.h>
-#include <tuple>
-
-namespace android {
-namespace dvr {
-
-template <typename... Attributes>
-class Mesh {
- public:
- static const int attribute_size = sizeof(std::tuple<Attributes...>);
-
- Mesh() {}
-
- Mesh(uint32_t number_of_vertices, const void* vertices) {
- SetVertices(number_of_vertices, vertices);
- }
-
- Mesh(uint32_t number_of_vertices, const void* vertices, GLenum element_type) {
- SetVertices(number_of_vertices, vertices, element_type);
- }
-
- Mesh(Mesh&& to_move) { Swap(to_move); }
-
- ~Mesh() { DeleteGLData(); }
-
- Mesh& operator=(const Mesh&& to_move) {
- Swap(to_move);
- return *this;
- }
-
- operator bool() const { return mesh_vbo_ != 0; }
-
- void Swap(Mesh& to_swap) {
- std::swap(mesh_vbo_, to_swap.mesh_vbo_);
- std::swap(mesh_vao_, to_swap.mesh_vao_);
- std::swap(number_of_vertices_, to_swap.number_of_vertices_);
- std::swap(element_type_, to_swap.element_type_);
- }
-
- void Draw(uint32_t number_of_vertices) {
- if (!mesh_vbo_)
- return;
-
- glBindVertexArray(mesh_vao_);
- glDrawArrays(element_type_, 0, number_of_vertices);
- glBindVertexArray(0);
- }
-
- void Draw() { Draw(number_of_vertices_); }
-
- void SetVertices(uint32_t number_of_vertices, const void* vertices,
- GLenum element_type, GLenum usage) {
- DeleteGLData();
- element_type_ = element_type;
- number_of_vertices_ = number_of_vertices;
- glGenBuffers(1, &mesh_vbo_);
- glGenVertexArrays(1, &mesh_vao_);
- glBindVertexArray(mesh_vao_);
-
- glBindBuffer(GL_ARRAY_BUFFER, mesh_vbo_);
- glBufferData(GL_ARRAY_BUFFER, attribute_size * number_of_vertices, vertices,
- usage);
-
- SetupAttributes();
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
- }
-
- void SetVertices(uint32_t number_of_vertices, const void* vertices) {
- SetVertices(number_of_vertices, vertices, element_type_, GL_STATIC_DRAW);
- }
-
- void SetVertices(uint32_t number_of_vertices, const void* vertices,
- GLenum element_type) {
- SetVertices(number_of_vertices, vertices, element_type, GL_STATIC_DRAW);
- }
-
- std::tuple<Attributes...>* Map(GLbitfield access, int num_vertices) {
- glBindBuffer(GL_ARRAY_BUFFER, mesh_vbo_);
- void* ptr = glMapBufferRange(GL_ARRAY_BUFFER, 0,
- attribute_size * num_vertices, access);
- return static_cast<std::tuple<Attributes...>*>(ptr);
- }
-
- void Unmap() {
- glUnmapBuffer(GL_ARRAY_BUFFER);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- }
-
- private:
- Mesh(const Mesh&) = delete;
- Mesh& operator=(const Mesh&) = delete;
-
- void DeleteGLData() {
- if (mesh_vbo_) {
- glDeleteBuffers(1, &mesh_vbo_);
- glDeleteVertexArrays(1, &mesh_vao_);
- mesh_vbo_ = 0;
- mesh_vao_ = 0;
- number_of_vertices_ = 0;
- }
- }
-
- void SetupAttributes() {
- const auto size = std::tuple_size<std::tuple<Attributes...>>::value;
- Details::VertexAttribHelper<size - 1, Attributes...>{}();
- }
-
- private:
- GLuint mesh_vbo_ = 0;
- GLuint mesh_vao_ = 0;
- uint32_t number_of_vertices_ = 0;
-
- GLenum element_type_ = GL_TRIANGLES;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_GRAPHICS_MESH_H_
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/shader_program.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/shader_program.h
deleted file mode 100644
index 4218a73..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/shader_program.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef ANDROID_DVR_SHADER_PROGRAM_H_
-#define ANDROID_DVR_SHADER_PROGRAM_H_
-
-#include <EGL/egl.h>
-#include <GLES3/gl31.h>
-#include <sys/cdefs.h>
-#include <string>
-#include <vector>
-
-namespace android {
-namespace dvr {
-
-// Helper function that allows you to write a shader as a Lambda. This allows
-// an IDE to syntax highlight the contents of a shader, as well as preventing
-// quotations on each line. Usage: std::string vs = SHADER0([]() { ... });
-template <size_t size>
-std::string StripLambda(const char (&shader)[size]) {
- return std::string(shader + 6, shader + size - 2);
-}
-
-#define SHADER0(Src) ::android::dvr::StripLambda(#Src)
-
-// Helper function that takes a shader source string containing %0, %1, %n,
-// tokens and replaces them with replacements[0], replacements[1],
-// replacements[n]. For example:
-// shader = "{
-// uniform vec2 %0;
-// %1
-// ...
-// %0.x = 1.0; ...
-// %1(%0);
-// }"
-// -> %0 = "myVarName", %1 = "void f(vec2 v) { ... }"
-std::string ComposeShader(const std::string& shader_code,
- const std::vector<std::string>& replacements);
-
-class ShaderProgram {
- public:
- ShaderProgram();
- ShaderProgram(const std::string& vertext_source,
- const std::string& fragment_source);
- ShaderProgram(ShaderProgram&&);
- ~ShaderProgram();
-
- ShaderProgram& operator=(ShaderProgram&&);
-
- void Link(const std::string& vertext_source,
- const std::string& fragment_source);
-
- void Link(const std::string& compute_source);
-
- void Use() const;
-
- GLuint GetProgram() const { return program_; }
- GLuint GetUniformLocation(const GLchar* name) const {
- return glGetUniformLocation(program_, name);
- }
- GLuint GetAttribLocation(const GLchar* name) const {
- return glGetAttribLocation(program_, name);
- }
-
- bool IsUsable() const { return program_ != 0; }
- explicit operator bool() const { return IsUsable(); }
-
- private:
- ShaderProgram(const ShaderProgram&) = delete;
- ShaderProgram& operator=(const ShaderProgram&) = delete;
-
- GLuint program_;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_SHADER_PROGRAM_H_
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/timer_query.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/timer_query.h
deleted file mode 100644
index 11d4d01..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/timer_query.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef ANDROID_DVR_GRAPHICS_TIMER_QUERY_H_
-#define ANDROID_DVR_GRAPHICS_TIMER_QUERY_H_
-
-#include <GLES3/gl3.h>
-
-namespace android {
-namespace dvr {
-
-// Class used to asynchronously query time between draw calls on gpu.
-class TimerQuery {
- public:
- TimerQuery();
- ~TimerQuery();
-
- // Marks the start of the timer on gpu.
- void Begin();
-
- // Marks the end of the timer on gpu.
- void End();
-
- // Gets the time that has passed from call to Begin to End.
- // Should be called only after the frame has been presented (after the call to
- // swapbuffers).
- double GetTimeInMS();
-
- private:
- // Generates OpenGL query object.
- void Init();
- // Deletes OpenGL query object.
- void Delete();
-
- GLuint query_ = 0;
-
- friend class SyncTimerQuery;
-};
-
-// Simplification of TimerQuery that allows to synchronously query time used
-// for draw calls on gpu by doing glFlush and stalling cpu.
-class SyncTimerQuery {
- public:
- SyncTimerQuery();
-
- double FlushAndGetTimeInMS(); // Note: This WILL cause a glFlush()
-
- private:
- TimerQuery timer_;
-};
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_GRAPHICS_TIMER_QUERY_H_
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/vertex_attributes.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/vertex_attributes.h
deleted file mode 100644
index dac5b64..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/vertex_attributes.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef ANDROID_DVR_GRAPHICS_VERTEX_ATTRIBUTES_H_
-#define ANDROID_DVR_GRAPHICS_VERTEX_ATTRIBUTES_H_
-
-#include <private/dvr/types.h>
-
-#include <EGL/egl.h>
-#include <GLES3/gl3.h>
-#include <tuple>
-
-namespace android {
-namespace dvr {
-
-namespace Details {
-
-// Set up the vertex attributes by iterating over the variadic template
-// parameters. The supported attributes are the GetSize and GetType
-// specializations.
-// clang-format off
-template<typename T> GLint GetSize();
-template<> inline GLint GetSize<vec2>() { return 2; }
-template<> inline GLint GetSize<vec3>() { return 3; }
-template<> inline GLint GetSize<vec4>() { return 4; }
-
-template<typename T> GLenum GetType();
-template<> inline GLenum GetType<vec2>() { return GL_FLOAT; }
-template<> inline GLenum GetType<vec3>() { return GL_FLOAT; }
-template<> inline GLenum GetType<vec4>() { return GL_FLOAT; }
-// clang-format on
-
-template <typename T>
-void VertexAttrib(GLuint index, GLsizei stride, const GLvoid* pointer) {
- glVertexAttribPointer(index, GetSize<T>(), GetType<T>(), GL_FALSE, stride,
- pointer);
- glEnableVertexAttribArray(index);
-}
-
-// Recursion variadic template parameter iterator.
-template <int index, typename... Ts>
-struct VertexAttribHelper {
- using tuple = std::tuple<Ts...>;
- size_t operator()() {
- size_t offset = VertexAttribHelper<index - 1, Ts...>{}();
- using type = typename std::tuple_element<index, tuple>::type;
- VertexAttrib<type>(index, sizeof(tuple), reinterpret_cast<void*>(offset));
- return offset + sizeof(type);
- }
-};
-
-// Recursion stop point.
-template <typename... Ts>
-struct VertexAttribHelper<0, Ts...> {
- using tuple = std::tuple<Ts...>;
- size_t operator()() {
- using type = typename std::tuple_element<0, tuple>::type;
- VertexAttrib<type>(0, sizeof(tuple), nullptr);
- return sizeof(type);
- }
-};
-} // namespace Details
-
-} // namespace dvr
-} // namespace android
-
-#endif // ANDROID_DVR_GRAPHICS_VERTEX_ATTRIBUTES_H_
diff --git a/libs/vr/libdvrgraphics/include/private/dvr/graphics/vr_gl_extensions.h b/libs/vr/libdvrgraphics/include/private/dvr/graphics/vr_gl_extensions.h
deleted file mode 100644
index 9635dbb..0000000
--- a/libs/vr/libdvrgraphics/include/private/dvr/graphics/vr_gl_extensions.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef ANDROID_DVR_VR_GL_EXTENSIONS_H_
-#define ANDROID_DVR_VR_GL_EXTENSIONS_H_
-
-// clang-format off
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#include <GLES3/gl31.h>
-#include <GLES3/gl3ext.h>
-// clang-format on
-
-// GL_EXT_disjoint_timer_query API function declarations
-extern PFNGLGETQUERYOBJECTI64VEXTPROC glGetQueryObjecti64v;
-extern PFNGLGETQUERYOBJECTIVEXTPROC glGetQueryObjectiv;
-extern PFNGLQUERYCOUNTEREXTPROC glQueryCounter;
-
-// EXT_buffer_storage:
-extern PFNGLBUFFERSTORAGEEXTPROC glBufferStorage;
-
-typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVR)(
- GLenum target, GLenum attachment, GLuint texture, GLint level,
- GLint baseViewIndex, GLsizei numViews);
-typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVR)(
- GLenum target, GLenum attachement, GLuint texture, GLint level,
- GLsizei samples, GLint baseViewIndex, GLsizei numViews);
-
-extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVR glFramebufferTextureMultiview;
-extern PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVR
- glFramebufferTextureMultisampleMultiview;
-
-// QCOM_gralloc_buffer_data and QCOM_shared_buffer
-typedef void(GL_APIENTRY* PFNGLGRALLOCBUFFERDATAQCOM)(GLenum target,
- GLsizeiptr sizeInBytes,
- GLvoid* hostPtr,
- GLint fd);
-typedef void(GL_APIENTRY* PFNGLSHAREDBUFFERCREATEQCOM)(GLsizeiptr sizeInBytes,
- GLint* outFd);
-typedef void(GL_APIENTRY* PFNGLSHAREDBUFFERDESTROYQCOM)(GLint fd);
-typedef void(GL_APIENTRY* PFNGLSHAREDBUFFERBINDQCOM)(GLenum target,
- GLsizeiptr sizeInBytes,
- GLint fd);
-
-extern PFNGLGRALLOCBUFFERDATAQCOM glGrallocBufferDataQCOM;
-extern PFNGLSHAREDBUFFERCREATEQCOM glCreateSharedBufferQCOM;
-extern PFNGLSHAREDBUFFERDESTROYQCOM glDestroySharedBufferQCOM;
-extern PFNGLSHAREDBUFFERBINDQCOM glBindSharedBufferQCOM;
-
-extern "C" void load_gl_extensions();
-
-#endif // ANDROID_DVR_VR_GL_EXTENSIONS_H_
diff --git a/libs/vr/libdvrgraphics/shader_program.cpp b/libs/vr/libdvrgraphics/shader_program.cpp
deleted file mode 100644
index 2d36600..0000000
--- a/libs/vr/libdvrgraphics/shader_program.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-#include "include/private/dvr/graphics/shader_program.h"
-
-#include <regex>
-#include <sstream>
-
-#include <log/log.h>
-
-namespace {
-
-static bool CompileShader(GLuint shader, const std::string& shader_string) {
- std::string prefix;
- const std::string kVersion = "#version";
- if (shader_string.substr(0, kVersion.size()) != kVersion) {
- prefix = "#version 310 es\n";
- }
- std::string string_with_prefix = prefix + shader_string;
- const char* shader_str[] = {string_with_prefix.data()};
- glShaderSource(shader, 1, shader_str, nullptr);
- glCompileShader(shader);
-
- GLint success;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
- if (!success) {
- GLchar infoLog[512];
- glGetShaderInfoLog(shader, 512, nullptr, infoLog);
- ALOGE("Shader Failed to compile: %s -- %s", *shader_str, infoLog);
- return false;
- }
- return true;
-}
-
-static bool LinkProgram(GLuint program, GLuint vertex_shader,
- GLuint fragment_shader) {
- glAttachShader(program, vertex_shader);
- glAttachShader(program, fragment_shader);
- glLinkProgram(program);
-
- // Check for linking errors
- GLint success;
- glGetProgramiv(program, GL_LINK_STATUS, &success);
- if (!success) {
- GLchar infoLog[512];
- glGetProgramInfoLog(program, 512, nullptr, infoLog);
- ALOGE("Shader failed to link: %s", infoLog);
- return false;
- }
-
- return true;
-}
-
-static bool LinkProgram(GLuint program, GLuint compute_shader) {
- glAttachShader(program, compute_shader);
- glLinkProgram(program);
-
- // Check for linking errors
- GLint success;
- glGetProgramiv(program, GL_LINK_STATUS, &success);
- if (!success) {
- GLchar infoLog[512];
- glGetProgramInfoLog(program, 512, nullptr, infoLog);
- ALOGE("Shader failed to link: %s", infoLog);
- return false;
- }
-
- return true;
-}
-
-} // anonymous namespace
-
-namespace android {
-namespace dvr {
-
-ShaderProgram::ShaderProgram() : program_(0) {}
-
-ShaderProgram::ShaderProgram(const std::string& vertext_source,
- const std::string& fragment_source)
- : program_(0) {
- Link(vertext_source, fragment_source);
-}
-
-ShaderProgram::ShaderProgram(ShaderProgram&& to_move) {
- std::swap(program_, to_move.program_);
-}
-
-ShaderProgram::~ShaderProgram() {
- if (program_)
- glDeleteProgram(program_);
-}
-
-ShaderProgram& ShaderProgram::operator=(ShaderProgram&& to_move) {
- std::swap(program_, to_move.program_);
- return *this;
-}
-
-void ShaderProgram::Link(const std::string& vertext_source,
- const std::string& fragment_source) {
- if (program_)
- glDeleteProgram(program_);
- program_ = glCreateProgram();
- GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
- GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
-
- bool success = CompileShader(vertex_shader, vertext_source) &&
- CompileShader(fragment_shader, fragment_source) &&
- LinkProgram(program_, vertex_shader, fragment_shader);
-
- glDeleteShader(vertex_shader);
- glDeleteShader(fragment_shader);
-
- if (!success) {
- glDeleteProgram(program_);
- program_ = 0;
- }
-}
-
-void ShaderProgram::Link(const std::string& compute_source) {
- if (program_)
- glDeleteProgram(program_);
- program_ = glCreateProgram();
- GLuint shader = glCreateShader(GL_COMPUTE_SHADER);
-
- bool success =
- CompileShader(shader, compute_source) && LinkProgram(program_, shader);
-
- glDeleteShader(shader);
-
- if (!success) {
- glDeleteProgram(program_);
- program_ = 0;
- }
-}
-
-void ShaderProgram::Use() const { glUseProgram(program_); }
-
-std::string ComposeShader(const std::string& shader_code,
- const std::vector<std::string>& variables) {
- std::stringstream result_stream;
- std::regex expression("%([0-9]*)");
- using reg_iter = std::regex_token_iterator<std::string::const_iterator>;
- reg_iter rend;
- // match the string and number (drop the %)
- std::vector<int> submatches = {-1, 1};
- reg_iter reg(shader_code.begin(), shader_code.end(), expression, submatches);
- bool is_even = true;
- while (reg != rend) {
- if (is_even) {
- // even entries is the code between the %n's
- result_stream << *reg;
- } else {
- // odd entries are the index into the passed in variables.
- size_t i = static_cast<size_t>(std::stoi(*reg));
- if (i < variables.size()) {
- result_stream << variables[i];
- }
- }
- is_even = !is_even;
- ++reg;
- }
- return result_stream.str();
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdvrgraphics/timer_query.cpp b/libs/vr/libdvrgraphics/timer_query.cpp
deleted file mode 100644
index 23d2b7c..0000000
--- a/libs/vr/libdvrgraphics/timer_query.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "include/private/dvr/graphics/timer_query.h"
-
-#include <GLES2/gl2ext.h>
-#include <log/log.h>
-
-namespace android {
-namespace dvr {
-
-TimerQuery::TimerQuery() {}
-
-TimerQuery::~TimerQuery() { Delete(); }
-
-void TimerQuery::Init() { glGenQueriesEXT(1, &query_); }
-
-void TimerQuery::Delete() {
- if (query_) {
- glDeleteQueriesEXT(1, &query_);
- query_ = 0;
- }
-}
-
-void TimerQuery::Begin() {
- if (query_ == 0) {
- Init();
- }
- glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query_);
-}
-
-void TimerQuery::End() { glEndQueryEXT(GL_TIME_ELAPSED_EXT); }
-
-double TimerQuery::GetTimeInMS() {
- GLuint64 elapsed_time = 0;
- glGetQueryObjectui64vEXT(query_, GL_QUERY_RESULT, &elapsed_time);
- return static_cast<double>(elapsed_time) / 1000000.0;
-}
-
-SyncTimerQuery::SyncTimerQuery() { timer_.Begin(); }
-
-double SyncTimerQuery::FlushAndGetTimeInMS() {
- if (timer_.query_ == 0) {
- ALOGE("Error: Only call FlushAndGetTimeInMS() once.");
- return 0.0;
- }
- timer_.End();
- glFlush();
- GLint done = 0;
- while (!done) {
- glGetQueryObjectivEXT(timer_.query_, GL_QUERY_RESULT_AVAILABLE, &done);
- }
-
- GLint disjoint_occurred = 0;
- glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_occurred);
- if (disjoint_occurred) {
- ALOGE("Disjoint occurred.");
- timer_.Delete();
- return 0.0;
- }
-
- double elapsed_time = timer_.GetTimeInMS();
- timer_.Delete();
- return elapsed_time;
-}
-
-} // namespace dvr
-} // namespace android
diff --git a/libs/vr/libdvrgraphics/vr_gl_extensions.cpp b/libs/vr/libdvrgraphics/vr_gl_extensions.cpp
deleted file mode 100644
index 2c5a698..0000000
--- a/libs/vr/libdvrgraphics/vr_gl_extensions.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "include/private/dvr/graphics/vr_gl_extensions.h"
-
-PFNGLGETQUERYOBJECTI64VEXTPROC glGetQueryObjecti64v = NULL;
-PFNGLGETQUERYOBJECTIVEXTPROC glGetQueryObjectiv = NULL;
-PFNGLQUERYCOUNTEREXTPROC glQueryCounter = NULL;
-PFNGLBUFFERSTORAGEEXTPROC glBufferStorage = NULL;
-PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVR glFramebufferTextureMultiview = NULL;
-PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVR
-glFramebufferTextureMultisampleMultiview = NULL;
-
-PFNGLSHAREDBUFFERCREATEQCOM glCreateSharedBufferQCOM = NULL;
-PFNGLSHAREDBUFFERDESTROYQCOM glDestroySharedBufferQCOM = NULL;
-PFNGLSHAREDBUFFERBINDQCOM glBindSharedBufferQCOM = NULL;
-PFNGLGRALLOCBUFFERDATAQCOM glGrallocBufferDataQCOM = NULL;
-
-extern "C" void load_gl_extensions() {
- if (glGetQueryObjecti64v) {
- return;
- }
- glGetQueryObjecti64v = reinterpret_cast<PFNGLGETQUERYOBJECTI64VEXTPROC>(
- eglGetProcAddress("glGetQueryObjecti64vEXT"));
- glGetQueryObjectiv = reinterpret_cast<PFNGLGETQUERYOBJECTIVEXTPROC>(
- eglGetProcAddress("glGetQueryObjectivEXT"));
- glQueryCounter = reinterpret_cast<PFNGLQUERYCOUNTEREXTPROC>(
- eglGetProcAddress("glQueryCounterEXT"));
- glBufferStorage = reinterpret_cast<PFNGLBUFFERSTORAGEEXTPROC>(
- eglGetProcAddress("glBufferStorageEXT"));
-
- glFramebufferTextureMultiview =
- reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVR>(
- eglGetProcAddress("glFramebufferTextureMultiviewOVR"));
- glFramebufferTextureMultisampleMultiview =
- reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVR>(
- eglGetProcAddress("glFramebufferTextureMultisampleMultiviewOVR"));
-
- glGrallocBufferDataQCOM = reinterpret_cast<PFNGLGRALLOCBUFFERDATAQCOM>(
- eglGetProcAddress("glGrallocBufferDataQCOM"));
- glCreateSharedBufferQCOM = reinterpret_cast<PFNGLSHAREDBUFFERCREATEQCOM>(
- eglGetProcAddress("glCreateSharedBufferQCOM"));
- glBindSharedBufferQCOM = reinterpret_cast<PFNGLSHAREDBUFFERBINDQCOM>(
- eglGetProcAddress("glBindSharedBufferQCOM"));
- glDestroySharedBufferQCOM = reinterpret_cast<PFNGLSHAREDBUFFERDESTROYQCOM>(
- eglGetProcAddress("glDestroySharedBufferQCOM"));
-}
diff --git a/libs/vr/libimageio/Android.bp b/libs/vr/libimageio/Android.bp
deleted file mode 100644
index 7dde075..0000000
--- a/libs/vr/libimageio/Android.bp
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-sourceFiles = [
- "image_io.cpp",
- "image_io_png.cpp",
- "image_io_ppm.cpp",
-]
-
-includeFiles = ["include"]
-
-sharedLibraries = [
- "libcutils",
- "libpng",
-]
-
-cc_library_static {
- srcs: sourceFiles,
- export_include_dirs: includeFiles,
- shared_libs: sharedLibraries,
- cflags: [
- "-Wall",
- "-Wextra",
- ],
- name: "libimageio",
- tags: ["optional"],
-}
diff --git a/libs/vr/libimageio/image_io.cpp b/libs/vr/libimageio/image_io.cpp
deleted file mode 100644
index 5ad6c2d..0000000
--- a/libs/vr/libimageio/image_io.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-#define LOG_TAG "ImageIo"
-
-#include <private/dvr/image_io.h>
-
-#include <algorithm>
-#include <memory>
-#include <string>
-
-#include <private/dvr/image_io_base.h>
-#include <private/dvr/image_io_logging.h>
-#include <private/dvr/image_io_png.h>
-#include <private/dvr/image_io_ppm.h>
-
-namespace {
-
-// Returns true if |str| ends with |suffix|.
-bool EndsWith(const std::string& str, const std::string& suffix) {
- if (str.length() < suffix.length())
- return false;
-
- return std::equal(suffix.rbegin(), suffix.rend(), str.rbegin());
-}
-
-// Returns lower case copy of the input string.
-std::string ToLower(std::string str) {
- std::transform(str.begin(), str.end(), str.begin(),
- [](char x) { return std::tolower(x); });
- return str;
-}
-
-} // namespace
-
-std::unique_ptr<ImageIoReader> ImageIoReader::Create(const char* filename) {
- std::unique_ptr<ImageIoReader> reader;
- std::string filename_lower = ToLower(filename);
-
- if (EndsWith(filename_lower, ".ppm"))
- reader.reset(new ImageIoPpmReader(filename));
-
- if (!reader) {
- ALOGE("Unknown/unsupported image file format.");
- return nullptr;
- }
-
- return reader;
-}
-
-std::unique_ptr<ImageIoWriter> ImageIoWriter::Create(const char* filename,
- int width, int height,
- const uint8_t* image) {
- std::unique_ptr<ImageIoWriter> writer;
- std::string filename_lower = ToLower(filename);
-
- if (EndsWith(filename_lower, ".ppm"))
- writer.reset(new ImageIoPpmWriter(filename, width, height, image));
- else if (EndsWith(filename_lower, ".png"))
- writer.reset(new ImageIoPngWriter(filename, width, height, image));
-
- if (!writer) {
- ALOGE("Unknown/unsupported image file format.");
- return nullptr;
- }
-
- return writer;
-}
-
-extern "C" {
-
-bool image_io_write_rgb888(const char* filename, int width, int height,
- const uint8_t* image) {
- auto writer = ImageIoWriter::Create(filename, width, height, image);
- if (!writer)
- return false;
- return writer->WriteRgb888();
-}
-
-bool image_io_read_rgb888(const char* filename, int* width, int* height,
- uint8_t** image) {
- auto reader = ImageIoReader::Create(filename);
- if (!reader)
- return false;
- if (!reader->ReadRgb888())
- return false;
- *width = reader->width();
- *height = reader->height();
- *image = reader->ReleaseImage();
- return true;
-}
-
-void image_io_release_buffer(uint8_t* image) { delete[] image; }
-
-} // extern "C"
diff --git a/libs/vr/libimageio/image_io_png.cpp b/libs/vr/libimageio/image_io_png.cpp
deleted file mode 100644
index e0a118b..0000000
--- a/libs/vr/libimageio/image_io_png.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-#define LOG_TAG "ImageIo"
-
-#include <private/dvr/image_io_png.h>
-
-#include <fstream>
-#include <string>
-#include <vector>
-
-#include <private/dvr/image_io_logging.h>
-
-#include "png.h"
-
-namespace {
-
-void WriteChunkCallback(png_structp out_ptr, png_bytep chunk_ptr,
- png_size_t chunk_size) {
- auto* writer = static_cast<ImageIoPngWriter*>(png_get_io_ptr(out_ptr));
- const char* chunk = reinterpret_cast<const char*>(chunk_ptr);
- writer->WriteChunk(chunk, chunk_size);
-}
-
-} // namespace
-
-ImageIoPngWriter::ImageIoPngWriter(const char* filename, int width, int height,
- const uint8_t* image)
- : ImageIoWriter(filename, width, height, image),
- out_(filename_),
- write_failed_(false) {}
-
-bool ImageIoPngWriter::WriteChunk(const char* chunk, int chunk_size) {
- out_.write(chunk, chunk_size);
- if (!out_) {
- if (write_failed_) {
- // Error was already logged once.
- return false;
- }
-
- ALOGE("Failed to write .png image to %s.", filename_.c_str());
- write_failed_ = true;
- return false;
- }
- return true;
-}
-
-// Writes RGB888 image to png file.
-// Refactored from Chromium:
-// WebKit/Source/platform/image-encoders/skia/PNGImageEncoder.cpp
-bool ImageIoPngWriter::WriteRgb888() {
- if (width_ <= 0 || height_ <= 0) {
- ALOGE("Invalid width or height.");
- return false;
- }
-
- if (!out_) {
- ALOGE("Failed to open output file %s.", filename_.c_str());
- return false;
- }
-
- png_struct* png = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
- png_info* info = png_create_info_struct(png);
- if (!png || !info || setjmp(png_jmpbuf(png))) {
- png_destroy_write_struct(png ? &png : 0, info ? &info : 0);
- return false;
- }
-
- png_set_compression_level(png, 3);
- png_set_filter(png, PNG_FILTER_TYPE_BASE, PNG_FILTER_SUB);
-
- png_set_write_fn(png, this, WriteChunkCallback, 0);
- png_set_IHDR(png, info, width_, height_, 8, PNG_COLOR_TYPE_RGB, 0, 0, 0);
- png_write_info(png, info);
-
- unsigned char* pixels =
- reinterpret_cast<unsigned char*>(const_cast<uint8_t*>(image_));
- const size_t stride = width_ * 3;
- for (int y = 0; y < height_; ++y) {
- png_write_row(png, pixels);
- if (write_failed_)
- return false;
- pixels += stride;
- }
-
- png_write_end(png, info);
- png_destroy_write_struct(&png, &info);
-
- return !write_failed_;
-}
diff --git a/libs/vr/libimageio/image_io_ppm.cpp b/libs/vr/libimageio/image_io_ppm.cpp
deleted file mode 100644
index 2411888..0000000
--- a/libs/vr/libimageio/image_io_ppm.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-#define LOG_TAG "ImageIo"
-
-#include <private/dvr/image_io_ppm.h>
-
-#include <cwctype>
-#include <fstream>
-#include <string>
-
-#include <private/dvr/image_io_logging.h>
-
-bool ImageIoPpmWriter::WriteRgb888() {
- std::ofstream out(filename_);
- if (!out) {
- ALOGE("Failed to open output file %s.", filename_.c_str());
- return false;
- }
-
- // Write a PPM header. See http://netpbm.sourceforge.net/doc/ppm.html for
- // the format specification.
- constexpr int maximum_intensity = 255;
- out << "P6\n"
- << width_ << "\n"
- << height_ << "\n"
- << maximum_intensity << "\n";
-
- // Write out the image itself.
- out.write(reinterpret_cast<const char*>(image_), 3 * width_ * height_);
-
- if (!out) {
- ALOGE("Failed to write .ppm image to %s.", filename_.c_str());
- return false;
- }
- return true;
-}
-
-bool ImageIoPpmReader::ReadRgb888() {
- std::ifstream in(filename_);
- if (!in) {
- ALOGE("Failed to open input file %s.", filename_.c_str());
- return false;
- }
-
- // Read PPM header. See http://netpbm.sourceforge.net/doc/ppm.html for
- // the format specification.
- char magic_number[2];
- in.read(magic_number, 2);
- if (magic_number[0] != 'P' || magic_number[1] != '6') {
- ALOGE("Failed to read PPM, not a P6 file %s.", filename_.c_str());
- return false;
- }
-
- int maximum_intensity = 0;
-
- in >> width_;
- in >> height_;
- in >> maximum_intensity;
-
- char delimiter;
- in.read(&delimiter, 1);
-
- if (!iswspace(delimiter) || width_ <= 0 || height_ <= 0 ||
- maximum_intensity <= 0) {
- ALOGE("Failed to parse PPM header for %s.", filename_.c_str());
- return false;
- }
-
- if (maximum_intensity != 255) {
- ALOGE("Failed to read PPM, only 8-bit depth supported %s.",
- filename_.c_str());
- return false;
- }
-
- // Read RGB data.
- const int data_begin = in.tellg();
- in.seekg(0, in.end);
- const int data_end = in.tellg();
- in.seekg(data_begin, in.beg);
-
- const int data_size = data_end - data_begin;
- if (data_size != 3 * width_ * height_) {
- ALOGE("Failed to read PPM, unexpected data size %s.", filename_.c_str());
- return false;
- }
-
- image_.reset(new uint8_t[data_size]);
- char* data = reinterpret_cast<char*>(image_.get());
-
- const auto it_data_begin = std::istreambuf_iterator<char>(in);
- const auto it_data_end = std::istreambuf_iterator<char>();
- std::copy(it_data_begin, it_data_end, data);
-
- return true;
-}
diff --git a/libs/vr/libimageio/include/CPPLINT.cfg b/libs/vr/libimageio/include/CPPLINT.cfg
deleted file mode 100644
index 2f8a3c0..0000000
--- a/libs/vr/libimageio/include/CPPLINT.cfg
+++ /dev/null
@@ -1 +0,0 @@
-filter=-build/header_guard
diff --git a/libs/vr/libimageio/include/private/dvr/image_io.h b/libs/vr/libimageio/include/private/dvr/image_io.h
deleted file mode 100644
index 5cb115d..0000000
--- a/libs/vr/libimageio/include/private/dvr/image_io.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef DVR_IMAGE_IO_H_
-#define DVR_IMAGE_IO_H_
-
-#include <stdbool.h>
-#include <stdint.h>
-
-// Supported filetypes.
-#define DVR_IMAGE_IO_SUPPORTED_WRITE "png, ppm"
-#define DVR_IMAGE_IO_SUPPORTED_READ "ppm"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Writes an RGB888 image to file. Intended file type is autodetected
-// based on the extension. Currently supported formats: PNG, PPM.
-bool image_io_write_rgb888(const char* filename, int width, int height,
- const uint8_t* image);
-
-// Reads an RGB888 image from file. Image buffer needs to be released with
-// image_io_release_image. Currently supported formats: PPM.
-bool image_io_read_rgb888(const char* filename, int* width, int* height,
- uint8_t** image);
-
-// Releases image buffer allocated within the library.
-void image_io_release_buffer(uint8_t* image);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // DVR_IMAGE_IO_H_
diff --git a/libs/vr/libimageio/include/private/dvr/image_io_base.h b/libs/vr/libimageio/include/private/dvr/image_io_base.h
deleted file mode 100644
index 5f29de7..0000000
--- a/libs/vr/libimageio/include/private/dvr/image_io_base.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_BASE_H_
-#define LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_BASE_H_
-
-#include <memory>
-#include <string>
-
-class ImageIoReader {
- public:
- virtual ~ImageIoReader() {}
-
- static std::unique_ptr<ImageIoReader> Create(const char* filename);
-
- virtual bool ReadRgb888() = 0;
-
- int width() const { return width_; }
-
- int height() const { return height_; }
-
- uint8_t* ReleaseImage() { return image_.release(); }
-
- protected:
- int width_;
- int height_;
- std::unique_ptr<uint8_t[]> image_;
- const std::string filename_;
-
- explicit ImageIoReader(const char* filename)
- : width_(0), height_(0), filename_(filename) {}
-
- ImageIoReader() = delete;
-};
-
-class ImageIoWriter {
- public:
- virtual ~ImageIoWriter() {}
-
- static std::unique_ptr<ImageIoWriter> Create(const char* filename, int width,
- int height,
- const uint8_t* image);
-
- virtual bool WriteRgb888() = 0;
-
- protected:
- const int width_;
- const int height_;
- const uint8_t* image_;
- const std::string filename_;
-
- ImageIoWriter(const char* filename, int width, int height,
- const uint8_t* image)
- : width_(width), height_(height), image_(image), filename_(filename) {}
-
- ImageIoWriter() = delete;
-};
-
-#endif // LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_BASE_H_
diff --git a/libs/vr/libimageio/include/private/dvr/image_io_logging.h b/libs/vr/libimageio/include/private/dvr/image_io_logging.h
deleted file mode 100644
index a2629f3..0000000
--- a/libs/vr/libimageio/include/private/dvr/image_io_logging.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_LOGGING_H_
-#define LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_LOGGING_H_
-
-// This header acts as log/log.h if LOG_TO_STDERR is not defined.
-// If LOG_TO_STDERR is defined, then android logging macros (such as ALOGE)
-// would log to stderr. This is useful if the code is also being used/tested on
-// a desktop.
-
-#ifdef LOG_TO_STDERR
-#include <stdarg.h>
-#include <cstdio>
-
-#ifndef LOG_TAG
-#define LOG_TAG " "
-#endif // LOG_TAG
-
-inline void LogToStderr(const char* severity, const char* fmt, ...) {
- fprintf(stderr, "%s %s: ", LOG_TAG, severity);
- va_list args;
- va_start(args, fmt);
- vfprintf(stderr, fmt, args);
- va_end(args);
- fprintf(stderr, "\n");
- fflush(stderr);
-}
-
-#define ALOGE(fmt, ...) LogToStderr("ERROR", fmt, ##__VA_ARGS__)
-
-#define ALOGW(fmt, ...) LogToStderr("WARNING", fmt, ##__VA_ARGS__)
-
-#define ALOGI(fmt, ...) LogToStderr("INFO", fmt, ##__VA_ARGS__)
-
-#define ALOGV(fmt, ...) LogToStderr("VERBOSE", fmt, ##__VA_ARGS__)
-
-#else // LOG_TO_STDERR
-#include <log/log.h>
-#endif // LOG_TO_STDERR
-
-#endif // LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_LOGGING_H_
diff --git a/libs/vr/libimageio/include/private/dvr/image_io_png.h b/libs/vr/libimageio/include/private/dvr/image_io_png.h
deleted file mode 100644
index e06a17a..0000000
--- a/libs/vr/libimageio/include/private/dvr/image_io_png.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_PNG_H_
-#define LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_PNG_H_
-
-#include <fstream>
-
-#include <private/dvr/image_io_base.h>
-
-class ImageIoPngWriter : public ImageIoWriter {
- public:
- bool WriteRgb888() override;
-
- bool WriteChunk(const char* chunk, int chunk_size);
-
- private:
- ImageIoPngWriter(const char* filename, int width, int height,
- const uint8_t* image);
-
- std::ofstream out_;
- bool write_failed_;
-
- friend class ImageIoWriter;
-};
-
-#endif // LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_PNG_H_
diff --git a/libs/vr/libimageio/include/private/dvr/image_io_ppm.h b/libs/vr/libimageio/include/private/dvr/image_io_ppm.h
deleted file mode 100644
index 8a1a96c..0000000
--- a/libs/vr/libimageio/include/private/dvr/image_io_ppm.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_PPM_H_
-#define LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_PPM_H_
-
-#include <private/dvr/image_io_base.h>
-
-class ImageIoPpmReader : public ImageIoReader {
- public:
- bool ReadRgb888() override;
-
- private:
- explicit ImageIoPpmReader(const char* filename) : ImageIoReader(filename) {}
-
- friend class ImageIoReader;
-};
-
-class ImageIoPpmWriter : public ImageIoWriter {
- public:
- bool WriteRgb888() override;
-
- private:
- ImageIoPpmWriter(const char* filename, int width, int height,
- const uint8_t* image)
- : ImageIoWriter(filename, width, height, image) {}
-
- friend class ImageIoWriter;
-};
-
-#endif // LIB_LIBIMAGEIO_PRIVATE_DVR_IMAGE_IO_PPM_H_
diff --git a/libs/vr/libvrflinger/Android.bp b/libs/vr/libvrflinger/Android.bp
index 6218e8e..de26a74 100644
--- a/libs/vr/libvrflinger/Android.bp
+++ b/libs/vr/libvrflinger/Android.bp
@@ -32,7 +32,6 @@
"libbufferhubqueue",
"libdisplay",
"libdvrcommon",
- "libdvrgraphics",
"libperformance",
"libvrsensor",
"libpdx_default_transport",
diff --git a/libs/vr/libvrflinger/display_surface.h b/libs/vr/libvrflinger/display_surface.h
index 47a07f0..c456b10 100644
--- a/libs/vr/libvrflinger/display_surface.h
+++ b/libs/vr/libvrflinger/display_surface.h
@@ -5,7 +5,6 @@
#include <pdx/service.h>
#include <private/dvr/buffer_hub_queue_client.h>
#include <private/dvr/display_protocol.h>
-#include <private/dvr/graphics_private.h>
#include <private/dvr/ring_buffer.h>
#include <functional>
@@ -162,6 +161,8 @@
// The capacity of the pending buffer queue. Should be enough to hold all the
// buffers of this DisplaySurface, although in practice only 1 or 2 frames
// will be pending at a time.
+ static constexpr int kSurfaceBufferMaxCount = 4;
+ static constexpr int kSurfaceViewMaxCount = 4;
static constexpr int kMaxPostedBuffers =
kSurfaceBufferMaxCount * kSurfaceViewMaxCount;
diff --git a/libs/vr/libvrflinger/hardware_composer.cpp b/libs/vr/libvrflinger/hardware_composer.cpp
index 4c08284..34474d9 100644
--- a/libs/vr/libvrflinger/hardware_composer.cpp
+++ b/libs/vr/libvrflinger/hardware_composer.cpp
@@ -25,7 +25,6 @@
#include <private/dvr/clock_ns.h>
#include <private/dvr/ion_buffer.h>
#include <private/dvr/pose_client_internal.h>
-#include <private/dvr/sync_util.h>
using android::pdx::LocalHandle;
using android::pdx::rpc::EmptyVariant;
@@ -740,9 +739,6 @@
right_eye_photon_offset_ns =
property_get_int64(kRightEyeOffsetProperty, right_eye_photon_offset_ns);
- // Storage for retrieving fence info.
- FenceInfoBuffer fence_info_buffer;
-
bool was_running = false;
while (1) {
diff --git a/libs/vr/libvrflinger/hardware_composer.h b/libs/vr/libvrflinger/hardware_composer.h
index 20327a3..8ba72ab 100644
--- a/libs/vr/libvrflinger/hardware_composer.h
+++ b/libs/vr/libvrflinger/hardware_composer.h
@@ -20,8 +20,6 @@
#include <pdx/file_handle.h>
#include <pdx/rpc/variant.h>
#include <private/dvr/buffer_hub_client.h>
-#include <private/dvr/frame_time_history.h>
-#include <private/dvr/sync_util.h>
#include "acquired_buffer.h"
#include "display_surface.h"
diff --git a/libs/vr/libvrsensor/Android.bp b/libs/vr/libvrsensor/Android.bp
index 3588b5e..abad78b 100644
--- a/libs/vr/libvrsensor/Android.bp
+++ b/libs/vr/libvrsensor/Android.bp
@@ -46,28 +46,3 @@
name: "libvrsensor",
}
-testFiles = ["tests/sensor_app_tests.cpp"]
-
-cc_test {
- name: "sensor_app_tests",
- tags: ["optional"],
-
- srcs: testFiles,
-
- shared_libs: [
- "libEGL",
- "libGLESv1_CM",
- "libGLESv2",
- "libvulkan",
- "libsync",
- ] + sharedLibraries,
-
- static_libs: [
- "libgmock_main",
- "libgmock",
- "libdisplay",
- "libvrsensor",
- "libdvrgraphics",
- ] + staticLibraries,
-
-}
diff --git a/libs/vr/libvrsensor/tests/sensor_app_tests.cpp b/libs/vr/libvrsensor/tests/sensor_app_tests.cpp
deleted file mode 100644
index 64c9864..0000000
--- a/libs/vr/libvrsensor/tests/sensor_app_tests.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-#include <EGL/egl.h>
-#include <GLES2/gl2.h>
-#include <math.h>
-#include <inttypes.h>
-
-#include <dvr/graphics.h>
-#include <dvr/pose_client.h>
-#include <gtest/gtest.h>
-#include <log/log.h>
-#include <private/dvr/types.h>
-
-using android::dvr::vec4;
-
-namespace {
-
-vec4 ToVec4(float32x4_t rhs) { return vec4(rhs[0], rhs[1], rhs[2], rhs[3]); }
-
-}
-
-DvrGraphicsContext* CreateContext() {
- DvrGraphicsContext* context = nullptr;
- int display_width = 0, display_height = 0;
- int surface_width = 0, surface_height = 0;
- float inter_lens_meters = 0.0f;
- float left_fov[4] = {0.0f};
- float right_fov[4] = {0.0f};
- int disable_warp = 0;
- DvrSurfaceParameter surface_params[] = {
- DVR_SURFACE_PARAMETER_IN(DISABLE_DISTORTION, disable_warp),
- DVR_SURFACE_PARAMETER_OUT(DISPLAY_WIDTH, &display_width),
- DVR_SURFACE_PARAMETER_OUT(DISPLAY_HEIGHT, &display_height),
- DVR_SURFACE_PARAMETER_OUT(SURFACE_WIDTH, &surface_width),
- DVR_SURFACE_PARAMETER_OUT(SURFACE_HEIGHT, &surface_height),
- DVR_SURFACE_PARAMETER_OUT(INTER_LENS_METERS, &inter_lens_meters),
- DVR_SURFACE_PARAMETER_OUT(LEFT_FOV_LRBT, left_fov),
- DVR_SURFACE_PARAMETER_OUT(RIGHT_FOV_LRBT, right_fov),
- DVR_SURFACE_PARAMETER_LIST_END,
- };
- dvrGraphicsContextCreate(surface_params, &context);
- return context;
-}
-
-TEST(SensorAppTests, GetPose) {
- DvrGraphicsContext* context = CreateContext();
- ASSERT_NE(nullptr, context);
- DvrPose* client = dvrPoseCreate();
- ASSERT_NE(nullptr, client);
-
- DvrPoseAsync last_pose;
- uint32_t last_vsync_count = 0;
- for (int i = 0; i < 10; ++i) {
- DvrFrameSchedule schedule;
- dvrGraphicsWaitNextFrame(context, 0, &schedule);
- DvrPoseAsync pose;
- int ret = dvrPoseGet(client, schedule.vsync_count, &pose);
- ASSERT_EQ(0, ret);
-
- // Check for unit-length quaternion to verify valid pose.
- vec4 quaternion = ToVec4(pose.orientation);
- float length = quaternion.norm();
- EXPECT_GT(0.001, fabs(1.0f - length));
-
- // Check for different data each frame, but skip first few to allow
- // startup anomalies.
- if (i > 0) {
- if (last_vsync_count == schedule.vsync_count)
- ALOGE("vsync did not increment: %u", schedule.vsync_count);
- if (pose.timestamp_ns == last_pose.timestamp_ns)
- ALOGE("timestamp did not change: %" PRIu64, pose.timestamp_ns);
- // TODO(jbates) figure out why the bots are not passing this check.
- // EXPECT_NE(last_vsync_count, schedule.vsync_count);
- // EXPECT_NE(pose.timestamp_ns, last_pose.timestamp_ns);
- }
- last_pose = pose;
- last_vsync_count = schedule.vsync_count;
- dvrBeginRenderFrame(context);
- glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
- dvrPresent(context);
- }
-
- dvrPoseDestroy(client);
- dvrGraphicsContextDestroy(context);
-}
-
-TEST(SensorAppTests, PoseRingBuffer) {
- DvrGraphicsContext* context = CreateContext();
- ASSERT_NE(nullptr, context);
- DvrPose* client = dvrPoseCreate();
- ASSERT_NE(nullptr, client);
-
- DvrPoseRingBufferInfo info;
- int ret = dvrPoseGetRingBuffer(client, &info);
- ASSERT_EQ(0, ret);
- ASSERT_NE(nullptr, info.buffer);
- EXPECT_LE(2u, info.min_future_count);
- EXPECT_LE(8u, info.total_count);
-
- DvrPoseAsync last_pose;
- uint32_t last_vsync_count = 0;
- for (int i = 0; i < 10; ++i) {
- DvrFrameSchedule schedule;
- dvrGraphicsWaitNextFrame(context, 0, &schedule);
- DvrPoseAsync pose;
- ret = dvrPoseGet(client, schedule.vsync_count, &pose);
- ASSERT_EQ(0, ret);
-
- // Check for unit-length quaternion to verify valid pose.
- vec4 quaternion = ToVec4(pose.orientation);
- float length = quaternion.norm();
- EXPECT_GT(0.001, fabs(1.0f - length));
-
- // Check for different data each frame, but skip first few to allow
- // startup anomalies.
- if (i > 0) {
- if (last_vsync_count == schedule.vsync_count)
- ALOGE("vsync did not increment: %u", schedule.vsync_count);
- if (pose.timestamp_ns == last_pose.timestamp_ns)
- ALOGE("timestamp did not change: %" PRIu64, pose.timestamp_ns);
- // TODO(jbates) figure out why the bots are not passing this check.
- // EXPECT_NE(last_vsync_count, schedule.vsync_count);
- // EXPECT_NE(pose.timestamp_ns, last_pose.timestamp_ns);
- }
- last_pose = pose;
- last_vsync_count = schedule.vsync_count;
- dvrBeginRenderFrame(context);
- glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
- dvrPresent(context);
- }
-
- dvrPoseDestroy(client);
- dvrGraphicsContextDestroy(context);
-}