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

📄 mgcbezierrectangle3g.cpp

📁 《3D游戏引擎设计》的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            kBP.m_akXuuu[1] = 6.0*(m_akCtrlPoint[15] + 3.0*(m_akCtrlPoint[13]
                - m_akCtrlPoint[14]) - m_akCtrlPoint[12]);
            kBP.m_akXvvv[0] = 6.0*(m_akCtrlPoint[12] + 3.0*(m_akCtrlPoint[4] -
                m_akCtrlPoint[8]) - m_akCtrlPoint[0]);
            kBP.m_akXvvv[1] = 6.0*(m_akCtrlPoint[15] + 3.0*(m_akCtrlPoint[7] -
                m_akCtrlPoint[11]) - m_akCtrlPoint[3]);
            kBP.m_akXuuuvv[0] = 36.0*(m_akCtrlPoint[3] + m_akCtrlPoint[11] -
                m_akCtrlPoint[0] - m_akCtrlPoint[8] + 2.0*(m_akCtrlPoint[4] -
                m_akCtrlPoint[7]) + 3.0*(m_akCtrlPoint[1] + m_akCtrlPoint[9] -
                m_akCtrlPoint[2] - m_akCtrlPoint[10]) + 6.0*(m_akCtrlPoint[6]
                - m_akCtrlPoint[5]));
            kBP.m_akXuuuvv[1] = 36.0*(m_akCtrlPoint[7] + m_akCtrlPoint[15] -
                m_akCtrlPoint[4] - m_akCtrlPoint[12] + 2.0*(m_akCtrlPoint[8] -
                m_akCtrlPoint[11]) + 3.0*(m_akCtrlPoint[5] + m_akCtrlPoint[13]
                - m_akCtrlPoint[6] - m_akCtrlPoint[14]) +
                6.0*(m_akCtrlPoint[10] - m_akCtrlPoint[9]));
            kBP.m_akXuuvvv[0] = 36.0*(m_akCtrlPoint[12] + m_akCtrlPoint[14] -
                m_akCtrlPoint[0] - m_akCtrlPoint[2] + 2.0*(m_akCtrlPoint[1] -
                m_akCtrlPoint[13]) + 3.0*(m_akCtrlPoint[4] + m_akCtrlPoint[6]
                - m_akCtrlPoint[8] - m_akCtrlPoint[10]) +
                6.0*(m_akCtrlPoint[9] - m_akCtrlPoint[5]));
            kBP.m_akXuuvvv[1] = 36.0*(m_akCtrlPoint[13] + m_akCtrlPoint[15] -
                m_akCtrlPoint[1] - m_akCtrlPoint[3] + 2.0*(m_akCtrlPoint[2] -
                m_akCtrlPoint[14]) + 3.0*(m_akCtrlPoint[5] + m_akCtrlPoint[7]
                - m_akCtrlPoint[9] - m_akCtrlPoint[11]) +
                6.0*(m_akCtrlPoint[10] - m_akCtrlPoint[6]));
        }

        Subdivide(--uiLevel,0.25,akX,akXu,akXv,kBP);
    }

    // calculate unit-length normals from derivative vectors
    if ( bWantNormals )
    {
        for (unsigned int uiI = 0; uiI < m_uiVertexQuantity; uiI++)
            m_akNormal[uiI] = akXu[uiI].UnitCross(akXv[uiI]);
        delete[] akXu;
        delete[] akXv;
    }
}
//----------------------------------------------------------------------------
void MgcBezierRectangle3G::Subdivide (unsigned int uiLevel, MgcReal fDSqr,
    MgcVector3* akX, MgcVector3* akXu, MgcVector3* akXv,
    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 u-edge subdivision
    MgcVector3 kXuuM0 = 0.5*(rkBP.m_aakXuu[0][0] + rkBP.m_aakXuu[1][0]);
    MgcVector3 kXuuM1 = 0.5*(rkBP.m_aakXuu[0][1] + rkBP.m_aakXuu[1][1]);
    MgcVector3 kXuuvvM0 = 0.5*(rkBP.m_aakXuuvv[0][0] + rkBP.m_aakXuuvv[1][0]);
    MgcVector3 kXuuvvM1 = 0.5*(rkBP.m_aakXuuvv[0][1] + rkBP.m_aakXuuvv[1][1]);
    MgcVector3 kXvvM0 = 0.5*(rkBP.m_aakXvv[0][0] + rkBP.m_aakXvv[1][0] -
        fDSqr*kXuuvvM0);
    MgcVector3 kXvvM1 = 0.5*(rkBP.m_aakXvv[0][1] + rkBP.m_aakXvv[1][1] -
        fDSqr*kXuuvvM1);
    akX[uiIM0] = 0.5*(akX[rkBP.m_uiI00] + akX[rkBP.m_uiI10] - fDSqr*kXuuM0);
    akX[uiIM1] = 0.5*(akX[rkBP.m_uiI01] + akX[rkBP.m_uiI11] - fDSqr*kXuuM1);

    // left and right v-edge subdivision
    MgcVector3 kXvv0M = 0.5*(rkBP.m_aakXvv[0][0] + rkBP.m_aakXvv[0][1]);
    MgcVector3 kXvv1M = 0.5*(rkBP.m_aakXvv[1][0] + rkBP.m_aakXvv[1][1]);
    MgcVector3 kXuuvv0M = 0.5*(rkBP.m_aakXuuvv[0][0] + rkBP.m_aakXuuvv[0][1]);
    MgcVector3 kXuuvv1M = 0.5*(rkBP.m_aakXuuvv[1][0] + rkBP.m_aakXuuvv[1][1]);
    MgcVector3 kXuu0M = 0.5*(rkBP.m_aakXuu[0][0] + rkBP.m_aakXuu[0][1] -
        fDSqr*kXuuvv0M);
    MgcVector3 kXuu1M = 0.5*(rkBP.m_aakXuu[1][0] + rkBP.m_aakXuu[1][1] -
        fDSqr*kXuuvv1M);
    akX[uiI0M] = 0.5*(akX[rkBP.m_uiI00] + akX[rkBP.m_uiI01] - fDSqr*kXvv0M);
    akX[uiI1M] = 0.5*(akX[rkBP.m_uiI10] + akX[rkBP.m_uiI11] - fDSqr*kXvv1M);

    // center subdivision
    MgcVector3 kXuuMM = 0.5*(kXuu0M + kXuu1M);
    MgcVector3 kXvvMM = 0.5*(kXvvM0 + kXvvM1);
    MgcVector3 kXuuvvMM = 0.5*(kXuuvv0M + kXuuvv1M);
    akX[uiIMM] = 0.5*(akX[uiI0M] + akX[uiI1M] - fDSqr*kXuuMM);

    // derivatives (for normal vectors)
    MgcVector3 kXuuu0M, kXuvvM0, kXuvvM1, kXuvv0M, kXuvv1M, kXuuutt0M, kXuvvMM;
    MgcVector3 kXuuvM0, kXuuvM1, kXuuv0M, kXuuv1M, kXvvvM0, kXuuvvvM0, kXuuvMM;
    if ( akXu )
    {
        // top and bottom u-edge subdivision
        kXuuvM0 = 0.5*(rkBP.m_aakXuuv[0][0] + rkBP.m_aakXuuv[1][0]);
        kXuuvM1 = 0.5*(rkBP.m_aakXuuv[0][1] + rkBP.m_aakXuuv[1][1]);
        akXu[uiIM0] = 0.5*(akXu[rkBP.m_uiI00] + akXu[rkBP.m_uiI10] -
            fDSqr*rkBP.m_akXuuu[0]);
        akXv[uiIM0] = 0.5*(akXv[rkBP.m_uiI00] + akXv[rkBP.m_uiI10] -
            fDSqr*kXuuvM0);
        akXu[uiIM1] = 0.5*(akXu[rkBP.m_uiI01] + akXu[rkBP.m_uiI11] -
            fDSqr*rkBP.m_akXuuu[1]);
        akXv[uiIM1] = 0.5*(akXv[rkBP.m_uiI01] + akXv[rkBP.m_uiI11] -
            fDSqr*kXuuvM1);

        kXuvvM0 = 0.5*(rkBP.m_aakXuvv[0][0] + rkBP.m_aakXuvv[1][0] -
            fDSqr*rkBP.m_akXuuuvv[0]);
        kXuuvvvM0 = 0.5*(rkBP.m_akXuuvvv[0] + rkBP.m_akXuuvvv[1]);
        kXvvvM0 = 0.5*(rkBP.m_akXvvv[0] + rkBP.m_akXvvv[1] -
            fDSqr*kXuuvvvM0);
        kXuvvM1 = 0.5*(rkBP.m_aakXuvv[0][1] + rkBP.m_aakXuvv[1][1] -
            fDSqr*rkBP.m_akXuuuvv[1]);

        // left and right v-edge subdivision
        kXuvv0M = 0.5*(rkBP.m_aakXuvv[0][0] + rkBP.m_aakXuvv[0][1]);
        kXuvv1M = 0.5*(rkBP.m_aakXuvv[1][0] + rkBP.m_aakXuvv[1][1]);
        akXu[uiI0M] = 0.5*(akXu[rkBP.m_uiI00] + akXu[rkBP.m_uiI01] -
            fDSqr*kXuvv0M);
        akXv[uiI0M] = 0.5*(akXv[rkBP.m_uiI00] + akXv[rkBP.m_uiI01] -
            fDSqr*rkBP.m_akXvvv[0]);
        akXu[uiI1M] = 0.5*(akXu[rkBP.m_uiI10] + akXu[rkBP.m_uiI11] -
            fDSqr*kXuvv1M);
        akXv[uiI1M] = 0.5*(akXv[rkBP.m_uiI10] + akXv[rkBP.m_uiI11] -
            fDSqr*rkBP.m_akXvvv[1]);

        kXuuv0M = 0.5*(rkBP.m_aakXuuv[0][0] + rkBP.m_aakXuuv[0][1] -
            fDSqr*rkBP.m_akXuuvvv[0]);
        kXuuutt0M = 0.5*(rkBP.m_akXuuuvv[0] + rkBP.m_akXuuuvv[1]);
        kXuuu0M = 0.5*(rkBP.m_akXuuu[0] + rkBP.m_akXuuu[1] -
            fDSqr*kXuuutt0M);
        kXuuv1M = 0.5*(rkBP.m_aakXuuv[1][0] + rkBP.m_aakXuuv[1][1] -
            fDSqr*rkBP.m_akXuuvvv[1]);

        // center subdivision
        kXuuvMM = 0.5*(kXuuv0M + kXuuv1M);
        kXuvvMM = 0.5*(kXuvvM0 + kXuvvM1);
        akXu[uiIMM] = 0.5*(akXu[uiI0M] + akXu[uiI1M] - fDSqr*kXuuu0M);
        akXv[uiIMM] = 0.5*(akXv[uiIM0] + akXv[uiIM1] - fDSqr*kXvvvM0);
    }

    // recurse on four children
    if ( uiLevel > 0 )
    {
        uiLevel--;
        fDSqr *= 0.25;

        BlockParameters kSubBP;

        // subblock [u0,uM]x[v0,vM]
        kSubBP.m_uiI00 = rkBP.m_uiI00;
        kSubBP.m_uiI01 = uiI0M;
        kSubBP.m_uiI10 = uiIM0;
        kSubBP.m_uiI11 = uiIMM;

        kSubBP.m_aakXuu[0][0] = rkBP.m_aakXuu[0][0];
        kSubBP.m_aakXuu[0][1] = kXuu0M;
        kSubBP.m_aakXuu[1][0] = kXuuM0;
        kSubBP.m_aakXuu[1][1] = kXuuMM;
        kSubBP.m_aakXvv[0][0] = rkBP.m_aakXvv[0][0];
        kSubBP.m_aakXvv[0][1] = kXvv0M;
        kSubBP.m_aakXvv[1][0] = kXvvM0;
        kSubBP.m_aakXvv[1][1] = kXvvMM;
        kSubBP.m_aakXuuvv[0][0] = rkBP.m_aakXuuvv[0][0];
        kSubBP.m_aakXuuvv[0][1] = kXuuvv0M;
        kSubBP.m_aakXuuvv[1][0] = kXuuvvM0;
        kSubBP.m_aakXuuvv[1][1] = kXuuvvMM;

        if ( akXu )
        {
            kSubBP.m_akXuuu[0] = rkBP.m_akXuuu[0];
            kSubBP.m_akXuuu[1] = kXuuu0M;
            kSubBP.m_aakXuuv[0][0] = rkBP.m_aakXuuv[0][0];
            kSubBP.m_aakXuuv[0][1] = kXuuv0M;
            kSubBP.m_aakXuuv[1][0] = kXuuvM0;
            kSubBP.m_aakXuuv[1][1] = kXuuvMM;
            kSubBP.m_aakXuvv[0][0] = rkBP.m_aakXuvv[0][0];
            kSubBP.m_aakXuvv[0][1] = kXuvv0M;
            kSubBP.m_aakXuvv[1][0] = kXuvvM0;
            kSubBP.m_aakXuvv[1][1] = kXuvvMM;
            kSubBP.m_akXvvv[0] = rkBP.m_akXvvv[0];
            kSubBP.m_akXvvv[1] = kXvvvM0;
            kSubBP.m_akXuuuvv[0] = rkBP.m_akXuuuvv[0];
            kSubBP.m_akXuuuvv[1] = kXuuutt0M;
            kSubBP.m_akXuuvvv[0] = rkBP.m_akXuuvvv[0];
            kSubBP.m_akXuuvvv[1] = kXuuvvvM0;
        }

        Subdivide(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subblock [u0,uM]x[vM,v1]
        kSubBP.m_uiI00 = uiI0M;
        kSubBP.m_uiI01 = rkBP.m_uiI01;
        kSubBP.m_uiI10 = uiIMM;
        kSubBP.m_uiI11 = uiIM1;

        kSubBP.m_aakXuu[0][0] = kXuu0M;
        kSubBP.m_aakXuu[0][1] = rkBP.m_aakXuu[0][1];
        kSubBP.m_aakXuu[1][0] = kXuuMM;
        kSubBP.m_aakXuu[1][1] = kXuuM1;
        kSubBP.m_aakXvv[0][0] = kXvv0M;
        kSubBP.m_aakXvv[0][1] = rkBP.m_aakXvv[0][1];
        kSubBP.m_aakXvv[1][0] = kXvvMM;
        kSubBP.m_aakXvv[1][1] = kXvvM1;
        kSubBP.m_aakXuuvv[0][0] = kXuuvv0M;
        kSubBP.m_aakXuuvv[0][1] = rkBP.m_aakXuuvv[0][1];
        kSubBP.m_aakXuuvv[1][0] = kXuuvvMM;
        kSubBP.m_aakXuuvv[1][1] = kXuuvvM1;

        if ( akXu )
        {
            kSubBP.m_akXuuu[0] = kXuuu0M;
            kSubBP.m_akXuuu[1] = rkBP.m_akXuuu[1];
            kSubBP.m_aakXuuv[0][0] = kXuuv0M;
            kSubBP.m_aakXuuv[0][1] = rkBP.m_aakXuuv[0][1];
            kSubBP.m_aakXuuv[1][0] = kXuuvMM;
            kSubBP.m_aakXuuv[1][1] = kXuuvM1;
            kSubBP.m_aakXuvv[0][0] = kXuvv0M;
            kSubBP.m_aakXuvv[0][1] = rkBP.m_aakXuvv[0][1];
            kSubBP.m_aakXuvv[1][0] = kXuvvMM;
            kSubBP.m_aakXuvv[1][1] = kXuvvM1;
            kSubBP.m_akXvvv[0] = rkBP.m_akXvvv[0];
            kSubBP.m_akXvvv[1] = kXvvvM0;
            kSubBP.m_akXuuuvv[0] = kXuuutt0M;
            kSubBP.m_akXuuuvv[1] = rkBP.m_akXuuuvv[1];
            kSubBP.m_akXuuvvv[0] = rkBP.m_akXuuvvv[0];
            kSubBP.m_akXuuvvv[1] = kXuuvvvM0;
        }

        Subdivide(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subblock [uM,u1]x[v0,vM]
        kSubBP.m_uiI00 = uiIM0;
        kSubBP.m_uiI01 = uiIMM;
        kSubBP.m_uiI10 = rkBP.m_uiI10;
        kSubBP.m_uiI11 = uiI1M;

        kSubBP.m_aakXuu[0][0] = kXuuM0;
        kSubBP.m_aakXuu[0][1] = kXuuMM;
        kSubBP.m_aakXuu[1][0] = rkBP.m_aakXuu[1][0];
        kSubBP.m_aakXuu[1][1] = kXuu1M;
        kSubBP.m_aakXvv[0][0] = kXvvM0;
        kSubBP.m_aakXvv[0][1] = kXvvMM;
        kSubBP.m_aakXvv[1][0] = rkBP.m_aakXvv[1][0];
        kSubBP.m_aakXvv[1][1] = kXvv1M;
        kSubBP.m_aakXuuvv[0][0] = kXuuvvM0;
        kSubBP.m_aakXuuvv[0][1] = kXuuvvMM;
        kSubBP.m_aakXuuvv[1][0] = rkBP.m_aakXuuvv[1][0];
        kSubBP.m_aakXuuvv[1][1] = kXuuvv1M;

        if ( akXu )
        {
            kSubBP.m_akXuuu[0] = rkBP.m_akXuuu[0];
            kSubBP.m_akXuuu[1] = kXuuu0M;
            kSubBP.m_aakXuuv[0][0] = kXuuvM0;
            kSubBP.m_aakXuuv[0][1] = kXuuvMM;
            kSubBP.m_aakXuuv[1][0] = rkBP.m_aakXuuv[1][0];
            kSubBP.m_aakXuuv[1][1] = kXuuv1M;
            kSubBP.m_aakXuvv[0][0] = kXuvvM0;
            kSubBP.m_aakXuvv[0][1] = kXuvvMM;
            kSubBP.m_aakXuvv[1][0] = rkBP.m_aakXuvv[1][0];
            kSubBP.m_aakXuvv[1][1] = kXuvv1M;
            kSubBP.m_akXvvv[0] = kXvvvM0;
            kSubBP.m_akXvvv[1] = rkBP.m_akXvvv[1];
            kSubBP.m_akXuuuvv[0] = rkBP.m_akXuuuvv[0];
            kSubBP.m_akXuuuvv[1] = kXuuutt0M;
            kSubBP.m_akXuuvvv[0] = kXuuvvvM0;
            kSubBP.m_akXuuvvv[1] = rkBP.m_akXuuvvv[1];
        }

        Subdivide(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subblock [uM,u1]x[vM,v1]
        kSubBP.m_uiI00 = uiIMM;
        kSubBP.m_uiI01 = uiIM1;
        kSubBP.m_uiI10 = uiI1M;
        kSubBP.m_uiI11 = rkBP.m_uiI11;

        kSubBP.m_aakXuu[0][0] = kXuuMM;
        kSubBP.m_aakXuu[0][1] = kXuuM1;
        kSubBP.m_aakXuu[1][0] = kXuu1M;
        kSubBP.m_aakXuu[1][1] = rkBP.m_aakXuu[1][1];
        kSubBP.m_aakXvv[0][0] = kXvvMM;
        kSubBP.m_aakXvv[0][1] = kXvvM1;
        kSubBP.m_aakXvv[1][0] = kXvv1M;
        kSubBP.m_aakXvv[1][1] = rkBP.m_aakXvv[1][1];
        kSubBP.m_aakXuuvv[0][0] = kXuuvvMM;
        kSubBP.m_aakXuuvv[0][1] = kXuuvvM1;
        kSubBP.m_aakXuuvv[1][0] = kXuuvv1M;
        kSubBP.m_aakXuuvv[1][1] = rkBP.m_aakXuuvv[1][1];

        if ( akXu )
        {
            kSubBP.m_akXuuu[0] = kXuuu0M;
            kSubBP.m_akXuuu[1] = rkBP.m_akXuuu[1];
            kSubBP.m_aakXuuv[0][0] = kXuuvMM;
            kSubBP.m_aakXuuv[0][1] = kXuuvM1;
            kSubBP.m_aakXuuv[1][0] = kXuuv1M;
            kSubBP.m_aakXuuv[1][1] = rkBP.m_aakXuuv[1][1];
            kSubBP.m_aakXuvv[0][0] = kXuvvMM;
            kSubBP.m_aakXuvv[0][1] = kXuvvM1;
            kSubBP.m_aakXuvv[1][0] = kXuvv1M;
            kSubBP.m_aakXuvv[1][1] = rkBP.m_aakXuvv[1][1];
            kSubBP.m_akXvvv[0] = kXvvvM0;
            kSubBP.m_akXvvv[1] = rkBP.m_akXvvv[1];
            kSubBP.m_akXuuuvv[0] = kXuuutt0M;
            kSubBP.m_akXuuuvv[1] = rkBP.m_akXuuuvv[1];
            kSubBP.m_akXuuvvv[0] = kXuuvvvM0;
            kSubBP.m_akXuuvvv[1] = rkBP.m_akXuuvvv[1];
        }

        Subdivide(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
    }
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -