Merge branch 'master' of github.com:singularity-viewer/SingularityViewer
Conflicts: indra/newview/llfloaterperms.cpp
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@@ -29,3 +29,9 @@ qtcreator-build/
|
||||
/indra/newview/res/viewerRes.rc
|
||||
/indra/newview/res/viewerRes_bc.rc
|
||||
/indra/newview/English.lproj/InfoPlist.strings
|
||||
/indra/newview/linux_tools/handle_secondlifeprotocol.sh
|
||||
/indra/newview/linux_tools/install.sh
|
||||
/indra/newview/linux_tools/refresh_desktop_app_entry.sh
|
||||
/indra/newview/linux_tools/wrapper.sh
|
||||
|
||||
|
||||
|
||||
29
LICENSES/LEGAL-intel_matrixlib.txt
Normal file
29
LICENSES/LEGAL-intel_matrixlib.txt
Normal file
@@ -0,0 +1,29 @@
|
||||
INTEL LICENSE AGREEMENT
|
||||
|
||||
IMPORTANT - READ BEFORE COPYING OR USING.
|
||||
Do not use or load this library and any associated materials (collectively,
|
||||
the "Software") until you have read the following terms and conditions. By
|
||||
loading or using the Software, you agree to the terms of this Agreement. If
|
||||
you do not wish to so agree, do not use the Software.
|
||||
|
||||
LICENSE: Subject to the restrictions below, Intel Corporation ("Intel")
|
||||
grants to you the permission to use, copy, distribute and prepare derivative
|
||||
works of this Software for any purpose and without fee, provided, that
|
||||
Intel's copyright notice appear in all copies of the Software files.
|
||||
The distribution of derivative works of the Software is also subject to the
|
||||
following limitations: you (i) are solely responsible to your customers for
|
||||
any liability which may arise from the distribution, (ii) do not make any
|
||||
statement that your product is "certified", or that its performance is
|
||||
guaranteed, by Intel, and (iii) do not use Intel's name or trademarks to
|
||||
market your product without written permission.
|
||||
|
||||
EXCLUSION OF ALL WARRANTIES. The Software is provided "AS IS" without any
|
||||
express or implies warranty of any kind including warranties of
|
||||
merchantability, noninfringement, or fitness for a particular purpose.
|
||||
Intel does not warrant or assume responsibility for the accuracy or
|
||||
completeness of any information contained within the Software.
|
||||
As this Software is given free of charge, in no event shall Intel be liable
|
||||
for any damages whatsoever arising out of the use of or inability to use the
|
||||
Software, even if Intel has been adviced of the possibility of such damages.
|
||||
Intel does not assume any responsibility for any errors which may appear in
|
||||
this Software nor any responsibility to update it.
|
||||
@@ -293,7 +293,36 @@ void AIEngine::add(AIStateMachine* state_machine)
|
||||
}
|
||||
}
|
||||
|
||||
extern void print_statemachine_diagnostics(U64 total_clocks, U64 max_delta, AIEngine::queued_type::const_reference slowest_state_machine);
|
||||
#if STATE_MACHINE_PROFILING
|
||||
// Called from AIStateMachine::mainloop
|
||||
void print_statemachine_diagnostics(U64 total_clocks, AIStateMachine::StateTimerBase::TimeData& slowest_timer, AIEngine::queued_type::const_reference slowest_element)
|
||||
{
|
||||
AIStateMachine const& slowest_state_machine = slowest_element.statemachine();
|
||||
F64 const tfactor = 1000 / calc_clock_frequency();
|
||||
std::ostringstream msg;
|
||||
|
||||
U64 max_delta = slowest_timer.GetDuration();
|
||||
|
||||
if (total_clocks > max_delta)
|
||||
{
|
||||
msg << "AIStateMachine::mainloop did run for " << (total_clocks * tfactor) << " ms. The slowest ";
|
||||
}
|
||||
else
|
||||
{
|
||||
msg << "AIStateMachine::mainloop: A ";
|
||||
}
|
||||
msg << "state machine " << "(" << slowest_state_machine.getName() << ") " << "ran for " << (max_delta * tfactor) << " ms";
|
||||
if (slowest_state_machine.getRuntime() > max_delta)
|
||||
{
|
||||
msg << " (" << (slowest_state_machine.getRuntime() * tfactor) << " ms in total now)";
|
||||
}
|
||||
msg << ".\n";
|
||||
|
||||
AIStateMachine::StateTimerBase::DumpTimers(msg);
|
||||
|
||||
llwarns << msg.str() << llendl;
|
||||
}
|
||||
#endif
|
||||
|
||||
// MAIN-THREAD
|
||||
void AIEngine::mainloop(void)
|
||||
@@ -305,28 +334,33 @@ void AIEngine::mainloop(void)
|
||||
queued_element = engine_state_w->list.begin();
|
||||
}
|
||||
U64 total_clocks = 0;
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
U64 max_delta = 0;
|
||||
#if STATE_MACHINE_PROFILING
|
||||
queued_type::value_type slowest_element(NULL);
|
||||
AIStateMachine::StateTimerRoot::TimeData slowest_timer;
|
||||
#endif
|
||||
while (queued_element != end)
|
||||
{
|
||||
AIStateMachine& state_machine(queued_element->statemachine());
|
||||
U64 start = get_clock_count();
|
||||
if (!state_machine.sleep(start))
|
||||
AIStateMachine::StateTimerBase::TimeData time_data;
|
||||
if (!state_machine.sleep(get_clock_count()))
|
||||
{
|
||||
state_machine.multiplex(AIStateMachine::normal_run);
|
||||
AIStateMachine::StateTimerRoot timer(state_machine.getName());
|
||||
state_machine.multiplex(AIStateMachine::normal_run);
|
||||
time_data = timer.GetTimerData();
|
||||
}
|
||||
U64 delta = get_clock_count() - start;
|
||||
state_machine.add(delta);
|
||||
total_clocks += delta;
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
if (delta > max_delta)
|
||||
if (U64 delta = time_data.GetDuration())
|
||||
{
|
||||
max_delta = delta;
|
||||
slowest_element = *queued_element;
|
||||
}
|
||||
state_machine.add(delta);
|
||||
total_clocks += delta;
|
||||
#if STATE_MACHINE_PROFILING
|
||||
if (delta > slowest_timer.GetDuration())
|
||||
{
|
||||
slowest_element = *queued_element;
|
||||
slowest_timer = time_data;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool active = state_machine.active(this); // This locks mState shortly, so it must be called before locking mEngineState because add() locks mEngineState while holding mState.
|
||||
engine_state_type_wat engine_state_w(mEngineState);
|
||||
if (!active)
|
||||
@@ -340,8 +374,8 @@ void AIEngine::mainloop(void)
|
||||
}
|
||||
if (total_clocks >= sMaxCount)
|
||||
{
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
print_statemachine_diagnostics(total_clocks, max_delta, slowest_element);
|
||||
#if STATE_MACHINE_PROFILING
|
||||
print_statemachine_diagnostics(total_clocks, slowest_timer, slowest_element);
|
||||
#endif
|
||||
Dout(dc::statemachine, "Sorting " << engine_state_w->list.size() << " state machines.");
|
||||
engine_state_w->list.sort(QueueElementComp());
|
||||
@@ -752,6 +786,22 @@ void AIStateMachine::multiplex(event_type event)
|
||||
}
|
||||
}
|
||||
|
||||
#if STATE_MACHINE_PROFILING
|
||||
std::vector<AIStateMachine::StateTimerBase*> AIStateMachine::StateTimerBase::mTimerStack;
|
||||
AIStateMachine::StateTimerBase::TimeData AIStateMachine::StateTimerBase::TimeData::sRoot("");
|
||||
void AIStateMachine::StateTimer::TimeData::DumpTimer(std::ostringstream& msg, std::string prefix)
|
||||
{
|
||||
F64 const tfactor = 1000 / calc_clock_frequency();
|
||||
msg << prefix << mName << " " << (mEnd - mStart)*tfactor << "ms" << std::endl;
|
||||
prefix.push_back(' ');
|
||||
std::vector<TimeData>::iterator it;
|
||||
for (it = mChildren.begin(); it != mChildren.end(); ++it)
|
||||
{
|
||||
it->DumpTimer(msg, prefix);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
AIStateMachine::state_type AIStateMachine::begin_loop(base_state_type base_state)
|
||||
{
|
||||
DoutEntering(dc::statemachine(mSMDebug), "AIStateMachine::begin_loop(" << state_str(base_state) << ") [" << (void*)this << "]");
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
#include "aithreadsafe.h"
|
||||
#include <llpointer.h>
|
||||
#include "lltimer.h"
|
||||
#include <list>
|
||||
#include <boost/signals2.hpp>
|
||||
|
||||
@@ -98,11 +99,140 @@ class AIEngine
|
||||
extern AIEngine gMainThreadEngine;
|
||||
extern AIEngine gStateMachineThreadEngine;
|
||||
|
||||
#ifndef STATE_MACHINE_PROFILING
|
||||
#define STATE_MACHINE_PROFILING (LL_RELEASE_FOR_DOWNLOAD)
|
||||
#endif
|
||||
|
||||
class AIStateMachine : public LLThreadSafeRefCount
|
||||
{
|
||||
public:
|
||||
typedef U32 state_type; //!< The type of run_state
|
||||
|
||||
// A simple timer class that will calculate time delta between ctor and GetTimerData call.
|
||||
// Time data is stored as a nested TimeData object.
|
||||
// If STATE_MACHINE_PROFILING is defined then a stack of all StateTimers from root is maintained for debug output.
|
||||
class StateTimerBase
|
||||
{
|
||||
public:
|
||||
class TimeData
|
||||
{
|
||||
friend class StateTimerBase;
|
||||
public:
|
||||
TimeData() : mStart(-1), mEnd(-1) {}
|
||||
U64 GetDuration() { return mEnd - mStart; }
|
||||
private:
|
||||
U64 mStart, mEnd;
|
||||
|
||||
#if !STATE_MACHINE_PROFILING
|
||||
TimeData(const std::string& name) : mStart(get_clock_count()), mEnd(get_clock_count()) {}
|
||||
#else
|
||||
TimeData(const std::string& name) : mName(name), mStart(get_clock_count()), mEnd(get_clock_count()) {}
|
||||
void DumpTimer(std::ostringstream& msg, std::string prefix);
|
||||
std::vector<TimeData> mChildren;
|
||||
std::string mName;
|
||||
static TimeData sRoot;
|
||||
#endif
|
||||
};
|
||||
protected:
|
||||
#if !STATE_MACHINE_PROFILING
|
||||
StateTimerBase(const std::string& name) : mData(name) {}
|
||||
~StateTimerBase() {}
|
||||
TimeData mData;
|
||||
// Return a copy of the underlying timer data.
|
||||
// This allows the data live beyond the scope of the state timer.
|
||||
public:
|
||||
const TimeData GetTimerData()
|
||||
{
|
||||
mData.mEnd = get_clock_count(); //set mEnd to current time, since GetTimerData() will always be called before the dtor, obv.
|
||||
return mData;
|
||||
}
|
||||
#else
|
||||
// Ctors/dtors are hidden. Only StateTimerRoot and StateTimer are permitted to access them.
|
||||
StateTimerBase() : mData(NULL) {}
|
||||
~StateTimerBase()
|
||||
{
|
||||
// If mData is null then the timer was not registered due to being in the wrong thread or the root timer wasn't in the expected state.
|
||||
if (!mData)
|
||||
return;
|
||||
mData->mEnd = get_clock_count();
|
||||
mTimerStack.pop_back();
|
||||
}
|
||||
|
||||
// Also hide internals from everything except StateTimerRoot and StateTimer
|
||||
bool AddAsRoot(const std::string& name)
|
||||
{
|
||||
|
||||
if (!is_main_thread())
|
||||
return true; //Ignoring this timer, but pretending it was added.
|
||||
if (!mTimerStack.empty())
|
||||
return false;
|
||||
TimeData::sRoot = TimeData(name);
|
||||
mData = &TimeData::sRoot;
|
||||
mData->mChildren.clear();
|
||||
mTimerStack.push_back(this);
|
||||
return true;
|
||||
}
|
||||
bool AddAsChild(const std::string& name)
|
||||
{
|
||||
if (!is_main_thread())
|
||||
return true; //Ignoring this timer, but pretending it was added.
|
||||
if (mTimerStack.empty())
|
||||
return false;
|
||||
mTimerStack.back()->mData->mChildren.push_back(TimeData(name));
|
||||
mData = &mTimerStack.back()->mData->mChildren.back();
|
||||
mTimerStack.push_back(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
TimeData* mData;
|
||||
static std::vector<StateTimerBase*> mTimerStack;
|
||||
|
||||
public:
|
||||
// Debug spew
|
||||
static void DumpTimers(std::ostringstream& msg)
|
||||
{
|
||||
TimeData::sRoot.DumpTimer(msg, "");
|
||||
}
|
||||
|
||||
// Return a copy of the underlying timer data.
|
||||
// This allows the data live beyond the scope of the state timer.
|
||||
const TimeData GetTimerData() const
|
||||
{
|
||||
if (mData)
|
||||
{
|
||||
TimeData ret = *mData;
|
||||
ret.mEnd = get_clock_count(); //set mEnd to current time, since GetTimerData() will always be called before the dtor, obv.
|
||||
return ret;
|
||||
}
|
||||
return TimeData();
|
||||
}
|
||||
#endif
|
||||
};
|
||||
public:
|
||||
#if !STATE_MACHINE_PROFILING
|
||||
typedef StateTimerBase StateTimerRoot;
|
||||
typedef StateTimerBase StateTimer;
|
||||
#else
|
||||
class StateTimerRoot : public StateTimerBase
|
||||
{ //A StateTimerRoot can become a child if a root already exists.
|
||||
public:
|
||||
StateTimerRoot(const std::string& name)
|
||||
{
|
||||
if(!AddAsRoot(name))
|
||||
AddAsChild(name);
|
||||
}
|
||||
};
|
||||
class StateTimer : public StateTimerBase
|
||||
{ //A StateTimer can never become a root
|
||||
public:
|
||||
StateTimer(const std::string& name)
|
||||
{
|
||||
AddAsChild(name);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
protected:
|
||||
// The type of event that causes multiplex() to be called.
|
||||
enum event_type {
|
||||
@@ -302,6 +432,9 @@ class AIStateMachine : public LLThreadSafeRefCount
|
||||
void add(U64 count) { mRuntime += count; }
|
||||
U64 getRuntime(void) const { return mRuntime; }
|
||||
|
||||
// For diagnostics. Every derived class must override this.
|
||||
virtual const char* getName() const = 0;
|
||||
|
||||
protected:
|
||||
virtual void initialize_impl(void) = 0;
|
||||
virtual void multiplex_impl(state_type run_state) = 0;
|
||||
|
||||
@@ -232,6 +232,13 @@ class AIStateMachineThread : public AIStateMachineThreadBase {
|
||||
// Accessor.
|
||||
THREAD_IMPL& thread_impl(void) { return mThreadImpl; }
|
||||
|
||||
/*virtual*/ const char* getName() const
|
||||
{
|
||||
#define STRIZE(arg) #arg
|
||||
return "AIStateMachineThread<"STRIZE(THREAD_IMPL)">";
|
||||
#undef STRIZE
|
||||
}
|
||||
|
||||
protected:
|
||||
/*virtual*/ AIThreadImpl& impl(void) { return mThreadImpl; }
|
||||
};
|
||||
|
||||
@@ -98,6 +98,8 @@ class AITimer : public AIStateMachine {
|
||||
*/
|
||||
F64 getInterval(void) const { return mInterval; }
|
||||
|
||||
/*virtual*/ const char* getName() const { return "AITimer"; }
|
||||
|
||||
protected:
|
||||
// Call finish() (or abort()), not delete.
|
||||
/*virtual*/ ~AITimer() { DoutEntering(dc::statemachine(mSMDebug), "~AITimer() [" << (void*)this << "]"); mFrameTimer.cancel(); }
|
||||
|
||||
@@ -52,6 +52,29 @@ if (DARWIN)
|
||||
)
|
||||
endif (DARWIN)
|
||||
|
||||
if (LINUX)
|
||||
configure_file(
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh.in
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh
|
||||
@ONLY
|
||||
)
|
||||
configure_file(
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/handle_secondlifeprotocol.sh.in
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/handle_secondlifeprotocol.sh
|
||||
@ONLY
|
||||
)
|
||||
configure_file(
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/install.sh.in
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/install.sh
|
||||
@ONLY
|
||||
)
|
||||
configure_file(
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/refresh_desktop_app_entry.sh.in
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/refresh_desktop_app_entry.sh
|
||||
@ONLY
|
||||
)
|
||||
endif (LINUX)
|
||||
|
||||
# Compose the version.
|
||||
set(viewer_VERSION "${vMAJOR}.${vMINOR}.${vPATCH}.${vBUILD}")
|
||||
if (viewer_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$")
|
||||
|
||||
@@ -105,8 +105,9 @@ void LLAvatarJoint::setValid( BOOL valid, BOOL recursive )
|
||||
for (child_list_t::iterator iter = mChildren.begin();
|
||||
iter != mChildren.end(); ++iter)
|
||||
{
|
||||
LLAvatarJoint* joint = (LLAvatarJoint*)(*iter);
|
||||
joint->setValid(valid, TRUE);
|
||||
LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter);
|
||||
if (joint)
|
||||
joint->setValid(valid, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,8 +139,9 @@ void LLAvatarJoint::setVisible(BOOL visible, BOOL recursive)
|
||||
for (child_list_t::iterator iter = mChildren.begin();
|
||||
iter != mChildren.end(); ++iter)
|
||||
{
|
||||
LLAvatarJoint* joint = (LLAvatarJoint*)(*iter);
|
||||
joint->setVisible(visible, recursive);
|
||||
LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter);
|
||||
if(joint)
|
||||
joint->setVisible(visible, recursive);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -260,7 +262,7 @@ void LLAvatarJointCollisionVolume::renderCollision()
|
||||
updateWorldMatrix();
|
||||
|
||||
gGL.pushMatrix();
|
||||
gGL.multMatrix( &mXform.getWorldMatrix().mMatrix[0][0] );
|
||||
gGL.multMatrix( mXform.getWorldMatrix() );
|
||||
|
||||
gGL.diffuseColor3f( 0.f, 0.f, 1.f );
|
||||
|
||||
|
||||
@@ -366,8 +366,9 @@ void LLAvatarJointMesh::setupJoint(LLAvatarJoint* current_joint)
|
||||
for (LLJoint::child_list_t::iterator iter = current_joint->mChildren.begin();
|
||||
iter != current_joint->mChildren.end(); ++iter)
|
||||
{
|
||||
LLAvatarJoint* child_joint = (LLAvatarJoint*)(*iter);
|
||||
setupJoint(child_joint);
|
||||
LLAvatarJoint* child_joint = dynamic_cast<LLAvatarJoint*>(*iter);
|
||||
if(child_joint)
|
||||
setupJoint(child_joint);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -231,9 +231,9 @@ BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices )
|
||||
mBaseCoords = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
|
||||
mBaseNormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
|
||||
mBaseBinormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
|
||||
mTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2));
|
||||
mDetailTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2));
|
||||
mWeights = (F32*) ll_aligned_malloc_16(numVertices*sizeof(F32));
|
||||
mTexCoords = (LLVector2*) ll_aligned_malloc_16((numVertices+numVertices%2)*sizeof(LLVector2));
|
||||
mDetailTexCoords = (LLVector2*) ll_aligned_malloc_16((numVertices+numVertices%2)*sizeof(LLVector2));
|
||||
mWeights = (F32*) ll_aligned_malloc_16(((numVertices)*sizeof(F32)+0xF) & ~0xF);
|
||||
for (i = 0; i < numVertices; i++)
|
||||
{
|
||||
mBaseCoords[i].clear();
|
||||
|
||||
@@ -146,10 +146,10 @@ public:
|
||||
class LLJointRenderData
|
||||
{
|
||||
public:
|
||||
LLJointRenderData(const LLMatrix4* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint) {}
|
||||
LLJointRenderData(const LLMatrix4a* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint) {}
|
||||
~LLJointRenderData(){}
|
||||
|
||||
const LLMatrix4* mWorldMatrix;
|
||||
const LLMatrix4a* mWorldMatrix;
|
||||
LLSkinJoint* mSkinJoint;
|
||||
};
|
||||
|
||||
|
||||
@@ -154,13 +154,13 @@ BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info)
|
||||
for (LLJoint::child_list_t::iterator iter = joint->mChildren.begin();
|
||||
iter != joint->mChildren.end(); ++iter)
|
||||
{
|
||||
LLAvatarJoint* child_joint = (LLAvatarJoint*)(*iter);
|
||||
if (child_joint->inheritScale())
|
||||
{
|
||||
LLVector3 childDeformation = LLVector3(child_joint->getScale());
|
||||
childDeformation.scaleVec(bone_info->mScaleDeformation);
|
||||
mJointScales[child_joint] = childDeformation;
|
||||
}
|
||||
LLAvatarJoint* child_joint = dynamic_cast<LLAvatarJoint*>(*iter);
|
||||
if (child_joint && child_joint->inheritScale())
|
||||
{
|
||||
LLVector3 childDeformation = LLVector3(child_joint->getScale());
|
||||
childDeformation.scaleVec(bone_info->mScaleDeformation);
|
||||
mJointScales[child_joint] = childDeformation;
|
||||
}
|
||||
}
|
||||
|
||||
if (bone_info->mHasPositionDeformation)
|
||||
|
||||
@@ -68,7 +68,16 @@ class LLPolySkeletalDistortionInfo : public LLViewerVisualParamInfo
|
||||
{
|
||||
friend class LLPolySkeletalDistortion;
|
||||
public:
|
||||
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
LLPolySkeletalDistortionInfo();
|
||||
/*virtual*/ ~LLPolySkeletalDistortionInfo() {};
|
||||
|
||||
@@ -77,12 +86,12 @@ public:
|
||||
protected:
|
||||
typedef std::vector<LLPolySkeletalBoneInfo> bone_info_list_t;
|
||||
bone_info_list_t mBoneInfoList;
|
||||
};
|
||||
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLPolySkeletalDeformation
|
||||
// A set of joint scale data for deforming the avatar mesh
|
||||
//-----------------------------------------------------------------------------
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLPolySkeletalDistortion : public LLViewerVisualParam
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -72,21 +72,11 @@ LLCharacter::~LLCharacter()
|
||||
delete param;
|
||||
}
|
||||
|
||||
U32 i ;
|
||||
U32 size = sInstances.size() ;
|
||||
for(i = 0 ; i < size ; i++)
|
||||
{
|
||||
if(sInstances[i] == this)
|
||||
{
|
||||
break ;
|
||||
}
|
||||
}
|
||||
bool erased = vector_replace_with_last(sInstances,this);
|
||||
|
||||
llassert_always(i < size) ;
|
||||
llassert_always(erased) ;
|
||||
|
||||
llassert_always(sAllowInstancesChange) ;
|
||||
sInstances[i] = sInstances[size - 1] ;
|
||||
sInstances.pop_back() ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -312,19 +312,15 @@ void LLJoint::setWorldPosition( const LLVector3& pos )
|
||||
return;
|
||||
}
|
||||
|
||||
LLMatrix4 temp_matrix = getWorldMatrix();
|
||||
temp_matrix.mMatrix[VW][VX] = pos.mV[VX];
|
||||
temp_matrix.mMatrix[VW][VY] = pos.mV[VY];
|
||||
temp_matrix.mMatrix[VW][VZ] = pos.mV[VZ];
|
||||
LLMatrix4a temp_matrix = getWorldMatrix();
|
||||
temp_matrix.setTranslate_affine(pos);
|
||||
|
||||
LLMatrix4 parentWorldMatrix = mParent->getWorldMatrix();
|
||||
LLMatrix4 invParentWorldMatrix = parentWorldMatrix.invert();
|
||||
LLMatrix4a invParentWorldMatrix = mParent->getWorldMatrix();
|
||||
invParentWorldMatrix.invert();
|
||||
|
||||
temp_matrix *= invParentWorldMatrix;
|
||||
invParentWorldMatrix.mul(temp_matrix);
|
||||
|
||||
LLVector3 localPos( temp_matrix.mMatrix[VW][VX],
|
||||
temp_matrix.mMatrix[VW][VY],
|
||||
temp_matrix.mMatrix[VW][VZ] );
|
||||
LLVector3 localPos( invParentWorldMatrix.getRow<LLMatrix4a::ROW_TRANS>().getF32ptr() );
|
||||
|
||||
setPosition( localPos );
|
||||
}
|
||||
@@ -383,19 +379,19 @@ void LLJoint::setWorldRotation( const LLQuaternion& rot )
|
||||
this->setRotation( rot );
|
||||
return;
|
||||
}
|
||||
|
||||
LLMatrix4a parentWorldMatrix = mParent->getWorldMatrix();
|
||||
LLQuaternion2 rota(rot);
|
||||
LLMatrix4a temp_mat(rota);
|
||||
|
||||
LLMatrix4 temp_mat(rot);
|
||||
LLMatrix4a invParentWorldMatrix = mParent->getWorldMatrix();
|
||||
invParentWorldMatrix.setTranslate_affine(LLVector3(0.f));
|
||||
|
||||
LLMatrix4 parentWorldMatrix = mParent->getWorldMatrix();
|
||||
parentWorldMatrix.mMatrix[VW][VX] = 0;
|
||||
parentWorldMatrix.mMatrix[VW][VY] = 0;
|
||||
parentWorldMatrix.mMatrix[VW][VZ] = 0;
|
||||
invParentWorldMatrix.invert();
|
||||
|
||||
LLMatrix4 invParentWorldMatrix = parentWorldMatrix.invert();
|
||||
invParentWorldMatrix.mul(temp_mat);
|
||||
|
||||
temp_mat *= invParentWorldMatrix;
|
||||
|
||||
setRotation(LLQuaternion(temp_mat));
|
||||
setRotation(LLQuaternion(LLMatrix4(invParentWorldMatrix.getF32ptr())));
|
||||
}
|
||||
|
||||
|
||||
@@ -425,7 +421,7 @@ void LLJoint::setScale( const LLVector3& scale )
|
||||
//--------------------------------------------------------------------
|
||||
// getWorldMatrix()
|
||||
//--------------------------------------------------------------------
|
||||
const LLMatrix4 &LLJoint::getWorldMatrix()
|
||||
const LLMatrix4a &LLJoint::getWorldMatrix()
|
||||
{
|
||||
updateWorldMatrixParent();
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ public:
|
||||
void setScale( const LLVector3& scale );
|
||||
|
||||
// get/set world matrix
|
||||
const LLMatrix4 &getWorldMatrix();
|
||||
const LLMatrix4a &getWorldMatrix();
|
||||
void setWorldMatrix( const LLMatrix4& mat );
|
||||
|
||||
void updateWorldMatrixChildren();
|
||||
|
||||
@@ -171,12 +171,14 @@ void LLJointSolverRP3::solve()
|
||||
//-------------------------------------------------------------------------
|
||||
// get the poleVector in world space
|
||||
//-------------------------------------------------------------------------
|
||||
LLMatrix4 worldJointAParentMat;
|
||||
LLVector3 poleVec = mPoleVector;
|
||||
if ( mJointA->getParent() )
|
||||
{
|
||||
worldJointAParentMat = mJointA->getParent()->getWorldMatrix();
|
||||
LLVector4a pole_veca;
|
||||
pole_veca.load3(mPoleVector.mV);
|
||||
mJointA->getParent()->getWorldMatrix().rotate(pole_veca,pole_veca);
|
||||
poleVec.set(pole_veca.getF32ptr());
|
||||
}
|
||||
LLVector3 poleVec = rotate_vector( mPoleVector, worldJointAParentMat );
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// compute the following:
|
||||
|
||||
@@ -286,40 +286,38 @@ BOOL LLKeyframeStandMotion::onUpdate(F32 time, U8* joint_mask)
|
||||
//-------------------------------------------------------------------------
|
||||
if ( mTrackAnkles )
|
||||
{
|
||||
LLVector4 dirLeft4 = mAnkleLeftJoint.getWorldMatrix().getFwdRow4();
|
||||
LLVector4 dirRight4 = mAnkleRightJoint.getWorldMatrix().getFwdRow4();
|
||||
LLVector3 dirLeft = vec4to3( dirLeft4 );
|
||||
LLVector3 dirRight = vec4to3( dirRight4 );
|
||||
const LLVector4a& dirLeft4 = mAnkleLeftJoint.getWorldMatrix().getRow<LLMatrix4a::ROW_FWD>();
|
||||
const LLVector4a& dirRight4 = mAnkleRightJoint.getWorldMatrix().getRow<LLMatrix4a::ROW_FWD>();
|
||||
|
||||
LLVector3 up;
|
||||
LLVector3 dir;
|
||||
LLVector3 left;
|
||||
LLVector4a up;
|
||||
LLVector4a dir;
|
||||
LLVector4a left;
|
||||
|
||||
up = mNormalLeft;
|
||||
up.normVec();
|
||||
up.load3(mNormalLeft.mV);
|
||||
up.normalize3fast();
|
||||
if (mFlipFeet)
|
||||
{
|
||||
up *= -1.0f;
|
||||
up.negate();
|
||||
}
|
||||
dir = dirLeft;
|
||||
dir.normVec();
|
||||
left = up % dir;
|
||||
left.normVec();
|
||||
dir = left % up;
|
||||
mRotationLeft = LLQuaternion( dir, left, up );
|
||||
dir = dirLeft4;
|
||||
dir.normalize3fast();
|
||||
left.setCross3(up,dir);
|
||||
left.normalize3fast();
|
||||
dir.setCross3(left,up);
|
||||
mRotationLeft = LLQuaternion( LLVector3(dir.getF32ptr()), LLVector3(left.getF32ptr()), LLVector3(up.getF32ptr()));
|
||||
|
||||
up = mNormalRight;
|
||||
up.normVec();
|
||||
up.load3(mNormalRight.mV);
|
||||
up.normalize3fast();
|
||||
if (mFlipFeet)
|
||||
{
|
||||
up *= -1.0f;
|
||||
up.negate();
|
||||
}
|
||||
dir = dirRight;
|
||||
dir.normVec();
|
||||
left = up % dir;
|
||||
left.normVec();
|
||||
dir = left % up;
|
||||
mRotationRight = LLQuaternion( dir, left, up );
|
||||
dir = dirRight4;
|
||||
dir.normalize3fast();
|
||||
left.setCross3(up,dir);
|
||||
left.normalize3fast();
|
||||
dir.setCross3(left,up);
|
||||
mRotationRight = LLQuaternion( LLVector3(dir.getF32ptr()), LLVector3(left.getF32ptr()), LLVector3(up.getF32ptr()));
|
||||
}
|
||||
mAnkleLeftJoint.setWorldRotation( mRotationLeft );
|
||||
mAnkleRightJoint.setWorldRotation( mRotationRight );
|
||||
|
||||
@@ -254,7 +254,6 @@ set(llcommon_HEADER_FILES
|
||||
metapropertyt.h
|
||||
reflective.h
|
||||
reflectivet.h
|
||||
roles_constants.h
|
||||
stdenums.h
|
||||
stdtypes.h
|
||||
string_table.h
|
||||
|
||||
@@ -239,14 +239,14 @@ inline typename T::mapped_type get_ptr_in_map(const T& inmap, typename T::key_ty
|
||||
//
|
||||
//Singu note: This has been generalized to support a broader range of sequence containers
|
||||
template <typename T>
|
||||
inline typename T::iterator vector_replace_with_last(T& invec, typename T::iterator& iter)
|
||||
inline typename T::iterator vector_replace_with_last(T& invec, typename T::iterator iter)
|
||||
{
|
||||
typename T::iterator last = invec.end(); --last;
|
||||
typename T::iterator last = invec.end();
|
||||
if (iter == invec.end())
|
||||
{
|
||||
return iter;
|
||||
}
|
||||
else if (iter == last)
|
||||
else if (iter == --last)
|
||||
{
|
||||
invec.pop_back();
|
||||
return invec.end();
|
||||
|
||||
@@ -118,16 +118,6 @@ enum EAddPosition
|
||||
ADD_BOTTOM
|
||||
};
|
||||
|
||||
enum LLGroupChange
|
||||
{
|
||||
GC_PROPERTIES,
|
||||
GC_MEMBER_DATA,
|
||||
GC_ROLE_DATA,
|
||||
GC_ROLE_MEMBER_DATA,
|
||||
GC_TITLES,
|
||||
GC_ALL
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// DEPRECATED - create new, more specific files for shared enums/constants
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
@@ -178,7 +178,7 @@ BOOL LLInventoryObject::importLegacyStream(std::istream& input_stream)
|
||||
while(input_stream.good())
|
||||
{
|
||||
input_stream.getline(buffer, MAX_STRING);
|
||||
sscanf(buffer, " %254s %254s", keyword, valuestr); /* Flawfinder: ignore */
|
||||
if (sscanf(buffer, " %254s %254s", keyword, valuestr) < 1) continue;
|
||||
if(0 == strcmp("{",keyword))
|
||||
{
|
||||
continue;
|
||||
@@ -610,7 +610,7 @@ BOOL LLInventoryItem::importFile(LLFILE* fp)
|
||||
buffer[0] = '\0';
|
||||
}
|
||||
|
||||
sscanf(buffer, " %254s %254s", keyword, valuestr); /* Flawfinder: ignore */
|
||||
if (sscanf(buffer, " %254s %254s", keyword, valuestr) < 1) continue;
|
||||
if(0 == strcmp("{",keyword))
|
||||
{
|
||||
continue;
|
||||
@@ -813,10 +813,10 @@ BOOL LLInventoryItem::importLegacyStream(std::istream& input_stream)
|
||||
while(success && input_stream.good())
|
||||
{
|
||||
input_stream.getline(buffer, MAX_STRING);
|
||||
sscanf( /* Flawfinder: ignore */
|
||||
if (sscanf(
|
||||
buffer,
|
||||
" %254s %254s",
|
||||
keyword, valuestr);
|
||||
keyword, valuestr) < 1) continue;
|
||||
if(0 == strcmp("{",keyword))
|
||||
{
|
||||
continue;
|
||||
@@ -1489,10 +1489,10 @@ BOOL LLInventoryCategory::importFile(LLFILE* fp)
|
||||
buffer[0] = '\0';
|
||||
}
|
||||
|
||||
sscanf( /* Flawfinder: ignore */
|
||||
if (sscanf(
|
||||
buffer,
|
||||
" %254s %254s",
|
||||
keyword, valuestr);
|
||||
keyword, valuestr) < 1) continue;
|
||||
if(0 == strcmp("{",keyword))
|
||||
{
|
||||
continue;
|
||||
@@ -1568,10 +1568,10 @@ BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream)
|
||||
while(input_stream.good())
|
||||
{
|
||||
input_stream.getline(buffer, MAX_STRING);
|
||||
sscanf( /* Flawfinder: ignore */
|
||||
if (sscanf(
|
||||
buffer,
|
||||
" %254s %254s",
|
||||
keyword, valuestr);
|
||||
keyword, valuestr) < 1) continue;
|
||||
if(0 == strcmp("{",keyword))
|
||||
{
|
||||
continue;
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file camera.h
|
||||
* @brief Legacy wrapper header.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file coordframe.h
|
||||
* @brief Legacy wrapper header.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,36 +2,28 @@
|
||||
* @file llbbox.cpp
|
||||
* @brief General purpose bounding box class (Not axis aligned)
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2010, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlife.com/developers/opensource/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlife.com/developers/opensource/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "linden_common.h"
|
||||
|
||||
// self include
|
||||
|
||||
@@ -2,36 +2,28 @@
|
||||
* @file llbbox.h
|
||||
* @brief General purpose bounding box class
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2010, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlife.com/developers/opensource/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlife.com/developers/opensource/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LL_BBOX_H
|
||||
#define LL_BBOX_H
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llbboxlocal.cpp
|
||||
* @brief General purpose bounding box class (Not axis aligned).
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llbboxlocal.h
|
||||
* @brief General purpose bounding box class.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llcamera.cpp
|
||||
* @brief Implementation of the LLCamera class.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -189,8 +183,30 @@ static const LLVector4a sFrustumScaler[] =
|
||||
LLVector4a( 1, 1, 1) // 8 entries
|
||||
};
|
||||
|
||||
S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius)
|
||||
bool LLCamera::isChanged()
|
||||
{
|
||||
bool changed = false;
|
||||
for (U32 i = 0; i < mPlaneCount; i++)
|
||||
{
|
||||
U8 mask = mPlaneMask[i];
|
||||
if (mask != 0xff && !changed)
|
||||
{
|
||||
changed = !mAgentPlanes[i].equal(mLastAgentPlanes[i]);
|
||||
}
|
||||
mLastAgentPlanes[i].set(mAgentPlanes[i]);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius, const LLPlane* planes)
|
||||
{
|
||||
if(!planes)
|
||||
{
|
||||
//use agent space
|
||||
planes = mAgentPlanes;
|
||||
}
|
||||
|
||||
U8 mask = 0;
|
||||
bool result = false;
|
||||
LLVector4a rscale, maxp, minp;
|
||||
@@ -201,7 +217,7 @@ S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius)
|
||||
mask = mPlaneMask[i];
|
||||
if (mask < PLANE_MASK_NUM)
|
||||
{
|
||||
const LLPlane& p(mAgentPlanes[i]);
|
||||
const LLPlane& p(planes[i]);
|
||||
p.getAt<3>(d);
|
||||
rscale.setMul(radius, sFrustumScaler[mask]);
|
||||
minp.setSub(center, rscale);
|
||||
@@ -222,9 +238,21 @@ S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius)
|
||||
return result?1:2;
|
||||
}
|
||||
|
||||
|
||||
S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius)
|
||||
//exactly same as the function AABBInFrustum(...)
|
||||
//except uses mRegionPlanes instead of mAgentPlanes.
|
||||
S32 LLCamera::AABBInRegionFrustum(const LLVector4a& center, const LLVector4a& radius)
|
||||
{
|
||||
return AABBInFrustum(center, radius, mRegionPlanes);
|
||||
}
|
||||
|
||||
S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes)
|
||||
{
|
||||
if(!planes)
|
||||
{
|
||||
//use agent space
|
||||
planes = mAgentPlanes;
|
||||
}
|
||||
|
||||
U8 mask = 0;
|
||||
bool result = false;
|
||||
LLVector4a rscale, maxp, minp;
|
||||
@@ -235,7 +263,7 @@ S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a&
|
||||
mask = mPlaneMask[i];
|
||||
if ((i != 5) && (mask < PLANE_MASK_NUM))
|
||||
{
|
||||
const LLPlane& p(mAgentPlanes[i]);
|
||||
const LLPlane& p(planes[i]);
|
||||
p.getAt<3>(d);
|
||||
rscale.setMul(radius, sFrustumScaler[mask]);
|
||||
minp.setSub(center, rscale);
|
||||
@@ -256,6 +284,13 @@ S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a&
|
||||
return result?1:2;
|
||||
}
|
||||
|
||||
//exactly same as the function AABBInFrustumNoFarClip(...)
|
||||
//except uses mRegionPlanes instead of mAgentPlanes.
|
||||
S32 LLCamera::AABBInRegionFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius)
|
||||
{
|
||||
return AABBInFrustumNoFarClip(center, radius, mRegionPlanes);
|
||||
}
|
||||
|
||||
int LLCamera::sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius)
|
||||
{
|
||||
LLVector3 dist = sphere_center-mFrustCenter;
|
||||
@@ -592,6 +627,47 @@ void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
|
||||
}
|
||||
}
|
||||
|
||||
//calculate regional planes from mAgentPlanes.
|
||||
//vector "shift" is the vector of the region origin in the agent space.
|
||||
void LLCamera::calcRegionFrustumPlanes(const LLVector3& shift, F32 far_clip_distance)
|
||||
{
|
||||
F32 far_w;
|
||||
{
|
||||
LLVector3 p = getOrigin();
|
||||
LLVector3 n(mAgentPlanes[5][0], mAgentPlanes[5][1], mAgentPlanes[5][2]);
|
||||
F32 dd = n * p;
|
||||
if(dd + mAgentPlanes[5][3] < 0) //signed distance
|
||||
{
|
||||
far_w = -far_clip_distance - dd;
|
||||
}
|
||||
else
|
||||
{
|
||||
far_w = far_clip_distance - dd;
|
||||
}
|
||||
far_w += n * shift;
|
||||
}
|
||||
|
||||
F32 d;
|
||||
LLVector3 n;
|
||||
for(S32 i = 0 ; i < 7; i++)
|
||||
{
|
||||
if (mPlaneMask[i] != 0xff)
|
||||
{
|
||||
n.setVec(mAgentPlanes[i][0], mAgentPlanes[i][1], mAgentPlanes[i][2]);
|
||||
|
||||
if(i != 5)
|
||||
{
|
||||
d = mAgentPlanes[i][3] + n * shift;
|
||||
}
|
||||
else
|
||||
{
|
||||
d = far_w;
|
||||
}
|
||||
mRegionPlanes[i].setVec(n, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLCamera::calculateFrustumPlanes(F32 left, F32 right, F32 top, F32 bottom)
|
||||
{
|
||||
LLVector3 a, b, c;
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llcamera.h
|
||||
* @brief Header file for the LLCamera class.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -55,7 +49,7 @@ const F32 MIN_FAR_PLANE = 0.2f;
|
||||
|
||||
// Min/Max FOV values for square views. Call getMin/MaxView to get extremes based on current aspect ratio.
|
||||
static const F32 MIN_FIELD_OF_VIEW = 5.0f * DEG_TO_RAD;
|
||||
static const F32 MAX_FIELD_OF_VIEW = 175.f * DEG_TO_RAD;
|
||||
static const F32 MAX_FIELD_OF_VIEW = 320.f * DEG_TO_RAD;
|
||||
|
||||
// An LLCamera is an LLCoorFrame with a view frustum.
|
||||
// This means that it has several methods for moving it around
|
||||
@@ -128,6 +122,8 @@ public:
|
||||
|
||||
private:
|
||||
LL_ALIGN_16(LLPlane mAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]); //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
|
||||
LL_ALIGN_16(LLPlane mRegionPlanes[AGENT_PLANE_USER_CLIP_NUM]); //frustum planes in a local region space, derived from mAgentPlanes
|
||||
LL_ALIGN_16(LLPlane mLastAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]);
|
||||
U8 mPlaneMask[PLANE_MASK_NUM]; // 8 for alignment
|
||||
|
||||
F32 mView; // angle between top and bottom frustum planes in radians.
|
||||
@@ -156,6 +152,7 @@ public:
|
||||
LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_pixels, F32 near_plane, F32 far_plane);
|
||||
virtual ~LLCamera();
|
||||
|
||||
bool isChanged(); //check if mAgentPlanes changed since last frame.
|
||||
|
||||
void setUserClipPlane(const LLPlane& plane);
|
||||
void disableUserClipPlane();
|
||||
@@ -197,6 +194,7 @@ public:
|
||||
// Return number of bytes copied.
|
||||
size_t readFrustumFromBuffer(const char *buffer);
|
||||
void calcAgentFrustumPlanes(LLVector3* frust);
|
||||
void calcRegionFrustumPlanes(const LLVector3& shift, F32 far_clip_distance); //calculate regional planes from mAgentPlanes.
|
||||
void ignoreAgentFrustumPlane(S32 idx);
|
||||
|
||||
// Returns 1 if partly in, 2 if fully in.
|
||||
@@ -205,8 +203,10 @@ public:
|
||||
S32 sphereInFrustum(const LLVector3 ¢er, const F32 radius) const;
|
||||
S32 pointInFrustum(const LLVector3 &point) const { return sphereInFrustum(point, 0.0f); }
|
||||
S32 sphereInFrustumFull(const LLVector3 ¢er, const F32 radius) const { return sphereInFrustum(center, radius); }
|
||||
S32 AABBInFrustum(const LLVector4a& center, const LLVector4a& radius);
|
||||
S32 AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius);
|
||||
S32 AABBInFrustum(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes = NULL);
|
||||
S32 AABBInRegionFrustum(const LLVector4a& center, const LLVector4a& radius);
|
||||
S32 AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes = NULL);
|
||||
S32 AABBInRegionFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius);
|
||||
|
||||
//does a quick 'n dirty sphere-sphere check
|
||||
S32 sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius);
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llcoordframe.cpp
|
||||
* @brief LLCoordFrame class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llcoordframe.h
|
||||
* @brief LLCoordFrame class header file.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,31 +1,25 @@
|
||||
/**
|
||||
* @file llinterp.h
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -3,31 +3,25 @@
|
||||
* @author Andrew Meadows
|
||||
* @brief Simple line class that can compute nearest approach between two lines
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2006-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -4,31 +4,25 @@
|
||||
* @author Andrew Meadows
|
||||
* @brief Simple line for computing nearest approach between two infinite lines
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2006-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include <vector>
|
||||
#include <limits>
|
||||
#include "lldefs.h"
|
||||
//#include "llstl.h" // *TODO: Remove when LLString is gone
|
||||
//#include "llstring.h" // *TODO: Remove when LLString is gone
|
||||
@@ -72,15 +73,21 @@ const F32 F_E = 2.71828182845904523536f;
|
||||
const F32 F_SQRT2 = 1.4142135623730950488016887242097f;
|
||||
const F32 F_SQRT3 = 1.73205080756888288657986402541f;
|
||||
const F32 OO_SQRT2 = 0.7071067811865475244008443621049f;
|
||||
const F32 OO_SQRT3 = 0.577350269189625764509f;
|
||||
const F32 DEG_TO_RAD = 0.017453292519943295769236907684886f;
|
||||
const F32 RAD_TO_DEG = 57.295779513082320876798154814105f;
|
||||
const F32 F_APPROXIMATELY_ZERO = 0.00001f;
|
||||
const F32 F_LN10 = 2.3025850929940456840179914546844f;
|
||||
const F32 OO_LN10 = 0.43429448190325182765112891891661;
|
||||
const F32 F_LN2 = 0.69314718056f;
|
||||
const F32 OO_LN2 = 1.4426950408889634073599246810019f;
|
||||
|
||||
const F32 F_ALMOST_ZERO = 0.0001f;
|
||||
const F32 F_ALMOST_ONE = 1.0f - F_ALMOST_ZERO;
|
||||
|
||||
const F32 GIMBAL_THRESHOLD = 0.000436f; // sets the gimballock threshold 0.025 away from +/-90 degrees
|
||||
// formula: GIMBAL_THRESHOLD = sin(DEG_TO_RAD * gimbal_threshold_angle);
|
||||
|
||||
// BUG: Eliminate in favor of F_APPROXIMATELY_ZERO above?
|
||||
const F32 FP_MAG_THRESHOLD = 0.0000001f;
|
||||
|
||||
@@ -111,6 +118,12 @@ inline bool is_approx_zero( F32 f ) { return (-F_APPROXIMATELY_ZERO < f) && (f <
|
||||
// WARNING: Infinity is comparable with F32_MAX and negative
|
||||
// infinity is comparable with F32_MIN
|
||||
|
||||
// handles negative and positive zeros
|
||||
inline bool is_zero(F32 x)
|
||||
{
|
||||
return (*(U32*)(&x) & 0x7fffffff) == 0;
|
||||
}
|
||||
|
||||
inline bool is_approx_equal(F32 x, F32 y)
|
||||
{
|
||||
const S32 COMPARE_MANTISSA_UP_TO_BIT = 0x02;
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "sys.h"
|
||||
#include "llmath.h"
|
||||
|
||||
static LL_ALIGN_16(const F32 M_IDENT_3A[12]) =
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
// LLMatrix3a is the base class for LLRotation, which should be used instead any time you're dealing with a
|
||||
// rotation matrix.
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLMatrix3a
|
||||
{
|
||||
public:
|
||||
@@ -113,8 +114,9 @@ protected:
|
||||
|
||||
LL_ALIGN_16(LLVector4a mColumns[3]);
|
||||
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLRotation : public LLMatrix3a
|
||||
{
|
||||
public:
|
||||
@@ -123,6 +125,6 @@ public:
|
||||
|
||||
// Returns true if this rotation is orthonormal with det ~= 1
|
||||
inline bool isOkRotation() const;
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -31,10 +31,72 @@
|
||||
#include "m4math.h"
|
||||
#include "m3math.h"
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLMatrix4a
|
||||
{
|
||||
public:
|
||||
private:
|
||||
LL_ALIGN_16(LLVector4a mMatrix[4]);
|
||||
public:
|
||||
enum
|
||||
{
|
||||
ROW_FWD = 0,
|
||||
ROW_LEFT,
|
||||
ROW_UP,
|
||||
ROW_TRANS
|
||||
};
|
||||
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
LLMatrix4a()
|
||||
{}
|
||||
LLMatrix4a(const LLQuad& q1,const LLQuad& q2,const LLQuad& q3,const LLQuad& q4)
|
||||
{
|
||||
mMatrix[0] = q1;
|
||||
mMatrix[1] = q2;
|
||||
mMatrix[2] = q3;
|
||||
mMatrix[3] = q4;
|
||||
}
|
||||
LLMatrix4a(const LLQuaternion2& quat)
|
||||
{
|
||||
const LLVector4a& xyzw = quat.getVector4a();
|
||||
LLVector4a nyxwz = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(2,3,0,1));
|
||||
nyxwz.negate();
|
||||
|
||||
const LLVector4a xnyynx = _mm_unpacklo_ps(xyzw,nyxwz);
|
||||
const LLVector4a znwwnz = _mm_unpackhi_ps(xyzw,nyxwz);
|
||||
|
||||
LLMatrix4a mata;
|
||||
mata.setRow<0>(_mm_shuffle_ps(xyzw, xnyynx, _MM_SHUFFLE(0,1,2,3)));
|
||||
mata.setRow<1>(_mm_shuffle_ps(znwwnz, xyzw, _MM_SHUFFLE(1,0,2,3)));
|
||||
mata.setRow<2>(_mm_shuffle_ps(xnyynx, xyzw, _MM_SHUFFLE(2,3,3,2)));
|
||||
mata.setRow<3>(_mm_shuffle_ps(xnyynx, znwwnz, _MM_SHUFFLE(2,3,1,3)));
|
||||
|
||||
LLMatrix4a matb;
|
||||
matb.setRow<0>(_mm_shuffle_ps(xyzw, xnyynx, _MM_SHUFFLE(3,1,2,3)));
|
||||
matb.setRow<1>(_mm_shuffle_ps(znwwnz, xnyynx, _MM_SHUFFLE(1,0,2,3)));
|
||||
matb.setRow<2>(_mm_shuffle_ps(xnyynx, znwwnz, _MM_SHUFFLE(3,2,3,2)));
|
||||
matb.setRow<3>(xyzw);
|
||||
|
||||
setMul(matb,mata);
|
||||
}
|
||||
|
||||
inline F32* getF32ptr()
|
||||
{
|
||||
return mMatrix[0].getF32ptr();
|
||||
}
|
||||
|
||||
inline const F32* getF32ptr() const
|
||||
{
|
||||
return mMatrix[0].getF32ptr();
|
||||
}
|
||||
|
||||
inline void clear()
|
||||
{
|
||||
@@ -44,13 +106,21 @@ public:
|
||||
mMatrix[3].clear();
|
||||
}
|
||||
|
||||
inline void setIdentity()
|
||||
{
|
||||
static __m128 ones = _mm_set_ps(1.f,0.f,0.f,1.f);
|
||||
mMatrix[0] = _mm_movelh_ps(ones,_mm_setzero_ps());
|
||||
mMatrix[1] = _mm_movehl_ps(_mm_setzero_ps(),ones);
|
||||
mMatrix[2] = _mm_movelh_ps(_mm_setzero_ps(),ones);
|
||||
mMatrix[3] = _mm_movehl_ps(ones,_mm_setzero_ps());
|
||||
}
|
||||
|
||||
inline void loadu(const LLMatrix4& src)
|
||||
{
|
||||
mMatrix[0] = _mm_loadu_ps(src.mMatrix[0]);
|
||||
mMatrix[1] = _mm_loadu_ps(src.mMatrix[1]);
|
||||
mMatrix[2] = _mm_loadu_ps(src.mMatrix[2]);
|
||||
mMatrix[3] = _mm_loadu_ps(src.mMatrix[3]);
|
||||
|
||||
mMatrix[0].loadua(src.mMatrix[0]);
|
||||
mMatrix[1].loadua(src.mMatrix[1]);
|
||||
mMatrix[2].loadua(src.mMatrix[2]);
|
||||
mMatrix[3].loadua(src.mMatrix[3]);
|
||||
}
|
||||
|
||||
inline void loadu(const LLMatrix3& src)
|
||||
@@ -61,6 +131,14 @@ public:
|
||||
mMatrix[3].set(0,0,0,1.f);
|
||||
}
|
||||
|
||||
inline void loadu(const F32* src)
|
||||
{
|
||||
mMatrix[0].loadua(src+0);
|
||||
mMatrix[1].loadua(src+4);
|
||||
mMatrix[2].loadua(src+8);
|
||||
mMatrix[3].loadua(src+12);
|
||||
}
|
||||
|
||||
inline void add(const LLMatrix4a& rhs)
|
||||
{
|
||||
mMatrix[0].add(rhs.mMatrix[0]);
|
||||
@@ -69,6 +147,75 @@ public:
|
||||
mMatrix[3].add(rhs.mMatrix[3]);
|
||||
}
|
||||
|
||||
inline void mul(const LLMatrix4a& rhs)
|
||||
{
|
||||
//Not using rotate4 to avoid extra copy of *this.
|
||||
LLVector4a x0,y0,z0,w0;
|
||||
LLVector4a x1,y1,z1,w1;
|
||||
LLVector4a x2,y2,z2,w2;
|
||||
LLVector4a x3,y3,z3,w3;
|
||||
|
||||
//16 shuffles
|
||||
x0.splat<0>(rhs.mMatrix[0]);
|
||||
x1.splat<0>(rhs.mMatrix[1]);
|
||||
x2.splat<0>(rhs.mMatrix[2]);
|
||||
x3.splat<0>(rhs.mMatrix[3]);
|
||||
|
||||
y0.splat<1>(rhs.mMatrix[0]);
|
||||
y1.splat<1>(rhs.mMatrix[1]);
|
||||
y2.splat<1>(rhs.mMatrix[2]);
|
||||
y3.splat<1>(rhs.mMatrix[3]);
|
||||
|
||||
z0.splat<2>(rhs.mMatrix[0]);
|
||||
z1.splat<2>(rhs.mMatrix[1]);
|
||||
z2.splat<2>(rhs.mMatrix[2]);
|
||||
z3.splat<2>(rhs.mMatrix[3]);
|
||||
|
||||
w0.splat<3>(rhs.mMatrix[0]);
|
||||
w1.splat<3>(rhs.mMatrix[1]);
|
||||
w2.splat<3>(rhs.mMatrix[2]);
|
||||
w3.splat<3>(rhs.mMatrix[3]);
|
||||
|
||||
//16 muls
|
||||
x0.mul(mMatrix[0]);
|
||||
x1.mul(mMatrix[0]);
|
||||
x2.mul(mMatrix[0]);
|
||||
x3.mul(mMatrix[0]);
|
||||
|
||||
y0.mul(mMatrix[1]);
|
||||
y1.mul(mMatrix[1]);
|
||||
y2.mul(mMatrix[1]);
|
||||
y3.mul(mMatrix[1]);
|
||||
|
||||
z0.mul(mMatrix[2]);
|
||||
z1.mul(mMatrix[2]);
|
||||
z2.mul(mMatrix[2]);
|
||||
z3.mul(mMatrix[2]);
|
||||
|
||||
w0.mul(mMatrix[3]);
|
||||
w1.mul(mMatrix[3]);
|
||||
w2.mul(mMatrix[3]);
|
||||
w3.mul(mMatrix[3]);
|
||||
|
||||
//12 adds
|
||||
x0.add(y0);
|
||||
z0.add(w0);
|
||||
|
||||
x1.add(y1);
|
||||
z1.add(w1);
|
||||
|
||||
x2.add(y2);
|
||||
z2.add(w2);
|
||||
|
||||
x3.add(y3);
|
||||
z3.add(w3);
|
||||
|
||||
mMatrix[0].setAdd(x0,z0);
|
||||
mMatrix[1].setAdd(x1,z1);
|
||||
mMatrix[2].setAdd(x2,z2);
|
||||
mMatrix[3].setAdd(x3,z3);
|
||||
}
|
||||
|
||||
inline void setRows(const LLVector4a& r0, const LLVector4a& r1, const LLVector4a& r2)
|
||||
{
|
||||
mMatrix[0] = r0;
|
||||
@@ -76,6 +223,44 @@ public:
|
||||
mMatrix[2] = r2;
|
||||
}
|
||||
|
||||
template<int N>
|
||||
inline void setRow(const LLVector4a& row)
|
||||
{
|
||||
mMatrix[N] = row;
|
||||
}
|
||||
|
||||
template<int N>
|
||||
inline const LLVector4a& getRow() const
|
||||
{
|
||||
return mMatrix[N];
|
||||
}
|
||||
|
||||
template<int N>
|
||||
inline LLVector4a& getRow()
|
||||
{
|
||||
return mMatrix[N];
|
||||
}
|
||||
|
||||
template<int N>
|
||||
inline void setColumn(const LLVector4a& col)
|
||||
{
|
||||
mMatrix[0].copyComponent<N>(col.getScalarAt<0>());
|
||||
mMatrix[1].copyComponent<N>(col.getScalarAt<1>());
|
||||
mMatrix[2].copyComponent<N>(col.getScalarAt<2>());
|
||||
mMatrix[3].copyComponent<N>(col.getScalarAt<3>());
|
||||
}
|
||||
|
||||
template<int N>
|
||||
inline LLVector4a getColumn()
|
||||
{
|
||||
LLVector4a v;
|
||||
v.copyComponent<0>(mMatrix[0].getScalarAt<N>());
|
||||
v.copyComponent<1>(mMatrix[1].getScalarAt<N>());
|
||||
v.copyComponent<2>(mMatrix[2].getScalarAt<N>());
|
||||
v.copyComponent<3>(mMatrix[3].getScalarAt<N>());
|
||||
return v;
|
||||
}
|
||||
|
||||
inline void setMul(const LLMatrix4a& m, const F32 s)
|
||||
{
|
||||
mMatrix[0].setMul(m.mMatrix[0], s);
|
||||
@@ -84,6 +269,14 @@ public:
|
||||
mMatrix[3].setMul(m.mMatrix[3], s);
|
||||
}
|
||||
|
||||
inline void setMul(const LLMatrix4a& m0, const LLMatrix4a& m1)
|
||||
{
|
||||
m0.rotate4(m1.mMatrix[0],mMatrix[0]);
|
||||
m0.rotate4(m1.mMatrix[1],mMatrix[1]);
|
||||
m0.rotate4(m1.mMatrix[2],mMatrix[2]);
|
||||
m0.rotate4(m1.mMatrix[3],mMatrix[3]);
|
||||
}
|
||||
|
||||
inline void setLerp(const LLMatrix4a& a, const LLMatrix4a& b, F32 w)
|
||||
{
|
||||
LLVector4a d0,d1,d2,d3;
|
||||
@@ -107,13 +300,14 @@ public:
|
||||
|
||||
//Singu Note: Don't mess with this. It's intentionally different from LL's.
|
||||
// Note how res isn't manipulated until the very end.
|
||||
//Fast(er). Treats v[VW] as 0.f
|
||||
inline void rotate(const LLVector4a& v, LLVector4a& res) const
|
||||
{
|
||||
LLVector4a x,y,z;
|
||||
|
||||
x = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
|
||||
y = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
|
||||
z = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
|
||||
x.splat<0>(v);
|
||||
y.splat<1>(v);
|
||||
z.splat<2>(v);
|
||||
|
||||
x.mul(mMatrix[0]);
|
||||
y.mul(mMatrix[1]);
|
||||
@@ -123,14 +317,15 @@ public:
|
||||
res.setAdd(x,z);
|
||||
}
|
||||
|
||||
//Proper. v[VW] as v[VW]
|
||||
inline void rotate4(const LLVector4a& v, LLVector4a& res) const
|
||||
{
|
||||
LLVector4a x,y,z,w;
|
||||
|
||||
x = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
|
||||
y = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
|
||||
z = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
|
||||
w = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3));
|
||||
x.splat<0>(v);
|
||||
y.splat<1>(v);
|
||||
z.splat<2>(v);
|
||||
w.splat<3>(v);
|
||||
|
||||
x.mul(mMatrix[0]);
|
||||
y.mul(mMatrix[1]);
|
||||
@@ -142,14 +337,15 @@ public:
|
||||
res.setAdd(x,z);
|
||||
}
|
||||
|
||||
//Fast(er). Treats v[VW] as 1.f
|
||||
inline void affineTransform(const LLVector4a& v, LLVector4a& res) const
|
||||
{
|
||||
LLVector4a x,y,z;
|
||||
|
||||
x = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
|
||||
y = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
|
||||
z = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
|
||||
|
||||
x.splat<0>(v);
|
||||
y.splat<1>(v);
|
||||
z.splat<2>(v);
|
||||
|
||||
x.mul(mMatrix[0]);
|
||||
y.mul(mMatrix[1]);
|
||||
z.mul(mMatrix[2]);
|
||||
@@ -158,6 +354,348 @@ public:
|
||||
z.add(mMatrix[3]);
|
||||
res.setAdd(x,z);
|
||||
}
|
||||
};
|
||||
|
||||
inline void perspectiveTransform(const LLVector4a& v, LLVector4a& res) const
|
||||
{
|
||||
LLVector4a x,y,z,s,t,p,q;
|
||||
|
||||
x.splat<0>(v);
|
||||
y.splat<1>(v);
|
||||
z.splat<2>(v);
|
||||
|
||||
s.splat<3>(mMatrix[0]);
|
||||
t.splat<3>(mMatrix[1]);
|
||||
p.splat<3>(mMatrix[2]);
|
||||
q.splat<3>(mMatrix[3]);
|
||||
|
||||
s.mul(x);
|
||||
t.mul(y);
|
||||
p.mul(z);
|
||||
q.add(s);
|
||||
t.add(p);
|
||||
q.add(t);
|
||||
|
||||
x.mul(mMatrix[0]);
|
||||
y.mul(mMatrix[1]);
|
||||
z.mul(mMatrix[2]);
|
||||
|
||||
x.add(y);
|
||||
z.add(mMatrix[3]);
|
||||
res.setAdd(x,z);
|
||||
res.div(q);
|
||||
}
|
||||
|
||||
inline void transpose()
|
||||
{
|
||||
__m128 q1 = _mm_unpackhi_ps(mMatrix[0],mMatrix[1]);
|
||||
__m128 q2 = _mm_unpacklo_ps(mMatrix[0],mMatrix[1]);
|
||||
__m128 q3 = _mm_unpacklo_ps(mMatrix[2],mMatrix[3]);
|
||||
__m128 q4 = _mm_unpackhi_ps(mMatrix[2],mMatrix[3]);
|
||||
|
||||
mMatrix[0] = _mm_movelh_ps(q2,q3);
|
||||
mMatrix[1] = _mm_movehl_ps(q3,q2);
|
||||
mMatrix[2] = _mm_movelh_ps(q1,q4);
|
||||
mMatrix[3] = _mm_movehl_ps(q4,q1);
|
||||
}
|
||||
|
||||
// Following procedure adapted from:
|
||||
// http://software.intel.com/en-us/articles/optimized-matrix-library-for-use-with-the-intel-pentiumr-4-processors-sse2-instructions/
|
||||
//
|
||||
// License/Copyright Statement:
|
||||
//
|
||||
// Copyright (c) 2001 Intel Corporation.
|
||||
//
|
||||
// Permition is granted to use, copy, distribute and prepare derivative works
|
||||
// of this library for any purpose and without fee, provided, that the above
|
||||
// copyright notice and this statement appear in all copies.
|
||||
// Intel makes no representations about the suitability of this library for
|
||||
// any purpose, and specifically disclaims all warranties.
|
||||
// See LEGAL-intel_matrixlib.TXT for all the legal information.
|
||||
inline float invert()
|
||||
{
|
||||
LL_ALIGN_16(const unsigned int Sign_PNNP[4]) = { 0x00000000, 0x80000000, 0x80000000, 0x00000000 };
|
||||
|
||||
// The inverse is calculated using "Divide and Conquer" technique. The
|
||||
// original matrix is divide into four 2x2 sub-matrices. Since each
|
||||
// register holds four matrix element, the smaller matrices are
|
||||
// represented as a registers. Hence we get a better locality of the
|
||||
// calculations.
|
||||
|
||||
LLVector4a A = _mm_movelh_ps(mMatrix[0], mMatrix[1]), // the four sub-matrices
|
||||
B = _mm_movehl_ps(mMatrix[1], mMatrix[0]),
|
||||
C = _mm_movelh_ps(mMatrix[2], mMatrix[3]),
|
||||
D = _mm_movehl_ps(mMatrix[3], mMatrix[2]);
|
||||
LLVector4a iA, iB, iC, iD, // partial inverse of the sub-matrices
|
||||
DC, AB;
|
||||
LLSimdScalar dA, dB, dC, dD; // determinant of the sub-matrices
|
||||
LLSimdScalar det, d, d1, d2;
|
||||
LLVector4a rd;
|
||||
|
||||
// AB = A# * B
|
||||
AB.setMul(_mm_shuffle_ps(A,A,0x0F), B);
|
||||
AB.sub(_mm_mul_ps(_mm_shuffle_ps(A,A,0xA5), _mm_shuffle_ps(B,B,0x4E)));
|
||||
// DC = D# * C
|
||||
DC.setMul(_mm_shuffle_ps(D,D,0x0F), C);
|
||||
DC.sub(_mm_mul_ps(_mm_shuffle_ps(D,D,0xA5), _mm_shuffle_ps(C,C,0x4E)));
|
||||
|
||||
// dA = |A|
|
||||
dA = _mm_mul_ps(_mm_shuffle_ps(A, A, 0x5F),A);
|
||||
dA -= _mm_movehl_ps(dA,dA);
|
||||
// dB = |B|
|
||||
dB = _mm_mul_ps(_mm_shuffle_ps(B, B, 0x5F),B);
|
||||
dB -= _mm_movehl_ps(dB,dB);
|
||||
|
||||
// dC = |C|
|
||||
dC = _mm_mul_ps(_mm_shuffle_ps(C, C, 0x5F),C);
|
||||
dC -= _mm_movehl_ps(dC,dC);
|
||||
// dD = |D|
|
||||
dD = _mm_mul_ps(_mm_shuffle_ps(D, D, 0x5F),D);
|
||||
dD -= _mm_movehl_ps(dD,dD);
|
||||
|
||||
// d = trace(AB*DC) = trace(A#*B*D#*C)
|
||||
d = _mm_mul_ps(_mm_shuffle_ps(DC,DC,0xD8),AB);
|
||||
|
||||
// iD = C*A#*B
|
||||
iD.setMul(_mm_shuffle_ps(C,C,0xA0), _mm_movelh_ps(AB,AB));
|
||||
iD.add(_mm_mul_ps(_mm_shuffle_ps(C,C,0xF5), _mm_movehl_ps(AB,AB)));
|
||||
// iA = B*D#*C
|
||||
iA.setMul(_mm_shuffle_ps(B,B,0xA0), _mm_movelh_ps(DC,DC));
|
||||
iA.add(_mm_mul_ps(_mm_shuffle_ps(B,B,0xF5), _mm_movehl_ps(DC,DC)));
|
||||
|
||||
// d = trace(AB*DC) = trace(A#*B*D#*C) [continue]
|
||||
d = _mm_add_ps(d, _mm_movehl_ps(d, d));
|
||||
d += _mm_shuffle_ps(d, d, 1);
|
||||
d1 = dA*dD;
|
||||
d2 = dB*dC;
|
||||
|
||||
// iD = D*|A| - C*A#*B
|
||||
iD.setSub(_mm_mul_ps(D,_mm_shuffle_ps(dA,dA,0)), iD);
|
||||
|
||||
// iA = A*|D| - B*D#*C;
|
||||
iA.setSub(_mm_mul_ps(A,_mm_shuffle_ps(dD,dD,0)), iA);
|
||||
|
||||
// det = |A|*|D| + |B|*|C| - trace(A#*B*D#*C)
|
||||
det = d1+d2-d;
|
||||
|
||||
__m128 is_zero_mask = _mm_cmpeq_ps(det,_mm_setzero_ps());
|
||||
rd = _mm_div_ss(_mm_set_ss(1.f),_mm_or_ps(_mm_andnot_ps(is_zero_mask, det), _mm_and_ps(is_zero_mask, _mm_set_ss(1.f))));
|
||||
#ifdef ZERO_SINGULAR
|
||||
rd = _mm_and_ps(_mm_cmpneq_ss(det,_mm_setzero_ps()), rd);
|
||||
#endif
|
||||
|
||||
// iB = D * (A#B)# = D*B#*A
|
||||
iB.setMul(D, _mm_shuffle_ps(AB,AB,0x33));
|
||||
iB.sub(_mm_mul_ps(_mm_shuffle_ps(D,D,0xB1), _mm_shuffle_ps(AB,AB,0x66)));
|
||||
// iC = A * (D#C)# = A*C#*D
|
||||
iC.setMul(A, _mm_shuffle_ps(DC,DC,0x33));
|
||||
iC.sub(_mm_mul_ps(_mm_shuffle_ps(A,A,0xB1), _mm_shuffle_ps(DC,DC,0x66)));
|
||||
|
||||
rd = _mm_shuffle_ps(rd,rd,0);
|
||||
rd = _mm_xor_ps(rd, _mm_load_ps((const float*)Sign_PNNP));
|
||||
|
||||
// iB = C*|B| - D*B#*A
|
||||
iB.setSub(_mm_mul_ps(C,_mm_shuffle_ps(dB,dB,0)), iB);
|
||||
|
||||
// iC = B*|C| - A*C#*D;
|
||||
iC.setSub(_mm_mul_ps(B,_mm_shuffle_ps(dC,dC,0)), iC);
|
||||
|
||||
|
||||
// iX = iX / det
|
||||
iA.mul(rd);
|
||||
iB.mul(rd);
|
||||
iC.mul(rd);
|
||||
iD.mul(rd);
|
||||
|
||||
mMatrix[0] = _mm_shuffle_ps(iA,iB,0x77);
|
||||
mMatrix[1] = _mm_shuffle_ps(iA,iB,0x22);
|
||||
mMatrix[2] = _mm_shuffle_ps(iC,iD,0x77);
|
||||
mMatrix[3] = _mm_shuffle_ps(iC,iD,0x22);
|
||||
|
||||
F32 ret;
|
||||
_mm_store_ss(&ret,det);
|
||||
return ret;
|
||||
}
|
||||
|
||||
//=============Affine transformation matrix only=========================
|
||||
|
||||
//Multiply matrix with a pure translation matrix.
|
||||
inline void applyTranslation_affine(const F32& x, const F32& y, const F32& z)
|
||||
{
|
||||
const LLVector4a xyz0(x,y,z,0); //load
|
||||
LLVector4a xxxx;
|
||||
xxxx.splat<0>(xyz0);
|
||||
LLVector4a yyyy;
|
||||
yyyy.splat<1>(xyz0);
|
||||
LLVector4a zzzz;
|
||||
zzzz.splat<2>(xyz0);
|
||||
|
||||
LLVector4a sum1;
|
||||
LLVector4a sum2;
|
||||
LLVector4a sum3;
|
||||
|
||||
sum1.setMul(xxxx,mMatrix[0]);
|
||||
sum2.setMul(yyyy,mMatrix[1]);
|
||||
sum3.setMul(zzzz,mMatrix[2]);
|
||||
|
||||
mMatrix[3].add(sum1);
|
||||
mMatrix[3].add(sum2);
|
||||
mMatrix[3].add(sum3);
|
||||
}
|
||||
|
||||
//Multiply matrix with a pure translation matrix.
|
||||
inline void applyTranslation_affine(const LLVector3& trans)
|
||||
{
|
||||
applyTranslation_affine(trans.mV[VX],trans.mV[VY],trans.mV[VZ]);
|
||||
}
|
||||
|
||||
//Multiply matrix with a pure scale matrix.
|
||||
inline void applyScale_affine(const F32& x, const F32& y, const F32& z)
|
||||
{
|
||||
const LLVector4a xyz0(x,y,z,0); //load
|
||||
LLVector4a xxxx;
|
||||
xxxx.splat<0>(xyz0);
|
||||
LLVector4a yyyy;
|
||||
yyyy.splat<1>(xyz0);
|
||||
LLVector4a zzzz;
|
||||
zzzz.splat<2>(xyz0);
|
||||
|
||||
mMatrix[0].mul(xxxx);
|
||||
mMatrix[1].mul(yyyy);
|
||||
mMatrix[2].mul(zzzz);
|
||||
}
|
||||
|
||||
//Multiply matrix with a pure scale matrix.
|
||||
inline void applyScale_affine(const LLVector3& scale)
|
||||
{
|
||||
applyScale_affine(scale.mV[VX],scale.mV[VY],scale.mV[VZ]);
|
||||
}
|
||||
|
||||
//Multiply matrix with a pure scale matrix.
|
||||
inline void applyScale_affine(const F32& s)
|
||||
{
|
||||
const LLVector4a scale(s); //load
|
||||
mMatrix[0].mul(scale);
|
||||
mMatrix[1].mul(scale);
|
||||
mMatrix[2].mul(scale);
|
||||
}
|
||||
|
||||
//Direct addition to row3.
|
||||
inline void translate_affine(const LLVector3& trans)
|
||||
{
|
||||
LLVector4a translation;
|
||||
translation.load3(trans.mV);
|
||||
mMatrix[3].add(translation);
|
||||
}
|
||||
|
||||
//Direct assignment of row3.
|
||||
inline void setTranslate_affine(const LLVector3& trans)
|
||||
{
|
||||
static const LLVector4Logical mask = _mm_load_ps((F32*)&S_V4LOGICAL_MASK_TABLE[3*4]);
|
||||
|
||||
LLVector4a translation;
|
||||
translation.load3(trans.mV);
|
||||
|
||||
mMatrix[3].setSelectWithMask(mask,mMatrix[3],translation);
|
||||
}
|
||||
|
||||
inline void mul_affine(const LLMatrix4a& rhs)
|
||||
{
|
||||
LLVector4a x0,y0,z0;
|
||||
LLVector4a x1,y1,z1;
|
||||
LLVector4a x2,y2,z2;
|
||||
LLVector4a x3,y3,z3;
|
||||
|
||||
//12 shuffles
|
||||
x0.splat<0>(rhs.mMatrix[0]);
|
||||
x1.splat<0>(rhs.mMatrix[1]);
|
||||
x2.splat<0>(rhs.mMatrix[2]);
|
||||
x3.splat<0>(rhs.mMatrix[3]);
|
||||
|
||||
y0.splat<1>(rhs.mMatrix[0]);
|
||||
y1.splat<1>(rhs.mMatrix[1]);
|
||||
y2.splat<1>(rhs.mMatrix[2]);
|
||||
y3.splat<1>(rhs.mMatrix[3]);
|
||||
|
||||
z0.splat<2>(rhs.mMatrix[0]);
|
||||
z1.splat<2>(rhs.mMatrix[1]);
|
||||
z2.splat<2>(rhs.mMatrix[2]);
|
||||
z3.splat<2>(rhs.mMatrix[3]);
|
||||
|
||||
//12 muls
|
||||
x0.mul(mMatrix[0]);
|
||||
x1.mul(mMatrix[0]);
|
||||
x2.mul(mMatrix[0]);
|
||||
x3.mul(mMatrix[0]);
|
||||
|
||||
y0.mul(mMatrix[1]);
|
||||
y1.mul(mMatrix[1]);
|
||||
y2.mul(mMatrix[1]);
|
||||
y3.mul(mMatrix[1]);
|
||||
|
||||
z0.mul(mMatrix[2]);
|
||||
z1.mul(mMatrix[2]);
|
||||
z2.mul(mMatrix[2]);
|
||||
z3.mul(mMatrix[2]);
|
||||
|
||||
//9 adds
|
||||
x0.add(y0);
|
||||
|
||||
x1.add(y1);
|
||||
|
||||
x2.add(y2);
|
||||
|
||||
x3.add(y3);
|
||||
z3.add(mMatrix[3]);
|
||||
|
||||
mMatrix[0].setAdd(x0,z0);
|
||||
mMatrix[1].setAdd(x1,z1);
|
||||
mMatrix[2].setAdd(x2,z2);
|
||||
mMatrix[3].setAdd(x3,z3);
|
||||
}
|
||||
|
||||
inline void extractRotation_affine()
|
||||
{
|
||||
static const LLVector4Logical mask = _mm_load_ps((F32*)&S_V4LOGICAL_MASK_TABLE[3*4]);
|
||||
mMatrix[0].setSelectWithMask(mask,_mm_setzero_ps(),mMatrix[0]);
|
||||
mMatrix[1].setSelectWithMask(mask,_mm_setzero_ps(),mMatrix[1]);
|
||||
mMatrix[2].setSelectWithMask(mask,_mm_setzero_ps(),mMatrix[2]);
|
||||
mMatrix[3].setSelectWithMask(mask,LLVector4a(1.f),_mm_setzero_ps());
|
||||
}
|
||||
|
||||
//======================Logic====================
|
||||
private:
|
||||
template<bool mins> inline void init_foos(LLMatrix4a& foos) const
|
||||
{
|
||||
static bool done(false);
|
||||
if (done) return;
|
||||
const LLVector4a delta(0.0001f);
|
||||
foos.setIdentity();
|
||||
foos.getRow<0>().sub(delta);
|
||||
foos.getRow<1>().sub(delta);
|
||||
foos.getRow<2>().sub(delta);
|
||||
foos.getRow<3>().sub(delta);
|
||||
done = true;
|
||||
}
|
||||
|
||||
public:
|
||||
inline bool isIdentity() const
|
||||
{
|
||||
static LLMatrix4a mins;
|
||||
static LLMatrix4a maxs;
|
||||
|
||||
init_foos<false>(mins);
|
||||
init_foos<true>(maxs);
|
||||
|
||||
LLVector4a mask1 = _mm_and_ps(_mm_cmpgt_ps(mMatrix[0],mins.getRow<0>()), _mm_cmplt_ps(mMatrix[0],maxs.getRow<0>()));
|
||||
LLVector4a mask2 = _mm_and_ps(_mm_cmpgt_ps(mMatrix[1],mins.getRow<1>()), _mm_cmplt_ps(mMatrix[1],maxs.getRow<1>()));
|
||||
LLVector4a mask3 = _mm_and_ps(_mm_cmpgt_ps(mMatrix[2],mins.getRow<2>()), _mm_cmplt_ps(mMatrix[2],maxs.getRow<2>()));
|
||||
LLVector4a mask4 = _mm_and_ps(_mm_cmpgt_ps(mMatrix[3],mins.getRow<3>()), _mm_cmplt_ps(mMatrix[3],maxs.getRow<3>()));
|
||||
|
||||
mask1 = _mm_and_ps(mask1,mask2);
|
||||
mask2 = _mm_and_ps(mask3,mask4);
|
||||
|
||||
return _mm_movemask_epi8(_mm_castps_si128(_mm_and_ps(mask1, mask2))) == 0xFFFF;
|
||||
}
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,36 +2,28 @@
|
||||
* @file llmodularmath.cpp
|
||||
* @brief LLModularMath class implementation
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2010, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlife.com/developers/opensource/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlife.com/developers/opensource/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "linden_common.h"
|
||||
|
||||
// implementation is all in the header, this include dep ensures the unit test is rerun if the implementation changes.
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llmodularmath.h
|
||||
* @brief Useful modular math functions.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2008&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2008-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2008&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -932,10 +932,10 @@ protected:
|
||||
MIN = 3
|
||||
} eDName;
|
||||
|
||||
LLVector4a mCenter;
|
||||
LLVector4a mSize;
|
||||
LLVector4a mMax;
|
||||
LLVector4a mMin;
|
||||
LL_ALIGN_16(LLVector4a mCenter);
|
||||
LL_ALIGN_16(LLVector4a mSize);
|
||||
LL_ALIGN_16(LLVector4a mMax);
|
||||
LL_ALIGN_16(LLVector4a mMin);
|
||||
|
||||
oct_node* mParent;
|
||||
U8 mOctant;
|
||||
@@ -964,6 +964,26 @@ public:
|
||||
: BaseType(center, size, parent)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef LL_OCTREE_POOLS
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return LLOctreeNode<T>::getPool(size).malloc();
|
||||
}
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
LLOctreeNode<T>::getPool(sizeof(LLOctreeNode<T>)).free(ptr);
|
||||
}
|
||||
#else
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool balance()
|
||||
{
|
||||
|
||||
@@ -1,31 +1,25 @@
|
||||
/**
|
||||
* @file llperlin.cpp
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,31 +1,25 @@
|
||||
/**
|
||||
* @file llperlin.h
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,31 +1,25 @@
|
||||
/**
|
||||
* @file llplane.h
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -100,8 +94,14 @@ public:
|
||||
return mV.greaterEqual(LLVector4a::getZero()).getGatheredBits() & LLVector4Logical::MASK_XYZ;
|
||||
}
|
||||
|
||||
//check if two planes are nearly same
|
||||
bool equal(const LLPlane& p) const
|
||||
{
|
||||
return mV.equals4(p.mV);
|
||||
}
|
||||
|
||||
private:
|
||||
LLVector4a mV;
|
||||
LL_ALIGN_16(LLVector4a mV);
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
|
||||
|
||||
@@ -3,31 +3,25 @@
|
||||
* @brief useful routines for quantizing floats to various length ints
|
||||
* and back out again
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llquaternion.cpp
|
||||
* @brief LLQuaternion class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -64,34 +58,40 @@ LLQuaternion::LLQuaternion(const LLMatrix3 &mat)
|
||||
|
||||
LLQuaternion::LLQuaternion(F32 angle, const LLVector4 &vec)
|
||||
{
|
||||
LLVector3 v(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
|
||||
v.normalize();
|
||||
|
||||
F32 c, s;
|
||||
c = cosf(angle*0.5f);
|
||||
s = sinf(angle*0.5f);
|
||||
|
||||
mQ[VX] = v.mV[VX] * s;
|
||||
mQ[VY] = v.mV[VY] * s;
|
||||
mQ[VZ] = v.mV[VZ] * s;
|
||||
mQ[VW] = c;
|
||||
normalize();
|
||||
F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
angle *= 0.5;
|
||||
F32 c = cosf(angle);
|
||||
F32 s = sinf(angle) / mag;
|
||||
mQ[VX] = vec.mV[VX] * s;
|
||||
mQ[VY] = vec.mV[VY] * s;
|
||||
mQ[VZ] = vec.mV[VZ] * s;
|
||||
mQ[VW] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
loadIdentity();
|
||||
}
|
||||
}
|
||||
|
||||
LLQuaternion::LLQuaternion(F32 angle, const LLVector3 &vec)
|
||||
{
|
||||
LLVector3 v(vec);
|
||||
v.normalize();
|
||||
|
||||
F32 c, s;
|
||||
c = cosf(angle*0.5f);
|
||||
s = sinf(angle*0.5f);
|
||||
|
||||
mQ[VX] = v.mV[VX] * s;
|
||||
mQ[VY] = v.mV[VY] * s;
|
||||
mQ[VZ] = v.mV[VZ] * s;
|
||||
mQ[VW] = c;
|
||||
normalize();
|
||||
F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
angle *= 0.5;
|
||||
F32 c = cosf(angle);
|
||||
F32 s = sinf(angle) / mag;
|
||||
mQ[VX] = vec.mV[VX] * s;
|
||||
mQ[VY] = vec.mV[VY] * s;
|
||||
mQ[VZ] = vec.mV[VZ] * s;
|
||||
mQ[VW] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
loadIdentity();
|
||||
}
|
||||
}
|
||||
|
||||
LLQuaternion::LLQuaternion(const LLVector3 &x_axis,
|
||||
@@ -142,57 +142,61 @@ void LLQuaternion::quantize8(F32 lower, F32 upper)
|
||||
|
||||
const LLQuaternion& LLQuaternion::setAngleAxis(F32 angle, F32 x, F32 y, F32 z)
|
||||
{
|
||||
LLVector3 vec(x, y, z);
|
||||
vec.normalize();
|
||||
|
||||
angle *= 0.5f;
|
||||
F32 c, s;
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
mQ[VX] = vec.mV[VX]*s;
|
||||
mQ[VY] = vec.mV[VY]*s;
|
||||
mQ[VZ] = vec.mV[VZ]*s;
|
||||
mQ[VW] = c;
|
||||
|
||||
normalize();
|
||||
F32 mag = sqrtf(x * x + y * y + z * z);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
angle *= 0.5;
|
||||
F32 c = cosf(angle);
|
||||
F32 s = sinf(angle) / mag;
|
||||
mQ[VX] = x * s;
|
||||
mQ[VY] = y * s;
|
||||
mQ[VZ] = z * s;
|
||||
mQ[VW] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
loadIdentity();
|
||||
}
|
||||
return (*this);
|
||||
}
|
||||
|
||||
const LLQuaternion& LLQuaternion::setAngleAxis(F32 angle, const LLVector3 &vec)
|
||||
{
|
||||
LLVector3 v(vec);
|
||||
v.normalize();
|
||||
|
||||
angle *= 0.5f;
|
||||
F32 c, s;
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
mQ[VX] = v.mV[VX]*s;
|
||||
mQ[VY] = v.mV[VY]*s;
|
||||
mQ[VZ] = v.mV[VZ]*s;
|
||||
mQ[VW] = c;
|
||||
|
||||
normalize();
|
||||
F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
angle *= 0.5;
|
||||
F32 c = cosf(angle);
|
||||
F32 s = sinf(angle) / mag;
|
||||
mQ[VX] = vec.mV[VX] * s;
|
||||
mQ[VY] = vec.mV[VY] * s;
|
||||
mQ[VZ] = vec.mV[VZ] * s;
|
||||
mQ[VW] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
loadIdentity();
|
||||
}
|
||||
return (*this);
|
||||
}
|
||||
|
||||
const LLQuaternion& LLQuaternion::setAngleAxis(F32 angle, const LLVector4 &vec)
|
||||
{
|
||||
LLVector3 v(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
|
||||
v.normalize();
|
||||
|
||||
F32 c, s;
|
||||
c = cosf(angle*0.5f);
|
||||
s = sinf(angle*0.5f);
|
||||
|
||||
mQ[VX] = v.mV[VX]*s;
|
||||
mQ[VY] = v.mV[VY]*s;
|
||||
mQ[VZ] = v.mV[VZ]*s;
|
||||
mQ[VW] = c;
|
||||
|
||||
normalize();
|
||||
F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
angle *= 0.5;
|
||||
F32 c = cosf(angle);
|
||||
F32 s = sinf(angle) / mag;
|
||||
mQ[VX] = vec.mV[VX] * s;
|
||||
mQ[VY] = vec.mV[VY] * s;
|
||||
mQ[VZ] = vec.mV[VZ] * s;
|
||||
mQ[VW] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
loadIdentity();
|
||||
}
|
||||
return (*this);
|
||||
}
|
||||
|
||||
@@ -225,68 +229,80 @@ const LLQuaternion& LLQuaternion::set(const LLMatrix4 &mat)
|
||||
// deprecated
|
||||
const LLQuaternion& LLQuaternion::setQuat(F32 angle, F32 x, F32 y, F32 z)
|
||||
{
|
||||
LLVector3 vec(x, y, z);
|
||||
vec.normalize();
|
||||
|
||||
angle *= 0.5f;
|
||||
F32 c, s;
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
mQ[VX] = vec.mV[VX]*s;
|
||||
mQ[VY] = vec.mV[VY]*s;
|
||||
mQ[VZ] = vec.mV[VZ]*s;
|
||||
mQ[VW] = c;
|
||||
|
||||
normalize();
|
||||
F32 mag = sqrtf(x * x + y * y + z * z);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
angle *= 0.5;
|
||||
F32 c = cosf(angle);
|
||||
F32 s = sinf(angle) / mag;
|
||||
mQ[VX] = x * s;
|
||||
mQ[VY] = y * s;
|
||||
mQ[VZ] = z * s;
|
||||
mQ[VW] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
loadIdentity();
|
||||
}
|
||||
return (*this);
|
||||
}
|
||||
|
||||
// deprecated
|
||||
const LLQuaternion& LLQuaternion::setQuat(F32 angle, const LLVector3 &vec)
|
||||
{
|
||||
LLVector3 v(vec);
|
||||
v.normalize();
|
||||
|
||||
angle *= 0.5f;
|
||||
F32 c, s;
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
mQ[VX] = v.mV[VX]*s;
|
||||
mQ[VY] = v.mV[VY]*s;
|
||||
mQ[VZ] = v.mV[VZ]*s;
|
||||
mQ[VW] = c;
|
||||
|
||||
normalize();
|
||||
F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
angle *= 0.5;
|
||||
F32 c = cosf(angle);
|
||||
F32 s = sinf(angle) / mag;
|
||||
mQ[VX] = vec.mV[VX] * s;
|
||||
mQ[VY] = vec.mV[VY] * s;
|
||||
mQ[VZ] = vec.mV[VZ] * s;
|
||||
mQ[VW] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
loadIdentity();
|
||||
}
|
||||
return (*this);
|
||||
}
|
||||
|
||||
const LLQuaternion& LLQuaternion::setQuat(F32 angle, const LLVector4 &vec)
|
||||
{
|
||||
LLVector3 v(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
|
||||
v.normalize();
|
||||
|
||||
F32 c, s;
|
||||
c = cosf(angle*0.5f);
|
||||
s = sinf(angle*0.5f);
|
||||
|
||||
mQ[VX] = v.mV[VX]*s;
|
||||
mQ[VY] = v.mV[VY]*s;
|
||||
mQ[VZ] = v.mV[VZ]*s;
|
||||
mQ[VW] = c;
|
||||
|
||||
normalize();
|
||||
F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
angle *= 0.5;
|
||||
F32 c = cosf(angle);
|
||||
F32 s = sinf(angle) / mag;
|
||||
mQ[VX] = vec.mV[VX] * s;
|
||||
mQ[VY] = vec.mV[VY] * s;
|
||||
mQ[VZ] = vec.mV[VZ] * s;
|
||||
mQ[VW] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
loadIdentity();
|
||||
}
|
||||
return (*this);
|
||||
}
|
||||
|
||||
const LLQuaternion& LLQuaternion::setQuat(F32 roll, F32 pitch, F32 yaw)
|
||||
{
|
||||
LLMatrix3 rot_mat(roll, pitch, yaw);
|
||||
rot_mat.orthogonalize();
|
||||
*this = rot_mat.quaternion();
|
||||
|
||||
normalize();
|
||||
roll *= 0.5f;
|
||||
pitch *= 0.5f;
|
||||
yaw *= 0.5f;
|
||||
F32 sinX = sinf(roll);
|
||||
F32 cosX = cosf(roll);
|
||||
F32 sinY = sinf(pitch);
|
||||
F32 cosY = cosf(pitch);
|
||||
F32 sinZ = sinf(yaw);
|
||||
F32 cosZ = cosf(yaw);
|
||||
mQ[VW] = cosX * cosY * cosZ - sinX * sinY * sinZ;
|
||||
mQ[VX] = sinX * cosY * cosZ + cosX * sinY * sinZ;
|
||||
mQ[VY] = cosX * sinY * cosZ - sinX * cosY * sinZ;
|
||||
mQ[VZ] = cosX * cosY * sinZ + sinX * sinY * cosZ;
|
||||
return (*this);
|
||||
}
|
||||
|
||||
@@ -431,68 +447,44 @@ LLMatrix4 LLQuaternion::getMatrix4(void) const
|
||||
// calculate the shortest rotation from a to b
|
||||
void LLQuaternion::shortestArc(const LLVector3 &a, const LLVector3 &b)
|
||||
{
|
||||
// Make a local copy of both vectors.
|
||||
LLVector3 vec_a = a;
|
||||
LLVector3 vec_b = b;
|
||||
|
||||
// Make sure neither vector is zero length. Also normalize
|
||||
// the vectors while we are at it.
|
||||
F32 vec_a_mag = vec_a.normalize();
|
||||
F32 vec_b_mag = vec_b.normalize();
|
||||
if (vec_a_mag < F_APPROXIMATELY_ZERO ||
|
||||
vec_b_mag < F_APPROXIMATELY_ZERO)
|
||||
F32 ab = a * b; // dotproduct
|
||||
LLVector3 c = a % b; // crossproduct
|
||||
F32 cc = c * c; // squared length of the crossproduct
|
||||
if (ab * ab + cc) // test if the arguments have sufficient magnitude
|
||||
{
|
||||
// Can't calculate a rotation from this.
|
||||
// Just return ZERO_ROTATION instead.
|
||||
loadIdentity();
|
||||
return;
|
||||
}
|
||||
|
||||
// Create an axis to rotate around, and the cos of the angle to rotate.
|
||||
LLVector3 axis = vec_a % vec_b;
|
||||
F32 cos_theta = vec_a * vec_b;
|
||||
|
||||
// Check the angle between the vectors to see if they are parallel or anti-parallel.
|
||||
if (cos_theta > 1.0 - F_APPROXIMATELY_ZERO)
|
||||
{
|
||||
// a and b are parallel. No rotation is necessary.
|
||||
loadIdentity();
|
||||
}
|
||||
else if (cos_theta < -1.0 + F_APPROXIMATELY_ZERO)
|
||||
{
|
||||
// a and b are anti-parallel.
|
||||
// Rotate 180 degrees around some orthogonal axis.
|
||||
// Find the projection of the x-axis onto a, and try
|
||||
// using the vector between the projection and the x-axis
|
||||
// as the orthogonal axis.
|
||||
LLVector3 proj = vec_a.mV[VX] / (vec_a * vec_a) * vec_a;
|
||||
LLVector3 ortho_axis(1.f, 0.f, 0.f);
|
||||
ortho_axis -= proj;
|
||||
|
||||
// Turn this into an orthonormal axis.
|
||||
F32 ortho_length = ortho_axis.normalize();
|
||||
// If the axis' length is 0, then our guess at an orthogonal axis
|
||||
// was wrong (a is parallel to the x-axis).
|
||||
if (ortho_length < F_APPROXIMATELY_ZERO)
|
||||
if (cc > 0.0f) // test if the arguments are (anti)parallel
|
||||
{
|
||||
// Use the z-axis instead.
|
||||
ortho_axis.setVec(0.f, 0.f, 1.f);
|
||||
F32 s = sqrtf(ab * ab + cc) + ab; // note: don't try to optimize this line
|
||||
F32 m = 1.0f / sqrtf(cc + s * s); // the inverted magnitude of the quaternion
|
||||
mQ[VX] = c.mV[VX] * m;
|
||||
mQ[VY] = c.mV[VY] * m;
|
||||
mQ[VZ] = c.mV[VZ] * m;
|
||||
mQ[VW] = s * m;
|
||||
return;
|
||||
}
|
||||
if (ab < 0.0f) // test if the angle is bigger than PI/2 (anti parallel)
|
||||
{
|
||||
c = a - b; // the arguments are anti-parallel, we have to choose an axis
|
||||
F32 m = sqrtf(c.mV[VX] * c.mV[VX] + c.mV[VY] * c.mV[VY]); // the length projected on the XY-plane
|
||||
if (m > FP_MAG_THRESHOLD)
|
||||
{
|
||||
mQ[VX] = -c.mV[VY] / m; // return the quaternion with the axis in the XY-plane
|
||||
mQ[VY] = c.mV[VX] / m;
|
||||
mQ[VZ] = 0.0f;
|
||||
mQ[VW] = 0.0f;
|
||||
return;
|
||||
}
|
||||
else // the vectors are parallel to the Z-axis
|
||||
{
|
||||
mQ[VX] = 1.0f; // rotate around the X-axis
|
||||
mQ[VY] = 0.0f;
|
||||
mQ[VZ] = 0.0f;
|
||||
mQ[VW] = 0.0f;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Construct a quaternion from this orthonormal axis.
|
||||
mQ[VX] = ortho_axis.mV[VX];
|
||||
mQ[VY] = ortho_axis.mV[VY];
|
||||
mQ[VZ] = ortho_axis.mV[VZ];
|
||||
mQ[VW] = 0.f;
|
||||
}
|
||||
else
|
||||
{
|
||||
// a and b are NOT parallel or anti-parallel.
|
||||
// Return the rotation between these vectors.
|
||||
F32 theta = (F32)acos(cos_theta);
|
||||
|
||||
setAngleAxis(theta, axis);
|
||||
}
|
||||
loadIdentity();
|
||||
}
|
||||
|
||||
// constrains rotation to a cone angle specified in radians
|
||||
@@ -844,79 +836,82 @@ LLQuaternion::Order StringToOrder( const char *str )
|
||||
|
||||
void LLQuaternion::getAngleAxis(F32* angle, LLVector3 &vec) const
|
||||
{
|
||||
F32 cos_a = mQ[VW];
|
||||
if (cos_a > 1.0f) cos_a = 1.0f;
|
||||
if (cos_a < -1.0f) cos_a = -1.0f;
|
||||
|
||||
F32 sin_a = (F32) sqrt( 1.0f - cos_a * cos_a );
|
||||
|
||||
if ( fabs( sin_a ) < 0.0005f )
|
||||
sin_a = 1.0f;
|
||||
else
|
||||
sin_a = 1.f/sin_a;
|
||||
|
||||
F32 temp_angle = 2.0f * (F32) acos( cos_a );
|
||||
if (temp_angle > F_PI)
|
||||
F32 v = sqrtf(mQ[VX] * mQ[VX] + mQ[VY] * mQ[VY] + mQ[VZ] * mQ[VZ]); // length of the vector-component
|
||||
if (v > FP_MAG_THRESHOLD)
|
||||
{
|
||||
// The (angle,axis) pair should never have angles outside [PI, -PI]
|
||||
// since we want the _shortest_ (angle,axis) solution.
|
||||
// Since acos is defined for [0, PI], and we multiply by 2.0, we
|
||||
// can push the angle outside the acceptible range.
|
||||
// When this happens we set the angle to the other portion of a
|
||||
// full 2PI rotation, and negate the axis, which reverses the
|
||||
// direction of the rotation (by the right-hand rule).
|
||||
*angle = 2.f * F_PI - temp_angle;
|
||||
vec.mV[VX] = - mQ[VX] * sin_a;
|
||||
vec.mV[VY] = - mQ[VY] * sin_a;
|
||||
vec.mV[VZ] = - mQ[VZ] * sin_a;
|
||||
F32 oomag = 1.0f / v;
|
||||
F32 w = mQ[VW];
|
||||
if (mQ[VW] < 0.0f)
|
||||
{
|
||||
w = -w; // make VW positive
|
||||
oomag = -oomag; // invert the axis
|
||||
}
|
||||
vec.mV[VX] = mQ[VX] * oomag; // normalize the axis
|
||||
vec.mV[VY] = mQ[VY] * oomag;
|
||||
vec.mV[VZ] = mQ[VZ] * oomag;
|
||||
*angle = 2.0f * atan2f(v, w); // get the angle
|
||||
}
|
||||
else
|
||||
{
|
||||
*angle = temp_angle;
|
||||
vec.mV[VX] = mQ[VX] * sin_a;
|
||||
vec.mV[VY] = mQ[VY] * sin_a;
|
||||
vec.mV[VZ] = mQ[VZ] * sin_a;
|
||||
*angle = 0.0f; // no rotation
|
||||
vec.mV[VX] = 0.0f; // around some dummy axis
|
||||
vec.mV[VY] = 0.0f;
|
||||
vec.mV[VZ] = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// quaternion does not need to be normalized
|
||||
void LLQuaternion::getEulerAngles(F32 *roll, F32 *pitch, F32 *yaw) const
|
||||
{
|
||||
LLMatrix3 rot_mat(*this);
|
||||
rot_mat.orthogonalize();
|
||||
rot_mat.getEulerAngles(roll, pitch, yaw);
|
||||
|
||||
// // NOTE: LLQuaternion's are actually inverted with respect to
|
||||
// // the matrices, so this code also assumes inverted quaternions
|
||||
// // (-x, -y, -z, w). The result is that roll,pitch,yaw are applied
|
||||
// // in reverse order (yaw,pitch,roll).
|
||||
// F32 x = -mQ[VX], y = -mQ[VY], z = -mQ[VZ], w = mQ[VW];
|
||||
// F64 m20 = 2.0*(x*z-y*w);
|
||||
// if (1.0f - fabsf(m20) < F_APPROXIMATELY_ZERO)
|
||||
// {
|
||||
// *roll = 0.0f;
|
||||
// *pitch = (F32)asin(m20);
|
||||
// *yaw = (F32)atan2(2.0*(x*y-z*w), 1.0 - 2.0*(x*x+z*z));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// *roll = (F32)atan2(-2.0*(y*z+x*w), 1.0-2.0*(x*x+y*y));
|
||||
// *pitch = (F32)asin(m20);
|
||||
// *yaw = (F32)atan2(-2.0*(x*y+z*w), 1.0-2.0*(y*y+z*z));
|
||||
// }
|
||||
F32 sx = 2 * (mQ[VX] * mQ[VW] - mQ[VY] * mQ[VZ]); // sine of the roll
|
||||
F32 sy = 2 * (mQ[VY] * mQ[VW] + mQ[VX] * mQ[VZ]); // sine of the pitch
|
||||
F32 ys = mQ[VW] * mQ[VW] - mQ[VY] * mQ[VY]; // intermediate cosine 1
|
||||
F32 xz = mQ[VX] * mQ[VX] - mQ[VZ] * mQ[VZ]; // intermediate cosine 2
|
||||
F32 cx = ys - xz; // cosine of the roll
|
||||
F32 cy = sqrtf(sx * sx + cx * cx); // cosine of the pitch
|
||||
if (cy > GIMBAL_THRESHOLD) // no gimbal lock
|
||||
{
|
||||
*roll = atan2f(sx, cx);
|
||||
*pitch = atan2f(sy, cy);
|
||||
*yaw = atan2f(2 * (mQ[VZ] * mQ[VW] - mQ[VX] * mQ[VY]), ys + xz);
|
||||
}
|
||||
else // gimbal lock
|
||||
{
|
||||
if (sy > 0)
|
||||
{
|
||||
*pitch = F_PI_BY_TWO;
|
||||
*yaw = 2 * atan2f(mQ[VZ] + mQ[VX], mQ[VW] + mQ[VY]);
|
||||
}
|
||||
else
|
||||
{
|
||||
*pitch = -F_PI_BY_TWO;
|
||||
*yaw = 2 * atan2f(mQ[VZ] - mQ[VX], mQ[VW] - mQ[VY]);
|
||||
}
|
||||
*roll = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Saves space by using the fact that our quaternions are normalized
|
||||
LLVector3 LLQuaternion::packToVector3() const
|
||||
{
|
||||
F32 x = mQ[VX];
|
||||
F32 y = mQ[VY];
|
||||
F32 z = mQ[VZ];
|
||||
F32 w = mQ[VW];
|
||||
F32 mag = sqrtf(x * x + y * y + z * z + w * w);
|
||||
if (mag > FP_MAG_THRESHOLD)
|
||||
{
|
||||
x /= mag;
|
||||
y /= mag;
|
||||
z /= mag; // no need to normalize w, it's not used
|
||||
}
|
||||
if( mQ[VW] >= 0 )
|
||||
{
|
||||
return LLVector3( mQ[VX], mQ[VY], mQ[VZ] );
|
||||
return LLVector3( x, y , z );
|
||||
}
|
||||
else
|
||||
{
|
||||
return LLVector3( -mQ[VX], -mQ[VY], -mQ[VZ] );
|
||||
return LLVector3( -x, -y, -z );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llquaternion.h
|
||||
* @brief LLQuaternion class header file.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -310,43 +304,29 @@ inline const LLQuaternion& LLQuaternion::setQuat(const F32 *q)
|
||||
return (*this);
|
||||
}
|
||||
|
||||
// There may be a cheaper way that avoids the sqrt.
|
||||
// Does sin_a = VX*VX + VY*VY + VZ*VZ?
|
||||
// Copied from Matrix and Quaternion FAQ 1.12
|
||||
inline void LLQuaternion::getAngleAxis(F32* angle, F32* x, F32* y, F32* z) const
|
||||
{
|
||||
F32 cos_a = mQ[VW];
|
||||
if (cos_a > 1.0f) cos_a = 1.0f;
|
||||
if (cos_a < -1.0f) cos_a = -1.0f;
|
||||
|
||||
F32 sin_a = (F32) sqrt( 1.0f - cos_a * cos_a );
|
||||
|
||||
if ( fabs( sin_a ) < 0.0005f )
|
||||
sin_a = 1.0f;
|
||||
else
|
||||
sin_a = 1.f/sin_a;
|
||||
|
||||
F32 temp_angle = 2.0f * (F32) acos( cos_a );
|
||||
if (temp_angle > F_PI)
|
||||
F32 v = sqrtf(mQ[VX] * mQ[VX] + mQ[VY] * mQ[VY] + mQ[VZ] * mQ[VZ]); // length of the vector-component
|
||||
if (v > FP_MAG_THRESHOLD)
|
||||
{
|
||||
// The (angle,axis) pair should never have angles outside [PI, -PI]
|
||||
// since we want the _shortest_ (angle,axis) solution.
|
||||
// Since acos is defined for [0, PI], and we multiply by 2.0, we
|
||||
// can push the angle outside the acceptible range.
|
||||
// When this happens we set the angle to the other portion of a
|
||||
// full 2PI rotation, and negate the axis, which reverses the
|
||||
// direction of the rotation (by the right-hand rule).
|
||||
*angle = 2.f * F_PI - temp_angle;
|
||||
*x = - mQ[VX] * sin_a;
|
||||
*y = - mQ[VY] * sin_a;
|
||||
*z = - mQ[VZ] * sin_a;
|
||||
F32 oomag = 1.0f / v;
|
||||
F32 w = mQ[VW];
|
||||
if (w < 0.0f)
|
||||
{
|
||||
w = -w; // make VW positive
|
||||
oomag = -oomag; // invert the axis
|
||||
}
|
||||
*x = mQ[VX] * oomag; // normalize the axis
|
||||
*y = mQ[VY] * oomag;
|
||||
*z = mQ[VZ] * oomag;
|
||||
*angle = 2.0f * atan2f(v, w); // get the angle
|
||||
}
|
||||
else
|
||||
{
|
||||
*angle = temp_angle;
|
||||
*x = mQ[VX] * sin_a;
|
||||
*y = mQ[VY] * sin_a;
|
||||
*z = mQ[VZ] * sin_a;
|
||||
*angle = 0.0f; // no rotation
|
||||
*x = 0.0f; // around some dummy axis
|
||||
*y = 0.0f;
|
||||
*z = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
/////////////////////////////
|
||||
#include "llquaternion.h"
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLQuaternion2
|
||||
{
|
||||
public:
|
||||
@@ -84,6 +85,8 @@ public:
|
||||
// Quantize this quaternion to 16 bit precision
|
||||
inline void quantize16();
|
||||
|
||||
inline void mul(const LLQuaternion2& b);
|
||||
|
||||
/////////////////////////
|
||||
// Quaternion inspection
|
||||
/////////////////////////
|
||||
@@ -98,8 +101,8 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
LLVector4a mQ;
|
||||
LL_ALIGN_16(LLVector4a mQ);
|
||||
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -50,6 +50,39 @@ inline LLVector4a& LLQuaternion2::getVector4aRw()
|
||||
return mQ;
|
||||
}
|
||||
|
||||
inline void LLQuaternion2::mul(const LLQuaternion2& b)
|
||||
{
|
||||
static LL_ALIGN_16(const unsigned int signMask[4]) = { 0x0, 0x0, 0x0, 0x80000000 };
|
||||
|
||||
LLVector4a sum1, sum2, prod1, prod2, prod3, prod4;
|
||||
const LLVector4a& va = mQ;
|
||||
const LLVector4a& vb = b.getVector4a();
|
||||
|
||||
// [VX] [VY] [VZ] [VW]
|
||||
//prod1: +wx +wy +wz +ww Bwwww*Axyzw
|
||||
//prod2: +xw +yw +zw -xx Bxyzx*Awwwx [VW] sign flip
|
||||
//prod3: +yz +zx +xy -yy Byzxy*Azxyy [VW] sign flip
|
||||
//prod4: -zy -xz -yx -zz Bzxyz*Ayzzz
|
||||
|
||||
const LLVector4a Bwwww = _mm_shuffle_ps(vb,vb,_MM_SHUFFLE(3,3,3,3));
|
||||
const LLVector4a Bxyzx = _mm_shuffle_ps(vb,vb,_MM_SHUFFLE(0,2,1,0));
|
||||
const LLVector4a Awwwx = _mm_shuffle_ps(va,va,_MM_SHUFFLE(0,3,3,3));
|
||||
const LLVector4a Byzxy = _mm_shuffle_ps(vb,vb,_MM_SHUFFLE(1,0,2,1));
|
||||
const LLVector4a Azxyy = _mm_shuffle_ps(va,va,_MM_SHUFFLE(1,1,0,2));
|
||||
const LLVector4a Bzxyz = _mm_shuffle_ps(vb,vb,_MM_SHUFFLE(2,1,0,2));
|
||||
const LLVector4a Ayzxz = _mm_shuffle_ps(va,va,_MM_SHUFFLE(2,0,2,1));
|
||||
|
||||
prod1.setMul(Bwwww,va);
|
||||
prod2.setMul(Bxyzx,Awwwx);
|
||||
prod3.setMul(Byzxy,Azxyy);
|
||||
prod4.setMul(Bzxyz,Ayzxz);
|
||||
|
||||
sum1.setAdd(prod2,prod3);
|
||||
sum1 = _mm_xor_ps(sum1, _mm_load_ps((const float*)signMask));
|
||||
sum2.setSub(prod1,prod4);
|
||||
mQ.setAdd(sum1,sum2);
|
||||
}
|
||||
|
||||
/////////////////////////
|
||||
// Quaternion modification
|
||||
/////////////////////////
|
||||
|
||||
@@ -1,31 +1,26 @@
|
||||
/**
|
||||
* @file llrect.cpp
|
||||
* @brief LLRect class implementation
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -4,31 +4,25 @@
|
||||
* @date 2006-05-24
|
||||
* @brief Implementation of classes, functions, etc, for using structured data.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2006-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -4,36 +4,28 @@
|
||||
* @date 2009-05-19
|
||||
* @brief Utility classes, functions, etc, for using structured data with math classes.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2009&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2009-2010, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlife.com/developers/opensource/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlife.com/developers/opensource/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LL_LLSDUTIL_MATH_H
|
||||
#define LL_LLSDUTIL_MATH_H
|
||||
|
||||
|
||||
@@ -3,31 +3,25 @@
|
||||
* @author Andrew Meadows
|
||||
* @brief Simple line class that can compute nearest approach between two lines
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2007-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -4,31 +4,25 @@
|
||||
* @author Andrew Meadows
|
||||
* @brief Simple sphere implementation for basic geometric operations
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2007-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,31 +1,25 @@
|
||||
/**
|
||||
* @file lltreenode.h
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2005-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -36,6 +30,7 @@
|
||||
#include "xform.h"
|
||||
#include "llpointer.h"
|
||||
#include "llrefcount.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
template <class T> class LLTreeNode;
|
||||
@@ -62,7 +57,14 @@ public:
|
||||
virtual bool remove(T* data);
|
||||
virtual void notifyRemoval(T* data);
|
||||
virtual U32 getListenerCount() { return mListeners.size(); }
|
||||
virtual LLTreeListener<T>* getListener(U32 index) const { return mListeners[index]; }
|
||||
virtual LLTreeListener<T>* getListener(U32 index) const
|
||||
{
|
||||
if(index < mListeners.size())
|
||||
{
|
||||
return mListeners[index];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
virtual void addListener(LLTreeListener<T>* listener) { mListeners.push_back(listener); }
|
||||
|
||||
protected:
|
||||
|
||||
@@ -85,6 +85,7 @@ public:
|
||||
}
|
||||
|
||||
// Copy words 16-byte blocks from src to dst. Source and destination must not overlap.
|
||||
// Source and dest must be 16-byte aligned and size must be multiple of 16.
|
||||
static void memcpyNonAliased16(F32* __restrict dst, const F32* __restrict src, size_t bytes);
|
||||
|
||||
////////////////////////////////////
|
||||
@@ -127,7 +128,7 @@ public:
|
||||
inline void loadua(const F32* src);
|
||||
|
||||
// Load only three floats beginning at address 'src'. Slowest method.
|
||||
inline void load3(const F32* src);
|
||||
inline void load3(const F32* src, const F32 w=0.f);
|
||||
|
||||
// Store to a 16-byte aligned memory address
|
||||
inline void store4a(F32* dst) const;
|
||||
@@ -169,6 +170,9 @@ public:
|
||||
|
||||
// Set all 4 elements to element i of v, with i NOT known at compile time
|
||||
inline void splat(const LLVector4a& v, U32 i);
|
||||
|
||||
// Sets element N to that of src's element N. Much cleaner than.. {LLVector4Logical mask; mask.clear(); mask.setElement<N>(); target.setSelectWithMask(mask,src,target);}
|
||||
template <int N> inline void copyComponent(const LLVector4a& src);
|
||||
|
||||
// Select bits from sourceIfTrue and sourceIfFalse according to bits in mask
|
||||
inline void setSelectWithMask( const LLVector4Logical& mask, const LLVector4a& sourceIfTrue, const LLVector4a& sourceIfFalse );
|
||||
@@ -281,6 +285,8 @@ public:
|
||||
void quantize8( const LLVector4a& low, const LLVector4a& high );
|
||||
void quantize16( const LLVector4a& low, const LLVector4a& high );
|
||||
|
||||
void negate();
|
||||
|
||||
////////////////////////////////////
|
||||
// LOGICAL
|
||||
////////////////////////////////////
|
||||
|
||||
@@ -41,11 +41,11 @@ inline void LLVector4a::loadua(const F32* src)
|
||||
}
|
||||
|
||||
// Load only three floats beginning at address 'src'. Slowest method.
|
||||
inline void LLVector4a::load3(const F32* src)
|
||||
inline void LLVector4a::load3(const F32* src, const F32 w)
|
||||
{
|
||||
// mQ = { 0.f, src[2], src[1], src[0] } = { W, Z, Y, X }
|
||||
// NB: This differs from the convention of { Z, Y, X, W }
|
||||
mQ = _mm_set_ps(0.f, src[2], src[1], src[0]);
|
||||
mQ = _mm_set_ps(w, src[2], src[1], src[0]);
|
||||
}
|
||||
|
||||
// Store to a 16-byte aligned memory address
|
||||
@@ -154,6 +154,13 @@ inline void LLVector4a::splat(const LLVector4a& v, U32 i)
|
||||
}
|
||||
}
|
||||
|
||||
// Sets element N to that of src's element N
|
||||
template <int N> inline void LLVector4a::copyComponent(const LLVector4a& src)
|
||||
{
|
||||
static const LLVector4Logical mask = _mm_load_ps((F32*)&S_V4LOGICAL_MASK_TABLE[N*4]);
|
||||
setSelectWithMask(mask,src,mQ);
|
||||
}
|
||||
|
||||
// Select bits from sourceIfTrue and sourceIfFalse according to bits in mask
|
||||
inline void LLVector4a::setSelectWithMask( const LLVector4Logical& mask, const LLVector4a& sourceIfTrue, const LLVector4a& sourceIfFalse )
|
||||
{
|
||||
@@ -529,6 +536,11 @@ inline void LLVector4a::clamp( const LLVector4a& low, const LLVector4a& high )
|
||||
setSelectWithMask( lowMask, low, *this );
|
||||
}
|
||||
|
||||
inline void LLVector4a::negate()
|
||||
{
|
||||
static LL_ALIGN_16(const U32 signMask[4]) = {0x80000000, 0x80000000, 0x80000000, 0x80000000 };
|
||||
mQ = _mm_xor_ps(*reinterpret_cast<const LLQuad*>(signMask), mQ);
|
||||
}
|
||||
|
||||
////////////////////////////////////
|
||||
// LOGICAL
|
||||
|
||||
@@ -79,7 +79,7 @@ public:
|
||||
{
|
||||
static const LL_ALIGN_16(U32 allOnes[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
|
||||
ll_assert_aligned(allOnes,16);
|
||||
mQ = _mm_andnot_ps( mQ, *(LLQuad*)(allOnes) );
|
||||
mQ = _mm_andnot_ps( mQ, _mm_load_ps((F32*)(allOnes)));
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ public:
|
||||
|
||||
template<int N> void setElement()
|
||||
{
|
||||
mQ = _mm_or_ps( mQ, *reinterpret_cast<const LLQuad*>(S_V4LOGICAL_MASK_TABLE + 4*N) );
|
||||
mQ = _mm_or_ps( mQ, _mm_load_ps( (F32*)&S_V4LOGICAL_MASK_TABLE[4*N] ) );
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -50,7 +50,6 @@
|
||||
#include "llstl.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llvector4a.h"
|
||||
#include "llmatrix4a.h"
|
||||
#include "lltimer.h"
|
||||
|
||||
#define DEBUG_SILHOUETTE_BINORMALS 0
|
||||
@@ -1094,8 +1093,6 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai
|
||||
}
|
||||
}
|
||||
|
||||
//genNormals(params);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -1651,7 +1648,7 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
|
||||
F32 t = (F32)i * mStep;
|
||||
mPath[i].mPos.set(0,
|
||||
lerp(0, -sin(F_PI*params.getTwist()*t)*0.5f,t),
|
||||
lerp(-0.5, cos(F_PI*params.getTwist()*t)*0.5f,t));
|
||||
lerp(-0.5f, cos(F_PI*params.getTwist()*t)*0.5f,t));
|
||||
mPath[i].mScale.set(lerp(1,params.getScale().mV[0],t),
|
||||
lerp(1,params.getScale().mV[1],t), 0,1);
|
||||
mPath[i].mTexT = t;
|
||||
@@ -2186,7 +2183,7 @@ BOOL LLVolume::generate()
|
||||
0, 0, scale[2], 0,
|
||||
0, 0, 0, 1 };
|
||||
|
||||
LLMatrix4 rot((F32*) mPathp->mPath[s].mRot.mMatrix);
|
||||
LLMatrix4 rot(mPathp->mPath[s].mRot.getF32ptr());
|
||||
LLMatrix4 scale_mat(sc);
|
||||
|
||||
scale_mat *= rot;
|
||||
@@ -2374,7 +2371,7 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
|
||||
LLSD mdl;
|
||||
if (!unzip_llsd(mdl, is, size))
|
||||
{
|
||||
LL_DEBUGS("MeshStreaming") << "Failed to unzip LLSD blob for LoD, will probably fetch from sim again." << llendl;
|
||||
LL_DEBUGS("MeshStreaming") << "Failed to unzip LLSD blob for LoD, will probably fetch from sim again." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3672,16 +3669,14 @@ S32 LLVolume::getNumTriangles(S32* vcount) const
|
||||
void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
|
||||
std::vector<LLVector3> &normals,
|
||||
const LLVector3& obj_cam_vec_in,
|
||||
const LLMatrix4& mat_in,
|
||||
const LLMatrix3& norm_mat_in,
|
||||
const LLMatrix4a& mat_in,
|
||||
const LLMatrix4a& norm_mat_in,
|
||||
S32 face_mask)
|
||||
{
|
||||
LLMatrix4a mat;
|
||||
mat.loadu(mat_in);
|
||||
const LLMatrix4a& mat = mat_in;
|
||||
|
||||
const LLMatrix4a& norm_mat = norm_mat_in;
|
||||
|
||||
LLMatrix4a norm_mat;
|
||||
norm_mat.loadu(norm_mat_in);
|
||||
|
||||
LLVector4a obj_cam_vec;
|
||||
obj_cam_vec.load3(obj_cam_vec_in.mV);
|
||||
|
||||
@@ -5617,7 +5612,6 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
|
||||
else
|
||||
{
|
||||
resizeVertices(num_vertices);
|
||||
|
||||
if (!partial_build)
|
||||
{
|
||||
resizeIndices(num_indices);
|
||||
@@ -5722,6 +5716,7 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
|
||||
|
||||
cuv = (min_uv + max_uv)*0.5f;
|
||||
|
||||
|
||||
VertexData vd;
|
||||
vd.setPosition(*mCenter);
|
||||
vd.mTexCoord = cuv;
|
||||
@@ -6770,7 +6765,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//adapted from Lengyel, Eric. <EFBFBD>Computing Tangent Space Basis Vectors for an Arbitrary Mesh<EFBFBD>. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html
|
||||
//adapted from Lengyel, Eric. "Computing Tangent Space Basis Vectors for an Arbitrary Mesh". Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html
|
||||
void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVector4a *normal,
|
||||
const LLVector2 *texcoord, U32 triangleCount, const U16* index_array, LLVector4a *tangent)
|
||||
{
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
#ifndef LL_LLVOLUME_H
|
||||
#define LL_LLVOLUME_H
|
||||
|
||||
#ifdef IN_PCH
|
||||
#error "llvolume.h should not be in pch include chain."
|
||||
#endif
|
||||
#include <iostream>
|
||||
|
||||
class LLProfileParams;
|
||||
@@ -747,10 +750,10 @@ public:
|
||||
class PathPt
|
||||
{
|
||||
public:
|
||||
LLMatrix4a mRot;
|
||||
LLVector4a mPos;
|
||||
LL_ALIGN_16(LLMatrix4a mRot);
|
||||
LL_ALIGN_16(LLVector4a mPos);
|
||||
|
||||
LLVector4a mScale;
|
||||
LL_ALIGN_16(LLVector4a mScale);
|
||||
F32 mTexT;
|
||||
F32 pad[3]; //for alignment
|
||||
PathPt()
|
||||
@@ -1017,8 +1020,8 @@ public:
|
||||
void generateSilhouetteVertices(std::vector<LLVector3> &vertices,
|
||||
std::vector<LLVector3> &normals,
|
||||
const LLVector3& view_vec,
|
||||
const LLMatrix4& mat,
|
||||
const LLMatrix3& norm_mat,
|
||||
const LLMatrix4a& mat,
|
||||
const LLMatrix4a& norm_mat,
|
||||
S32 face_index);
|
||||
|
||||
//get the face index of the face that intersects with the given line segment at the point
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file llvolumemgr.h
|
||||
* @brief LLVolumeMgr class.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2002-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -127,13 +127,14 @@ public:
|
||||
LL_ALIGN_16(LLVector4a mExtents[2]); // extents (min, max) of this node and all its children
|
||||
};
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLOctreeTriangleRayIntersect : public LLOctreeTraveler<LLVolumeTriangle>
|
||||
{
|
||||
public:
|
||||
const LLVolumeFace* mFace;
|
||||
LLVector4a mStart;
|
||||
LLVector4a mDir;
|
||||
LLVector4a mEnd;
|
||||
LL_ALIGN_16(LLVector4a mStart);
|
||||
LL_ALIGN_16(LLVector4a mDir);
|
||||
LL_ALIGN_16(LLVector4a mEnd);
|
||||
LLVector4a* mIntersection;
|
||||
LLVector2* mTexCoord;
|
||||
LLVector4a* mNormal;
|
||||
@@ -148,7 +149,7 @@ public:
|
||||
void traverse(const LLOctreeNode<LLVolumeTriangle>* node);
|
||||
|
||||
virtual void visit(const LLOctreeNode<LLVolumeTriangle>* node);
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
class LLVolumeOctreeValidate : public LLOctreeTraveler<LLVolumeTriangle>
|
||||
{
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file m3math.cpp
|
||||
* @brief LLMatrix3 class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file m3math.h
|
||||
* @brief LLMatrix3 class header file.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file m4math.cpp
|
||||
* @brief LLMatrix4 class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -684,37 +678,6 @@ const LLMatrix4& LLMatrix4::initMatrix(const LLMatrix3 &mat, const LLVector4 &
|
||||
|
||||
// LLMatrix4 Operators
|
||||
|
||||
|
||||
/* Not implemented to help enforce code consistency with the syntax of
|
||||
row-major notation. This is a Good Thing.
|
||||
LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b)
|
||||
{
|
||||
// Operate "to the right" on column-vector b
|
||||
LLVector4 vec;
|
||||
vec.mV[VX] = a.mMatrix[VX][VX] * b.mV[VX] +
|
||||
a.mMatrix[VY][VX] * b.mV[VY] +
|
||||
a.mMatrix[VZ][VX] * b.mV[VZ] +
|
||||
a.mMatrix[VW][VX] * b.mV[VW];
|
||||
|
||||
vec.mV[VY] = a.mMatrix[VX][VY] * b.mV[VX] +
|
||||
a.mMatrix[VY][VY] * b.mV[VY] +
|
||||
a.mMatrix[VZ][VY] * b.mV[VZ] +
|
||||
a.mMatrix[VW][VY] * b.mV[VW];
|
||||
|
||||
vec.mV[VZ] = a.mMatrix[VX][VZ] * b.mV[VX] +
|
||||
a.mMatrix[VY][VZ] * b.mV[VY] +
|
||||
a.mMatrix[VZ][VZ] * b.mV[VZ] +
|
||||
a.mMatrix[VW][VZ] * b.mV[VW];
|
||||
|
||||
vec.mV[VW] = a.mMatrix[VX][VW] * b.mV[VX] +
|
||||
a.mMatrix[VY][VW] * b.mV[VY] +
|
||||
a.mMatrix[VZ][VW] * b.mV[VZ] +
|
||||
a.mMatrix[VW][VW] * b.mV[VW];
|
||||
return vec;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b)
|
||||
{
|
||||
// Operate "to the left" on row-vector a
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file m4math.h
|
||||
* @brief LLMatrix4 class header file.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -229,9 +223,6 @@ public:
|
||||
// Operators
|
||||
//
|
||||
|
||||
// Not implemented to enforce code that agrees with symbolic syntax
|
||||
// friend LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b); // Apply rotation a to vector b
|
||||
|
||||
// friend inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b); // Return a * b
|
||||
friend LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b); // Return transform of vector a by matrix b
|
||||
friend const LLVector3 operator*(const LLVector3 &a, const LLMatrix4 &b); // Return full transform of a by matrix b
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file raytrace.cpp
|
||||
* @brief Functions called by box object scripts.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file raytrace.h
|
||||
* @brief Ray intersection tests for primitives.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v2math.cpp
|
||||
* @brief LLVector2 class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v2math.h
|
||||
* @brief LLVector2 class header file.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v3color.cpp
|
||||
* @brief LLColor3 class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v3color.h
|
||||
* @brief LLColor3 class header file.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -39,6 +33,7 @@ class LLVector4;
|
||||
#include "llerror.h"
|
||||
#include "llmath.h"
|
||||
#include "llsd.h"
|
||||
#include <string.h>
|
||||
|
||||
// LLColor3 = |r g b|
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v3dmath.cpp
|
||||
* @brief LLVector3d class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -72,17 +72,22 @@ class LLVector3d
|
||||
BOOL clamp(const F64 min, const F64 max); // Clamps all values to (min,max), returns TRUE if data changed
|
||||
BOOL abs(); // sets all values to absolute value of original value (first octant), returns TRUE if changed
|
||||
|
||||
inline const LLVector3d& clearVec(); // Clears LLVector3d to (0, 0, 0, 1)
|
||||
inline const LLVector3d& clear(); // Clears LLVector3d to (0, 0, 0, 1)
|
||||
inline const LLVector3d& clearVec(); // deprecated
|
||||
inline const LLVector3d& setZero(); // Zero LLVector3d to (0, 0, 0, 0)
|
||||
inline const LLVector3d& zeroVec(); // deprecated
|
||||
inline const LLVector3d& setVec(const F64 x, const F64 y, const F64 z); // Sets LLVector3d to (x, y, z, 1)
|
||||
inline const LLVector3d& setVec(const LLVector3d &vec); // Sets LLVector3d to vec
|
||||
inline const LLVector3d& setVec(const F64 *vec); // Sets LLVector3d to vec
|
||||
inline const LLVector3d& setVec(const LLVector3 &vec);
|
||||
inline const LLVector3d& set(const F64 x, const F64 y, const F64 z); // Sets LLVector3d to (x, y, z, 1)
|
||||
inline const LLVector3d& set(const LLVector3d &vec); // Sets LLVector3d to vec
|
||||
inline const LLVector3d& set(const F64 *vec); // Sets LLVector3d to vec
|
||||
inline const LLVector3d& set(const LLVector3 &vec);
|
||||
inline const LLVector3d& setVec(const F64 x, const F64 y, const F64 z); // deprecated
|
||||
inline const LLVector3d& setVec(const LLVector3d &vec); // deprecated
|
||||
inline const LLVector3d& setVec(const F64 *vec); // deprecated
|
||||
inline const LLVector3d& setVec(const LLVector3 &vec); // deprecated
|
||||
|
||||
F64 magVec() const; // Returns magnitude of LLVector3d
|
||||
F64 magVecSquared() const; // Returns magnitude squared of LLVector3d
|
||||
inline F64 normVec(); // Normalizes and returns the magnitude of LLVector3d
|
||||
F64 magVec() const; // deprecated
|
||||
F64 magVecSquared() const; // deprecated
|
||||
inline F64 normVec(); // deprecated
|
||||
|
||||
F64 length() const; // Returns magnitude of LLVector3d
|
||||
F64 lengthSquared() const; // Returns magnitude squared of LLVector3d
|
||||
@@ -127,7 +132,15 @@ class LLVector3d
|
||||
|
||||
typedef LLVector3d LLGlobalVec;
|
||||
|
||||
const LLVector3d &LLVector3d::setVec(const LLVector3 &vec)
|
||||
inline const LLVector3d &LLVector3d::set(const LLVector3 &vec)
|
||||
{
|
||||
mdV[0] = vec.mV[0];
|
||||
mdV[1] = vec.mV[1];
|
||||
mdV[2] = vec.mV[2];
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline const LLVector3d &LLVector3d::setVec(const LLVector3 &vec)
|
||||
{
|
||||
mdV[0] = vec.mV[0];
|
||||
mdV[1] = vec.mV[1];
|
||||
@@ -184,6 +197,14 @@ inline BOOL LLVector3d::isFinite() const
|
||||
|
||||
// Clear and Assignment Functions
|
||||
|
||||
inline const LLVector3d& LLVector3d::clear(void)
|
||||
{
|
||||
mdV[0] = 0.f;
|
||||
mdV[1] = 0.f;
|
||||
mdV[2]= 0.f;
|
||||
return (*this);
|
||||
}
|
||||
|
||||
inline const LLVector3d& LLVector3d::clearVec(void)
|
||||
{
|
||||
mdV[0] = 0.f;
|
||||
@@ -208,6 +229,30 @@ inline const LLVector3d& LLVector3d::zeroVec(void)
|
||||
return (*this);
|
||||
}
|
||||
|
||||
inline const LLVector3d& LLVector3d::set(const F64 x, const F64 y, const F64 z)
|
||||
{
|
||||
mdV[VX] = x;
|
||||
mdV[VY] = y;
|
||||
mdV[VZ] = z;
|
||||
return (*this);
|
||||
}
|
||||
|
||||
inline const LLVector3d& LLVector3d::set(const LLVector3d &vec)
|
||||
{
|
||||
mdV[0] = vec.mdV[0];
|
||||
mdV[1] = vec.mdV[1];
|
||||
mdV[2] = vec.mdV[2];
|
||||
return (*this);
|
||||
}
|
||||
|
||||
inline const LLVector3d& LLVector3d::set(const F64 *vec)
|
||||
{
|
||||
mdV[0] = vec[0];
|
||||
mdV[1] = vec[1];
|
||||
mdV[2] = vec[2];
|
||||
return (*this);
|
||||
}
|
||||
|
||||
inline const LLVector3d& LLVector3d::setVec(const F64 x, const F64 y, const F64 z)
|
||||
{
|
||||
mdV[VX] = x;
|
||||
@@ -472,4 +517,15 @@ inline LLVector3d projected_vec(const LLVector3d &a, const LLVector3d &b)
|
||||
return project_axis * (a * project_axis);
|
||||
}
|
||||
|
||||
inline LLVector3d inverse_projected_vec(const LLVector3d& a, const LLVector3d& b)
|
||||
{
|
||||
LLVector3d normalized_a = a;
|
||||
normalized_a.normalize();
|
||||
LLVector3d normalized_b = b;
|
||||
F64 b_length = normalized_b.normalize();
|
||||
|
||||
F64 dot_product = normalized_a * normalized_b;
|
||||
return normalized_a * (b_length / dot_product);
|
||||
}
|
||||
|
||||
#endif // LL_V3DMATH_H
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v3math.cpp
|
||||
* @brief LLVector3 class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -159,6 +159,7 @@ F32 dist_vec(const LLVector3 &a, const LLVector3 &b); // Returns distance betwe
|
||||
F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b
|
||||
F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component
|
||||
LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b
|
||||
LLVector3 inverse_projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a scaled such that projected_vec(inverse_projected_vec(a, b), b) == b;
|
||||
LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
|
||||
LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
|
||||
LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
|
||||
@@ -490,9 +491,27 @@ inline F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b)
|
||||
|
||||
inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
|
||||
{
|
||||
LLVector3 project_axis = b;
|
||||
project_axis.normalize();
|
||||
return project_axis * (a * project_axis);
|
||||
F32 bb = b * b;
|
||||
if (bb > FP_MAG_THRESHOLD * FP_MAG_THRESHOLD)
|
||||
{
|
||||
return ((a * b) / bb) * b;
|
||||
}
|
||||
else
|
||||
{
|
||||
return b.zero;
|
||||
}
|
||||
}
|
||||
|
||||
inline LLVector3 inverse_projected_vec(const LLVector3& a, const LLVector3& b)
|
||||
{
|
||||
LLVector3 normalized_a = a;
|
||||
normalized_a.normalize();
|
||||
LLVector3 normalized_b = b;
|
||||
F32 b_length = normalized_b.normalize();
|
||||
|
||||
F32 dot_product = normalized_a * normalized_b;
|
||||
//NB: if a _|_ b, then returns an infinite vector
|
||||
return normalized_a * (b_length / dot_product);
|
||||
}
|
||||
|
||||
inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b)
|
||||
@@ -556,15 +575,13 @@ inline void update_min_max(LLVector3& min, LLVector3& max, const F32* pos)
|
||||
|
||||
inline F32 angle_between(const LLVector3& a, const LLVector3& b)
|
||||
{
|
||||
LLVector3 an = a;
|
||||
LLVector3 bn = b;
|
||||
an.normalize();
|
||||
bn.normalize();
|
||||
F32 cosine = an * bn;
|
||||
F32 angle = (cosine >= 1.0f) ? 0.0f :
|
||||
(cosine <= -1.0f) ? F_PI :
|
||||
(F32)acos(cosine);
|
||||
return angle;
|
||||
F32 ab = a * b; // dotproduct
|
||||
if (ab == -0.0f)
|
||||
{
|
||||
ab = 0.0f; // get rid of negative zero
|
||||
}
|
||||
LLVector3 c = a % b; // crossproduct
|
||||
return atan2f(sqrtf(c * c), ab); // return the angle
|
||||
}
|
||||
|
||||
inline BOOL are_parallel(const LLVector3 &a, const LLVector3 &b, F32 epsilon)
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v4coloru.cpp
|
||||
* @brief LLColor4U class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v4math.cpp
|
||||
* @brief LLVector4 class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,31 +2,25 @@
|
||||
* @file v4math.h
|
||||
* @brief LLVector4 class header file.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2000-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,31 +1,25 @@
|
||||
/**
|
||||
* @file xform.cpp
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -42,7 +36,7 @@ LLXform::~LLXform()
|
||||
{
|
||||
}
|
||||
|
||||
// Link optimization - don't inline these llwarns
|
||||
// Link optimization - don't inline these LL_WARNS()
|
||||
void LLXform::warn(const char* const msg)
|
||||
{
|
||||
llwarns << msg << llendl;
|
||||
@@ -96,30 +90,29 @@ void LLXformMatrix::updateMatrix(BOOL update_bounds)
|
||||
{
|
||||
update();
|
||||
|
||||
mWorldMatrix.initAll(mScale, mWorldRotation, mWorldPosition);
|
||||
LLMatrix4 world_matrix;
|
||||
world_matrix.initAll(mScale, mWorldRotation, mWorldPosition);
|
||||
mWorldMatrix.loadu(world_matrix);
|
||||
|
||||
if (update_bounds && (mChanged & MOVED))
|
||||
{
|
||||
mMin.mV[0] = mMax.mV[0] = mWorldMatrix.mMatrix[3][0];
|
||||
mMin.mV[1] = mMax.mV[1] = mWorldMatrix.mMatrix[3][1];
|
||||
mMin.mV[2] = mMax.mV[2] = mWorldMatrix.mMatrix[3][2];
|
||||
mMax = mMin = mWorldMatrix.getRow<3>();
|
||||
|
||||
F32 f0 = (fabs(mWorldMatrix.mMatrix[0][0])+fabs(mWorldMatrix.mMatrix[1][0])+fabs(mWorldMatrix.mMatrix[2][0])) * 0.5f;
|
||||
F32 f1 = (fabs(mWorldMatrix.mMatrix[0][1])+fabs(mWorldMatrix.mMatrix[1][1])+fabs(mWorldMatrix.mMatrix[2][1])) * 0.5f;
|
||||
F32 f2 = (fabs(mWorldMatrix.mMatrix[0][2])+fabs(mWorldMatrix.mMatrix[1][2])+fabs(mWorldMatrix.mMatrix[2][2])) * 0.5f;
|
||||
LLVector4a total_sum,sum1,sum2;
|
||||
total_sum.setAbs(mWorldMatrix.getRow<0>());
|
||||
sum1.setAbs(mWorldMatrix.getRow<1>());
|
||||
sum2.setAbs(mWorldMatrix.getRow<2>());
|
||||
sum1.add(sum2);
|
||||
total_sum.add(sum1);
|
||||
total_sum.mul(.5f);
|
||||
|
||||
mMin.mV[0] -= f0;
|
||||
mMin.mV[1] -= f1;
|
||||
mMin.mV[2] -= f2;
|
||||
|
||||
mMax.mV[0] += f0;
|
||||
mMax.mV[1] += f1;
|
||||
mMax.mV[2] += f2;
|
||||
mMax.add(total_sum);
|
||||
mMin.sub(total_sum);
|
||||
}
|
||||
}
|
||||
|
||||
void LLXformMatrix::getMinMax(LLVector3& min, LLVector3& max) const
|
||||
{
|
||||
min = mMin;
|
||||
max = mMax;
|
||||
min.set(mMin.getF32ptr());
|
||||
max.set(mMax.getF32ptr());
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include "v3math.h"
|
||||
#include "m4math.h"
|
||||
#include "llmatrix4a.h"
|
||||
#include "llquaternion.h"
|
||||
|
||||
const F32 MAX_OBJECT_Z = 4096.f; // should match REGION_HEIGHT_METERS, Pre-havok4: 768.f
|
||||
@@ -103,9 +104,9 @@ public:
|
||||
inline void setRotation(const F32 x, const F32 y, const F32 z, const F32 s);
|
||||
|
||||
// Above functions must be inline for speed, but also
|
||||
// need to emit warnings. llwarns causes inline LLError::CallSite
|
||||
// need to emit warnings. LL_WARNS() causes inline LLError::CallSite
|
||||
// static objects that make more work for the linker.
|
||||
// Avoid inline llwarns by calling this function.
|
||||
// Avoid inline LL_WARNS() by calling this function.
|
||||
void warn(const char* const msg);
|
||||
|
||||
void setChanged(const U32 bits) { mChanged |= bits; }
|
||||
@@ -130,20 +131,21 @@ public:
|
||||
const LLVector3& getWorldPosition() const { return mWorldPosition; }
|
||||
};
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLXformMatrix : public LLXform
|
||||
{
|
||||
public:
|
||||
LLXformMatrix() : LLXform() {};
|
||||
virtual ~LLXformMatrix();
|
||||
|
||||
const LLMatrix4& getWorldMatrix() const { return mWorldMatrix; }
|
||||
void setWorldMatrix (const LLMatrix4& mat) { mWorldMatrix = mat; }
|
||||
const LLMatrix4a& getWorldMatrix() const { return mWorldMatrix; }
|
||||
void setWorldMatrix (const LLMatrix4a& mat) { mWorldMatrix = mat; }
|
||||
|
||||
void init()
|
||||
{
|
||||
mWorldMatrix.setIdentity();
|
||||
mMin.clearVec();
|
||||
mMax.clearVec();
|
||||
mMin.clear();
|
||||
mMax.clear();
|
||||
|
||||
LLXform::init();
|
||||
}
|
||||
@@ -153,11 +155,11 @@ public:
|
||||
void getMinMax(LLVector3& min,LLVector3& max) const;
|
||||
|
||||
protected:
|
||||
LLMatrix4 mWorldMatrix;
|
||||
LLVector3 mMin;
|
||||
LLVector3 mMax;
|
||||
LL_ALIGN_16(LLMatrix4a mWorldMatrix);
|
||||
LL_ALIGN_16(LLVector4a mMin);
|
||||
LL_ALIGN_16(LLVector4a mMax);
|
||||
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
BOOL LLXform::setParent(LLXform* parent)
|
||||
{
|
||||
|
||||
@@ -905,7 +905,7 @@ AIHTTPTimeoutPolicy const* AIHTTPTimeoutPolicy::getTimeoutPolicyByName(std::stri
|
||||
#define P2(n, b) AIHTTPTimeoutPolicy n##_timeout(#n, b)
|
||||
|
||||
// Policy name Policy
|
||||
P(accountingCostResponder);
|
||||
//P(accountingCostResponder);
|
||||
P(agentStateResponder);
|
||||
P(appearanceChangeMetricsResponder);
|
||||
P(assetUploadResponder);
|
||||
@@ -934,7 +934,9 @@ P(fetchScriptLimitsRegionDetailsResponder);
|
||||
P(fetchScriptLimitsRegionInfoResponder);
|
||||
P(fetchScriptLimitsRegionSummaryResponder);
|
||||
P(fnPtrResponder);
|
||||
P(floaterPermsResponder);
|
||||
P2(gamingDataReceived, transfer_22s_connect_10s);
|
||||
P(groupBanDataResponder);
|
||||
P2(groupMemberDataResponder, transfer_300s);
|
||||
P2(groupProposalBallotResponder, transfer_300s);
|
||||
P(homeLocationResponder);
|
||||
@@ -991,4 +993,4 @@ P(webProfileResponders);
|
||||
P(wholeModelFeeResponder);
|
||||
P(wholeModelUploadResponder);
|
||||
P2(XMLRPCResponder, connect_40s);
|
||||
P2(crashLoggerResponder, transfer_300s);
|
||||
P2(crashLoggerResponder, transfer_300s);
|
||||
|
||||
@@ -95,7 +95,7 @@ class AIHTTPTimeoutPolicy {
|
||||
void sanity_checks(void) const;
|
||||
|
||||
// Accessors.
|
||||
char const* name(void) const { return mName; }
|
||||
char const* name(void) const { return mName ? mName : "AIHTTPTimeoutPolicyBase"; }
|
||||
U16 getConnectTimeout(std::string const& hostname) const;
|
||||
U16 getDNSLookup(void) const { return mDNSLookupGrace; }
|
||||
U16 getConnect(void) const { return mMaximumConnectTime; }
|
||||
|
||||
@@ -192,13 +192,13 @@ public:
|
||||
: mAgentIDs(agent_ids)
|
||||
{ }
|
||||
|
||||
/*virtual*/ void result(const LLSD& content)
|
||||
/*virtual*/ void httpSuccess(void)
|
||||
{
|
||||
// Pull expiration out of headers if available
|
||||
F64 expires = LLAvatarNameCache::nameExpirationFromHeaders(mReceivedHeaders);
|
||||
F64 now = LLFrameTimer::getTotalSeconds();
|
||||
|
||||
LLSD agents = content["agents"];
|
||||
LLSD agents = mContent["agents"];
|
||||
LLSD::array_const_iterator it = agents.beginArray();
|
||||
for ( ; it != agents.endArray(); ++it)
|
||||
{
|
||||
@@ -228,7 +228,7 @@ public:
|
||||
}
|
||||
|
||||
// Same logic as error response case
|
||||
LLSD unresolved_agents = content["bad_ids"];
|
||||
LLSD unresolved_agents = mContent["bad_ids"];
|
||||
S32 num_unresolved = unresolved_agents.size();
|
||||
if (num_unresolved > 0)
|
||||
{
|
||||
@@ -252,13 +252,13 @@ public:
|
||||
<< LL_ENDL;
|
||||
}
|
||||
|
||||
/*virtual*/ void error(U32 status, const std::string& reason)
|
||||
/*virtual*/ void httpFailure(void)
|
||||
{
|
||||
// If there's an error, it might be caused by PeopleApi,
|
||||
// or when loading textures on startup and using a very slow
|
||||
// network, this query may time out.
|
||||
// What we should do depends on whether or not we have a cached name
|
||||
LL_WARNS("AvNameCache") << "LLAvatarNameResponder::error " << status << " " << reason
|
||||
LL_WARNS("AvNameCache") << "LLAvatarNameResponder::httpFailure " << mStatus << " " << mReason
|
||||
<< LL_ENDL;
|
||||
|
||||
// Add dummy records for any agent IDs in this request that we do not have cached already
|
||||
@@ -794,6 +794,7 @@ void LLAvatarNameCache::setUseDisplayNames(bool use)
|
||||
if (use != sUseDisplayNames)
|
||||
{
|
||||
sUseDisplayNames = use;
|
||||
LL_DEBUGS("AvNameCache") << "Display names are now: " << (use ? "on" : "off") << LL_ENDL;
|
||||
// flush our cache
|
||||
sCache.clear();
|
||||
|
||||
|
||||
@@ -243,7 +243,9 @@ bool LLHTTPClient::getByteRange(std::string const& url, AIHTTPHeaders& headers,
|
||||
{
|
||||
if (offset > 0 || bytes > 0)
|
||||
{
|
||||
headers.addHeader("Range", llformat("bytes=%d-%d", offset, offset + bytes - 1));
|
||||
int const range_end = offset + bytes - 1;
|
||||
char const* const range_format = (range_end >= HTTP_REQUESTS_RANGE_END_MAX) ? "bytes=%d-" : "bytes=%d-%d";
|
||||
headers.addHeader("Range", llformat(range_format, offset, range_end));
|
||||
}
|
||||
request(url, HTTP_GET, NULL, responder, headers, NULL/*,*/ DEBUG_CURLIO_PARAM(debug));
|
||||
}
|
||||
@@ -310,36 +312,36 @@ AIHTTPTimeoutPolicy const& LLHTTPClient::ResponderBase::getHTTPTimeoutPolicy(voi
|
||||
return AIHTTPTimeoutPolicy::getDebugSettingsCurlTimeout();
|
||||
}
|
||||
|
||||
void LLHTTPClient::ResponderBase::decode_llsd_body(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer, LLSD& content)
|
||||
void LLHTTPClient::ResponderBase::decode_llsd_body(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
{
|
||||
AICurlInterface::Stats::llsd_body_count++;
|
||||
if (is_internal_http_error(status))
|
||||
if (is_internal_http_error(mStatus))
|
||||
{
|
||||
// In case of an internal error (ie, a curl error), a description of the (curl) error is the best we can do.
|
||||
// In any case, the body if anything was received at all, can not be relied upon.
|
||||
content = reason;
|
||||
mContent = mReason;
|
||||
return;
|
||||
}
|
||||
// If the status indicates success (and we get here) then we expect the body to be LLSD.
|
||||
bool const should_be_llsd = (200 <= status && status < 300);
|
||||
bool const should_be_llsd = isGoodStatus(mStatus);
|
||||
if (should_be_llsd)
|
||||
{
|
||||
LLBufferStream istr(channels, buffer.get());
|
||||
if (LLSDSerialize::fromXML(content, istr) == LLSDParser::PARSE_FAILURE)
|
||||
if (LLSDSerialize::fromXML(mContent, istr) == LLSDParser::PARSE_FAILURE)
|
||||
{
|
||||
// Unfortunately we can't show the body of the message... I think this is a pretty serious error
|
||||
// though, so if this ever happens it has to be investigated by making a copy of the buffer
|
||||
// before serializing it, as is done below.
|
||||
llwarns << "Failed to deserialize LLSD. " << mURL << " [" << status << "]: " << reason << llendl;
|
||||
llwarns << "Failed to deserialize LLSD. " << mURL << " [" << mStatus << "]: " << mReason << llendl;
|
||||
AICurlInterface::Stats::llsd_body_parse_error++;
|
||||
}
|
||||
// LLSDSerialize::fromXML destructed buffer, we can't initialize content now.
|
||||
// LLSDSerialize::fromXML destructed buffer, we can't initialize mContent now.
|
||||
return;
|
||||
}
|
||||
// Put the body in content as-is.
|
||||
// Put the body in mContent as-is.
|
||||
std::stringstream ss;
|
||||
buffer->writeChannelTo(ss, channels.in());
|
||||
content = ss.str();
|
||||
mContent = ss.str();
|
||||
#ifdef SHOW_ASSERT
|
||||
if (!should_be_llsd)
|
||||
{
|
||||
@@ -355,7 +357,7 @@ void LLHTTPClient::ResponderBase::decode_llsd_body(U32 status, std::string const
|
||||
LLSDSerialize::fromXML(dummy, ss) > 0;
|
||||
if (server_sent_llsd_with_http_error)
|
||||
{
|
||||
llwarns << "The server sent us a response with http status " << status << " and LLSD(!) body: \"" << ss.str() << "\"!" << llendl;
|
||||
llwarns << "The server sent us a response with http status " << mStatus << " and LLSD(!) body: \"" << ss.str() << "\"!" << llendl;
|
||||
}
|
||||
// This is not really an error, and it has been known to happen before. It just normally never happens (at the moment)
|
||||
// and therefore warrants an investigation. Linden Lab (or other grids) might start to send error messages
|
||||
@@ -368,14 +370,14 @@ void LLHTTPClient::ResponderBase::decode_llsd_body(U32 status, std::string const
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLHTTPClient::ResponderBase::decode_raw_body(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer, std::string& content)
|
||||
void LLHTTPClient::ResponderBase::decode_raw_body(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer, std::string& content)
|
||||
{
|
||||
AICurlInterface::Stats::raw_body_count++;
|
||||
if (is_internal_http_error(status))
|
||||
if (is_internal_http_error(mStatus))
|
||||
{
|
||||
// In case of an internal error (ie, a curl error), a description of the (curl) error is the best we can do.
|
||||
// In any case, the body if anything was received at all, can not be relied upon.
|
||||
content = reason;
|
||||
content = mReason;
|
||||
return;
|
||||
}
|
||||
LLMutexLock lock(buffer->getMutex());
|
||||
@@ -407,19 +409,43 @@ std::string const& LLHTTPClient::ResponderBase::get_cookie(std::string const& ke
|
||||
return empty_dummy;
|
||||
}
|
||||
|
||||
std::string LLHTTPClient::ResponderBase::dumpResponse(void) const
|
||||
{
|
||||
std::ostringstream s;
|
||||
s << "[responder:" << getName() << "] "
|
||||
<< "[URL:" << mURL << "] "
|
||||
<< "[status:" << mStatus << "] "
|
||||
<< "[reason:" << mReason << "] ";
|
||||
|
||||
AIHTTPReceivedHeaders::range_type content_type;
|
||||
if (mReceivedHeaders.getValues("content-type", content_type))
|
||||
{
|
||||
for (AIHTTPReceivedHeaders::iterator_type iter = content_type.first; iter != content_type.second; ++iter)
|
||||
{
|
||||
s << "[content-type:" << iter->second << "] ";
|
||||
}
|
||||
}
|
||||
|
||||
if (mContent.isDefined())
|
||||
{
|
||||
s << "[content:" << LLSDOStreamer<LLSDXMLFormatter>(mContent, LLSDFormatter::OPTIONS_PRETTY) << "]";
|
||||
}
|
||||
|
||||
return s.str();
|
||||
}
|
||||
|
||||
// Called with HTML body.
|
||||
// virtual
|
||||
void LLHTTPClient::ResponderWithCompleted::completedRaw(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
void LLHTTPClient::ResponderWithCompleted::completedRaw(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
{
|
||||
LLSD content;
|
||||
decode_llsd_body(status, reason, channels, buffer, content);
|
||||
decode_llsd_body(channels, buffer);
|
||||
|
||||
// Allow derived class to override at this point.
|
||||
completed(status, reason, content);
|
||||
httpCompleted();
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLHTTPClient::ResponderWithCompleted::completed(U32 status, std::string const& reason, LLSD const& content)
|
||||
void LLHTTPClient::ResponderWithCompleted::httpCompleted(void)
|
||||
{
|
||||
// Either completedRaw() or this method must be overridden by the derived class. Hence, we should never get here.
|
||||
llassert_always(false);
|
||||
@@ -429,36 +455,31 @@ void LLHTTPClient::ResponderWithCompleted::completed(U32 status, std::string con
|
||||
void LLHTTPClient::ResponderWithResult::finished(CURLcode code, U32 http_status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
{
|
||||
mCode = code;
|
||||
mStatus = http_status;
|
||||
mReason = reason;
|
||||
|
||||
LLSD content;
|
||||
decode_llsd_body(http_status, reason, channels, buffer, content);
|
||||
// Fill mContent.
|
||||
decode_llsd_body(channels, buffer);
|
||||
|
||||
// HTTP status good?
|
||||
if (200 <= http_status && http_status < 300)
|
||||
if (isGoodStatus(http_status))
|
||||
{
|
||||
// Allow derived class to override at this point.
|
||||
result(content);
|
||||
httpSuccess();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Allow derived class to override at this point.
|
||||
errorWithContent(http_status, reason, content);
|
||||
httpFailure();
|
||||
}
|
||||
|
||||
mFinished = true;
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLHTTPClient::ResponderWithResult::errorWithContent(U32 status, std::string const& reason, LLSD const&)
|
||||
void LLHTTPClient::ResponderWithResult::httpFailure(void)
|
||||
{
|
||||
// Allow derived class to override at this point.
|
||||
error(status, reason);
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLHTTPClient::ResponderWithResult::error(U32 status, std::string const& reason)
|
||||
{
|
||||
llinfos << mURL << " [" << status << "]: " << reason << llendl;
|
||||
llinfos << mURL << " [" << mStatus << "]: " << mReason << llendl;
|
||||
}
|
||||
|
||||
// Friend functions.
|
||||
@@ -480,22 +501,20 @@ void intrusive_ptr_release(LLHTTPClient::ResponderBase* responder)
|
||||
// Blocking Responders.
|
||||
//
|
||||
|
||||
class BlockingResponder : public LLHTTPClient::LegacyPolledResponder {
|
||||
class BlockingResponder : public LLHTTPClient::ResponderWithCompleted {
|
||||
private:
|
||||
LLCondition mSignal; // Wait condition to wait till mFinished is true.
|
||||
static LLSD LLSD_dummy;
|
||||
static std::string Raw_dummy;
|
||||
|
||||
public:
|
||||
void wait(void); // Blocks until mFinished is true.
|
||||
virtual LLSD const& getLLSD(void) const { llassert(false); return LLSD_dummy; }
|
||||
virtual std::string const& getRaw(void) const { llassert(false); return Raw_dummy; }
|
||||
/*virtual*/ LLSD const& getContent(void) const { llassert(false); return LLHTTPClient::ResponderWithCompleted::getContent(); }
|
||||
|
||||
protected:
|
||||
void wakeup(void); // Call this at the end of completedRaw.
|
||||
};
|
||||
|
||||
LLSD BlockingResponder::LLSD_dummy;
|
||||
std::string BlockingResponder::Raw_dummy;
|
||||
|
||||
void BlockingResponder::wait(void)
|
||||
@@ -530,14 +549,11 @@ void BlockingResponder::wakeup(void)
|
||||
}
|
||||
|
||||
class BlockingLLSDResponder : public BlockingResponder {
|
||||
private:
|
||||
LLSD mResponse;
|
||||
|
||||
protected:
|
||||
/*virtual*/ LLSD const& getLLSD(void) const { llassert(mFinished && mCode == CURLE_OK); return mResponse; }
|
||||
/*virtual*/ void completedRaw(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
/*virtual*/ LLSD const& getContent(void) const { llassert(mFinished && mCode == CURLE_OK); return LLHTTPClient::ResponderWithCompleted::getContent(); }
|
||||
/*virtual*/ void completedRaw(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
{
|
||||
decode_llsd_body(status, reason, channels, buffer, mResponse); // This puts the body asString() in mResponse in case of http error.
|
||||
decode_llsd_body(channels, buffer); // This puts the body asString() in mContent in case of http error.
|
||||
wakeup();
|
||||
}
|
||||
};
|
||||
@@ -548,9 +564,9 @@ private:
|
||||
|
||||
protected:
|
||||
/*virtual*/ std::string const& getRaw(void) const { llassert(mFinished && mCode == CURLE_OK); return mResponse; }
|
||||
/*virtual*/ void completedRaw(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
/*virtual*/ void completedRaw(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
{
|
||||
decode_raw_body(mCode, reason, channels, buffer, mResponse);
|
||||
decode_raw_body(channels, buffer, mResponse);
|
||||
wakeup();
|
||||
}
|
||||
};
|
||||
@@ -630,7 +646,7 @@ static LLSD blocking_request(
|
||||
|
||||
LLSD response = LLSD::emptyMap();
|
||||
CURLcode result = responder->result_code();
|
||||
S32 http_status = responder->http_status();
|
||||
S32 http_status = responder->getStatus();
|
||||
|
||||
bool http_success = http_status >= 200 && http_status < 300;
|
||||
if (result == CURLE_OK && http_success)
|
||||
@@ -641,7 +657,7 @@ static LLSD blocking_request(
|
||||
}
|
||||
else
|
||||
{
|
||||
response["body"] = responder->getLLSD();
|
||||
response["body"] = responder->getContent();
|
||||
}
|
||||
}
|
||||
else if (result == CURLE_OK && !is_internal_http_error(http_status))
|
||||
@@ -663,7 +679,7 @@ static LLSD blocking_request(
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "CURL ERROR BODY: " << responder->getLLSD().asString() << llendl;
|
||||
llwarns << "CURL ERROR BODY: " << responder->getContent().asString() << llendl;
|
||||
}
|
||||
}
|
||||
if (method == HTTP_RAW_GET)
|
||||
@@ -672,12 +688,12 @@ static LLSD blocking_request(
|
||||
}
|
||||
else
|
||||
{
|
||||
response["body"] = responder->getLLSD().asString();
|
||||
response["body"] = responder->getContent().asString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
response["body"] = responder->reason();
|
||||
response["body"] = responder->getReason();
|
||||
}
|
||||
|
||||
response["status"] = http_status;
|
||||
|
||||
@@ -55,6 +55,17 @@ typedef struct _xmlrpc_request* XMLRPC_REQUEST;
|
||||
typedef struct _xmlrpc_value* XMLRPC_VALUE;
|
||||
extern AIEngine gMainThreadEngine;
|
||||
|
||||
// In Viewer 3 this definition is in indra/newview/lltexturefetch.cpp,
|
||||
// but we need it in two .cpp files, so it's moved here.
|
||||
//
|
||||
// BUG-3323/SH-4375
|
||||
// *NOTE: This is a heuristic value. Texture fetches have a habit of using a
|
||||
// value of 32MB to indicate 'get the rest of the image'. Certain ISPs and
|
||||
// network equipment get confused when they see this in a Range: header. So,
|
||||
// if the request end is beyond this value, we issue an open-ended Range:
|
||||
// request (e.g. 'Range: <start>-') which seems to fix the problem.
|
||||
static const S32 HTTP_REQUESTS_RANGE_END_MAX = 20000000;
|
||||
|
||||
// Output parameter of AICurlPrivate::CurlEasyRequest::getResult.
|
||||
// Used in XMLRPCResponder.
|
||||
struct AITransferInfo {
|
||||
@@ -136,7 +147,7 @@ public:
|
||||
/**
|
||||
* @brief return true if the status code indicates success.
|
||||
*/
|
||||
static bool isGoodStatus(U32 status)
|
||||
static bool isGoodStatus(S32 status)
|
||||
{
|
||||
return((200 <= status) && (status < 300));
|
||||
}
|
||||
@@ -145,11 +156,11 @@ public:
|
||||
ResponderBase(void);
|
||||
virtual ~ResponderBase();
|
||||
|
||||
// Read body from buffer and put it into content. If status indicates success, interpret it as LLSD, otherwise copy it as-is.
|
||||
void decode_llsd_body(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer, LLSD& content);
|
||||
// Read body from buffer and put it into mContent. If mStatus indicates success, interpret it as LLSD, otherwise copy it as-is.
|
||||
void decode_llsd_body(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer);
|
||||
|
||||
// Read body from buffer and put it into content. Always copy it as-is.
|
||||
void decode_raw_body(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer, std::string& content);
|
||||
void decode_raw_body(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer, std::string& content);
|
||||
|
||||
protected:
|
||||
// Associated URL, used for debug output.
|
||||
@@ -161,6 +172,15 @@ public:
|
||||
// The curl result code.
|
||||
CURLcode mCode;
|
||||
|
||||
// HTTP status code, if any.
|
||||
S32 mStatus;
|
||||
|
||||
// Reason for error if mStatus is not good.
|
||||
std::string mReason;
|
||||
|
||||
// Content interpreted as LLSD.
|
||||
LLSD mContent;
|
||||
|
||||
// Set when the transaction finished (with or without errors).
|
||||
bool mFinished;
|
||||
|
||||
@@ -173,6 +193,29 @@ public:
|
||||
std::string const& getURL(void) const { return mURL; }
|
||||
CURLcode result_code(void) const { return mCode; }
|
||||
|
||||
protected:
|
||||
// Short cut.
|
||||
void setResult(S32 status, std::string const& reason, LLSD const& content) { mStatus = status; mReason = reason; mContent = content; mFinished = true; }
|
||||
|
||||
// Call these only from the httpSuccess/httpFailure/httpComplete methods of derived classes.
|
||||
|
||||
LLSD const& getContent(void) const { return mContent; }
|
||||
// You can just access mReceivedHeaders directly from derived classes, but added this accessor
|
||||
// for convenience because upstream introduced this method as part of a new API.
|
||||
AIHTTPReceivedHeaders const& getResponseHeaders(void) const
|
||||
{
|
||||
// If this fails then you need to add '/*virtual*/ bool needsHeaders(void) const { return true; }' to the most derived class.
|
||||
llassert(needsHeaders());
|
||||
return mReceivedHeaders;
|
||||
}
|
||||
// Another convenience method to match upstream.
|
||||
std::string dumpResponse(void) const;
|
||||
public:
|
||||
// The next two are public because blocking_request() needs access too.
|
||||
S32 getStatus(void) const { return mStatus; }
|
||||
std::string const& getReason(void) const { return mReason; }
|
||||
|
||||
public:
|
||||
// Called by BufferedCurlEasyRequest::timed_out or BufferedCurlEasyRequest::processOutput.
|
||||
virtual void finished(CURLcode code, U32 http_status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer) = 0;
|
||||
|
||||
@@ -215,7 +258,9 @@ public:
|
||||
// Called when the whole transaction is completed (also the body was received), but before the body is processed.
|
||||
/*virtual*/ void completed_headers(U32 status, std::string const& reason, AITransferInfo* info)
|
||||
{
|
||||
completedHeaders(status, reason, mReceivedHeaders);
|
||||
mStatus = status;
|
||||
mReason = reason;
|
||||
completedHeaders();
|
||||
}
|
||||
|
||||
// Extract cookie 'key' from mReceivedHeaders and return the string 'key=value', or an empty string if key does not exists.
|
||||
@@ -243,7 +288,7 @@ public:
|
||||
virtual AICapabilityType capability_type(void) const { return cap_other; }
|
||||
|
||||
// Timeout policy to use.
|
||||
virtual AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const = 0;
|
||||
virtual AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const;
|
||||
|
||||
// The name of the derived responder object. For debugging purposes.
|
||||
virtual char const* getName(void) const = 0;
|
||||
@@ -251,7 +296,7 @@ public:
|
||||
protected:
|
||||
// Derived classes can override this to get the HTML headers that were received, when the message is completed.
|
||||
// Only actually called for classes that implement a needsHeaders() that returns true.
|
||||
virtual void completedHeaders(U32 status, std::string const& reason, AIHTTPReceivedHeaders const& headers)
|
||||
virtual void completedHeaders(void)
|
||||
{
|
||||
// The default does nothing.
|
||||
}
|
||||
@@ -278,8 +323,10 @@ public:
|
||||
/*virtual*/ void finished(CURLcode code, U32 http_status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
{
|
||||
mCode = code;
|
||||
mStatus = http_status;
|
||||
mReason = reason;
|
||||
// Allow classes derived from ResponderHeadersOnly to override completedHeaders.
|
||||
completedHeaders(http_status, reason, mReceivedHeaders);
|
||||
completedHeaders();
|
||||
mFinished = true;
|
||||
}
|
||||
|
||||
@@ -291,10 +338,9 @@ public:
|
||||
// warning when a class accidently tries to override them.
|
||||
enum YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS { };
|
||||
virtual void completedRaw(YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS) { }
|
||||
virtual void completed(YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS) { }
|
||||
virtual void result(YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS) { }
|
||||
virtual void errorWithContent(YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS) { }
|
||||
virtual void error(YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS) { }
|
||||
virtual void httpCompleted(YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS) { }
|
||||
virtual void httpSuccess(YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS) { }
|
||||
virtual void httpFailure(YOU_MAY_ONLY_OVERRIDE_COMPLETED_HEADERS) { }
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -310,9 +356,11 @@ public:
|
||||
/*virtual*/ void finished(CURLcode code, U32 http_status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
{
|
||||
mCode = code;
|
||||
mStatus = http_status;
|
||||
mReason = reason;
|
||||
// Allow classes derived from ResponderWithCompleted to override completedRaw
|
||||
// (if not they should override completed or be derived from ResponderWithResult instead).
|
||||
completedRaw(http_status, reason, channels, buffer);
|
||||
completedRaw(channels, buffer);
|
||||
mFinished = true;
|
||||
}
|
||||
|
||||
@@ -320,13 +368,17 @@ public:
|
||||
// Events generated by this class.
|
||||
|
||||
// Derived classes can override this to get the raw data of the body of the HTML message that was received.
|
||||
// The default is to interpret the content as LLSD and call completed().
|
||||
virtual void completedRaw(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer);
|
||||
// The default is to interpret the content as LLSD and call httpCompleted().
|
||||
virtual void completedRaw(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer);
|
||||
|
||||
// ... or, derived classes can override this to get LLSD content when the message is completed.
|
||||
// The default aborts, as it should never be called (can't make it pure virtual though, so
|
||||
// classes that override completedRaw don't need to implement this function, too).
|
||||
virtual void completed(U32 status, std::string const& reason, LLSD const& content);
|
||||
virtual void httpCompleted(void);
|
||||
|
||||
public:
|
||||
// Ugly LL API...
|
||||
void completeResult(S32 status, std::string const& reason, LLSD const& content) { mCode = CURLE_OK; setResult(status, reason, content); httpCompleted(); }
|
||||
|
||||
#ifdef SHOW_ASSERT
|
||||
// Responders derived from this class must override either completedRaw or completed.
|
||||
@@ -334,9 +386,8 @@ public:
|
||||
// Define those functions here with different parameters in order to cause a compile
|
||||
// warning when a class accidently tries to override them.
|
||||
enum YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS { };
|
||||
virtual void result(YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS) { }
|
||||
virtual void errorWithContent(YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS) { }
|
||||
virtual void error(YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS) { }
|
||||
virtual void httpSuccess(YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS) { }
|
||||
virtual void httpFailure(YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS) { }
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -355,22 +406,18 @@ public:
|
||||
// Events generated by this class.
|
||||
|
||||
// Derived classes must override this to receive the content of a body upon success.
|
||||
virtual void result(LLSD const& content) = 0;
|
||||
|
||||
// Derived classes can override this to get informed when a bad HTML status code is received.
|
||||
// The default calls error().
|
||||
virtual void errorWithContent(U32 status, std::string const& reason, LLSD const& content);
|
||||
virtual void httpSuccess(void) = 0;
|
||||
|
||||
// ... or, derived classes can override this to get informed when a bad HTML status code is received.
|
||||
// The default prints the error to llinfos.
|
||||
virtual void error(U32 status, std::string const& reason);
|
||||
virtual void httpFailure(void);
|
||||
|
||||
public:
|
||||
// Called from LLSDMessage::ResponderAdapter::listener.
|
||||
// LLSDMessage::ResponderAdapter is a hack, showing among others by fact that it needs these functions.
|
||||
|
||||
void pubErrorWithContent(CURLcode code, U32 status, std::string const& reason, LLSD const& content) { mCode = code; errorWithContent(status, reason, content); mFinished = true; }
|
||||
void pubResult(LLSD const& content) { mCode = CURLE_OK; result(content); mFinished = true; }
|
||||
void failureResult(U32 status, std::string const& reason, LLSD const& content, CURLcode code = CURLE_OK) { mCode = code; setResult(status, reason, content); httpFailure(); }
|
||||
void successResult(LLSD const& content) { mCode = CURLE_OK; setResult(HTTP_OK, "", content); httpSuccess(); }
|
||||
|
||||
#ifdef SHOW_ASSERT
|
||||
// Responders derived from this class must override result, and either errorWithContent or error.
|
||||
@@ -379,48 +426,16 @@ public:
|
||||
// warning when a class accidently tries to override them.
|
||||
enum YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS { };
|
||||
virtual void completedRaw(YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS) { }
|
||||
virtual void completed(YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS) { }
|
||||
virtual void httpCompleted(YOU_ARE_DERIVING_FROM_THE_WRONG_CLASS) { }
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* @class LegacyPolledResponder
|
||||
* @brief As ResponderWithCompleted but caches the result for polling.
|
||||
*
|
||||
* This class allows old polling code to poll if the transaction finished
|
||||
* by calling is_finished() (from the main the thread) and then access the
|
||||
* results-- as opposed to immediately digesting the results when any of
|
||||
* the virtual functions are called.
|
||||
*/
|
||||
class LegacyPolledResponder : public ResponderWithCompleted {
|
||||
protected:
|
||||
U32 mStatus;
|
||||
std::string mReason;
|
||||
|
||||
protected:
|
||||
// The responder finished. Do not override this function in derived classes.
|
||||
/*virtual*/ void finished(CURLcode code, U32 http_status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer)
|
||||
{
|
||||
mStatus = http_status;
|
||||
mReason = reason;
|
||||
// Call base class implementation.
|
||||
ResponderWithCompleted::finished(code, http_status, reason, channels, buffer);
|
||||
}
|
||||
|
||||
public:
|
||||
LegacyPolledResponder(void) : mStatus(HTTP_INTERNAL_ERROR_OTHER) { }
|
||||
|
||||
// Accessors.
|
||||
U32 http_status(void) const { return mStatus; }
|
||||
std::string const& reason(void) const { return mReason; }
|
||||
};
|
||||
|
||||
/**
|
||||
* @class ResponderIgnoreBody
|
||||
* @brief Base class for responders that ignore the result body.
|
||||
*/
|
||||
class ResponderIgnoreBody : public ResponderWithResult {
|
||||
void result(LLSD const&) { }
|
||||
void httpSuccess(void) { }
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -78,6 +78,8 @@ const U64 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23);
|
||||
|
||||
const U64 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26);
|
||||
|
||||
const U64 REGION_FLAGS_BLOCK_FLYOVER = (1 << 27);
|
||||
|
||||
const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
|
||||
|
||||
const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29);
|
||||
|
||||
@@ -99,14 +99,14 @@ void LLSDMessage::EventResponder::setTimeoutPolicy(std::string const& name)
|
||||
mHTTPTimeoutPolicy = AIHTTPTimeoutPolicy::getTimeoutPolicyByName(name);
|
||||
}
|
||||
|
||||
void LLSDMessage::EventResponder::result(const LLSD& data)
|
||||
void LLSDMessage::EventResponder::httpSuccess(void)
|
||||
{
|
||||
// If our caller passed an empty replyPump name, they're not
|
||||
// listening: this is a fire-and-forget message. Don't bother posting
|
||||
// to the pump whose name is "".
|
||||
if (! mReplyPump.empty())
|
||||
{
|
||||
LLSD response(data);
|
||||
LLSD response(mContent);
|
||||
mReqID.stamp(response);
|
||||
mPumps.obtain(mReplyPump).post(response);
|
||||
}
|
||||
@@ -118,7 +118,7 @@ void LLSDMessage::EventResponder::result(const LLSD& data)
|
||||
}
|
||||
}
|
||||
|
||||
void LLSDMessage::EventResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content)
|
||||
void LLSDMessage::EventResponder::httpFailure(void)
|
||||
{
|
||||
// If our caller passed an empty errorPump name, they're not
|
||||
// listening: "default error handling is acceptable." Only post to an
|
||||
@@ -129,9 +129,9 @@ void LLSDMessage::EventResponder::errorWithContent(U32 status, const std::string
|
||||
info["target"] = mTarget;
|
||||
info["message"] = mMessage;
|
||||
info["code"] = mCode;
|
||||
info["status"] = LLSD::Integer(status);
|
||||
info["reason"] = reason;
|
||||
info["content"] = content;
|
||||
info["status"] = LLSD::Integer(mStatus);
|
||||
info["reason"] = mReason;
|
||||
info["content"] = mContent;
|
||||
mPumps.obtain(mErrorPump).post(info);
|
||||
}
|
||||
else // default error handling
|
||||
@@ -139,8 +139,8 @@ void LLSDMessage::EventResponder::errorWithContent(U32 status, const std::string
|
||||
// convention seems to be to use llinfos, but that seems a bit casual?
|
||||
LL_WARNS("LLSDMessage::EventResponder")
|
||||
<< "'" << mMessage << "' to '" << mTarget
|
||||
<< "' failed with code " << status << ": " << reason << '\n'
|
||||
<< ll_pretty_print_sd(content)
|
||||
<< "' failed with code " << mStatus << ": " << mReason << '\n'
|
||||
<< ll_pretty_print_sd(mContent)
|
||||
<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
@@ -165,15 +165,15 @@ bool LLSDMessage::ResponderAdapter::listener(const LLSD& payload, bool success)
|
||||
LLHTTPClient::ResponderWithResult* responder = dynamic_cast<LLHTTPClient::ResponderWithResult*>(mResponder.get());
|
||||
// If this assertion fails then ResponderAdapter has been used for a ResponderWithCompleted derived class,
|
||||
// which is not allowed because ResponderAdapter can only work for classes derived from Responder that
|
||||
// implement result() and errorWithContent (or just error).
|
||||
// implement httpSuccess() and httpFailure().
|
||||
llassert_always(responder);
|
||||
if (success)
|
||||
{
|
||||
responder->pubResult(payload);
|
||||
responder->successResult(payload);
|
||||
}
|
||||
else
|
||||
{
|
||||
responder->pubErrorWithContent((CURLcode)payload["code"].asInteger(), payload["status"].asInteger(), payload["reason"], payload["content"]);
|
||||
responder->failureResult(payload["status"].asInteger(), payload["reason"], payload["content"], (CURLcode)payload["code"].asInteger());
|
||||
}
|
||||
|
||||
/*---------------- MUST BE LAST STATEMENT BEFORE RETURN ----------------*/
|
||||
|
||||
@@ -156,8 +156,8 @@ private:
|
||||
|
||||
void setTimeoutPolicy(std::string const& name);
|
||||
|
||||
/*virtual*/ void result(const LLSD& data);
|
||||
/*virtual*/ void errorWithContent(U32 status, const std::string& reason, const LLSD& content);
|
||||
/*virtual*/ void httpSuccess(void);
|
||||
/*virtual*/ void httpFailure(void);
|
||||
|
||||
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return *mHTTPTimeoutPolicy; }
|
||||
/*virtual*/ char const* getName(void) const { return "EventResponder"; }
|
||||
|
||||
@@ -91,15 +91,17 @@ void LLTemplateMessageReader::getData(const char *blockname, const char *varname
|
||||
}
|
||||
|
||||
LLMsgBlkData *msg_block_data = iter->second;
|
||||
LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep];
|
||||
LLMsgBlkData::msg_var_data_map_t &var_data_map = msg_block_data->mMemberVarData;
|
||||
|
||||
if (!vardata.getName())
|
||||
if (var_data_map.find(vnamep) == var_data_map.end())
|
||||
{
|
||||
llerrs << "Variable "<< vnamep << " not in message "
|
||||
<< mCurrentRMessageData->mName<< " block " << bnamep << llendl;
|
||||
return;
|
||||
}
|
||||
|
||||
LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep];
|
||||
|
||||
if (size && size != vardata.getSize())
|
||||
{
|
||||
llerrs << "Msg " << mCurrentRMessageData->mName
|
||||
@@ -284,7 +286,7 @@ void LLTemplateMessageReader::getU8(const char *block, const char *var,
|
||||
void LLTemplateMessageReader::getBOOL(const char *block, const char *var,
|
||||
BOOL &b, S32 blocknum )
|
||||
{
|
||||
U8 value;
|
||||
U8 value(0);
|
||||
getData(block, var, &value, sizeof(U8), blocknum);
|
||||
b = (BOOL) value;
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ LLURLRequest::LLURLRequest(LLURLRequest::ERequestAction action, std::string cons
|
||||
LLHTTPClient::ResponderPtr responder, AIHTTPHeaders& headers, AIPerService::Approvement* approved,
|
||||
bool keepalive, bool is_auth, bool compression) :
|
||||
mAction(action), mURL(url), mKeepAlive(keepalive), mIsAuth(is_auth), mNoCompression(!compression),
|
||||
mBody(body), mResponder(responder), mHeaders(headers), mResponderNameCache(responder ? responder->getName() : "<uninitialized>")
|
||||
mBody(body), mResponder(responder), mHeaders(headers), mResponderNameCache(std::string("LLURLRequest:") + std::string(responder ? responder->getName() : "<uninitialized>"))
|
||||
{
|
||||
if (approved)
|
||||
{
|
||||
@@ -276,32 +276,4 @@ bool LLURLRequest::configure(AICurlEasyRequest_wat const& curlEasyRequest_w)
|
||||
return rv;
|
||||
}
|
||||
|
||||
// Called from AIStateMachine::mainloop, but put here because we don't want to include llurlrequest.h there of course.
|
||||
void print_statemachine_diagnostics(U64 total_clocks, U64 max_delta, AIEngine::queued_type::const_reference slowest_element)
|
||||
{
|
||||
AIStateMachine const& slowest_state_machine = slowest_element.statemachine();
|
||||
LLURLRequest const* request = dynamic_cast<LLURLRequest const*>(&slowest_state_machine);
|
||||
F64 const tfactor = 1000 / calc_clock_frequency();
|
||||
std::ostringstream msg;
|
||||
if (total_clocks > max_delta)
|
||||
{
|
||||
msg << "AIStateMachine::mainloop did run for " << (total_clocks * tfactor) << " ms. The slowest ";
|
||||
}
|
||||
else
|
||||
{
|
||||
msg << "AIStateMachine::mainloop: A ";
|
||||
}
|
||||
msg << "state machine ";
|
||||
if (request)
|
||||
{
|
||||
msg << "(" << request->getResponderName() << ") ";
|
||||
}
|
||||
msg << "ran for " << (max_delta * tfactor) << " ms";
|
||||
if (slowest_state_machine.getRuntime() > max_delta)
|
||||
{
|
||||
msg << " (" << (slowest_state_machine.getRuntime() * tfactor) << " ms in total now)";
|
||||
}
|
||||
msg << ".";
|
||||
llwarns << msg.str() << llendl;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ class LLURLRequest : public AICurlEasyRequestStateMachine {
|
||||
/**
|
||||
* @brief Cached value of responder->getName() as passed to the constructor.
|
||||
*/
|
||||
char const* getResponderName(void) const { return mResponderNameCache; }
|
||||
/*virtual*/ const char* getName() const { return mResponderNameCache.c_str(); }
|
||||
|
||||
protected:
|
||||
// Call abort(), not delete.
|
||||
@@ -113,7 +113,7 @@ class LLURLRequest : public AICurlEasyRequestStateMachine {
|
||||
U32 mBodySize;
|
||||
LLHTTPClient::ResponderPtr mResponder;
|
||||
AIHTTPHeaders mHeaders;
|
||||
char const* mResponderNameCache;
|
||||
std::string mResponderNameCache;
|
||||
|
||||
protected:
|
||||
// Handle initializing the object.
|
||||
|
||||
@@ -116,20 +116,20 @@ namespace
|
||||
{
|
||||
}
|
||||
|
||||
/*virtual*/ void error(U32 status, const std::string& reason)
|
||||
/*virtual*/ void httpFailure(void)
|
||||
{
|
||||
// don't spam when agent communication disconnected already
|
||||
if (status != 410)
|
||||
if (mStatus != 410)
|
||||
{
|
||||
LL_WARNS("Messaging") << "error status " << status
|
||||
LL_WARNS("Messaging") << "error status " << mStatus
|
||||
<< " for message " << mMessageName
|
||||
<< " reason " << reason << llendl;
|
||||
<< " reason " << mReason << llendl;
|
||||
}
|
||||
// TODO: Map status in to useful error code.
|
||||
// TODO: Map mStatus in to useful error code.
|
||||
if(NULL != mCallback) mCallback(mCallbackData, LL_ERR_TCP_TIMEOUT);
|
||||
}
|
||||
|
||||
/*virtual*/ void result(const LLSD& content)
|
||||
/*virtual*/ void httpSuccess(void)
|
||||
{
|
||||
if(NULL != mCallback) mCallback(mCallbackData, LL_ERR_NOERR);
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "llconvexdecomposition.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llvector4a.h"
|
||||
#include "llmatrix4a.h"
|
||||
#if LL_MSVC
|
||||
#pragma warning (push)
|
||||
#pragma warning (disable : 4068)
|
||||
@@ -172,6 +173,11 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
|
||||
return LLModel::BAD_ELEMENT;
|
||||
}
|
||||
|
||||
if (!pos_source)
|
||||
{
|
||||
llwarns << "Unable to process mesh without position data; invalid model; invalid model." << llendl;
|
||||
return LLModel::BAD_ELEMENT;
|
||||
}
|
||||
|
||||
domPRef p = tri->getP();
|
||||
domListOfUInts& idx = p->getValue();
|
||||
@@ -181,19 +187,22 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
|
||||
domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;
|
||||
domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ;
|
||||
|
||||
if (pos_source)
|
||||
{
|
||||
face.mExtents[0].set(v[0], v[1], v[2]);
|
||||
face.mExtents[1].set(v[0], v[1], v[2]);
|
||||
}
|
||||
|
||||
LLVolumeFace::VertexMapData::PointMap point_map;
|
||||
|
||||
|
||||
U32 index_count = idx.getCount();
|
||||
U32 vertex_count = pos_source ? v.getCount() : 0;
|
||||
U32 tc_count = tc_source ? tc.getCount() : 0;
|
||||
U32 norm_count = norm_source ? n.getCount() : 0;
|
||||
|
||||
if (vertex_count == 0)
|
||||
{
|
||||
llwarns << "Unable to process mesh with empty position array; invalid model." << llendl;
|
||||
return LLModel::BAD_ELEMENT;
|
||||
}
|
||||
|
||||
face.mExtents[0].set(v[0], v[1], v[2]);
|
||||
face.mExtents[1].set(v[0], v[1], v[2]);
|
||||
|
||||
for (U32 i = 0; i < index_count; i += idx_stride)
|
||||
{
|
||||
LLVolumeFace::VertexData cv;
|
||||
|
||||
@@ -74,6 +74,11 @@ set(llrender_HEADER_FILES
|
||||
set_source_files_properties(${llrender_HEADER_FILES}
|
||||
PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
|
||||
# Workaround hack for clang bugs
|
||||
if (DARWIN)
|
||||
set_property(SOURCE llgl.cpp PROPERTY COMPILE_FLAGS -O1)
|
||||
endif (DARWIN)
|
||||
|
||||
list(APPEND llrender_SOURCE_FILES ${llrender_HEADER_FILES})
|
||||
|
||||
add_library (llrender ${llrender_SOURCE_FILES})
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "v3dmath.h"
|
||||
#include "m3math.h"
|
||||
#include "m4math.h"
|
||||
#include "llmatrix4a.h"
|
||||
|
||||
#include "llrender.h"
|
||||
#include "llglslshader.h"
|
||||
@@ -265,18 +266,19 @@ void LLCubeMap::setMatrix(S32 stage)
|
||||
gGL.getTexUnit(stage)->activate();
|
||||
}
|
||||
|
||||
LLVector3 x(gGLModelView+0);
|
||||
LLVector3 y(gGLModelView+4);
|
||||
LLVector3 z(gGLModelView+8);
|
||||
LLVector3 x(gGLModelView.getRow<0>().getF32ptr());
|
||||
LLVector3 y(gGLModelView.getRow<1>().getF32ptr());
|
||||
LLVector3 z(gGLModelView.getRow<2>().getF32ptr());
|
||||
|
||||
LLMatrix3 mat3;
|
||||
mat3.setRows(x,y,z);
|
||||
LLMatrix4 trans(mat3);
|
||||
LLMatrix4a trans;
|
||||
trans.loadu(mat3);
|
||||
trans.transpose();
|
||||
|
||||
gGL.matrixMode(LLRender::MM_TEXTURE);
|
||||
gGL.pushMatrix();
|
||||
gGL.loadMatrix((F32 *)trans.mMatrix);
|
||||
gGL.loadMatrix(trans);
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
|
||||
/*if (stage > 0)
|
||||
|
||||
@@ -444,6 +444,7 @@ LLGLManager::LLGLManager() :
|
||||
mHasDebugOutput(FALSE),
|
||||
|
||||
mHasAdaptiveVsync(FALSE),
|
||||
mHasTextureSwizzle(FALSE),
|
||||
|
||||
mIsATI(FALSE),
|
||||
mIsNVIDIA(FALSE),
|
||||
@@ -1382,6 +1383,35 @@ void flush_glerror()
|
||||
glGetError();
|
||||
}
|
||||
|
||||
const std::string getGLErrorString(GLenum error)
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case GL_NO_ERROR:
|
||||
return "No Error";
|
||||
case GL_INVALID_ENUM:
|
||||
return "Invalid Enum";
|
||||
case GL_INVALID_VALUE:
|
||||
return "Invalid Value";
|
||||
case GL_INVALID_OPERATION:
|
||||
return "Invalid Operation";
|
||||
case GL_INVALID_FRAMEBUFFER_OPERATION:
|
||||
return "Invalid Framebuffer Operation";
|
||||
case GL_OUT_OF_MEMORY:
|
||||
return "Out of Memory";
|
||||
case GL_STACK_UNDERFLOW:
|
||||
return "Stack Underflow";
|
||||
case GL_STACK_OVERFLOW:
|
||||
return "Stack Overflow";
|
||||
#ifdef GL_TABLE_TOO_LARGE
|
||||
case GL_TABLE_TOO_LARGE:
|
||||
return "Table too large";
|
||||
#endif
|
||||
default:
|
||||
return "UNKNOWN ERROR";
|
||||
}
|
||||
}
|
||||
|
||||
//this function outputs gl error to the log file, does not crash the code.
|
||||
void log_glerror()
|
||||
{
|
||||
@@ -1394,17 +1424,8 @@ void log_glerror()
|
||||
error = glGetError();
|
||||
while (LL_UNLIKELY(error))
|
||||
{
|
||||
GLubyte const * gl_error_msg = gluErrorString(error);
|
||||
if (NULL != gl_error_msg)
|
||||
{
|
||||
llwarns << "GL Error: " << error << " GL Error String: " << gl_error_msg << llendl ;
|
||||
}
|
||||
else
|
||||
{
|
||||
// gluErrorString returns NULL for some extensions' error codes.
|
||||
// you'll probably have to grep for the number in glext.h.
|
||||
llwarns << "GL Error: UNKNOWN 0x" << std::hex << error << std::dec << llendl;
|
||||
}
|
||||
std::string gl_error_msg = getGLErrorString(error);
|
||||
llwarns << "GL Error: 0x" << std::hex << error << std::dec << " GL Error String: " << gl_error_msg << llendl;
|
||||
error = glGetError();
|
||||
}
|
||||
}
|
||||
@@ -1418,27 +1439,13 @@ void do_assert_glerror()
|
||||
while (LL_UNLIKELY(error))
|
||||
{
|
||||
quit = TRUE;
|
||||
GLubyte const * gl_error_msg = gluErrorString(error);
|
||||
if (NULL != gl_error_msg)
|
||||
|
||||
std::string gl_error_msg = getGLErrorString(error);
|
||||
LL_WARNS("RenderState") << "GL Error: 0x" << std::hex << error << std::dec << LL_ENDL;
|
||||
LL_WARNS("RenderState") << "GL Error String: " << gl_error_msg << LL_ENDL;
|
||||
if (gDebugSession)
|
||||
{
|
||||
LL_WARNS("RenderState") << "GL Error:" << error<< LL_ENDL;
|
||||
LL_WARNS("RenderState") << "GL Error String:" << gl_error_msg << LL_ENDL;
|
||||
|
||||
if (gDebugSession)
|
||||
{
|
||||
gFailLog << "GL Error:" << gl_error_msg << std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// gluErrorString returns NULL for some extensions' error codes.
|
||||
// you'll probably have to grep for the number in glext.h.
|
||||
LL_WARNS("RenderState") << "GL Error: UNKNOWN 0x" << std::hex << error << std::dec << LL_ENDL;
|
||||
|
||||
if (gDebugSession)
|
||||
{
|
||||
gFailLog << "GL Error: UNKNOWN 0x" << std::hex << error << std::dec << std::endl;
|
||||
}
|
||||
gFailLog << "GL Error: 0x" << std::hex << error << std::dec << " GL Error String: " << gl_error_msg << std::endl;
|
||||
}
|
||||
error = glGetError();
|
||||
}
|
||||
@@ -1662,10 +1669,6 @@ void LLGLState::checkTextureChannels(const std::string& msg)
|
||||
|
||||
GLint stackDepth = 0;
|
||||
|
||||
glh::matrix4f mat;
|
||||
glh::matrix4f identity;
|
||||
identity.identity();
|
||||
|
||||
for (GLint i = 1; i < gGLManager.mNumTextureUnits; i++)
|
||||
{
|
||||
gGL.getTexUnit(i)->activate();
|
||||
@@ -1685,10 +1688,11 @@ void LLGLState::checkTextureChannels(const std::string& msg)
|
||||
}
|
||||
}
|
||||
|
||||
glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.m);
|
||||
LLMatrix4a mat;
|
||||
glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.mMatrix);
|
||||
stop_glerror();
|
||||
|
||||
if (mat != identity)
|
||||
if (!mat.isIdentity())
|
||||
{
|
||||
error = TRUE;
|
||||
LL_WARNS("RenderState") << "Texture matrix in channel " << i << " corrupt." << LL_ENDL;
|
||||
@@ -2179,7 +2183,7 @@ void parse_glsl_version(S32& major, S32& minor)
|
||||
LLStringUtil::convertToS32(minor_str, minor);
|
||||
}
|
||||
|
||||
LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply)
|
||||
LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const LLMatrix4a& modelview, const LLMatrix4a& projection, bool apply)
|
||||
{
|
||||
mApply = apply;
|
||||
|
||||
@@ -2194,27 +2198,42 @@ LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& mode
|
||||
|
||||
void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
|
||||
{
|
||||
glh::matrix4f& P = mProjection;
|
||||
glh::matrix4f& M = mModelview;
|
||||
|
||||
glh::matrix4f invtrans_MVP = (P * M).inverse().transpose();
|
||||
glh::vec4f oplane(a,b,c,d);
|
||||
glh::vec4f cplane;
|
||||
invtrans_MVP.mult_matrix_vec(oplane, cplane);
|
||||
LLMatrix4a& P = mProjection;
|
||||
LLMatrix4a& M = mModelview;
|
||||
|
||||
cplane /= fabs(cplane[2]); // normalize such that depth is not scaled
|
||||
cplane[3] -= 1;
|
||||
LLMatrix4a invtrans_MVP;
|
||||
invtrans_MVP.setMul(P,M);
|
||||
invtrans_MVP.invert();
|
||||
invtrans_MVP.transpose();
|
||||
|
||||
if(cplane[2] < 0)
|
||||
cplane *= -1;
|
||||
LLVector4a oplane(a,b,c,d);
|
||||
LLVector4a cplane;
|
||||
LLVector4a cplane_splat;
|
||||
LLVector4a cplane_neg;
|
||||
|
||||
invtrans_MVP.rotate4(oplane,cplane);
|
||||
|
||||
cplane_splat.splat<2>(cplane);
|
||||
cplane_splat.setAbs(cplane_splat);
|
||||
cplane.div(cplane_splat);
|
||||
cplane.sub(LLVector4a(0.f,0.f,0.f,1.f));
|
||||
|
||||
cplane_splat.splat<2>(cplane);
|
||||
cplane_neg = cplane;
|
||||
cplane_neg.negate();
|
||||
|
||||
cplane.setSelectWithMask( cplane_splat.lessThan( _mm_setzero_ps() ), cplane_neg, cplane );
|
||||
|
||||
LLMatrix4a suffix;
|
||||
suffix.setIdentity();
|
||||
suffix.setColumn<2>(cplane);
|
||||
LLMatrix4a newP;
|
||||
newP.setMul(suffix,P);
|
||||
|
||||
glh::matrix4f suffix;
|
||||
suffix.set_row(2, cplane);
|
||||
glh::matrix4f newP = suffix * P;
|
||||
gGL.matrixMode(LLRender::MM_PROJECTION);
|
||||
gGL.pushMatrix();
|
||||
gGL.loadMatrix(newP.m);
|
||||
gGLObliqueProjectionInverse = LLMatrix4(newP.inverse().transpose().m);
|
||||
gGL.loadMatrix(newP);
|
||||
//gGLObliqueProjectionInverse = LLMatrix4(newP.inverse().transpose().m);
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
}
|
||||
|
||||
@@ -2403,19 +2422,18 @@ void LLGLDepthTest::checkState()
|
||||
}
|
||||
}
|
||||
|
||||
LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P, U32 layer)
|
||||
LLGLSquashToFarClip::LLGLSquashToFarClip(const LLMatrix4a& P_in, U32 layer)
|
||||
{
|
||||
|
||||
LLMatrix4a P = P_in;
|
||||
F32 depth = 0.99999f - 0.0001f * layer;
|
||||
|
||||
for (U32 i = 0; i < 4; i++)
|
||||
{
|
||||
P.element(2, i) = P.element(3, i) * depth;
|
||||
}
|
||||
LLVector4a col = P.getColumn<3>();
|
||||
col.mul(depth);
|
||||
P.setColumn<2>(col);
|
||||
|
||||
gGL.matrixMode(LLRender::MM_PROJECTION);
|
||||
gGL.pushMatrix();
|
||||
gGL.loadMatrix(P.m);
|
||||
gGL.loadMatrix(P);
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,12 +38,12 @@
|
||||
#include "llstring.h"
|
||||
#include "stdtypes.h"
|
||||
#include "v4math.h"
|
||||
#include "llmatrix4a.h"
|
||||
#include "llplane.h"
|
||||
#include "llgltypes.h"
|
||||
#include "llinstancetracker.h"
|
||||
|
||||
#include "llglheaders.h"
|
||||
#include "glh/glh_linear.h"
|
||||
|
||||
extern BOOL gDebugGL;
|
||||
extern BOOL gDebugSession;
|
||||
@@ -321,21 +321,23 @@ public:
|
||||
Does not stack.
|
||||
Caches inverse of projection matrix used in gGLObliqueProjectionInverse
|
||||
*/
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLGLUserClipPlane
|
||||
{
|
||||
public:
|
||||
|
||||
LLGLUserClipPlane(const LLPlane& plane, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply = true);
|
||||
LLGLUserClipPlane(const LLPlane& plane, const LLMatrix4a& modelview, const LLMatrix4a& projection, bool apply = true);
|
||||
~LLGLUserClipPlane();
|
||||
|
||||
void setPlane(F32 a, F32 b, F32 c, F32 d);
|
||||
|
||||
private:
|
||||
bool mApply;
|
||||
|
||||
glh::matrix4f mProjection;
|
||||
glh::matrix4f mModelview;
|
||||
};
|
||||
LL_ALIGN_16(LLMatrix4a mProjection);
|
||||
LL_ALIGN_16(LLMatrix4a mModelview);
|
||||
|
||||
bool mApply;
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
/*
|
||||
Modify and load projection matrix to push depth values to far clip plane.
|
||||
@@ -348,7 +350,7 @@ private:
|
||||
class LLGLSquashToFarClip
|
||||
{
|
||||
public:
|
||||
LLGLSquashToFarClip(glh::matrix4f projection, U32 layer = 0);
|
||||
LLGLSquashToFarClip(const LLMatrix4a& projection, U32 layer = 0);
|
||||
~LLGLSquashToFarClip();
|
||||
};
|
||||
|
||||
@@ -455,8 +457,6 @@ public:
|
||||
void wait();
|
||||
};
|
||||
|
||||
extern LLMatrix4 gGLObliqueProjectionInverse;
|
||||
|
||||
#include "llglstates.h"
|
||||
|
||||
void init_glstates();
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
# include "GL/glx.h"
|
||||
# define GL_GLEXT_PROTOTYPES 1
|
||||
# include "GL/glext.h"
|
||||
# include "GL/glu.h"
|
||||
# include "GL/glx.h"
|
||||
# define GLX_GLXEXT_PROTOTYPES 1
|
||||
# include "GL/glxext.h"
|
||||
@@ -266,7 +265,6 @@ extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
|
||||
#define GL_GLEXT_PROTOTYPES 1
|
||||
#include "GL/gl.h"
|
||||
#include "GL/glext.h"
|
||||
#include "GL/glu.h"
|
||||
|
||||
// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly
|
||||
# define __APPLE__
|
||||
@@ -282,7 +280,6 @@ extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
|
||||
// quotes so we get libraries/.../GL/ version
|
||||
#include "GL/gl.h"
|
||||
#include "GL/glext.h"
|
||||
#include "GL/glu.h"
|
||||
|
||||
|
||||
#if LL_LINUX && !LL_MESA_HEADLESS
|
||||
@@ -551,7 +548,6 @@ extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
|
||||
// quotes so we get libraries/.../GL/ version
|
||||
#include "GL/glext.h"
|
||||
@@ -789,7 +785,6 @@ extern PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB;
|
||||
// LL_DARWIN
|
||||
|
||||
#include <OpenGL/gl.h>
|
||||
#include <OpenGL/glu.h>
|
||||
|
||||
#define GL_EXT_separate_specular_color 1
|
||||
#include <OpenGL/glext.h>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user