示例#1
0
//--------------------------------------------------------------
// constructor
Planet::Planet(
  const mgOptionsFile& options)
{
  // load the planet cubemap texture
  mgString xminName, xmaxName, yminName, ymaxName, zminName, zmaxName;
  options.getFileName("planet-xmin", options.m_sourceFileName, "", xminName);
  options.getFileName("planet-xmax", options.m_sourceFileName, "", xmaxName);
  options.getFileName("planet-ymin", options.m_sourceFileName, "", yminName);
  options.getFileName("planet-ymax", options.m_sourceFileName, "", ymaxName);
  options.getFileName("planet-zmin", options.m_sourceFileName, "", zminName);
  options.getFileName("planet-zmax", options.m_sourceFileName, "", zmaxName);

  m_surfaceTexture = loadCubeMap(xminName, xmaxName, yminName, ymaxName, zminName, zmaxName);

  // load the clouds cubemap texture
  options.getFileName("clouds-xmin", options.m_sourceFileName, "", xminName);
  options.getFileName("clouds-xmax", options.m_sourceFileName, "", xmaxName);
  options.getFileName("clouds-ymin", options.m_sourceFileName, "", yminName);
  options.getFileName("clouds-ymax", options.m_sourceFileName, "", ymaxName);
  options.getFileName("clouds-zmin", options.m_sourceFileName, "", zminName);
  options.getFileName("clouds-zmax", options.m_sourceFileName, "", zmaxName);

  m_cloudsTexture = loadCubeMap(xminName, xmaxName, yminName, ymaxName, zminName, zmaxName);

  compileShader(options);

  // create the vertex buffer
  glGenVertexArrays(1, &m_vertexArray);
  glBindVertexArray(m_vertexArray);

  glGenBuffers(1, &m_vertexBuffer);
  glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);

  glEnableVertexAttribArray(0);
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPlanet), (const GLvoid*) offsetof(VertexPlanet, m_px));
  glEnableVertexAttribArray(1);
  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPlanet), (const GLvoid*) offsetof(VertexPlanet, m_mx));

  m_eyePt = mgPoint3(3500, 0, 0);
  m_eyeRotX = 0.0;
  m_eyeRotY = 90.0;
  m_eyeMatrix.rotateYDeg(m_eyeRotY);
  m_eyeMatrix.rotateXDeg(m_eyeRotX);

  m_specularColor = mgPoint3(0.4, 0.4, 0.4);
  m_lightColor = mgPoint3(0.6, 0.6, 0.6);
  m_lightAmbient = mgPoint3(0.2, 0.2, 0.2);
  m_matColor = mgPoint4(1, 1, 1, 1);
}
示例#2
0
//--------------------------------------------------------------
// constructor
Planet::Planet(
  const mgOptionsFile& options)
{
  // load the planet cubemap texture
  mgString xminName, xmaxName, yminName, ymaxName, zminName, zmaxName;
  options.getFileName("planet-xmin", options.m_sourceFileName, "", xminName);
  options.getFileName("planet-xmax", options.m_sourceFileName, "", xmaxName);
  options.getFileName("planet-ymin", options.m_sourceFileName, "", yminName);
  options.getFileName("planet-ymax", options.m_sourceFileName, "", ymaxName);
  options.getFileName("planet-zmin", options.m_sourceFileName, "", zminName);
  options.getFileName("planet-zmax", options.m_sourceFileName, "", zmaxName);

  m_surfaceTexture = loadCubeMap(xminName, xmaxName, yminName, ymaxName, zminName, zmaxName);

  // load the clouds cubemap texture
  options.getFileName("clouds-xmin", options.m_sourceFileName, "", xminName);
  options.getFileName("clouds-xmax", options.m_sourceFileName, "", xmaxName);
  options.getFileName("clouds-ymin", options.m_sourceFileName, "", yminName);
  options.getFileName("clouds-ymax", options.m_sourceFileName, "", ymaxName);
  options.getFileName("clouds-zmin", options.m_sourceFileName, "", zminName);
  options.getFileName("clouds-zmax", options.m_sourceFileName, "", zmaxName);

  m_cloudsTexture = loadCubeMap(xminName, xmaxName, yminName, ymaxName, zminName, zmaxName);

  compileShader(options);

  // create the vertex buffer
  glGenBuffers(1, &m_vertexBuffer);
  glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);

  m_eyePt = mgPoint3(3500, 0, 0);
  m_eyeRotX = 0.0;
  m_eyeRotY = 90.0;
  m_eyeMatrix.rotateYDeg(m_eyeRotY);
  m_eyeMatrix.rotateXDeg(m_eyeRotX);

  m_specularColor = mgPoint3(0.4, 0.4, 0.4);
  m_lightColor = mgPoint3(0.6, 0.6, 0.6);
  m_lightAmbient = mgPoint3(0.2, 0.2, 0.2);
  m_matColor = mgPoint4(1, 1, 1, 1);
}
示例#3
0
//--------------------------------------------------------------------
// draw the scene
void Landscape::renderTerrain()
{
  mgPoint3 renderEyePt(m_eyePt);
  if (m_mapView)
    renderEyePt.y = MAPVIEW_HEIGHT;

  mgTextureImage* texture = NULL;
  mgTextureImage* highlight = NULL;
  int gridStyle = m_mapView ? m_mapGrid : m_terrainGrid;
  switch (gridStyle)
  {
    case GRID_TERRAIN: 
      texture = m_terrainTexture;
      highlight = texture;  // don't highlight new terrain
      break;

    case GRID_CELLS: 
    case GRID_CHUNKS: 
      texture = m_gridTexture;
      highlight = m_newTexture;
      break;
  }

  mgDisplay->setCulling(false);

  mgDisplay->setTexture(texture);
  mgDisplay->setShader("terrain");
  mgDisplay->setShaderUniform("terrain", "fogColor", mgPoint4(m_fogColor.x, m_fogColor.y, m_fogColor.z, 1.0));
  mgDisplay->setShaderUniform("terrain", "fogBotHeight", (float) (m_fogBotHeight - renderEyePt.y));
  mgDisplay->setShaderUniform("terrain", "fogBotInten", (float) m_fogBotInten);
  mgDisplay->setShaderUniform("terrain", "fogTopHeight", (float) (m_fogTopHeight - renderEyePt.y));
  mgDisplay->setShaderUniform("terrain", "fogTopInten", (float) m_fogTopInten);
  mgDisplay->setShaderUniform("terrain", "fogMaxDist", (float) m_fogMaxDist);

  for (int x = 0; x <= 2; x++)
  {
    for (int z = 0; z <= 2; z++)
    {
      m_terrain[x][z]->render(renderEyePt, texture, highlight);
    }
  }

  if (!m_mapView && gridStyle == GRID_TERRAIN)
  {
    mgDisplay->setTransparent(true);
    mgDisplay->setShader("water");
    mgDisplay->setShaderUniform("water", "fogColor", m_fogColor);
    mgDisplay->setShaderUniform("water", "fogBotHeight", (float) (m_fogBotHeight - renderEyePt.y));
    mgDisplay->setShaderUniform("water", "fogBotInten", (float) m_fogBotInten);
    mgDisplay->setShaderUniform("water", "fogTopHeight", (float) (m_fogTopHeight - renderEyePt.y));
    mgDisplay->setShaderUniform("water", "fogTopInten", (float) m_fogTopInten);
    mgDisplay->setShaderUniform("water", "fogMaxDist", (float) m_fogMaxDist);

    for (int x = 0; x <= 2; x++)
    {
      for (int z = 0; z <= 2; z++)
      {
        m_terrain[x][z]->renderTransparent(renderEyePt, m_waterTexture);
      }
    }

    mgDisplay->setTransparent(false);
  }
}