📄 wmlbeziertriangle3.cpp
字号:
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(iLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(sm,t0),(sm,tm),(s0,tm)>
kSubBP.m_i0 = i01;
kSubBP.m_i1 = i12;
kSubBP.m_i2 = i02;
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(iLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
}
}
//----------------------------------------------------------------------------
void BezierTriangle3::SubdivideUR (int iLevel, float fDSqr, Vector3f* akX,
Vector3f* akXu, Vector3f* akXv, ColorRGB* akColor, Vector2f* akTexture,
BlockParameters& rkBP)
{
/*
i2 i1
+----+
\ |
\|
+
i0
*/
// subdivision indices
int i12 = (rkBP.m_i1 + rkBP.m_i2) >> 1;
int iD12 = rkBP.m_i1 - rkBP.m_i2;
int i01 = (((rkBP.m_i0+rkBP.m_i1) << 2)+iD12*iD12) >> 3;
int i02 = i01 - (iD12 >> 1);
// vertices
// top u-edge subdivision
Vector3f kXuu12 = 0.5f*(rkBP.m_aakXuu[1] + rkBP.m_aakXuu[2]);
Vector3f kXvv12 = 0.5f*(rkBP.m_aakXvv[1] + rkBP.m_aakXvv[2]);
Vector3f kXhh12 = 0.5f*(rkBP.m_aakXhh[1] + rkBP.m_aakXhh[2]);
akX[i12] = 0.5f*(akX[rkBP.m_i1] + akX[rkBP.m_i2] - fDSqr*kXuu12);
// right v-edge subdivision
Vector3f kXuu01 = 0.5f*(rkBP.m_aakXuu[0] + rkBP.m_aakXuu[1]);
Vector3f kXvv01 = 0.5f*(rkBP.m_aakXvv[0] + rkBP.m_aakXvv[1]);
Vector3f kXhh01 = 0.5f*(rkBP.m_aakXhh[0] + rkBP.m_aakXhh[1]);
akX[i01] = 0.5f*(akX[rkBP.m_i0] + akX[rkBP.m_i1] - fDSqr*kXvv01);
// hypotenuse edge subdivision
Vector3f kXuu02 = 0.5f*(rkBP.m_aakXuu[0] + rkBP.m_aakXuu[2]);
Vector3f kXvv02 = 0.5f*(rkBP.m_aakXvv[0] + rkBP.m_aakXvv[2]);
Vector3f kXhh02 = 0.5f*(rkBP.m_aakXhh[0] + rkBP.m_aakXhh[2]);
akX[i02] = 0.5f*(akX[rkBP.m_i0] + akX[rkBP.m_i2] - fDSqr*kXhh02);
// derivatives (for normal vectors)
if ( akXu )
{
// top u-edge subdivision
akXu[i12] = 0.5f*(akXu[rkBP.m_i1] + akXu[rkBP.m_i2] -
fDSqr*rkBP.m_kXuuu);
akXv[i12] = 0.5f*(akXv[rkBP.m_i1] + akXv[rkBP.m_i2] -
fDSqr*rkBP.m_kXuuv);
// right v-edge subdivision
akXu[i01] = 0.5f*(akXu[rkBP.m_i0] + akXu[rkBP.m_i1] -
fDSqr*rkBP.m_kXuvv);
akXv[i01] = 0.5f*(akXv[rkBP.m_i0] + akXv[rkBP.m_i1] -
fDSqr*rkBP.m_kXvvv);
// hypotenuse edge subdivision
akXu[i02] = 0.5f*(akXu[rkBP.m_i0] + akXu[rkBP.m_i2] -
fDSqr*rkBP.m_kXhhu);
akXv[i02] = 0.5f*(akXv[rkBP.m_i0] + akXv[rkBP.m_i2] -
fDSqr*rkBP.m_kXhhv);
}
// colors
ColorRGB kCuu12, kCvv12, kChh12, kCuu01, kCvv01, kChh01, kCuu02, kCvv02,
kChh02;
if ( akColor )
{
// top u-edge subdivision
kCuu12 = 0.5f*(rkBP.m_aakCuu[1] + rkBP.m_aakCuu[2]);
kCvv12 = 0.5f*(rkBP.m_aakCvv[1] + rkBP.m_aakCvv[2]);
kChh12 = 0.5f*(rkBP.m_aakChh[1] + rkBP.m_aakChh[2]);
akColor[i12] = 0.5f*(akColor[rkBP.m_i1] + akColor[rkBP.m_i2] -
fDSqr*kCuu12);
// right v-edge subdivision
kCuu01 = 0.5f*(rkBP.m_aakCuu[0] + rkBP.m_aakCuu[1]);
kCvv01 = 0.5f*(rkBP.m_aakCvv[0] + rkBP.m_aakCvv[1]);
kChh01 = 0.5f*(rkBP.m_aakChh[0] + rkBP.m_aakChh[1]);
akColor[i01] = 0.5f*(akColor[rkBP.m_i0] + akColor[rkBP.m_i1] -
fDSqr*kCvv01);
// hypotenuse edge subdivision
kCuu02 = 0.5f*(rkBP.m_aakCuu[0] + rkBP.m_aakCuu[2]);
kCvv02 = 0.5f*(rkBP.m_aakCvv[0] + rkBP.m_aakCvv[2]);
kChh02 = 0.5f*(rkBP.m_aakChh[0] + rkBP.m_aakChh[2]);
akColor[i02] = 0.5f*(akColor[rkBP.m_i0] + akColor[rkBP.m_i2] -
fDSqr*kChh02);
}
// textures
Vector2f kTuu12, kTvv12, kThh12, kTuu01, kTvv01, kThh01, kTuu02, kTvv02,
kThh02;
if ( akTexture )
{
// top u-edge subdivision
kTuu12 = 0.5f*(rkBP.m_aakTuu[1] + rkBP.m_aakTuu[2]);
kTvv12 = 0.5f*(rkBP.m_aakTvv[1] + rkBP.m_aakTvv[2]);
kThh12 = 0.5f*(rkBP.m_aakThh[1] + rkBP.m_aakThh[2]);
akTexture[i12] = 0.5f*(akTexture[rkBP.m_i1]+akTexture[rkBP.m_i2]
- fDSqr*kTuu12);
// right v-edge subdivision
kTuu01 = 0.5f*(rkBP.m_aakTuu[0] + rkBP.m_aakTuu[1]);
kTvv01 = 0.5f*(rkBP.m_aakTvv[0] + rkBP.m_aakTvv[1]);
kThh01 = 0.5f*(rkBP.m_aakThh[0] + rkBP.m_aakThh[1]);
akTexture[i01] = 0.5f*(akTexture[rkBP.m_i0]+akTexture[rkBP.m_i1]
- fDSqr*kTvv01);
// hypotenuse edge subdivision
kTuu02 = 0.5f*(rkBP.m_aakTuu[0] + rkBP.m_aakTuu[2]);
kTvv02 = 0.5f*(rkBP.m_aakTvv[0] + rkBP.m_aakTvv[2]);
kThh02 = 0.5f*(rkBP.m_aakThh[0] + rkBP.m_aakThh[2]);
akTexture[i02] = 0.5f*(akTexture[rkBP.m_i0]+akTexture[rkBP.m_i2]
- fDSqr*kThh02);
}
// recurse on four children
if ( iLevel > 0 )
{
iLevel--;
fDSqr *= 0.25f;
BlockParameters kSubBP;
// subtriangle <(sm,tm),(sm,t1),(s0,t1)>
kSubBP.m_i0 = i02;
kSubBP.m_i1 = i12;
kSubBP.m_i2 = rkBP.m_i2;
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(iLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(s1,tm),(s1,t1),(sm,t1)>
kSubBP.m_i0 = i01;
kSubBP.m_i1 = rkBP.m_i1;
kSubBP.m_i2 = i12;
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(iLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(s1,t0),(s1,tm),(sm,tm)>
kSubBP.m_i0 = rkBP.m_i0;
kSubBP.m_i1 = i01;
kSubBP.m_i2 = i02;
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(iLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
// subtriangle <(sm,tm),(s1,tm),(sm,t1)>
kSubBP.m_i0 = i02;
kSubBP.m_i1 = i01;
kSubBP.m_i2 = i12;
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(iLevel,fDSqr,akX,akXu,akXv,akColor,akTexture,kSubBP);
}
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// streaming
//----------------------------------------------------------------------------
Object* BezierTriangle3::Factory (Stream& rkStream)
{
BezierTriangle3* pkObject = new BezierTriangle3;
Stream::Link* pkLink = new Stream::Link(pkObject);
pkObject->Load(rkStream,pkLink);
return pkObject;
}
//----------------------------------------------------------------------------
void BezierTriangle3::Load (Stream& rkStream, Stream::Link* pkLink)
{
BezierTriangle::Load(rkStream,pkLink);
}
//----------------------------------------------------------------------------
void BezierTriangle3::Link (Stream& rkStream, Stream::Link* pkLink)
{
BezierTriangle::Link(rkStream,pkLink);
}
//----------------------------------------------------------------------------
bool BezierTriangle3::Register (Stream& rkStream)
{
return BezierTriangle::Register(rkStream);
}
//----------------------------------------------------------------------------
void BezierTriangle3::Save (Stream& rkStream)
{
BezierTriangle::Save(rkStream);
}
//----------------------------------------------------------------------------
StringTree* BezierTriangle3::SaveStrings ()
{
StringTree* pkTree = new StringTree(1,0,1,0);
// strings
pkTree->SetString(0,MakeString(&ms_kRTTI,GetName()));
// children
pkTree->SetChild(0,BezierTriangle::SaveStrings());
return pkTree;
}
//----------------------------------------------------------------------------
int BezierTriangle3::GetMemoryUsed () const
{
int iBaseSize = sizeof(BezierTriangle3) - sizeof(BezierTriangle);
int iTotalSize = iBaseSize + BezierTriangle::GetMemoryUsed();
return iTotalSize;
}
//----------------------------------------------------------------------------
int BezierTriangle3::GetDiskUsed () const
{
return BezierTriangle::GetDiskUsed();
}
//----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -