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

📄 mgcbezierrectangle2.cpp

📁 《3D游戏引擎设计》的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            fDSqr*rkBP.m_akXstt[0]);
        akXt[uiI0M] = 0.5*(akXt[rkBP.m_uiI00] + akXt[rkBP.m_uiI01]);
        akXs[uiI1M] = 0.5*(akXs[rkBP.m_uiI10] + akXs[rkBP.m_uiI11] -
            fDSqr*rkBP.m_akXstt[1]);
        akXt[uiI1M] = 0.5*(akXt[rkBP.m_uiI10] + akXt[rkBP.m_uiI11]);

        kXsst0M = 0.5*(rkBP.m_akXsst[0] + rkBP.m_akXsst[1]);

        // center subdivision
        akXs[uiIMM] = 0.5*(akXs[uiI0M] + akXs[uiI1M]);
        akXt[uiIMM] = 0.5*(akXt[uiIM0] + akXt[uiIM1]);
    }

    // colors
    MgcColor kCss0M, kCttM0;
    if ( akColor )
    {
        // top and bottom s-edge subdivision
        kCttM0 = 0.5*(rkBP.m_akCtt[0]+rkBP.m_akCtt[1]-fDSqr*rkCsstt);
        akColor[uiIM0] = 0.5*(akColor[rkBP.m_uiI00] + akColor[rkBP.m_uiI10] -
            fDSqr*rkBP.m_akCss[0]);
        akColor[uiIM1] = 0.5*(akColor[rkBP.m_uiI01] + akColor[rkBP.m_uiI11] -
            fDSqr*rkBP.m_akCss[1]);

        // left and right t-edge subdivision
        kCss0M = 0.5*(rkBP.m_akCss[0]+rkBP.m_akCss[1]-fDSqr*rkCsstt);
        akColor[uiI0M] = 0.5*(akColor[rkBP.m_uiI00] + akColor[rkBP.m_uiI01] -
            fDSqr*rkBP.m_akCtt[0]);
        akColor[uiI1M] = 0.5*(akColor[rkBP.m_uiI10] + akColor[rkBP.m_uiI11] -
            fDSqr*rkBP.m_akCtt[1]);

        // center subdivision
        akColor[uiIMM] = 0.5*(akColor[uiI0M] + akColor[uiI1M] - fDSqr*kCss0M);
    }

    // textures
    MgcVector2 kTss0M, kTttM0;
    if ( akTexture )
    {
        // top and bottom s-edge subdivision
        kTttM0 = 0.5*(rkBP.m_akTtt[0]+rkBP.m_akTtt[1]-fDSqr*rkTsstt);
        akTexture[uiIM0] = 0.5*(akTexture[rkBP.m_uiI00] +
            akTexture[rkBP.m_uiI10] - fDSqr*rkBP.m_akTss[0]);
        akTexture[uiIM1] = 0.5*(akTexture[rkBP.m_uiI01] +
            akTexture[rkBP.m_uiI11] - fDSqr*rkBP.m_akTss[1]);

        // left and right t-edge subdivision
        kTss0M = 0.5*(rkBP.m_akTss[0]+rkBP.m_akTss[1]-fDSqr*rkTsstt);
        akTexture[uiI0M] = 0.5*(akTexture[rkBP.m_uiI00] +
            akTexture[rkBP.m_uiI01] - fDSqr*rkBP.m_akTtt[0]);
        akTexture[uiI1M] = 0.5*(akTexture[rkBP.m_uiI10] +
            akTexture[rkBP.m_uiI11] - fDSqr*rkBP.m_akTtt[1]);

        // center subdivision
        akTexture[uiIMM] = 0.5*(akTexture[uiI0M] + akTexture[uiI1M] -
            fDSqr*kTss0M);
    }

    // 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_akXss[0] = rkBP.m_akXss[0];
        kSubBP.m_akXss[1] = kXss0M;
        kSubBP.m_akXtt[0] = rkBP.m_akXtt[0];
        kSubBP.m_akXtt[1] = kXttM0;

        if ( akXs )
        {
            kSubBP.m_akXsst[0] = rkBP.m_akXsst[0];
            kSubBP.m_akXsst[1] = kXsst0M;
            kSubBP.m_akXstt[0] = rkBP.m_akXstt[0];
            kSubBP.m_akXstt[1] = kXsttM0;
        }

        if ( akColor )
        {
            kSubBP.m_akCss[0] = rkBP.m_akCss[0];
            kSubBP.m_akCss[1] = kCss0M;
            kSubBP.m_akCtt[0] = rkBP.m_akCtt[0];
            kSubBP.m_akCtt[1] = kCttM0;
        }

        if ( akTexture )
        {
            kSubBP.m_akTss[0] = rkBP.m_akTss[0];
            kSubBP.m_akTss[1] = kTss0M;
            kSubBP.m_akTtt[0] = rkBP.m_akTtt[0];
            kSubBP.m_akTtt[1] = kTttM0;
        }

        Subdivide(uiLevel,fDSqr,akX,akXs,akXt,akColor,akTexture,rkXsstt,
            rkCsstt,rkTsstt,kSubBP);

        // subblock [s0,sM]x[tM,t1]
        kSubBP.m_uiI00 = uiI0M;
        kSubBP.m_uiI01 = rkBP.m_uiI01;
        kSubBP.m_uiI10 = uiIMM;
        kSubBP.m_uiI11 = uiIM1;

        kSubBP.m_akXss[0] = kXss0M;
        kSubBP.m_akXss[1] = rkBP.m_akXss[1];
        kSubBP.m_akXtt[0] = rkBP.m_akXtt[0];
        kSubBP.m_akXtt[1] = kXttM0;

        if ( akXs )
        {
            kSubBP.m_akXsst[0] = kXsst0M;
            kSubBP.m_akXsst[1] = rkBP.m_akXsst[1];
            kSubBP.m_akXstt[0] = rkBP.m_akXstt[0];
            kSubBP.m_akXstt[1] = kXsttM0;
        }

        if ( akColor )
        {
            kSubBP.m_akCss[0] = kCss0M;
            kSubBP.m_akCss[1] = rkBP.m_akCss[1];
            kSubBP.m_akCtt[0] = rkBP.m_akCtt[0];
            kSubBP.m_akCtt[1] = kCttM0;
        }

        if ( akTexture )
        {
            kSubBP.m_akTss[0] = kTss0M;
            kSubBP.m_akTss[1] = rkBP.m_akTss[1];
            kSubBP.m_akTtt[0] = rkBP.m_akTtt[0];
            kSubBP.m_akTtt[1] = kTttM0;
        }

        Subdivide(uiLevel,fDSqr,akX,akXs,akXt,akColor,akTexture,rkXsstt,
            rkCsstt,rkTsstt,kSubBP);

        // subblock [sM,s1]x[t0,tM]
        kSubBP.m_uiI00 = uiIM0;
        kSubBP.m_uiI01 = uiIMM;
        kSubBP.m_uiI10 = rkBP.m_uiI10;
        kSubBP.m_uiI11 = uiI1M;

        kSubBP.m_akXss[0] = rkBP.m_akXss[0];
        kSubBP.m_akXss[1] = kXss0M;
        kSubBP.m_akXtt[0] = kXttM0;
        kSubBP.m_akXtt[1] = rkBP.m_akXtt[1];

        if ( akXs )
        {
            kSubBP.m_akXsst[0] = rkBP.m_akXsst[0];
            kSubBP.m_akXsst[1] = kXsst0M;
            kSubBP.m_akXstt[0] = kXsttM0;
            kSubBP.m_akXstt[1] = rkBP.m_akXstt[1];
        }

        if ( akColor )
        {
            kSubBP.m_akCss[0] = rkBP.m_akCss[0];
            kSubBP.m_akCss[1] = kCss0M;
            kSubBP.m_akCtt[0] = kCttM0;
            kSubBP.m_akCtt[1] = rkBP.m_akCtt[1];
        }

        if ( akTexture )
        {
            kSubBP.m_akTss[0] = rkBP.m_akTss[0];
            kSubBP.m_akTss[1] = kTss0M;
            kSubBP.m_akTtt[0] = kTttM0;
            kSubBP.m_akTtt[1] = rkBP.m_akTtt[1];
        }

        Subdivide(uiLevel,fDSqr,akX,akXs,akXt,akColor,akTexture,rkXsstt,
            rkCsstt,rkTsstt,kSubBP);

        // subblock [sM,s1]x[tM,t1]
        kSubBP.m_uiI00 = uiIMM;
        kSubBP.m_uiI01 = uiIM1;
        kSubBP.m_uiI10 = uiI1M;
        kSubBP.m_uiI11 = rkBP.m_uiI11;

        kSubBP.m_akXss[0] = kXss0M;
        kSubBP.m_akXss[1] = rkBP.m_akXss[1];
        kSubBP.m_akXtt[0] = kXttM0;
        kSubBP.m_akXtt[1] = rkBP.m_akXtt[1];

        if ( akXs )
        {
            kSubBP.m_akXsst[0] = kXsst0M;
            kSubBP.m_akXsst[1] = rkBP.m_akXsst[1];
            kSubBP.m_akXstt[0] = kXsttM0;
            kSubBP.m_akXstt[1] = rkBP.m_akXstt[1];
        }

        if ( akColor )
        {
            kSubBP.m_akCss[0] = kCss0M;
            kSubBP.m_akCss[1] = rkBP.m_akCss[1];
            kSubBP.m_akCtt[0] = kCttM0;
            kSubBP.m_akCtt[1] = rkBP.m_akCtt[1];
        }

        if ( akTexture )
        {
            kSubBP.m_akTss[0] = kTss0M;
            kSubBP.m_akTss[1] = rkBP.m_akTss[1];
            kSubBP.m_akTtt[0] = kTttM0;
            kSubBP.m_akTtt[1] = rkBP.m_akTtt[1];
        }

        Subdivide(uiLevel,fDSqr,akX,akXs,akXt,akColor,akTexture,rkXsstt,
            rkCsstt,rkTsstt,kSubBP);
    }
}
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
// streaming
//----------------------------------------------------------------------------
MgcObject* MgcBezierRectangle2::Factory (MgcStream& rkStream)
{
    MgcBezierRectangle2* pkObject = new MgcBezierRectangle2;
    MgcStream::Link* pkLink = new MgcStream::Link(pkObject);
    pkObject->Load(rkStream,pkLink);
    return pkObject;
}
//----------------------------------------------------------------------------
void MgcBezierRectangle2::Load (MgcStream& rkStream, MgcStream::Link* pkLink)
{
    MgcBezierRectangle::Load(rkStream,pkLink);
}
//----------------------------------------------------------------------------
void MgcBezierRectangle2::Link (MgcStream& rkStream, MgcStream::Link* pkLink)
{
    MgcBezierRectangle::Link(rkStream,pkLink);
}
//----------------------------------------------------------------------------
bool MgcBezierRectangle2::Register (MgcStream& rkStream)
{
    return MgcBezierRectangle::Register(rkStream);
}
//----------------------------------------------------------------------------
void MgcBezierRectangle2::Save (MgcStream& rkStream)
{
    MgcBezierRectangle::Save(rkStream);
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

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