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