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

📄 testintersections.cpp

📁 《3D游戏引擎设计》的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    case 'f':
    {
        m_spkFogState->Enabled() = !m_spkFogState->Enabled();
        if ( m_spkFogState->Enabled() )
        {
            m_spkFogState->Start() = m_spkCamera->GetFrustumNear();
            m_spkFogState->End() = m_spkCamera->GetFrustumFar();
            m_spkFogState->Color() = m_spkRenderer->GetBackgroundColor();
        }
        return true;
    }
    case 't':
    {
        if ( m_spkTexture0->Filter() == MgcTexture::FM_NEAREST )
            m_spkTexture0->Filter() = MgcTexture::FM_LINEAR;
        else
            m_spkTexture0->Filter() = MgcTexture::FM_NEAREST;
        return true;
    }
    case 'w':
        m_spkWireframeState->Enabled() = !m_spkWireframeState->Enabled();
        return true;
    case 'q':
    case 'Q':
    case VK_ESCAPE:
        PostMessage(GetWindowHandle(),WM_DESTROY,0,0);
        return true;
    }

    return false;
}
//---------------------------------------------------------------------------
MgcTriMesh* TestIntersections::CreateColoredCube ()
{
    unsigned int uiVertexQuantity = 8;
    unsigned int uiTriangleQuantity = 12;

    MgcVector3* akVertex = new MgcVector3[uiVertexQuantity];
    akVertex[0] = MgcVector3(-1,-1,-1);
    akVertex[1] = MgcVector3(+1,-1,-1);
    akVertex[2] = MgcVector3(+1,+1,-1);
    akVertex[3] = MgcVector3(-1,+1,-1);
    akVertex[4] = MgcVector3(-1,-1,+1);
    akVertex[5] = MgcVector3(+1,-1,+1);
    akVertex[6] = MgcVector3(+1,+1,+1);
    akVertex[7] = MgcVector3(-1,+1,+1);

    MgcColor* akColor = new MgcColor[uiVertexQuantity];
    akColor[0] = MgcColor(0,0,1);
    akColor[1] = MgcColor(0,1,0);
    akColor[2] = MgcColor(1,0,0);
    akColor[3] = MgcColor(0,0,0);
    akColor[4] = MgcColor(0,0,1);
    akColor[5] = MgcColor(1,0,1);
    akColor[6] = MgcColor(1,1,0);
    akColor[7] = MgcColor(1,1,1);

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

    MgcTriMesh* pkCube = new MgcTriMesh(uiVertexQuantity,akVertex,0,akColor,
        0,uiTriangleQuantity,auiConnect);

    pkCube->UpdateModelBound();

    return pkCube;
}
//---------------------------------------------------------------------------
MgcTriMesh* TestIntersections::CreateTexturedCube ()
{
    unsigned int uiVertexQuantity = 8;
    unsigned int uiTriangleQuantity = 12;
    unsigned int uiEdgeQuantity = 18;

    MgcVector3* akVertex = new MgcVector3[uiVertexQuantity];
    akVertex[0] = MgcVector3(-1,-1,-1);
    akVertex[1] = MgcVector3(+1,-1,-1);
    akVertex[2] = MgcVector3(+1,+1,-1);
    akVertex[3] = MgcVector3(-1,+1,-1);
    akVertex[4] = MgcVector3(-1,-1,+1);
    akVertex[5] = MgcVector3(+1,-1,+1);
    akVertex[6] = MgcVector3(+1,+1,+1);
    akVertex[7] = MgcVector3(-1,+1,+1);

    MgcVector2* akTexture = new MgcVector2[uiVertexQuantity];
    akTexture[0] = MgcVector2(0,0);
    akTexture[1] = MgcVector2(1,0);
    akTexture[2] = MgcVector2(1,1);
    akTexture[3] = MgcVector2(0,1);
    akTexture[4] = MgcVector2(0.25,0.25);
    akTexture[5] = MgcVector2(0.75,0.25);
    akTexture[6] = MgcVector2(0.75,0.75);
    akTexture[7] = MgcVector2(0.25,0.75);

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

    MgcTriMesh* pkCube = new MgcTriMesh(uiVertexQuantity,akVertex,0,0,
        akTexture,uiTriangleQuantity,auiConnect);

    pkCube->UpdateModelBound();

    pkCube->SetRenderState(m_spkTextureState);

    return pkCube;
}
//---------------------------------------------------------------------------
MgcTriMesh* TestIntersections::CreateLitCube ()
{
    unsigned int uiVertexQuantity = 8;
    unsigned int uiTriangleQuantity = 12;

    MgcVector3* akVertex = new MgcVector3[uiVertexQuantity];
    akVertex[0] = MgcVector3(-1,-1,-1);
    akVertex[1] = MgcVector3(+1,-1,-1);
    akVertex[2] = MgcVector3(+1,+1,-1);
    akVertex[3] = MgcVector3(-1,+1,-1);
    akVertex[4] = MgcVector3(-1,-1,+1);
    akVertex[5] = MgcVector3(+1,-1,+1);
    akVertex[6] = MgcVector3(+1,+1,+1);
    akVertex[7] = MgcVector3(-1,+1,+1);

    MgcVector3* akNormal = new MgcVector3[uiVertexQuantity];
    MgcReal fInvRoot3 = 1.0/MgcMath::Sqrt(3.0);
    akNormal[0] = fInvRoot3*MgcVector3(-1,-1,-1);
    akNormal[1] = fInvRoot3*MgcVector3(+1,-1,-1);
    akNormal[2] = fInvRoot3*MgcVector3(+1,+1,-1);
    akNormal[3] = fInvRoot3*MgcVector3(-1,+1,-1);
    akNormal[4] = fInvRoot3*MgcVector3(-1,-1,+1);
    akNormal[5] = fInvRoot3*MgcVector3(+1,-1,+1);
    akNormal[6] = fInvRoot3*MgcVector3(+1,+1,+1);
    akNormal[7] = fInvRoot3*MgcVector3(-1,+1,+1);

    MgcColor* akColor = new MgcColor[uiVertexQuantity];
    akColor[0] = MgcColor(0,0,1);
    akColor[1] = MgcColor(0,1,0);
    akColor[2] = MgcColor(1,0,0);
    akColor[3] = MgcColor(0,0,0);
    akColor[4] = MgcColor(0,0,1);
    akColor[5] = MgcColor(1,0,1);
    akColor[6] = MgcColor(1,1,0);
    akColor[7] = MgcColor(1,1,1);

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

    MgcTriMesh* pkCube = new MgcTriMesh(uiVertexQuantity,akVertex,akNormal,
        akColor,0,uiTriangleQuantity,auiConnect);

    pkCube->UpdateModelBound();

    m_spkDLight = new MgcDirectionalLight;
    m_spkDLight->Ambient() = MgcColor(1.0,0.0,0.0);
    m_spkDLight->Diffuse() = MgcColor(1.0,0.0,0.0);
    m_spkLightState = new MgcLightState;
    m_spkLightState->Attach(m_spkDLight);
    pkCube->SetRenderState(m_spkLightState);

    return pkCube;
}
//---------------------------------------------------------------------------
MgcPolyline* TestIntersections::CreateLine ()
{
    MgcVector3* akVertex = new MgcVector3[2];
    akVertex[0] = -MgcVector3::UNIT_Z;
    akVertex[1] = MgcVector3::UNIT_Z;
    MgcColor* akColor = new MgcColor[2];
    akColor[0] = MgcColor::BLACK;
    akColor[1] = MgcColor::WHITE;

    MgcPolyline* pkLine = new MgcPolyline(2,akVertex,akColor,false);
    pkLine->UpdateModelBound();

    m_kLine.Origin() = MgcVector3::ZERO;
    m_kLine.Direction() = 2.0*MgcVector3::UNIT_Z;

    return pkLine;
}
//---------------------------------------------------------------------------
MgcTriMesh* TestIntersections::CreateCylinder ()
{
    unsigned int uiN = 16;
    unsigned int uiVertexQuantity = 2*uiN+2;
    unsigned int uiTriangleQuantity = 4*uiN;
    MgcReal fAlpha = 0.1;

    MgcVector3* akVertex = new MgcVector3[uiVertexQuantity];
    MgcVector3* akNormal = new MgcVector3[uiVertexQuantity];
    MgcVector2* akTexture = new MgcVector2[uiVertexQuantity];
    unsigned int* auiConnect = new unsigned int[3*uiTriangleQuantity];

    unsigned int uiV, uiVP;
    for (uiV = 0, uiVP = uiN; uiV < uiN; uiV++, uiVP++)
    {
        MgcReal fAngle = MgcMath::TWO_PI*uiV/uiN;
        MgcReal fSin = MgcMath::Sin(fAngle);
        MgcReal fCos = MgcMath::Cos(fAngle);

        akVertex[uiV] = MgcVector3(fCos,fSin,-1.0);
        akNormal[uiV] = akVertex[uiV];
        akNormal[uiV].Unitize();
        akTexture[uiV] = MgcVector2(fSin,0.25);

        akVertex[uiVP] = MgcVector3(fCos,fSin,+1.0);
        akNormal[uiVP] = akVertex[uiVP];
        akNormal[uiVP].Unitize();
        akTexture[uiVP] = MgcVector2(fSin,0.75);
    }

    akVertex[2*uiN] = MgcVector3(0.0,0.0,-1.0);
    akNormal[2*uiN] = akVertex[2*uiN];
    akTexture[2*uiN] = MgcVector2(0.5,0.0);
    akVertex[2*uiN+1] = MgcVector3(0.0,0.0,+1.0);
    akNormal[2*uiN+1] = akVertex[2*uiN+1];
    akTexture[2*uiN+1] = MgcVector2(0.5,1.0);

    unsigned int uiI = 0;
    for (uiV = 0; uiV < uiN; uiV++)
    {
        auiConnect[uiI++] = (uiV+1) % uiN;
        auiConnect[uiI++] = uiV;
        auiConnect[uiI++] = 2*uiN;
    }
    for (uiVP = uiN; uiVP < 2*uiN; uiVP++)
    {
        auiConnect[uiI++] = uiVP;
        auiConnect[uiI++] = (uiVP == 2*uiN-1 ? uiN : uiVP+1);
        auiConnect[uiI++] = 2*uiN+1;
    }
    for (uiV = 0, uiVP = uiN; uiV < uiN; uiV++, uiVP++)
    {
        auiConnect[uiI++] = uiVP;
        auiConnect[uiI++] = uiV;
        auiConnect[uiI++] = (uiV+1) % uiN;

        auiConnect[uiI++] = uiVP;
        auiConnect[uiI++] = (uiV+1) % uiN;
        auiConnect[uiI++] = (uiVP == 2*uiN-1 ? uiN : uiVP+1);
    }

    MgcTriMesh* pkCube = new MgcTriMesh(uiVertexQuantity,akVertex,akNormal,
        0,akTexture,uiTriangleQuantity,auiConnect);
    pkCube->UpdateModelBound();

    MgcAlphaState* pkAlpha = new MgcAlphaState;
    pkAlpha->Test() = MgcAlphaState::TF_LEQUAL;
    pkAlpha->BlendEnabled() = true;
    pkCube->SetRenderState(pkAlpha);

    unsigned int uiYMax = 256, uiXMax = 8;
    unsigned int* auiData = new unsigned int[uiXMax*uiYMax];
    uiI = 0;
    for (unsigned int uiY = 0; uiY < uiYMax; uiY++)
    {
        unsigned int uiColor = (uiY | (uiYMax-1-uiY) << 16 | 0x80 << 24);
        for (unsigned int uiX = 0; uiX < uiXMax; uiX++)
            auiData[uiI++] = uiColor;
    }
    MgcImage* pkImage = new MgcImage(MgcImage::IT_RGBA8888,uiXMax,uiYMax,
        (unsigned char*)auiData);

    m_spkTexture0 = new MgcTexture;
    m_spkTexture0->SetImage(pkImage);
    m_spkTexture0->Mipmap() = MgcTexture::MM_LINEAR_LINEAR;

    m_spkTextureState = new MgcTextureState;
    m_spkTextureState->Set(0,m_spkTexture0);
    pkCube->SetRenderState(m_spkTextureState);

    m_kCyln.Center() = MgcVector3::ZERO;
    m_kCyln.Direction() = MgcVector3::UNIT_Z;
    m_kCyln.Radius() = 1.0;
    m_kCyln.Height() = 2.0;

    m_kCapsule.Origin() = -MgcVector3::UNIT_Z;
    m_kCapsule.Direction() = 2.0*MgcVector3::UNIT_Z;
    m_kCapsule.Radius() = 1.0;

    return pkCube;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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