📄 dxbounds.h
字号:
{
CHKTYPE();
CDXB_C Result;
Result.UnionBounds( *this, Bounds2 );
return Result;
} /* CDXBnds::operator| */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::GetMinVector( CDXV_C& v ) const
{
CHKTYPE();
for( int i = 0; i < 4; ++i )
{
v[i] = CDXB_T[i].Min;
}
} /* CDXBnds::GetMinVector */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::GetMaxVector( CDXV_C& v ) const
{
CHKTYPE();
for( int i = 0; i < 4; ++i )
{
v[i] = CDXB_T[i].Max;
}
} /* CDXBnds::GetMaxVector */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::GetSize( CDXB_C& SizeBounds ) const
{
CHKTYPE();
SizeBounds.SetEmpty();
SizeBounds[DXB_X].Max = CDXB_T[DXB_X].Max - CDXB_T[DXB_X].Min;
SizeBounds[DXB_Y].Max = CDXB_T[DXB_Y].Max - CDXB_T[DXB_Y].Min;
SizeBounds[DXB_Z].Max = CDXB_T[DXB_Z].Max - CDXB_T[DXB_Z].Min;
SizeBounds[DXB_T].Max = CDXB_T[DXB_T].Max - CDXB_T[DXB_T].Min;
} /* CDXBnds::GetSize */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
CDXB_C CDXB_C::Size( void ) const
{
CHKTYPE();
CDXB_C Size;
Size[DXB_X].Max = CDXB_T[DXB_X].Max - CDXB_T[DXB_X].Min;
Size[DXB_Y].Max = CDXB_T[DXB_Y].Max - CDXB_T[DXB_Y].Min;
Size[DXB_Z].Max = CDXB_T[DXB_Z].Max - CDXB_T[DXB_Z].Min;
Size[DXB_T].Max = CDXB_T[DXB_T].Max - CDXB_T[DXB_T].Min;
return Size;
} /* CDXBnds::Size */
// Operations
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::SetBounds( TYPE xmin, TYPE xmax, TYPE ymin, TYPE ymax,
TYPE zmin, TYPE zmax, TYPE tmin, TYPE tmax )
{
CHKTYPE();
CDXB_T[DXB_X].Min = xmin;
CDXB_T[DXB_X].Max = xmax;
CDXB_T[DXB_Y].Min = ymin;
CDXB_T[DXB_Y].Max = ymax;
CDXB_T[DXB_Z].Min = zmin;
CDXB_T[DXB_Z].Max = zmax;
CDXB_T[DXB_T].Min = tmin;
CDXB_T[DXB_T].Max = tmax;
} /* CDXBnds::SetBounds */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::SetXYRect( const RECT& xyRect )
{
CHKTYPE();
SetEmpty();
CDXB_T[DXB_X].Min = (TYPE)xyRect.left;
CDXB_T[DXB_X].Max = (TYPE)xyRect.right;
CDXB_T[DXB_Y].Min = (TYPE)xyRect.top;
CDXB_T[DXB_Y].Max = (TYPE)xyRect.bottom;
CDXB_T[DXB_Z].Max = 1;
CDXB_T[DXB_T].Max = (TYPE)LONG_MAX;
} /* CDXBnds::SetXYRect */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::GetXYRect( RECT& xyRect ) const
{
CHKTYPE();
xyRect.left = CDXB_T[DXB_X].Min;
xyRect.right = CDXB_T[DXB_X].Max;
xyRect.top = CDXB_T[DXB_Y].Min;
xyRect.bottom = CDXB_T[DXB_Y].Max;
} /* CDXBnds::GetXYRect */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::GetXYSize( SIZE& xySize ) const
{
CHKTYPE();
xySize.cx = CDXB_T[DXB_X].Max - CDXB_T[DXB_X].Min;
xySize.cy = CDXB_T[DXB_Y].Max - CDXB_T[DXB_Y].Min;
} /* CDXBnds::GetXYSize */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::SetXYSize( const SIZE& xySize )
{
CHKTYPE();
SetEmpty();
CDXB_T[DXB_X].Max = (TYPE)xySize.cx;
CDXB_T[DXB_Y].Max = (TYPE)xySize.cy;
CDXB_T[DXB_Z].Max = (TYPE)1;
CDXB_T[DXB_T].Max = (TYPE)LONG_MAX;
} /* CDXBnds::SetXYSize */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::SetXYSize( TYPE width, TYPE height )
{
CHKTYPE();
SetEmpty();
CDXB_T[DXB_X].Max = (TYPE)width;
CDXB_T[DXB_Y].Max = (TYPE)height;
CDXB_T[DXB_Z].Max = (TYPE)1;
CDXB_T[DXB_T].Max = (TYPE)LONG_MAX;
} /* CDXBnds::SetXYSize */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::SetXYPoint( const POINT& xyPoint )
{
CHKTYPE();
SetEmpty();
CDXB_T[DXB_X].Min = (TYPE)xyPoint.x;
CDXB_T[DXB_X].Max = (TYPE)xyPoint.x + 1;
CDXB_T[DXB_Y].Min = (TYPE)xyPoint.y;
CDXB_T[DXB_Y].Max = (TYPE)xyPoint.y + 1;
CDXB_T[DXB_Z].Max = (TYPE)1;
CDXB_T[DXB_T].Max = (TYPE)LONG_MAX;
} /* CDXDBnds::SetRect */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::Offset( TYPE x, TYPE y, TYPE z, TYPE t )
{
CHKTYPE();
CDXB_T[DXB_X].Min += x;
CDXB_T[DXB_X].Max += x; // BUGBUG -- What about infinite?
CDXB_T[DXB_Y].Min += y;
CDXB_T[DXB_Y].Max += y;
CDXB_T[DXB_Z].Min += z;
CDXB_T[DXB_Z].Max += z;
CDXB_T[DXB_T].Min += t;
CDXB_T[DXB_T].Max += t;
} /* CDXBnds::Offset */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::SetToSize(void)
{
CHKTYPE();
for( int i = 0; i < 4; ++i )
{
CDXB_T[i].Max -= CDXB_T[i].Min;
CDXB_T[i].Min = 0;
}
}
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::SetPlacement(const CDXV_C & v)
{
CHKTYPE();
for( int i = 0; i < 4; ++i )
{
CDXB_T[i].Max += (CDXV_O( v )[i] - CDXB_T[i].Min);
CDXB_T[i].Min = CDXV_O( v )[i];
}
} /* CDXBnds::Offset */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::Offset( const CDXV_C& v )
{
CHKTYPE();
for( int i = 0; i < 4; ++i )
{
CDXB_T[i].Min += v[i];
CDXB_T[i].Max += v[i];
}
} /* CDXBnds::Offset */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator+=(const POINT &point)
{
CHKTYPE();
CDXB_T[DXB_X].Min += (TYPE)point.x;
CDXB_T[DXB_X].Max += (TYPE)point.x;
CDXB_T[DXB_Y].Min += (TYPE)point.y;
CDXB_T[DXB_Y].Max += (TYPE)point.y;
} /* CDXBnds::operator+= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator-=(const POINT &point)
{
CHKTYPE();
CDXB_T[DXB_X].Min -= (TYPE)point.x;
CDXB_T[DXB_X].Max -= (TYPE)point.x;
CDXB_T[DXB_Y].Min -= (TYPE)point.y;
CDXB_T[DXB_Y].Max -= (TYPE)point.y;
} /* CDXBnds::operator-= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator+=(const SIZE &size)
{
CHKTYPE();
CDXB_T[DXB_X].Min += (TYPE)size.cx;
CDXB_T[DXB_X].Max += (TYPE)size.cx;
CDXB_T[DXB_Y].Min += (TYPE)size.cy;
CDXB_T[DXB_Y].Max += (TYPE)size.cy;
} /* CDXBnds::operator+= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator-=(const SIZE &size)
{
CHKTYPE();
CDXB_T[DXB_X].Min -= (TYPE)size.cx;
CDXB_T[DXB_X].Max -= (TYPE)size.cx;
CDXB_T[DXB_Y].Min -= (TYPE)size.cy;
CDXB_T[DXB_Y].Max -= (TYPE)size.cy;
} /* CDXBnds::operator-= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator+=(const CDXV_C& v)
{
CHKTYPE();
CDXB_T[DXB_X].Min += CDXV_O( v )[DXB_X];
CDXB_T[DXB_X].Max += CDXV_O( v )[DXB_X];
CDXB_T[DXB_Y].Min += CDXV_O( v )[DXB_Y];
CDXB_T[DXB_Y].Max += CDXV_O( v )[DXB_Y];
CDXB_T[DXB_Z].Min += CDXV_O( v )[DXB_Z];
CDXB_T[DXB_Z].Max += CDXV_O( v )[DXB_Z];
CDXB_T[DXB_T].Min += CDXV_O( v )[DXB_T];
CDXB_T[DXB_T].Max += CDXV_O( v )[DXB_T];
} /* CDXBnds::operator+= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator-=(const CDXV_C& v)
{
CHKTYPE();
CDXB_T[DXB_X].Min -= CDXV_O( v )[DXB_X];
CDXB_T[DXB_X].Max -= CDXV_O( v )[DXB_X];
CDXB_T[DXB_Y].Min -= CDXV_O( v )[DXB_Y];
CDXB_T[DXB_Y].Max -= CDXV_O( v )[DXB_Y];
CDXB_T[DXB_Z].Min -= CDXV_O( v )[DXB_Z];
CDXB_T[DXB_Z].Max -= CDXV_O( v )[DXB_Z];
CDXB_T[DXB_T].Min -= CDXV_O( v )[DXB_T];
CDXB_T[DXB_T].Max -= CDXV_O( v )[DXB_T];
} /* CDXBnds::operator-= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator+=( const CDXB_C& Bounds )
{
CHKTYPE();
CDXB_T[DXB_X].Min += CDXB_O( Bounds )[DXB_X].Min;
CDXB_T[DXB_X].Max += CDXB_O( Bounds )[DXB_X].Max;
CDXB_T[DXB_Y].Min += CDXB_O( Bounds )[DXB_Y].Min;
CDXB_T[DXB_Y].Max += CDXB_O( Bounds )[DXB_Y].Max;
CDXB_T[DXB_Z].Min += CDXB_O( Bounds )[DXB_Z].Min;
CDXB_T[DXB_Z].Max += CDXB_O( Bounds )[DXB_Z].Max;
CDXB_T[DXB_T].Min += CDXB_O( Bounds )[DXB_T].Min;
CDXB_T[DXB_T].Max += CDXB_O( Bounds )[DXB_T].Max;
} /* CDXBnds::operator+= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator-=( const CDXB_C& Bounds )
{
CHKTYPE();
CDXB_T[DXB_X].Min -= CDXB_O( Bounds )[DXB_X].Min;
CDXB_T[DXB_X].Max -= CDXB_O( Bounds )[DXB_X].Max;
CDXB_T[DXB_Y].Min -= CDXB_O( Bounds )[DXB_Y].Min;
CDXB_T[DXB_Y].Max -= CDXB_O( Bounds )[DXB_Y].Max;
CDXB_T[DXB_Z].Min -= CDXB_O( Bounds )[DXB_Z].Min;
CDXB_T[DXB_Z].Max -= CDXB_O( Bounds )[DXB_Z].Max;
CDXB_T[DXB_T].Min -= CDXB_O( Bounds )[DXB_T].Min;
CDXB_T[DXB_T].Max -= CDXB_O( Bounds )[DXB_T].Max;
} /* CDXB_C::operator-= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator&=( const CDXB_C& Bounds )
{
CHKTYPE();
for( int i = 0; i < 4; ++i )
{
CDXB_T[i].Min = max( CDXB_T[i].Min, CDXB_O( Bounds )[i].Min );
CDXB_T[i].Max = min( CDXB_T[i].Max, CDXB_O( Bounds )[i].Max );
}
} /* CDXB_C::operator&= */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::operator|=( const CDXB_C& Bounds )
{
CHKTYPE();
for( long i = 0; i < 4; ++i )
{
CDXB_T[i].Min = min( CDXB_T[i].Min, CDXB_O( Bounds )[i].Min );
CDXB_T[i].Max = max( CDXB_T[i].Max, CDXB_O( Bounds )[i].Max );
}
} /* CDXB_C::operator|= */
// operators returning CDXDBnds values
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
CDXB_C CDXB_C::operator+(const POINT &point) const
{
CHKTYPE();
CDXB_C Result( *this );
CDXB_O( Result )[DXB_X].Min += point.x;
CDXB_O( Result )[DXB_X].Max += point.x;
CDXB_O( Result )[DXB_Y].Min += point.y;
CDXB_O( Result )[DXB_Y].Max += point.y;
return Result;
} /* CDXBnds::operator+ */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
CDXB_C CDXB_C::operator-(const POINT &point) const
{
CHKTYPE();
CDXB_C Result( *this );
CDXB_O( Result )[DXB_X].Min -= point.x;
CDXB_O( Result )[DXB_X].Max -= point.x;
CDXB_O( Result )[DXB_Y].Min -= point.y;
CDXB_O( Result )[DXB_Y].Max -= point.y;
return Result;
} /* CDXBnds::operator- */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
CDXB_C CDXB_C::operator+(const SIZE &size) const
{
CHKTYPE();
CDXB_C Result( *this );
CDXB_O( Result )[DXB_X].Min += size.cx;
CDXB_O( Result )[DXB_X].Max += size.cx;
CDXB_O( Result )[DXB_Y].Min += size.cy;
CDXB_O( Result )[DXB_Y].Max += size.cy;
return Result;
} /* CDXBnds::operator+ */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
CDXB_C CDXB_C::operator-( const SIZE &size ) const
{
CHKTYPE();
CDXB_C Result( *this );
CDXB_O( Result )[DXB_X].Min -= size.cx;
CDXB_O( Result )[DXB_X].Max -= size.cx;
CDXB_O( Result )[DXB_Y].Min -= size.cy;
CDXB_O( Result )[DXB_Y].Max -= size.cy;
return Result;
} /* CDXB_C::operator- */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
CDXB_C CDXB_C::operator+(const CDXV_C& v) const
{
CHKTYPE();
CDXB_C Result( *this );
CDXB_O( Result )[DXB_X].Min += CDXV_O( v )[DXB_X];
CDXB_O( Result )[DXB_X].Max += CDXV_O( v )[DXB_X];
CDXB_O( Result )[DXB_Y].Min += CDXV_O( v )[DXB_Y];
CDXB_O( Result )[DXB_Y].Max += CDXV_O( v )[DXB_Y];
CDXB_O( Result )[DXB_Z].Min += CDXV_O( v )[DXB_Z];
CDXB_O( Result )[DXB_Z].Max += CDXV_O( v )[DXB_Z];
CDXB_O( Result )[DXB_T].Min += CDXV_O( v )[DXB_T];
CDXB_O( Result )[DXB_T].Max += CDXV_O( v )[DXB_T];
return Result;
} /* CDXBnds::operator+ */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
CDXB_C CDXB_C::operator-(const CDXV_C& v) const
{
CHKTYPE();
CDXB_C Result( *this );
CDXB_O( Result )[DXB_X].Min -= CDXV_O( v )[DXB_X];
CDXB_O( Result )[DXB_X].Max -= CDXV_O( v )[DXB_X];
CDXB_O( Result )[DXB_Y].Min -= CDXV_O( v )[DXB_Y];
CDXB_O( Result )[DXB_Y].Max -= CDXV_O( v )[DXB_Y];
CDXB_O( Result )[DXB_Z].Min -= CDXV_O( v )[DXB_Z];
CDXB_O( Result )[DXB_Z].Max -= CDXV_O( v )[DXB_Z];
CDXB_O( Result )[DXB_T].Min -= CDXV_O( v )[DXB_T];
CDXB_O( Result )[DXB_T].Max -= CDXV_O( v )[DXB_T];
return Result;
} /* CDXBnds::operator- */
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
HRESULT CDXB_C::SetToSurfaceBounds(IDXSurface * pDXSurface)
{
#if (eBndType != DXBT_DISCRETE)
#error SetToSurfacBounds requires a continuous bounds.
#endif
CHKTYPE();
return pDXSurface->GetBounds( this );
}
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
HRESULT CDXB_C::SetToMeshBounds(IDirect3DRMMeshBuilder3 * pMesh)
{
#if (eBndType != DXBT_CONTINUOUS)
#error SetToMeshBounds requires a continuous bounds.
#endif
CHKTYPE();
D3DRMBOX Box;
HRESULT hr = pMesh->GetBox(&Box);
u.C[DXB_X].Min = Box.min.x;
u.C[DXB_X].Max = Box.max.x;
u.C[DXB_Y].Min = Box.min.y;
u.C[DXB_Y].Max = Box.max.y;
u.C[DXB_Z].Min = Box.min.z;
u.C[DXB_Z].Max = Box.max.z;
u.C[DXB_T].Min = 0;
u.C[DXB_T].Max = 1.;
return hr;
}
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::Scale(const CDXV_C& v)
{
CHKTYPE();
for(long i = 0; i < 4; ++i )
{
TYPE mid = (CDXB_T[i].Min + CDXB_T[i].Max) / 2;
TYPE scale = CDXV_O(v)[i] * (CDXB_T[i].Max - mid);
CDXB_T[i].Min = mid - scale;
CDXB_T[i].Max = mid + scale;
}
}
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::Scale(TYPE x, TYPE y, TYPE z, TYPE t)
{
Scale(CDXV_C(x, y, z, t));
}
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::Expand(const CDXV_C& v)
{
CHKTYPE();
for(long i = 0; i < 4; ++i )
{
TYPE scale = CDXV_O(v)[i] / 2;
CDXB_T[i].Min -= scale;
CDXB_T[i].Max += scale;
}
}
template<class TYPE, class USTYPE, class STTYPE, DXBNDTYPE eBndType>
void CDXB_C::Expand(TYPE x, TYPE y, TYPE z, TYPE t)
{
Expand(CDXV_C(x, y, z, t));
}
//---
typedef CDXBnds<long, unsigned long, DXDBND, DXBT_DISCRETE> CDXDBnds;
typedef CDXBnds<LONGLONG, ULONGLONG, DXDBND64, DXBT_DISCRETE64> CDXDBnds64;
typedef CDXBnds<float, float, DXCBND, DXBT_CONTINUOUS> CDXCBnds;
typedef CDXBnds<double, double, DXCBND64, DXBT_CONTINUOUS64> CDXCBnds64;
//=== Macro Definitions ============================================
//=== Global Data Declarations =====================================
//=== Function Prototypes ==========================================
#pragma option pop /*P_O_Pop*/
#endif /* This must be the last line in the file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -