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

📄 portals.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// http://www.wild-magic.com
// Copyright (c) 2003.  All Rights Reserved
//
// The Wild Magic Library (WML) source code is supplied under the terms of
// the license agreement http://www.magic-software.com/License/WildMagic.pdf
// and may not be copied or disclosed except in accordance with the terms of
// that agreement.

#include "Portals.h"

Portals g_kTheApp;

//----------------------------------------------------------------------------
Portals::Portals ()
    :
    Application("Portals",0,0,640,480,ColorRGB(0.5f,0.0f,1.0f))
{
    m_bInitialized = false;
}
//----------------------------------------------------------------------------
void Portals::CreateCenterCube (TextureStatePtr& rspkFloor,
    TextureStatePtr& rspkCeiling, TextureStatePtr& rspkWall,
    TextureStatePtr& rspkPicture0, TextureStatePtr& rspkPicture1,
    TextureStatePtr& rspkPicture2, TextureStatePtr& rspkPicture3,
    Node*& rpkCube, Portal**& rapkPortal)
{
    rpkCube = new Node(7);

    // walls
    Vector3f* akVertex = new Vector3f[24];
    akVertex[ 0] = Vector3f(-1.0f,-1.0f,0.0f);
    akVertex[ 1] = Vector3f(+1.0f,-1.0f,0.0f);
    akVertex[ 2] = Vector3f(+1.0f,+1.0f,0.0f);
    akVertex[ 3] = Vector3f(-1.0f,+1.0f,0.0f);
    akVertex[ 4] = Vector3f(-1.0f,-1.0f,2.0f);
    akVertex[ 5] = Vector3f(+1.0f,-1.0f,2.0f);
    akVertex[ 6] = Vector3f(+1.0f,+1.0f,2.0f);
    akVertex[ 7] = Vector3f(-1.0f,+1.0f,2.0f);
    akVertex[ 8] = Vector3f(+0.5f,-1.0f,0.0f);
    akVertex[ 9] = Vector3f(+0.5f,-1.0f,1.5f);
    akVertex[10] = Vector3f(-0.5f,-1.0f,1.5f);
    akVertex[11] = Vector3f(-0.5f,-1.0f,0.0f);
    akVertex[12] = Vector3f(-0.5f,+1.0f,0.0f);
    akVertex[13] = Vector3f(-0.5f,+1.0f,1.5f);
    akVertex[14] = Vector3f(+0.5f,+1.0f,1.5f);
    akVertex[15] = Vector3f(+0.5f,+1.0f,0.0f);
    akVertex[16] = Vector3f(+1.0f,+0.5f,0.0f);
    akVertex[17] = Vector3f(+1.0f,+0.5f,1.5f);
    akVertex[18] = Vector3f(+1.0f,-0.5f,1.5f);
    akVertex[19] = Vector3f(+1.0f,-0.5f,0.0f);
    akVertex[20] = Vector3f(-1.0f,-0.5f,0.0f);
    akVertex[21] = Vector3f(-1.0f,-0.5f,1.5f);
    akVertex[22] = Vector3f(-1.0f,+0.5f,1.5f);
    akVertex[23] = Vector3f(-1.0f,+0.5f,0.0f);

    Vector2f* akTexture = new Vector2f[24];
    akTexture[ 0] = Vector2f(0.00f,0.00f);
    akTexture[ 1] = Vector2f(1.00f,0.00f);
    akTexture[ 2] = Vector2f(0.00f,0.00f);
    akTexture[ 3] = Vector2f(1.00f,0.00f);
    akTexture[ 4] = Vector2f(0.00f,1.00f);
    akTexture[ 5] = Vector2f(1.00f,1.00f);
    akTexture[ 6] = Vector2f(0.00f,1.00f);
    akTexture[ 7] = Vector2f(1.00f,1.00f);
    akTexture[ 8] = Vector2f(0.75f,0.00f);
    akTexture[ 9] = Vector2f(0.75f,0.75f);
    akTexture[10] = Vector2f(0.25f,0.75f);
    akTexture[11] = Vector2f(0.25f,0.00f);
    akTexture[12] = Vector2f(0.75f,0.00f);
    akTexture[13] = Vector2f(0.75f,0.75f);
    akTexture[14] = Vector2f(0.25f,0.75f);
    akTexture[15] = Vector2f(0.25f,0.00f);
    akTexture[16] = Vector2f(0.25f,0.00f);
    akTexture[17] = Vector2f(0.25f,0.75f);
    akTexture[18] = Vector2f(0.75f,0.75f);
    akTexture[19] = Vector2f(0.75f,0.00f);
    akTexture[20] = Vector2f(0.25f,0.00f);
    akTexture[21] = Vector2f(0.25f,0.75f);
    akTexture[22] = Vector2f(0.75f,0.75f);
    akTexture[23] = Vector2f(0.75f,0.00f);

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

    TriMesh* pkMesh = new TriMesh(24,akVertex,NULL,NULL,akTexture,24,
        aiConnect);
    pkMesh->SetRenderState(rspkWall);

    rpkCube->AttachChild(pkMesh);

    // portals
    rapkPortal = new Portal*[4];

    Vector3f* akModelVertex = new Vector3f[4];
    akModelVertex[0] = akVertex[11];
    akModelVertex[1] = akVertex[10];
    akModelVertex[2] = akVertex[ 9];
    akModelVertex[3] = akVertex[ 8];
    rapkPortal[0] = new Portal(4,akModelVertex,0,true);

    akModelVertex = new Vector3f[4];
    akModelVertex[0] = akVertex[15];
    akModelVertex[1] = akVertex[14];
    akModelVertex[2] = akVertex[13];
    akModelVertex[3] = akVertex[12];
    rapkPortal[1] = new Portal(4,akModelVertex,0,true);

    akModelVertex = new Vector3f[4];
    akModelVertex[0] = akVertex[19];
    akModelVertex[1] = akVertex[18];
    akModelVertex[2] = akVertex[17];
    akModelVertex[3] = akVertex[16];
    rapkPortal[2] = new Portal(4,akModelVertex,0,true);

    akModelVertex = new Vector3f[4];
    akModelVertex[0] = akVertex[23];
    akModelVertex[1] = akVertex[22];
    akModelVertex[2] = akVertex[21];
    akModelVertex[3] = akVertex[20];
    rapkPortal[3] = new Portal(4,akModelVertex,0,true);

    // floor
    akVertex = new Vector3f[4];
    akVertex[0] = Vector3f(-1.0f,-1.0f,0.0f);
    akVertex[1] = Vector3f(+1.0f,-1.0f,0.0f);
    akVertex[2] = Vector3f(+1.0f,+1.0f,0.0f);
    akVertex[3] = Vector3f(-1.0f,+1.0f,0.0f);

    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] = 1;  aiConnect[2] = 2;
    aiConnect[3] = 0;  aiConnect[4] = 2;  aiConnect[5] = 3;

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

    rpkCube->AttachChild(pkMesh);

    // ceiling
    akVertex = new Vector3f[4];
    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);

    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);

    // object 0
    akVertex = new Vector3f[4];
    akVertex[0] = Vector3f(-0.875f,-0.625f,0.75f);
    akVertex[1] = Vector3f(-0.875f,-0.625f,1.10f);
    akVertex[2] = Vector3f(-0.625f,-0.875f,1.10f);
    akVertex[3] = Vector3f(-0.625f,-0.875f,0.75f);

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

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

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

    rpkCube->AttachChild(pkMesh);

    // object 1
    akVertex = new Vector3f[4];
    akVertex[0] = Vector3f(+0.875f,+0.625f,0.75f);
    akVertex[1] = Vector3f(+0.875f,+0.625f,1.10f);
    akVertex[2] = Vector3f(+0.625f,+0.875f,1.10f);
    akVertex[3] = Vector3f(+0.625f,+0.875f,0.75f);

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

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

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

    rpkCube->AttachChild(pkMesh);

    // object 2
    akVertex = new Vector3f[4];
    akVertex[0] = Vector3f(-0.625f,+0.875f,0.75f);
    akVertex[1] = Vector3f(-0.625f,+0.875f,1.10f);
    akVertex[2] = Vector3f(-0.875f,+0.625f,1.10f);
    akVertex[3] = Vector3f(-0.875f,+0.625f,0.75f);

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

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

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

    rpkCube->AttachChild(pkMesh);

    // object 3
    akVertex = new Vector3f[4];
    akVertex[0] = Vector3f(+0.625f,-0.875f,0.75f);
    akVertex[1] = Vector3f(+0.625f,-0.875f,1.10f);
    akVertex[2] = Vector3f(+0.875f,-0.625f,1.10f);
    akVertex[3] = Vector3f(+0.875f,-0.625f,0.75f);

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

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

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

    rpkCube->AttachChild(pkMesh);
}
//----------------------------------------------------------------------------
void Portals::CreateAxisConnector (TextureStatePtr& rspkFloor,
    TextureStatePtr& rspkCeiling, TextureStatePtr& rspkWall,
    Node*& rpkCube, Portal**& rapkPortal)
{
    rpkCube = new Node(3);

    // walls
    Vector3f* akVertex = new Vector3f[16];
    akVertex[ 0] = Vector3f(-1.0f,-1.0f,0.0f);
    akVertex[ 1] = Vector3f(+1.0f,-1.0f,0.0f);
    akVertex[ 2] = Vector3f(+1.0f,+1.0f,0.0f);
    akVertex[ 3] = Vector3f(-1.0f,+1.0f,0.0f);
    akVertex[ 4] = Vector3f(-1.0f,-1.0f,2.0f);
    akVertex[ 5] = Vector3f(+1.0f,-1.0f,2.0f);
    akVertex[ 6] = Vector3f(+1.0f,+1.0f,2.0f);
    akVertex[ 7] = Vector3f(-1.0f,+1.0f,2.0f);
    akVertex[ 8] = Vector3f(+0.5f,-1.0f,0.0f);
    akVertex[ 9] = Vector3f(+0.5f,-1.0f,1.5f);
    akVertex[10] = Vector3f(-0.5f,-1.0f,1.5f);
    akVertex[11] = Vector3f(-0.5f,-1.0f,0.0f);
    akVertex[12] = Vector3f(-0.5f,+1.0f,0.0f);
    akVertex[13] = Vector3f(-0.5f,+1.0f,1.5f);
    akVertex[14] = Vector3f(+0.5f,+1.0f,1.5f);
    akVertex[15] = Vector3f(+0.5f,+1.0f,0.0f);

    Vector2f* akTexture = new Vector2f[16];
    akTexture[ 0] = Vector2f(0.00f,0.00f);
    akTexture[ 1] = Vector2f(1.00f,0.00f);
    akTexture[ 2] = Vector2f(0.00f,0.00f);
    akTexture[ 3] = Vector2f(1.00f,0.00f);
    akTexture[ 4] = Vector2f(0.00f,1.00f);
    akTexture[ 5] = Vector2f(1.00f,1.00f);
    akTexture[ 6] = Vector2f(0.00f,1.00f);
    akTexture[ 7] = Vector2f(1.00f,1.00f);
    akTexture[ 8] = Vector2f(0.75f,0.00f);
    akTexture[ 9] = Vector2f(0.75f,0.75f);
    akTexture[10] = Vector2f(0.25f,0.75f);
    akTexture[11] = Vector2f(0.25f,0.00f);
    akTexture[12] = Vector2f(0.75f,0.00f);
    akTexture[13] = Vector2f(0.75f,0.75f);
    akTexture[14] = Vector2f(0.25f,0.75f);
    akTexture[15] = Vector2f(0.25f,0.00f);

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

⌨️ 快捷键说明

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