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