Vector3 Camera::WorldToScreen(const Vector3& pos, const Vector2& winsize) { GLint viewport[] = {0, 0, (int)winsize.X, (int)winsize.Y}; Matrix view = this->mat; Matrix proj = this->projmat.Mirror(); Vector3 sp; glhProjectf(pos.X, pos.Y, pos.Z, view.values, proj.values, viewport, (float*)&sp); return sp; }
void SegmentGL::RenderContour(Segment *seg, QMatrix4x4 projection, QMatrix4x4 modelview, int width, int height) { QVector3D vec; QVector3D pos; QVector<GLfloat> positions; QEci qeci; CalculateSegmentContour(&positions, seg->cornerpointfirst1.latitude, seg->cornerpointfirst1.longitude, seg->cornerpointlast1.latitude, seg->cornerpointlast1.longitude); CalculateSegmentContour(&positions,seg->cornerpointlast1.latitude, seg->cornerpointlast1.longitude, seg->cornerpointlast2.latitude, seg->cornerpointlast2.longitude); CalculateSegmentContour(&positions, seg->cornerpointlast2.latitude, seg->cornerpointlast2.longitude, seg->cornerpointfirst2.latitude, seg->cornerpointfirst2.longitude); CalculateSegmentContour(&positions,seg->cornerpointfirst2.latitude, seg->cornerpointfirst2.longitude, seg->cornerpointfirst1.latitude, seg->cornerpointfirst1.longitude); seg->qsgp4->getPosition(seg->minutes_since_state_vector, qeci); QGeodetic qgeo = qeci.ToGeo(); double lat1 = qgeo.latitude; double lon1 = qgeo.longitude; seg->qsgp4->getPosition(seg->minutes_since_state_vector + seg->minutes_sensing, qeci); qgeo = qeci.ToGeo(); double lat2 = qgeo.latitude; double lon2 = qgeo.longitude; CalculateSegmentContour(&positions, lat1, lon1, lat2, lon2); positionsBuf.bind(); positionsBuf.write(0, positions.data(), positions.size() * sizeof(GLfloat)); positionsBuf.release(); QOpenGLVertexArrayObject::Binder vaoBinder(&vao); program->bind(); program->setUniformValue("MVP", projection * modelview); QColor rendercolor(opts.satsegmentcolor); QColor rendercolorsel(opts.satsegmentcolorsel); if((*seg).segmentselected) program->setUniformValue("outcolor", QVector4D(rendercolorsel.redF(), rendercolorsel.greenF(), rendercolorsel.blueF(), 1.0f)); else program->setUniformValue("outcolor", QVector4D(rendercolor.redF(), rendercolor.greenF(), rendercolor.blueF(), 1.0f)); QMatrix3x3 norm = modelview.normalMatrix(); program->setUniformValue("NormalMatrix", norm); glDrawArrays(GL_LINE_LOOP, 0, nbrOfVertices - 10); glDrawArrays(GL_LINE_STRIP, nbrOfVertices - 10, 10); float mvmatrix[16], projmatrix[16]; QMatrix4x4 MVP; MVP = projection * modelview; float *ptr = modelview.data(); for(int i = 0; i < 16; i++) mvmatrix[i] = *(ptr + i); ptr = projection.data(); for(int i = 0; i < 16; i++) projmatrix[i] = *(ptr + i); QVector2D win; LonLat2PointRad((float)seg->cornerpointfirst1.latitude, (float)seg->cornerpointfirst1.longitude, &vec, 1.0); win = glhProjectf (vec, mvmatrix, projmatrix, width, height); seg->winvecend1 = win; LonLat2PointRad((float)seg->cornerpointfirst2.latitude, (float)seg->cornerpointfirst2.longitude, &vec, 1.0); win = glhProjectf (vec, mvmatrix, projmatrix, width, height); seg->winvecend2 = win; LonLat2PointRad((float)seg->cornerpointlast1.latitude, (float)seg->cornerpointlast1.longitude, &vec, 1.0); win = glhProjectf (vec, mvmatrix, projmatrix, width, height); seg->winvecend3 = win; LonLat2PointRad((float)seg->cornerpointlast2.latitude, (float)seg->cornerpointlast2.longitude, &vec, 1.0); win = glhProjectf (vec, mvmatrix, projmatrix, width, height); seg->winvecend4 = win; win = glhProjectf (seg->vec1, mvmatrix, projmatrix, width, height); seg->winvec1 = win; win = glhProjectf (seg->vec2, mvmatrix, projmatrix, width, height); seg->winvec2 = win; }