diff --git a/autobuild.xml b/autobuild.xml index a597a9db5d..d3faf9adf4 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -235,6 +235,72 @@ + glod + + copyright + Copyright 2003 Jonathan Cohen, Nat Duca, David Luebke, Brenden Schubert - Johns Hopkins University and University of Virginia + license + GLOD Open-Source License Version 1.0 + license_file + LICENSES/GLOD.txt + name + glod + platforms + + darwin64 + + archive + + hash + 94fc457c46e1fb94b31251bd4747d10f + url + http://3p.firestormviewer.org/glod-1.0pre3.171101143-darwin64-171101143.tar.bz2 + + name + darwin64 + + linux64 + + archive + + hash + acc1181cd31ef32c3724eda84ae4b580 + url + http://3p.firestormviewer.org/glod-1.0pre3.180990827-linux64-180990827.tar.bz2 + + name + linux64 + + windows + + archive + + hash + e1f8da12a2b7a6c31830b4bb86d31ed6 + hash_algorithm + md5 + url + http://3p.firestormviewer.org/glod-1.0pre3.vs2017-1906061512-windows-vs2017-1906061512.tar.bz2 + + name + windows + + windows64 + + archive + + hash + e906cf08bfbfbd9d4fc78557e021e7d0 + url + http://3p.firestormviewer.org/glod-1.0pre3.vs2017-1906061512-windows64-vs2017-1906061512.tar.bz2 + + name + windows64 + + + version + 1.0pre3.532346 + 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 @@ +