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

📄 portals.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 4 页
字号:

    akTexture = new Vector2f[4];
    akTexture[0] = Vector2f(0.0f,0.0f);
    akTexture[1] = Vector2f(1.0f,0.0f);
    akTexture[2] = Vector2f(1.0f,1.0f);
    akTexture[3] = Vector2f(0.0f,1.0f);

    aiConnect = new int[6];
    aiConnect[0] = 0;  aiConnect[1] = 2;  aiConnect[2] = 1;
    aiConnect[3] = 0;  aiConnect[4] = 3;  aiConnect[5] = 2;

    pkMesh = new TriMesh(4,akVertex,NULL,NULL,akTexture,2,aiConnect);
    pkMesh->SetRenderState(rspkCeiling);

    rpkCube->AttachChild(pkMesh);
}
//----------------------------------------------------------------------------
TriMesh* Portals::CreateOutside ()
{
    const int iVertexQuantity = 40;
    Vector3f* akVertex = new Vector3f[iVertexQuantity];
    akVertex[0] = Vector3f(-1.0f,-1.0f,2.0f);
    akVertex[1] = Vector3f(+1.0f,-1.0f,2.0f);
    akVertex[2] = Vector3f(+1.0f,+1.0f,2.0f);
    akVertex[3] = Vector3f(-1.0f,+1.0f,2.0f);
    akVertex[4] = Vector3f(-1.0f,-1.0f,0.0f);
    akVertex[5] = Vector3f(+1.0f,-1.0f,0.0f);
    akVertex[6] = Vector3f(+1.0f,+1.0f,0.0f);
    akVertex[7] = Vector3f(-1.0f,+1.0f,0.0f);

    Vector3f kTrn(4.0f,0.0f,0.0f);
    int i, j;
    for (i = 0, j = 8; i < 8; i++, j++)
        akVertex[j] = akVertex[i] + kTrn;

    kTrn = Vector3f(0.0f,4.0f,0.0f);
    for (i = 0, j = 16; i < 8; i++, j++)
        akVertex[j] = akVertex[i] + kTrn;

    kTrn = Vector3f(-4.0f,0.0f,0.0f);
    for (i = 0, j = 24; i < 8; i++, j++)
        akVertex[j] = akVertex[i] + kTrn;

    kTrn = Vector3f(0.0f,-4.0f,0.0f);
    for (i = 0, j = 32; i < 8; i++, j++)
        akVertex[j] = akVertex[i] + kTrn;

    ColorRGB* akColor = new ColorRGB[iVertexQuantity];
    for (i = 0; i < iVertexQuantity; i++)
    {
        akColor[i].r = Mathf::UnitRandom();
        akColor[i].g = Mathf::UnitRandom();
        akColor[i].b = Mathf::UnitRandom();
    }

    const int iTriangleQuantity = 92;
    int* aiConnect = new int[3*iTriangleQuantity];
    aiConnect[ 0] =  0;  aiConnect[ 1] =  1;  aiConnect[ 2] =  2;
    aiConnect[ 3] =  0;  aiConnect[ 4] =  2;  aiConnect[ 5] =  3;
    aiConnect[ 6] =  1;  aiConnect[ 7] = 11;  aiConnect[ 8] =  2;
    aiConnect[ 9] =  1;  aiConnect[10] =  8;  aiConnect[11] = 11;
    aiConnect[12] =  8;  aiConnect[13] = 10;  aiConnect[14] = 11;
    aiConnect[15] =  8;  aiConnect[16] =  9;  aiConnect[17] = 10;
    aiConnect[18] = 25;  aiConnect[19] =  0;  aiConnect[20] =  3;
    aiConnect[21] = 25;  aiConnect[22] =  3;  aiConnect[23] = 26;
    aiConnect[24] = 24;  aiConnect[25] = 25;  aiConnect[26] = 26;
    aiConnect[27] = 24;  aiConnect[28] = 26;  aiConnect[29] = 27;
    aiConnect[30] =  3;  aiConnect[31] =  2;  aiConnect[32] = 17;
    aiConnect[33] =  3;  aiConnect[34] = 17;  aiConnect[35] = 16;
    aiConnect[36] = 16;  aiConnect[37] = 17;  aiConnect[38] = 18;
    aiConnect[39] = 16;  aiConnect[40] = 18;  aiConnect[41] = 19;
    aiConnect[42] = 35;  aiConnect[43] =  1;  aiConnect[44] =  0;
    aiConnect[45] = 35;  aiConnect[46] = 34;  aiConnect[47] =  1;
    aiConnect[48] = 32;  aiConnect[49] = 34;  aiConnect[50] = 35;
    aiConnect[51] = 32;  aiConnect[52] = 33;  aiConnect[53] = 34;
    aiConnect[54] = 27;  aiConnect[55] = 16;  aiConnect[56] = 19;
    aiConnect[57] = 27;  aiConnect[58] = 26;  aiConnect[59] = 16;
    aiConnect[60] = 17;  aiConnect[61] = 11;  aiConnect[62] = 18;
    aiConnect[63] = 18;  aiConnect[64] = 11;  aiConnect[65] = 10;
    aiConnect[66] = 24;  aiConnect[67] = 32;  aiConnect[68] = 25;
    aiConnect[69] = 25;  aiConnect[70] = 32;  aiConnect[71] = 35;
    aiConnect[72] = 34;  aiConnect[73] =  9;  aiConnect[74] =  8;
    aiConnect[75] = 34;  aiConnect[76] = 33;  aiConnect[77] =  9;

    for (i = 0, j = 78; i < 26; i++)
    {
        aiConnect[j++] = 4 + aiConnect[3*i];
        aiConnect[j++] = 4 + aiConnect[3*i+2];
        aiConnect[j++] = 4 + aiConnect[3*i+1];
    }

    aiConnect[156] =  6;  aiConnect[157] =  2;  aiConnect[158] = 11;
    aiConnect[159] =  6;  aiConnect[160] = 11;  aiConnect[161] = 15;
    aiConnect[162] = 21;  aiConnect[163] = 17;  aiConnect[164] =  2;
    aiConnect[165] = 21;  aiConnect[166] =  2;  aiConnect[167] =  6;
    aiConnect[168] = 15;  aiConnect[169] = 11;  aiConnect[170] = 17;
    aiConnect[171] = 15;  aiConnect[172] = 17;  aiConnect[173] = 21;
    aiConnect[174] = 12;  aiConnect[175] =  8;  aiConnect[176] =  1;
    aiConnect[177] = 12;  aiConnect[178] =  1;  aiConnect[179] =  5;
    aiConnect[180] =  5;  aiConnect[181] =  1;  aiConnect[182] = 34;
    aiConnect[183] =  5;  aiConnect[184] = 34;  aiConnect[185] = 38;
    aiConnect[186] = 38;  aiConnect[187] = 34;  aiConnect[188] =  8;
    aiConnect[189] = 38;  aiConnect[190] =  8;  aiConnect[191] = 12;
    aiConnect[192] =  4;  aiConnect[193] =  0;  aiConnect[194] = 25;
    aiConnect[195] =  4;  aiConnect[196] = 25;  aiConnect[197] = 29;
    aiConnect[198] = 39;  aiConnect[199] = 35;  aiConnect[200] =  0;
    aiConnect[201] = 39;  aiConnect[202] =  0;  aiConnect[203] =  4;
    aiConnect[204] = 29;  aiConnect[205] = 25;  aiConnect[206] = 35;
    aiConnect[207] = 29;  aiConnect[208] = 35;  aiConnect[209] = 39;
    aiConnect[210] =  7;  aiConnect[211] =  3;  aiConnect[212] = 16;
    aiConnect[213] =  7;  aiConnect[214] = 16;  aiConnect[215] = 20;
    aiConnect[216] = 30;  aiConnect[217] = 26;  aiConnect[218] =  3;
    aiConnect[219] = 30;  aiConnect[220] =  3;  aiConnect[221] =  7;
    aiConnect[222] = 20;  aiConnect[223] = 16;  aiConnect[224] = 26;
    aiConnect[225] = 20;  aiConnect[226] = 26;  aiConnect[227] = 30;
    aiConnect[228] = 14;  aiConnect[229] = 10;  aiConnect[230] =  9;
    aiConnect[231] = 14;  aiConnect[232] =  9;  aiConnect[233] = 13;
    aiConnect[234] = 22;  aiConnect[235] = 18;  aiConnect[236] = 10;
    aiConnect[237] = 22;  aiConnect[238] = 10;  aiConnect[239] = 14;
    aiConnect[240] = 23;  aiConnect[241] = 19;  aiConnect[242] = 18;
    aiConnect[243] = 23;  aiConnect[244] = 18;  aiConnect[245] = 22;
    aiConnect[246] = 31;  aiConnect[247] = 27;  aiConnect[248] = 19;
    aiConnect[249] = 31;  aiConnect[250] = 19;  aiConnect[251] = 23;
    aiConnect[252] = 28;  aiConnect[253] = 24;  aiConnect[254] = 27;
    aiConnect[255] = 28;  aiConnect[256] = 27;  aiConnect[257] = 31;
    aiConnect[258] = 36;  aiConnect[259] = 32;  aiConnect[260] = 24;
    aiConnect[261] = 36;  aiConnect[262] = 24;  aiConnect[263] = 28;
    aiConnect[264] = 37;  aiConnect[265] = 33;  aiConnect[266] = 32;
    aiConnect[267] = 37;  aiConnect[268] = 32;  aiConnect[269] = 36;
    aiConnect[270] = 13;  aiConnect[271] =  9;  aiConnect[272] = 33;
    aiConnect[273] = 13;  aiConnect[274] = 33;  aiConnect[275] = 37;

    TriMesh* pkMesh = new TriMesh(iVertexQuantity,akVertex,NULL,akColor,
        NULL,iTriangleQuantity,aiConnect);

    return pkMesh;
}
//----------------------------------------------------------------------------
ConvexRegionManager* Portals::CreateBspTree ()
{
    // construction of tree in BspTree.txt.
    ConvexRegionManager* pkC = new ConvexRegionManager(true);
    pkC->SetName("CRM");
    pkC->ModelPlane().Set(Vector3f(0.0f,0.0f,-1.0f),0.0f);

    BspNode* pkR = new BspNode;
    pkR->SetName("R");
    pkR->ModelPlane().Set(Vector3f(0.0f,0.0f,1.0f),2.0f);

    BspNode* pkRR = new BspNode;
    pkRR->SetName("RR");
    pkRR->ModelPlane().Set(Vector3f(1.0f,0.0f,0.0f),1.0f);

    BspNode* pkRRL = new BspNode;
    pkRRL->SetName("RRL");
    pkRRL->ModelPlane().Set(Vector3f(0.0f,1.0f,0.0f),1.0f);

    BspNode* pkRRLL = new BspNode;
    pkRRLL->SetName("RRLL");
    pkRRLL->ModelPlane().Set(Vector3f(1.0f,1.0f,0.0f),4.0f);

    BspNode* pkRRLLL = new BspNode;
    pkRRLLL->SetName("RRLLL");
    pkRRLLL->ModelPlane().Set(Vector3f(1.0f,1.0f,0.0f),6.0f);

    BspNode* pkRRLR = new BspNode;
    pkRRLR->SetName("RRLR");
    pkRRLR->ModelPlane().Set(Vector3f(0.0f,-1.0f,0.0f),1.0f);

    BspNode* pkRRLRL = new BspNode;
    pkRRLRL->SetName("RRLRL");
    pkRRLRL->ModelPlane().Set(Vector3f(1.0f,-1.0f,0.0f),4.0f);

    BspNode* pkRRLRLL = new BspNode;
    pkRRLRLL->SetName("RRLRLL");
    pkRRLRLL->ModelPlane().Set(Vector3f(1.0f,-1.0f,0.0f),6.0f);

    BspNode* pkRRLRR = new BspNode;
    pkRRLRR->SetName("RRLRR");
    pkRRLRR->ModelPlane().Set(Vector3f(1.0f,0.0f,0.0f),3.0f);

    BspNode* pkRRLRRL = new BspNode;
    pkRRLRRL->SetName("RRLRRL");
    pkRRLRRL->ModelPlane().Set(Vector3f(1.0f,0.0f,0.0f),5.0f);

    BspNode* pkRRR = new BspNode;
    pkRRR->SetName("RRR");
    pkRRR->ModelPlane().Set(Vector3f(-1.0f,0.0f,0.0f),1.0f);

    BspNode* pkRRRL = new BspNode;
    pkRRRL->SetName("RRRL");
    pkRRRL->ModelPlane().Set(Vector3f(0.0f,1.0f,0.0f),1.0f);

    BspNode* pkRRRLL = new BspNode;
    pkRRRLL->SetName("RRRLL");
    pkRRRLL->ModelPlane().Set(Vector3f(-1.0f,1.0f,0.0f),4.0f);

    BspNode* pkRRRLLL = new BspNode;
    pkRRRLLL->SetName("RRRLLL");
    pkRRRLLL->ModelPlane().Set(Vector3f(-1.0f,1.0f,0.0f),6.0f);

    BspNode* pkRRRLR = new BspNode;
    pkRRRLR->SetName("RRRLR");
    pkRRRLR->ModelPlane().Set(Vector3f(0.0f,-1.0f,0.0f),1.0f);

    BspNode* pkRRRLRL = new BspNode;
    pkRRRLRL->SetName("RRRLRL");
    pkRRRLRL->ModelPlane().Set(Vector3f(-1.0f,-1.0f,0.0f),4.0f);

    BspNode* pkRRRLRLL = new BspNode;
    pkRRRLRLL->SetName("RRRLRLL");
    pkRRRLRLL->ModelPlane().Set(Vector3f(-1.0f,-1.0f,0.0f),6.0f);

    BspNode* pkRRRLRR = new BspNode;
    pkRRRLRR->SetName("RRRLRR");
    pkRRRLRR->ModelPlane().Set(Vector3f(-1.0f,0.0f,0.0f),3.0f);

    BspNode* pkRRRLRRL = new BspNode;
    pkRRRLRRL->SetName("RRRLRRL");
    pkRRRLRRL->ModelPlane().Set(Vector3f(-1.0f,0.0f,0.0f),5.0f);

    BspNode* pkRRRR = new BspNode;
    pkRRRR->SetName("RRRR");
    pkRRRR->ModelPlane().Set(Vector3f(0.0f,1.0f,0.0f),1.0f);

    BspNode* pkRRRRL = new BspNode;
    pkRRRRL->SetName("RRRRL");
    pkRRRRL->ModelPlane().Set(Vector3f(0.0f,1.0f,0.0f),3.0f);

    BspNode* pkRRRRLL = new BspNode;
    pkRRRRLL->SetName("RRRRLL");
    pkRRRRLL->ModelPlane().Set(Vector3f(0.0f,1.0f,0.0f),5.0f);

    BspNode* pkRRRRR = new BspNode;
    pkRRRRR->SetName("RRRRR");
    pkRRRRR->ModelPlane().Set(Vector3f(0.0f,-1.0f,0.0f),1.0f);

    BspNode* pkRRRRRL = new BspNode;
    pkRRRRRL->SetName("RRRRRL");
    pkRRRRRL->ModelPlane().Set(Vector3f(0.0f,-1.0f,0.0f),3.0f);

    BspNode* pkRRRRRLL = new BspNode;
    pkRRRRRLL->SetName("RRRRRLL");
    pkRRRRRLL->ModelPlane().Set(Vector3f(0.0f,-1.0f,0.0f),5.0f);

    // create regions and portals
    Node* pkNode;
    Portal** apkPortal;

    CreateCenterCube(m_spkTextureSand,m_spkTextureSky,m_spkTextureAgate,
        m_spkTextureMunch,m_spkTextureBuff,m_spkTextureDave,
        m_spkTextureShelly,pkNode,apkPortal);
    ConvexRegion* pkC00 = new ConvexRegion(4,apkPortal,pkNode);
    pkC00->SetName("C00");

    CreateAxisConnector(m_spkTextureSand,m_spkTextureSky,
        m_spkTextureConnector,pkNode,apkPortal);
    ConvexRegion* pkC02 = new ConvexRegion(2,apkPortal,pkNode);
    pkC02->SetName("C02");
    pkC02->Translate() = Vector3f(0.0f,2.0f,0.0f);

    CreateAxisConnector(m_spkTextureSand,m_spkTextureSky,
        m_spkTextureConnector,pkNode,apkPortal);
    ConvexRegion* pkC0m2 = new ConvexRegion(2,apkPortal,pkNode);
    pkC0m2->SetName("C0m2");
    pkC0m2->Translate() = Vector3f(0.0f,-2.0f,0.0f);

    CreateAxisConnector(m_spkTextureSand,m_spkTextureSky,
        m_spkTextureConnector,pkNode,apkPortal);
    ConvexRegion* pkC20 = new ConvexRegion(2,apkPortal,pkNode);
    pkC20->SetName("C20");
    pkC20->Translate() = Vector3f(2.0f,0.0f,0.0f);
    pkC20->Rotate().FromAxisAngle(Vector3f::UNIT_Z,Mathf::HALF_PI);

    CreateAxisConnector(m_spkTextureSand,m_spkTextureSky,
        m_spkTextureConnector,pkNode,apkPortal);
    ConvexRegion* pkCm20 = new ConvexRegion(2,apkPortal,pkNode);
    pkCm20->SetName("Cm20");
    pkCm20->Translate() = Vector3f(-2.0f,0.0f,0.0f);
    pkCm20->Rotate().FromAxisAngle(Vector3f::UNIT_Z,Mathf::HALF_PI);

    CreateEndCube(m_spkTextureSand,m_spkTextureSky,m_spkTextureQuartz,pkNode,
        apkPortal);
    ConvexRegion* pkC04 = new ConvexRegion(3,apkPortal,pkNode);
    pkC04->SetName("C04");
    pkC04->Translate() = Vector3f(0.0f,4.0f,0.0f);
    pkC04->Rotate().FromAxisAngle(Vector3f::UNIT_Z,-Mathf::HALF_PI);

    CreateEndCube(m_spkTextureSand,m_spkTextureSky,m_spkTextureBark,pkNode,
        apkPortal);
    ConvexRegion* pkC0m4 = new ConvexRegion(3,apkPortal,pkNode);
    pkC0m4->SetName("C0m4");
    pkC0m4->Translate() = Vector3f(0.0f,-4.0f,0.0f);
    pkC0m4->Rotate().FromAxisAngle(Vector3f::UNIT_Z,Mathf::HALF_PI);

    CreateEndCube(m_spkTextureSand,m_spkTextureSky,m_spkTextureWater,pkNode,
        apkPortal);
    ConvexRegion* pkC40 = new ConvexRegion(3,apkPortal,pkNode);
    pkC40->SetName("C40");
    pkC40->Translate() = Vector3f(4.0f,0.0f,0.0f);
    pkC40->Rotate().FromAxisAngle(Vector3f::UNIT_Z,Mathf::PI);

    CreateEndCube(m_spkTextureSand,m_spkTextureSky,m_spkTexturePebbles,pkNode,
        apkPortal);
    ConvexRegion* pkCm40 = new ConvexRegion(3,apkPortal,pkNode);
    pkCm40->SetName("Cm40");
    pkCm40->Translate() = Vector3f(-4.0f,0.0f,0.0f);

    CreateDiagonalConnector(m_spkTextureSand,m_spkTextureSky,
        m_spkTextureConnector,pkNode,apkPortal);
    ConvexRegion* pkDPP = new ConvexRegion(2,apkPortal,pkNode);
    pkDPP->SetName("DPP");

    CreateDiagonalConnector(m_spkTextureSand,m_spkTextureSky,
        m_spkTextureConnector,pkNode,apkPortal);
    ConvexRegion* pkDMP = new ConvexRegion(2,apkPortal,pkNode);
    pkDMP->SetName("DMP");
    pkDMP->Rotate().FromAxisAngle(Vector3f::UNIT_Z,Mathf::HALF_PI);

    CreateDiagonalConnector(m_spkTextureSand,m_spkTextureSky,
        m_spkTextureConnector,pkNode,apkPortal);
    ConvexRegion* pkDMM = new ConvexRegion(2,apkPortal,pkNode);
    pkDMM->SetName("DMM");
    pkDMM->Rotate().FromAxisAngle(Vector3f::UNIT_Z,Mathf::PI);

    CreateDiagonalConnector(m_spkTextureSand,m_spkTextureSky,
        m_spkTextureConnector,pkNode,apkPortal);
    ConvexRegion* pkDPM = new ConvexRegion(2,apkPortal,pkNode);
    pkDPM->SetName("DPM");
    pkDPM->Rotate().FromAxisAngle(Vector3f::UNIT_Z,-Mathf::HALF_PI);

    // create adjacency graph
    pkC00->GetPortal(0)->AdjacentRegion() = pkC0m2;
    pkC00->GetPortal(1)->AdjacentRegion() = pkC02;

⌨️ 快捷键说明

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