//---------------------------------------------------------------------------- bool EnvironmentMaps::Setup () { // load model m_spkScene = new Node(1); m_spkTrnNode = new Node(1); m_spkScene->AttachChild(m_spkTrnNode); Stream kStream; bool bLoaded = kStream.Load("Face.mgc"); if ( !bLoaded ) return false; m_spkModel = (Node*) kStream.GetObjectAt(0); m_spkTrnNode->AttachChild(m_spkModel); // attach environment map Image* pkImage = Image::Load("SphereMap.mif"); if ( !pkImage ) return false; Texture* pkTexture = new Texture; pkTexture->SetImage(pkImage); pkTexture->Filter() = Texture::FM_LINEAR; pkTexture->Mipmap() = Texture::MM_NONE; pkTexture->Apply() = Texture::AM_DECAL; pkTexture->Envmap() = Texture::EM_SPHERE; TextureState* pkTS = new TextureState; pkTS->Set(0,pkTexture); m_spkModel->SetRenderState(pkTS); return true; }
//---------------------------------------------------------------------------- void WrigglingSnake::CreateSnakeBody () { // create the B-spline curve for the snake body Vector3f* akCtrl = new Vector3f[m_iNumCtrl]; int i; for (i = 0; i < m_iNumCtrl; i++) { // control points for a snake float fRatio = ((float)i)/(float)(m_iNumCtrl-1); float fX = -1.0f + 2.0f*fRatio; float fXMod = 10.0f*fX - 4.0f; akCtrl[i].X() = fX; akCtrl[i].Y() = ms_fRadius*(1.5f + Mathf::ATan(fXMod)/Mathf::PI); akCtrl[i].Z() = 0.0f; // sinusoidal motion for snake m_afAmplitude[i] = 0.1f+fRatio*Mathf::Exp(-fRatio); m_afPhase[i] = 1.5f*fRatio*Mathf::TWO_PI; } // the control points are copied by the curve objects m_pkCenter = new BSplineCurve3f(m_iNumCtrl,akCtrl,m_iDegree,false,true); delete[] akCtrl; // generate a tube surface bool bClosed = false; Vector3f kUpVector = Vector3f::UNIT_Y; int iMedialSamples = 128; int iSliceSamples = 32; bool bWantNormals = true; bool bWantColors = false; bool bSampleByArcLength = false; bool bInsideView = false; Vector2f kTextureMin(0.0f,0.0f), kTextureMax(1.0f,16.0f); m_spkSnakeBody = new TubeSurface(m_pkCenter,Radial,bClosed,kUpVector, iMedialSamples,iSliceSamples,bWantNormals,bWantColors, bSampleByArcLength,bInsideView,&kTextureMin,&kTextureMax); // attach a texture for the snake body Texture* pkTexture = new Texture; pkTexture->SetImage(Image::Load("snake.mif")); pkTexture->Filter() = Texture::FM_LINEAR; pkTexture->Mipmap() = Texture::MM_LINEAR_LINEAR; pkTexture->Apply() = Texture::AM_REPLACE; pkTexture->Wrap() = Texture::WM_WRAP_S_WRAP_T; TextureState* pkTS = new TextureState; pkTS->Set(0,pkTexture); //m_spkSnakeBody->SetRenderState(pkTS); // Set up a light map to add to the current color. pkTexture = new Texture; pkTexture->SetImage(Image::Load("LightMap.mif")); pkTexture->Filter() = Texture::FM_LINEAR; pkTexture->Mipmap() = Texture::MM_LINEAR_LINEAR; pkTexture->Apply() = Texture::AM_ADD; pkTexture->Envmap() = Texture::EM_SPHERE; pkTS->Set(1,pkTexture); m_spkSnakeBody->SetRenderState(pkTS); m_spkSnakeRoot->AttachChild(m_spkSnakeBody); }