Intermiediary commit.

This commit is contained in:
Shyotl
2019-03-16 17:51:00 -05:00
parent 7cf55fa993
commit 2d8fbb89c9
58 changed files with 1857 additions and 1057 deletions

View File

@@ -18,17 +18,18 @@ set(llmath_SOURCE_FILES
llcoordframe.cpp
llline.cpp
llmatrix3a.cpp
llmatrix4a.cpp
llmodularmath.cpp
llperlin.cpp
llquaternion.cpp
llrigginginfo.cpp
llrect.cpp
llrigginginfo.cpp
llsdutil_math.cpp
llsphere.cpp
llvector4a.cpp
llvolume.cpp
llvolumemgr.cpp
llvolumeoctree.cpp
llsdutil_math.cpp
m3math.cpp
m4math.cpp
raytrace.cpp
@@ -68,8 +69,7 @@ set(llmath_HEADER_FILES
llquaternion2.h
llquaternion2.inl
llrect.h
llrigginginfo.h
llsdutil_math.h
llrigginginfo.h
llsimdmath.h
llsimdtypes.h
llsimdtypes.inl
@@ -81,6 +81,7 @@ set(llmath_HEADER_FILES
llvolume.h
llvolumemgr.h
llvolumeoctree.h
llsdutil_math.h
m3math.h
m4math.h
raytrace.h

View File

@@ -0,0 +1,80 @@
/**
* @file llmatrix4a.cpp
* @brief Functions for vectorized matrix/vector operations
*
* $LicenseInfo:firstyear=2018&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2018, 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.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llmath.h"
#include "llmatrix4a.h"
// Convert a bounding box into other coordinate system. Should give
// the same results as transforming every corner of the bounding box
// and extracting the bounding box of that, although that's not
// necessarily the fastest way to implement.
void matMulBoundBox(const LLMatrix4a &mat, const LLVector4a *in_extents, LLVector4a *out_extents)
{
//get 8 corners of bounding box
LLVector4Logical mask[6];
for (U32 i = 0; i < 6; ++i)
{
mask[i].clear();
}
mask[0].setElement<2>(); //001
mask[1].setElement<1>(); //010
mask[2].setElement<1>(); //011
mask[2].setElement<2>();
mask[3].setElement<0>(); //100
mask[4].setElement<0>(); //101
mask[4].setElement<2>();
mask[5].setElement<0>(); //110
mask[5].setElement<1>();
LLVector4a v[8];
v[6] = in_extents[0];
v[7] = in_extents[1];
for (U32 i = 0; i < 6; ++i)
{
v[i].setSelectWithMask(mask[i], in_extents[0], in_extents[1]);
}
LLVector4a tv[8];
//transform bounding box into drawable space
for (U32 i = 0; i < 8; ++i)
{
mat.affineTransform(v[i], tv[i]);
}
//find bounding box
out_extents[0] = out_extents[1] = tv[0];
for (U32 i = 1; i < 8; ++i)
{
out_extents[0].setMin(out_extents[0], tv[i]);
out_extents[1].setMax(out_extents[1], tv[i]);
}
}

View File

@@ -544,7 +544,7 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3
{
// Generate an n-sided "circular" path.
// 0 is (1,0), and we go counter-clockwise along a circular path from there.
const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f };
static const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f };
F32 scale = 0.5f;
F32 t, t_step, t_first, t_fraction, ang, ang_step;
LLVector4a pt1,pt2;

View File

@@ -369,3 +369,39 @@ BOOL LLVector3::parseVector3(const std::string& buf, LLVector3* value)
return FALSE;
}
// Displacement from query point to nearest neighbor point on bounding box.
// Returns zero vector for points within or on the box.
LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box)
{
LLVector3 offset;
for (S32 k=0; k<3; k++)
{
offset[k] = 0;
if (pos[k] < box[0][k])
{
offset[k] = pos[k] - box[0][k];
}
else if (pos[k] > box[1][k])
{
offset[k] = pos[k] - box[1][k];
}
}
return offset;
}
bool box_valid_and_non_zero(const LLVector3* box)
{
if (!box[0].isFinite() || !box[1].isFinite())
{
return false;
}
LLVector3 zero_vec;
zero_vec.clear();
if ((box[0] != zero_vec) || (box[1] != zero_vec))
{
return true;
}
return false;
}

View File

@@ -163,6 +163,8 @@ LLVector3 inverse_projected_vec(const LLVector3 &a, const LLVector3 &b); // Retu
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
LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box); // Displacement from query point to nearest point on bounding box.
bool box_valid_and_non_zero(const LLVector3* box);
inline LLVector3::LLVector3(void)
{