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

📄 wmlstandardmesh.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 3 页
字号:
            aiConnect[3*i+2] = iSave;
        }
    }

    if ( rpkMesh )
    {
        rpkMesh->Reconstruct(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
    else
    {
        rpkMesh = new TriMesh(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
}
//----------------------------------------------------------------------------
void Wml::CreateHexahedronMesh (TriMesh*& rpkMesh, bool bWantNormals,
    bool bWantColors, bool bWantUVs, bool bOutsideView)
{
    float fSqrtThird = Mathf::Sqrt(1.0f/3.0f);
    int i;

    // allocate vertices
    int iVQuantity = 8;
    Vector3f* akVertex = new Vector3f[iVQuantity];
    akVertex[0] = Vector3f(-fSqrtThird,-fSqrtThird,-fSqrtThird);
    akVertex[1] = Vector3f( fSqrtThird,-fSqrtThird,-fSqrtThird);
    akVertex[2] = Vector3f( fSqrtThird, fSqrtThird,-fSqrtThird);
    akVertex[3] = Vector3f(-fSqrtThird, fSqrtThird,-fSqrtThird);
    akVertex[4] = Vector3f(-fSqrtThird,-fSqrtThird, fSqrtThird);
    akVertex[5] = Vector3f( fSqrtThird,-fSqrtThird, fSqrtThird);
    akVertex[6] = Vector3f( fSqrtThird, fSqrtThird, fSqrtThird);
    akVertex[7] = Vector3f(-fSqrtThird, fSqrtThird, fSqrtThird);

    // allocate normals if requested
    Vector3f* akNormal = NULL;
    if ( bWantNormals )
    {
        akNormal = new Vector3f[iVQuantity];
        for (i = 0; i < iVQuantity; i++)
            akNormal[i] = akVertex[i];
    }

    // allocate colors if requested
    ColorRGB* akColor = NULL;
    if ( bWantColors )
    {
        akColor = new ColorRGB[iVQuantity];
        memset(akColor,0,iVQuantity*sizeof(ColorRGB));
    }

    // allocate texture coordinates if requested
    Vector2f* akUV = NULL;
    if ( bWantUVs )
    {
        akUV = new Vector2f[iVQuantity];
        for (i = 0; i < iVQuantity; i++)
        {
            if ( Mathf::FAbs(akVertex[i].Z()) < 1.0f )
            {
                akUV[i].X() = 0.5f*(1.0f + Mathf::ATan2(akVertex[i].Y(),
                    akVertex[i].X())*Mathf::INV_PI);
            }
            else
            {
                akUV[i].X() = 0.5f;
            }
            akUV[i].Y() = Mathf::ACos(akVertex[i].Z())*Mathf::INV_PI;
        }
    }

    // allocate connectivity
    int iTQuantity = 12;
    int* aiConnect = new int[3*iTQuantity];
    aiConnect[ 0] = 0;  aiConnect[ 1] = 3;  aiConnect[ 2] = 2;
    aiConnect[ 3] = 0;  aiConnect[ 4] = 2;  aiConnect[ 5] = 1;
    aiConnect[ 6] = 0;  aiConnect[ 7] = 1;  aiConnect[ 8] = 5;
    aiConnect[ 9] = 0;  aiConnect[10] = 5;  aiConnect[11] = 4;
    aiConnect[12] = 0;  aiConnect[13] = 4;  aiConnect[14] = 7;
    aiConnect[15] = 0;  aiConnect[16] = 7;  aiConnect[17] = 3;
    aiConnect[18] = 6;  aiConnect[19] = 5;  aiConnect[20] = 1;
    aiConnect[21] = 6;  aiConnect[22] = 1;  aiConnect[23] = 2;
    aiConnect[24] = 6;  aiConnect[25] = 2;  aiConnect[26] = 3;
    aiConnect[27] = 6;  aiConnect[28] = 3;  aiConnect[29] = 7;
    aiConnect[30] = 6;  aiConnect[31] = 7;  aiConnect[32] = 4;
    aiConnect[33] = 6;  aiConnect[34] = 4;  aiConnect[35] = 5;

    if ( !bOutsideView )
    {
        for (i = 0; i < iTQuantity; i++)
        {
            int iSave = aiConnect[3*i+1];
            aiConnect[3*i+1] = aiConnect[3*i+2];
            aiConnect[3*i+2] = iSave;
        }
    }

    if ( rpkMesh )
    {
        rpkMesh->Reconstruct(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
    else
    {
        rpkMesh = new TriMesh(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
}
//----------------------------------------------------------------------------
void Wml::CreateOctahedronMesh (TriMesh*& rpkMesh, bool bWantNormals,
    bool bWantColors, bool bWantUVs, bool bOutsideView)
{
    int i;

    // allocate vertices
    int iVQuantity = 6;
    Vector3f* akVertex = new Vector3f[iVQuantity];
    akVertex[0] = Vector3f( 1.0f, 0.0f, 0.0f);
    akVertex[1] = Vector3f(-1.0f, 0.0f, 0.0f);
    akVertex[2] = Vector3f( 0.0f, 1.0f, 0.0f);
    akVertex[3] = Vector3f( 0.0f,-1.0f, 0.0f);
    akVertex[4] = Vector3f( 0.0f, 0.0f, 1.0f);
    akVertex[5] = Vector3f( 0.0f, 0.0f,-1.0f);

    // allocate normals if requested
    Vector3f* akNormal = NULL;
    if ( bWantNormals )
    {
        akNormal = new Vector3f[iVQuantity];
        for (i = 0; i < iVQuantity; i++)
            akNormal[i] = akVertex[i];
    }

    // allocate colors if requested
    ColorRGB* akColor = NULL;
    if ( bWantColors )
    {
        akColor = new ColorRGB[iVQuantity];
        memset(akColor,0,iVQuantity*sizeof(ColorRGB));
    }

    // allocate texture coordinates if requested
    Vector2f* akUV = NULL;
    if ( bWantUVs )
    {
        akUV = new Vector2f[iVQuantity];
        for (i = 0; i < iVQuantity; i++)
        {
            if ( Mathf::FAbs(akVertex[i].Z()) < 1.0f )
            {
                akUV[i].X() = 0.5f*(1.0f + Mathf::ATan2(akVertex[i].Y(),
                    akVertex[i].X())*Mathf::INV_PI);
            }
            else
            {
                akUV[i].X() = 0.5f;
            }
            akUV[i].Y() = Mathf::ACos(akVertex[i].Z())*Mathf::INV_PI;
        }
    }

    // allocate connectivity
    int iTQuantity = 8;
    int* aiConnect = new int[3*iTQuantity];
    aiConnect[ 0] = 4;  aiConnect[ 1] = 0;  aiConnect[ 2] = 2;
    aiConnect[ 3] = 4;  aiConnect[ 4] = 2;  aiConnect[ 5] = 1;
    aiConnect[ 6] = 4;  aiConnect[ 7] = 1;  aiConnect[ 8] = 3;
    aiConnect[ 9] = 4;  aiConnect[10] = 3;  aiConnect[11] = 0;
    aiConnect[12] = 5;  aiConnect[13] = 2;  aiConnect[14] = 0;
    aiConnect[15] = 5;  aiConnect[16] = 1;  aiConnect[17] = 2;
    aiConnect[18] = 5;  aiConnect[19] = 3;  aiConnect[20] = 1;
    aiConnect[21] = 5;  aiConnect[22] = 0;  aiConnect[23] = 3;

    if ( !bOutsideView )
    {
        for (i = 0; i < iTQuantity; i++)
        {
            int iSave = aiConnect[3*i+1];
            aiConnect[3*i+1] = aiConnect[3*i+2];
            aiConnect[3*i+2] = iSave;
        }
    }

    if ( rpkMesh )
    {
        rpkMesh->Reconstruct(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
    else
    {
        rpkMesh = new TriMesh(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
}
//----------------------------------------------------------------------------
void Wml::CreateDodecahedronMesh (TriMesh*& rpkMesh, bool bWantNormals,
    bool bWantColors, bool bWantUVs, bool bOutsideView)
{
    float fA = 1.0f/Mathf::Sqrt(3.0f);
    float fB = Mathf::Sqrt((3.0f-Mathf::Sqrt(5.0f))/6.0f);
    float fC = Mathf::Sqrt((3.0f+Mathf::Sqrt(5.0f))/6.0f);
    int i;

    // allocate vertices
    int iVQuantity = 20;
    Vector3f* akVertex = new Vector3f[20];
    akVertex[ 0] = Vector3f( fA, fA, fA);
    akVertex[ 1] = Vector3f( fA, fA,-fA);
    akVertex[ 2] = Vector3f( fA,-fA, fA);
    akVertex[ 3] = Vector3f( fA,-fA,-fA);
    akVertex[ 4] = Vector3f(-fA, fA, fA);
    akVertex[ 5] = Vector3f(-fA, fA,-fA);
    akVertex[ 6] = Vector3f(-fA,-fA, fA);
    akVertex[ 7] = Vector3f(-fA,-fA,-fA);
    akVertex[ 8] = Vector3f(  fB,  fC, 0.0f);
    akVertex[ 9] = Vector3f( -fB,  fC, 0.0f);
    akVertex[10] = Vector3f(  fB, -fC, 0.0f);
    akVertex[11] = Vector3f( -fB, -fC, 0.0f);
    akVertex[12] = Vector3f(  fC, 0.0f,  fB);
    akVertex[13] = Vector3f(  fC, 0.0f, -fB);
    akVertex[14] = Vector3f( -fC, 0.0f,  fB);
    akVertex[15] = Vector3f( -fC, 0.0f, -fB);
    akVertex[16] = Vector3f(0.0f,   fB,  fC);
    akVertex[17] = Vector3f(0.0f,  -fB,  fC);
    akVertex[18] = Vector3f(0.0f,   fB, -fC);
    akVertex[19] = Vector3f(0.0f,  -fB, -fC);

    // allocate normals if requested
    Vector3f* akNormal = NULL;
    if ( bWantNormals )
    {
        akNormal = new Vector3f[iVQuantity];
        for (i = 0; i < iVQuantity; i++)
            akNormal[i] = akVertex[i];
    }

    // allocate colors if requested
    ColorRGB* akColor = NULL;
    if ( bWantColors )
    {
        akColor = new ColorRGB[iVQuantity];
        memset(akColor,0,iVQuantity*sizeof(ColorRGB));
    }

    // allocate texture coordinates if requested
    Vector2f* akUV = NULL;
    if ( bWantUVs )
    {
        akUV = new Vector2f[iVQuantity];
        for (i = 0; i < iVQuantity; i++)
        {
            if ( Mathf::FAbs(akVertex[i].Z()) < 1.0f )
            {
                akUV[i].X() = 0.5f*(1.0f + Mathf::ATan2(akVertex[i].Y(),
                    akVertex[i].X())*Mathf::INV_PI);
            }
            else
            {
                akUV[i].X() = 0.5f;
            }
            akUV[i].Y() = Mathf::ACos(akVertex[i].Z())*Mathf::INV_PI;
        }
    }

    // allocate connectivity
    int iTQuantity = 36;
    int* aiConnect = new int[3*iTQuantity];
    aiConnect[  0] =  0;  aiConnect[  1] =  8;  aiConnect[  2] =  9;
    aiConnect[  3] =  0;  aiConnect[  4] =  9;  aiConnect[  5] =  4;
    aiConnect[  6] =  0;  aiConnect[  7] =  4;  aiConnect[  8] = 16;
    aiConnect[  9] =  0;  aiConnect[ 10] = 12;  aiConnect[ 11] = 13;
    aiConnect[ 12] =  0;  aiConnect[ 13] = 13;  aiConnect[ 14] =  1;
    aiConnect[ 15] =  0;  aiConnect[ 16] =  1;  aiConnect[ 17] =  8;
    aiConnect[ 18] =  0;  aiConnect[ 19] = 16;  aiConnect[ 20] = 17;
    aiConnect[ 21] =  0;  aiConnect[ 22] = 17;  aiConnect[ 23] =  2;
    aiConnect[ 24] =  0;  aiConnect[ 25] =  2;  aiConnect[ 26] = 12;
    aiConnect[ 27] =  8;  aiConnect[ 28] =  1;  aiConnect[ 29] = 18;
    aiConnect[ 30] =  8;  aiConnect[ 31] = 18;  aiConnect[ 32] =  5;
    aiConnect[ 33] =  8;  aiConnect[ 34] =  5;  aiConnect[ 35] =  9;
    aiConnect[ 36] = 12;  aiConnect[ 37] =  2;  aiConnect[ 38] = 10;
    aiConnect[ 39] = 12;  aiConnect[ 40] = 10;  aiConnect[ 41] =  3;
    aiConnect[ 42] = 12;  aiConnect[ 43] =  3;  aiConnect[ 44] = 13;
    aiConnect[ 45] = 16;  aiConnect[ 46] =  4;  aiConnect[ 47] = 14;
    aiConnect[ 48] = 16;  aiConnect[ 49] = 14;  aiConnect[ 50] =  6;
    aiConnect[ 51] = 16;  aiConnect[ 52] =  6;  aiConnect[ 53] = 17;
    aiConnect[ 54] =  9;  aiConnect[ 55] =  5;  aiConnect[ 56] = 15;
    aiConnect[ 57] =  9;  aiConnect[ 58] = 15;  aiConnect[ 59] = 14;
    aiConnect[ 60] =  9;  aiConnect[ 61] = 14;  aiConnect[ 62] =  4;
    aiConnect[ 63] =  6;  aiConnect[ 64] = 11;  aiConnect[ 65] = 10;
    aiConnect[ 66] =  6;  aiConnect[ 67] = 10;  aiConnect[ 68] =  2;
    aiConnect[ 69] =  6;  aiConnect[ 70] =  2;  aiConnect[ 71] = 17;
    aiConnect[ 72] =  3;  aiConnect[ 73] = 19;  aiConnect[ 74] = 18;
    aiConnect[ 75] =  3;  aiConnect[ 76] = 18;  aiConnect[ 77] =  1;
    aiConnect[ 78] =  3;  aiConnect[ 79] =  1;  aiConnect[ 80] = 13;
    aiConnect[ 81] =  7;  aiConnect[ 82] = 15;  aiConnect[ 83] =  5;
    aiConnect[ 84] =  7;  aiConnect[ 85] =  5;  aiConnect[ 86] = 18;
    aiConnect[ 87] =  7;  aiConnect[ 88] = 18;  aiConnect[ 89] = 19;
    aiConnect[ 90] =  7;  aiConnect[ 91] = 11;  aiConnect[ 92] =  6;
    aiConnect[ 93] =  7;  aiConnect[ 94] =  6;  aiConnect[ 95] = 14;
    aiConnect[ 96] =  7;  aiConnect[ 97] = 14;  aiConnect[ 98] = 15;
    aiConnect[ 99] =  7;  aiConnect[100] = 19;  aiConnect[101] =  3;
    aiConnect[102] =  7;  aiConnect[103] =  3;  aiConnect[104] = 10;
    aiConnect[105] =  7;  aiConnect[106] = 10;  aiConnect[107] = 11;

    if ( !bOutsideView )
    {
        for (i = 0; i < iTQuantity; i++)
        {
            int iSave = aiConnect[3*i+1];
            aiConnect[3*i+1] = aiConnect[3*i+2];
            aiConnect[3*i+2] = iSave;
        }
    }

    if ( rpkMesh )
    {
        rpkMesh->Reconstruct(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
    else
    {
        rpkMesh = new TriMesh(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
}
//----------------------------------------------------------------------------
void Wml::CreateIcosahedronMesh (TriMesh*& rpkMesh, bool bWantNormals,
    bool bWantColors, bool bWantUVs, bool bOutsideView)
{
    float fGoldenRatio = 0.5f*(1.0f+Mathf::Sqrt(5.0f));
    float fInvRoot = 1.0f/Mathf::Sqrt(1.0f+fGoldenRatio*fGoldenRatio);
    float fU = fGoldenRatio*fInvRoot;
    float fV = fInvRoot;
    int i;

    // allocate vertices
    int iVQuantity = 12;
    Vector3f* akVertex = new Vector3f[iVQuantity];
    akVertex[ 0] = Vector3f(  fU,  fV,0.0f);
    akVertex[ 1] = Vector3f( -fU,  fV,0.0f);
    akVertex[ 2] = Vector3f(  fU, -fV,0.0f);
    akVertex[ 3] = Vector3f( -fU, -fV,0.0f);
    akVertex[ 4] = Vector3f(  fV,0.0f,  fU);
    akVertex[ 5] = Vector3f(  fV,0.0f, -fU);
    akVertex[ 6] = Vector3f( -fV,0.0f,  fU);
    akVertex[ 7] = Vector3f( -fV,0.0f, -fU);
    akVertex[ 8] = Vector3f(0.0f,  fU,  fV);
    akVertex[ 9] = Vector3f(0.0f, -fU,  fV);
    akVertex[10] = Vector3f(0.0f,  fU, -fV);
    akVertex[11] = Vector3f(0.0f, -fU, -fV);

    // allocate normals if requested
    Vector3f* akNormal = NULL;
    if ( bWantNormals )
    {
        akNormal = new Vector3f[iVQuantity];
        for (i = 0; i < iVQuantity; i++)
            akNormal[i] = akVertex[i];
    }

    // allocate colors if requested
    ColorRGB* akColor = NULL;
    if ( bWantColors )
    {
        akColor = new ColorRGB[iVQuantity];
        memset(akColor,0,iVQuantity*sizeof(ColorRGB));
    }

    // allocate texture coordinates if requested
    Vector2f* akUV = NULL;
    if ( bWantUVs )
    {
        akUV = new Vector2f[iVQuantity];
        for (i = 0; i < iVQuantity; i++)
        {
            if ( Mathf::FAbs(akVertex[i].Z()) < 1.0f )
            {
                akUV[i].X() = 0.5f*(1.0f + Mathf::ATan2(akVertex[i].Y(),
                    akVertex[i].X())*Mathf::INV_PI);
            }
            else
            {
                akUV[i].X() = 0.5f;
            }
            akUV[i].Y() = Mathf::ACos(akVertex[i].Z())*Mathf::INV_PI;
        }
    }

    // allocate connectivity
    int iTQuantity = 20;
    int* aiConnect = new int[3*iTQuantity];
    aiConnect[ 0] =  0;  aiConnect[ 1] =  8;  aiConnect[ 2] =  4;
    aiConnect[ 3] =  0;  aiConnect[ 4] =  5;  aiConnect[ 5] = 10;
    aiConnect[ 6] =  2;  aiConnect[ 7] =  4;  aiConnect[ 8] =  9;
    aiConnect[ 9] =  2;  aiConnect[10] = 11;  aiConnect[11] =  5;
    aiConnect[12] =  1;  aiConnect[13] =  6;  aiConnect[14] =  8;
    aiConnect[15] =  1;  aiConnect[16] = 10;  aiConnect[17] =  7;
    aiConnect[18] =  3;  aiConnect[19] =  9;  aiConnect[20] =  6;
    aiConnect[21] =  3;  aiConnect[22] =  7;  aiConnect[23] = 11;
    aiConnect[24] =  0;  aiConnect[25] = 10;  aiConnect[26] =  8;
    aiConnect[27] =  1;  aiConnect[28] =  8;  aiConnect[29] = 10;
    aiConnect[30] =  2;  aiConnect[31] =  9;  aiConnect[32] = 11;
    aiConnect[33] =  3;  aiConnect[34] = 11;  aiConnect[35] =  9;
    aiConnect[36] =  4;  aiConnect[37] =  2;  aiConnect[38] =  0;
    aiConnect[39] =  5;  aiConnect[40] =  0;  aiConnect[41] =  2;
    aiConnect[42] =  6;  aiConnect[43] =  1;  aiConnect[44] =  3;
    aiConnect[45] =  7;  aiConnect[46] =  3;  aiConnect[47] =  1;
    aiConnect[48] =  8;  aiConnect[49] =  6;  aiConnect[50] =  4;
    aiConnect[51] =  9;  aiConnect[52] =  4;  aiConnect[53] =  6;
    aiConnect[54] = 10;  aiConnect[55] =  5;  aiConnect[56] =  7;
    aiConnect[57] = 11;  aiConnect[58] =  7;  aiConnect[59] =  5;

    if ( !bOutsideView )
    {
        for (i = 0; i < iTQuantity; i++)
        {
            int iSave = aiConnect[3*i+1];
            aiConnect[3*i+1] = aiConnect[3*i+2];
            aiConnect[3*i+2] = iSave;
        }
    }

    if ( rpkMesh )
    {
        rpkMesh->Reconstruct(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
    else
    {
        rpkMesh = new TriMesh(iVQuantity,akVertex,akNormal,akColor,akUV,
            iTQuantity,aiConnect);
    }
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

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