// MercatorGlobe.cpp: implementation of the CMercatorGlobe class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SPM CUDA.h"
#include "MercatorGlobe.h"
#include <math.h>
#include "IniSet.h"
#include "Scene.h"
#include <gl\gl.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define FF_IS_CALC 128
#define FF_TR_EXT 64
#define FF_TR_X_Y 32
#define FF_TR_BOTTM 16
#define FF_TR_LEFT 8
#define FF_ON_MAP 4
#define FF_SMOOTH 2
#define FF_RESERVE 1
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMercatorGlobe::CMercatorGlobe()
{
}
CMercatorGlobe::~CMercatorGlobe()
{
}
BOOL CMercatorGlobe::Init(float fSize, CIniSet *pIniSet, CScene *pScene)
{
m_pIniSet = pIniSet;
// m_pRendView = pRendView;
m_pScene = pScene;
fRadius = fSize;
int np, nm;
float fAlpha = 0.f;
float fGamma = 0.f;
float fEpsilon = PI_LB / 2000.f; // fEpsilon guarantees The calculating of reconversion correct
float fDeltaAlpha = 2.f * PI_LB / float(pIniSet->nMeridians);
float fDeltaGamma = (PI_LB — 2 * fEpsilon) / float(pIniSet->nParallels + 1);
Globe.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);
if(!pIniSet->m_mtGlobe.MemorySize()){
pIniSet->m_mtGlobe.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);
pIniSet->m_mtGlobeColors.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);
}
TranformGlobe.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);
mtSavedTranform.Set(pIniSet->nMeridians + 1, pIniSet->nParallels + 2);
for(fGamma = fEpsilon * 0.99f, np = 0; np < pIniSet->nParallels + 2; np++, fGamma += fDeltaGamma){
for(fAlpha = HALFPI, nm = 0; nm < pIniSet->nMeridians + 1; nm++, fAlpha += fDeltaAlpha){
point3d ptPos = { fSize * (float)sin(fGamma) * (float)cos(fAlpha),
fSize * (float)sin(fGamma) * (float)sin(fAlpha),
fSize * (float)cos(fGamma)};
Globe.e(nm, np) = ptPos;// Formulas received from [1 page 3, eq. 1.3]
ptPos.x /= fSize;
ptPos.y /= fSize;
ptPos.z /= fSize;
float fTemp = ptPos.y;
ptPos.y = ptPos.x;
ptPos.x = ptPos.z;
ptPos.z = fTemp;
pIniSet->m_mtGlobe.e(nm, np) = ptPos;
}
}
return TRUE;
}
void CMercatorGlobe::CreateEarth()
{
CString sPathEarth = m_pScene->m_sExePath + "_ImagesCarthographic\\Earth.bmp";
m_cbmpEarth.Load(sPathEarth.GetBuffer());
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glGenTextures(1, &m_nEarth);
glBindTexture(GL_TEXTURE_2D, m_nEarth);
glEnable(GL_TEXTURE_2D);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, m_cbmpEarth.SizeX(), m_cbmpEarth.SizeY(), GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)m_cbmpEarth.Memory());
CString sPathEarthBright = m_pScene->m_sExePath + "_ImagesCarthographic\\EarthBright.bmp";
m_cbmpEarthBright.Load(sPathEarthBright.GetBuffer());
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glGenTextures(1, &m_nEarthBright);
glBindTexture(GL_TEXTURE_2D, m_nEarthBright);
glEnable(GL_TEXTURE_2D);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, m_cbmpEarthBright.SizeX(), m_cbmpEarthBright.SizeY(), GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)m_cbmpEarthBright.Memory());
}
#define ANM 20.0f
void CMercatorGlobe::TransToGeod(point3d *pPoint)
{
if(m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) return;
// Transform from cartesian position to Geodetic position
float fX = pPoint->z;
float fY = pPoint->x;
float fZ = pPoint->y;// yes: zxy
float fP = sqrt(fX * fX + fY * fY);
float fFi, fGm = atan2(fY , fX);
fFi = atan( fZ / fP );// Formulas received from [1]
fFi = RadToDeg(fFi);// fFi has framework { -90.. 90}
fGm = RadToDeg(fGm);// fGm has framework {-180..180}
bFl_Point2 = bFl_Point1; // kind of place of second point
bFl_Point1 = 0; // Clear flages of first point
// set kind of place of first point
if(fFi < 0.f) bFl_Point1 |= FF_TR_BOTTM;
if(fGm < 0.f) bFl_Point1 |= FF_TR_LEFT;
if(fabs(fGm) < 90.f) bFl_Point1 |= FF_TR_EXT;
if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP || m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70){
if (fFi > 80.f) fFi = 80.f;
if (fFi < -80.f) fFi = -80.f;
fFi = log(tan(0.785398 * (1.f + fFi / 90.f))) * 57.2958;
}// Formulas received from [1 page 50]
if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_ENHANC){
if(fFi > 0.f) { fFi = fEnhan * (1.f — exp(- 0.05f * fabs(fFi)) ); }
else { fFi = -fEnhan * (1.f — exp(- 0.01f * fabs(fFi)) ); }
}// This formula was made by experiment way
float fangle = fGm;
if(fGm < 0.f) fangle = fGm + 360.f;
if(m_pIniSet->bAnimationMap){
// This part of code implemented for animation
if(fangle < ANM){
bFl_Point1 |= FF_SMOOTH;
bFl_Point1 |= FF_ON_MAP;
float fMult = fabs(fangle) / ANM;
pPoint->y = (1.f — fMult) * fFi / PP_SIZE_CARTOG_SCALE + fMult * pPoint->y;
pPoint->x = (1.f — fMult) * fGm / PP_SIZE_CARTOG_SCALE + fMult * pPoint->x;
pPoint->z = 0.f;// fMult * pPoint->z + (1.f — fMult) * m_pIniSet->nSpaceCubeSize;// / 2.f;
}
if(fangle > m_pScene->fAnimal_Angle) {
if(m_pScene->fAnimal_Angle != 0.f){
if(fGm > 0.f) fGm -= 360.f;
}
bFl_Point1 |= FF_ON_MAP;
pPoint->y = fFi / PP_SIZE_CARTOG_SCALE;
pPoint->x = fGm / PP_SIZE_CARTOG_SCALE;
pPoint->z = 0.f;//m_pIniSet->nSpaceCubeSize;// / 2.f;
}
}
else{
bFl_Point1 |= FF_ON_MAP;
pPoint->y = fFi / PP_SIZE_CARTOG_SCALE;//for rectangle: (-90 ,90)
pPoint->x = fGm / PP_SIZE_CARTOG_SCALE;//for rectangle: (-180, 180)
pPoint->z = 0.f;
}
}
void CMercatorGlobe::Map_Draw()
{
if(m_pIniSet->bGlobeMode == WS_INVISIBLE && m_pIniSet->bGlobeSkinMode == WS_INVISIBLE && m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_OFF) { return; }
// arrTriangles.FreeData();
arrLines.FreeData();
glDisable(GL_LIGHTING);
glLineWidth(m_pIniSet->fNormalWidthLine);
// CColor24 col = m_pIniSet->GetGlobeSkinColor();
// if(m_pIniSet->bGlobeMode == WS_SOLID){
// col = CColor24(0, 0, 0);
// }
CColor24 col = m_pScene->m_cSpaceGlobeWiresColor;
if (m_pIniSet->nDrawMode == PP_3D_VIEWPORT) {
col = m_pScene->m_cSpaceGlobeWires3DViewColor;
}
if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
col = m_pScene->m_cSpaceGlobeWire2DViewColor;
}
int nTransp;
CHOICE_COLOR_MODE(nTransp, m_pIniSet->nInlayTransp, m_pIniSet->bAppColorMode)
glDisable(GL_LIGHTING);
glDisable(GL_COLOR_MATERIAL);
glEnable(GL_BLEND);
glEnable(GL_COLOR_MATERIAL);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glAlphaFunc(GL_GREATER, .0001f);
glEnable(GL_ALPHA_TEST);
glColor4f(col.R(), col.G(), col.B(), m_pIniSet->fGlobeTrasparent);
glDepthFunc(GL_LEQUAL);
glDisable(GL_CULL_FACE);
// if((m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && (m_pIniSet->nDrawMode != PP_2D_PLOT)){
// glDepthFunc(GL_LEQUAL);
// }
int ix, jx, nSzX = Globe.SizeX(), nSzY = Globe.SizeY();
fEnhan = 180.f / m_pScene->pixel_sz;
mtSaved.Set(nSzX, nSzY);
memcpy(mtSaved.Memory(), Globe.Memory(), Globe.MemorySize());
// if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT){
// for (ix = 0; ix < nSzX; ix++) {
// for (int iy = 0; iy < nSzY; iy++) {
// transform_point(&mtSaved.e(ix, iy), &Globe.e(ix, iy), &m_pScene->m_mtCartho);
// }
// }
// }
// else {
for (ix = 0; ix < nSzX; ix++) {
for (int iy = 0; iy < nSzY; iy++) {
transform_point(&mtSaved.e(ix, iy), &Globe.e(ix, iy), &m_pScene->m_mtMatrix);
if ((m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && m_pIniSet->m_bCarthPlaneView){
transform_point(&mtSaved.e(ix, iy), &mtSaved.e(ix, iy), &m_pScene->m_mtCartho);
}
if ((m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && (m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP)) {
matrix mtMatr; // hack!
ident_matrix(&mtMatr);
rotate_matrix(&mtMatr, 0.00, 0.00, 0.0001);
transform_point(&mtSaved.e(ix, iy), &mtSaved.e(ix, iy), &mtMatr);
}
}
}
// }
if((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pIniSet->bCheckCarthoCylinderMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && !m_pIniSet->bCheckCarthoCylinderMode){
if(m_pIniSet->nDrawMode == PP_2D_PLOT){
float fX = m_pScene->m_mtCartho.m[1][0];
float fY = m_pScene->m_mtCartho.m[1][1];
float fDelta = sqrt(fX * fX + fY * fY);
glPushMatrix();
glScalef(1.f, fDelta, 1.f);
}
else{
glPushMatrix();
glMultMatrixf(&m_pScene->m_mtCartho.m[0][0]);
}
}
// Drawing of Meridians ...
for(ix = 0; ix < nSzX; ix++){
point3d ptPos1, ptPos2 = mtSaved.e(ix, 0);//nSzY — 1);
TransToMap(&ptPos2);
// The points of globe will be transform in map by this function
// if(!m_pIniSet->bAseExport){
// TranformGlobe.e(ix, 0) = m_pScene->ConvertPos2D(ptPos2);
// }else{
TranformGlobe.e(ix, 0) = ptPos2;
// }
CColor24 cCol2 = m_pIniSet->m_mtGlobeColors.e(ix, 0);
for(jx = 1; jx < nSzY; jx++){
ptPos1 = mtSaved.e(ix, jx);
CColor24 cCol1 = m_pIniSet->m_mtGlobeColors.e(ix, jx);
TransToMap(&ptPos1);
ptPos2 = ptPos1;
cCol2 = cCol1;
TranformGlobe.e(ix, jx) = ptPos1;
}
}
// Drawing of Paralells ...
for(ix = 0; ix < nSzY; ix++){
point3d ptPos1, ptPos2 = mtSaved.e(0, ix);//nSzX — 1
TransToMap(&ptPos2);
// if(!m_pIniSet->bAseExport){
// TranformGlobe.e(0, ix) = m_pScene->ConvertPos2D(ptPos2);
// }else{
TranformGlobe.e(0, ix) = ptPos2;
// }
CColor24 cCol2 = m_pIniSet->m_mtGlobeColors.e(0, ix);
for(jx = 1; jx < nSzX; jx++){
ptPos1 = mtSaved.e(jx, ix);
CColor24 cCol1 = m_pIniSet->m_mtGlobeColors.e(jx, ix);
TransToMap(&ptPos1);
ptPos2 = ptPos1;
cCol2 = cCol1;
TranformGlobe.e(jx, ix) = ptPos1;
}
}
if(m_pIniSet->bCheckCarthoCylinderMode && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)){
if(m_pIniSet->nDrawMode != PP_2D_PLOT){
// glPushMatrix();
// glMultMatrixf(&m_pIniSet->mtCylinderMode.m[0][0]);
}
// 1. Find the center.
point3d ptCenter = { 0.f, 0.f, 0.f };
float fMaxLength = 0.f;
for(ix = 0; ix < nSzX; ix++){
for(jx = 0; jx < nSzY; jx++){
float fLen = fabs(TranformGlobe.e(ix, jx).x — ptCenter.x);
if(fLen > fMaxLength){
fMaxLength = fLen;
}
}
}
// CString s;
// s.Format("%f", fMaxLength);
// AfxMessageBox(s);
// Rotate.
for(ix = 0; ix < nSzX; ix++){
for(jx = 0; jx < nSzY; jx++){
TranformGlobe.e(ix, jx) = TransformCylinderPoint(TranformGlobe.e(ix, jx), ptCenter, fMaxLength);
}
}
CalcObjectProjectPoints(ptCenter, fMaxLength);
}
float fMinX = 0.f;
float fMinY = 0.f;
float fMaxX = 0.f;
float fMaxY = 0.f;
if (m_pIniSet->bObjsTransProcess) {
point3d vtVect, vtVect1;
for (int ix = 0; ix < nSzX; ix++) {
for (int jx = 0; jx < nSzY; jx++) {
vtVect = TranformGlobe.e(ix, jx);
vtVect1 = mtSavedTranform.e(ix, jx);
point3d vt;
sub_vectors(&vt.x, &vtVect1.x, &vtVect.x);
scale_vect(&vt.x, float(m_pIniSet->m_nObjsTrans) / float(m_pIniSet->nFrameTrans));
point3d ptPos;
add_vectors(&ptPos.x, &vtVect.x, &vt.x);
TranformGlobe.e(ix, jx) = ptPos;
}
}
}
int n70Offset1 = 0;
if (m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70) {
n70Offset1 = 2;
}
if (m_pIniSet->bGlobeSkinMode == WS_WIRE_FRAME || m_pIniSet->bGlobeMode == WS_TRANSPARENT) {
// Drawing of Meridians ...
MyArray<float> arrValuesY;
for (ix = 0; ix < nSzX; ix++) {
point3d ptPos1, ptPos2 = TranformGlobe.e(ix, 0 + n70Offset1);
CColor24 cCol2 = m_pIniSet->m_mtGlobeColors.e(ix, 0 + n70Offset1);
if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos2.z /= 100.f;
}
for (jx = 0 + n70Offset1; jx < nSzY — n70Offset1; jx++) {
ptPos1 = TranformGlobe.e(ix, jx);
if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z /= 100.f;
}
if (0 && m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT && m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z = ptPos2.z = -0.005f;
}
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
ptPos1.z = ptPos2.z = 0.005f;
}
CColor24 cCol1 = m_pIniSet->m_mtGlobeColors.e(ix, jx);
if ((m_pIniSet->bGlobeMode == WS_CODED) || (m_pIniSet->bGlobeMode == WS_CODED_TRASPARENT) || (m_pIniSet->bGlobeMode == WS_WIRE_FRAME)) {
Map_Line_Draw(&ptPos1, &ptPos2, &cCol1, &cCol2);
}
else {
Map_Line_Draw(&ptPos1, &ptPos2);
}
// if (!m_pIniSet->bObjsTransProcess) {
mtSavedTranform.e(ix, jx) = ptPos1;
// }
if (fMinX > ptPos1.x) {
fMinX = ptPos1.x;
}
if (fMinX > ptPos2.x) {
fMinX = ptPos2.x;
}
if (fMaxX < ptPos1.x) {
fMaxX = ptPos1.x;
}
if (fMaxX < ptPos2.x) {
fMaxX = ptPos2.x;
}
if (fMinY > ptPos1.y) {
fMinY = ptPos1.y;
}
if (fMinY > ptPos2.y) {
fMinY = ptPos2.y;
}
if (fMaxY < ptPos1.y) {
fMaxY = ptPos1.y;
}
if (fMaxY < ptPos2.y) {
fMaxY = ptPos2.y;
}
ptPos2 = ptPos1;
cCol2 = cCol1;
}
}
// Drawing of Paralells ..
for (ix = 0 + n70Offset1; ix < nSzY — n70Offset1; ix++) {
point3d ptPos1, ptPos2 = TranformGlobe.e(0, ix);
CColor24 cCol2 = m_pIniSet->m_mtGlobeColors.e(0, ix);
if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos2.z /= 100.f;
}
for (jx = 0; jx < nSzX; jx++) {
ptPos1 = TranformGlobe.e(jx, ix);
if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z /= 100.f;
}
if (0 && m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT && m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z = ptPos2.z = -0.005f;
}
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
ptPos1.z = ptPos2.z = 0.005f;
}
CColor24 cCol1 = m_pIniSet->m_mtGlobeColors.e(jx, ix);
if (jx == nSzX — 1) {
cCol1 = cCol2 = CColor24(255, 0, 0);
}
if (m_pIniSet->bGlobeMode == WS_CODED || m_pIniSet->bGlobeMode == WS_CODED_TRASPARENT || m_pIniSet->bGlobeMode == WS_WIRE_FRAME) {
Map_Line_Draw(&ptPos1, &ptPos2, &cCol1, &cCol2);
}
else {
Map_Line_Draw(&ptPos1, &ptPos2);
}
// if (!m_pIniSet->bObjsTransProcess) {
// mtSavedTranform.e(jx, ix) = ptPos1;
// }
if (fMinX > ptPos1.x) {
fMinX = ptPos1.x;
}
if (fMinX > ptPos2.x) {
fMinX = ptPos2.x;
}
if (fMaxX < ptPos1.x) {
fMaxX = ptPos1.x;
}
if (fMaxX < ptPos2.x) {
fMaxX = ptPos2.x;
}
if (fMinY > ptPos1.y) {
fMinY = ptPos1.y;
}
if (fMinY > ptPos2.y) {
fMinY = ptPos2.y;
}
if (fMaxY < ptPos1.y) {
fMaxY = ptPos1.y;
}
if (fMaxY < ptPos2.y) {
fMaxY = ptPos2.y;
}
ptPos2 = ptPos1;
cCol2 = cCol1;
}
}
}
if (m_pIniSet->m_bMarkDegreesGlobe && m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)
{
if (m_pIniSet->nViewMode2d == PP_MERCATOR_MAP) {
n70Offset1 = 1;
}
CColor24 col;
if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
col = m_pScene->m_cDegreeMarkers2DPlot;
}
if (m_pIniSet->nDrawMode == PP_3D_PLOT) {
col = m_pScene->m_cDegreeMarkers3DPlot;
}
if (m_pIniSet->nDrawMode == PP_3D_VIEWPORT) {
col = m_pScene->m_cDegreeMarkers3DView;
}
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cParallelsColor;
}
if (m_pScene->m_fV == 0.f && m_pScene->m_fH == -90.f) { // ZY Plane!
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}
}
glColor3f(col.R(), col.G(), col.B());
MyArray<CPoint> arrPoints;
if (m_pScene->m_fV == 90.f && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cParallelsColor;
}
glColor3f(col.R(), col.G(), col.B());
point3d ptPos = TranformGlobe.e(nSzX / 2, 0);
ptPos.y = fMinY + (fMaxY — fMinY) / 2.f;
ptPos.x = fMaxX;
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
yy += m_pIniSet->m_cszMarkDegree.cy / 4;
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
CString s;
s.Format(" 0°");
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}
glColor3f(col.R(), col.G(), col.B());
ptPos.y = fMinY;
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;
m_pScene->World2Screen(ptPos, xx, yy);
yy += m_pIniSet->m_cszMarkDegree.cy * 0.9f;
xx -= m_pIniSet->m_cszMarkDegree.cx / 2;
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
s.Format(" 0°");
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;
ptPos.y = fMaxY;
m_pScene->World2Screen(ptPos, xx, yy);
yy -= m_pIniSet->m_cszMarkDegree.cy / 4;
xx -= m_pIniSet->m_cszMarkDegree.cx / 2;
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
s.Format(" 0°");
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
else
if (m_pScene->m_fV == 0.f && m_pScene->m_fH == 0.f && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}
glColor3f(col.R(), col.G(), col.B());
point3d ptPos = TranformGlobe.e(nSzX / 2, 0);
ptPos.y = fMinY;
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx / 2;
yy += m_pIniSet->m_cszMarkDegree.cy * 0.9f;
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
CString s;
s.Format(" 0°");
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
ptPos = TranformGlobe.e(nSzX / 2, 0);
ptPos.y = fMaxY;
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx / 2;
yy -= m_pIniSet->m_cszMarkDegree.cy / 4;
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
else
for (ix = 0 + n70Offset1; ix < nSzY; ix++) {
point3d ptPos = TranformGlobe.e(0, ix);
if (ptPos.y > 0.f && (ix < nSzY / 2) && (TranformGlobe.e(0, ix + nSzY / 2).y > 0.f)) {
ptPos.y = -ptPos.y;
}
if (ptPos.y < 0.f && (ix > nSzY / 2) && (TranformGlobe.e(0, ix — nSzY / 2).y < 0.f)) {
ptPos.y = -ptPos.y;
}
ptPos.x = fMaxX;
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
yy += m_pIniSet->m_cszMarkDegree.cy / 4;
m_pScene->Screen2World(xx, yy, ptPos);
BOOL bCross = FALSE;
for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}
if (bCross && ptPos.y != (fMaxY + fMinY) / 2.f) {
continue;
}
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}
arrPoints.Append(CPoint(xx, yy));
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
CString s;
float fValue = (-180.f + 20.f * n70Offset1) / float(nSzY — 2.f * n70Offset1 — 1) * float(ix — n70Offset1 — float(nSzY — 2.f * n70Offset1 — 1) / 2.f);
if (m_pScene->m_fV == 0.f && m_pScene->m_fH == -90.f) { // ZY Plane!
fValue = 20.f * n70Offset1 + float((nSzY — 2.f * n70Offset1 — 1) / 2 — ix — n70Offset1) * (180.f — 20.f * n70Offset1) / float(nSzY — 2.f * n70Offset1 — 1);
if (ix == (nSzY — 2.f * n70Offset1) / 2) {
// fValue = 90.f;
}
if (ix >= (nSzY — 2.f * n70Offset1) / 2) {
fValue = 80.f * n70Offset1 + fabs(float(ix — 1 * n70Offset1 — (nSzY — 1.f * n70Offset1))) * (180.f) / float(nSzY — 1.f * n70Offset1);
if (fValue > 170.f) { // HACK!
fValue = 170.f;
}
// continue;
}
}
s.Format(" %.0f°", fValue);
if (fValue > 0.f) {
if (m_pScene->m_fH == 0.f && m_pScene->m_fV != 90.f && m_pScene->m_fH != -90.f) {
fValue = -fValue;
}
s.Format(" %.0f°", fValue);
}
if (atoi(s.GetBuffer()) == 0) {
if (m_pScene->m_fV == 0.f && n70Offset1 != 0) {
s.Format(" -10°");
}
else {
s.Format(" 0°");
}
}
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
arrPoints.FreeData();
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}
glColor3f(col.R(), col.G(), col.B());
if (m_pScene->m_fV == 90.f && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
for (ix = 0; ix < 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}
point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMaxY;
ptPos.x = fMinX + (fMaxX — fMinX) / (3.f * 8.f) * float(ix);
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
yy -= m_pIniSet->m_cszMarkDegree.cy / 4;
xx -= m_pIniSet->m_cszMarkDegree.cx / float(ix + 1);
if (ix == 0) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / 2.f;
}
if (ix == 2) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx / 4.f;
}
if (ix != 0 && ix != 7) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 0.8f;
}
if (ix == 3 || ix == 4 || ix == 5) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx / 4.5f;
}
if (ix == 1 || ix == 2) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / 4.f;
}
BOOL bCross = FALSE;
for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}
if (bCross) {
continue;
}
arrPoints.Append(CPoint(xx, yy));
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
CString s;
s.Format(" %d°", ix * 10);
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
for (ix = 1; ix <= 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}
point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMinY;
ptPos.x = fMinX + (fMaxX — fMinX) / (3.f * 8.f) * float(1.2f * ix);
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
yy += m_pIniSet->m_cszMarkDegree.cy * 0.9f;
xx -= m_pIniSet->m_cszMarkDegree.cx / float(ix + 1) / 1.25f;
if (ix == 1 || ix == 2) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 1.5f / 1.25f;
}
if (ix == 3) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.f / 1.25f;
}
if (ix == 7) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.f / 1.25f;
}
if (ix != 1 && ix != 8) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 0.8f / 1.25f;
}
if (ix == 4 || ix == 5 || ix == 6) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.5f / 1.25f;
}
if (ix == 2 || ix == 3) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / (4.f * 1.25f);
}
if (ix == 2 || ix == 3 || ix == 4 || ix == 5) { // Hack
xx -= m_pIniSet->m_cszMarkDegree.cx / (4.f * 1.25f);
}
if (ix == 4 || ix == 6 || ix == 7) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / 4.f;
}
if (ix == 7) { // Hack
xx += m_pIniSet->m_cszMarkDegree.cx / 4.f;
}
BOOL bCross = FALSE;
for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}
if (bCross) {
continue;
}
arrPoints.Append(CPoint(xx, yy));
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
CString s;
s.Format(" %d°", -ix * 10);
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
}
glColor3f(col.R(), col.G(), col.B());
for (ix = 0; ix <= 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}
point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMinY + 0.64f * (ix) / 8.f * (fMaxY — fMinY) / 2.f;
ptPos.x = fMinX;
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.25f;
yy += m_pIniSet->m_cszMarkDegree.cy / 4;
if (ix == 2 || ix == 3 || ix == 4 || ix == 5 || ix == 6 || ix == 7) { // Hack
yy += m_pIniSet->m_cszMarkDegree.cy / 5;
}
BOOL bCross = FALSE;
for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}
if (bCross) {
continue;
}
arrPoints.Append(CPoint(xx, yy));
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
CString s;
s.Format("%d°", 180 + ix * 10);
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
for (ix = 0; ix <= 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}
point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMinY + (fMaxY — fMinY) / 2.f + 1.03f * (ix) / 9.f * (fMaxY — fMinY) / 2.f;
ptPos.x = fMinX;
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx * 2.25f;
yy += m_pIniSet->m_cszMarkDegree.cy / 4;
if (ix == 1) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 1.55f;
}
if (ix == 2) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 2.15f;
}
if (ix == 3) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 2.55f;
}
if (ix == 4) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 2.55f;
}
if (ix == 5) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 2.15f;
}
if (ix == 6) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 1.55f;
}
if (ix == 7) {
yy -= m_pIniSet->m_cszMarkDegree.cy * 0.75f;
}
BOOL bCross = FALSE;
for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}
if (bCross) {
continue;
}
arrPoints.Append(CPoint(xx, yy));
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
CString s;
s.Format("%d°", 270 — ix * 10);
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
for (ix = 1; ix <= 8; ix++) {
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}
point3d ptPos = TranformGlobe.e(ix, 0);
ptPos.y = fMinY + 0.8f * (ix) / 8.f * (fMaxY — fMinY) / 2.f;
ptPos.x = fMaxX;
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
// xx -= m_pIniSet->m_cszMarkDegree.cx * 2;
// yy += m_pIniSet->m_cszMarkDegree.cy / 4;
if (ix == 2 || ix == 3 || ix == 4 || ix == 5 || ix == 6 || ix == 7) { // Hack
// yy += m_pIniSet->m_cszMarkDegree.cy / 5;
}
if (ix == 1) { // 170
yy += m_pIniSet->m_cszMarkDegree.cy * 0.9f;
}
if (ix == 2) { // 160
yy += 1.25f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 3) { // 150
yy += 1.5f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 4) { // 140
yy += 1.75f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 5) { // 130
yy += 2.f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 6) { // 120
yy += 1.75f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 7) { // 110
yy += 1.05f * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 8) { // 100
yy -= 0.05 * m_pIniSet->m_cszMarkDegree.cy;
}
if (ix == 1 || ix == 2 || ix == 5 || ix == 7) {
yy -= m_pIniSet->m_cszMarkDegree.cy / 4;
}
BOOL bCross = FALSE;
for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}
if (bCross) {
continue;
}
arrPoints.Append(CPoint(xx, yy));
m_pScene->Screen2World(xx, yy, ptPos);
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
CString s;
s.Format(" %d°", 180 — ix * 10);
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
}
else
if (m_pScene->m_fV == 0.f && m_pScene->m_fH == 0.f && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) { // while nothing!
}
else
for (ix = 0; ix < nSzX; ix++) {
point3d ptPos = TranformGlobe.e(ix, 0);
if (ptPos.x > 0.f && (ix < nSzX / 2) && (TranformGlobe.e(ix + nSzX / 2, 0).x > 0.f)) {
// ptPos.x = -ptPos.x;
}
if (m_pScene->m_fV == 0.f && ix > nSzX / 1.5f) {
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
}
if (m_pScene->m_fV == 0.f) {
if (ix == 0) {
ptPos.x = fMinX + (fMaxX — fMinX) / 4.f;
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
}
if (ix == nSzX / 2) {
ptPos.x = fMinX + (fMaxX — fMinX) / 2.f;
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
glColor3f(col.R(), col.G(), col.B());
}
}
if (ix > nSzX / 1.5f) {
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
}
if (m_pScene->m_fV == 0.f && m_pScene->m_fH == -90.f) { // ZY Plane!
if (ix == nSzX / 2) {
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cParallelsColor;
glColor3f(col.R(), col.G(), col.B());
}
}else{
if (m_pScene->m_bAllBlack) {
}
else {
col = m_pScene->m_cMeridiansColor;
glColor3f(col.R(), col.G(), col.B());
}
}
}
if (ix == nSzX — 1) {
ptPos.x = fMinX + 3.f * (fMaxX — fMinX) / 4.f;
}
}
if (m_pScene->m_fV == 0.f && m_pScene->m_fH == 0.f && (ix > nSzX / 4) && (ix < nSzX / 1.5f)) {
if (m_pScene->m_bAllBlack) {
// col = CColor24(0);
}
else {
col = m_pScene->m_cMeridiansColor;
glColor3f(col.R(), col.G(), col.B());
}
}
ptPos.y = fMinY;
int xx, yy;
m_pScene->World2Screen(ptPos, xx, yy);
xx -= m_pIniSet->m_cszMarkDegree.cx;
yy += m_pIniSet->m_cszMarkDegree.cy;
float fValue = 180.f + 360.f * (ix) / float(nSzX — 1);
if (ix > (nSzX — 2) / 2) {
fValue = 360.f * (ix — float(nSzX — 1) / 2.f) / float(nSzX — 1);
}
if (m_pScene->m_fV == 0.f) {
fValue = 0.f;
}
if (m_pScene->m_fV != 0.f && m_pScene->m_fH != 0.f) {
continue;
}
CString s;
s.Format("%.0f°", fValue);
if (s.GetLength() <= 3) {
xx += m_pIniSet->m_cszMarkDegree.cx / 2.f;
}
if (fValue == 0.f) { // ZERO!
xx += m_pIniSet->m_cszMarkDegree.cx / 4.f;
}
m_pScene->Screen2World(xx, yy, ptPos);
BOOL bCross = FALSE;
for (int ax = 0; ax < arrPoints.Size(); ax++)
{
if (fabs(arrPoints.e(ax).x — xx) < 2 * m_pIniSet->m_cszMarkDegree.cx &&
fabs(arrPoints.e(ax).y — yy) < m_pIniSet->m_cszMarkDegree.cy) {
bCross = TRUE;
}
}
if (bCross && (ix != nSzX / 2) && fValue != 100.f) { continue; }
arrPoints.Append(CPoint(xx, yy));
glRasterPos3f(ptPos.x, ptPos.y, ptPos.z);
glListBase(m_pIniSet->m_nOffsetMarkDegreesGlobeLabel);
glCallLists(s.GetLength(), GL_UNSIGNED_BYTE, s.GetBuffer());
}
}
if ((m_pIniSet->m_nGlobeEarthMode != VS_GLOBE_EARTH_OFF && m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) || ((m_pIniSet->bGlobeMode == WS_TRANSPARENT) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_OFF))){
glDisable(GL_CULL_FACE);
glColor4f(1.f, 1.f, 1.f, m_pIniSet->fGlobeTrasparent);
float fDeltaY = 0.f;
if (m_pIniSet->nViewMode2d == PP_MERCATOR_MAP) {
fDeltaY = 1.0f;
}
float fScaleY = 0.f;
int n70Offset = 0;
if (m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70) {
// fScaleY = 0.3f;
n70Offset = 2;
fDeltaY = 1.0f;
}
fDeltaY = 0.0f;
for (int ix = n70Offset; ix < nSzY — 1 — n70Offset; ix++) {
for (int jx = 0; jx < nSzX — 1; jx++) {
point3d ptPos1 = mtSavedTranform.e(jx, ix);
point3d ptPos2 = mtSavedTranform.e(jx + 1, ix);
point3d ptPos3 = mtSavedTranform.e(jx + 1, ix + 1);
point3d ptPos4 = mtSavedTranform.e(jx, ix + 1);
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT || m_pIniSet->nDrawMode == PP_2D_PLOT) {
ptPos1.z = ptPos2.z = ptPos3.z = ptPos4.z = 0.f;
}
if (fabs(ptPos1.x — ptPos2.x) > 0.75f) { continue; } // volosnya!
if (fabs(ptPos4.x — ptPos3.x) > 0.75f) { continue; } // volosnya!
if (fabs(ptPos2.x — ptPos3.x) > 0.75f) { continue; } // volosnya!
if ((m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && (m_pIniSet->bGlobeMode == WS_TRANSPARENT)) {
if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_OFF) {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glAlphaFunc(GL_GREATER, .01f);
glEnable(GL_ALPHA_TEST);
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
glDisable(GL_CULL_FACE);
}
CColor24 col = m_pScene->m_cSpaceGlobeSkin2DViewColor;// m_pIniSet->GetGlobeSkinColor();
if (m_pIniSet->nDrawMode == PP_3D_PLOT) {
col = m_pScene->m_cSpaceGlobeSkinColor;
}
if (m_pIniSet->nDrawMode == PP_3D_VIEWPORT) {
col = m_pScene->m_cSpaceGlobeSkin3DViewColor;
}
float fGlobeTransp = m_pIniSet->fGlobeTrasparent + 0.1;
if (fGlobeTransp > 1.f) {
fGlobeTransp = 1.f;
}
glColor4f(col.R(), col.G(), col.B(), fGlobeTransp);
glBegin(GL_TRIANGLES);
// glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos1.x);
// glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos2.x);
// glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos3.x);
// glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos1.x);
// glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos3.x);
// glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos4.x);
glEnd();
}
}
if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_BRIGHT) {
glBindTexture(GL_TEXTURE_2D, m_nEarthBright);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos1.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos2.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos3.x);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos4.x);
glEnd();
}
if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH) {
glBindTexture(GL_TEXTURE_2D, m_nEarth);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos1.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos2.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos3.x);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), (float(ix + 1 — fDeltaY) / float(TranformGlobe.SizeY() — fDeltaY — 1) + fScaleY) / (1.f + fScaleY * 2.857f));
glVertex3fv(&ptPos4.x);
glEnd();
}
}
}
}
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {
point3d ptPos1 = { -180.f / PP_SIZE_CARTOG_SCALE, -180.f / PP_SIZE_CARTOG_SCALE, 0.f };
point3d ptPos2 = { 180.f / PP_SIZE_CARTOG_SCALE, -180.f / PP_SIZE_CARTOG_SCALE, 0.f };
point3d ptPos3 = { 180.f / PP_SIZE_CARTOG_SCALE, 180.f / PP_SIZE_CARTOG_SCALE, 0.f };
point3d ptPos4 = { -180.f / PP_SIZE_CARTOG_SCALE, 180.f / PP_SIZE_CARTOG_SCALE, 0.f };
glBegin(GL_LINES);
glVertex3fv(&ptPos1.x);
glVertex3fv(&ptPos2.x);
glVertex3fv(&ptPos2.x);
glVertex3fv(&ptPos3.x);
glVertex3fv(&ptPos3.x);
glVertex3fv(&ptPos4.x);
glVertex3fv(&ptPos4.x);
glVertex3fv(&ptPos1.x);
glEnd();
}
/*
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT && m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP) {
if (ix == nSzX — 1) {
}
}
if(m_pIniSet->bCheckCarthoCylinderMode && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)){
if (m_pIniSet->nDrawMode != PP_2D_PLOT) {
// Drawing of Paralells ...
for (ix = nSzY — 1; ix >= 0; ix--) {
point3d ptPos1, ptPos2 = TranformGlobe.e(0, ix);
for (jx = 0; jx < nSzX; jx++) {
ptPos1 = TranformGlobe.e(jx, ix);
Map_Line_Draw(&ptPos1, &ptPos2);
}
}*
}
}
*/
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
// glClear(GL_DEPTH_BUFFER_BIT);
}
if((m_pIniSet->bGlobeMode == WS_TRANSPARENT) || (m_pIniSet->m_nGlobeEarthMode != VS_GLOBE_EARTH_OFF) || m_pIniSet->m_bCarthPlaneView) {
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glDepthFunc(GL_LESS);
glShadeModel(GL_SMOOTH);
// glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
if ((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)) {
if (m_pIniSet->nDrawMode != PP_2D_PLOT) {
point3d ptVectorZ;
ptVectorZ.x = m_pScene->m_mtCartho.m[2][0];
ptVectorZ.y = m_pScene->m_mtCartho.m[2][1];
ptVectorZ.z = m_pScene->m_mtCartho.m[2][2];
if (dot_prod(&m_pIniSet->ptCamPos.x, &ptVectorZ.x) < 0.f) {
// glCullFace(GL_BACK);
}
}
}
if (m_pScene->GetCubeRadius() + 0.001f >= vec_length(&m_pIniSet->ptCamPos.x)) {
if (m_pIniSet->nDrawMode != PP_2D_PLOT) {
// glCullFace(GL_BACK);
}
}
// if((m_pIniSet->bGlobeMode != WS_SOLID) && (m_pIniSet->bGlobeMode != WS_CODED)){
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glAlphaFunc(GL_GREATER, .01f);
glEnable(GL_ALPHA_TEST);
if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
glDisable(GL_CULL_FACE);
}
CColor24 col = m_pScene->m_cSpaceGlobeSkin2DViewColor;// m_pIniSet->GetGlobeSkinColor();
if (m_pIniSet->nDrawMode == PP_3D_PLOT) {
col = m_pScene->m_cSpaceGlobeSkinColor;
}
if (m_pIniSet->nDrawMode == PP_3D_VIEWPORT) {
col = m_pScene->m_cSpaceGlobeSkin3DViewColor;
}
float fGlobeTransp = m_pIniSet->fGlobeTrasparent + 0.1;
if (fGlobeTransp > 1.f) {
fGlobeTransp = 1.f;
}
glColor4f(col.R(), col.G(), col.B(), fGlobeTransp);
// glColor4f(col.R(), col.G(), col.B(), float(nTransp) / 100.f);
// }else{
// CColor24 col = m_pIniSet->GetGlobeSkinColor();
// glColor3f(col.R(), col.G(), col.B());
// }
int ix, jx;
for (jx = 0; jx < TranformGlobe.SizeX() — 1; jx++) {
for (ix = 0; ix < TranformGlobe.SizeY() — 1; ix++) {
point3d ptPos1 = TranformGlobe.e(jx, ix);
point3d ptPos2 = TranformGlobe.e(jx + 1, ix);
point3d ptPos3 = TranformGlobe.e(jx + 1, ix + 1);
point3d ptPos4 = TranformGlobe.e(jx, ix + 1);
if (!m_pIniSet->bAseExport) {
ptPos1 = m_pScene->ConvertPos2D(ptPos1);
ptPos2 = m_pScene->ConvertPos2D(ptPos2);
ptPos3 = m_pScene->ConvertPos2D(ptPos3);
ptPos4 = m_pScene->ConvertPos2D(ptPos4);
}
if (m_pIniSet->bCheckCarthoCylinderMode && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)) {
// glDisable(GL_CULL_FACE);
point3d vab, vac, vad;
sub_vectors(&vab.x, &ptPos1.x, &ptPos2.x);
sub_vectors(&vac.x, &ptPos1.x, &ptPos3.x);
sub_vectors(&vad.x, &ptPos1.x, &ptPos4.x);
if (vec_length(&vab.x) > (2000.f / (PP_SIZE_CARTOG_SCALE * m_pIniSet->nMeridians))) { continue; }
if (vec_length(&vac.x) > (2000.f / (PP_SIZE_CARTOG_SCALE * m_pIniSet->nMeridians))) { continue; }
if (vec_length(&vad.x) > (2000.f / (PP_SIZE_CARTOG_SCALE * m_pIniSet->nMeridians))) { continue; }
}
point3d vtZ = { 0.f, 0.f, 0.00095f };
if ((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)) {
// transform_point(&vtZ, &vtZ, &m_pScene->m_mtCartho);
}
/*
if (m_pIniSet->nDrawMode != PP_2D_PLOT) {
add_vectors(&ptPos1.x, &ptPos1.x, &vtZ.x);
add_vectors(&ptPos2.x, &ptPos2.x, &vtZ.x);
add_vectors(&ptPos3.x, &ptPos3.x, &vtZ.x);
add_vectors(&ptPos4.x, &ptPos4.x, &vtZ.x);
}
*/
if (m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) {
scale_vect(&ptPos1.x, 0.999f); // hack to draw Wires well looking.
scale_vect(&ptPos2.x, 0.999f);
scale_vect(&ptPos3.x, 0.999f);
scale_vect(&ptPos4.x, 0.999f);
}
if (m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) {
if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_OFF) {
glBegin(GL_TRIANGLES);
glVertex3fv(&ptPos1.x);
glVertex3fv(&ptPos2.x);
glVertex3fv(&ptPos3.x);
glVertex3fv(&ptPos1.x);
glVertex3fv(&ptPos3.x);
glVertex3fv(&ptPos4.x);
glEnd();
}
if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH_BRIGHT) {
glColor4f(1.f, 1.f, 1.f, m_pIniSet->fGlobeTrasparent);
glBindTexture(GL_TEXTURE_2D, m_nEarthBright);
glEnable(GL_TEXTURE_2D);
glBegin(GL_TRIANGLES);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos1.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos2.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos3.x);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos1.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos3.x);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos4.x);
glEnd();
}
if (m_pIniSet->m_nGlobeEarthMode == VS_GLOBE_EARTH) {
glColor4f(1.f, 1.f, 1.f, m_pIniSet->fGlobeTrasparent);
glBindTexture(GL_TEXTURE_2D, m_nEarth);
glEnable(GL_TEXTURE_2D);
glBegin(GL_TRIANGLES);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos1.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos2.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos3.x);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos1.x);
glTexCoord2f(float(jx + 1) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos3.x);
glTexCoord2f(float(jx) / float(TranformGlobe.SizeX() — 1), float(ix + 1) / float(TranformGlobe.SizeY() — 1));
glVertex3fv(&ptPos4.x);
glEnd();
}
}
}
}
/* if (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) {
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
if (m_pIniSet->nDrawMode == PP_2D_PLOT) {
glBegin(GL_QUADS);
glVertex3f(fMinX, fMinY, -0.01f);
glVertex3f(fMinX, fMaxY, -0.01f);
glVertex3f(fMaxX, fMaxY, -0.01f);
glVertex3f(fMaxX, fMinY, -0.01f);
glEnd();
}
else {
glBegin(GL_QUADS);
glVertex3f(fMinX, fMinY, 0.f);
glVertex3f(fMinX, fMaxY, 0.f);
glVertex3f(fMaxX, fMaxY, 0.f);
glVertex3f(fMaxX, fMinY, 0.f);
glEnd();
}
}
*/
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
// glCullFace(GL_BACK);
// glDisable(GL_CULL_FACE);
}
if ((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pIniSet->bCheckCarthoCylinderMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && !m_pIniSet->bCheckCarthoCylinderMode) {
// if ((m_pIniSet->bCheckCarthoMode || m_pIniSet->bCheckCarthoFixedMode || m_pScene->IsCarthoMatrixRotated()) && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT) && !m_pIniSet->bCheckCarthoCylinderMode) {
glPopMatrix();
}
glEnable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
}
#define F80C_GRAD 87.f / PP_SIZE_CARTOG_SCALE
#define F80M_GRAD 139.5967f / PP_SIZE_CARTOG_SCALE
#define F190C_GRAD 180.f / PP_SIZE_CARTOG_SCALE
#define F90M_GRAD 139.5967f / PP_SIZE_CARTOG_SCALE
void CMercatorGlobe::Map_Line_Draw(point3d *p1, point3d *p2, CColor24 *pCol1, CColor24 *pCol2)
{
// if (m_pIniSet->bGlobeMode == WS_INVISIBLE) { return; }
if (m_pIniSet->bGlobeSkinMode == WS_INVISIBLE && m_pIniSet->bGlobeMode == WS_TRANSPARENT) {
return;
}
glDisable(GL_LIGHTING);
if(m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) {
// This part of code draw Globe in a space
if(m_pIniSet->nDrawMode == PP_2D_PLOT){
if((m_pIniSet->nViewMode == PP_GLOBE_PLOT) || (m_pIniSet->nViewMode == PP_FACTOR_PLOT)){
if(!m_pIniSet->bAseExport){
// *p1 = m_pScene->ConvertPos2D(*p1);
// *p2 = m_pScene->ConvertPos2D(*p2);
}
}
}
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}
return;
}
if(m_pIniSet->bCheckCarthoCylinderMode && (m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT)){
BOOL b2Line = FALSE;
point3d vtVec;
sub_vectors(&vtVec.x, &p1->x, &p2->x);
if(fabs(p1->x — p2->x) > (720.f / (PP_SIZE_CARTOG_SCALE * m_pIniSet->nMeridians)))
{
b2Line = TRUE;
}
if(b2Line){ return; }
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}
return;
}
if(m_pIniSet->nViewMode2d == PP_QUINCUNCIAL_MAP){
// This part of code draw Globe in the Quincuctial map
Quinc_Line_Draw(p1, p2, pCol1, pCol2);
return;
}
if(m_pIniSet->bAnimationMap){
// This part of code draw transformation of globe from a space into the map
if(fabs(p1->x — p2->x) > (100.f / PP_SIZE_CARTOG_SCALE)) return;
if((bFl_Point1 & FF_ON_MAP)!=(bFl_Point2 & FF_ON_MAP)){
if(p1->x < 0.f) return;
if(p2->x < 0.f) return;
}
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}
return;
}
point3d p12, p21;
p21.x = p2->x;
p21.y = p2->y;
p21.z = p2->z;
p12.z = p1->z;
float f80 = F80C_GRAD;
if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP) { f80 = F80M_GRAD; }
if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70) { f80 = F80M_GRAD; }
if(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_ENHANC){
f80 = 180.f / m_pScene->pixel_sz / PP_SIZE_CARTOG_SCALE;
}
BOOL b2Line = FALSE;
if(fabs(p1->x — p21.x) > (181.f / PP_SIZE_CARTOG_SCALE) )
{
b2Line = TRUE;
if(p21.x > 0.f) p21.x -= (360.f / PP_SIZE_CARTOG_SCALE);
else p21.x += (360.f / PP_SIZE_CARTOG_SCALE);
}
if(b2Line){
// if points of line is on different sides of map,
// then need to draw two line.
float f180 = 180.f / PP_SIZE_CARTOG_SCALE;
float f90 = 90.f / PP_SIZE_CARTOG_SCALE;
if((m_pIniSet->nViewMode2d == PP_MERCATOR_MAP)||(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_70)||(m_pIniSet->nViewMode2d == PP_MERCATOR_MAP_ENHANC))
{ f90 = F80M_GRAD; }
p12.x = p21.x;
p12.y = p21.y;
if(p21.x > f180){
p12.y = p21.y = p1->y + (p21.y — p1->y) * (f180 — p1->x) / (p21.x — p1->x);
p21.x = f180;
}
if(p21.x < -f180){
p12.y = p21.y = p1->y + (p21.y — p1->y) * (-f180 — p1->x) / (p21.x — p1->x);
p21.x = -f180;
}
p12.x = -p21.x;
if((fabs(p1->x — p21.x) < f180)&&(fabs(p1->y — p21.y) < f90)){
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glVertex3fv(&p21.x);
*p2 = p21;
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = p21;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p21.x);
*p2 = p21;
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = p21;
// arrLines.Append(sLine1);
glEnd();
}
}
if((fabs(p2->x — p12.x) < f180)&&(fabs(p2->y — p12.y) < f90)){
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
glVertex3fv(&p12.x);
*p1 = p12;
sLine sLine1;
sLine1.ptPos1 = *p2;
sLine1.ptPos2 = p12;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p2->x);
glVertex3fv(&p12.x);
*p1 = p12;
sLine sLine1;
sLine1.ptPos1 = *p2;
sLine1.ptPos2 = p12;
// arrLines.Append(sLine1);
glEnd();
}
}
}
else{
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}else{
glBegin(GL_LINE_STRIP);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);
sLine sLine1;
sLine1.ptPos1 = *p1;
sLine1.ptPos2 = *p2;
// arrLines.Append(sLine1);
glEnd();
}
}
}
void CMercatorGlobe::TransToMap(point3d *pPoint)
{
if(m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) {
// This part of code draw Globe in a space
if(m_pIniSet->nDrawMode == PP_2D_PLOT){
if((m_pIniSet->nViewMode == PP_GLOBE_PLOT) || (m_pIniSet->nViewMode == PP_FACTOR_PLOT)){
return;
}
}
}
// transform_point(pPoint, pPoint, &m_pScene->m_mtCartho);
switch(m_pIniSet->nViewMode2d) {
case PP_CARTOGRAPH_MAP:
case PP_MERCATOR_MAP_70:
case PP_MERCATOR_MAP:
case PP_MERCATOR_MAP_ENHANC: TransToGeod(pPoint); break;
case PP_QUINCUNCIAL_MAP: TransToQuinc(pPoint); break;
}
}
#define FF_IS_CALC 128
#define FF_TR_EXT 64
#define FF_TR_X_Y 32
#define FF_TR_BOTTM 16
#define FF_TR_LEFT 8
void CMercatorGlobe::TransToQuinc(point3d *pPoint)
{
if(m_pIniSet->nViewMode != PP_CARTOGRAPHIC_PLOT) return;
// Transform from cartesian position to Quincunc position
float fX = pPoint->y;
float fY = pPoint->x;
float fZ = pPoint->z;// yes: zxy
float fP = sqrt(fX * fX + fY * fY);
float fFi, fGm = atan2(fY , fX);// (-pi..pi)
if((fY == 0.f)&&(fX == 0.f)) fGm = 0.f;// Formulas received from [1]
fFi = atan( fZ / fP );//(-pi/2..pi/2)
fFi = RadToDeg(fFi);// fFi and fGm is cartographic coordinates.
fGm = RadToDeg(fGm);// fFi (-90..90), fgm (-180..180)
bFl_Point2 = bFl_Point1; // kind of triangle of second point
bFl_Point1 = 0; // Clear flages of first point
// folding of map into the triangle:
if(fFi <= 0.f) {
bFl_Point1 |= FF_TR_EXT; //the point is on external triangles
fFi = 90.f + fFi;
}
else { fFi = 90.f — fFi; }
if(fGm <= 0.f) {
bFl_Point1 |= FF_TR_LEFT; //the point is on left triangles
fGm = -fGm;
}
if(fGm >= 90.f) {
bFl_Point1 |= FF_TR_BOTTM; //the point is on bottom triangles
fGm = 180.f — fGm;
}
if(fGm <= 45.f){
bFl_Point1 |= FF_TR_X_Y; // GetQiuncApr will return X and Y
fGm = 90.f — fGm;
}
// End of folding of map into the triangle
GetQiuncApr(fFi, fGm); //Transform in the point of triangle
float fQx, fQy;
// unrolling of map from the triangle:
if(bFl_Point1 & FF_TR_EXT){
if(bFl_Point1 & FF_TR_X_Y){
fQx = 1.f — fGm;
fQy = 1.f — fFi;
}
else{
fQx = 1.f — fFi;
fQy = 1.f — fGm;
}
}
else{
if(bFl_Point1 & FF_TR_X_Y){
fQx = fFi;
fQy = fGm;
}
else{
fQx = fGm;
fQy = fFi;
}
}
if(bFl_Point1 & FF_TR_BOTTM){ fQy = -fQy; }
if(bFl_Point1 & FF_TR_LEFT){ fQx = -fQx; }
// end of unrolling of map from the triangle
if(m_pIniSet->bAnimationMap){
// This part of code implemented for animation
float fMult = m_pScene->fAnimal_Angle / 360.f;
pPoint->y = fQy * 180.f / PP_SIZE_CARTOG_SCALE * (1 — fMult) +
fMult * pPoint->y;
pPoint->x = fQx * 180.f / PP_SIZE_CARTOG_SCALE * (1 — fMult) +
fMult * pPoint->x;
//f2Rad = (1 — fMult) * fRadius * 2.f + fMult * 180.f / PP_SIZE_CARTOG_SCALE;
pPoint->z = (1 — fMult) * m_pIniSet->nSpaceCubeSize + fMult * pPoint->z;
}
else{
pPoint->y = fQy * 180.f / PP_SIZE_CARTOG_SCALE;
pPoint->x = fQx * 180.f / PP_SIZE_CARTOG_SCALE;
pPoint->z = 0.f;
}
// bFl_Point1 = 0;
}
void CMercatorGlobe::GetQiuncApr(float &fFiX, float &fAlY)
{
// Quincuncipial map consist of 16 triangles.
// This procedure calculate coordinates of point in triangle,
// This triangle rotated around map on 45 grad
// Before call in this procedure, you need to define of this triangle.
if((fFiX > 90.f)||(fFiX < 0.f)){
AfxMessageBox("Quincipial not correct");
return; // Data is not correct
}
if((fAlY > 90.f)||(fAlY < 45.f)){
AfxMessageBox("Quincipial not correct");
return; // Data is not correct
}
if(fAlY > 89.999f){ float fF = 89.999f; }
float fKsi = tan(DegToRad(fAlY));
fKsi -= ( 1.f + log(1 / fKsi) );
float fMy = tan(DegToRad(fAlY)) / fKsi;
fFiX /= 90.f;
float fUm = exp( (fFiX — 1.f) * 3.f);
float fUm2 = exp( (fFiX — 1.f) * 6.f);
float fY90 = (fMy — 1 / fKsi) * fUm + (1.f — fUm) / 1.4142135f;
fAlY = fFiX * fY90 * (fUm + (1.f — fUm) * sin(DegToRad(fAlY)) );
fFiX = -log( 1.f — fAlY / fMy ) / fKsi;
return;
}
void CMercatorGlobe::Quinc_Line_Draw(point3d *p1, point3d *p2, CColor24 *pCol1, CColor24 *pCol2)
{
glDisable(GL_LIGHTING);
// bFl_Point1 = bFl_Point2 = 0;
if(bFl_Point1 != bFl_Point2){
if((bFl_Point1 & FF_TR_EXT)&(bFl_Point2 & FF_TR_EXT)){
if((bFl_Point1 & FF_TR_LEFT)==(bFl_Point2 & FF_TR_LEFT)){
if((bFl_Point1 & FF_TR_BOTTM)!=(bFl_Point2 & FF_TR_BOTTM)){
if((p1->y != 0.f)&&(p2->y != 0.f)){
if(m_pIniSet->bAnimationMap){
point3d p12, p21;
if(bFl_Point1 & FF_TR_LEFT){p12.x = p21.x = -180.f / PP_SIZE_CARTOG_SCALE; }
else{ p12.x = p21.x = 180.f / PP_SIZE_CARTOG_SCALE; }
float fm1 = (p21.x — p1->x) / (p21.x * 2 — p1->x — p2->x);
float fm2 = (p21.x — p2->x) / (p21.x * 2 — p1->x — p2->x);
p12.y = p1->y + (-p2->y — p1->y) * fm1;
p21.y = p2->y + (-p1->y — p2->y) * fm2;
p12.z = p21.z = 0.f;
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glVertex3fv(&p12.x);
glEnd();
glBegin(GL_LINE_STRIP);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
glVertex3fv(&p21.x);
glEnd();
return;
}else{
glBegin(GL_LINES);
glVertex3fv(&p1->x);
glVertex3fv(&p12.x);
glEnd();
glBegin(GL_LINES);
glVertex3fv(&p2->x);
glVertex3fv(&p21.x);
glEnd();
return;
}
}
}
}
}
if((bFl_Point1 & FF_TR_BOTTM)==(bFl_Point2 & FF_TR_BOTTM)){
if((bFl_Point1 & FF_TR_LEFT)!=(bFl_Point2 & FF_TR_LEFT)){
if((p1->x != 0.f)&&(p2->x != 0.f)){
if(m_pIniSet->bAnimationMap){
point3d p12, p21;
if(bFl_Point1 & FF_TR_BOTTM){p12.y = p21.y = -180.f / PP_SIZE_CARTOG_SCALE; }
else{ p12.y = p21.y = 180.f / PP_SIZE_CARTOG_SCALE; }
float fm1 = (p21.y — p1->y) / (p21.y * 2 — p1->y — p2->y);
float fm2 = (p21.y — p2->y) / (p21.y * 2 — p1->y — p2->y);
p12.x = p1->x + (-p2->x — p1->x) * fm1;
p21.x = p2->x + (-p1->x — p2->x) * fm2;
p12.z = p21.z = 0.f;
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glVertex3fv(&p12.x);
glEnd();
glBegin(GL_LINE_STRIP);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
glVertex3fv(&p21.x);
glEnd();
return;
}else{
glBegin(GL_LINES);
glVertex3fv(&p1->x);
glVertex3fv(&p12.x);
glEnd();
glBegin(GL_LINES);
glVertex3fv(&p2->x);
glVertex3fv(&p21.x);
glEnd();
return;
}
}
}
}
}
if((bFl_Point1 & FF_TR_BOTTM)!=(bFl_Point2 & FF_TR_BOTTM)){
if((bFl_Point1 & FF_TR_LEFT)!=(bFl_Point2 & FF_TR_LEFT)){
return;
}
}
} // end ext
} //end (bFl_Point1 != bFl_Point2)
point3d vtSub;
sub_vectors(&vtSub.x, &p2->x, &p1->x);
float fLen = vec_length(&vtSub.x);
if (fLen > 180.f / PP_SIZE_CARTOG_SCALE / 2.f) {
if (p2->x < 0.f && p2->y < 0.f && fabs(p2->x) < fabs(p2->y)) { // 1
p2->y = -180.f / PP_SIZE_CARTOG_SCALE;
p2->x = p1->x;
goto End;
}
if (p2->x < 0.f && p2->y < 0.f && fabs(p2->x) > fabs(p2->y)) { // 2
p2->x = -180.f / PP_SIZE_CARTOG_SCALE;
p2->y = p1->y;
goto End;
}
if (p2->x > 0.f && p2->y < 0.f && fabs(p2->x) > fabs(p2->y)) { // 3
p2->x = 180.f / PP_SIZE_CARTOG_SCALE;
p2->y = p1->y;
goto End;
}
if (p2->x > 0.f && p2->y > 0.f && fabs(p2->x) < fabs(p2->y)) { // 4
p2->y = 180.f / PP_SIZE_CARTOG_SCALE;
p2->x = p1->x;
goto End;
}
if (p2->x < 0.f && p2->y > 0.f && fabs(p2->x) > fabs(p2->y)) { // 5
p2->x = -180.f / PP_SIZE_CARTOG_SCALE;
p2->y = p1->y;
goto End;
}
if (p2->x < 0.f && p2->y > 0.f && fabs(p2->x) < fabs(p2->y)) { // 6
p2->y = 180.f / PP_SIZE_CARTOG_SCALE;
p2->x = p1->x;
goto End;
}
if (p2->x > 0.f && p2->y < 0.f && fabs(p2->x) < fabs(p2->y)) { // 7
p2->y = -180.f / PP_SIZE_CARTOG_SCALE;
p2->x = p1->x;
goto End;
}
if (p2->x > 0.f && p2->y > 0.f && fabs(p2->x) > fabs(p2->y)) { //8
p2->x = 180.f / PP_SIZE_CARTOG_SCALE;
p2->y = p1->y;
goto End;
}
}
End:
sub_vectors(&vtSub.x, &p2->x, &p1->x);
fLen = vec_length(&vtSub.x);
if (fLen >= 180.f / PP_SIZE_CARTOG_SCALE) { return; }
if(m_pIniSet->nGlobeLinesMode == WS_GRADIENT_COLOR && pCol1 && pCol2 ){
glBegin(GL_LINE_STRIP);
glColor3fv(pCol1->toFloatColor());
glVertex3fv(&p1->x);
glColor3fv(pCol2->toFloatColor());
glVertex3fv(&p2->x);
glEnd();
}else{
glBegin(GL_LINES);
glVertex3fv(&p1->x);
glVertex3fv(&p2->x);
glEnd();
}
}
void CMercatorGlobe::CalcObjectProjectColor()
{
int ix, sz = m_pScene->m_parrObjs.Size();
for(ix = 0; ix < sz; ix++){
CObj3d *pObj = m_pScene->m_parrObjs.e(ix);
pObj->pcGlobeColor = NULL;
point3d ptPos11 = pObj->ptConstantPos;
norm_vect(&ptPos11.x);
scale_vect(&ptPos11.x, &ptPos11.x, m_pScene->GetGlobeSize());
point3d ptPos22 = {0.f, 0.f, 0.f};
point3d vtVect;
sub_vectors(&vtVect.x, &ptPos11.x, &ptPos22.x);
BOOL bFound = FALSE;
for(int kx = 0; kx < Globe.SizeX() — 1; kx++){
for(int mx = 0; mx < Globe.SizeY() — 1; mx++){
point3d ptPos1 = Globe.e(kx, mx);
point3d ptPos2 = Globe.e(kx + 1, mx);
point3d ptPos3 = Globe.e(kx + 1, mx + 1);
point3d ptPos4 = Globe.e(kx, mx + 1);
plane plPlane1, plPlane2;
comp_plane_eqn(&plPlane1.a, &ptPos1.x, &ptPos2.x, &ptPos3.x);
comp_plane_eqn(&plPlane2.a, &ptPos1.x, &ptPos3.x, &ptPos4.x);
point3d ptRes1, ptRes2, vtVect1, vtVect2;
cross_line_plane(vtVect, &plPlane1.a, ptPos11, ptRes1);
cross_line_plane(vtVect, &plPlane2.a, ptPos11, ptRes2);
sub_vectors(&vtVect1.x, &ptPos11.x, &ptRes1.x);
if(vec_length(&vtVect1.x) < m_pScene->GetGlobeSize()){
if(point_in_triangle(ptPos1, ptPos2, ptPos3, ptRes1)){
pObj->pcGlobeColor = &m_pIniSet->m_mtGlobeColors.e(kx, mx);
bFound = TRUE;
break;
}
}
sub_vectors(&vtVect2.x, &ptPos11.x, &ptRes2.x);
if(vec_length(&vtVect2.x) < m_pScene->GetGlobeSize()){
if(point_in_triangle(ptPos1, ptPos3, ptPos4, ptRes2)){
pObj->pcGlobeColor = &m_pIniSet->m_mtGlobeColors.e(kx + 1, mx + 1);
bFound = TRUE;
break;
}
}
} //mx
if(bFound){
break;
}
}// kx
}//
}
void CMercatorGlobe::CalcObjectProjectPoints(point3d ptCenter, float fMaxLength)
{
int ix, sz = m_pScene->m_parrObjs.Size();
for(ix = 0; ix < sz; ix++){
CObj3d *pObj = m_pScene->m_parrObjs.e(ix);
point3d ptPos11 = pObj->ptConstantPos;
norm_vect(&ptPos11.x);
scale_vect(&ptPos11.x, &ptPos11.x, m_pScene->GetGlobeSize());
point3d ptPos22 = {0.f, 0.f, 0.f};
point3d vtVect;
sub_vectors(&vtVect.x, &ptPos11.x, &ptPos22.x);
BOOL bFound = FALSE;
for(int kx = 0; kx < Globe.SizeX() — 1; kx++){
for(int mx = 0; mx < Globe.SizeY() — 1; mx++){
point3d ptPos1 = Globe.e(kx, mx);
point3d ptPos2 = Globe.e(kx + 1, mx);
point3d ptPos3 = Globe.e(kx + 1, mx + 1);
point3d ptPos4 = Globe.e(kx, mx + 1);
plane plPlane1, plPlane2;
comp_plane_eqn(&plPlane1.a, &ptPos1.x, &ptPos2.x, &ptPos3.x);
comp_plane_eqn(&plPlane2.a, &ptPos1.x, &ptPos3.x, &ptPos4.x);
point3d ptRes1, ptRes2, vtVect1, vtVect2;
cross_line_plane(vtVect, &plPlane1.a, ptPos11, ptRes1);
cross_line_plane(vtVect, &plPlane2.a, ptPos11, ptRes2);
sub_vectors(&vtVect1.x, &ptPos11.x, &ptRes1.x);
if(vec_length(&vtVect1.x) < m_pScene->GetGlobeSize()){
if(point_in_triangle(ptPos1, ptPos2, ptPos3, ptRes1)){
transform_point(&ptRes1, &ptRes1, &m_pScene->m_mtMatrix);
TransToMap(&ptRes1);
pObj->m_ptCylinder1 = TransformCylinderPoint(ptRes1, ptCenter, fMaxLength);
point3d ptP1 = TranformGlobe.e(kx, mx);
point3d ptP2 = TranformGlobe.e(kx + 1, mx);
point3d ptP3 = TranformGlobe.e(kx + 1, mx + 1);
comp_plane_eqn(&plPlane1.a, &ptP1.x, &ptP2.x, &ptP3.x);
norm_vect(&plPlane1.a);
scale_vect(&plPlane1.a, pObj->m_fCarthoLen);
add_vectors(&pObj->m_ptCylinder2.x, &pObj->m_ptCylinder1.x, &plPlane1.a);
if(m_pIniSet->nDrawMode != PP_2D_PLOT){
// transform_back_point(&pObj->m_ptCylinder1, &pObj->m_ptCylinder1, &m_pScene->m_mtCartho);
// transform_back_point(&pObj->m_ptCylinder2, &pObj->m_ptCylinder2, &m_pScene->m_mtCartho);
transform_back_point(&pObj->m_ptCylinder1, &pObj->m_ptCylinder1, &m_pIniSet->mtCylinderMode);
transform_back_point(&pObj->m_ptCylinder2, &pObj->m_ptCylinder2, &m_pIniSet->mtCylinderMode);
}
bFound = TRUE;
break;
}
}
sub_vectors(&vtVect2.x, &ptPos11.x, &ptRes2.x);
if(vec_length(&vtVect2.x) < m_pScene->GetGlobeSize()){
if(point_in_triangle(ptPos1, ptPos3, ptPos4, ptRes2)){
transform_point(&ptRes2, &ptRes2, &m_pScene->m_mtMatrix);
TransToMap(&ptRes2);
pObj->m_ptCylinder1 = TransformCylinderPoint(ptRes2, ptCenter, fMaxLength);
point3d ptP1 = TranformGlobe.e(kx, mx);
point3d ptP2 = TranformGlobe.e(kx + 1, mx + 1);
point3d ptP3 = TranformGlobe.e(kx, mx + 1);
comp_plane_eqn(&plPlane1.a, &ptP1.x, &ptP2.x, &ptP3.x);
norm_vect(&plPlane1.a);
scale_vect(&plPlane1.a, pObj->m_fCarthoLen);
add_vectors(&pObj->m_ptCylinder2.x, &pObj->m_ptCylinder1.x, &plPlane1.a);
if(m_pIniSet->nDrawMode != PP_2D_PLOT){
// transform_back_point(&pObj->m_ptCylinder1, &pObj->m_ptCylinder1, &m_pScene->m_mtCartho);
// transform_back_point(&pObj->m_ptCylinder2, &pObj->m_ptCylinder2, &m_pScene->m_mtCartho);
transform_back_point(&pObj->m_ptCylinder1, &pObj->m_ptCylinder1, &m_pIniSet->mtCylinderMode);
transform_back_point(&pObj->m_ptCylinder2, &pObj->m_ptCylinder2, &m_pIniSet->mtCylinderMode);
}
bFound = TRUE;
break;
}
}
} //mx
if(bFound){
break;
}
}// kx
// pObj->Transform();
// pObj->Draw();
}//
}
point3d CMercatorGlobe::TransformCylinderPoint(point3d &ptPos, point3d &ptCenter, float fMaxLength)
{
matrix mtMatr;
float fLen = (ptPos.x — ptCenter.x);
ident_matrix(&mtMatr);
float fDelta = fLen / fMaxLength;
float fDelta1 = fLen / fMaxLength;
rotate_matrix(&mtMatr, 0.f, PI_LB * fDelta, 0.f);
point3d ptVect = { 0.f, 0.f, — 1.f };
point3d ptPoint = { 0.f, 0.f, 0.f };
transform_point(&ptVect, &ptVect, &mtMatr);
add_vectors(&ptPoint.x, &ptPoint.x, &ptVect.x);
ptPos.x = ptPoint.x;
ptPos.z = -ptPoint.z;
return ptPos;
}
void CMercatorGlobe::CreateASEFile(FILE *pFile, int nMaterial)
{
/* for(int ix = 0; ix < arrTriangles.Size(); ix++){
sTriangle sTriangle1 = arrTriangles.e(ix);
point3d v[3];
v[0] = sTriangle1.ptPos1;
v[1] = sTriangle1.ptPos2;
v[2] = sTriangle1.ptPos3;
if(m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT){
transform_point(&v[0], &v[0], &m_pIniSet->mtAseExport);
transform_point(&v[1], &v[1], &m_pIniSet->mtAseExport);
transform_point(&v[2], &v[2], &m_pIniSet->mtAseExport);
}
face_t f[1] = {{0, 1, 2}};
char buff[MAX_PATH];
sprintf(buff, "Globe %d,", ix);
// m_pScene->SaveASEGeomObject(pFile, buff, v, 3, f, 1, nMaterial + ix);
}
int ijk = 1000289;
for(int ix = 0; ix < arrLines.Size(); ix ++, ijk++){
sLine sLine1 = arrLines.e(ix);
if(m_pIniSet->nViewMode == PP_CARTOGRAPHIC_PLOT){
transform_point(&sLine1.ptPos1, &sLine1.ptPos1, &m_pIniSet->mtAseExport);
transform_point(&sLine1.ptPos2, &sLine1.ptPos2, &m_pIniSet->mtAseExport);
}
fprintf(pFile, "*SHAPEOBJECT {\n\
*NODE_NAME \"Line2%d\"\n", ijk);
fprintf(pFile, " *NODE_TM {\n\
*NODE_NAME \"Line3%d\"\n", ijk);
fprintf(pFile, " *INHERIT_POS 0 0 0\n\
*INHERIT_ROT 0 0 0\n\
*INHERIT_SCL 0 0 0\n\
*TM_ROW0 1.0000 0.0000 0.0000\n\
*TM_ROW1 0.0000 -0.0000 1.0000\n\
*TM_ROW2 0.0000 -1.0000 -0.0000\n\
*TM_ROW3 -28.3525 0.0000 -13.4100\n\
*TM_POS -28.3525 0.0000 -13.4100\n\
*TM_ROTAXIS -1.0000 0.0000 0.0000\n\
*TM_ROTANGLE 1.5708\n\
*TM_SCALE 1.0000 1.0000 1.0000\n\
*TM_SCALEAXIS 0.0000 0.0000 0.0000\n\
*TM_SCALEAXISANG 0.0000\n\
}\n\
*SHAPE_LINECOUNT 1\n\
*SHAPE_LINE 0 {\n\
*SHAPE_VERTEXCOUNT 2\n\
*SHAPE_VERTEX_KNOT 0 %f %f %f\n", sLine1.ptPos1.x, sLine1.ptPos1.y, sLine1.ptPos1.z);
fprintf(pFile, " *SHAPE_VERTEX_KNOT 1 %f %f %f\n }\n}\n", sLine1.ptPos2.x, sLine1.ptPos2.y, sLine1.ptPos2.z);
}*/
}
void CMercatorGlobe::CreateASEMaterials(FILE *pFile, int nMaterial)
{/*
for(int ix = 0; ix < arrTriangles.Size(); ix++){
sTriangle sTriangle1 = arrTriangles.e(ix);
CColor24 col = sTriangle1.cCol;
float fTransp = sTriangle1.fTransp;
fprintf(pFile, " *MATERIAL %d {\n", ix + nMaterial);
fprintf(pFile, " *MATERIAL_NAME \"Material #%d\"\n", ix + nMaterial);
fprintf(pFile, " *MATERIAL_CLASS \"Multi/Sub-Object\"\n\
*MATERIAL_AMBIENT %f %f %f\n", col.R(), col.G(), col.B());
fprintf(pFile, " *MATERIAL_DIFFUSE %f %f %f\n", col.R(), col.G(), col.B());
fprintf(pFile, " *MATERIAL_SPECULAR 1.0000 1.0000 1.0000\n\
*MATERIAL_SHINE 0.5000\n\
*MATERIAL_SHINESTRENGTH 0.0000\n\
*MATERIAL_TRANSPARENCY %f\n", fTransp);
fprintf(pFile, " *MATERIAL_WIRESIZE 1.0000\n\
*NUMSUBMTLS 0\n\
}\n");
}
*/
}