📄 mgcbeziertriangle3.cpp
字号:
kSubBP.m_aakThh[2] = kThh12;
}
SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(s0,tm),(sm,tm),(s0,t1)>
kSubBP.m_uiI0 = uiI02;
kSubBP.m_uiI1 = uiI12;
kSubBP.m_uiI2 = rkBP.m_uiI2;
kSubBP.m_aakXuu[0] = kXuu02;
kSubBP.m_aakXuu[1] = kXuu12;
kSubBP.m_aakXuu[2] = rkBP.m_aakXuu[2];
kSubBP.m_aakXvv[0] = kXvv02;
kSubBP.m_aakXvv[1] = kXvv12;
kSubBP.m_aakXvv[2] = rkBP.m_aakXvv[2];
kSubBP.m_aakXhh[0] = kXhh02;
kSubBP.m_aakXhh[1] = kXhh12;
kSubBP.m_aakXhh[2] = rkBP.m_aakXhh[2];
if ( akColor )
{
kSubBP.m_aakCuu[0] = kCuu02;
kSubBP.m_aakCuu[1] = kCuu12;
kSubBP.m_aakCuu[2] = rkBP.m_aakCuu[2];
kSubBP.m_aakCvv[0] = kCvv02;
kSubBP.m_aakCvv[1] = kCvv12;
kSubBP.m_aakCvv[2] = rkBP.m_aakCvv[2];
kSubBP.m_aakChh[0] = kChh02;
kSubBP.m_aakChh[1] = kChh12;
kSubBP.m_aakChh[2] = rkBP.m_aakChh[2];
}
if ( akTexture )
{
kSubBP.m_aakTuu[0] = kTuu02;
kSubBP.m_aakTuu[1] = kTuu12;
kSubBP.m_aakTuu[2] = rkBP.m_aakTuu[2];
kSubBP.m_aakTvv[0] = kTvv02;
kSubBP.m_aakTvv[1] = kTvv12;
kSubBP.m_aakTvv[2] = rkBP.m_aakTvv[2];
kSubBP.m_aakThh[0] = kThh02;
kSubBP.m_aakThh[1] = kThh12;
kSubBP.m_aakThh[2] = rkBP.m_aakThh[2];
}
SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(sm,t0),(sm,tm),(s0,tm)>
kSubBP.m_uiI0 = uiI01;
kSubBP.m_uiI1 = uiI12;
kSubBP.m_uiI2 = uiI02;
kSubBP.m_aakXuu[0] = kXuu01;
kSubBP.m_aakXuu[1] = kXuu12;
kSubBP.m_aakXuu[2] = kXuu02;
kSubBP.m_aakXvv[0] = kXvv01;
kSubBP.m_aakXvv[1] = kXvv12;
kSubBP.m_aakXvv[2] = kXvv02;
kSubBP.m_aakXhh[0] = kXhh01;
kSubBP.m_aakXhh[1] = kXhh12;
kSubBP.m_aakXhh[2] = kXhh02;
if ( akColor )
{
kSubBP.m_aakCuu[0] = kCuu01;
kSubBP.m_aakCuu[1] = kCuu12;
kSubBP.m_aakCuu[2] = kCuu02;
kSubBP.m_aakCvv[0] = kCvv01;
kSubBP.m_aakCvv[1] = kCvv12;
kSubBP.m_aakCvv[2] = kCvv02;
kSubBP.m_aakChh[0] = kChh01;
kSubBP.m_aakChh[1] = kChh12;
kSubBP.m_aakChh[2] = kChh02;
}
if ( akTexture )
{
kSubBP.m_aakTuu[0] = kTuu01;
kSubBP.m_aakTuu[1] = kTuu12;
kSubBP.m_aakTuu[2] = kTuu02;
kSubBP.m_aakTvv[0] = kTvv01;
kSubBP.m_aakTvv[1] = kTvv12;
kSubBP.m_aakTvv[2] = kTvv02;
kSubBP.m_aakThh[0] = kThh01;
kSubBP.m_aakThh[1] = kThh12;
kSubBP.m_aakThh[2] = kThh02;
}
SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
}
}
//----------------------------------------------------------------------------
void MgcBezierTriangle3::SubdivideUR (unsigned int uiLevel, MgcReal fDSqr,
MgcVector3* akX, MgcVector3* akXu, MgcVector3* akXv, MgcColor* akColor,
MgcVector2* akTexture, BlockParameters& rkBP)
{
/*
i2 i1
+----+
\ |
\|
+
i0
*/
// subdivision indices
unsigned int uiI12 = (rkBP.m_uiI1 + rkBP.m_uiI2) >> 1;
unsigned int uiD12 = rkBP.m_uiI1 - rkBP.m_uiI2;
unsigned int uiI01 = (((rkBP.m_uiI0+rkBP.m_uiI1) << 2)+uiD12*uiD12) >> 3;
unsigned int uiI02 = uiI01 - (uiD12 >> 1);
// vertices
// top u-edge subdivision
MgcVector3 kXuu12 = 0.5*(rkBP.m_aakXuu[1] + rkBP.m_aakXuu[2]);
MgcVector3 kXvv12 = 0.5*(rkBP.m_aakXvv[1] + rkBP.m_aakXvv[2]);
MgcVector3 kXhh12 = 0.5*(rkBP.m_aakXhh[1] + rkBP.m_aakXhh[2]);
akX[uiI12] = 0.5*(akX[rkBP.m_uiI1] + akX[rkBP.m_uiI2] - fDSqr*kXuu12);
// right v-edge subdivision
MgcVector3 kXuu01 = 0.5*(rkBP.m_aakXuu[0] + rkBP.m_aakXuu[1]);
MgcVector3 kXvv01 = 0.5*(rkBP.m_aakXvv[0] + rkBP.m_aakXvv[1]);
MgcVector3 kXhh01 = 0.5*(rkBP.m_aakXhh[0] + rkBP.m_aakXhh[1]);
akX[uiI01] = 0.5*(akX[rkBP.m_uiI0] + akX[rkBP.m_uiI1] - fDSqr*kXvv01);
// hypotenuse edge subdivision
MgcVector3 kXuu02 = 0.5*(rkBP.m_aakXuu[0] + rkBP.m_aakXuu[2]);
MgcVector3 kXvv02 = 0.5*(rkBP.m_aakXvv[0] + rkBP.m_aakXvv[2]);
MgcVector3 kXhh02 = 0.5*(rkBP.m_aakXhh[0] + rkBP.m_aakXhh[2]);
akX[uiI02] = 0.5*(akX[rkBP.m_uiI0] + akX[rkBP.m_uiI2] - fDSqr*kXhh02);
// derivatives (for normal vectors)
if ( akXu )
{
// top u-edge subdivision
akXu[uiI12] = 0.5*(akXu[rkBP.m_uiI1] + akXu[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXuuu);
akXv[uiI12] = 0.5*(akXv[rkBP.m_uiI1] + akXv[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXuuv);
// right v-edge subdivision
akXu[uiI01] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI1] -
fDSqr*rkBP.m_kXuvv);
akXv[uiI01] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI1] -
fDSqr*rkBP.m_kXvvv);
// hypotenuse edge subdivision
akXu[uiI02] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXhhu);
akXv[uiI02] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXhhv);
}
// colors
MgcColor kCuu12, kCvv12, kChh12, kCuu01, kCvv01, kChh01, kCuu02, kCvv02,
kChh02;
if ( akColor )
{
// top u-edge subdivision
kCuu12 = 0.5*(rkBP.m_aakCuu[1] + rkBP.m_aakCuu[2]);
kCvv12 = 0.5*(rkBP.m_aakCvv[1] + rkBP.m_aakCvv[2]);
kChh12 = 0.5*(rkBP.m_aakChh[1] + rkBP.m_aakChh[2]);
akColor[uiI12] = 0.5*(akColor[rkBP.m_uiI1] + akColor[rkBP.m_uiI2] -
fDSqr*kCuu12);
// right v-edge subdivision
kCuu01 = 0.5*(rkBP.m_aakCuu[0] + rkBP.m_aakCuu[1]);
kCvv01 = 0.5*(rkBP.m_aakCvv[0] + rkBP.m_aakCvv[1]);
kChh01 = 0.5*(rkBP.m_aakChh[0] + rkBP.m_aakChh[1]);
akColor[uiI01] = 0.5*(akColor[rkBP.m_uiI0] + akColor[rkBP.m_uiI1] -
fDSqr*kCvv01);
// hypotenuse edge subdivision
kCuu02 = 0.5*(rkBP.m_aakCuu[0] + rkBP.m_aakCuu[2]);
kCvv02 = 0.5*(rkBP.m_aakCvv[0] + rkBP.m_aakCvv[2]);
kChh02 = 0.5*(rkBP.m_aakChh[0] + rkBP.m_aakChh[2]);
akColor[uiI02] = 0.5*(akColor[rkBP.m_uiI0] + akColor[rkBP.m_uiI2] -
fDSqr*kChh02);
}
// textures
MgcVector2 kTuu12, kTvv12, kThh12, kTuu01, kTvv01, kThh01, kTuu02, kTvv02,
kThh02;
if ( akTexture )
{
// top u-edge subdivision
kTuu12 = 0.5*(rkBP.m_aakTuu[1] + rkBP.m_aakTuu[2]);
kTvv12 = 0.5*(rkBP.m_aakTvv[1] + rkBP.m_aakTvv[2]);
kThh12 = 0.5*(rkBP.m_aakThh[1] + rkBP.m_aakThh[2]);
akTexture[uiI12] = 0.5*(akTexture[rkBP.m_uiI1]+akTexture[rkBP.m_uiI2]
- fDSqr*kTuu12);
// right v-edge subdivision
kTuu01 = 0.5*(rkBP.m_aakTuu[0] + rkBP.m_aakTuu[1]);
kTvv01 = 0.5*(rkBP.m_aakTvv[0] + rkBP.m_aakTvv[1]);
kThh01 = 0.5*(rkBP.m_aakThh[0] + rkBP.m_aakThh[1]);
akTexture[uiI01] = 0.5*(akTexture[rkBP.m_uiI0]+akTexture[rkBP.m_uiI1]
- fDSqr*kTvv01);
// hypotenuse edge subdivision
kTuu02 = 0.5*(rkBP.m_aakTuu[0] + rkBP.m_aakTuu[2]);
kTvv02 = 0.5*(rkBP.m_aakTvv[0] + rkBP.m_aakTvv[2]);
kThh02 = 0.5*(rkBP.m_aakThh[0] + rkBP.m_aakThh[2]);
akTexture[uiI02] = 0.5*(akTexture[rkBP.m_uiI0]+akTexture[rkBP.m_uiI2]
- fDSqr*kThh02);
}
// recurse on four children
if ( uiLevel > 0 )
{
uiLevel--;
fDSqr *= 0.25;
BlockParameters kSubBP;
// subtriangle <(sm,tm),(sm,t1),(s0,t1)>
kSubBP.m_uiI0 = uiI02;
kSubBP.m_uiI1 = uiI12;
kSubBP.m_uiI2 = rkBP.m_uiI2;
kSubBP.m_aakXuu[0] = kXuu02;
kSubBP.m_aakXuu[1] = kXuu12;
kSubBP.m_aakXuu[2] = rkBP.m_aakXuu[2];
kSubBP.m_aakXvv[0] = kXvv02;
kSubBP.m_aakXvv[1] = kXvv12;
kSubBP.m_aakXvv[2] = rkBP.m_aakXvv[2];
kSubBP.m_aakXhh[0] = kXhh02;
kSubBP.m_aakXhh[1] = kXhh12;
kSubBP.m_aakXhh[2] = rkBP.m_aakXhh[2];
if ( akColor )
{
kSubBP.m_aakCuu[0] = kCuu02;
kSubBP.m_aakCuu[1] = kCuu12;
kSubBP.m_aakCuu[2] = rkBP.m_aakCuu[2];
kSubBP.m_aakCvv[0] = kCvv02;
kSubBP.m_aakCvv[1] = kCvv12;
kSubBP.m_aakCvv[2] = rkBP.m_aakCvv[2];
kSubBP.m_aakChh[0] = kChh02;
kSubBP.m_aakChh[1] = kChh12;
kSubBP.m_aakChh[2] = rkBP.m_aakChh[2];
}
if ( akTexture )
{
kSubBP.m_aakTuu[0] = kTuu02;
kSubBP.m_aakTuu[1] = kTuu12;
kSubBP.m_aakTuu[2] = rkBP.m_aakTuu[2];
kSubBP.m_aakTvv[0] = kTvv02;
kSubBP.m_aakTvv[1] = kTvv12;
kSubBP.m_aakTvv[2] = rkBP.m_aakTvv[2];
kSubBP.m_aakThh[0] = kThh02;
kSubBP.m_aakThh[1] = kThh12;
kSubBP.m_aakThh[2] = rkBP.m_aakThh[2];
}
SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(s1,tm),(s1,t1),(sm,t1)>
kSubBP.m_uiI0 = uiI01;
kSubBP.m_uiI1 = rkBP.m_uiI1;
kSubBP.m_uiI2 = uiI12;
kSubBP.m_aakXuu[0] = kXuu01;
kSubBP.m_aakXuu[1] = rkBP.m_aakXuu[1];
kSubBP.m_aakXuu[2] = kXuu12;
kSubBP.m_aakXvv[0] = kXvv01;
kSubBP.m_aakXvv[1] = rkBP.m_aakXvv[1];
kSubBP.m_aakXvv[2] = kXvv12;
kSubBP.m_aakXhh[0] = kXhh01;
kSubBP.m_aakXhh[1] = rkBP.m_aakXhh[1];
kSubBP.m_aakXhh[2] = kXhh12;
if ( akColor )
{
kSubBP.m_aakCuu[0] = kCuu01;
kSubBP.m_aakCuu[1] = rkBP.m_aakCuu[1];
kSubBP.m_aakCuu[2] = kCuu12;
kSubBP.m_aakCvv[0] = kCvv01;
kSubBP.m_aakCvv[1] = rkBP.m_aakCvv[1];
kSubBP.m_aakCvv[2] = kCvv12;
kSubBP.m_aakChh[0] = kChh01;
kSubBP.m_aakChh[1] = rkBP.m_aakChh[1];
kSubBP.m_aakChh[2] = kChh12;
}
if ( akTexture )
{
kSubBP.m_aakTuu[0] = kTuu01;
kSubBP.m_aakTuu[1] = rkBP.m_aakTuu[1];
kSubBP.m_aakTuu[2] = kTuu12;
kSubBP.m_aakTvv[0] = kTvv01;
kSubBP.m_aakTvv[1] = rkBP.m_aakTvv[1];
kSubBP.m_aakTvv[2] = kTvv12;
kSubBP.m_aakThh[0] = kThh01;
kSubBP.m_aakThh[1] = rkBP.m_aakThh[1];
kSubBP.m_aakThh[2] = kThh12;
}
SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(s1,t0),(s1,tm),(sm,tm)>
kSubBP.m_uiI0 = rkBP.m_uiI0;
kSubBP.m_uiI1 = uiI01;
kSubBP.m_uiI2 = uiI02;
kSubBP.m_aakXuu[0] = rkBP.m_aakXuu[0];
kSubBP.m_aakXuu[1] = kXuu01;
kSubBP.m_aakXuu[2] = kXuu02;
kSubBP.m_aakXvv[0] = rkBP.m_aakXvv[0];
kSubBP.m_aakXvv[1] = kXvv01;
kSubBP.m_aakXvv[2] = kXvv02;
kSubBP.m_aakXhh[0] = rkBP.m_aakXhh[0];
kSubBP.m_aakXhh[1] = kXhh01;
kSubBP.m_aakXhh[2] = kXhh02;
if ( akColor )
{
kSubBP.m_aakCuu[0] = rkBP.m_aakCuu[0];
kSubBP.m_aakCuu[1] = kCuu01;
kSubBP.m_aakCuu[2] = kCuu02;
kSubBP.m_aakCvv[0] = rkBP.m_aakCvv[0];
kSubBP.m_aakCvv[1] = kCvv01;
kSubBP.m_aakCvv[2] = kCvv02;
kSubBP.m_aakChh[0] = rkBP.m_aakChh[0];
kSubBP.m_aakChh[1] = kChh01;
kSubBP.m_aakChh[2] = kChh02;
}
if ( akTexture )
{
kSubBP.m_aakTuu[0] = rkBP.m_aakTuu[0];
kSubBP.m_aakTuu[1] = kTuu01;
kSubBP.m_aakTuu[2] = kTuu02;
kSubBP.m_aakTvv[0] = rkBP.m_aakTvv[0];
kSubBP.m_aakTvv[1] = kTvv01;
kSubBP.m_aakTvv[2] = kTvv02;
kSubBP.m_aakThh[0] = rkBP.m_aakThh[0];
kSubBP.m_aakThh[1] = kThh01;
kSubBP.m_aakThh[2] = kThh02;
}
SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(sm,tm),(s1,tm),(sm,t1)>
kSubBP.m_uiI0 = uiI02;
kSubBP.m_uiI1 = uiI01;
kSubBP.m_uiI2 = uiI12;
kSubBP.m_aakXuu[0] = kXuu02;
kSubBP.m_aakXuu[1] = kXuu01;
kSubBP.m_aakXuu[2] = kXuu12;
kSubBP.m_aakXvv[0] = kXvv02;
kSubBP.m_aakXvv[1] = kXvv01;
kSubBP.m_aakXvv[2] = kXvv12;
kSubBP.m_aakXhh[0] = kXhh02;
kSubBP.m_aakXhh[1] = kXhh01;
kSubBP.m_aakXhh[2] = kXhh12;
if ( akColor )
{
kSubBP.m_aakCuu[0] = kCuu02;
kSubBP.m_aakCuu[1] = kCuu01;
kSubBP.m_aakCuu[2] = kCuu12;
kSubBP.m_aakCvv[0] = kCvv02;
kSubBP.m_aakCvv[1] = kCvv01;
kSubBP.m_aakCvv[2] = kCvv12;
kSubBP.m_aakChh[0] = kChh02;
kSubBP.m_aakChh[1] = kChh01;
kSubBP.m_aakChh[2] = kChh12;
}
if ( akTexture )
{
kSubBP.m_aakTuu[0] = kTuu02;
kSubBP.m_aakTuu[1] = kTuu01;
kSubBP.m_aakTuu[2] = kTuu12;
kSubBP.m_aakTvv[0] = kTvv02;
kSubBP.m_aakTvv[1] = kTvv01;
kSubBP.m_aakTvv[2] = kTvv12;
kSubBP.m_aakThh[0] = kThh02;
kSubBP.m_aakThh[1] = kThh01;
kSubBP.m_aakThh[2] = kThh12;
}
SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
}
}
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
// streaming
//---------------------------------------------------------------------------
MgcObject* MgcBezierTriangle3::Factory (MgcStream& rkStream)
{
MgcBezierTriangle3* pkObject = new MgcBezierTriangle3;
MgcStream::Link* pkLink = new MgcStream::Link(pkObject);
pkObject->Load(rkStream,pkLink);
return pkObject;
}
//---------------------------------------------------------------------------
void MgcBezierTriangle3::Load (MgcStream& rkStream, MgcStream::Link* pkLink)
{
MgcBezierTriangle::Load(rkStream,pkLink);
}
//---------------------------------------------------------------------------
void MgcBezierTriangle3::Link (MgcStream& rkStream, MgcStream::Link* pkLink)
{
MgcBezierTriangle::Link(rkStream,pkLink);
}
//---------------------------------------------------------------------------
bool MgcBezierTriangle3::Register (MgcStream& rkStream)
{
return MgcBezierTriangle::Register(rkStream);
}
//---------------------------------------------------------------------------
void MgcBezierTriangle3::Save (MgcStream& rkStream)
{
MgcBezierTriangle::Save(rkStream);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -