diff --git a/autobuild.xml b/autobuild.xml
index a597a9db5d..d3faf9adf4 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -235,6 +235,72 @@
+ glod
+
gntp-growl
copyright
@@ -552,9 +618,9 @@
archive
hash
- 401f317fbb67623c97a7b9d8b6627ef1
+ 8d96a9d1a9a208b1f48ac677edb7ca4d
url
- http://3p.firestormviewer.org/boost-1.72-linux64_bionic-220402045.tar.bz2
+ http://3p.firestormviewer.org/boost-1.72-linux64-222121224.tar.bz2
name
linux64
@@ -670,9 +736,9 @@
archive
hash
- 88ee58d6548deae6c306f125b6461d61
+ e1a8e9eca2894687b3532474ffc9b326
url
- http://3p.firestormviewer.org/colladadom-2.3.220402056-linux64_bionic-220402056.tar.bz2
+ http://3p.firestormviewer.org/colladadom-2.3.222130404-linux64-222130404.tar.bz2
name
linux64
@@ -800,9 +866,9 @@
archive
hash
- 0bcccd248a5e4084af4026eee439816b
+ bacaa5403be0f1cba52b2250c2c227d9
url
- http://3p.firestormviewer.org/curl-7.81.0.220511906-linux64_bionic-220511906.tar.bz2
+ http://3p.firestormviewer.org/curl-7.81.0.222121724-linux64-222121724.tar.bz2
name
linux64
@@ -1934,9 +2000,9 @@
archive
hash
- 0bc56fa68f59537486c75b04646d65a9
+ c68bbfe6c9bd59d182c4d20d966492b4
url
- http://3p.firestormviewer.org/libxml2-2.9.4.180841555-linux64-180841555.tar.bz2
+ http://3p.firestormviewer.org/libxml2-2.9.4.222130358-linux64-222130358.tar.bz2
name
linux64
@@ -2252,6 +2318,18 @@
name
darwin64
+ linux64
+
+ archive
+
+ hash
+ 50d647afc4e510af72f09dcd7a77e920
+ url
+ http://3p.firestormviewer.org/meshoptimizer-0.16.222121104-linux64-222121104.tar.bz2
+
+ name
+ linux64
+
windows
archive
@@ -2308,6 +2386,18 @@
name
darwin64
+ linux64
+
+ archive
+
+ hash
+ ee4e3a02ad4669a4d84e9c32e509530e
+ url
+ http://3p.firestormviewer.org/minizip_ng-3.0.2.222121607-linux64-222121607.tar.bz2
+
+ name
+ linux64
+
windows
archive
@@ -2696,9 +2786,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- ea82e634334bccf088daf3d15eab07b7
+ cdd9c6c484542a2e1be99149c4f0e75f
url
- http://3p.firestormviewer.org/openssl-1.1.1l.212872015-linux64-212872015.tar.bz2
+ http://3p.firestormviewer.org/openssl-1.1.1l.222121440-linux64-222121440.tar.bz2
name
linux64
@@ -3296,9 +3386,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- 15a645809cb2f14074f22e7848bb42cf
+ 5ee7cda65cede06190c811e59b3880b0
url
- http://3p.firestormviewer.org/zlib-1.2.8.180841547-linux64-180841547.tar.bz2
+ http://3p.firestormviewer.org/zlib_ng-2.0.5.222121000-linux64-222121000.tar.bz2
name
linux64
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index e3323b47b7..962f9d006c 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -136,7 +136,7 @@ if (LINUX)
include(LLAppearanceUtility)
add_subdirectory(${LLAPPEARANCEUTILITY_SRC_DIR} ${LLAPPEARANCEUTILITY_BIN_DIR})
endif (INSTALL_PROPRIETARY)
- add_dependencies(viewer linux-crash-logger-strip-target)
+# add_dependencies(viewer linux-crash-logger-strip-target)
elseif (WINDOWS)
# cmake EXISTS requires an absolute path, see indra/cmake/Variables.cmake
if (EXISTS ${VIEWER_DIR}win_setup)
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 4ea6f62f7d..7bd4dce8fc 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -40,6 +40,7 @@ set(cmake_SOURCE_FILES
FreeType.cmake
GLEXT.cmake
GLH.cmake
+ GLOD.cmake
## GStreamer010Plugin.cmake
GoogleMock.cmake
Growl.cmake
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index ffc810f6b0..bdeac63e5a 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -57,6 +57,7 @@ if(WINDOWS)
libaprutil-1.dll
libapriconv-1.dll
nghttp2.dll
+ glod.dll # restore GLOD
libhunspell.dll
uriparser.dll
)
@@ -198,6 +199,7 @@ elseif(DARWIN)
libaprutil-1.0.dylib
libaprutil-1.dylib
${EXPAT_COPY}
+ libGLOD.dylib # restore GLOD
libhunspell-1.3.0.dylib
libndofdev.dylib
libnghttp2.dylib
diff --git a/indra/cmake/GLOD.cmake b/indra/cmake/GLOD.cmake
new file mode 100644
index 0000000000..2580ead67b
--- /dev/null
+++ b/indra/cmake/GLOD.cmake
@@ -0,0 +1,15 @@
+# -*- cmake -*-
+
+#if (USESYSTEMLIBS)
+# set(GLOD_FIND_REQUIRED true)
+# include(FindGLOD)
+#else (USESYSTEMLIBS)
+ include(Prebuilt)
+ use_prebuilt_binary(glod)
+set(GLOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
+if(LINUX)
+ set(GLOD_LIBRARIES GLOD vds)
+else()
+ set(GLOD_LIBRARIES GLOD)
+endif()
+#endif (USESYSTEMLIBS)
diff --git a/indra/cmake/MESHOPTIMIZER.cmake b/indra/cmake/MESHOPTIMIZER.cmake
index 1c5b47b9bd..9c1f4a8c21 100644
--- a/indra/cmake/MESHOPTIMIZER.cmake
+++ b/indra/cmake/MESHOPTIMIZER.cmake
@@ -8,7 +8,7 @@ use_prebuilt_binary(meshoptimizer)
if (WINDOWS)
set(MESHOPTIMIZER_LIBRARIES meshoptimizer.lib)
elseif (LINUX)
- set(MESHOPTIMIZER_LIBRARIES meshoptimizer.o)
+ set(MESHOPTIMIZER_LIBRARIES libmeshoptimizer.a)
elseif (DARWIN)
set(MESHOPTIMIZER_LIBRARIES libmeshoptimizer.a)
endif (WINDOWS)
diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt
index ab8ef14fce..8cb5028985 100644
--- a/indra/linux_crash_logger/CMakeLists.txt
+++ b/indra/linux_crash_logger/CMakeLists.txt
@@ -7,7 +7,7 @@ include(Linking)
include(UI)
include(CURL)
include(OpenSSL)
-include(ZLIB)
+include(ZLIBNG)
include_directories(
${LLCOREHTTP_INCLUDE_DIRS}
@@ -54,12 +54,12 @@ set(LIBRT_LIBRARY rt)
target_link_libraries(linux-crash-logger
${UI_LIBRARIES}
- ${CURL_LIBRARIES}
- ${OPENSSL_LIBRARIES}
- ${CRYPTO_LIBRARIES}
- ${ZLIB_LIBRARIES}
+ ${CURL_LIBRARIES}
+ ${OPENSSL_LIBRARIES}
+ ${CRYPTO_LIBRARIES}
+ ${ZLIBNG_LIBRARIES}
${LIBRT_LIBRARY}
- X11
+ X11
)
add_custom_target(linux-crash-logger-target ALL
diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h
index 68d79cdd12..16b3966ad2 100644
--- a/indra/llcommon/llthreadsafequeue.h
+++ b/indra/llcommon/llthreadsafequeue.h
@@ -452,7 +452,9 @@ ElementT LLThreadSafeQueue::pop(void)
// so we can finish draining the queue.
pop_result popped = pop_(lock1, value);
if (popped == POPPED)
- return std::move(value);
+ // Prevent RVO elision
+ //return std::move(value);
+ return value;
// Once the queue is DONE, there will never be any more coming.
if (popped == DONE)
diff --git a/indra/llcommon/threadsafeschedule.h b/indra/llcommon/threadsafeschedule.h
index 3e0da94c02..5ae89375c5 100644
--- a/indra/llcommon/threadsafeschedule.h
+++ b/indra/llcommon/threadsafeschedule.h
@@ -248,7 +248,9 @@ namespace LL
TimePoint until = TimePoint::clock::now() + std::chrono::hours(24);
pop_result popped = tryPopUntil_(lock, until, tt);
if (popped == POPPED)
- return std::move(tt);
+ // Prevent RVO elision
+ //return std::move(tt);
+ return tt;
// DONE: throw, just as super::pop() does
if (popped == DONE)
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 2088ab9003..7d6bf4f9ee 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -2434,6 +2434,16 @@ LLImageGLThread::LLImageGLThread(LLWindow* window)
mFinished = false;
mContext = mWindow->createSharedContext();
+
+ // If context creating is not supported (SDL1), mark texture thread disabled and exit
+ if( !mContext )
+ {
+ sEnabled = false;
+ mFinished = true;
+ return;
+ }
+ //
+
ThreadPool::start();
}
diff --git a/indra/llwindow/llkeyboardsdl2.cpp b/indra/llwindow/llkeyboardsdl2.cpp
index c75c081055..d14c5b97a6 100644
--- a/indra/llwindow/llkeyboardsdl2.cpp
+++ b/indra/llwindow/llkeyboardsdl2.cpp
@@ -63,7 +63,7 @@ LLKeyboardSDL::LLKeyboardSDL()
mTranslateKeyMap[SDLK_LCTRL] = KEY_CONTROL;
mTranslateKeyMap[SDLK_RCTRL] = KEY_CONTROL;
mTranslateKeyMap[SDLK_LALT] = KEY_ALT;
- mTranslateKeyMap[SDLK_RALT] = KEY_ALT;
+ // mTranslateKeyMap[SDLK_RALT] = KEY_ALT;
mTranslateKeyMap[SDLK_HOME] = KEY_HOME;
mTranslateKeyMap[SDLK_END] = KEY_END;
mTranslateKeyMap[SDLK_PAGEUP] = KEY_PAGE_UP;
@@ -148,7 +148,7 @@ void LLKeyboardSDL::resetMaskKeys()
mKeyLevel[KEY_CONTROL] = TRUE;
}
- if(mask & KMOD_ALT)
+ if(mask & KMOD_LALT)
{
mKeyLevel[KEY_ALT] = TRUE;
}
@@ -170,7 +170,7 @@ MASK LLKeyboardSDL::updateModifiers(const U32 mask)
out_mask |= MASK_CONTROL;
}
- if(mask & KMOD_ALT)
+ if(mask & KMOD_LALT)
{
out_mask |= MASK_ALT;
}
@@ -252,7 +252,7 @@ MASK LLKeyboardSDL::currentMask(BOOL for_mouse_event)
result |= MASK_SHIFT;
if (mask & KMOD_CTRL)
result |= MASK_CONTROL;
- if (mask & KMOD_ALT)
+ if (mask & KMOD_LALT)
result |= MASK_ALT;
// For keyboard events, consider Meta keys equivalent to Control
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index c9ec36bfdd..892d61e938 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -112,8 +112,8 @@ public:
void interruptLanguageTextInput() override;
void spawnWebBrowser(const std::string& escaped_url, bool async) override;
F32 getSystemUISize() override;
- /*virtual*/ void openFile(const std::string& file_name);
- /*virtual*/ void setTitle(const std::string& title);
+ void openFile(const std::string& file_name) override;
+ void setTitle(const std::string& title) override;
static std::vector getDisplaysResolutionList();
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index f3ba4cc6d4..0783b1bab7 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -3024,4 +3024,26 @@ std::vector LLWindowSDL::getDynamicFallbackFontList()
return rtns;
}
+void* LLWindowSDL::createSharedContext()
+{
+ LL_WARNS() << "Not available" << LL_ENDL;
+ return nullptr;
+}
+
+void LLWindowSDL::makeContextCurrent(void* contextPtr)
+{
+ LL_WARNS() << "Not available" << LL_ENDL;
+ LL_PROFILER_GPU_CONTEXT;
+}
+
+void LLWindowSDL::destroySharedContext(void* contextPtr)
+{
+ LL_WARNS() << "Not available" << LL_ENDL;
+}
+
+void LLWindowSDL::toggleVSync(bool enable_vsync)
+{
+ LL_WARNS() << "Not available" << LL_ENDL;
+}
+
#endif // LL_SDL
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index c2d49fd251..da6da0f4d8 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -151,7 +151,11 @@ public:
static Window get_SDL_XWindowID(void);
static Display* get_SDL_Display(void);
#endif // LL_X11
-
+ void* createSharedContext() override;
+ void makeContextCurrent(void* context) override;
+ void destroySharedContext(void* context) override;
+ void toggleVSync(bool enable_vsync) override;
+
protected:
LLWindowSDL(LLWindowCallbacks* callbacks,
const std::string& title, int x, int y, int width, int height, U32 flags,
diff --git a/indra/llwindow/llwindowsdl2.cpp b/indra/llwindow/llwindowsdl2.cpp
index b5e350f863..082d2a93b5 100644
--- a/indra/llwindow/llwindowsdl2.cpp
+++ b/indra/llwindow/llwindowsdl2.cpp
@@ -78,7 +78,10 @@ static bool ATIbug = false;
// be only one object of this class at any time. Currently this is true.
static LLWindowSDL *gWindowImplementation = NULL;
-
+// extern "C" Bool XineramaIsActive (Display *dpy)
+// {
+// return 0;
+// }
void maybe_lock_display(void)
{
if (gWindowImplementation && gWindowImplementation->Lock_Display) {
@@ -649,6 +652,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B
mReallyCapturedCount = 0;
SDL_SetHint( SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0" );
+ SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1");
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 )
{
@@ -713,6 +717,8 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, mFSAASamples);
}
+ // Make shared context work on Linux for multithreaded OpenGL
+ SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);
mWindow = SDL_CreateWindow( mWindowTitle.c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, mSDLFlags );
if( mWindow )
@@ -863,6 +869,10 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B
}
#endif // LL_X11
+ // clear screen to black right at the start so it doesn't look like a crash
+ glClearColor(0.0f, 0.0f, 0.0f ,1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+ SDL_GL_SwapWindow(mWindow);
SDL_StartTextInput();
//make sure multisampling is disabled by default
@@ -1773,11 +1783,7 @@ void LLWindowSDL::gatherInput()
for( auto key: string )
{
mKeyVirtualKey = key;
-
- if( (MASK_CONTROL|MASK_ALT)&mKeyModifiers )
- gKeyboard->handleKeyDown(mKeyVirtualKey, mKeyModifiers );
- else
- handleUnicodeUTF16( key, mKeyModifiers );
+ handleUnicodeUTF16( key, mKeyModifiers );
}
break;
}
@@ -1787,13 +1793,23 @@ void LLWindowSDL::gatherInput()
mKeyModifiers = event.key.keysym.mod;
mInputType = "keydown";
+ // treat all possible Enter/Return keys the same
+ if (mKeyVirtualKey == SDLK_RETURN2 || mKeyVirtualKey == SDLK_KP_ENTER)
+ {
+ mKeyVirtualKey = SDLK_RETURN;
+ }
+
gKeyboard->handleKeyDown(mKeyVirtualKey, mKeyModifiers );
// Slightly hacky :| To make the viewer honor enter (eg to accept form input) we've to not only send handleKeyDown but also send a
// invoke handleUnicodeUTF16 in case the user hits return.
// Note that we cannot blindly use handleUnicodeUTF16 for each SDL_KEYDOWN. Doing so will create bogus keyboard input (like % for cursor left).
if( mKeyVirtualKey == SDLK_RETURN )
+ {
+ // fix return key not working when capslock, scrolllock or numlock are enabled
+ mKeyModifiers &= (~(KMOD_NUM | KMOD_CAPS | KMOD_MODE | KMOD_SCROLL));
handleUnicodeUTF16( mKeyVirtualKey, mKeyModifiers );
+ }
// part of the fix for SL-13243
if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
@@ -1806,6 +1822,12 @@ void LLWindowSDL::gatherInput()
mKeyModifiers = event.key.keysym.mod;
mInputType = "keyup";
+ // treat all possible Enter/Return keys the same
+ if (mKeyVirtualKey == SDLK_RETURN2 || mKeyVirtualKey == SDLK_KP_ENTER)
+ {
+ mKeyVirtualKey = SDLK_RETURN;
+ }
+
if (SDLCheckGrabbyKeys(mKeyVirtualKey, FALSE) == 0)
SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243
@@ -1909,7 +1931,7 @@ void LLWindowSDL::gatherInput()
// I think is is not
// SDL_SetWindowSize(mWindow, width, height);
//
-
+
mCallbacks->handleResize(this, width, height);
}
else if( event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED ) // What about SDL_WINDOWEVENT_ENTER (mouse focus)
@@ -2560,4 +2582,57 @@ std::vector LLWindowSDL::getDynamicFallbackFontList()
return rtns;
}
+// Make shared context work on Linux for multithreaded OpenGL
+class sharedContext
+{
+ public:
+ SDL_GLContext mContext;
+};
+
+void* LLWindowSDL::createSharedContext()
+{
+ sharedContext* sc = new sharedContext();
+ sc->mContext = SDL_GL_CreateContext(mWindow);
+ if (sc->mContext)
+ {
+ SDL_GL_SetSwapInterval(0);
+ SDL_GL_MakeCurrent(mWindow, mContext);
+
+ LLCoordScreen size;
+ if (getSize(&size))
+ {
+ setSize(size);
+ }
+
+ LL_DEBUGS() << "Creating shared OpenGL context successful!" << LL_ENDL;
+
+ return (void*)sc;
+ }
+
+ LL_WARNS() << "Creating shared OpenGL context failed!" << LL_ENDL;
+
+ return nullptr;
+}
+
+void LLWindowSDL::makeContextCurrent(void* context)
+{
+ LL_PROFILER_GPU_CONTEXT;
+ SDL_GL_MakeCurrent(mWindow, ((sharedContext*)context)->mContext);
+}
+
+void LLWindowSDL::destroySharedContext(void* context)
+{
+ sharedContext* sc = (sharedContext*)context;
+
+ SDL_GL_DeleteContext(sc->mContext);
+
+ delete sc;
+}
+
+void LLWindowSDL::toggleVSync(bool enable_vsync)
+{
+ SDL_GL_SetSwapInterval(enable_vsync);
+}
+//
+
#endif // LL_SDL
diff --git a/indra/llwindow/llwindowsdl2.h b/indra/llwindow/llwindowsdl2.h
index e60827644d..20adba802e 100644
--- a/indra/llwindow/llwindowsdl2.h
+++ b/indra/llwindow/llwindowsdl2.h
@@ -66,6 +66,12 @@ public:
/*virtual*/ BOOL setSizeImpl(LLCoordScreen size);
/*virtual*/ BOOL setSizeImpl(LLCoordWindow size);
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);
+ // Make shared context work on Linux for multithreaded OpenGL
+ void* createSharedContext() override;
+ void makeContextCurrent(void* context) override;
+ void destroySharedContext(void* context) override;
+ /*virtual*/ void toggleVSync(bool enable_vsync);
+ //
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position);
/*virtual*/ void showCursor();
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0ae24b60be..3626ee623f 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -17,6 +17,7 @@ include(GLIB)
include(DragDrop)
include(EXPAT)
include(FMODSTUDIO)
+include(GLOD) # restore GLOD
include(Hunspell)
include(JPEGEncoderBasic)
include(JsonCpp)
@@ -83,6 +84,7 @@ endif(FMODSTUDIO)
include_directories(
${DBUSGLIB_INCLUDE_DIRS}
${JSONCPP_INCLUDE_DIR}
+ ${GLOD_INCLUDE_DIR} # restore GLOD
${LLAUDIO_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
@@ -2272,6 +2274,11 @@ if (WINDOWS)
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll
+ # Restore GLOD build dependencies
+ ${SHARED_LIB_STAGING_DIR}/Release/glod.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/glod.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/glod.dll
+ #
${SHARED_LIB_STAGING_DIR}/Release/libcollada14dom22.dll
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libcollada14dom22.dll
${SHARED_LIB_STAGING_DIR}/Debug/libcollada14dom22-d.dll
@@ -2521,6 +2528,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${OPENGL_LIBRARIES}
${FMODWRAPPER_LIBRARY} # must come after LLAudio
${OPENAL_LIBRARIES}
+ ${GLOD_LIBRARIES} # restore GLOD dependencies
${OPENGL_LIBRARIES}
${JSONCPP_LIBRARIES}
${SDL_LIBRARY}
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 1ee21efc12..fb16e7005d 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -33,7 +33,6 @@ RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxNonImpostors 1 16
RenderAvatarMaxComplexity 1 350000
-RenderAvatarVP 1 1
RenderAutoMuteSurfaceAreaLimit 1 1000.0
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
@@ -70,7 +69,7 @@ RenderShadowDetail 1 2
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16
-RenderGLCoreProfile 1 1
+RenderGLContextCoreProfile 1 1
RenderGLMultiThreaded 1 1
@@ -316,12 +315,12 @@ RenderAnisotropic 1 0
RenderCubeMap 0 0
RenderFSAASamples 1 0
RenderGLMultiThreaded 1 0
-RenderGLCoreProfile 1 0
+RenderGLContextCoreProfile 1 0
// AMD cards generally perform better when not using VBOs for streaming data
// AMD cards also prefer an OpenGL Compatibility Profile Context
list AMD
RenderUseStreamVBO 1 0
-RenderGLCoreProfile 1 0
+RenderGLContextCoreProfile 1 0
diff --git a/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt b/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
index 9103d4faf3..34e132994d 100644
--- a/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
+++ b/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
@@ -6,160 +6,159 @@
// Global variables and CONSTANTS
//
- // Bridge platform
- string BRIDGE_VERSION = "2.28"; // This should match fslslbridge.cpp
- string gLatestURL;
- integer gViewerIsFirestorm;
- integer gTryHandshakeOnce = TRUE;
- key gOwner;
+// Bridge platform
+string BRIDGE_VERSION = "2.29"; // This should match fslslbridge.cpp
+string gLatestURL;
+integer gViewerIsFirestorm;
+integer gTryHandshakeOnce = TRUE;
+key gOwner;
- // Teleport
- float TP_TARGET_DISTANCE = 1.0; // Distance to target when move to target should stop
- integer MAX_TIME_TO_TP = 10; // (seconds) Should be set to 10 for normal use
- float TP_TIMER_TICK = 0.05;
- vector gMttVector; // Target for llMoveToTarget() teleport
- integer gStartTPTimer;
+// Teleport
+float TP_TARGET_DISTANCE = 1.0; // Distance to target when move to target should stop
+integer MAX_TIME_TO_TP = 10; // (seconds) Should be set to 10 for normal use
+float TP_TIMER_TICK = 0.05;
+vector gMttVector; // Target for llMoveToTarget() teleport
+integer gStartTPTimer;
- // Movelock
- integer gUseMoveLock;
- integer gRelockMoveLockAfterMovement;
- integer gRelockIsUserMoving;
+// Movelock
+integer gUseMoveLock;
+integer gRelockMoveLockAfterMovement;
+integer gRelockIsUserMoving;
- // Flight assist
- integer gIsFlyingNow;
- float FLIGHT_CHECK_NORMAL = 0.5;
- float FLIGHT_CHECK_SLOW = 3.0;
- float gFlightAssistPushForce;
+// Flight assist
+integer gIsFlyingNow;
+float FLIGHT_CHECK_NORMAL = 0.5;
+float FLIGHT_CHECK_SLOW = 3.0;
+float gFlightAssistPushForce;
- // OpenCollar/LockMeister AO interface
- integer gAO_EnabledOC;
- integer gAO_EnabledLM;
- integer gAO_ChannelOC;
- integer AO_CHANNEL_LM = -8888;
- integer gAO_ListenerOC;
- integer gAO_ListenerLM;
- key gAO_CollarKey;
+// OpenCollar/LockMeister AO interface
+integer gAO_EnabledOC;
+integer gAO_EnabledLM;
+integer gAO_ChannelOC;
+integer AO_CHANNEL_LM = -8888;
+integer gAO_ListenerOC;
+integer gAO_ListenerLM;
+key gAO_CollarKey;
//
// Bridge platform helper functions
//
- requestBridgeURL()
- {
- llReleaseURL(gLatestURL);
- gLatestURL = "";
- llRequestSecureURL();
- // llRequestURL(); -- Uncomment this line and comment the previous one for HTTP instead of HTTPS
- }
+requestBridgeURL()
+{
+ llReleaseURL(gLatestURL);
+ gLatestURL = "";
+ llRequestSecureURL();
+}
- detachBridge()
- {
- llReleaseURL(gLatestURL);
- llRequestPermissions(gOwner, PERMISSION_ATTACH);
- }
+detachBridge()
+{
+ llReleaseURL(gLatestURL);
+ llRequestPermissions(gOwner, PERMISSION_ATTACH);
+}
//
// OpenCollar/LockMeister AO interface functions
//
- aoListenOC(key collarid, integer enabled)
+aoListenOC(key collarid, integer enabled)
+{
+ llListenRemove(gAO_ListenerOC);
+ if (enabled)
{
- llListenRemove(gAO_ListenerOC);
- if (enabled)
- {
- gAO_ListenerOC = llListen(gAO_ChannelOC, "", collarid, "");
- gAO_CollarKey = collarid;
- }
- else
- {
- gAO_CollarKey = NULL_KEY;
- }
+ gAO_ListenerOC = llListen(gAO_ChannelOC, "", collarid, "");
+ gAO_CollarKey = collarid;
}
+ else
+ {
+ gAO_CollarKey = NULL_KEY;
+ }
+}
- aoState(string newstate)
- {
- llOwnerSay("");
- }
+aoState(string newstate)
+{
+ llOwnerSay("");
+}
- integrationCheckOC()
+integrationCheckOC()
+{
+ if (gAO_EnabledOC)
{
- if (gAO_EnabledOC)
+ if (gAO_ChannelOC != PUBLIC_CHANNEL)
{
- if (gAO_ChannelOC != PUBLIC_CHANNEL)
- {
- aoListenOC(NULL_KEY, TRUE);
- llWhisper(gAO_ChannelOC, "OpenCollar?");
- }
- }
- else
- {
- aoListenOC(NULL_KEY, FALSE);
+ aoListenOC(NULL_KEY, TRUE);
+ llWhisper(gAO_ChannelOC, "OpenCollar?");
}
}
+ else
+ {
+ aoListenOC(NULL_KEY, FALSE);
+ }
+}
- integrationCheckLM()
+integrationCheckLM()
+{
+ if (gAO_EnabledLM)
{
- if (gAO_EnabledLM)
- {
- gAO_ListenerLM = llListen(AO_CHANNEL_LM, "", NULL_KEY, "");
- }
- else
- {
- llListenRemove(gAO_ListenerLM);
- }
+ gAO_ListenerLM = llListen(AO_CHANNEL_LM, "", NULL_KEY, "");
}
+ else
+ {
+ llListenRemove(gAO_ListenerLM);
+ }
+}
//
// Teleport Helper functions
//
- setTimerEvent2(float time)
+setTimerEvent2(float time)
+{
+ if (time <= 0)
{
- if (time <= 0)
- {
- llSensorRemove();
- }
- else
- {
- llSensorRepeat("set-Timer-Event-2", NULL_KEY, AGENT_BY_LEGACY_NAME, 0.001, 0.001, time);
- }
+ llSensorRemove();
}
+ else
+ {
+ llSensorRepeat("set-Timer-Event-2", NULL_KEY, AGENT_BY_LEGACY_NAME, 0.001, 0.001, time);
+ }
+}
//
// Flight Assist
//
- flightHover(integer yes)
+flightHover(integer yes)
+{
+ if (yes)
{
- if (yes)
- {
- llSetForce((<0.0, 0.0, 9.8> * llGetMass()), 0);
- }
- else
- {
- llSetForce(ZERO_VECTOR, 1);
- }
+ llSetForce((<0.0, 0.0, 9.8> * llGetMass()), 0);
}
+ else
+ {
+ llSetForce(ZERO_VECTOR, 1);
+ }
+}
//
// Movelock
//
- movelockMe(integer lock)
+movelockMe(integer lock)
+{
+ if (lock)
{
- if (lock)
- {
- llMoveToTarget(llGetPos() - <0, 0, 0.1>, 0.05);
- llSetVehicleType(VEHICLE_TYPE_SLED);
- llSetVehicleFloatParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, 0.05);
- llSetVehicleFloatParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, 0.05);
- }
- else
- {
- llStopMoveToTarget();
- llSetVehicleType(VEHICLE_TYPE_NONE);
- }
+ llMoveToTarget(llGetPos() - <0, 0, 0.1>, 0.05);
+ llSetVehicleType(VEHICLE_TYPE_SLED);
+ llSetVehicleFloatParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, 0.05);
+ llSetVehicleFloatParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, 0.05);
}
+ else
+ {
+ llStopMoveToTarget();
+ llSetVehicleType(VEHICLE_TYPE_NONE);
+ }
+}
//
// MAIN
@@ -365,8 +364,6 @@ default
vector targ = gMttVector - loc;
float dist = llVecMag(targ);
- // llOwnerSay("current: " + (string)loc + " target: " + (string)targ + " tp distance: " + (string)dist);
-
// If we are out of time or distance - stop
if (dist < TP_TARGET_DISTANCE || llGetUnixTime() - MAX_TIME_TO_TP > gStartTPTimer || gMttVector == loc)
{
@@ -391,7 +388,6 @@ default
http_request(key httpReqID, string Method, string Body)
{
- // llOwnerSay("Received HTTP " + Method + " message. Command body: " + Body);
if (Method == URL_REQUEST_GRANTED)
{
gLatestURL = Body;
@@ -429,11 +425,10 @@ default
// Radar-specific command to get high-rez altitude data.
// Input is list of UUIDs to query, output is list of UUID:Altitude pairs.
- // Get parameters
list tUUIDs = llCSV2List(llList2String(commandList, 1));
commandList = []; // Free memory
integer tLength = llGetListLength(tUUIDs);
- key tUUID; // Key for llGetobjectDetails()
+ key tUUID;
vector tPos;
integer i = 0;
list responses;
@@ -507,9 +502,9 @@ default
if (extended)
{
currentPosition = llGetPos();
- details = llGetObjectDetails(targetkey, ([OBJECT_NAME, OBJECT_RUNNING_SCRIPT_COUNT, OBJECT_TOTAL_SCRIPT_COUNT, OBJECT_SCRIPT_MEMORY, OBJECT_SCRIPT_TIME, OBJECT_CHARACTER_TIME, OBJECT_DESC, OBJECT_ROOT, OBJECT_PRIM_COUNT, OBJECT_PRIM_EQUIVALENCE, OBJECT_TOTAL_INVENTORY_COUNT, OBJECT_VELOCITY, OBJECT_POS, OBJECT_ROT, OBJECT_OMEGA, OBJECT_CREATOR, OBJECT_OWNER, OBJECT_LAST_OWNER_ID, OBJECT_REZZER_KEY, OBJECT_GROUP, OBJECT_CREATION_TIME, OBJECT_PATHFINDING_TYPE, OBJECT_ATTACHED_POINT, OBJECT_TEMP_ATTACHED]));
+ details = llGetObjectDetails(targetkey, ([OBJECT_NAME, OBJECT_RUNNING_SCRIPT_COUNT, OBJECT_TOTAL_SCRIPT_COUNT, OBJECT_SCRIPT_MEMORY, OBJECT_SCRIPT_TIME, OBJECT_CHARACTER_TIME, OBJECT_DESC, OBJECT_ROOT, OBJECT_PRIM_COUNT, OBJECT_PRIM_EQUIVALENCE, OBJECT_TOTAL_INVENTORY_COUNT, OBJECT_VELOCITY, OBJECT_POS, OBJECT_ROT, OBJECT_OMEGA, OBJECT_CREATOR, OBJECT_OWNER, OBJECT_LAST_OWNER_ID, OBJECT_REZZER_KEY, OBJECT_GROUP, OBJECT_CREATION_TIME, OBJECT_REZ_TIME, OBJECT_PATHFINDING_TYPE, OBJECT_ATTACHED_POINT, OBJECT_TEMP_ATTACHED]));
details = details + [currentPosition, targetkey];
- elements = 26;
+ elements = 27;
}
else
{
@@ -522,7 +517,7 @@ default
list returnedList = [llStringToBase64(llStringTrim(llList2String(details, 0), STRING_TRIM)), llList2String(details, 1), llList2String(details, 2), llList2Integer(details, 3) / 1024, llList2Float(details, 4) * 1000.0, llList2Float(details, 5) * 1000.0];
if (extended)
{
- returnedList = returnedList + [llStringToBase64(llStringTrim(llList2String(details, 6), STRING_TRIM)), llList2String(details, 7), llList2Integer(details, 8), llList2Integer(details, 9), llList2Integer(details, 10), llStringToBase64(llList2String(details, 11)), llStringToBase64(llList2String(details, 12) + " (" + (string)llVecDist(llList2Vector(details, 12), currentPosition) + " m)"), llStringToBase64(llList2String(details, 13) + " (" + (string)(RAD_TO_DEG * llRot2Euler(llList2Rot(details, 13))) + ")"), llStringToBase64(llList2String(details, 14)), llList2Key(details, 15), llList2Key(details, 16), llList2Key(details, 17), llList2Key(details, 18), llList2Key(details, 19), llList2String(details, 20), llList2Integer(details, 21), llList2Integer(details, 22), llList2Integer(details, 23), llStringToBase64(llList2String(details, 24)), llList2Key(details, 25)];
+ returnedList = returnedList + [llStringToBase64(llStringTrim(llList2String(details, 6), STRING_TRIM)), llList2String(details, 7), llList2Integer(details, 8), llList2Integer(details, 9), llList2Integer(details, 10), llStringToBase64(llList2String(details, 11)), llStringToBase64(llList2String(details, 12) + " (" + (string)llVecDist(llList2Vector(details, 12), currentPosition) + " m)"), llStringToBase64(llList2String(details, 13) + " (" + (string)(RAD_TO_DEG * llRot2Euler(llList2Rot(details, 13))) + ")"), llStringToBase64(llList2String(details, 14)), llList2Key(details, 15), llList2Key(details, 16), llList2Key(details, 17), llList2Key(details, 18), llList2Key(details, 19), llList2String(details, 20), llList2String(details, 21), llList2Integer(details, 22), llList2Integer(details, 23), llList2Integer(details, 24), llStringToBase64(llList2String(details, 25)), llList2Key(details, 26)];
}
llOwnerSay("" + llList2CSV(returnedList) + "");
}
diff --git a/indra/newview/fslslbridge.cpp b/indra/newview/fslslbridge.cpp
index 2495242dd1..b2ec6834e3 100644
--- a/indra/newview/fslslbridge.cpp
+++ b/indra/newview/fslslbridge.cpp
@@ -55,7 +55,7 @@
static const std::string FS_BRIDGE_FOLDER = "#LSL Bridge";
static const std::string FS_BRIDGE_CONTAINER_FOLDER = "Landscaping";
static const U32 FS_BRIDGE_MAJOR_VERSION = 2;
-static const U32 FS_BRIDGE_MINOR_VERSION = 28;
+static const U32 FS_BRIDGE_MINOR_VERSION = 29;
static const U32 FS_MAX_MINOR_VERSION = 99;
static const std::string UPLOAD_SCRIPT_CURRENT = "EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt";
static const std::string FS_STATE_ATTRIBUTE = "state=";
@@ -410,7 +410,7 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
while (std::getline(strStreamGetScriptInfo, scriptInfoToken, ','))
{
LLStringUtil::trim(scriptInfoToken);
- if (scriptInfoArrayCount == 0 || scriptInfoArrayCount == 6 || scriptInfoArrayCount == 11 || scriptInfoArrayCount == 12 || scriptInfoArrayCount == 13 || scriptInfoArrayCount == 14 || scriptInfoArrayCount == 24)
+ if (scriptInfoArrayCount == 0 || scriptInfoArrayCount == 6 || scriptInfoArrayCount == 11 || scriptInfoArrayCount == 12 || scriptInfoArrayCount == 13 || scriptInfoArrayCount == 14 || scriptInfoArrayCount == 25)
{
// First value, OBJECT_NAME, should be passed from Bridge as encoded in base64
// Encoding eliminates problems with special characters and commas for CSV
@@ -433,7 +433,7 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
++scriptInfoArrayCount;
}
- if (scriptInfoArrayCount == 6 || scriptInfoArrayCount == 26)
+ if (scriptInfoArrayCount == 6 || scriptInfoArrayCount == 27)
{
LLStringUtil::format_map_t args;
args["OBJECT_NAME"] = scriptInfoArray[0].asString();
@@ -452,7 +452,7 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
args["PATHFINDING_TEXT"] = "";
}
report_to_nearby_chat(format_string(LLTrans::getString("fsbridge_script_info"), args));
- if (scriptInfoArrayCount == 26)
+ if (scriptInfoArrayCount == 27)
{
LLStringUtil::format_map_t args3;
args3["OBJECT_DESC"] = scriptInfoArray[6].asString();
@@ -470,11 +470,12 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
args3["OBJECT_REZZER_KEY"] = scriptInfoArray[18].asString();
args3["OBJECT_GROUP"] = scriptInfoArray[19].asUUID().notNull() ? LLSLURL("group", scriptInfoArray[19].asUUID(), "inspect").getSLURLString() : "---";
args3["OBJECT_CREATION_TIME"] = scriptInfoArray[20].asString();
- args3["OBJECT_PATHFINDING_TYPE"] = scriptInfoArray[21].asString();
- args3["OBJECT_ATTACHED_POINT"] = (scriptInfoArray[22].asInteger() < 1 || scriptInfoArray[22].asInteger() > 255) ? "---" : LLTrans::getString(LLAvatarAppearance::getAttachmentPointName(scriptInfoArray[22].asInteger()));
- args3["OBJECT_TEMP_ATTACHED"] = scriptInfoArray[23].asInteger() == 1 ? LLTrans::getString("Yes") : LLTrans::getString("No");
- args3["AVATAR_POS"] = scriptInfoArray[24].asString();
- args3["INSPECTING_KEY"] = scriptInfoArray[25].asString();
+ args3["OBJECT_REZ_TIME"] = scriptInfoArray[21].asString();
+ args3["OBJECT_PATHFINDING_TYPE"] = scriptInfoArray[22].asString();
+ args3["OBJECT_ATTACHED_POINT"] = (scriptInfoArray[23].asInteger() < 1 || scriptInfoArray[23].asInteger() > 255) ? "---" : LLTrans::getString(LLAvatarAppearance::getAttachmentPointName(scriptInfoArray[23].asInteger()));
+ args3["OBJECT_TEMP_ATTACHED"] = scriptInfoArray[24].asInteger() == 1 ? LLTrans::getString("Yes") : LLTrans::getString("No");
+ args3["AVATAR_POS"] = scriptInfoArray[25].asString();
+ args3["INSPECTING_KEY"] = scriptInfoArray[26].asString();
report_to_nearby_chat(format_string(LLTrans::getString("fsbridge_script_info_ext"), args3));
}
}
diff --git a/indra/newview/fsperfstats.h b/indra/newview/fsperfstats.h
index 590c91598d..d690e0bcf2 100644
--- a/indra/newview/fsperfstats.h
+++ b/indra/newview/fsperfstats.h
@@ -44,7 +44,7 @@
#ifdef TRACY_ENABLE
// USAGE_TRACKING - displays overlapping stats that may imply double counting.
// ATTACHMENT_TRACKING - displays detailed tracking info for Avatar and Attachment. very heavy overhead.
-#define USAGE_TRACKING
+// #define USAGE_TRACKING
#define ATTACHMENT_TRACKING
#else
#undef USAGE_TRACKING
diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt
index 837d92139d..d1b3d0c8b7 100644
--- a/indra/newview/licenses-win32.txt
+++ b/indra/newview/licenses-win32.txt
@@ -796,3 +796,69 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+
+=============
+GLOD license
+=============
+The GLOD Open-Source License Version 1.0 June 16, 2004
+
+Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns
+Hopkins University and David Luebke, Brenden Schubert, University of
+Virginia. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request in the documentation and/or other materials provided with
+ the distribution.
+
+3. The name "GLOD" must not be used to endorse or promote products
+ derived from this software without prior written permission.
+
+4. Redistributions of any modified version of this source, whether in
+ source or binary form , must include a form of the following
+ acknowledgment: "This product is derived from the GLOD library,
+ which is available from http://www.cs.jhu.edu/~graphics/GLOD."
+
+5. Redistributions of any modified version of this source in binary
+ form must provide, free of charge, access to the modified version
+ of the code.
+
+6. This license shall be governed by and construed and enforced in
+ accordance with the laws of the State of Maryland, without
+ reference to its conflicts of law provisions. The exclusive
+ jurisdiction and venue for all legal actions relating to this
+ license shall be in courts of competent subject matter jurisdiction
+ located in the State of Maryland.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, GLOD IS PROVIDED
+UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+THAT GLOD IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. ALL WARRANTIES ARE DISCLAIMED AND THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE CODE IS WITH
+YOU. SHOULD ANY CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
+NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY
+CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY CODE IS
+AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
+THE COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
+SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES FOR LOSS OF
+PROFITS, REVENUE, OR FOR LOSS OF INFORMATION OR ANY OTHER LOSS.
+
+YOU EXPRESSLY AGREE TO FOREVER INDEMNIFY, DEFEND AND HOLD HARMLESS THE
+COPYRIGHT HOLDERS AND CONTRIBUTORS OF GLOD AGAINST ALL CLAIMS,
+DEMANDS, SUITS OR OTHER ACTIONS ARISING DIRECTLY OR INDIRECTLY FROM
+YOUR ACCEPTANCE AND USE OF GLOD.
+
+Although NOT REQUIRED, we would appreciate it if active users of GLOD
+put a link on their web site to the GLOD web site when possible.
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 52d0adf6d6..9cf44bc612 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -825,6 +825,9 @@ void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
case LLModelPreview::MESH_OPTIMIZER_COMBINE:
mModelPreview->onLODMeshOptimizerParamCommit(lod, enforce_tri_limit, mode);
break;
+ case LLModelPreview::GENERATE:
+ mModelPreview->onLODGLODParamCommit(lod, enforce_tri_limit);
+ break;
default:
LL_ERRS() << "Only supposed to be called to generate models" << LL_ENDL;
break;
@@ -1961,6 +1964,7 @@ void LLFloaterModelPreview::onLoDSourceCommit(S32 lod)
S32 index = lod_source_combo->getCurrentIndex();
if (index == LLModelPreview::MESH_OPTIMIZER_AUTO
+ || index == LLModelPreview::GENERATE // Improved LOD generation
|| index == LLModelPreview::MESH_OPTIMIZER_SLOPPY
|| index == LLModelPreview::MESH_OPTIMIZER_COMBINE)
{ //rebuild LoD to update triangle counts
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 5bcd41a09c..13594a500a 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -93,6 +93,7 @@ bool LLModelPreview::sIgnoreLoadedCallback = false;
static const std::string DEFAULT_PHYSICS_MESH_NAME = "default_physics_shape";
const F32 SKIN_WEIGHT_CAMERA_DISTANCE = 16.f;
+#include "glod/glod.h" // More flexible LOD generation
// mesh loader suffix configuration
//static
const std::array LLModelPreview::sSuffixVarNames
@@ -104,6 +105,25 @@ const std::array LLModelPreview::sSuffixVarNames
"FSMeshPhysicsSuffix"
};
//
+
+// More flexible LOD generation
+BOOL stop_gloderror()
+{
+ GLuint error = glodGetError();
+
+ if (error != GLOD_NO_ERROR)
+ {
+ std::ostringstream out;
+ out << "GLOD error detected, cannot generate LOD (try another method?): " << std::hex << error;
+ LL_WARNS("MeshUpload") << out.str() << LL_ENDL;
+ LLFloaterModelPreview::addStringToLog(out, true);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+//
+
LLViewerFetchedTexture* bindMaterialDiffuseTexture(const LLImportMaterial& material)
{
LLViewerFetchedTexture *texture = LLViewerTextureManager::getFetchedTexture(material.getDiffuseMap(), FTT_DEFAULT, TRUE, LLGLTexture::BOOST_PREVIEW);
@@ -223,6 +243,12 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
mLoadState = LLModelLoader::STARTING;
mGroup = 0;
mLODFrozen = false;
+ // Improved LOD generation
+ mBuildShareTolerance = 0.f;
+ mBuildQueueMode = GLOD_QUEUE_GREEDY;
+ mBuildBorderMode = GLOD_BORDER_UNLOCK;
+ mBuildOperator = GLOD_OPERATOR_EDGE_COLLAPSE;
+ //
mUVGuideTexture = LLViewerTextureManager::getFetchedTextureFromFile(gSavedSettings.getString("FSMeshPreviewUVGuideFile"), FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_PREVIEW); // - Add UV guide overlay to pmesh preview
for (U32 i = 0; i < LLModel::NUM_LODS; ++i)
@@ -235,7 +261,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
mViewOption["show_textures"] = false;
mFMP = fmp;
-
+ glodInit(); // Improved LOD generation
mHasPivot = false;
mModelPivot = LLVector3(0.0f, 0.0f, 0.0f);
@@ -933,7 +959,12 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
}
mLODFile[lod] = filename;
-
+ // Improved LOD generation
+ if (lod == LLModel::LOD_HIGH)
+ {
+ clearGLODGroup();
+ }
+ //
std::map joint_alias_map;
getJointAliases(joint_alias_map);
@@ -1076,12 +1107,31 @@ void LLModelPreview::clearIncompatible(S32 lod)
mBaseModel = mModel[lod];
mBaseScene = mScene[lod];
mVertexBuffer[5].clear();
+ clearGLODGroup(); // Improved LOD generation
}
}
}
}
}
+// Improved LOD generation
+void LLModelPreview::clearGLODGroup()
+{
+ if (mGroup)
+ {
+ for (std::map, U32>::iterator iter = mObject.begin(); iter != mObject.end(); ++iter)
+ {
+ glodDeleteObject(iter->second);
+ stop_gloderror();
+ }
+ mObject.clear();
+
+ glodDeleteGroup(mGroup);
+ stop_gloderror();
+ mGroup = 0;
+ }
+}
+//
void LLModelPreview::loadModelCallback(S32 loaded_lod)
{
assert_main_thread();
@@ -1235,6 +1285,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
}
mBaseModel = mModel[loaded_lod];
+ clearGLODGroup(); // Improved LOD generation
mBaseScene = mScene[loaded_lod];
mVertexBuffer[5].clear();
@@ -1471,6 +1522,453 @@ void LLModelPreview::restoreNormals()
updateStatusMessages();
}
+// Improved LOD generation
+// Restore the GLOD entry point.
+// There would appear to be quite a lot of commonality which would be well suited to refactoring but
+// LL are still playing with Mesh Optimiser code.
+void LLModelPreview::genGlodLODs(S32 which_lod, U32 decimation, bool enforce_tri_limit)
+{
+ // Allow LoD from -1 to LLModel::LOD_PHYSICS
+ if (which_lod < -1 || which_lod > LLModel::NUM_LODS - 1)
+ {
+ std::ostringstream out;
+ out << "Invalid level of detail: " << which_lod;
+ LL_WARNS() << out.str() << LL_ENDL;
+ LLFloaterModelPreview::addStringToLog(out, false);
+ assert(which_lod >= -1 && which_lod < LLModel::NUM_LODS);
+ return;
+ }
+
+ if (mBaseModel.empty())
+ {
+ return;
+ }
+
+ LLVertexBuffer::unbind();
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader)
+ {
+ shader->unbind();
+ }
+
+ stop_gloderror();
+ static U32 cur_name = 1;
+
+ S32 limit = -1;
+
+ U32 triangle_count = 0;
+
+ U32 instanced_triangle_count = 0;
+
+ //get the triangle count for the whole scene
+ for (LLModelLoader::scene::iterator iter = mBaseScene.begin(), endIter = mBaseScene.end(); iter != endIter; ++iter)
+ {
+ for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)
+ {
+ LLModel* mdl = instance->mModel;
+ if (mdl)
+ {
+ instanced_triangle_count += mdl->getNumTriangles();
+ }
+ }
+ }
+
+ //get the triangle count for the non-instanced set of models
+ for (U32 i = 0; i < mBaseModel.size(); ++i)
+ {
+ triangle_count += mBaseModel[i]->getNumTriangles();
+ }
+
+ //get ratio of uninstanced triangles to instanced triangles
+ F32 triangle_ratio = (F32)triangle_count / (F32)instanced_triangle_count;
+
+ U32 base_triangle_count = triangle_count;
+
+ U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+
+ U32 lod_mode = 0;
+
+ F32 lod_error_threshold = 0;
+
+ // The LoD should be in range from Lowest to High
+ if (which_lod > -1 && which_lod < NUM_LOD)
+ {
+ LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode_" + lod_name[which_lod]);
+ if (iface)
+ {
+ lod_mode = iface->getFirstSelectedIndex();
+ }
+
+ lod_error_threshold = mFMP->childGetValue("lod_error_threshold_" + lod_name[which_lod]).asReal();
+ }
+
+ if (which_lod != -1)
+ {
+ mRequestedLoDMode[which_lod] = lod_mode;
+ }
+
+ if (lod_mode == 0)
+ {
+ lod_mode = GLOD_TRIANGLE_BUDGET;
+
+ // The LoD should be in range from Lowest to High
+ if (which_lod > -1 && which_lod < NUM_LOD)
+ {
+ limit = mFMP->childGetValue("lod_triangle_limit_" + lod_name[which_lod]).asInteger();
+ //convert from "scene wide" to "non-instanced" triangle limit
+ limit = (S32)((F32)limit*triangle_ratio);
+ }
+ }
+ else
+ {
+ lod_mode = GLOD_ERROR_THRESHOLD;
+ }
+
+ bool object_dirty = false;
+
+ if (mGroup == 0)
+ {
+ object_dirty = true;
+ mGroup = cur_name++;
+ glodNewGroup(mGroup);
+ }
+
+ if (object_dirty)
+ {
+ for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
+ { //build GLOD objects for each model in base model list
+ LLModel* mdl = *iter;
+
+ if (mObject[mdl] != 0)
+ {
+ glodDeleteObject(mObject[mdl]);
+ }
+
+ mObject[mdl] = cur_name++;
+
+ glodNewObject(mObject[mdl], mGroup, GLOD_DISCRETE);
+ stop_gloderror();
+
+ if (iter == mBaseModel.begin() && !mdl->mSkinWeights.empty())
+ { //regenerate vertex buffer for skinned models to prevent animation feedback during LOD generation
+ mVertexBuffer[5].clear();
+ }
+
+ if (mVertexBuffer[5].empty())
+ {
+ genBuffers(5, false);
+ }
+
+ U32 tri_count = 0;
+ for (U32 i = 0; i < mVertexBuffer[5][mdl].size(); ++i)
+ {
+ LLVertexBuffer* buff = mVertexBuffer[5][mdl][i];
+ buff->setBuffer(type_mask & buff->getTypeMask());
+
+ U32 num_indices = mVertexBuffer[5][mdl][i]->getNumIndices();
+ if (num_indices > 2)
+ {
+ // Fix glod so it works when just using the opengl core profile
+ //glodInsertElements(mObject[mdl], i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, (U8*)mVertexBuffer[5][mdl][i]->getIndicesPointer(), 0, 0.f);
+ LLStrider vertex_strider;
+ LLStrider normal_strider;
+ LLStrider tc_strider;
+
+ LLStrider< U16 > index_strider;
+ buff->getIndexStrider( index_strider );
+
+ glodVBO vbo = {};
+
+ if( buff->hasDataType( LLVertexBuffer::TYPE_VERTEX ) )
+ {
+ buff->getVertexStrider( vertex_strider );
+ vbo.mV.p = vertex_strider.get();
+ vbo.mV.size = 3;
+ vbo.mV.stride = LLVertexBuffer::sTypeSize[ LLVertexBuffer::TYPE_VERTEX ];
+ vbo.mV.type = GL_FLOAT;
+ }
+ if( buff->hasDataType( LLVertexBuffer::TYPE_NORMAL ) )
+ {
+ buff->getNormalStrider( normal_strider );
+ vbo.mN.p = normal_strider.get();
+ vbo.mN.stride = LLVertexBuffer::sTypeSize[ LLVertexBuffer::TYPE_NORMAL ];
+ vbo.mN.type = GL_FLOAT;
+ }
+ if( buff->hasDataType( LLVertexBuffer::TYPE_TEXCOORD0 ) )
+ {
+ buff->getTexCoord0Strider( tc_strider );
+ vbo.mT.p = tc_strider.get();
+ vbo.mT.size = 2;
+ vbo.mT.stride = LLVertexBuffer::sTypeSize[ LLVertexBuffer::TYPE_TEXCOORD0 ];
+ vbo.mT.type = GL_FLOAT;
+ }
+
+ glodInsertElements( mObject[ mdl ], i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, (U8*)index_strider.get(), 0, 0.f, &vbo );
+ //
+ }
+ tri_count += num_indices / 3;
+ stop_gloderror();
+ }
+
+ glodBuildObject(mObject[mdl]);
+ stop_gloderror();
+ }
+ }
+
+
+ S32 start = LLModel::LOD_HIGH;
+ S32 end = 0;
+
+ if (which_lod != -1)
+ {
+ start = end = which_lod;
+ }
+
+ mMaxTriangleLimit = base_triangle_count;
+
+ for (S32 lod = start; lod >= end; --lod)
+ {
+ if (which_lod == -1)
+ {
+ if (lod < start)
+ {
+ triangle_count /= decimation;
+ }
+ }
+ else
+ {
+ if (enforce_tri_limit)
+ {
+ triangle_count = limit;
+ }
+ else
+ {
+ for (S32 j = LLModel::LOD_HIGH; j>which_lod; --j)
+ {
+ triangle_count /= decimation;
+ }
+ }
+ }
+
+ mModel[lod].clear();
+ mModel[lod].resize(mBaseModel.size());
+ mVertexBuffer[lod].clear();
+
+ U32 actual_tris = 0;
+ U32 actual_verts = 0;
+ U32 submeshes = 0;
+
+ mRequestedTriangleCount[lod] = (S32)((F32)triangle_count / triangle_ratio);
+ mRequestedErrorThreshold[lod] = lod_error_threshold;
+
+ glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode);
+ stop_gloderror();
+
+ glodGroupParameteri(mGroup, GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR);
+ stop_gloderror();
+
+ glodGroupParameterf(mGroup, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, lod_error_threshold);
+ stop_gloderror();
+
+ if (lod_mode != GLOD_TRIANGLE_BUDGET)
+ {
+ glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0);
+ }
+ else
+ {
+ //SH-632: always add 1 to desired amount to avoid decimating below desired amount
+ glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, triangle_count + 1);
+ }
+
+ stop_gloderror();
+ glodAdaptGroup(mGroup);
+ stop_gloderror();
+
+ for (U32 mdl_idx = 0; mdl_idx < mBaseModel.size(); ++mdl_idx)
+ {
+ LLModel* base = mBaseModel[mdl_idx];
+
+ GLint patch_count = 0;
+ glodGetObjectParameteriv(mObject[base], GLOD_NUM_PATCHES, &patch_count);
+ stop_gloderror();
+
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ mModel[lod][mdl_idx] = new LLModel(volume_params, 0.f);
+
+ std::string name = base->mLabel + getLodSuffix(lod);
+
+ mModel[lod][mdl_idx]->mLabel = name;
+ mModel[lod][mdl_idx]->mSubmodelID = base->mSubmodelID;
+
+ GLint* sizes = new GLint[patch_count * 2];
+ glodGetObjectParameteriv(mObject[base], GLOD_PATCH_SIZES, sizes);
+ stop_gloderror();
+
+ GLint* names = new GLint[patch_count];
+ glodGetObjectParameteriv(mObject[base], GLOD_PATCH_NAMES, names);
+ stop_gloderror();
+
+ mModel[lod][mdl_idx]->setNumVolumeFaces(patch_count);
+
+ LLModel* target_model = mModel[lod][mdl_idx];
+
+ for (GLint i = 0; i < patch_count; ++i)
+ {
+ type_mask = mVertexBuffer[5][base][i]->getTypeMask();
+
+ LLPointer buff = new LLVertexBuffer(type_mask, 0);
+
+ if (sizes[i * 2 + 1] > 0 && sizes[i * 2] > 0)
+ {
+ if (!buff->allocateBuffer(sizes[i * 2 + 1], sizes[i * 2], true))
+ {
+ // Todo: find a way to stop preview in this case instead of crashing
+ LL_ERRS() << "Failed buffer allocation during preview LOD generation."
+ << " Vertices: " << sizes[i * 2 + 1]
+ << " Indices: " << sizes[i * 2] << LL_ENDL;
+ }
+ buff->setBuffer(type_mask);
+ // Fix glod so it works when just using the opengl core profile
+ //glodFillElements(mObject[base], names[i], GL_UNSIGNED_SHORT, (U8*)buff->getIndicesPointer());
+ LLStrider vertex_strider;
+ LLStrider normal_strider;
+ LLStrider tc_strider;
+
+ LLStrider< U16 > index_strider;
+ buff->getIndexStrider( index_strider );
+
+ glodVBO vbo = {};
+
+ if( buff->hasDataType( LLVertexBuffer::TYPE_VERTEX ) )
+ {
+ buff->getVertexStrider( vertex_strider );
+ vbo.mV.p = vertex_strider.get();
+ vbo.mV.size = 3;
+ vbo.mV.stride = LLVertexBuffer::sTypeSize[ LLVertexBuffer::TYPE_VERTEX ];
+ vbo.mV.type = GL_FLOAT;
+ }
+ if( buff->hasDataType( LLVertexBuffer::TYPE_NORMAL ) )
+ {
+ buff->getNormalStrider( normal_strider );
+ vbo.mN.p = normal_strider.get();
+ vbo.mN.stride = LLVertexBuffer::sTypeSize[ LLVertexBuffer::TYPE_NORMAL ];
+ vbo.mN.type = GL_FLOAT;
+ }
+ if( buff->hasDataType( LLVertexBuffer::TYPE_TEXCOORD0 ) )
+ {
+ buff->getTexCoord0Strider( tc_strider );
+ vbo.mT.p = tc_strider.get();
+ vbo.mT.size = 2;
+ vbo.mT.stride = LLVertexBuffer::sTypeSize[ LLVertexBuffer::TYPE_TEXCOORD0 ];
+ vbo.mT.type = GL_FLOAT;
+ }
+
+ glodFillElements( mObject[ base ], names[ i ], GL_UNSIGNED_SHORT, (U8*)index_strider.get(), &vbo );
+ //
+ stop_gloderror();
+ }
+ else
+ {
+ // This face was eliminated or we failed to allocate buffer,
+ // attempt to create a dummy triangle (one vertex, 3 indices, all 0)
+ buff->allocateBuffer(1, 3, true);
+ memset((U8*)buff->getMappedData(), 0, buff->getSize());
+ // Fix when running with opengl core profile
+ //memset((U8*)buff->getIndicesPointer(), 0, buff->getIndicesSize());
+ LLStrider< U16 > index_strider;
+ buff->getIndexStrider( index_strider );
+
+ memset( (U8*)index_strider.get(), 0, buff->getIndicesSize() );
+ //
+ }
+
+ buff->validateRange(0, buff->getNumVerts() - 1, buff->getNumIndices(), 0);
+
+ LLStrider pos;
+ LLStrider norm;
+ LLStrider tc;
+ LLStrider index;
+
+ buff->getVertexStrider(pos);
+ if (type_mask & LLVertexBuffer::MAP_NORMAL)
+ {
+ buff->getNormalStrider(norm);
+ }
+ if (type_mask & LLVertexBuffer::MAP_TEXCOORD0)
+ {
+ buff->getTexCoord0Strider(tc);
+ }
+
+ buff->getIndexStrider(index);
+
+ target_model->setVolumeFaceData(names[i], pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices());
+ actual_tris += buff->getNumIndices() / 3;
+ actual_verts += buff->getNumVerts();
+ ++submeshes;
+
+ if (!validate_face(target_model->getVolumeFace(names[i])))
+ {
+ std::ostringstream out;
+ out << "Invalid face generated during LOD generation.";
+ LLFloaterModelPreview::addStringToLog(out,true);
+ LL_ERRS() << out.str() << LL_ENDL;
+ }
+ }
+
+ //blind copy skin weights and just take closest skin weight to point on
+ //decimated mesh for now (auto-generating LODs with skin weights is still a bit
+ //of an open problem).
+ target_model->mPosition = base->mPosition;
+ target_model->mSkinWeights = base->mSkinWeights;
+ target_model->mSkinInfo = base->mSkinInfo;
+ //copy material list
+ target_model->mMaterialList = base->mMaterialList;
+
+ if (!validate_model(target_model))
+ {
+ LL_ERRS() << "Invalid model generated when creating LODs" << LL_ENDL;
+ }
+
+ delete[] sizes;
+ delete[] names;
+ }
+
+ //rebuild scene based on mBaseScene
+ mScene[lod].clear();
+ mScene[lod] = mBaseScene;
+
+ for (U32 i = 0; i < mBaseModel.size(); ++i)
+ {
+ LLModel* mdl = mBaseModel[i];
+ LLModel* target = mModel[lod][i];
+ if (target)
+ {
+ for (LLModelLoader::scene::iterator iter = mScene[lod].begin(); iter != mScene[lod].end(); ++iter)
+ {
+ for (U32 j = 0; j < iter->second.size(); ++j)
+ {
+ if (iter->second[j].mModel == mdl)
+ {
+ iter->second[j].mModel = target;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ LLVertexBuffer::unbind();
+ if (shader)
+ {
+ shader->bind();
+ }
+ refresh(); // refresh once to make sure render gets called with the updated vbos
+}
+//
+
// Runs per object, but likely it is a better way to run per model+submodels
// returns a ratio of base model indices to resulting indices
// returns -1 in case of failure
@@ -4384,8 +4882,13 @@ bool LLModelPreview::lodQueryCallback()
{
S32 lod = preview->mLodsQuery.back();
preview->mLodsQuery.pop_back();
+// Improved LOD generation
+#ifdef USE_GLOD_AS_DEFAULT
+ preview->genGlodLODs(lod, 3, false);
+#else
preview->genMeshOptimizerLODs(lod, MESH_OPTIMIZER_AUTO, 3, false);
-
+#endif
+//
if (preview->mLookUpLodFiles && (lod == LLModel::LOD_HIGH))
{
preview->lookupLODModelFiles(LLModel::LOD_HIGH);
@@ -4399,9 +4902,21 @@ bool LLModelPreview::lodQueryCallback()
return true;
}
+// Improved LOD generation
+void LLModelPreview::onLODGLODParamCommit(S32 lod, bool enforce_tri_limit)
+{
+ if (mFMP && !mLODFrozen)
+ {
+ genGlodLODs(lod, 3, enforce_tri_limit);
+ mFMP->refresh();
+ refresh();
+ mDirty = true;
+ }
+
+}
void LLModelPreview::onLODMeshOptimizerParamCommit(S32 requested_lod, bool enforce_tri_limit, S32 mode)
{
- if (!mLODFrozen)
+ if (mFMP && !mLODFrozen) // minor sidestep of potential crash
{
genMeshOptimizerLODs(requested_lod, mode, 3, enforce_tri_limit);
mFMP->refresh(); // BUG-231970 Fix b0rken upload floater refresh
diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h
index a1486a4e3d..86aaf101f9 100644
--- a/indra/newview/llmodelpreview.h
+++ b/indra/newview/llmodelpreview.h
@@ -128,6 +128,7 @@ public:
MESH_OPTIMIZER_AUTO, // automatically selects method based on model or face
MESH_OPTIMIZER_COMBINE, // combines faces into a single model, simplifies, then splits back into faces
MESH_OPTIMIZER_SLOPPY, // uses sloppy method, works per face
+ GENERATE, // Use GLOD Improved LOD generation
USE_LOD_ABOVE,
} eLoDMode;
@@ -165,6 +166,7 @@ public:
void loadModelCallback(S32 lod);
bool lodsReady() { return !mGenLOD && mLodsQuery.empty(); }
void queryLODs() { mGenLOD = true; };
+ void genGlodLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);
void genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 decimation = 3, bool enforce_tri_limit = false);
void generateNormals();
void restoreNormals();
@@ -175,6 +177,8 @@ public:
void clearIncompatible(S32 lod);
void updateStatusMessages();
void updateLodControls(S32 lod);
+ void clearGLODGroup();
+ void onLODGLODParamCommit(S32 lod, bool enforce_tri_limit);
void onLODMeshOptimizerParamCommit(S32 lod, bool enforce_tri_limit, S32 mode);
void addEmptyFace(LLModel* pTarget);
@@ -287,6 +291,16 @@ protected:
S32 mRequestedTriangleCount[LLModel::NUM_LODS];
F32 mRequestedErrorThreshold[LLModel::NUM_LODS];
F32 mRequestedCreaseAngle[LLModel::NUM_LODS];
+ // Improved LOD generation
+ F32 mBuildShareTolerance;
+ U32 mBuildQueueMode;
+ U32 mBuildOperator;
+ U32 mBuildBorderMode;
+ U32 mRequestedBuildOperator[LLModel::NUM_LODS];
+ U32 mRequestedQueueMode[LLModel::NUM_LODS];
+ U32 mRequestedBorderMode[LLModel::NUM_LODS];
+ F32 mRequestedShareTolerance[LLModel::NUM_LODS];
+ //
LLModelLoader* mModelLoader;
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index 7c762170a7..5da9533f46 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -694,8 +694,12 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
- LLVector4 sunDiffuse = LLVector4(psky->getSunlightColor().mV);
- LLVector4 moonDiffuse = LLVector4(psky->getMoonlightColor().mV);
+ // Fix array out of bounds on assigning LLColor3() to llVector4()
+ // LLVector4 sunDiffuse = LLVector4(psky->getSunlightColor().mV);
+ // LLVector4 moonDiffuse = LLVector4(psky->getMoonlightColor().mV);
+ LLVector4 sunDiffuse = LLVector4(LLVector3(psky->getSunlightColor().mV));
+ LLVector4 moonDiffuse = LLVector4(LLVector3(psky->getMoonlightColor().mV));
+ //
shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, sunDiffuse);
shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, moonDiffuse);
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index e998a25104..25168cc495 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -100,8 +100,12 @@ LLSkyTex::LLSkyTex() :
void LLSkyTex::init(bool isShiny)
{
mIsShiny = isShiny;
- mSkyData = new LLColor4[SKYTEX_RESOLUTION * SKYTEX_RESOLUTION];
- mSkyDirs = new LLVector3[SKYTEX_RESOLUTION * SKYTEX_RESOLUTION];
+ // Compiler fix - make sure the array size is an integer value
+ // mSkyData = new LLColor4[SKYTEX_RESOLUTION * SKYTEX_RESOLUTION];
+ // mSkyDirs = new LLVector3[SKYTEX_RESOLUTION * SKYTEX_RESOLUTION];
+ mSkyData = new LLColor4[(U32)(SKYTEX_RESOLUTION * SKYTEX_RESOLUTION)];
+ mSkyDirs = new LLVector3[(U32)(SKYTEX_RESOLUTION * SKYTEX_RESOLUTION)];
+ //
for (S32 i = 0; i < 2; ++i)
{
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 70c4c4884e..7fd13f8260 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -475,7 +475,7 @@ public:
RENDER_TYPE_PASS_SIMPLE_RIGGED = LLRenderPass::PASS_SIMPLE_RIGGED,
RENDER_TYPE_PASS_GRASS = LLRenderPass::PASS_GRASS,
RENDER_TYPE_PASS_FULLBRIGHT = LLRenderPass::PASS_FULLBRIGHT,
- RENDER_TYPE_PASS_FULLBRIGHT_RIGGED = LLRenderPass::PASS_FULLBRIGHT,
+ RENDER_TYPE_PASS_FULLBRIGHT_RIGGED = LLRenderPass::PASS_FULLBRIGHT_RIGGED, // Fix apparent copy&paste issue
RENDER_TYPE_PASS_INVISIBLE = LLRenderPass::PASS_INVISIBLE,
RENDER_TYPE_PASS_INVISIBLE_RIGGED = LLRenderPass::PASS_INVISIBLE_RIGGED,
RENDER_TYPE_PASS_INVISI_SHINY = LLRenderPass::PASS_INVISI_SHINY,
diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml
index 62261a3c95..50e358e923 100644
--- a/indra/newview/skins/default/xui/de/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml
@@ -176,6 +176,7 @@
+
@@ -190,6 +191,7 @@
+
@@ -205,6 +207,7 @@
+
@@ -220,6 +223,7 @@
+
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 5b4b3298b8..23b371801d 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -6790,6 +6790,7 @@ Vorheriger Besitzer: [OBJECT_LAST_OWNER_ID]
Gerezt von: [OBJECT_REZZER_KEY]
Gruppe: [OBJECT_GROUP]
Erstellungszeit: [OBJECT_CREATION_TIME]
+Rez-Zeit: [OBJECT_REZ_TIME]
Pathfinding-Typ: [OBJECT_PATHFINDING_TYPE]
Angehängt an: [OBJECT_ATTACHED_POINT]
Temporär angehängt: [OBJECT_TEMP_ATTACHED]
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index b6dd94fe92..74729a2158 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -248,6 +248,7 @@ expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FMOD Sound System, Copyright (C) Firelight Technologies Pty, Ltd., 1994-2020
FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
GL Copyright (C) 1999-2004 Brian Paul.
+GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
HACD Copyright (C) 2011, Khaled Mamou (kmamou@gmail.com)
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 61aa70e3db..1bef9b6806 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -203,6 +203,10 @@
name="MeshOptSloppy"
label="Generate Sloppy"
value="MeshOptSloppy" />
+
+
+
+
-
- LOD Suffixes:
+ LOD Suffixes:
- Lowest:
+ Lowest:
- Low:
+ Low:
- Medium:
+ Medium:
- High:
+ High:
- Physics:
+ Physics:
Les options du niveau de détail ne sont pas une sous-ensemble d'un modèle de référence.
Certaines enveloppes physiques dépassent les limites de sommets.
Certains modèles dépassent la limite de la coque (256) ; essayez de "simplifier"..
-Maillage physique trop dense ; supprimez les petits et fins triangles (voir aperçu).
+Le maillage physique est trop dense ou contient des triangles non cohérents. Utilisez Analyser/Simplifier pour résoudre ce problème.
Cette version ne contient pas de support Havok et n'est pas recommandée pour le chargement de physiques dans Second Life. Les résultats peuvent être imprévisibles.
Une ou plusieurs dimensions sont inférieures à 0,5 m, seules les formes physiques basées sur la coque (analysées) fonctionneront correctement.
Une erreur inconnue a été détectée.
@@ -34,7 +34,22 @@
Riggé à une articulation au nom inconnu [NAME]
Skinning désactivé à cause de [COUNT] articulation inconnues.
Modèle [MODEL_NAME] chargé
+
Les données des coordonnées de la texture ne sont pas complètes.
+Trouvé NaN lors du chargement des données de position depuis le fichier DAE, modèle invalide.
+Trouvé NaN lors du chargement des normales depuis le fichier DAE, modèle invalide.
+Échelle négative détectée, transformation non prise en charge. domInstance_geometry : [LABEL]
+Échelle négative détectée, transformation post-normalisation non prise en charge. domInstance_geometry : [LABEL]
+Impossible de résoudre l'URL de la géométrie.
+Mauvais élément
+La scène n'a pas pu être analysée
+Erreur avec le dae - indique traditionnellement un fichier corrompu.
+Impossible de vérifier le contrôleur
+Impossible de trouver le document interne
+Le document n'a pas de racine
+Le document n'a pas de visual_scene
+Impossible de traiter le maillage sans données de position. Modèle invalide.
+
@@ -62,7 +77,10 @@
-
+
+
+
+
@@ -74,7 +92,10 @@
-
+
+
+
+
@@ -87,7 +108,10 @@
-
+
+
+
+
@@ -100,7 +124,10 @@
-
+
+
+
+
@@ -252,10 +279,48 @@
-
- Physique défini par l'utilisateur :
+
+ Suffixes LOD :
-
+
+
+ Choisissez un standard ou éditez manuellement...
+
+
+ Standard SL (Le plus bas = LOD0)
+
+
+ Standard moteur de jeu (Le plus bas = LOD3)
+
+
+ Mots (haut, moyen...)
+
+
+
+ Le plus bas :
+
+
+
+ Bas :
+
+
+
+ Moyen :
+
+
+
+ Élevé :
+
+
+
+ Physiques :
+
+
+
+ Physique prédéfini par l'utilisateur :
+
+
+
Couleurs de l'aperçu des modèles :
diff --git a/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
index 42af9c526d..b5865cb2d6 100644
--- a/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
@@ -12,6 +12,7 @@
Faible
+
Avatar
@@ -41,7 +42,6 @@
(0 = défaut, valeur faible = plus lumineux)
-
@@ -86,7 +86,6 @@
Faible
-
Reflets dans l’eau :
diff --git a/indra/newview/skins/default/xui/fr/floater_stats.xml b/indra/newview/skins/default/xui/fr/floater_stats.xml
index 137086cedd..ba049f4dc0 100644
--- a/indra/newview/skins/default/xui/fr/floater_stats.xml
+++ b/indra/newview/skins/default/xui/fr/floater_stats.xml
@@ -4,6 +4,9 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 3c8bfbcbec..147259e35c 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -49,6 +49,8 @@
+
+
@@ -448,7 +450,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index eba11a528f..a3335d8365 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -1932,7 +1932,7 @@ jusqu'à [MAX_PREMIUM_PLUS]. [https://secondlife.com/my/account/membership.php?
Comme dans la vie réelle, il faut quelque temps aux gens pour qu'ils se familiarisent avec un nouveau nom. Veuillez compter quelques jours avant la [http://wiki.secondlife.com/wiki/Setting_your_display_name mise à jour de votre nom] au niveau des objets, scripts, recherches, etc.
- Impossible de changer de nom d'affichage. Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance.
+ Impossible de changer de nom d'affichage. Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance du réseau.
Le nom saisi est trop long. Le nombre de caractères maximum est de [LENGTH].
@@ -5032,7 +5032,7 @@ Veuillez sélectionner un terrain plus petit.
- Une corruption a été trouvée dans votre inventaire.
+ Une corruption a été trouvée dans votre inventaire.
Veuillez contacter [HELP] avec la liste de problèmes suivante.
Ils peuvent utiliser http://opensimulator.org/wiki/inventory pour résoudre les problèmes.
diff --git a/indra/newview/skins/default/xui/fr/panel_login_first.xml b/indra/newview/skins/default/xui/fr/panel_login_first.xml
index 7db6ac7bf6..67998b37ef 100644
--- a/indra/newview/skins/default/xui/fr/panel_login_first.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login_first.xml
@@ -13,13 +13,14 @@
-
+
+ S'inscrire
+
+
+
Mot de passe oublié
-
- S'inscrire
-
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
index 6945b7cea3..a9b1d6e3b7 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -68,7 +68,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index bfc030b519..4a92167ae8 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -223,6 +223,10 @@ http://secondlife.com/download
Pour plus d'informations, consultez la page FAQ ci-dessous :
http://secondlife.com/viewer-access-faq
+
+
+ Échec de la connexion d'urgence de la grille.
+Si vous pensez qu'il s'agit d'une erreur, veuillez contacter le support du réseau.
Mise à jour facultative du client disponible : [VERSION]
@@ -6634,6 +6638,7 @@ Propriétaire précédent : [OBJECT_LAST_OWNER_ID]
Posé par : [OBJECT_REZZER_KEY]
Groupe : [OBJECT_GROUP]
Date de création : [OBJECT_CREATION_TIME]
+Rezz time: [OBJECT_REZ_TIME]
Type de cheminement : [OBJECT_PATHFINDING_TYPE]
Point d'attache : [OBJECT_ATTACHED_POINT]
Attaché temporairement : [OBJECT_TEMP_ATTACHED]
diff --git a/indra/newview/skins/default/xui/pl/floater_model_preview.xml b/indra/newview/skins/default/xui/pl/floater_model_preview.xml
index 21c949779e..f6ee346bb7 100644
--- a/indra/newview/skins/default/xui/pl/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_model_preview.xml
@@ -65,6 +65,7 @@
+
@@ -77,6 +78,7 @@
+
@@ -90,6 +92,7 @@
+
@@ -103,6 +106,7 @@
+
@@ -224,7 +228,7 @@
- Sufiksy LOD:
+ Sufiksy LOD:
Wybierz standard lub edytuj ręcznie...
@@ -233,23 +237,23 @@
Słowa (high, med...)
- Najniższy:
+ Najniższy:
- Niski:
+ Niski:
- Średni:
+ Średni:
- Wysoki:
+ Wysoki:
- Fizyka:
+ Fizyka:
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 4761e8b3be..6a55a5b910 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -6107,6 +6107,7 @@ Poprzedni właściciel: [OBJECT_LAST_OWNER_ID]
Zrezzowany przez: [OBJECT_REZZER_KEY]
Grupa: [OBJECT_GROUP]
Czas utworzenia: [OBJECT_CREATION_TIME]
+Czas zrezzowania: [OBJECT_REZ_TIME]
Typ odnajdywania ścieżki: [OBJECT_PATHFINDING_TYPE]
Punkt dołączenia: [OBJECT_ATTACHED_POINT]
Tymczasowo dołączone: [OBJECT_TEMP_ATTACHED]
diff --git a/indra/newview/skins/default/xui/ru/floater_model_preview.xml b/indra/newview/skins/default/xui/ru/floater_model_preview.xml
index 3ab0132a85..5a41eaed0a 100644
--- a/indra/newview/skins/default/xui/ru/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/ru/floater_model_preview.xml
@@ -23,7 +23,7 @@
Материалы уровня детализации не входят в эталонную модель.
Для некоторых физических оболочек превышен лимит вершин(256); попробуйте другой 'Метод Анализа'.
Некоторые модели превышают предел оболочек (256); попробуйте 'Упрощение'.
- Физика меша слишком плотная; удалить маленькие, тонкие треугольники (смотри просмотр).
+ Физика меша слишком плотная или содержит вырожденные треугольники. Используйте Анализ/Упрощение для решения.
Эта версия не поддерживает Havok и не рекомендуется для загрузки физики в Second Life. Результаты могут быть непредсказуемыми.
Один или несколько размеров меньше 0,5м, корректно будут работать только физические формы, основанные на корпусе (проанализированные).
Обнаружена нераспознанная ошибка.
@@ -38,6 +38,19 @@
Текстурирование отключено, слишком много [COUNT] неизвестных суставов
Модель [MODEL_NAME] загружена
Данные координат текстуры не полны.
+ Обнаружен NaN при загрузке данных о местоположении из DAE-модели, недопустимая модель.
+ Найдено NaN при загрузке нормалей из DAE-модели, недопустимая модель.
+ Обнаружен отрицательный масштаб, неподдерживаемое преобразование. domInstance_geometry: [LABEL]
+ Обнаружен отрицательный масштаб, неподдерживаемое преобразование после нормализации. domInstance_geometry: [LABEL]
+ Не удается разрешить геометрию URL.
+ Плохой элемент
+ Сцена не может быть проанализирована
+ Ошибка с dae - традиционно указывает на поврежденный файл.
+ Не удалось проверить контроллер
+ Не удается найти внутренние документы
+ Документ не имеет корня
+ Документ не имеет visual_scene
+ Невозможно обработать сетку без данных о местоположении. Недопустимая модель.
@@ -50,8 +63,11 @@
-
-
+
+
+
+
+
@@ -60,9 +76,12 @@
-
-
-
+
+
+
+
+
+
@@ -71,9 +90,11 @@
-
-
-
+
+
+
+
+
@@ -82,9 +103,11 @@
-
-
-
+
+
+
+
+
@@ -172,10 +195,40 @@
+
+ LOD суффиксы:
+
+
+ Выберите стандарт или отредактируйте вручную...
+ Стандарт SL (Низший=LOD0)
+ Стандарт игровых движков (Низший=LOD3)
+ Слова (high,med...)
+
+
+ Низший:
+
+
+
+ Низкий:
+
+
+
+ Средний:
+
+
+
+ Высокий:
+
+
+
+ Физика:
+
+
Предустановки физики:
+
Цвета предварительного просмотра:
diff --git a/indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml
index eab8b2da75..eb9f19b235 100644
--- a/indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml
@@ -12,6 +12,7 @@
Низкое
+
Аватар
@@ -41,7 +42,6 @@
(чем меньше, тем ярче, 0 – яркость по умолчанию)
-
@@ -86,7 +86,6 @@
Низкая
-
Вода отражает:
diff --git a/indra/newview/skins/default/xui/ru/floater_stats.xml b/indra/newview/skins/default/xui/ru/floater_stats.xml
index c98ca14882..5a60e6af4e 100644
--- a/indra/newview/skins/default/xui/ru/floater_stats.xml
+++ b/indra/newview/skins/default/xui/ru/floater_stats.xml
@@ -4,6 +4,9 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 43228e92ae..5c4c556e61 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -56,6 +56,8 @@
+
+
@@ -537,7 +539,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 35722e2fbc..ee1e905dae 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -3962,16 +3962,6 @@ https://wiki.firestormviewer.org/fs_voice
Выбранный объект влияет на навигационную сетку. Если заменить его на гибкий путь, он будет удален из навигационной сетки.
-
- Ваше оборудование не соответствуете требованиям для [APP_NAME]. [APP_NAME] требуется поддержка шейдеров OpenGL 2.0 или новее. В этом случае вы можете убедиться, что у вас установлены последние версии драйверов для вашей видеокарты, а также пакеты обновления и исправления для вашей операционной системы.
-
-Если проблема не исчезнет, посетите [SUPPORT_SITE].
-
-
- По-видимому, ваше оборудование не удовлетворяет требованиям [APP_NAME]. Для работы [APP_NAME] необходима графическая карта OpenGL с поддержкой мультитекстур. Если у вас есть такая карта, убедитесь, что установлены новейшие версии драйверов для нее и пакеты обновлений и исправления для операционной системы.
-
-Если неполадки продолжаются, посетите сайт [SUPPORT_SITE].
-
Установленный графический драйвер Intel для [GPUNAME], версия [VERSION], значительно устарел и, как известно, вызывает чрезмерно частые сбои программы. Настоятельно рекомендуется установить последнюю версию драйвера Intel.
diff --git a/indra/newview/skins/default/xui/ru/panel_login_first.xml b/indra/newview/skins/default/xui/ru/panel_login_first.xml
index bf60689554..b9fa098867 100644
--- a/indra/newview/skins/default/xui/ru/panel_login_first.xml
+++ b/indra/newview/skins/default/xui/ru/panel_login_first.xml
@@ -4,13 +4,15 @@
-
- Забыли пароль
Регистрация
+
+
+ Забыли пароль
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
index 7eb8d12073..f0e8e19171 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
@@ -104,7 +104,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 23266f4c83..26aecee3e4 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -114,6 +114,9 @@ SLURL: <nolink>[SLURL]</nolink>
[day, datetime, slt] [month, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] SLT
+
+ [day, datetime, local] [month, datetime, local] [year, datetime, local] [hour, datetime, local]:[min, datetime, local]:[second,datetime, local]
+
Ошибка при получении URL-адреса заметок о выпуске сервера.
@@ -243,6 +246,10 @@ https://www.firestormviewer.org/choose-your-platform/
Дополнительные сведения смотрите в разделе вопросов и ответов по адресу:
http://secondlife.com/viewer-access-faq
+
+
+ Аварийный сбой входа в сеть.
+Если вы считаете, что это ошибка, пожалуйста, свяжитесь со службой поддержки сети.
Доступно необязательное обновление клиента: [VERSION]
@@ -288,9 +295,12 @@ http://secondlife.com/viewer-access-faq
Если вы считаете, что это ошибка, отправьте сообщение по адресу
support@secondlife.com.
+
+ Тихоокеанское время
+
Ваш аккаунт не будет доступен до
-[TIME] по тихоокеанскому времени. (PST)
+[TIME]
В данное время нам не удается выполнить ваш запрос.
@@ -303,7 +313,7 @@ support@secondlife.com.
Выполняется техническое обслуживание вашего аккаунта.
Ваш аккаунт не будет доступен до
-[TIME] по тихоокеанскому времени.
+[TIME]
Если вы считаете, что это ошибка, отправьте сообщение по адресу support@secondlife.com.
@@ -6402,6 +6412,7 @@ ID объекта: [INSPECTING_KEY]
Выложено: [OBJECT_REZZER_KEY]
Группа: [OBJECT_GROUP]
Время создания: [OBJECT_CREATION_TIME]
+Время размещения: [OBJECT_REZ_TIME]
Тип поиска пути: [OBJECT_PATHFINDING_TYPE]
Присоединено к: [OBJECT_ATTACHED_POINT]
Временно присоединено: [OBJECT_TEMP_ATTACHED]
@@ -6627,10 +6638,10 @@ ID объекта: [INSPECTING_KEY]
Ошибка кэширования подключенного файла '[FILENAME]'
- Отображение вашего текущего местоположения в меню было отключено по умолчанию для серии тем Starlight.
+ Отображение вашего текущего местоположения в строке меню было отключено по умолчанию для серии скинов Starlight.
- Отображение панели навигации было включено по умолчанию для серии тем Starlight.
+ Отображение панели навигации было включено по умолчанию для серии скинов Starlight.
Предупреждение: Выходные данные препроцессора усечены из-за чрезмерного размера текста скрипта. Этот скрипт, скорее всего, не будет работать.
diff --git a/indra/newview/skins/starlight/textures/textures.xml b/indra/newview/skins/starlight/textures/textures.xml
index 2d17351d73..72e48bdd63 100755
--- a/indra/newview/skins/starlight/textures/textures.xml
+++ b/indra/newview/skins/starlight/textures/textures.xml
@@ -128,7 +128,6 @@ with the same filename but different name
-
@@ -869,7 +868,6 @@ with the same filename but different name
-
@@ -914,7 +912,6 @@ with the same filename but different name
-
@@ -956,9 +953,6 @@ with the same filename but different name
-
-
-
@@ -1011,72 +1005,4 @@ with the same filename but different name
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/starlightcui/textures/textures.xml b/indra/newview/skins/starlightcui/textures/textures.xml
index 2d17351d73..91ab1a6968 100755
--- a/indra/newview/skins/starlightcui/textures/textures.xml
+++ b/indra/newview/skins/starlightcui/textures/textures.xml
@@ -128,7 +128,6 @@ with the same filename but different name
-
@@ -869,7 +868,6 @@ with the same filename but different name
-
@@ -914,7 +912,6 @@ with the same filename but different name
-
@@ -956,9 +953,6 @@ with the same filename but different name
-
-
-
@@ -984,8 +978,6 @@ with the same filename but different name
-
-
@@ -1011,72 +1003,4 @@ with the same filename but different name
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 48245d03ef..d374f8a9b1 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -600,6 +600,14 @@ class WindowsManifest(ViewerManifest):
# Get shared libs from the shared libs staging directory
with self.prefix(src=os.path.join(self.args['build'], os.pardir,
'sharedlibs', self.args['configuration'])):
+
+ # Mesh 3rd party libs needed for auto LOD and collada reading
+ try:
+ self.path("glod.dll")
+ except RuntimeError as err:
+ print (err.message)
+ print ("Skipping GLOD library (assumming linked statically)")
+
# Get fmodstudio dll if needed
if self.args['fmodstudio'] == 'ON':
if(self.args['configuration'].lower() == 'debug'):
@@ -1445,6 +1453,7 @@ class DarwinManifest(ViewerManifest):
"libapr-1.0.dylib",
"libaprutil-1.0.dylib",
"libexpat.1.dylib",
+ "libGLOD.dylib",
# libnghttp2.dylib is a symlink to
# libnghttp2.major.dylib, which is a symlink
# to libnghttp2.version.dylib. Get all of them.
@@ -2139,6 +2148,7 @@ class Linux_i686_Manifest(LinuxManifest):
self.path("libaprutil-1.so.0.4.1")
self.path("libdb*.so")
self.path("libexpat.so.*")
+ self.path("libGLOD.so")
self.path("libuuid.so*")
self.path("libSDL-1.2.so.*")
self.path("libdirectfb-1.*.so.*")