| 163 | } |
| 164 | |
| 165 | void Camera::calcScreenProjection( const Sphere &sphere, const vec2 &screenSizePixels, vec2 *outCenter, vec2 *outAxisA, vec2 *outAxisB ) const |
| 166 | { |
| 167 | auto toScreenPixels = [=] ( vec2 v, const vec2 &windowSize ) { |
| 168 | vec2 result = v; |
| 169 | result.x *= 1 / ( windowSize.x / windowSize.y ); |
| 170 | result += vec2( 0.5f ); |
| 171 | result *= windowSize; |
| 172 | return result; |
| 173 | }; |
| 174 | |
| 175 | Sphere camSpaceSphere( vec3( getViewMatrix()*vec4(sphere.getCenter(), 1.0f) ), sphere.getRadius() ); |
| 176 | vec2 center, axisA, axisB; |
| 177 | camSpaceSphere.calcProjection( getFocalLength(), ¢er, &axisA, &axisB ); |
| 178 | if( outCenter ) |
| 179 | *outCenter = toScreenPixels( center, screenSizePixels );//( center * vec2( invAspectRatio, 1 ) + vec2( 0.5f ) ) * screenSizePixels; |
| 180 | if( outAxisA ) |
| 181 | *outAxisA = toScreenPixels( center + axisA * 0.5f, screenSizePixels ) - toScreenPixels( center - axisA * 0.5f, screenSizePixels ); |
| 182 | if( outAxisB ) |
| 183 | *outAxisB = toScreenPixels( center + axisB * 0.5f, screenSizePixels ) - toScreenPixels( center - axisB * 0.5f, screenSizePixels ); |
| 184 | } |
| 185 | |
| 186 | void Camera::calcMatrices() const |
| 187 | { |