windows-nt/Source/XPSP1/NT/multimedia/directx/dxg/ref8/hop/npatch.hpp
2020-09-26 16:20:57 +08:00

84 lines
2.5 KiB
C++

/*============================================================================
*
* Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
*
* File: npatch.hpp
* Content: Declarations for n-Patch scheme
*
****************************************************************************/
#ifndef _NPATCH_HPP
#define _NPATCH_HPP
class RDCubicBezierTriangle
{
public:
void SamplePosition(double u, double v, FLOAT *Q) const;
void Sample(DWORD dwDataType, double u, double v, const BYTE* const B[], BYTE *Q) const;
protected:
double m_B[4][4][3];
private:
unsigned factorial(unsigned k) const
{
_ASSERT(k < 13, "Factorial out of range");
for(unsigned i = 1, t = 1; i <= k; t *= i++);
return t;
}
double Basis(unsigned i, unsigned j, double u, double v) const
{
unsigned k = 3 - i - j;
double w = 1.0 - u - v;
_ASSERT(i + j + k == 3, "Barycentric coordinates need to add to 3");
return (6.0 * pow(u, double(i)) * pow(v, double(j)) * pow(w, double(k))) / double(factorial(i) * factorial(j) * factorial(k));
}
};
class RDNPatch : public RDCubicBezierTriangle
{
public:
RDNPatch(const FLOAT* const pV[], const FLOAT* const pN[],
const DWORD PositionOrder, const DWORD NormalOrder);
void SamplePosition(double u, double v, FLOAT *Q) const;
void SampleNormal(double u, double v, const BYTE* const B[], FLOAT *Q) const;
private:
void ComputeEdgeControlPoint(unsigned a, unsigned b, const FLOAT* const pV[], const FLOAT* const pN[], unsigned u, unsigned v);
void ComputeNormalControlPoint(RDVECTOR3* cp, unsigned i, unsigned j,
const FLOAT* const pV[],
const FLOAT* const pN[]);
DWORD m_PositionOrder;
DWORD m_NormalOrder;
// Normal coefficients
RDVECTOR3 m_N200;
RDVECTOR3 m_N020;
RDVECTOR3 m_N002;
RDVECTOR3 m_N110;
RDVECTOR3 m_N011;
RDVECTOR3 m_N101;
};
class RRIndexAccessor
{
public:
RRIndexAccessor(BYTE *pBuf, DWORD dwStride, DWORD dwStart)
{
_ASSERT(dwStride == 2 || dwStride == 4, "Unsupported indexbuffer stride");
m_pBuf = pBuf + dwStart * dwStride;
m_32 = (dwStride == 4);
}
unsigned operator[](unsigned i) const
{
return m_32 ? ((DWORD*)m_pBuf)[i] : ((WORD*)m_pBuf)[i];
}
private:
VOID *m_pBuf;
bool m_32;
};
#endif // _NPATCH_HPP