📄 portals.cpp
字号:
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 + -