| 106 | } |
| 107 | |
| 108 | void Earth::drawQuakeLabelsOnSphere( const vec3 &eyeNormal, const float eyeDist ) |
| 109 | { |
| 110 | gl::ScopedDepthTest depthTest( true ); |
| 111 | gl::ScopedDepthWrite depthWrite( false ); |
| 112 | gl::ScopedGlslProg shader( gl::getStockShader( gl::ShaderDef().color().texture() ) ); |
| 113 | |
| 114 | gl::ScopedColor color( 1, 1, 1 ); |
| 115 | gl::ScopedBlendAlpha blend; |
| 116 | |
| 117 | const float distMulti = eyeDist * 0.001f; |
| 118 | for( auto &quake : mQuakes ) { |
| 119 | // Skip if minor earthquake. |
| 120 | if( quake.mMag < mMinMagToRender ) |
| 121 | continue; |
| 122 | |
| 123 | // Skip if invisible. |
| 124 | float dp = glm::dot( glm::normalize( quake.mLoc ), glm::normalize( eyeNormal ) ) - 0.85f; |
| 125 | if( dp <= 0.0f ) |
| 126 | continue; |
| 127 | |
| 128 | // Calculate billboard vectors. |
| 129 | vec3 dir = glm::normalize( mLoc - quake.mLoc ); |
| 130 | vec3 perp1 = glm::cross( dir, vec3( 0, 1, 0 ) ); |
| 131 | vec3 perp2 = glm::cross( perp1, dir ); perp1 = glm::cross( perp2, dir ); |
| 132 | |
| 133 | float x = quake.mLocTip.x; |
| 134 | float y = quake.mLocTip.y; |
| 135 | float z = quake.mLocTip.z; |
| 136 | |
| 137 | float w = quake.mLabel->getWidth() * dp * distMulti; |
| 138 | float h = quake.mLabel->getHeight() * dp * distMulti; |
| 139 | |
| 140 | // Render billboard. |
| 141 | gl::ScopedTextureBind tex0( quake.mLabel, 0 ); |
| 142 | gl::begin( GL_TRIANGLE_STRIP ); |
| 143 | gl::texCoord( 0, 0 ); |
| 144 | gl::vertex( x + perp1.x * w - perp2.x * h, y + perp1.y * w - perp2.y * h, z + perp1.z * w - perp2.z * h ); |
| 145 | gl::texCoord( 1, 0 ); |
| 146 | gl::vertex( x - perp1.x * w - perp2.x * h, y - perp1.y * w - perp2.y * h, z - perp1.z * w - perp2.z * h ); |
| 147 | gl::texCoord( 0, 1 ); |
| 148 | gl::vertex( x + perp1.x * w + perp2.x * h, y + perp1.y * w + perp2.y * h, z + perp1.z * w + perp2.z * h ); |
| 149 | gl::texCoord( 1, 1 ); |
| 150 | gl::vertex( x - perp1.x * w + perp2.x * h, y - perp1.y * w + perp2.y * h, z - perp1.z * w + perp2.z * h ); |
| 151 | gl::end(); |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | void Earth::addQuake( float aLat, float aLong, float aMag, const std::string &aTitle ) |
| 156 | { |