几何尺寸与公差论坛

 找回密码
 注册
查看: 2176|回复: 0

【转帖】CDocView::DisplayEnumBodiesTessellation

[复制链接]
发表于 2007-3-26 08:37:47 | 显示全部楼层 |阅读模式
void CDocView:isplayEnumBodiesTessellation  (CComPtr <IEnumBodies2>     pEnumBody)
{
    try
        {
        HRESULT                         hr = S_OK;
        CComPtr <IBody2>                pBody;
        CComPtr <IEnumFaces2>           pEnumFaces;
        CComPtr <IFace2>                pFace;
        long                            nFetchedBodies = -1;
        long                            nFetchedFaces = -1;
        long                            nNumTessTriang = -1;
        float*                          pTessTriang = NULL;
        long                            i = 0;


        hr = pEnumBody->Reset();
        hr = pEnumBody->Next(1, &pBody, &nFetchedBodies);
        while (nFetchedBodies > 0)
            {
            hr = pBody->EnumFaces(&pEnumFaces);
            _ASSERT(pEnumFaces);

            // set colour to blue
            AutoColor               Color(0, 0, 128);

            // set line width to 1 pixel
            AutoLineWidth           LineWidth(1.0);

            // get the first face
            hr = pEnumFaces->Reset();
            hr = pEnumFaces->Next(1, &pFace, &nFetchedFaces);
            while (nFetchedFaces > 0)
                {
                // get display tessellation for this face
                hr = pFace->GetTessTriangleCount(&nNumTessTriang);
                _ASSERT(nNumTessTriang > 0);

                pTessTriang = new float[9 * sizeof(float) * nNumTessTriang];
                _ASSERT(pTessTriang);

                ZeroMemory(pTessTriang, 9 * sizeof(float) * nNumTessTriang);

                hr = pFace->IGetTessTriangles(VARIANT_TRUE, pTessTriang);
                _ASSERT(pTessTriang);

                // draw display tessellation
                glBegin(GL_LINE_STRIP);
                    {
                    for (i = 0; i < nNumTessTriang; i++)
                        {
                        glVertex3f
                            (
                            pTessTriang[9 * i + 0],
                            pTessTriang[9 * i + 1],
                            pTessTriang[9 * i + 2]
                            );

                        glVertex3f
                            (
                            pTessTriang[9 * i + 3],
                            pTessTriang[9 * i + 4],
                            pTessTriang[9 * i + 5]
                            );

                        glVertex3f
                            (
                            pTessTriang[9 * i + 6],
                            pTessTriang[9 * i + 7],
                            pTessTriang[9 * i + 8]
                            );
                        }
                    }
                glEnd();

                delete [] pTessTriang;

                // reset current face and get the next face
                pFace = NULL;
                hr = pEnumFaces->Next(1, &pFace, &nFetchedFaces);
                }

            // reset face enumerator
            pEnumFaces = NULL;

            // reset current body and get the next body
            pBody = NULL;
            hr = pEnumBody->Next(1, &pBody, &nFetchedBodies);
            }
        }
    catch (...)
        {
        DebugBreak();
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-12-22 18:50 , Processed in 0.035166 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表