From 414d8aed6506b08512972bf6221f8f04c8906b5b Mon Sep 17 00:00:00 2001 From: nathan Date: Wed, 26 Feb 2020 22:44:30 -0800 Subject: [PATCH] changed doubles to float. wrote out mapdata.bin and read in, this is still hacky, but compiles faster now Former-commit-id: 59f44288ca1838e89e1f8c7463e88e91d5252c4b Former-commit-id: 8894cdb766d205bf630d4de44701894a53b95b12 --- Makefile | 6 +- README.md | 4 + TODO.md | 37 ++++ allstates.c.REMOVED.git-id | 1 - allstates.o.REMOVED.git-id | 1 - android_notes | 21 ++ draw.c | 84 ++++---- draw.o.REMOVED.git-id | 2 +- font.o | Bin 37856 -> 37912 bytes init.o | Bin 48464 -> 48520 bytes input.o.REMOVED.git-id | 2 +- list.o | Bin 48344 -> 48400 bytes map_conversion/README.md | 21 ++ map_conversion/a.out.REMOVED.git-id | 1 + map_conversion/allstates.c.REMOVED.git-id | 1 + map_conversion/data.REMOVED.git-id | 1 + map_conversion/write2bin.c | 12 ++ mapconversion.xlsx.REMOVED.git-id | 1 - mapdata.bin.REMOVED.git-id | 1 + mapdata.c | 237 ++++++++++++++++++++++ mapdata.c.REMOVED.git-id | 1 - mapdata.h | 26 +-- mapdata.o | Bin 25608 -> 26408 bytes monokai.o | Bin 27848 -> 27904 bytes planeObj.o | Bin 44392 -> 44504 bytes status.o.REMOVED.git-id | 2 +- structs.h | 12 +- view1090.REMOVED.git-id | 2 +- view1090.o.REMOVED.git-id | 2 +- 29 files changed, 406 insertions(+), 72 deletions(-) create mode 100644 TODO.md delete mode 100644 allstates.c.REMOVED.git-id delete mode 100644 allstates.o.REMOVED.git-id create mode 100644 android_notes create mode 100644 map_conversion/README.md create mode 100644 map_conversion/a.out.REMOVED.git-id create mode 100644 map_conversion/allstates.c.REMOVED.git-id create mode 100644 map_conversion/data.REMOVED.git-id create mode 100644 map_conversion/write2bin.c delete mode 100644 mapconversion.xlsx.REMOVED.git-id create mode 100644 mapdata.bin.REMOVED.git-id create mode 100644 mapdata.c delete mode 100644 mapdata.c.REMOVED.git-id diff --git a/Makefile b/Makefile index cb47954..41e0aea 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ EXTRACFLAGS=-DHTMLPATH=\"$(SHAREDIR)\" endif CFLAGS=-O2 -g -Wall -W -LIBS=-lm -lSDL2 -lSDL2_ttf -lSDL2_gfx +LIBS=-lm -lSDL2 -lSDL2_ttf -lSDL2_gfx CC=gcc all: view1090 @@ -19,8 +19,8 @@ all: view1090 %.o: %.c $(CC) $(CFLAGS) $(EXTRACFLAGS) -c $< -view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o allstates.o - $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o allstates.o $(LIBS) $(LDFLAGS) +view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o + $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o $(LIBS) $(LDFLAGS) clean: rm -f *.o view1090 diff --git a/README.md b/README.md index a1eacc5..a36c562 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,10 @@ cd spidr ###HARDWARE +Right now, Pixel 2 is $109 on Amazon (https://www.amazon.com/Google-Pixel-64-Black-Refurbished/dp/B0787V183F). +This significantly outperforms a rpi4. + + best option seems to be pi4 + pijuice zero (w/ rewired i2c) + hyperpixel 4. RTLSDR (stratux) sticks down or needs u shaped adapter. For future tuner, need to test audio phat w/ little speaker, i2c knob, etc. diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..77c2b56 --- /dev/null +++ b/TODO.md @@ -0,0 +1,37 @@ +todo + + + + +UI stuff + +tap on plane sets plane to active + +animated recenter to active + +toggle follow and orient (and other popup info?) +double tap to zoom +animated label show and hide + +draw map to texture and only redraw on move +color themes (requires settings load) +settings (button popups or panes, sliders, etc) +battery level (need separate linux/win/android) + + +Utility stuff +zipped map load (and write from python) --> start by reducing lat/lon precision to 4 or 5 decimal places and change storage to float instead of double +libconfig load settings + +Platforms +migrate Android project into main repo +SDL_AndroidGetJNIEnv() to access parameters, system info, etc +windows + + + + + + + +naming + +viz1090 +map1090 +sdl1090 \ No newline at end of file diff --git a/allstates.c.REMOVED.git-id b/allstates.c.REMOVED.git-id deleted file mode 100644 index 9bbece1..0000000 --- a/allstates.c.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -e1983f2439326aba30a2576504aac03b2f3cd2fc \ No newline at end of file diff --git a/allstates.o.REMOVED.git-id b/allstates.o.REMOVED.git-id deleted file mode 100644 index 76f110e..0000000 --- a/allstates.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -9bee8f55a87c0c25e624b913e8e728619074d9ee \ No newline at end of file diff --git a/android_notes b/android_notes new file mode 100644 index 0000000..6778a50 --- /dev/null +++ b/android_notes @@ -0,0 +1,21 @@ +Android build notes + +This example works: +https://github.com/pvallet/hello-sdl2-android + +the only JDK that seems to work is oracle-java8-installer, discontinued but available as of 2/18/2020 from +sudo add-apt-repository ppa:ts.sch.gr/ppa +sudo apt-get update +sudo apt-get install oracle-java8-installer +per https://askubuntu.com/questions/1139387/update-to-latest-version-of-java-after-ppa-is-discontinued + +SDL2, SDL2_gfx, SDL2_ttf official need to go in external + +SDL2_gfx official doesn't have Android.mk, but this one does: + +https://github.com/keera-studios/SDL2_gfx + + +App parameters are in android/app/src/main/java/[pvallet/com/github/hellosdl2/helloSDL2Activity.java] (network access, fullscreen immersive mode" +Resources (fonts etc) need to go in android/app/src/main/res +build settings (arch, android version) are in android/AndroidManifest.xml AND android/SDL2/src/main/AndroidManifest.xml (not sure if the second one needs to be changed) \ No newline at end of file diff --git a/draw.c b/draw.c index 5c4f38f..e5a9da0 100644 --- a/draw.c +++ b/draw.c @@ -21,7 +21,7 @@ float sign(float x) { return (x > 0) - (x < 0); } -void CROSSVP(double *v, double *u, double *w) +void CROSSVP(float *v, float *u, float *w) { v[0] = u[1]*w[2] - u[2]*(w)[1]; v[1] = u[2]*w[0] - u[0]*(w)[2]; @@ -69,9 +69,9 @@ SDL_Color lerpColor(SDL_Color aColor, SDL_Color bColor, float factor) { return out; } -SDL_Color hsv2SDLColor(double h, double s, double v) +SDL_Color hsv2SDLColor(float h, float s, float v) { - double hh, p, q, t, ff; + float hh, p, q, t, ff; long i; SDL_Color out; @@ -127,9 +127,9 @@ SDL_Color hsv2SDLColor(double h, double s, double v) return out; } -int screenDist(double d) { +int screenDist(float d) { - double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; + float scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; if(appData.mapLogDist) { return round(0.95 * scale_factor * 0.5 * log(1.0+fabs(d)) / log(1.0+appData.maxDist)); @@ -138,7 +138,7 @@ int screenDist(double d) { } } -void pxFromLonLat(double *dx, double *dy, double lon, double lat) { +void pxFromLonLat(float *dx, float *dy, float lon, float lat) { if(!lon || !lat) { *dx = 0; *dy = 0; @@ -149,18 +149,18 @@ void pxFromLonLat(double *dx, double *dy, double lon, double lat) { *dy = 6371.0 * (lat - appData.centerLat) * M_PI / 180.0f; } -void latLonFromScreenCoords(double *lat, double *lon, int x, int y) { - double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; +void latLonFromScreenCoords(float *lat, float *lon, int x, int y) { + float scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; - double dx = appData.maxDist * (x - (appData.screen_width>>1)) / (0.95 * scale_factor * 0.5 ); - double dy = appData.maxDist * (y - (appData.screen_height * CENTEROFFSET)) / (0.95 * scale_factor * 0.5 ); + float dx = appData.maxDist * (x - (appData.screen_width>>1)) / (0.95 * scale_factor * 0.5 ); + float dy = appData.maxDist * (y - (appData.screen_height * CENTEROFFSET)) / (0.95 * scale_factor * 0.5 ); *lat = 180.0f * dy / (6371.0 * M_PI) + appData.centerLat; *lon = 180.0 * dx / (cos(((*lat + appData.centerLat)/2.0f) * M_PI / 180.0f) * 6371.0 * M_PI) + appData.centerLon; } -void screenCoords(int *outX, int *outY, double dx, double dy) { +void screenCoords(int *outX, int *outY, float dx, float dy) { *outX = (appData.screen_width>>1) + ((dx>0) ? 1 : -1) * screenDist(dx); *outY = (appData.screen_height * CENTEROFFSET) + ((dy>0) ? -1 : 1) * screenDist(dy); } @@ -175,7 +175,7 @@ int outOfBounds(int x, int y) { void drawPlaneOffMap(int x, int y, int *returnx, int *returny, SDL_Color planeColor) { - double arrowWidth = 6.0 * appData.screen_uiscale; + float arrowWidth = 6.0 * appData.screen_uiscale; float inx = x - (appData.screen_width>>1); float iny = y - appData.screen_height * CENTEROFFSET; @@ -195,15 +195,15 @@ void drawPlaneOffMap(int x, int y, int *returnx, int *returny, SDL_Color planeCo // circleRGBA (appData.renderer,(appData.screen_width>>1) + outx, appData.screen_height * CENTEROFFSET + outy,50,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); // thickLineRGBA(appData.renderer,appData.screen_width>>1,appData.screen_height * CENTEROFFSET, (appData.screen_width>>1) + outx, appData.screen_height * CENTEROFFSET + outy,arrowWidth,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - double inmag = sqrt(inx *inx + iny*iny); - double vec[3]; + float inmag = sqrt(inx *inx + iny*iny); + float vec[3]; vec[0] = inx / inmag; vec[1] = iny /inmag; vec[2] = 0; - double up[] = {0,0,1}; + float up[] = {0,0,1}; - double out[3]; + float out[3]; CROSSVP(out,vec,up); @@ -231,21 +231,21 @@ void drawPlaneOffMap(int x, int y, int *returnx, int *returny, SDL_Color planeCo *returny = y3; } -void drawPlaneHeading(int x, int y, double heading, SDL_Color planeColor) +void drawPlaneHeading(int x, int y, float heading, SDL_Color planeColor) { - double body = 8.0 * appData.screen_uiscale; - double wing = 6.0 * appData.screen_uiscale; - double tail = 3.0 * appData.screen_uiscale; - double bodyWidth = 2.0 * appData.screen_uiscale; + float body = 8.0 * appData.screen_uiscale; + float wing = 6.0 * appData.screen_uiscale; + float tail = 3.0 * appData.screen_uiscale; + float bodyWidth = 2.0 * appData.screen_uiscale; - double vec[3]; + float vec[3]; vec[0] = sin(heading * M_PI / 180); vec[1] = -cos(heading * M_PI / 180); vec[2] = 0; - double up[] = {0,0,1}; + float up[] = {0,0,1}; - double out[3]; + float out[3]; CROSSVP(out,vec,up); @@ -291,7 +291,7 @@ void drawPlane(int x, int y, SDL_Color planeColor) } -void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSeen, int idx) { +void drawTrail(float *oldDx, float *oldDy, float *oldHeading, time_t * oldSeen, int idx) { int currentIdx, prevIdx; @@ -313,7 +313,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee continue; } - double dx, dy; + float dx, dy; pxFromLonLat(&dx, &dy, oldDx[currentIdx], oldDy[currentIdx]); @@ -331,7 +331,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee continue; } - double age = pow(1.0 - (double)(now - oldSeen[currentIdx]) / TRAIL_TTL, 2.2); + float age = pow(1.0 - (float)(now - oldSeen[currentIdx]) / TRAIL_TTL, 2.2); if(age < 0) { age = 0; @@ -343,17 +343,17 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee //tick marks - age = 1.0 - (double) 4.0 * (now - oldSeen[currentIdx]) / TRAIL_TTL; + age = 1.0 - (float) 4.0 * (now - oldSeen[currentIdx]) / TRAIL_TTL; colorVal = (uint8_t)floor(255.0 * age); - double vec[3]; + float vec[3]; vec[0] = sin(oldHeading[currentIdx] * M_PI / 180); vec[1] = -cos(oldHeading[currentIdx] * M_PI / 180); vec[2] = 0; - double up[] = {0,0,1}; + float up[] = {0,0,1}; - double out[3]; + float out[3]; CROSSVP(out,vec,up); @@ -425,7 +425,7 @@ void drawScaleBars() // drawString("100km", (appData.screen_width>>1) + (0.707 * p100km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p100km) + 5, appData.mapFont, pink); } -void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, double screen_lon_min, double screen_lon_max) { +void drawPolys(QuadTree *tree, float screen_lat_min, float screen_lat_max, float screen_lon_min, float screen_lon_max) { if(tree == NULL) { return; } @@ -462,7 +462,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou drawPolys(tree->se, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); - double dx, dy; + float dx, dy; // if(!(tree->lat_min > screen_lat_min && // tree->lat_max < screen_lat_max && // tree->lon_min > screen_lon_min && @@ -519,7 +519,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou // } // } - // double alpha = 1.0; + // float alpha = 1.0; // //filledPolygonRGBA (appData.renderer, px, py, i, 0, 0, 0, 255); // polygonRGBA (appData.renderer, px, py, i, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); @@ -545,7 +545,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou continue; } - double d1 = dx* dx + dy * dy; + float d1 = dx* dx + dy * dy; pxFromLonLat(&dx, &dy, currentPoint->lon, currentPoint->lat); screenCoords(&x2, &y2, dx, dy); @@ -562,9 +562,9 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou continue; } - double d2 = dx* dx + dy * dy; + float d2 = dx* dx + dy * dy; - double factor = 1.0 - (d1+d2) / (3* appData.maxDist * appData.maxDist); + float factor = 1.0 - (d1+d2) / (3* appData.maxDist * appData.maxDist); SDL_Color lineColor = lerpColor(purple, blue, factor); @@ -598,7 +598,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou } void drawGeography() { - double screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max; + float screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max; latLonFromScreenCoords(&screen_lat_min, &screen_lon_min, 0, appData.screen_height * -0.2); latLonFromScreenCoords(&screen_lat_max, &screen_lon_max, appData.screen_width, appData.screen_height * 1.2); @@ -991,7 +991,7 @@ void drawPlanes() { int x, y; - double dx, dy; + float dx, dy; pxFromLonLat(&dx, &dy, p->lon, p->lat); screenCoords(&x, &y, dx, dy); @@ -999,7 +999,7 @@ void drawPlanes() { p->created = mstime(); } - double age_ms = (double)(mstime() - p->created); + float age_ms = (float)(mstime() - p->created); if(age_ms < 500) { circleRGBA(appData.renderer, x, y, 500 - age_ms, 255,255, 255, (uint8_t)(255.0 * age_ms / 500.0)); } else { @@ -1014,8 +1014,8 @@ void drawPlanes() { pxFromLonLat(&dx, &dy, p->oldLon[idx], p->oldLat[idx]); screenCoords(&oldx, &oldy, dx, dy); - double velx = (x - oldx) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); - double vely = (y - oldy) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); + float velx = (x - oldx) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); + float vely = (y - oldy) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); usex = x + (mstime() - p->msSeenLatLon) * velx; usey = y + (mstime() - p->msSeenLatLon) * vely; diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index d5e9144..6241175 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -4019e6c1da59af5e54909b8625f116916ed7b2de \ No newline at end of file +7a72d06a00457897159cc7ebf3afff0f1806f3ab \ No newline at end of file diff --git a/font.o b/font.o index 801bef849bc4d5a670a3606163e7b25a806805dc..3ed6ad06c2f2837e9c1eee3acf70796029b5021d 100644 GIT binary patch delta 4577 zcmaKu3viXi6~}ikNx1itKyDs)??-Y&LQ1&u5Myh@qZIpIZ4i}~;SulH4os&I2Q7~Ek*QV0+LF<>bhKimj;2!V|LpD;Z?{8t zCj0%*`R$%Pdv?F?=KN!UeFp=bi9oEQchcPf8Au%rd||XaO8>}>CC3W1XlUMOAwnZq za|?2p8y$53-q^avjUt+TlwoY$hV>$v!#X3xW1^#ZNKj-2oAC^2*BF*MLLwT8jzL`Q z&eIW$&L57D6wv}Uf(8__&Nf={++3q$-$IO-(PN9@FU69-z&csMCx#a;VyPFN9*yrG zUbrM};c>$Yi)bn9q+PfyZQ*jBn;To-BBB!xLdIgvkQFRTW9wIo=tP!@STkgT<#kA7 zJf2y>spw4=u3>44JNXEtQ`}=Jt3CoRZOO~4Wo7bE;ib@K(<*y8wAr-EVO^>VphmM! z7@f=dI-?`Y=}&nllf08n#*<*Z+2~0Jpxcd}%;oGfdJ5|YjJ}rjKBK2KBJ$6SuH?A~ zvA-)hyvxzL@FlwEz3CmR>z~&Z-r+0&rtk!_Ot#F+V@`$#apafgyUJUo{MJ+3-n0*yOE;#lpo&tYaq?TeOU$m4-$337{27HD@}+7?C|2 z53Y)~M+*I>a$&UHBC@M6kGE#+tl)N>jlP-ctL*>en2hslaOS3YOA=~DF0G5+|&Pq;H?oE7GQSCgiC6`4EXo=N>`Y{?#|MHo3zE(zR)>*SB?f&V*&)ak`< zJPdii9oHM*)_6Qe3X|@W~E!7e!??y`3jHNjfT!<^w2O73n_*uQi zX`_|XAn3IY&A02$q_XcT?$tS4~^jU{4v-T@A2>OOYug^1cFH+e(%KONnAK03Xqz2G@`=a}m{I+N2j-xiv z$qp^XmylZ(^@7fG=)LyT*3bZGvqP6;nYl@dB$e0h(7pDi?V)PW9*4HuGdfI7pvN8h zAbwA{Jw-jB{SMu(e`I1#Up%=%Qxw~i(be}_|J<&&~tW9|dTXjEY8(7>x4WM%! zy3pEtsSR|$wfLPK{>DNdqF&HnrO^o{A>E&$0nnG6$VHq0+IfoHtGu@z8YtCJd`Q)x z88%5j=Xv)1jZhP4u|sFuZ$*N7Kr0{h$jS`g0rkD|CA)#F+DRC!N zg0`elp0>!+HfjXj=FlSi9CPcWF3>#=ebC<6pHd&_0f!daFZK}{1Wh@##?F0`%C;)+ zcWIP!e%w~$57Yqqu0tvmmaz(8&(<>wW_@g3ffPU-w$-0$rR&Ijc^4&u*nY&=!Y2ZRsW&+@>*ZnWR+|E%0=)WDBVe4KZ#krtPCf1{0if_gwtJM<@( zKEvyIzjx@%mj03C4&{B|&>>4NQzd8~{@dfmo3tg>b~!bI&P}6y{p`gN_0$D=yQO|D zZnHPEnfi7pxtRvhZ`J)SD%+{#Zr$&t2IwE@em}KAKdSp9)C>K%?oZGF^lxn5ug6=O;KlCNt|BK{(N?u9H`&t5WeyX*jM#?Pe+g%m9 z(4e;|){yM1l80$V=WO{!YDNDgI*xuV4WZvhGrDFY*H-jr=s5an8bbePn$bNwFshdN oYopZJy+)p=q3)VMFoWjOXG3S}Ozid4MpdCX_Z#bF>gyQyAJKDjZU6uP delta 4542 zcmZ{m4RDmj8OQg%kT1C8a{0Ku7jhwykOT-Hp$^2t2tfyeijXm2KcFTJGAI_g0upTD za()qoLc&uKMrI^}659-Lb2L(LMk1p{r>&%|ohsEKGj!V0apaIXrA6rf+1)o@ck0gE z-v8O(?z8(myZgTH-d^8@!@jN>--VwfCT{UL8OdJXo%v2beOeHX`TH}3cqm_pLJ<@w zq3rL$$YB`{<-P(Pex!AS2#w@^(2uSap;4@Ja=A~)&s_>cR?Y_e`&3gNOXZyGew`y#`qmUJqHxa$0!pgCaDZWqo)(WEIP~ zSjIT~XXQ*mt+PnW@cXg&4& z@Z76)9gjVR@NVRBkohX_Wvb@TRKRlj`zqkMa3OD9jlo|RhF$J=3yrY?Bv3`E+6TpDB06^LwxX8F@Vq>bBI?}hf-_Xi@IO!I+2 zWVMlp0+C12d)ZM;)eDW@O7{gKD~G``Hav3NtU+}<5h%sAK;+7L!=U@w+v$Mtp9E^b zQuFE|V9&uHXGPiBLS1N1jIuWg|4fYI(2Sjx(}}%N2UC8B+rQc--M9jc1!=8iHS&QV ztqIL{L&ew#foaEbiq7NLhjm+({=>FVty`739nG`ooE%-Y2kJibtah4xkKz1#{a!}< zV~Yt8x)?%oQ~pmZa=*pJZl|1I`Q+Ub^M@>)wM;TBc#>LyF>yOaYPUXZoA zOKxPrbLdvii*bth-gB9#|Ae>*H*k^hxwBM=N!;p;@H(+o&lQTZzm4u4T{F^Sm2K29 zxdpT$kaTNXGBUb}Ab6 z^rFELc+*_DIl|c9e^YW`QL96>i%XO97q6Y@OrT$Eo|-qj&FK9wr8Y}vBUL;u-F@m5 z3NaGxe*DhEE0;b+U$^M4v6`NtIL5wj(FU`G^OOMnt3?mt>~i^>hCpvxbV{bCqbT?z z=~m(i$i-WgH}6zx0G(ygPW2)XVgW@#@3ZJ44h!W0>H%G2(KpPz$CT$&7JbRA`B&up zSi0vd`f#E4{Aa2I{hLL9hI`HBDz$>*NuY`sQMs}G)D0T8Xwr=ea)s6 zXro1Ivovj{iY?M@vFI@zKQ50@6KK0d+eT^n6vaWiEIQlR`zZn1YtgN)9($aIKu=qA zQn{wTrr=iT{>h@Zm>s-G4WO4Tdc|bpIz>Tq%!TzbnPKKFrXJ98i*7QsmIguVE!t|b zaVI%3={{spZ+|yX9cYK4d_mO9Q3oWRrB={A*4VM;)V)mIphqma!rZcxGywXJMYo!B z^*c&|eqzxPCL5QiqC>i0Sacy?L|lB-1e$L=dAaI0`#YWDptoD}t%x3bHzh#7Wzk(G z=m%*C^oJIWntK$ZU|hO8EShEZcONx?zG_kLnKOZ+pfgMa-kQw@iaV$W^aYFlQ@uKc zI7ow_eHPtl;yppm6ViRxqP-?}A5b0WkVW4$6Mssrpw}$=4|7H{sT;J=?1{JLKJ%Q6 z&;aNJLwVCHb&6Fzol>CnX_P+z=bE#zm@1x>?zhuCs}DOfeib!=uD7Wf+fH%NCoHu*QlPo`eBt8JYV(%Nr;2CrfMEfN`HIQLMrsA! zo<=zv_nWcLQ#WXzMSpK@cRvk)p0a4Yd8)iksZQy<$FnMly5o=0`N=QtNAirPS%%Qat1w4GjdNa(r#DMFKMQe ILn*5MFZVcd*#H0l diff --git a/init.o b/init.o index 332a5abe4e4e2c6e00638e81706d797d2c0c2683..b477807f1a93c753af34f60af59ce2b776cb0de8 100644 GIT binary patch delta 4207 zcmbuBeQ?yp8OL`oFXYakxg_$tgFCoOa^Vs%$wk4;1c8V%1TbwfMMP9cM4ZqfB;nf#+sY% zbf5O8c4jfj3EU8xDTHrJ(-R_)%?Y5lZ54s(tkc~*CU7GU$r71aSCPP_x^7~rGDHL3 z7l1Lc9Yb?f3LTc0k|LjVmhQiqb+*ruoHB7C$L9F9ZWn<_5v0%eIAk%)kZU$hA z%CZ8>_?22r-_&ACSnA@=E1kvjPnBFPu|JqO5-_U@X5Ep8{iziO-Q2Cq5%i2g>kT^PQTd!V)fsqFcSL!+Pib9xDMN@(t>%dQRD2DqD)esOu7}TnSkuf=Cg(?IMDcrEt(E zqMl&Y2(^a}wvWsfq7efyu$J{wmv&aL6H3?4%JXnUrgm1H!2;fPYv*oW&AY~_W9L2N ze2<-T#`!*P=7Mn=K0~%o-H{z4cuzZnYwk!JG|MmCk&WEX`b+3U|5xtFcGE39k!B;) zJ&|n~y+)lXXpB}m+Y@ZZ*v33E-4q=gJEhbT4NMd4#(Ec;nNnFlM{R zz7xlZmu~#btTfbDowwjR?oZZOcRu*d&b(-F!8UoyuJ`l{F4SvMGuvH{0aS2gFb@e4V!f)yDy@Fl9XXfAdL4fyp5ELN<9|9|`-{no zF)K;F>c}-z1N{)iptn-%LC3$-in@H0j@r$c{oNK#dQXZByV zqG+1VIggq^7vj;%EwRprS)koXU7)Khde&6oUK$47XweotHn?r0anPSww8T{GSqdL= z{AAHK6WdJ7JG*n`b<|wHBrqej6 zm*3E6iLa8P09d&@-XVGQG-$VnTtrmU6RB{)M zf$p*BZ_E{coxHC({vnG-O7*JFQVr<)7F}UpLKmnN^mB{WnmcQPdO)X{6P>8Wh`F=! zX%sYU(LtA<_W;S)9shtut2GqArx@tJEm~Bp@z>M@It_1LZi#t?x%zq31zKd$W}hBi zLBpVnEV{;Ag<2X1U2V~s>gx+%TogX)_#d@tn$Fxt4WLh3G;C-mb%1so%143=(PFCc z8V!IBS+vv8vor?!zD4&NdV##haE&Z_)X+()Ip$=@5GEtqP%}hTg+3)zftk}0q>@O$=den-oH?bqs1p1*x3ry_4 zs0(z`qKgg9rD4!TVeKYX^}M0?(Ku+EMZY$5H-!iA97&=0{1xWdiC$^|J&{8B>o4(r z_6O50X1Cv85lL{?EB>|weB+e{@Vm&kLp8Mcf1PA+l1bw4#6pYg(}X89Ct eKDAu-)4-|Q-S0N)+|SZDy#7J$eMqt2&G{cVI9>Vx delta 4181 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 delta 5191 zcma)<4RBOf6@c%}e?nlhr1191ZnB$@?1rC)g^&ab4WUCJMZs8TXNZzSNF}2s1f*c8 zUDE2%qK;XQwvB_b0c?ZeZ`lwc#E}e+pi_|GDAfVOs{FOpX|4C{ONLRFEQHo5CZAjT{gr*81it!`dsb$z_CX-Apn@GeE zVytkI?oR(PDw!m@+?f|pc746^8^WDM^H6SCBiy4%&d8zxcQ#GQ5osCS_?==6jV96Z zQ0aCob_tOsLNqnUa-qze2`lD9NBu6Jf5-+DA~0X$ERV)zhj)VjDLL? z*d);kywE-2uU24+>z-=GSH_-%z{S)~B&w2^TnV8(QgbWCK2O@#&rof!c`{s7d?jbnu&S;n z>-#9H(s;4~WmOu_Xp&WFJYz^!rSasDJWcs=l3b}|c*}FxIs;pj9-!5}pyWv+O^9|S zPo^@zqU0$gZ&&jDBuA87+JSz%lpG}6gShUQ)>h27`ejys#jb>BdYVa<@SqD%*$y-w zsRYgx;*`TvxfN#TzZ%-=7NP+^IB_A#-V~+Oka8(qDUZC2-;q&DSu~W2CJv>1jHnFmV7PEzw+Skzb1&4o=@GJ`vXm|L(i86^la`;!$ILWV|Y>#hu_&4%! z#Nl7f;%cCzw)aJuTzcSlD9A!EzcOsj(XT@<#`A1D^T-?ugpP209KR3+jCjO*#J& z<7`^{qd3uu6SDdw6(>*5iJkEkNZA0x1uNw+EGt}8*H9=#a`EHoz0hVwr@ zd;^ER2oeAN^WH~EWDjDu7A5PnrYL=jt*0uT7R;yFs(#WOI_b$LVmX2H<*{okHYLlx zSmRfQWadIn+yRZN3^QK}d{N%Go57>@_w-nJRjGvEH|0qYyV~TrPgcZIpFU6|%i-{j z($O<{I(>D*@D4-n1z*H4&ssO2dJY}PW+kbK|FG!4HM+)nmW6l^+9HNbgVs(%j)f@7 zdC-aSB#5KWa=dw|(X&lHZ{Zb5Z5}u~4YN+8w$CS^8tFQXPO&ZsA)d8jZL?y%M6t}B z+RW$ERFtchpBoyz&2{tF!sS2fz|S8>Jg3%*^3`Laes^ghG33u=)b&}h+UMUO!n(vup! z!a4sDqDY4{8p%_(Z$TXCZH?aIGms3<-G=GFTc4U;$?ow=p8(ZJ{TfZ;_0E7+q*WR% z;<$^T6Y1j`?O?hR29dUCw2G^-8RX9mGon#@f4d=w^axXYl7v^KYxT#W5$S2oHfxNU z@)rmry{yrF2D9oP}zn7d2|% z9u3fn^htb^Q?u9WQ>u6xI+5SYxFwbIUB&Y$1tDO=$&L0 zcN^3q1&x}#gFB!NX_rP{=k@kL6zQ)t`V8m%JBTAar_md^p&IE@jaJ~#5Na!-73q@+l;SSule7*xk+vmJ@|?$~p&bU1 z{v?5tZ4cY-0J$G;nNOhmA&B(136wl{@ruquBho)<^i8hw5QLFlV@f6zvIRfX-hlz6 zcN1(WEBf0)Edz#;I=z-+-B3jLGaV1U1BN-9DS4(#k$=XBMNo_M38wa`8)VxSXhXV5 zqn;FWfDLbCq}#lfV#TH1Kd4mE0db@|6DVcX!nWPuJZP8)ncC}pk?VXOs*zsNXggC0 ztw^(c=nk8m^B7)IE_5PwF||GSvTYR%B3-P}*O@*BGHRGjn&&q5yas|uH)?c{=`+xX zbXS7s#5x~>Fw)bSt(V_Ve})01LmFMn^q(*sHBv_v;9?=%n=5fg4;kh>(y>YWQ2KSe zXZ28v^xGQkV7dp|ke<=#d8RiYiZrv3{Em38RI2bo9O=viYM&yS@F+NAh8bo`yF#b` zCa>WLR3rV3MsxX{dkR{Sp7{iN5jtarj9dLR7)1GPtG@}d$B?(J{sRc2oCGyJRq|Zy z#h&^kc`A0j_oS5R5bdkT>}#eR@vjUF_f^QvQ1Z(v8G~l*1F#4Cb#NW~J}5a_C3iwI z_J?54(W<0tJ@Dqy2l3B9$+0Tg56#DLXa&^PkB8&OR!adT{R`w=Xzj1aY+t1!ltUCX M*I}h$UPto(2hXn0=Kufz diff --git a/map_conversion/README.md b/map_conversion/README.md new file mode 100644 index 0000000..a7cd10f --- /dev/null +++ b/map_conversion/README.md @@ -0,0 +1,21 @@ +Very hacky map pipeline: + +using latlon maps from sourced from http://www.mccurley.org/svg/ + +get all.svg + +run mapconverted.py + +**at this point you have to manually format into a c array and get the length.** + +now compile write2bin +gcc write2bin.c allstates.c -o write2bin + +and run write2bin + +this will produce mapdata.bin that the main program reads in + + +** this should be one python that generates the binary file ** + +** then it should be grabbed from mapbox or something ** diff --git a/map_conversion/a.out.REMOVED.git-id b/map_conversion/a.out.REMOVED.git-id new file mode 100644 index 0000000..8050288 --- /dev/null +++ b/map_conversion/a.out.REMOVED.git-id @@ -0,0 +1 @@ +4a9fe852dcd3e65638b4f5a4f943c0e85c5e2ddb \ No newline at end of file diff --git a/map_conversion/allstates.c.REMOVED.git-id b/map_conversion/allstates.c.REMOVED.git-id new file mode 100644 index 0000000..9558799 --- /dev/null +++ b/map_conversion/allstates.c.REMOVED.git-id @@ -0,0 +1 @@ +a617d7924210634db9b7a5c7323d803d371319df \ No newline at end of file diff --git a/map_conversion/data.REMOVED.git-id b/map_conversion/data.REMOVED.git-id new file mode 100644 index 0000000..1e2b8d3 --- /dev/null +++ b/map_conversion/data.REMOVED.git-id @@ -0,0 +1 @@ +d970486a784f62d0e7072845fb9ba545adb51332 \ No newline at end of file diff --git a/map_conversion/write2bin.c b/map_conversion/write2bin.c new file mode 100644 index 0000000..b26c41d --- /dev/null +++ b/map_conversion/write2bin.c @@ -0,0 +1,12 @@ +// +#include + +extern float mapPoints[3878131]; + +int main(int argc, char **argv) { + FILE *file = fopen("mapdata.bin", "wb"); + fwrite(mapPoints, sizeof(mapPoints), 1, file); + fclose(file); + + return(0); +} diff --git a/mapconversion.xlsx.REMOVED.git-id b/mapconversion.xlsx.REMOVED.git-id deleted file mode 100644 index 989f816..0000000 --- a/mapconversion.xlsx.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -cef8f740e8ef23f03d0d46f43348d73f1ca76c8e \ No newline at end of file diff --git a/mapdata.bin.REMOVED.git-id b/mapdata.bin.REMOVED.git-id new file mode 100644 index 0000000..1e2b8d3 --- /dev/null +++ b/mapdata.bin.REMOVED.git-id @@ -0,0 +1 @@ +d970486a784f62d0e7072845fb9ba545adb51332 \ No newline at end of file diff --git a/mapdata.c b/mapdata.c new file mode 100644 index 0000000..098bf62 --- /dev/null +++ b/mapdata.c @@ -0,0 +1,237 @@ +#include "dump1090.h" +#include "mapdata.h" + +#include + +//sourced from http://www.mccurley.org/svg/ +// +//extern float mapPoints[3878131]; + +bool QTInsert(QuadTree *tree, Polygon* polygon) { + // printf("Inserting %d point poly\n", polygon->numPoints); + + if (!(polygon->lat_min >= tree->lat_min && + polygon->lat_max <= tree->lat_max && + polygon->lon_min >= tree->lon_min && + polygon->lon_max <= tree->lon_max)) { + // printf("doesnt fit: %f > %f, %f < %f, %f < %f,%f > %f \n",polygon->lat_min, tree->lat_min, polygon->lat_max, tree->lat_max, polygon->lon_min, tree->lon_min, polygon->lon_max,tree->lon_max); + + return false; + } + + if (tree->nw == NULL) { + tree->nw = (QuadTree*)malloc(sizeof(QuadTree)); + tree->nw->polygons = NULL; + tree->nw->nw = NULL; + tree->nw->ne = NULL; + tree->nw->sw = NULL; + tree->nw->se = NULL; + + tree->nw->lat_min = tree->lat_min; + tree->nw->lat_max = tree->lat_min + 0.5 * (tree->lat_max - tree->lat_min); + tree->nw->lon_min = tree->lon_min; + tree->nw->lon_max = tree->lon_min + 0.5 * (tree->lon_max - tree->lon_min); + } + + if (QTInsert(tree->nw,polygon)){ + return true; + } + + if (tree->sw == NULL) { + tree->sw = (QuadTree*)malloc(sizeof(QuadTree)); + tree->sw->polygons = NULL; + tree->sw->nw = NULL; + tree->sw->ne = NULL; + tree->sw->sw = NULL; + tree->sw->se = NULL; + + tree->sw->lat_min = tree->lat_min; + tree->sw->lat_max = tree->lat_min + 0.5 * (tree->lat_max - tree->lat_min); + tree->sw->lon_min = tree->lon_min + 0.5 * (tree->lon_max - tree->lon_min); + tree->sw->lon_max = tree->lon_max; + } + + if (QTInsert(tree->sw,polygon)){ + return true; + } + + if (tree->ne == NULL) { + tree->ne = (QuadTree*)malloc(sizeof(QuadTree)); + tree->ne->polygons = NULL; + tree->ne->nw = NULL; + tree->ne->ne = NULL; + tree->ne->sw = NULL; + tree->ne->se = NULL; + + tree->ne->lat_min = tree->lat_min + 0.5 * (tree->lat_max - tree->lat_min); + tree->ne->lat_max = tree->lat_max; + tree->ne->lon_min = tree->lon_min; + tree->ne->lon_max = tree->lon_min + 0.5 * (tree->lon_max - tree->lon_min); + } + + if (QTInsert(tree->ne,polygon)){ + return true; + } + + if (tree->se == NULL) { + tree->se = (QuadTree*)malloc(sizeof(QuadTree)); + tree->se->polygons = NULL; + tree->se->nw = NULL; + tree->se->ne = NULL; + tree->se->sw = NULL; + tree->se->se = NULL; + + tree->se->lat_min = tree->lat_min + 0.5 * (tree->lat_max - tree->lat_min); + tree->se->lat_max = tree->lat_max; + tree->se->lon_min = tree->lon_min + 0.5 * (tree->lon_max - tree->lon_min); + tree->se->lon_max = tree->lon_max; + } + + if (QTInsert(tree->se,polygon)){ + return true; + } + + polygon->next = tree->polygons; + tree->polygons = polygon; + // printf("insert done\n"); + return true; +} + +void initMaps() { + mapPoints_count = sizeof(mapPoints) / sizeof(float); + + + FILE *fileptr; + +fileptr = fopen("mapdata.bin", "rb"); // Open the file in binary mode +fseek(fileptr, 0, SEEK_END); // Jump to the end of the file +mapPoints_count = ftell(fileptr) / sizeof(float); // Get the current byte offset in the file +rewind(fileptr); // Jump back to the beginning of the file + +mapPoints = (float *)malloc(mapPoints_count * sizeof(float)); // Enough memory for the file +fread(mapPoints, sizeof(float), mapPoints_count, fileptr); // Read in the entire file +fclose(fileptr); // Close the fileptr + +printf("%d points read\n",mapPoints_count); + + //mapPoints_relative = (float *) malloc(sizeof(mapPoints)); + + // mapPoints_count = sizeof(mapPoints) / (2 * sizeof(double)); + // mapPoints_x = (double *) malloc(sizeof(mapPoints) / 2); + // mapPoints_y = (double *) malloc(sizeof(mapPoints) / 2); + + // int current = 0; + // for(int i = 0; i < 2 * mapPoints_count; i++) { + // if(mapPoints[i] != 0) { + // if(i%2 == 0) { //longitude points + // double dLon = mapPoints[i] - Modes.fUserLon; + // mapPoints_x[current] = 6371.0 * dLon * M_PI / 180.0 * cos(((mapPoints[i+1] + Modes.fUserLat)/2.0) * M_PI / 180.0); + // } else { //latitude points + // double dLat = mapPoints[i] - Modes.fUserLat; + // mapPoints_y[current] = 6371.0 * dLat * M_PI / 180.0f; + // current++; + // } + // } + // } + + root.lat_min = 180; + root.lon_min = 180; + root.lat_max = -180; + root.lon_max = -180; + + root.nw = NULL; + root.ne = NULL; + root.sw = NULL; + root.se = NULL; + + for(int i = 0; i < mapPoints_count; i+=2) { + if(mapPoints[i] == 0) + continue; + + if(mapPoints[i] < root.lon_min) { + root.lon_min = mapPoints[i]; + } else if(mapPoints[i] > root.lon_max) { + root.lon_max = mapPoints[i]; + } + + if(mapPoints[i+1] < root.lat_min) { + root.lat_min = mapPoints[i+1]; + } else if(mapPoints[i+1] > root.lat_max) { + root.lat_max = mapPoints[i+1]; + } + } + + Polygon *currentPolygon = (Polygon*)malloc(sizeof(Polygon)); + + currentPolygon->lat_min = 180.0; + currentPolygon->lon_min = 180.0; + currentPolygon->lat_max = -180.0; + currentPolygon->lon_max = -180.0; + + currentPolygon->numPoints = 0; + + currentPolygon->points = NULL; + currentPolygon->next = NULL; + + for(int i = 0; i < mapPoints_count; i+=2) { + + if(mapPoints[i] == 0) { //end of polygon + if(currentPolygon->numPoints != 7) + QTInsert(&root, currentPolygon); + + currentPolygon = (Polygon*)malloc(sizeof(Polygon)); + + currentPolygon->lat_min = 180.0; + currentPolygon->lon_min = 180.0; + currentPolygon->lat_max = -180.0; + currentPolygon->lon_max = -180.0; + + currentPolygon->numPoints = 0; + currentPolygon->points = NULL; + currentPolygon->next = NULL; + continue; + } + + currentPolygon->numPoints++; + + Point *currentPoint = (Point*)malloc(sizeof(Point)); + + if(mapPoints[i] < currentPolygon->lon_min) { + currentPolygon->lon_min = mapPoints[i]; + } else if(mapPoints[i] > currentPolygon->lon_max) { + currentPolygon->lon_max = mapPoints[i]; + } + + if(mapPoints[i+1] < currentPolygon->lat_min) { + currentPolygon->lat_min = mapPoints[i+1]; + } else if(mapPoints[i+1] > currentPolygon->lat_max) { + currentPolygon->lat_max = mapPoints[i+1]; + } + + currentPoint->lon = mapPoints[i]; + currentPoint->lat = mapPoints[i+1]; + + currentPoint->next = currentPolygon->points; + currentPolygon->points = currentPoint; + } + + +} + + +// void recenter() { +// for(int i = 0; i < mapPoints_count; i++) { + +// if(mapPoints[i] == 0) { +// mapPoints_relative[i] = 0; +// } else { +// if(i%2 == 0) { //longitude points +// double dLon = mapPoints[i] - Modes.fUserLon; +// mapPoints_relative[i] = 6371.0 * dLon * M_PI / 180.0 * cos(((mapPoints[i+1] + Modes.fUserLat)/2.0) * M_PI / 180.0); +// } else { //latitude points +// double dLat = mapPoints[i] - Modes.fUserLat; +// mapPoints_relative[i] = 6371.0 * dLat * M_PI / 180.0f; +// } +// } +// } +// } \ No newline at end of file diff --git a/mapdata.c.REMOVED.git-id b/mapdata.c.REMOVED.git-id deleted file mode 100644 index baee0a1..0000000 --- a/mapdata.c.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -1420a2ee0d38618a03222daea18788de0178f471 \ No newline at end of file diff --git a/mapdata.h b/mapdata.h index 2dc6d4e..d349a79 100644 --- a/mapdata.h +++ b/mapdata.h @@ -1,22 +1,24 @@ #ifndef MAPPOINTS_H #define MAPPOINTS_H -double *mapPoints_relative; +float *mapPoints_relative; int mapPoints_count; -extern double mapPoints[]; +//extern float mapPoints[]; + +float *mapPoints; typedef struct Point{ - double lat; - double lon; + float lat; + float lon; struct Point *next; } Point; typedef struct Polygon{ - double lat_min; - double lat_max; - double lon_min; - double lon_max; + float lat_min; + float lat_max; + float lon_min; + float lon_max; Point *points; int numPoints; @@ -25,10 +27,10 @@ typedef struct Polygon{ } Polygon; typedef struct QuadTree{ - double lat_min; - double lat_max; - double lon_min; - double lon_max; + float lat_min; + float lat_max; + float lon_min; + float lon_max; Polygon *polygons; diff --git a/mapdata.o b/mapdata.o index 3d3304425867ad365da4907eb837c638ca6bf7b4..723c197366acaf417bfba57f17646e56f5eea18f 100644 GIT binary patch literal 26408 zcmb_^4SZBZvTvW6gbYbY!bd^?g#r19Nu4& z`(h)2n3I-UGCM6c5Xc2CI4p7Hmb@3s0?M16Te2iO-lJ^Sp4=g7{yb0T_nyuZo{ldH zJ?n2N^xSqPaigd6Z--F#nq7%pPsiTE9camQi&5UQ{zf;*8;*ql} zUhs6>SgLZ@lsiCv{f(uzHjjALSLb;;r@B3z%kqx?EO*EhrCz9ju8!ySUNk%#j&;Mq z_TDwa)8LpkoNR&-qz(6Uz6@u;J)PBs$8#6$`#Lvo1X>JoswwxYFOTOg+y&>8AVoSB z?)SW0nTHZ^F4U5F&om>Cn*SQN1fzn-2 zzXuxZ1?&xI(2@ofUjq@%KD_&fGiPWB#?~xtYBgHwh8{pk-ub8yR*I0&UAqZr*eySV-Khi8)H2Pu1Ldf*#1)pxDHoKGp_^tUd}Dr z16CG+zAWgFyu}vhYl|1|M^#Wq9yG>*%KEf(EhGbWCk+HC4_OK7t6^|w*$H;{u8?MC zAO7t>gg57*8%t@Ny=x&T&M}l-s||(vc{sylEolETWih$djiUmLCKxREKXz#ad-D)9 zYH=MN0cKV$sJg~;*CnX2YJOFn=dLS|gw+M>>g9B#A^sIbMcGMD=bq<~1)me*>HNT) zJue<|bdtPA8jG>5=dOuc@yt^H;psf`d>Z1NFMI6LtYjhlC)RZfBC{R*7NT}SB-K!i4@M%(b`Lnqtq@{g_X?1j46Xgk0 z@hqw_m7uQeDP2F~_hyVQ6hYTzU()!emVFAoujwqR>1=Vq%u|e~!r6^RmhC#av}t3< zsSL<{dKNvM2dOn_BI=(isp{D4@O1paHRaL~s55uNop5Adt*V5SVuhP*~Sfj4Ht`0@aP)ZShXwbd^0atTF0R5%d68ek_W1A_eR z@T{Mg2Mo+B=Ga=-;ozAwXPQcKhpa(^6sGm-7FR8*T3ofH%DZP{Zb@}^`{SrR`{-uK z^T4OIZ$&=s=wq=4)#{7-eFvbaZz!!@9s2P*LB${@ya(aE8?GzO`S(?PL7jnYO<1G%)cbTETfmP)&D7OAnx zj7G&;{LWjFdvME3+<9Y{Yh6I9S3(@(Y{r0MUU1=6MI z(@5uO`X5LaYWfGH-I_jwbWs)@RJyW|DbSDk$T&SZL&M%H22g3r`aobfoNE-uRyBQ zsZ<~38UZJ2;2MO8)0GO~o*9pWFbz5{bMA7er9o%bA<6W7q+KwWxo`%pfM0_owJOSN zKLNCEwE}x)dgUx2(=@&caqYIun-I^|_^pWRpw7JgI-vV$oah2gul*6IFI0V9nVSk= z)obuqsD$YUkWN$mT$%rR2?)@>l=+Jkxf$&S})Sft*G0rP2Yy}a7{mnGDWHvLLUK1VPk0@ zXAQy_>Q|IiT>#TXqsp4P4u+!1X(@C%rWhS%BSDmujAA98FF>b;k(VRsOoO50#M6m%59RPiXVi0F) zd>GQ%dLcd!EoojVl?%0yHGKzLh--QX(Y>yOHb;$chIUcE!6yNstkEB;Rbg8G^HX5g zqHgkEKvESp`BnZd9EG+d|3#$rGRxnMbY5XYTa(J)a}|j9gVB8tI%&GE17HBrl^s9qA&C{}H`c zs_8e7uF&+K4nkj*ntl^$kEY+kXsOlo+o-2r(|<;Kk*424nWdV37wHyFA3&L?rr$?8 zq3ORMy+YG}MfxU9A4K|AO@Dwktkd*|NN+3*`4TGsqY@bVeTAV&nCZ=0=3{KTMbn?` z1Yd2}9!8R8KNtLt?xujM%>V2HAhh`BNHTp0X_v+iV_Th3@{gdabVkWPisrbr%ojLC zMTM>LW|jZth0u01bh8`UQ8Zl&0CnC=4NOd#rt<%WRXs6&sSHx-`Tun?$8`QR<{>uZ z8%!r`$O+5}JZC3Se5vmI+iVET56?qY`KNIFA6lCEJ2Ia#^BppWnE4)=FPQm94`_dk znIDij#mpHTqH@sfR=%=s0H3=YgE7u6TE&H2<*?3!R&M6t>I%3b=F&*Al(`Jz%9(Q! zSHWCQ;wCx<`vdJNKhqipS}M6Ni|Rbg=_{TZ=5nnfkgR1c&%)JM>(oZ~rgrtt!LdkO z<@X_O5pY4^`VzO)Ik*Aq`Vr>`4(sxXYhf(~#D$paPnTs;<_f891#<(a?pEdoQr$Y{ z+*G%bxuH~dA9KTq+r-=j#BByUealt;aN-`}x)H=}VQwUGPcS!%xb4ot;Q*|WBI2Im zx(kWh!Q4f}?PTs^;&w4Nnz+5p6%)6Qxf0@DV{Qy_Z!lL%+}q5R5qE&OvBdp_Iej7c zA#>&AmqW~5LXyXr8&BLf%uOKf6mu2Coo4P*;#8WR_sfV&WA1X|T+B@*E}OY4h|6Pc z5^?>QyOOv<<|>IhkGX0KQ;?gvDZ~{qHw4$;n1(1$c=y01+`Kcw}pRFIFfzRD@+k4^PfSx|^J>#ee2;6%XP(Bmu6O@`~w z$$keRN&Qw7oWDES?_gWMLu~!JZT$|l^?Ly}%_|HqR|O;X0a;iW2XZ8m?!s_D6^uf% zs4xy>5t5}~#bh{VxMsmo``|((-C(pTxcGG-Q~n-`pykISmcNobAe)BvRcaVQRtu6? zH2Vk|gyjM}RKhj$@Sw7OiY}o-@J@!e8+ZiPX$5~kPhuIVPjE#69sC$tjI!pZEE{Fj zIpQ{7;q#;(LqTjb`oYR9f>x&73OOH(wF%K;A~VOZ0JA27l0(D*=%8-vz~w1(5dTFt z_|x6suXcf>`JWIz-{GoA=|}wgZt%WPhi(A*bKL+pG)@b=fZo6bRf42r06h_MVx){= z;2Ag@8b@F1^@fe0#s^xXzyei94VrMhIMJ-Jn*Rnm8K=sT!P0+_gPv9+?Z~$9G#(FF z91D_U#-U`3j3*o^`Y9XzJ4Z_VWo7lYM&$I(a^?)m>23AN$b(x!M}czYT$Xit)(o)E zIb3CBO@ewzwM@F;IbbfJ5DOC&%48sigli=6J^NbDoUANVVF8-iE2*yn8f7t?KBF(P z*`_zxSuATtUu=;x6!eUN%G|!tbRw*}ymGAr8eKU6f!+*2zZ&R+8Le+$E7fnm{x&8* zWdtO{UZ5X4?@yMd8%qm8$fZY)wFAfu*!TuQXN+Gtz)`5wAm}IA>b#Wd3J^ZuHa=hn zvrZf?utV$vK~--1KoA&OVqG~vPXNwHW#P{!4?w33O9?t)mM+M$=J!W@c*;1$M<5PM zsdKdjb6ZCK9CgQPc>Gg%_he9CWGWzQo)7hNLA*ZeTAHbg(p6bsRB|!aVDF}8bjqkv z17=WF(y-$6l}wr+5W46tMo*KJ+Q4UrDt$n=PaUt~PG<8NWelC_ZPB^CElTOo)B)Cz zYE^q~t6JF#o`zCM=W`dsI9KGFf2PHu%Fh|8QKKKVp%2e7rWYGAlFylnr&pJVOQ;N>j(J`41Q_xxJkmDlD&NC3V#q(w~H`F{Dw5>g$r~_oM_3c_<0h z88T(WIc~)rnf4{P3bq#$b9M~rqfU+dozKSQW^$#x@$+c*cYx2$d^Q1`$Dwsjd&V#1 zb1k1sd2LjRH6q&^d9%E>{ol5SaXQpzuyb10_c^`bNUy9QKc+1n8xssShT8mrF)J#@ zd&id-hl1g@6~)crwlNLCL|lSP{lTWHO47LU%nw&PHW-3rHerg9KOc^Nk24b;LFrLs- ziC}BMi!{h3TJYD=;&_WM7VsC_v_^G}4Z&ut5sV5aire52)+*b=pxv))n*)hRG~sQG z#84dUZuKQvbQPB^3ud~CuXXlx)kA%KwR7dftD(g@*MyF>bscMVZkpwqKFhTf>#n|H z0o6}!^T$RAT=7+B>zG8pJ*Z6tidYS#g0Z`Z_0zn--4_+r=4IS{lExFz;bM2zb3s zt#F(%$2-C@ZTrU}b zBPCl|X=Hgg5L3};E3UmrOu<88FIXQ~p}dVPK6pRD+t?NZXNB5Y!?Z*}JVwTV-X@S) zh7nKJ#8oT)Xb_ErRyKpbX{gZ_u-@MoYgD*?12L~&uAra^0k1C<^nr`ObM3(xG=hn0 zcH_tbD}o8-3&t8_zNUm8Tfi4fGz4J$F<&B}f>XdrH4*SBVDZG9w#586xDq`83SpG3 zzSuGtnpuyH3cX6x4*iAO;(=IP#RGw`Y7Hb}!A6?VfZq+Hj;Z!QjJrWin67k4v?Zc# zSg~B&;PqmDSQUY1A5FnfAna=m&|JdMTcau#iP-0%wJi}?;f<@dFvgDQ2?91649C?h z2(-9rY79kSuE7g5$yc}e{B^NFK*6I)FSS=qFv?gBxS6Ka*O&;l2PjIb=vWP7OROS8 zyptml9h+#sHyUa~M=y^DZWuRK(I~;-h7g2zvyN|^)|Oy%i=Mfr;0kajMsqNXgC;MV z*lNb50@DGS&_Ni55WkcxK?x?@vhe`G>Ij?Vm(qmpqZo}R=BNp^Tm=gnB8cq>Hu@soMqgtK z1ShUJJvrVGM5nh6U-${Acr*Y`#iUYI-4yaQO7$U<^WPA=OV@*BI!;mwft=+(Yl+k> z>zqV+T`yu=Jo_VUunrV#>aeGKF#{%Sj1Hg(EP+T9#1Z9U@Uc$KCgVf3$qeM2IQ{@> z>&>K$q!%FZHFIo&S1~PxVJ`?qAQjm6i>6Qn);f6z)^04&q;nhmz^!+MF)fkSz?d*x zy2RW3zA??g#2CmY;7_yhLF+DOUuPrUkTCgFRV&a6Nlb;?S~;K7Orq&_^Keux$y{t^ zHR|)1!K}dv;t5aV^r>8*F4113{V5i>p$+B{MiR##>ThTZLa^Ic3`_)GPpN2?$^SZ1 zl^0hIDAb(>Vad+&LAIv|!DY}I426OT*!*$Hw}XrQxM})Yads(*H$|c_Kw6QFp@1*k z7NrcXU}3>Oy;vx$&hiM!UrC}O)#0}ycqcqGyZr2R}>h?(XEp;?uCI^ zd$1AKKN{A6D?SdEMH=Dy0P+EJjrtn&BKHRx+L|Fj2Oy_n*1<7X8#m)(!$l4~P%zjP z`eTu36x8ts9M>D3-ZoOpFcyGK8aEA06b+Ejzz6zTAl?EO4mcyW6oO%|DCl8}Zt;a- z46VKp3_yALS_Otqd50{4G;0>V;r#&^KpXTK@R#cGgOCj@>k1s(6*x{OXSkABPFWD` zhjoBUkUE1svJUQKY}ZwKyMtQ1s#7#Ry12lZOBt;*fjz{}3dYFtIJgub*q$NV>&q>3 zRg>J|V4Zo}6SSXl`i6@d2pd?@bZvlpSn8ULE$6r7%mR#$cP!Y` z{3z-3t7f{&OlDMc6sg5L6A$}wiaDji+OY*rDa1GXf~MbAHSVl*;tzyi!IE=CMkXi2 zo)Y&p!^Ky0HeP*4Y0sA$IZADPj8)NEydbA#Fn#uXcXe5rdqPQhNvXTIHPIFhT+tkW zYvo`gu)bJh%N1}NUp&6tUEJ(0o-@{6+yq@TE-QvCkbuM=i50_*3tarN8&j8&IA>~l zb@gTLqWKN5gSP2Tip$!FE4#U@qNKFEr0hbC<1Hw>^`winYObwP0n$HC^VUzl-Vt?91@Eicf9(?&vX4lFJ6M*q^Adx z%JeQRb;A3%vJ3&Bk8K_)<^aPu)P0}bVp2EwRKQV>X>WcSo(*_!_4OHk;FpYmCEe)p zcY|Nw4Ib?VUk*6->w+^DbN&~gyBgQpZtxA=;J*MI^}FGWr9z+7W;l1%@6(LC;Y@|6 zRKGo%(o@ORwwvOTn(9&ohcY~j#lyJN)w6ec&78?qHQqVXrp=pL=dG)n3^$VI0w8($ zmAbajn})u~(tD-8ZQ~s~Dae_h?{;BZq+2R_m_RqpNkQ15_-bVqY)Wy3SJhCi=5gTj zG>p~L@HGaOmEGV!=?3504gQ~uV_d<{M@juoPD$7=&a>(FZpNkj)^6l0_(7nQ_cAW^ zf6$G*ix;SrUu(nRHHD;|Ke6GsT8;g`vf=PUraGnFdFFA((N0|ZM*dkFKFEf@Xv1-z zG4ihq{RV%_CXX+a8T`F&#?hbX2P03f zzXOjrW?h31v*{UX!;8AnbEyp<2J$9XOcA)zKU3h$s<{GpgDx!if<6|s6ZPXSlvu78 zIObn0H`;K!-|n&DsE1kgpumlt+q%JD7r4>$p1@81{InbVxWLJHI9QzL%yKZ|q-c!|nOx`fl{xZTQM?$5Wo(PMUGeD%xt0LNgi91!mXf6E!bwT#8! zeQ@AV^nRVfkFjF34GX3r7A5{dI%;{-7eXaA9Q&nL#^8Lp!1dRNN=+8{!`#UXf$Ptl z;B{ev_v1^g1p>dE^(+y%e)C?bMuB(m`fn3BzBhQFhQ4fgfb~-2yLSJ6{v{)jZw<0)LnN^QpjJV?D<9f7 zVQRduvRps*hZ*k<*5ej<6USAtz&~O9GJzju|4bM7Q0D6delg4Y1a9UvEbyT`UpEST zCiCkA?&ERYD{y#Sgvvt#U%~j30-wwLPJ!z$E0o$V@XL8z?+E-W_WvgW-^=4VCh+AP z5C0JO&5UPq9GQ8%jq&~hzmxId0{QP~a1IzP=NL+;dvb|@H5O;3;c8TzenJ|)9Tecf%jznUV*>I^2-GNd&X}Tcs=8t0>7L6 za<9Oj;&^^g;Ggn5ZWZ_#w$of^8h?&t{eKYhcnyl>PXd36<^L-1_3Zz{0-w)u`-8w= zGCYsN*fWXoAp*}~{TB&*2+LOpd=mFNRp6%Is|9ZQZ4&r@GJk`>1KjVA1pZ65^Im~} z&i0t=Ju}|h7~d-7ALKZER^a&M9F{)_d>i-svA{22JtqXdSF6E~y{Q;`{LE(w{BiDg zl)#5_yj>=6qkpQvjehf{kLlOw4+;5UZ0A~mJJ|m}5%>q}hhGXj%yGL#;IFY?o)-9* zoM)aF`0u&j{Q?j1JeuoLGp>5p^MQ~b$#xzQ`0sd~o))(<#{mr53>Dz1pZsL z=X`-rVEiJ1zrlQ&z%OBbyucT+p2-3?{+TWCXL&pe1s-Jo!~~8XZezJw;4iWK9RmM> zczkBO!2eAA767gX{-$U1RK=!~VZd$Unew_=v#G{quH#Pv`Zx zQ{ZD5-zRXBf8Q3kxnB8D;Gc5*d?E00?B`PgKgs>3vA@lDPcxn;aD1MRVkt6WP!23p~WQ*$<7M|DEUKxR5vTU>*z``S;oWEWWNZxQX*=jN@_`K_k+KdLe&5 zuNS|-dogeBM~(jTI38{i@{@U7>jZAD!|o9{eHjlXJt*)K?1yavujcXoo4}8-{rd!d z70>&h1wMiCj|IM;?f**PeK^kb|4Wd%&&B@-0*n4mE`={(JI(%P{ATXo$`OEK@G7={ zvcR9_erp9@%yAwPxc)z2lv*Y539Nsez|A`OnZR%4ejgF|5+2tPf$PtN;Q6k=kFkGx z82`bT@%hg~%=Z&`70VA3_&02SslZoq98MDWe4f7=f!DGAg#zEt>#bej2U*V=ft%+| zKM}ae3)=)f9VZ*gPJuUaoWCOQcX_-A1pXZR_cMVfIRAVj@P+Ij2gfxwNB`f&@_7Ou z!u()?-_P+jTHr%i&t(FyWqFUlSECc4TqE%BHLUysf0f5$@~*M}Y4+Q#LjDMkcZ0yE zvEMcc+{E#(1@2;ghrmy;oi7P|JFknk1zyhfd@S&rd47)x{8=8?4+8&)^w$gD=#LpUv~oJ_29BaXwh!^dB&Ro{I!-##JqFWB+V{ zzs~c!P~c`t=zQaor*CG>(%$3f$Q9p1|*9J3nI_!(bRXlFL^@-rT>P zu*ste^WI7}|A1%we=qyFz=pGl)WaYfjwvmV^UMevj`HT~>5FVQF6mOz0>9tcaFl

F^(+y$2@1d)rQ;sywQfE ze3;{Ti@?oCq%R8Gd|9}kadbPUJfPtJrL^H_=M1*<(ndgiXggl$CW()Zb z*q(YDj(&FF;GitF;TX>yJde#b9OZp1A7b3tIUkikStIZtX;^I%_|F)BM&M5|{+hrK zGybW-&F`A01wN7O?8h&L8aqE>{9?w9KeO0B;|0Ez7tM5mSFrp%ftz)`OyF$3S|RX8 zj^}j(FXIOH3cL{~0m{F2gFh&6WB;Q9-@^0zguspbQvz>h`QLVf?-ckDzRuaz4gRvg zm*7M|d9@q-ErI_B`~Tf;@DBw3Df{h{Zt$Z5e}UuVt8Vba><>KI^AB%VbRWc*hBPkT z9?y9%<+x1`cS-VYI_lhM$7=*`_E}XDU)c&Tr3A|Sh?}g)6XIgClK4XjFSBC$8iW}6R%gsC) zt(8p3FZIp589Dsj6_;$K0r>nO|4_b<*K+~j*bgs*q7R1E--ArnQx9h z`zP%~AlsGwQ7>vqy}yX|V@j0v{|jJU*?;>`sDM(cPsyW{y$Nc%>VF;gZ`x!3_(((c zzY#F06Cm|F?*AAvwjyO8hB}F%_+vb8bt15(?5{w!EBkkJ;Xk}4l=eRf80s|R1d_^k zBlP(l9JH;N{>}M0sOzfz8@!-!ecFp@XU=<|($IFf({e#_rIf|@zc;#=e_V>Dy;(n9_6>3yP5(T9_zr4*7wvHy7E=s}Qf|(l=KUK2;ULG~ T8?dh0tEIZd$NH2!%J%;a8v8M` literal 25608 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 E04T{Q%m4rY diff --git a/monokai.o b/monokai.o index 6f670082aa843be3934aac4417aacb39a254467f..370716e80ac78d7131514ae0bfb726d65329b067 100644 GIT binary patch delta 3017 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 diff --git a/planeObj.o b/planeObj.o index 56b644e9d4e5ae610f8d80b738ba24cb305017c7..cf16ab65e109218e4175c61fe7e1c757c381c0f2 100644 GIT binary patch delta 8095 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 EA1Y*qhX4Qo delta 7991 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