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

📄 wmlbeziertriangle3.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 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];
        }

        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 + -