OXIESEC PANEL
- Current Dir:
/
/
usr
/
include
/
OpenEXR
Server IP: 139.59.38.164
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
10/28/2024 06:50:42 AM
rwxr-xr-x
📄
Iex.h
2.34 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexBaseExc.h
9.06 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexErrnoExc.h
7.37 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexExport.h
2.08 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexForward.h
5.1 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexMacros.h
5.63 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexMathExc.h
2.41 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexMathFloatExc.h
4.58 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexMathFpu.h
3.3 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexMathIeeeExc.h
2.3 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexNamespace.h
4.3 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IexThrowErrnoExc.h
3.4 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
IlmBaseConfig.h
1.64 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
IlmThread.h
4.78 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
IlmThreadExport.h
2.15 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
IlmThreadForward.h
2.08 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
IlmThreadMutex.h
4.32 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
IlmThreadNamespace.h
4.54 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
IlmThreadPool.h
5.21 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
IlmThreadSemaphore.h
3.38 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathBox.h
16.62 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathBoxAlgo.h
22.35 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathColor.h
14.87 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathColorAlgo.h
7.08 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathEuler.h
22.88 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathExc.h
2.82 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathExport.h
2.13 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathForward.h
2.68 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathFrame.h
6.6 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathFrustum.h
22.26 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathFrustumTest.h
14.77 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathFun.h
5.99 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathGL.h
4.52 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathGLU.h
2.17 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathHalfLimits.h
2.47 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathInt64.h
2.4 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathInterval.h
5.34 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathLimits.h
7.76 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathLine.h
4.74 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathLineAlgo.h
7.68 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathMath.h
7.17 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathMatrix.h
82.42 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathMatrixAlgo.h
37.97 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathNamespace.h
4.38 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathPlane.h
6.75 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathPlatform.h
3.23 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathQuat.h
20.94 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathRandom.h
9.84 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathRoots.h
5.62 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathShear.h
13.85 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathSphere.h
4.68 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathVec.h
44.17 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImathVecAlgo.h
4.64 KB
04/16/2016 12:52:00 AM
rw-r--r--
📄
ImfAcesFile.h
10.27 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfArray.h
6.79 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfAttribute.h
10.36 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfB44Compressor.h
3.67 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfBoxAttribute.h
3.1 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfCRgbaFile.h
12.5 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfChannelList.h
11.2 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfChannelListAttribute.h
2.69 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfChromaticities.h
4.45 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfChromaticitiesAttribute.h
2.74 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfCompositeDeepScanLine.h
5.38 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfCompression.h
3.25 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfCompressionAttribute.h
2.71 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfConvert.h
3.39 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepCompositing.h
5.97 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepFrameBuffer.h
8.79 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepImageState.h
3.67 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepImageStateAttribute.h
2.64 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepScanLineInputFile.h
11.01 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepScanLineInputPart.h
6.9 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepScanLineOutputFile.h
9.37 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepScanLineOutputPart.h
6.41 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepTiledInputFile.h
16.08 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepTiledInputPart.h
13.27 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepTiledOutputFile.h
18.1 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDeepTiledOutputPart.h
14.83 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfDoubleAttribute.h
2.29 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfEnvmap.h
11.29 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfEnvmapAttribute.h
2.67 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfExport.h
2.11 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfFloatAttribute.h
2.26 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfForward.h
3.48 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfFrameBuffer.h
11.18 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfFramesPerSecond.h
3.79 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfGenericInputFile.h
2.26 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfGenericOutputFile.h
2.44 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfHeader.h
19.27 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfHuf.h
2.86 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfIO.h
7.45 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfInputFile.h
8.28 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfInputPart.h
3.52 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfInt64.h
2.24 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfIntAttribute.h
2.27 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfKeyCode.h
4.9 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfKeyCodeAttribute.h
2.65 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfLineOrder.h
2.42 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfLineOrderAttribute.h
2.67 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfLut.h
5.12 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfMatrixAttribute.h
3.65 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfMisc.h
16.33 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfMultiPartInputFile.h
3.94 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfMultiPartOutputFile.h
4.29 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfMultiView.h
6.29 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfName.h
3.52 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfNamespace.h
4.46 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfOpaqueAttribute.h
3.55 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfOutputFile.h
9.66 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfOutputPart.h
3.04 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfPartHelper.h
7.66 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfPartType.h
2.38 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfPixelType.h
2.34 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfPreviewImage.h
4.65 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfPreviewImageAttribute.h
2.68 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfRational.h
3.17 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfRationalAttribute.h
2.63 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfRgba.h
3.08 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfRgbaFile.h
13.09 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfRgbaYca.h
8.21 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfStandardAttributes.h
13.26 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfStringAttribute.h
2.58 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfStringVectorAttribute.h
2.7 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTestFile.h
3.55 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfThreading.h
4.24 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTileDescription.h
3.13 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTileDescriptionAttribute.h
2.7 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTiledInputFile.h
13.82 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTiledInputPart.h
4.55 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTiledOutputFile.h
17.83 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTiledOutputPart.h
4.75 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTiledRgbaFile.h
15.89 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTimeCode.h
7 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfTimeCodeAttribute.h
2.64 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfVecAttribute.h
4.45 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfVersion.h
4.64 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfWav.h
2.73 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
ImfXdr.h
18.74 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
OpenEXRConfig.h
1.8 KB
11/16/2021 03:51:38 PM
rw-r--r--
📄
half.h
17.22 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
halfExport.h
757 bytes
04/16/2016 12:51:59 AM
rw-r--r--
📄
halfFunction.h
4.83 KB
04/16/2016 12:51:59 AM
rw-r--r--
📄
halfLimits.h
3.73 KB
04/16/2016 12:51:59 AM
rw-r--r--
Editing: ImathBoxAlgo.h
Close
/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Industrial Light & Magic nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHBOXALGO_H #define INCLUDED_IMATHBOXALGO_H //--------------------------------------------------------------------------- // // This file contains algorithms applied to or in conjunction // with bounding boxes (Imath::Box). These algorithms require // more headers to compile. The assumption made is that these // functions are called much less often than the basic box // functions or these functions require more support classes. // // Contains: // // T clip<T>(const T& in, const Box<T>& box) // // Vec3<T> closestPointOnBox(const Vec3<T>&, const Box<Vec3<T>>& ) // // Vec3<T> closestPointInBox(const Vec3<T>&, const Box<Vec3<T>>& ) // // Box< Vec3<S> > transform(const Box<Vec3<S>>&, const Matrix44<T>&) // Box< Vec3<S> > affineTransform(const Box<Vec3<S>>&, const Matrix44<T>&) // // void transform(const Box<Vec3<S>>&, const Matrix44<T>&, Box<V3ec3<S>>&) // void affineTransform(const Box<Vec3<S>>&, // const Matrix44<T>&, // Box<V3ec3<S>>&) // // bool findEntryAndExitPoints(const Line<T> &line, // const Box< Vec3<T> > &box, // Vec3<T> &enterPoint, // Vec3<T> &exitPoint) // // bool intersects(const Box<Vec3<T>> &box, // const Line3<T> &ray, // Vec3<T> intersectionPoint) // // bool intersects(const Box<Vec3<T>> &box, const Line3<T> &ray) // //--------------------------------------------------------------------------- #include "ImathBox.h" #include "ImathMatrix.h" #include "ImathLineAlgo.h" #include "ImathPlane.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template <class T> inline T clip (const T &p, const Box<T> &box) { // // Clip the coordinates of a point, p, against a box. // The result, q, is the closest point to p that is inside the box. // T q; for (int i = 0; i < int (box.min.dimensions()); i++) { if (p[i] < box.min[i]) q[i] = box.min[i]; else if (p[i] > box.max[i]) q[i] = box.max[i]; else q[i] = p[i]; } return q; } template <class T> inline T closestPointInBox (const T &p, const Box<T> &box) { return clip (p, box); } template <class T> Vec3<T> closestPointOnBox (const Vec3<T> &p, const Box< Vec3<T> > &box) { // // Find the point, q, on the surface of // the box, that is closest to point p. // // If the box is empty, return p. // if (box.isEmpty()) return p; Vec3<T> q = closestPointInBox (p, box); if (q == p) { Vec3<T> d1 = p - box.min; Vec3<T> d2 = box.max - p; Vec3<T> d ((d1.x < d2.x)? d1.x: d2.x, (d1.y < d2.y)? d1.y: d2.y, (d1.z < d2.z)? d1.z: d2.z); if (d.x < d.y && d.x < d.z) { q.x = (d1.x < d2.x)? box.min.x: box.max.x; } else if (d.y < d.z) { q.y = (d1.y < d2.y)? box.min.y: box.max.y; } else { q.z = (d1.z < d2.z)? box.min.z: box.max.z; } } return q; } template <class S, class T> Box< Vec3<S> > transform (const Box< Vec3<S> > &box, const Matrix44<T> &m) { // // Transform a 3D box by a matrix, and compute a new box that // tightly encloses the transformed box. // // If m is an affine transform, then we use James Arvo's fast // method as described in "Graphics Gems", Academic Press, 1990, // pp. 548-550. // // // A transformed empty box is still empty, and a transformed infinite box // is still infinite // if (box.isEmpty() || box.isInfinite()) return box; // // If the last column of m is (0 0 0 1) then m is an affine // transform, and we use the fast Graphics Gems trick. // if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1) { Box< Vec3<S> > newBox; for (int i = 0; i < 3; i++) { newBox.min[i] = newBox.max[i] = (S) m[3][i]; for (int j = 0; j < 3; j++) { S a, b; a = (S) m[j][i] * box.min[j]; b = (S) m[j][i] * box.max[j]; if (a < b) { newBox.min[i] += a; newBox.max[i] += b; } else { newBox.min[i] += b; newBox.max[i] += a; } } } return newBox; } // // M is a projection matrix. Do things the naive way: // Transform the eight corners of the box, and find an // axis-parallel box that encloses the transformed corners. // Vec3<S> points[8]; points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0]; points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0]; points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1]; points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1]; points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2]; points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2]; Box< Vec3<S> > newBox; for (int i = 0; i < 8; i++) newBox.extendBy (points[i] * m); return newBox; } template <class S, class T> void transform (const Box< Vec3<S> > &box, const Matrix44<T> &m, Box< Vec3<S> > &result) { // // Transform a 3D box by a matrix, and compute a new box that // tightly encloses the transformed box. // // If m is an affine transform, then we use James Arvo's fast // method as described in "Graphics Gems", Academic Press, 1990, // pp. 548-550. // // // A transformed empty box is still empty, and a transformed infinite // box is still infinite // if (box.isEmpty() || box.isInfinite()) { return; } // // If the last column of m is (0 0 0 1) then m is an affine // transform, and we use the fast Graphics Gems trick. // if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1) { for (int i = 0; i < 3; i++) { result.min[i] = result.max[i] = (S) m[3][i]; for (int j = 0; j < 3; j++) { S a, b; a = (S) m[j][i] * box.min[j]; b = (S) m[j][i] * box.max[j]; if (a < b) { result.min[i] += a; result.max[i] += b; } else { result.min[i] += b; result.max[i] += a; } } } return; } // // M is a projection matrix. Do things the naive way: // Transform the eight corners of the box, and find an // axis-parallel box that encloses the transformed corners. // Vec3<S> points[8]; points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0]; points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0]; points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1]; points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1]; points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2]; points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2]; for (int i = 0; i < 8; i++) result.extendBy (points[i] * m); } template <class S, class T> Box< Vec3<S> > affineTransform (const Box< Vec3<S> > &box, const Matrix44<T> &m) { // // Transform a 3D box by a matrix whose rightmost column // is (0 0 0 1), and compute a new box that tightly encloses // the transformed box. // // As in the transform() function, above, we use James Arvo's // fast method. // if (box.isEmpty() || box.isInfinite()) { // // A transformed empty or infinite box is still empty or infinite // return box; } Box< Vec3<S> > newBox; for (int i = 0; i < 3; i++) { newBox.min[i] = newBox.max[i] = (S) m[3][i]; for (int j = 0; j < 3; j++) { S a, b; a = (S) m[j][i] * box.min[j]; b = (S) m[j][i] * box.max[j]; if (a < b) { newBox.min[i] += a; newBox.max[i] += b; } else { newBox.min[i] += b; newBox.max[i] += a; } } } return newBox; } template <class S, class T> void affineTransform (const Box< Vec3<S> > &box, const Matrix44<T> &m, Box<Vec3<S> > &result) { // // Transform a 3D box by a matrix whose rightmost column // is (0 0 0 1), and compute a new box that tightly encloses // the transformed box. // // As in the transform() function, above, we use James Arvo's // fast method. // if (box.isEmpty()) { // // A transformed empty box is still empty // result.makeEmpty(); return; } if (box.isInfinite()) { // // A transformed infinite box is still infinite // result.makeInfinite(); return; } for (int i = 0; i < 3; i++) { result.min[i] = result.max[i] = (S) m[3][i]; for (int j = 0; j < 3; j++) { S a, b; a = (S) m[j][i] * box.min[j]; b = (S) m[j][i] * box.max[j]; if (a < b) { result.min[i] += a; result.max[i] += b; } else { result.min[i] += b; result.max[i] += a; } } } } template <class T> bool findEntryAndExitPoints (const Line3<T> &r, const Box<Vec3<T> > &b, Vec3<T> &entry, Vec3<T> &exit) { // // Compute the points where a ray, r, enters and exits a box, b: // // findEntryAndExitPoints() returns // // - true if the ray starts inside the box or if the // ray starts outside and intersects the box // // - false otherwise (that is, if the ray does not // intersect the box) // // The entry and exit points are // // - points on two of the faces of the box when // findEntryAndExitPoints() returns true // (The entry end exit points may be on either // side of the ray's origin) // // - undefined when findEntryAndExitPoints() // returns false // if (b.isEmpty()) { // // No ray intersects an empty box // return false; } // // The following description assumes that the ray's origin is outside // the box, but the code below works even if the origin is inside the // box: // // Between one and three "frontfacing" sides of the box are oriented // towards the ray's origin, and between one and three "backfacing" // sides are oriented away from the ray's origin. // We intersect the ray with the planes that contain the sides of the // box, and compare the distances between the ray's origin and the // ray-plane intersections. The ray intersects the box if the most // distant frontfacing intersection is nearer than the nearest // backfacing intersection. If the ray does intersect the box, then // the most distant frontfacing ray-plane intersection is the entry // point and the nearest backfacing ray-plane intersection is the // exit point. // const T TMAX = limits<T>::max(); T tFrontMax = -TMAX; T tBackMin = TMAX; // // Minimum and maximum X sides. // if (r.dir.x >= 0) { T d1 = b.max.x - r.pos.x; T d2 = b.min.x - r.pos.x; if (r.dir.x > 1 || (abs (d1) < TMAX * r.dir.x && abs (d2) < TMAX * r.dir.x)) { T t1 = d1 / r.dir.x; T t2 = d2 / r.dir.x; if (tBackMin > t1) { tBackMin = t1; exit.x = b.max.x; exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); } if (tFrontMax < t2) { tFrontMax = t2; entry.x = b.min.x; entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); } } else if (r.pos.x < b.min.x || r.pos.x > b.max.x) { return false; } } else // r.dir.x < 0 { T d1 = b.min.x - r.pos.x; T d2 = b.max.x - r.pos.x; if (r.dir.x < -1 || (abs (d1) < -TMAX * r.dir.x && abs (d2) < -TMAX * r.dir.x)) { T t1 = d1 / r.dir.x; T t2 = d2 / r.dir.x; if (tBackMin > t1) { tBackMin = t1; exit.x = b.min.x; exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); } if (tFrontMax < t2) { tFrontMax = t2; entry.x = b.max.x; entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); } } else if (r.pos.x < b.min.x || r.pos.x > b.max.x) { return false; } } // // Minimum and maximum Y sides. // if (r.dir.y >= 0) { T d1 = b.max.y - r.pos.y; T d2 = b.min.y - r.pos.y; if (r.dir.y > 1 || (abs (d1) < TMAX * r.dir.y && abs (d2) < TMAX * r.dir.y)) { T t1 = d1 / r.dir.y; T t2 = d2 / r.dir.y; if (tBackMin > t1) { tBackMin = t1; exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); exit.y = b.max.y; exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); } if (tFrontMax < t2) { tFrontMax = t2; entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); entry.y = b.min.y; entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); } } else if (r.pos.y < b.min.y || r.pos.y > b.max.y) { return false; } } else // r.dir.y < 0 { T d1 = b.min.y - r.pos.y; T d2 = b.max.y - r.pos.y; if (r.dir.y < -1 || (abs (d1) < -TMAX * r.dir.y && abs (d2) < -TMAX * r.dir.y)) { T t1 = d1 / r.dir.y; T t2 = d2 / r.dir.y; if (tBackMin > t1) { tBackMin = t1; exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); exit.y = b.min.y; exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); } if (tFrontMax < t2) { tFrontMax = t2; entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); entry.y = b.max.y; entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); } } else if (r.pos.y < b.min.y || r.pos.y > b.max.y) { return false; } } // // Minimum and maximum Z sides. // if (r.dir.z >= 0) { T d1 = b.max.z - r.pos.z; T d2 = b.min.z - r.pos.z; if (r.dir.z > 1 || (abs (d1) < TMAX * r.dir.z && abs (d2) < TMAX * r.dir.z)) { T t1 = d1 / r.dir.z; T t2 = d2 / r.dir.z; if (tBackMin > t1) { tBackMin = t1; exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); exit.z = b.max.z; } if (tFrontMax < t2) { tFrontMax = t2; entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); entry.z = b.min.z; } } else if (r.pos.z < b.min.z || r.pos.z > b.max.z) { return false; } } else // r.dir.z < 0 { T d1 = b.min.z - r.pos.z; T d2 = b.max.z - r.pos.z; if (r.dir.z < -1 || (abs (d1) < -TMAX * r.dir.z && abs (d2) < -TMAX * r.dir.z)) { T t1 = d1 / r.dir.z; T t2 = d2 / r.dir.z; if (tBackMin > t1) { tBackMin = t1; exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); exit.z = b.min.z; } if (tFrontMax < t2) { tFrontMax = t2; entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); entry.z = b.max.z; } } else if (r.pos.z < b.min.z || r.pos.z > b.max.z) { return false; } } return tFrontMax <= tBackMin; } template<class T> bool intersects (const Box< Vec3<T> > &b, const Line3<T> &r, Vec3<T> &ip) { // // Intersect a ray, r, with a box, b, and compute the intersection // point, ip: // // intersect() returns // // - true if the ray starts inside the box or if the // ray starts outside and intersects the box // // - false if the ray starts outside the box and intersects it, // but the intersection is behind the ray's origin. // // - false if the ray starts outside and does not intersect it // // The intersection point is // // - the ray's origin if the ray starts inside the box // // - a point on one of the faces of the box if the ray // starts outside the box // // - undefined when intersect() returns false // if (b.isEmpty()) { // // No ray intersects an empty box // return false; } if (b.intersects (r.pos)) { // // The ray starts inside the box // ip = r.pos; return true; } // // The ray starts outside the box. Between one and three "frontfacing" // sides of the box are oriented towards the ray, and between one and // three "backfacing" sides are oriented away from the ray. // We intersect the ray with the planes that contain the sides of the // box, and compare the distances between ray's origin and the ray-plane // intersections. // The ray intersects the box if the most distant frontfacing intersection // is nearer than the nearest backfacing intersection. If the ray does // intersect the box, then the most distant frontfacing ray-plane // intersection is the ray-box intersection. // const T TMAX = limits<T>::max(); T tFrontMax = -1; T tBackMin = TMAX; // // Minimum and maximum X sides. // if (r.dir.x > 0) { if (r.pos.x > b.max.x) return false; T d = b.max.x - r.pos.x; if (r.dir.x > 1 || d < TMAX * r.dir.x) { T t = d / r.dir.x; if (tBackMin > t) tBackMin = t; } if (r.pos.x <= b.min.x) { T d = b.min.x - r.pos.x; T t = (r.dir.x > 1 || d < TMAX * r.dir.x)? d / r.dir.x: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = b.min.x; ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); } } } else if (r.dir.x < 0) { if (r.pos.x < b.min.x) return false; T d = b.min.x - r.pos.x; if (r.dir.x < -1 || d > TMAX * r.dir.x) { T t = d / r.dir.x; if (tBackMin > t) tBackMin = t; } if (r.pos.x >= b.max.x) { T d = b.max.x - r.pos.x; T t = (r.dir.x < -1 || d > TMAX * r.dir.x)? d / r.dir.x: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = b.max.x; ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); } } } else // r.dir.x == 0 { if (r.pos.x < b.min.x || r.pos.x > b.max.x) return false; } // // Minimum and maximum Y sides. // if (r.dir.y > 0) { if (r.pos.y > b.max.y) return false; T d = b.max.y - r.pos.y; if (r.dir.y > 1 || d < TMAX * r.dir.y) { T t = d / r.dir.y; if (tBackMin > t) tBackMin = t; } if (r.pos.y <= b.min.y) { T d = b.min.y - r.pos.y; T t = (r.dir.y > 1 || d < TMAX * r.dir.y)? d / r.dir.y: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); ip.y = b.min.y; ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); } } } else if (r.dir.y < 0) { if (r.pos.y < b.min.y) return false; T d = b.min.y - r.pos.y; if (r.dir.y < -1 || d > TMAX * r.dir.y) { T t = d / r.dir.y; if (tBackMin > t) tBackMin = t; } if (r.pos.y >= b.max.y) { T d = b.max.y - r.pos.y; T t = (r.dir.y < -1 || d > TMAX * r.dir.y)? d / r.dir.y: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); ip.y = b.max.y; ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); } } } else // r.dir.y == 0 { if (r.pos.y < b.min.y || r.pos.y > b.max.y) return false; } // // Minimum and maximum Z sides. // if (r.dir.z > 0) { if (r.pos.z > b.max.z) return false; T d = b.max.z - r.pos.z; if (r.dir.z > 1 || d < TMAX * r.dir.z) { T t = d / r.dir.z; if (tBackMin > t) tBackMin = t; } if (r.pos.z <= b.min.z) { T d = b.min.z - r.pos.z; T t = (r.dir.z > 1 || d < TMAX * r.dir.z)? d / r.dir.z: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); ip.z = b.min.z; } } } else if (r.dir.z < 0) { if (r.pos.z < b.min.z) return false; T d = b.min.z - r.pos.z; if (r.dir.z < -1 || d > TMAX * r.dir.z) { T t = d / r.dir.z; if (tBackMin > t) tBackMin = t; } if (r.pos.z >= b.max.z) { T d = b.max.z - r.pos.z; T t = (r.dir.z < -1 || d > TMAX * r.dir.z)? d / r.dir.z: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); ip.z = b.max.z; } } } else // r.dir.z == 0 { if (r.pos.z < b.min.z || r.pos.z > b.max.z) return false; } return tFrontMax <= tBackMin; } template<class T> bool intersects (const Box< Vec3<T> > &box, const Line3<T> &ray) { Vec3<T> ignored; return intersects (box, ray, ignored); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHBOXALGO_H