⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mgcbezierrectangle3.cpp

📁 《3D游戏引擎设计》的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        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 + -