void PositionJavaPinButtonExample::Project (const Eegeo::Space::LatLongAltitude& location, Eegeo::v3& screenPosition) { //project a 3D Ecef location to the screen Eegeo::m44 finalMatrix; Eegeo::Camera::RenderCamera renderCamera(GetGlobeCameraController().GetRenderCamera()); Eegeo::m44::Mul (finalMatrix, renderCamera.GetProjectionMatrix(), renderCamera.GetViewMatrix()); Eegeo::v3 local = (location.ToECEF() - renderCamera.GetEcefLocation()).ToSingle(); Eegeo::v4 inVector(local, 1.0f); // get clip space coords Eegeo::v4 outVector = Eegeo::v4::Mul(inVector, finalMatrix); // divide through by w to get normalized device space coords -- range [-1, 1] screenPosition.SetX((outVector.GetX()/outVector.GetW())); screenPosition.SetY((outVector.GetY()/outVector.GetW())); screenPosition.SetZ((outVector.GetZ()/outVector.GetW())); // transform from [-1, 1] to [0, 1] screenPosition.SetX((screenPosition.GetX() + 1.0f) * 0.5f); screenPosition.SetY(1.0f - ((screenPosition.GetY() + 1.0f) * 0.5f)); float viewport[] = {0, 0, renderCamera.GetViewportWidth(), renderCamera.GetViewportHeight()}; // transform from [0, 1] to screen coords. screenPosition.SetX((screenPosition.GetX()*(viewport[2]-viewport[0])) + viewport[0]); screenPosition.SetY((screenPosition.GetY()*(viewport[3]-viewport[1])) + viewport[1]); }
void PositionJavaPinButtonExample::Draw() { //lazily create the pin button when we start drawing so it is not displayed on top of the loading screen if(m_world.Initialising()) { return; } else if(m_buttonID == 0) { CreateButton(); } //get an env for the current thread // //AndroidSafeNativeThreadAttachment will detach the thread if required at the end of the method AndroidSafeNativeThreadAttachment attached(m_nativeState); JNIEnv* env = attached.envForThread; //calculate a screen position for the pin based on an ECEF location const Eegeo::Space::LatLongAltitude pinLocation = Eegeo::Space::LatLongAltitude::FromDegrees(37.7858,-122.401, 0.f); Eegeo::v3 screenPosition; Project(pinLocation, screenPosition); //update the screen position of the pin using the cached update method on the cached object reference to //the pin controller, using the parameters we have calculated and the handle to the pin created earlier env->CallVoidMethod( m_hudPinController, m_updateLocationMethodId, m_buttonID, screenPosition.GetX(), screenPosition.GetY() ); }
void WorldPinsScaleController::GetScreenLocation(const WorldPinItemModel& worldPinItemModel, Eegeo::v2& screenLocation, const Eegeo::Camera::RenderCamera& renderCamera) const { Eegeo::dv3 ecefLocation; m_worldPinsService.GetPinEcefAndScreenLocations(worldPinItemModel, ecefLocation, screenLocation); Eegeo::v3 cameraLocal = (ecefLocation - renderCamera.GetEcefLocation()).ToSingle(); Eegeo::v3 screenPos; renderCamera.Project(cameraLocal, screenPos); screenLocation.Set(screenPos.GetX(), screenPos.GetY()); }
void BoundsVisualiser::Build(const Eegeo::v3& minExtents, const Eegeo::v3& maxExtents) { Vertex vertexBuffer[NumVerts]; u16 indexBuffer[NumIndices]; float minX = minExtents.GetX(); float minY = minExtents.GetY(); float minZ = minExtents.GetZ(); float maxX = maxExtents.GetX(); float maxY = maxExtents.GetY(); float maxZ = maxExtents.GetZ(); std::vector<Eegeo::v3> verts; verts.push_back(Eegeo::v3(minX, minY, minZ)); verts.push_back(Eegeo::v3(minX, minY, maxZ)); verts.push_back(Eegeo::v3(minX, maxY, minZ)); verts.push_back(Eegeo::v3(minX, maxY, maxZ)); verts.push_back(Eegeo::v3(maxX, minY, minZ)); verts.push_back(Eegeo::v3(maxX, minY, maxZ)); verts.push_back(Eegeo::v3(maxX, maxY, minZ)); verts.push_back(Eegeo::v3(maxX, maxY, maxZ)); for(size_t i = 0; i < NumVerts; ++ i) { vertexBuffer[i].x = verts[i].GetX(); vertexBuffer[i].y = verts[i].GetY(); vertexBuffer[i].z = verts[i].GetZ(); } indexBuffer[0] = 0; indexBuffer[1] = 1; indexBuffer[2] = 2; indexBuffer[3] = 1; indexBuffer[4] = 3; indexBuffer[5] = 2; indexBuffer[6] = 4; indexBuffer[7] = 5; indexBuffer[8] = 6; indexBuffer[9] = 5; indexBuffer[10] = 7; indexBuffer[11] = 6; indexBuffer[12] = 4; indexBuffer[13] = 1; indexBuffer[14] = 0; indexBuffer[15] = 4; indexBuffer[16] = 5; indexBuffer[17] = 1; indexBuffer[18] = 5; indexBuffer[19] = 3; indexBuffer[20] = 1; indexBuffer[21] = 7; indexBuffer[22] = 3; indexBuffer[23] = 5; indexBuffer[24] = 2; indexBuffer[25] = 3; indexBuffer[26] = 7; indexBuffer[27] = 7; indexBuffer[28] = 6; indexBuffer[29] = 2; indexBuffer[30] = 4; indexBuffer[31] = 0; indexBuffer[32] = 6; indexBuffer[33] = 2; indexBuffer[34] = 6; indexBuffer[35] = 0; InitMeshGLBuffers(vertexBuffer, indexBuffer); }