Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2024.12 ForeverFPS #3304

Open
wants to merge 87 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
eaa4d07
#3301 Don't crash on invalid visual parameter update. (#3303)
RunitaiLinden Dec 18, 2024
7aca014
#3305 Don't crash on invalid texture index in getTEWearableType (#3306)
RunitaiLinden Dec 18, 2024
8ed31a7
Merge remote-tracking branch 'origin/main' into release/2024.12-Forev…
brad-linden Dec 18, 2024
c88a7d1
#3302 fix crash on changing filter string when content is loading or …
maxim-productengine Dec 19, 2024
a275157
#3311 RenderSkyAutoAdjustLegacy does not engage tonemapper
akleshchev Jan 2, 2025
cba1807
#3326 Skip ambient probe sampling when we're in classic mode. Ensure…
Geenz Jan 2, 2025
a259316
#3329 Crash at LLSpatialGroup::dirtyGeom
akleshchev Jan 2, 2025
85162a4
#3302 Crash at LLSaveFolderState::doFolder
akleshchev Jan 2, 2025
edebc8f
#3344 Crash at LLFloater::openFloater
akleshchev Jan 6, 2025
12303e2
#3347 Crashes in LLFontFreetype::renderGlyph
akleshchev Jan 6, 2025
97b1ab3
#3360 Crash in LLReflectionMapManager::update()
akleshchev Jan 7, 2025
98473aa
#3349 keep object selection after showing confirmation dialog
maxim-productengine Jan 8, 2025
8d57388
Fix world going black and white in certain locations on apple gpu (#2…
Jan 10, 2025
c883c7f
Drop reflection probes and mirrors to RGBA8 when hdr is disabled to m…
Jan 10, 2025
50740c7
Merge pull request #3390 from secondlife/rye/forever-2558
Jan 10, 2025
4ff1cbf
#3316 Crash in LLReflectionMap::getIsDynamic()
akleshchev Jan 10, 2025
203ef2f
#3364 Decrement bias only if there is 10prcnt free space
akleshchev Jan 9, 2025
eb48eea
#3364 Cap intel adapters' vram to 25% of ram
akleshchev Jan 9, 2025
f34af8f
#3398 Remove 3p logos from the viewer
akleshchev Jan 13, 2025
c2d4919
#3405 MotD dynamic resizing
akleshchev Jan 14, 2025
6dc819e
#3364 Fix update rate being stuck high due to bias
akleshchev Jan 15, 2025
b1bd083
#3413 Crash at removeFromLocalIDTable
akleshchev Jan 16, 2025
306e9e6
#3413 Crash at removeFromLocalIDTable #2
akleshchev Jan 17, 2025
75a01bf
#3319 Crash at LLInitParam::Param::setProvided
akleshchev Jan 18, 2025
ebae60c
#3424 Update 'Second Life Blogs' link
maxim-productengine Jan 20, 2025
2ee845c
#3436 Better handling of 'teleport_strings.xml' parsing failure
akleshchev Jan 20, 2025
fa963b6
#3438 Crash when ParcelProperties' Bitmap is of wrong size
akleshchev Jan 20, 2025
74cdfce
#3440 Crash at updateCombinationVisibility
akleshchev Jan 20, 2025
75e01f8
#3436 Better handling in setting_get_control
akleshchev Jan 20, 2025
f490bf6
#3442 Crash at LLDrawable::isState
maxim-productengine Jan 21, 2025
c85880a
#3371 Texture resolution cap
akleshchev Jan 13, 2025
9159922
#3371 Texture resolution cap #2
akleshchev Jan 17, 2025
ad375d6
viewer#3088 Report out of memory as a separate 'category'
akleshchev Nov 14, 2024
de1ff0b
viewer#3088 Add graphical init and reinit
akleshchev Dec 5, 2024
01bd15d
#3431 Include session id with last exec event
akleshchev Jan 21, 2025
831f7d6
#3431 Try to log out if login failed due to missing caps
akleshchev Jan 21, 2025
5af750a
#3450 Crash at LLViewerMediaTexture::setPlaying
akleshchev Jan 21, 2025
ad30637
#3452 Crash in LLSaleInfo::asLLSD()
akleshchev Jan 22, 2025
c8c1d67
#3187 Crash at LLTextureEntry::getGLTFRenderMaterial
akleshchev Jan 22, 2025
783365d
Small cleanup
akleshchev Jan 23, 2025
ec7ad63
#3451 Crash at LLFloaterSnapshot::Impl::getActivePanel
maxim-productengine Jan 23, 2025
4ff56cf
#3371 Texture resolution cap #3
akleshchev Jan 23, 2025
4763195
Fix potential undefined behavior when converting to and from glm type…
Jan 23, 2025
aa02a5b
Merge pull request #3468 from secondlife/rye/forever-3339
Jan 24, 2025
d5c6eb9
Attempt to get more log info in secondlife/viewer#3335 crash reports …
brad-linden Jan 24, 2025
52a9316
#3473 Fix crash at mActiveObjects
akleshchev Jan 27, 2025
26e1520
Backport tag-release token fix to release/2024.12-ForeverFPS branch
brad-linden Jan 28, 2025
43a966e
#3466 Crash at LLScrollingPanelParam::draw
maxim-productengine Jan 28, 2025
cff2c66
viewer#2576 Crash when banning a resident
maxim-productengine Jan 29, 2025
4380a4e
Merge pull request #3480 from secondlife/brad/tag-release-fix
nat-goodspeed Jan 29, 2025
fd577e3
#3400 Reimplement LLError marker for crash statistics
akleshchev Jan 28, 2025
460e77c
#3456 Water improvements to get us closer to 6.6.17 (#3490)
Geenz Jan 30, 2025
b3fb418
#3491 Rename all uses of Release Candidate to Beta
maxim-productengine Jan 31, 2025
81a2813
Fix media failing to function on PBR materials (#3445)
Feb 3, 2025
265ebfb
#3346 crash at LLConversationItemSession::clearAndDeparentModels
maxim-productengine Feb 4, 2025
c0156eb
Merge pull request #3497 from secondlife/rye/forever-3445
Feb 5, 2025
317cd6e
Add some haze to the distance on water. (#3508)
Geenz Feb 6, 2025
93a88e6
Water Exclusion Surfaces (#3517)
Geenz Feb 7, 2025
df0634f
#3505 Make checkFolderForContentsOfType cheaper
akleshchev Feb 6, 2025
046ec79
#3505 Make inventory run less content checks
akleshchev Feb 6, 2025
95106e2
#3505 Fix updateMenu() being called too frequently on fetch callback
akleshchev Feb 6, 2025
1924241
viewer-private#375 add more logging in attempt to get more info
maxim-productengine Feb 7, 2025
3a251b1
#3332 Switching screens can break text rendering
akleshchev Feb 7, 2025
bc84cb0
#3332 Issues with text buffer updates
akleshchev Feb 9, 2025
6a78b5b
#3332 Font issues with multy-byte and multy-glyps characters
akleshchev Feb 10, 2025
d450295
Additional water fixes and tweaks. (#3524)
Geenz Feb 11, 2025
e708d69
#3332 Fix buffers not accounting for dynamic cache values
akleshchev Feb 11, 2025
09c60de
#3210 Fix for "Texture will be downscaled" log message happening too …
maxim-productengine Feb 12, 2025
bec3826
viewer-private#395 Fix voice not reconnecting
akleshchev Feb 12, 2025
646d077
viewer-private#396 Use benefits for picks count
akleshchev Feb 12, 2025
0679cbd
viewer-private#394 Ensure correct item id is used on mac
maxim-productengine Feb 13, 2025
ddbe1ff
Fix xcode16 build errors
marchcat Feb 13, 2025
34c3eed
Bump macos runner to os version 15 with xcode 16.1
marchcat Feb 13, 2025
d74b30b
Follow-up fixes from develop
marchcat Feb 13, 2025
8f8453c
Merge pull request #3549 from secondlife/marchcat/foreverfps-xcode-16
marchcat Feb 13, 2025
c60061b
Switch from GL_RGB16F to GL_R11F_G11F_B10F for probes (#3562)
Geenz Feb 14, 2025
b0d8055
#2639 GPU test twice to fix misreported bandwidth (#3558)
akleshchev Feb 15, 2025
9b0c167
#3557 Waves not applying without Transparent Water
akleshchev Feb 17, 2025
8114850
#3511 fix for PBR skies being too bright on Low Graphics
maxim-productengine Feb 18, 2025
41368a9
#3581 #3563 Fix callback deletion not working
akleshchev Feb 19, 2025
a1121eb
Update allow list for CLA.
Geenz Feb 19, 2025
789edfc
Merge pull request #3586 from secondlife/geenz/cla-whitelist-update
Geenz Feb 19, 2025
1fe6031
CLA wants a comma separated string.
Geenz Feb 19, 2025
0493b56
Merge branch 'develop' into geenz/cla-whitelist-update
Geenz Feb 19, 2025
20dfc94
Merge pull request #3587 from secondlife/geenz/cla-whitelist-update
Geenz Feb 19, 2025
941c002
Merge branch 'develop' into release/2024.12-ForeverFPS
Geenz Feb 19, 2025
b2e3159
viewer-private#398 Fix constant asset rerequests
akleshchev Feb 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
needs: setup
strategy:
matrix:
runner: [windows-large, macos-12-large]
runner: [windows-large, macos-15-xlarge]
configuration: ${{ fromJSON(needs.setup.outputs.configurations) }}
runs-on: ${{ matrix.runner }}
outputs:
Expand All @@ -64,7 +64,7 @@ jobs:
# autobuild-package.xml.
AUTOBUILD_VCS_INFO: "true"
AUTOBUILD_VSVER: "170"
DEVELOPER_DIR: "/Applications/Xcode_14.0.1.app/Contents/Developer"
DEVELOPER_DIR: "/Applications/Xcode_16.1.app/Contents/Developer"
# Ensure that Linden viewer builds engage Bugsplat.
BUGSPLAT_DB: ${{ needs.setup.outputs.bugsplat_db }}
build_coverity: false
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cla.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ jobs:
path-to-signatures: signatures.json
remote-organization-name: secondlife
remote-repository-name: cla-signatures
allowlist: callum@mbp.localdomain
allowlist: callum@mbp.localdomain,rye@lindenlab.com
7 changes: 6 additions & 1 deletion .github/workflows/tag-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,12 @@ jobs:
- name: Update Tag
uses: actions/github-script@v7.0.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
# use a real access token instead of GITHUB_TOKEN default.
# required so that the results of this tag creation can trigger the build workflow
# https://stackoverflow.com/a/71372524
# https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow
# this token will need to be renewed anually in January
github-token: ${{ secrets.LL_TAG_RELEASE_TOKEN }}
script: |
github.rest.git.createRef({
owner: context.repo.owner,
Expand Down
5 changes: 5 additions & 0 deletions indra/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ else()
set( USE_AUTOBUILD_3P ON )
endif()

if (NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 20)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(Variables)
include(BuildVersion)

Expand Down
3 changes: 2 additions & 1 deletion indra/llappearance/llavatarappearancedefines.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,8 @@ EBakedTextureIndex LLAvatarAppearanceDictionary::findBakedByImageName(std::strin

LLWearableType::EType LLAvatarAppearanceDictionary::getTEWearableType(ETextureIndex index ) const
{
return getTexture(index)->mWearableType;
auto* tex = getTexture(index);
return tex ? tex->mWearableType : LLWearableType::WT_INVALID;
}

// static
Expand Down
4 changes: 2 additions & 2 deletions indra/llappearance/llwearable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ void LLWearable::setVisualParamWeight(S32 param_index, F32 value)
}
else
{
LL_ERRS() << "LLWearable::setVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << LL_ENDL;
LL_WARNS() << "LLWearable::setVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << LL_ENDL;
}
}

Expand All @@ -665,7 +665,7 @@ F32 LLWearable::getVisualParamWeight(S32 param_index) const
}
else
{
LL_WARNS() << "LLWerable::getVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << LL_ENDL;
LL_WARNS() << "LLWearable::getVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << LL_ENDL;
}
return (F32)-1.0;
}
Expand Down
6 changes: 5 additions & 1 deletion indra/llcommon/fsyspath.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,11 @@ class fsyspath: public std::filesystem::path
}

// shadow base-class string() method with UTF-8 aware method
std::string string() const { return super::u8string(); }
std::string string() const
{
auto u8 = super::u8string();
return std::string(u8.begin(), u8.end());
}
// On Posix systems, where value_type is already char, this operator
// std::string() method shadows the base class operator string_type()
// method. But on Windows, where value_type is wchar_t, the base class
Expand Down
8 changes: 4 additions & 4 deletions indra/llcommon/llerror.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1604,19 +1604,19 @@ namespace LLError
std::string LLUserWarningMsg::sLocalizedOutOfMemoryWarning;
LLUserWarningMsg::Handler LLUserWarningMsg::sHandler;

void LLUserWarningMsg::show(const std::string& message)
void LLUserWarningMsg::show(const std::string& message, S32 error_code)
{
if (sHandler)
{
sHandler(std::string(), message);
sHandler(std::string(), message, error_code);
}
}

void LLUserWarningMsg::showOutOfMemory()
{
if (sHandler && !sLocalizedOutOfMemoryTitle.empty())
{
sHandler(sLocalizedOutOfMemoryTitle, sLocalizedOutOfMemoryWarning);
sHandler(sLocalizedOutOfMemoryTitle, sLocalizedOutOfMemoryWarning, ERROR_BAD_ALLOC);
}
}

Expand All @@ -1627,7 +1627,7 @@ namespace LLError
"Second Life viewer couldn't access some of the files it needs and will be closed."
"\n\nPlease reinstall viewer from https://secondlife.com/support/downloads/ and "
"contact https://support.secondlife.com if issue persists after reinstall.";
sHandler("Missing Files", error_string);
sHandler("Missing Files", error_string, ERROR_MISSING_FILES);
}

void LLUserWarningMsg::setHandler(const LLUserWarningMsg::Handler &handler)
Expand Down
13 changes: 11 additions & 2 deletions indra/llcommon/llerror.h
Original file line number Diff line number Diff line change
Expand Up @@ -308,15 +308,24 @@ namespace LLError
class LLUserWarningMsg
{
public:
typedef std::function<void(const std::string&, const std::string&)> Handler;
// error codes, tranlates to last_exec states like LAST_EXEC_OTHER_CRASH
typedef enum
{
ERROR_OTHER = 0,
ERROR_BAD_ALLOC = 1,
ERROR_MISSING_FILES = 2,
} eLastExecEvent;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to add a comment something like: "These are used to select LAST_EXEC_OTHER_CRASH, LAST_EXEC_BAD_ALLOC and LAST_EXEC_MISSING_FILES, respectively, which aren't visible from here."

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, will keep it in mind if I get to continue.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I probably should have done somthing like ERROR_BAD_ALLOC = 6 instead of using switch.


// tittle, message and error code to include in error marker file
typedef std::function<void(const std::string&, const std::string&, S32 error_code)> Handler;
static void setHandler(const Handler&);
static void setOutOfMemoryStrings(const std::string& title, const std::string& message);

// When viewer encounters bad alloc or can't access files try warning user about reasons
static void showOutOfMemory();
static void showMissingFiles();
// Genering error
static void show(const std::string&);
static void show(const std::string&, S32 error_code = -1);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If ERROR_OTHER is the "something else went wrong" code, wouldn't we want ERROR_OTHER to be the default value for show(error_code)?

Copy link
Contributor

@akleshchev akleshchev Jan 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At the moment -1 means 'don't create a marker' in case you only need a message. The idea was that LL_ERRS will be creating llerror marker or more likely writing LAST_EXEC_LLERROR_CRASH flag into the marker (but time will tell how it turns out).

I intended to fix llerror marker files separately from new exit states, before the 'review priorities' thing happened.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May be I should have created a separate createMarkerFile in LLError instead of reusing show().


private:
// needs to be preallocated before viewer runs out of memory
Expand Down
4 changes: 2 additions & 2 deletions indra/llcommon/llqueuedthread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ size_t LLQueuedThread::updateQueue(F32 max_time_ms)
// schedule a call to threadedUpdate for every call to updateQueue
if (!isQuitting())
{
mRequestQueue.post([=]()
mRequestQueue.post([=, this]()
{
LL_PROFILE_ZONE_NAMED_CATEGORY_THREAD("qt - update");
mIdleThread = false;
Expand Down Expand Up @@ -474,7 +474,7 @@ void LLQueuedThread::processRequest(LLQueuedThread::QueuedRequest* req)
#else
using namespace std::chrono_literals;
auto retry_time = LL::WorkQueue::TimePoint::clock::now() + 16ms;
mRequestQueue.post([=]
mRequestQueue.post([=, this]
{
LL_PROFILE_ZONE_NAMED("processRequest - retry");
if (LL::WorkQueue::TimePoint::clock::now() < retry_time)
Expand Down
2 changes: 1 addition & 1 deletion indra/llinventory/llinventory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -918,7 +918,7 @@ void LLInventoryItem::asLLSD( LLSD& sd ) const
}
//sd[INV_FLAGS_LABEL] = (S32)mFlags;
sd[INV_FLAGS_LABEL] = ll_sd_from_U32(mFlags);
sd[INV_SALE_INFO_LABEL] = mSaleInfo;
sd[INV_SALE_INFO_LABEL] = mSaleInfo.asLLSD();
sd[INV_NAME_LABEL] = mName;
sd[INV_DESC_LABEL] = mDescription;
sd[INV_CREATION_DATE_LABEL] = (S32) mCreationDate;
Expand Down
10 changes: 8 additions & 2 deletions indra/llinventory/llsaleinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,14 @@ bool LLSaleInfo::exportLegacyStream(std::ostream& output_stream) const

LLSD LLSaleInfo::asLLSD() const
{
LLSD sd = LLSD();
sd["sale_type"] = lookup(mSaleType);
LLSD sd;
const char* type = lookup(mSaleType);
if (!type)
{
LL_WARNS_ONCE() << "Unknown sale type: " << mSaleType << LL_ENDL;
type = lookup(LLSaleInfo::FS_NOT);
}
sd["sale_type"] = type;
sd["sale_price"] = mSalePrice;
return sd;
}
Expand Down
25 changes: 13 additions & 12 deletions indra/llinventory/llsettingssky.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,8 @@ const std::string LLSettingsSky::SETTING_REFLECTION_PROBE_AMBIANCE("reflection_p

const LLUUID LLSettingsSky::DEFAULT_ASSET_ID("651510b8-5f4d-8991-1592-e7eeab2a5a06");

F32 LLSettingsSky::sAutoAdjustProbeAmbiance = 1.f;
const F32 LLSettingsSky::DEFAULT_AUTO_ADJUST_PROBE_AMBIANCE = 1.f;
F32 LLSettingsSky::sAutoAdjustProbeAmbiance = DEFAULT_AUTO_ADJUST_PROBE_AMBIANCE;

static const LLUUID DEFAULT_SUN_ID("32bfbcea-24b1-fb9d-1ef9-48a28a63730f"); // dataserver
static const LLUUID DEFAULT_MOON_ID("d07f6eed-b96a-47cd-b51d-400ad4a1c428"); // dataserver
Expand Down Expand Up @@ -2032,43 +2033,43 @@ F32 LLSettingsSky::getGamma() const
return mGamma;
}

F32 LLSettingsSky::getHDRMin() const
F32 LLSettingsSky::getHDRMin(bool auto_adjust) const
{
if (mCanAutoAdjust)
if (mCanAutoAdjust && !auto_adjust)
return 0.f;

return mHDRMin;
}

F32 LLSettingsSky::getHDRMax() const
F32 LLSettingsSky::getHDRMax(bool auto_adjust) const
{
if (mCanAutoAdjust)
if (mCanAutoAdjust && !auto_adjust)
return 0.f;

return mHDRMax;
}

F32 LLSettingsSky::getHDROffset() const
F32 LLSettingsSky::getHDROffset(bool auto_adjust) const
{
if (mCanAutoAdjust)
if (mCanAutoAdjust && !auto_adjust)
return 1.0f;

return mHDROffset;
}

F32 LLSettingsSky::getTonemapMix() const
F32 LLSettingsSky::getTonemapMix(bool auto_adjust) const
{
if (mCanAutoAdjust)
if (mCanAutoAdjust && !auto_adjust)
{
// legacy settings do not support tonemaping
return 0.0f;
}

return mTonemapMix;
}

void LLSettingsSky::setTonemapMix(F32 mix)
{
if (mCanAutoAdjust)
return;

mTonemapMix = mix;
}

Expand Down
9 changes: 5 additions & 4 deletions indra/llinventory/llsettingssky.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ class LLSettingsSky: public LLSettingsBase

static const LLUUID DEFAULT_ASSET_ID;

static const F32 DEFAULT_AUTO_ADJUST_PROBE_AMBIANCE;
static F32 sAutoAdjustProbeAmbiance;

typedef PTR_NAMESPACE::shared_ptr<LLSettingsSky> ptr_t;
Expand Down Expand Up @@ -209,10 +210,10 @@ class LLSettingsSky: public LLSettingsBase

F32 getGamma() const;

F32 getHDRMin() const;
F32 getHDRMax() const;
F32 getHDROffset() const;
F32 getTonemapMix() const;
F32 getHDRMin(bool auto_adjust = false) const;
F32 getHDRMax(bool auto_adjust = false) const;
F32 getHDROffset(bool auto_adjust = false) const;
F32 getTonemapMix(bool auto_adjust = false) const;
void setTonemapMix(F32 mix);

void setGamma(F32 val);
Expand Down
13 changes: 13 additions & 0 deletions indra/llmath/llvector4a.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ class LLRotation;
#include <assert.h>
#include "llpreprocessor.h"
#include "llmemory.h"
#include "glm/vec3.hpp"
#include "glm/vec4.hpp"
#include "glm/gtc/type_ptr.hpp"

///////////////////////////////////
// FIRST TIME USERS PLEASE READ
Expand Down Expand Up @@ -364,6 +367,16 @@ class alignas(16) LLVector4a

inline operator LLQuad() const;

explicit inline operator glm::vec3() const
{
return glm::make_vec3(getF32ptr());
};

explicit inline operator glm::vec4() const
{
return glm::make_vec4(getF32ptr());
};

private:
LLQuad mQ{};
};
Expand Down
Loading
Loading