102 lines
3.1 KiB
C++
102 lines
3.1 KiB
C++
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// Copyright (C) Microsoft Corporation, 2000.
|
||
|
//
|
||
|
// refrasti.hpp
|
||
|
//
|
||
|
// Direct3D Reference Device - Main Internal Header File
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
#ifndef _REFRASTI_HPP
|
||
|
#define _REFRASTI_HPP
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// //
|
||
|
// Texture Mapping Utility Functions //
|
||
|
// //
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
//
|
||
|
// various approximations and tricks to speed up the texture map coverage
|
||
|
// computations
|
||
|
//
|
||
|
|
||
|
// Integer value of first exponent bit in a float. Provides a scaling factor
|
||
|
// for exponent values extracted directly from float representation.
|
||
|
#define FLOAT_EXPSCALE ((FLOAT)0x00800000)
|
||
|
#define FLOAT_OOEXPSCALE ((FLOAT)(1.0 / (double)FLOAT_EXPSCALE))
|
||
|
|
||
|
// Integer representation of 1.0f.
|
||
|
#define INT32_FLOAT_ONE 0x3f800000
|
||
|
|
||
|
static inline FLOAT
|
||
|
RR_LOG2(FLOAT f)
|
||
|
{
|
||
|
return (FLOAT)(AS_INT32(f) - INT32_FLOAT_ONE) * FLOAT_OOEXPSCALE;
|
||
|
}
|
||
|
|
||
|
static inline FLOAT
|
||
|
RR_ALOG2(FLOAT f)
|
||
|
{
|
||
|
INT32 i = (INT32)(f * FLOAT_EXPSCALE) + INT32_FLOAT_ONE;
|
||
|
return AS_FLOAT((long int)i);
|
||
|
}
|
||
|
|
||
|
static inline FLOAT
|
||
|
RR_ABSF(FLOAT f)
|
||
|
{
|
||
|
UINT32 i = AS_UINT32(f) & 0x7fffffff;
|
||
|
return AS_FLOAT((unsigned long int)i);
|
||
|
}
|
||
|
|
||
|
static inline FLOAT
|
||
|
RR_SQRT(FLOAT f)
|
||
|
{
|
||
|
INT32 i = (AS_INT32(f) >> 1) + (INT32_FLOAT_ONE >> 1);
|
||
|
return AS_FLOAT((long int)i);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Steve Gabriel's version of an octagonal approximation euclidian distance -
|
||
|
// return is approximating sqrt(fX*fX + fY*fY)
|
||
|
//
|
||
|
static inline FLOAT
|
||
|
RR_LENGTH(FLOAT fX, FLOAT fY)
|
||
|
{
|
||
|
fX = RR_ABSF(fX);
|
||
|
fY = RR_ABSF(fY);
|
||
|
return ((11.0f/32.0f)*(fX + fY) + (21.0f/32.0f)*max(fX, fY));
|
||
|
}
|
||
|
|
||
|
// compute level of detail (texel->pixel coverage)
|
||
|
void
|
||
|
ComputeSimpleLevelOfDetail(
|
||
|
const RDTextureCoord& TCoord, // inputs
|
||
|
FLOAT& fLOD ); // outputs
|
||
|
|
||
|
void
|
||
|
ComputeCubeMapLevelOfDetail(
|
||
|
const RDTextureCoord& TCoord, // inputs
|
||
|
FLOAT& fLOD ); // outputs
|
||
|
|
||
|
void
|
||
|
ComputeAnisotropicLevelOfDetail(
|
||
|
const RDTextureCoord& TCoord, FLOAT fMaxAniso, // inputs
|
||
|
FLOAT& fLOD, FLOAT& fRatio, FLOAT fDelta[] ); // outputs
|
||
|
|
||
|
// color interpolation utilities
|
||
|
void LerpColor(RDColor& Color,
|
||
|
const RDColor& Color0, const RDColor& Color1, UINT8 uT);
|
||
|
void BiLerpColor( RDColor& OutColor,
|
||
|
const RDColor& Color00, const RDColor& Color01,
|
||
|
const RDColor& Color10, const RDColor& Color11,
|
||
|
UINT8 uA, UINT8 uB);
|
||
|
void BiLerpColor3D( RDColor& OutColor,
|
||
|
const RDColor& Color000, const RDColor& Color010,
|
||
|
const RDColor& Color100, const RDColor& Color110,
|
||
|
const RDColor& Color001, const RDColor& Color011,
|
||
|
const RDColor& Color101, const RDColor& Color111,
|
||
|
UINT8 uA, UINT8 uB, UINT8 uC);
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
#endif // _REFRASTI_HPP
|