📄 mgcbezierrectangle3.cpp
字号:
delete[] akXs;
delete[] akXt;
}
ruiVertexStart += uiQuantity;
}
//----------------------------------------------------------------------------
void MgcBezierRectangle3::Subdivide (unsigned int uiLevel, MgcReal fDSqr,
MgcVector3* akX, MgcVector3* akXs, MgcVector3* akXt, MgcColor* akColor,
MgcVector2* akTexture, BlockParameters& rkBP)
{
// subdivision indices
unsigned int uiIM0 = (rkBP.m_uiI00 + rkBP.m_uiI10) >> 1;
unsigned int uiIM1 = (rkBP.m_uiI01 + rkBP.m_uiI11) >> 1;
unsigned int uiI0M = (rkBP.m_uiI00 + rkBP.m_uiI01) >> 1;
unsigned int uiI1M = (rkBP.m_uiI10 + rkBP.m_uiI11) >> 1;
unsigned int uiIMM = (uiI0M + uiI1M) >> 1;
// vertices
// top and bottom s-edge subdivision
MgcVector3 kXssM0 = 0.5*(rkBP.m_aakXss[0][0] + rkBP.m_aakXss[1][0]);
MgcVector3 kXssM1 = 0.5*(rkBP.m_aakXss[0][1] + rkBP.m_aakXss[1][1]);
MgcVector3 kXssttM0 = 0.5*(rkBP.m_aakXsstt[0][0] + rkBP.m_aakXsstt[1][0]);
MgcVector3 kXssttM1 = 0.5*(rkBP.m_aakXsstt[0][1] + rkBP.m_aakXsstt[1][1]);
MgcVector3 kXttM0 = 0.5*(rkBP.m_aakXtt[0][0] + rkBP.m_aakXtt[1][0] -
fDSqr*kXssttM0);
MgcVector3 kXttM1 = 0.5*(rkBP.m_aakXtt[0][1] + rkBP.m_aakXtt[1][1] -
fDSqr*kXssttM1);
akX[uiIM0] = 0.5*(akX[rkBP.m_uiI00] + akX[rkBP.m_uiI10] - fDSqr*kXssM0);
akX[uiIM1] = 0.5*(akX[rkBP.m_uiI01] + akX[rkBP.m_uiI11] - fDSqr*kXssM1);
// left and right t-edge subdivision
MgcVector3 kXtt0M = 0.5*(rkBP.m_aakXtt[0][0] + rkBP.m_aakXtt[0][1]);
MgcVector3 kXtt1M = 0.5*(rkBP.m_aakXtt[1][0] + rkBP.m_aakXtt[1][1]);
MgcVector3 kXsstt0M = 0.5*(rkBP.m_aakXsstt[0][0] + rkBP.m_aakXsstt[0][1]);
MgcVector3 kXsstt1M = 0.5*(rkBP.m_aakXsstt[1][0] + rkBP.m_aakXsstt[1][1]);
MgcVector3 kXss0M = 0.5*(rkBP.m_aakXss[0][0] + rkBP.m_aakXss[0][1] -
fDSqr*kXsstt0M);
MgcVector3 kXss1M = 0.5*(rkBP.m_aakXss[1][0] + rkBP.m_aakXss[1][1] -
fDSqr*kXsstt1M);
akX[uiI0M] = 0.5*(akX[rkBP.m_uiI00] + akX[rkBP.m_uiI01] - fDSqr*kXtt0M);
akX[uiI1M] = 0.5*(akX[rkBP.m_uiI10] + akX[rkBP.m_uiI11] - fDSqr*kXtt1M);
// center subdivision
MgcVector3 kXssMM = 0.5*(kXss0M + kXss1M);
MgcVector3 kXttMM = 0.5*(kXttM0 + kXttM1);
MgcVector3 kXssttMM = 0.5*(kXsstt0M + kXsstt1M);
akX[uiIMM] = 0.5*(akX[uiI0M] + akX[uiI1M] - fDSqr*kXssMM);
// derivatives (for normal vectors)
MgcVector3 kXsss0M, kXsttM0, kXsttM1, kXstt0M, kXstt1M, kXssstt0M,
kXsttMM;
MgcVector3 kXsstM0, kXsstM1, kXsst0M, kXsst1M, kXtttM0, kXsstttM0,
kXsstMM;
if ( akXs )
{
// top and bottom s-edge subdivision
kXsstM0 = 0.5*(rkBP.m_aakXsst[0][0] + rkBP.m_aakXsst[1][0]);
kXsstM1 = 0.5*(rkBP.m_aakXsst[0][1] + rkBP.m_aakXsst[1][1]);
akXs[uiIM0] = 0.5*(akXs[rkBP.m_uiI00] + akXs[rkBP.m_uiI10] -
fDSqr*rkBP.m_akXsss[0]);
akXt[uiIM0] = 0.5*(akXt[rkBP.m_uiI00] + akXt[rkBP.m_uiI10] -
fDSqr*kXsstM0);
akXs[uiIM1] = 0.5*(akXs[rkBP.m_uiI01] + akXs[rkBP.m_uiI11] -
fDSqr*rkBP.m_akXsss[1]);
akXt[uiIM1] = 0.5*(akXt[rkBP.m_uiI01] + akXt[rkBP.m_uiI11] -
fDSqr*kXsstM1);
kXsttM0 = 0.5*(rkBP.m_aakXstt[0][0] + rkBP.m_aakXstt[1][0] -
fDSqr*rkBP.m_akXssstt[0]);
kXsstttM0 = 0.5*(rkBP.m_akXssttt[0] + rkBP.m_akXssttt[1]);
kXtttM0 = 0.5*(rkBP.m_akXttt[0] + rkBP.m_akXttt[1] -
fDSqr*kXsstttM0);
kXsttM1 = 0.5*(rkBP.m_aakXstt[0][1] + rkBP.m_aakXstt[1][1] -
fDSqr*rkBP.m_akXssstt[1]);
// left and right t-edge subdivision
kXstt0M = 0.5*(rkBP.m_aakXstt[0][0] + rkBP.m_aakXstt[0][1]);
kXstt1M = 0.5*(rkBP.m_aakXstt[1][0] + rkBP.m_aakXstt[1][1]);
akXs[uiI0M] = 0.5*(akXs[rkBP.m_uiI00] + akXs[rkBP.m_uiI01] -
fDSqr*kXstt0M);
akXt[uiI0M] = 0.5*(akXt[rkBP.m_uiI00] + akXt[rkBP.m_uiI01] -
fDSqr*rkBP.m_akXttt[0]);
akXs[uiI1M] = 0.5*(akXs[rkBP.m_uiI10] + akXs[rkBP.m_uiI11] -
fDSqr*kXstt1M);
akXt[uiI1M] = 0.5*(akXt[rkBP.m_uiI10] + akXt[rkBP.m_uiI11] -
fDSqr*rkBP.m_akXttt[1]);
kXsst0M = 0.5*(rkBP.m_aakXsst[0][0] + rkBP.m_aakXsst[0][1] -
fDSqr*rkBP.m_akXssttt[0]);
kXssstt0M = 0.5*(rkBP.m_akXssstt[0] + rkBP.m_akXssstt[1]);
kXsss0M = 0.5*(rkBP.m_akXsss[0] + rkBP.m_akXsss[1] -
fDSqr*kXssstt0M);
kXsst1M = 0.5*(rkBP.m_aakXsst[1][0] + rkBP.m_aakXsst[1][1] -
fDSqr*rkBP.m_akXssttt[1]);
// center subdivision
kXsstMM = 0.5*(kXsst0M + kXsst1M);
kXsttMM = 0.5*(kXsttM0 + kXsttM1);
akXs[uiIMM] = 0.5*(akXs[uiI0M] + akXs[uiI1M] - fDSqr*kXsss0M);
akXt[uiIMM] = 0.5*(akXt[uiIM0] + akXt[uiIM1] - fDSqr*kXtttM0);
}
// colors
MgcColor kCssM0, kCssM1, kCss0M, kCss1M, kCttM0, kCttM1, kCtt0M, kCtt1M,
kCssttM0, kCssttM1, kCsstt0M, kCsstt1M, kCssMM, kCttMM, kCssttMM;
if ( akColor )
{
// top and bottom s-edge subdivision
kCssM0 = 0.5*(rkBP.m_aakCss[0][0] + rkBP.m_aakCss[1][0]);
kCssM1 = 0.5*(rkBP.m_aakCss[0][1] + rkBP.m_aakCss[1][1]);
kCssttM0 = 0.5*(rkBP.m_aakCsstt[0][0] + rkBP.m_aakCsstt[1][0]);
kCssttM1 = 0.5*(rkBP.m_aakCsstt[0][1] + rkBP.m_aakCsstt[1][1]);
kCttM0 = 0.5*(rkBP.m_aakCtt[0][0] + rkBP.m_aakCtt[1][0] -
fDSqr*kCssttM0);
kCttM1 = 0.5*(rkBP.m_aakCtt[0][1] + rkBP.m_aakCtt[1][1] -
fDSqr*kCssttM1);
akColor[uiIM0] = 0.5*(akColor[rkBP.m_uiI00] + akColor[rkBP.m_uiI10] -
fDSqr*kCssM0);
akColor[uiIM1] = 0.5*(akColor[rkBP.m_uiI01] + akColor[rkBP.m_uiI11] -
fDSqr*kCssM1);
// left and right t-edge subdivision
kCtt0M = 0.5*(rkBP.m_aakCtt[0][0] + rkBP.m_aakCtt[0][1]);
kCtt1M = 0.5*(rkBP.m_aakCtt[1][0] + rkBP.m_aakCtt[1][1]);
kCsstt0M = 0.5*(rkBP.m_aakCsstt[0][0] + rkBP.m_aakCsstt[0][1]);
kCsstt1M = 0.5*(rkBP.m_aakCsstt[1][0] + rkBP.m_aakCsstt[1][1]);
kCss0M = 0.5*(rkBP.m_aakCss[0][0] + rkBP.m_aakCss[0][1] -
fDSqr*kCsstt0M);
kCss1M = 0.5*(rkBP.m_aakCss[1][0] + rkBP.m_aakCss[1][1] -
fDSqr*kCsstt1M);
akColor[uiI0M] = 0.5*(akColor[rkBP.m_uiI00] + akColor[rkBP.m_uiI01] -
fDSqr*kCtt0M);
akColor[uiI1M] = 0.5*(akColor[rkBP.m_uiI10] + akColor[rkBP.m_uiI11] -
fDSqr*kCtt1M);
// center subdivision
kCssMM = 0.5*(kCss0M + kCss1M);
kCttMM = 0.5*(kCttM0 + kCttM1);
kCssttMM = 0.5*(kCsstt0M + kCsstt1M);
akColor[uiIMM] = 0.5*(akColor[uiI0M] + akColor[uiI1M] - fDSqr*kCssMM);
}
// textures
MgcVector2 kTssM0, kTssM1, kTss0M, kTss1M, kTttM0, kTttM1, kTtt0M, kTtt1M,
kTssttM0, kTssttM1, kTsstt0M, kTsstt1M, kTssMM, kTttMM, kTssttMM;
if ( akTexture )
{
// top and bottom s-edge subdivision
kTssM0 = 0.5*(rkBP.m_aakTss[0][0] + rkBP.m_aakTss[1][0]);
kTssM1 = 0.5*(rkBP.m_aakTss[0][1] + rkBP.m_aakTss[1][1]);
kTssttM0 = 0.5*(rkBP.m_aakTsstt[0][0] + rkBP.m_aakTsstt[1][0]);
kTssttM1 = 0.5*(rkBP.m_aakTsstt[0][1] + rkBP.m_aakTsstt[1][1]);
kTttM0 = 0.5*(rkBP.m_aakTtt[0][0] + rkBP.m_aakTtt[1][0] -
fDSqr*kTssttM0);
kTttM1 = 0.5*(rkBP.m_aakTtt[0][1] + rkBP.m_aakTtt[1][1] -
fDSqr*kTssttM1);
akTexture[uiIM0] = 0.5*(akTexture[rkBP.m_uiI00] +
akTexture[rkBP.m_uiI10] - fDSqr*kTssM0);
akTexture[uiIM1] = 0.5*(akTexture[rkBP.m_uiI01] +
akTexture[rkBP.m_uiI11] - fDSqr*kTssM1);
// left and right t-edge subdivision
kTtt0M = 0.5*(rkBP.m_aakTtt[0][0] + rkBP.m_aakTtt[0][1]);
kTtt1M = 0.5*(rkBP.m_aakTtt[1][0] + rkBP.m_aakTtt[1][1]);
kTsstt0M = 0.5*(rkBP.m_aakTsstt[0][0] + rkBP.m_aakTsstt[0][1]);
kTsstt1M = 0.5*(rkBP.m_aakTsstt[1][0] + rkBP.m_aakTsstt[1][1]);
kTss0M = 0.5*(rkBP.m_aakTss[0][0] + rkBP.m_aakTss[0][1] -
fDSqr*kTsstt0M);
kTss1M = 0.5*(rkBP.m_aakTss[1][0] + rkBP.m_aakTss[1][1] -
fDSqr*kTsstt1M);
akTexture[uiI0M] = 0.5*(akTexture[rkBP.m_uiI00] +
akTexture[rkBP.m_uiI01] - fDSqr*kTtt0M);
akTexture[uiI1M] = 0.5*(akTexture[rkBP.m_uiI10] +
akTexture[rkBP.m_uiI11] - fDSqr*kTtt1M);
// center subdivision
kTssMM = 0.5*(kTss0M + kTss1M);
kTttMM = 0.5*(kTttM0 + kTttM1);
kTssttMM = 0.5*(kTsstt0M + kTsstt1M);
akTexture[uiIMM] = 0.5*(akTexture[uiI0M] + akTexture[uiI1M] -
fDSqr*kTssMM);
}
// recurse on four children
if ( uiLevel > 0 )
{
uiLevel--;
fDSqr *= 0.25;
BlockParameters kSubBP;
// subblock [s0,sM]x[t0,tM]
kSubBP.m_uiI00 = rkBP.m_uiI00;
kSubBP.m_uiI01 = uiI0M;
kSubBP.m_uiI10 = uiIM0;
kSubBP.m_uiI11 = uiIMM;
kSubBP.m_aakXss[0][0] = rkBP.m_aakXss[0][0];
kSubBP.m_aakXss[0][1] = kXss0M;
kSubBP.m_aakXss[1][0] = kXssM0;
kSubBP.m_aakXss[1][1] = kXssMM;
kSubBP.m_aakXtt[0][0] = rkBP.m_aakXtt[0][0];
kSubBP.m_aakXtt[0][1] = kXtt0M;
kSubBP.m_aakXtt[1][0] = kXttM0;
kSubBP.m_aakXtt[1][1] = kXttMM;
kSubBP.m_aakXsstt[0][0] = rkBP.m_aakXsstt[0][0];
kSubBP.m_aakXsstt[0][1] = kXsstt0M;
kSubBP.m_aakXsstt[1][0] = kXssttM0;
kSubBP.m_aakXsstt[1][1] = kXssttMM;
if ( akXs )
{
kSubBP.m_akXsss[0] = rkBP.m_akXsss[0];
kSubBP.m_akXsss[1] = kXsss0M;
kSubBP.m_aakXsst[0][0] = rkBP.m_aakXsst[0][0];
kSubBP.m_aakXsst[0][1] = kXsst0M;
kSubBP.m_aakXsst[1][0] = kXsstM0;
kSubBP.m_aakXsst[1][1] = kXsstMM;
kSubBP.m_aakXstt[0][0] = rkBP.m_aakXstt[0][0];
kSubBP.m_aakXstt[0][1] = kXstt0M;
kSubBP.m_aakXstt[1][0] = kXsttM0;
kSubBP.m_aakXstt[1][1] = kXsttMM;
kSubBP.m_akXttt[0] = rkBP.m_akXttt[0];
kSubBP.m_akXttt[1] = kXtttM0;
kSubBP.m_akXssstt[0] = rkBP.m_akXssstt[0];
kSubBP.m_akXssstt[1] = kXssstt0M;
kSubBP.m_akXssttt[0] = rkBP.m_akXssttt[0];
kSubBP.m_akXssttt[1] = kXsstttM0;
}
if ( akColor )
{
kSubBP.m_aakCss[0][0] = rkBP.m_aakCss[0][0];
kSubBP.m_aakCss[0][1] = kCss0M;
kSubBP.m_aakCss[1][0] = kCssM0;
kSubBP.m_aakCss[1][1] = kCssMM;
kSubBP.m_aakCtt[0][0] = rkBP.m_aakCtt[0][0];
kSubBP.m_aakCtt[0][1] = kCtt0M;
kSubBP.m_aakCtt[1][0] = kCttM0;
kSubBP.m_aakCtt[1][1] = kCttMM;
kSubBP.m_aakCsstt[0][0] = rkBP.m_aakCsstt[0][0];
kSubBP.m_aakCsstt[0][1] = kCsstt0M;
kSubBP.m_aakCsstt[1][0] = kCssttM0;
kSubBP.m_aakCsstt[1][1] = kCssttMM;
}
if ( akTexture )
{
kSubBP.m_aakTss[0][0] = rkBP.m_aakTss[0][0];
kSubBP.m_aakTss[0][1] = kTss0M;
kSubBP.m_aakTss[1][0] = kTssM0;
kSubBP.m_aakTss[1][1] = kTssMM;
kSubBP.m_aakTtt[0][0] = rkBP.m_aakTtt[0][0];
kSubBP.m_aakTtt[0][1] = kTtt0M;
kSubBP.m_aakTtt[1][0] = kTttM0;
kSubBP.m_aakTtt[1][1] = kTttMM;
kSubBP.m_aakTsstt[0][0] = rkBP.m_aakTsstt[0][0];
kSubBP.m_aakTsstt[0][1] = kTsstt0M;
kSubBP.m_aakTsstt[1][0] = kTssttM0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -