diff --git a/utils/Modeller/Makefile.am b/utils/Modeller/Makefile.am index 537a5a883..58a47e01b 100644 --- a/utils/Modeller/Makefile.am +++ b/utils/Modeller/Makefile.am @@ -1,4 +1,4 @@ -noinst_PROGRAMS = animassist normalmap +noinst_PROGRAMS = animassist normalmap photomodel # threedconvert_SOURCES = 3dconvert.cxx # threedconvert_LDADD = -lplibssg -lplibsg -lplibul \ @@ -9,3 +9,6 @@ animassist_LDADD = $(base_LIBS) normalmap_SOURCES = normalmap.cxx normalmap_LDADD = -lsgscreen $(opengl_LIBS) $(base_LIBS) -lz + +photomodel_SOURCES = photomodel.cxx +photomodel_LDADD = $(base_LIBS) -lsgbucket -lsgmath -lsgmisc -lsgdebug diff --git a/utils/Modeller/photomodel.cxx b/utils/Modeller/photomodel.cxx new file mode 100644 index 000000000..6526bb8bd --- /dev/null +++ b/utils/Modeller/photomodel.cxx @@ -0,0 +1,126 @@ +#include +#include // exit() + +#include +#include + + +int make_model( const char *texture, + double ll_lon, double ll_lat, + double lr_lon, double lr_lat, + double ur_lon, double ur_lat, + double ul_lon, double ul_lat, + const char *model ) +{ + // open the output file + FILE *out = fopen( model, "w" ); + if ( out == NULL ) { + printf("Error: cannot open %s for writing\n", model); + return 0; + } + + // compute polygon boundaries in local XY projection + double cen_lon = (ll_lon + lr_lon + ur_lon + ul_lon) / 4.0; + double cen_lat = (ll_lat + lr_lat + ur_lat + ul_lat) / 4.0; + + double az1, az2, dist; + double angle; + + geo_inverse_wgs_84( cen_lat, cen_lon, ll_lat, ll_lon, &az1, &az2, &dist ); + angle = az1 * SGD_DEGREES_TO_RADIANS; + double llx = sin(angle) * dist; + double lly = cos(angle) * dist; + printf( "az1 = %.3f dx = %.3f dy = %.3f\n", + az1, sin(angle) * dist, cos(angle) * dist ); + + geo_inverse_wgs_84( cen_lat, cen_lon, lr_lat, lr_lon, &az1, &az2, &dist ); + angle = az1 * SGD_DEGREES_TO_RADIANS; + double lrx = sin(angle) * dist; + double lry = cos(angle) * dist; + printf( "az1 = %.3f dx = %.3f dy = %.3f\n", + az1, sin(angle) * dist, cos(angle) * dist ); + + geo_inverse_wgs_84( cen_lat, cen_lon, ur_lat, ur_lon, &az1, &az2, &dist ); + angle = az1 * SGD_DEGREES_TO_RADIANS; + double urx = sin(angle) * dist; + double ury = cos(angle) * dist; + printf( "az1 = %.3f dx = %.3f dy = %.3f\n", + az1, sin(angle) * dist, cos(angle) * dist ); + + geo_inverse_wgs_84( cen_lat, cen_lon, ul_lat, ul_lon, &az1, &az2, &dist ); + angle = az1 * SGD_DEGREES_TO_RADIANS; + double ulx = sin(angle) * dist; + double uly = cos(angle) * dist; + printf( "az1 = %.3f dx = %.3f dy = %.3f\n", + az1, sin(angle) * dist, cos(angle) * dist ); + + fprintf( out, "AC3Db\n" ); + fprintf( out, "MATERIAL \"DefaultWhite\" rgb 1 1 1 amb 1 1 1 emis 0 0 0 spec 0.5 0.5 0.5 shi 64 trans 0\n" ); + fprintf( out, "OBJECT world\n" ); + fprintf( out, "kids 1\n" ); + fprintf( out, "OBJECT poly\n" ); + fprintf( out, "name \"terrain\"\n" ); + fprintf( out, "data 9\n" ); + fprintf( out, "Plane.073\n" ); + fprintf( out, "texture \"%s\"\n", texture ); + fprintf( out, "texrep 1 1\n" ); + fprintf( out, "crease 30.000000\n" ); + fprintf( out, "numvert 4\n" ); + fprintf( out, "%.3f 0 %.3f\n", lry, lrx ); + fprintf( out, "%.3f 0 %.3f\n", lly, llx ); + fprintf( out, "%.3f 0 %.3f\n", uly, ulx ); + fprintf( out, "%.3f 0 %.3f\n", ury, urx ); + fprintf( out, "numsurf 1\n" ); + fprintf( out, "SURF 0x00\n" ); + fprintf( out, "mat 0\n" ); + fprintf( out, "refs 4\n" ); + fprintf( out, "0 0.0 1.0\n" ); + fprintf( out, "3 0.0 0.0\n" ); + fprintf( out, "2 1.0 0.0\n" ); + fprintf( out, "1 1.0 1.0\n" ); + fprintf( out, "kids 0\n" ); + + fclose( out ); + + SGBucket b( cen_lon, cen_lat ); + + printf("\n"); + printf("Model is created as %s\n", model); + printf("\n"); + printf("Now copy the .ac and .rgb file to your Model directory\n"); + printf("and add the following line to your .stg file:\n"); + printf("\n"); + printf(" %s/%s.stg\n", + b.gen_base_path().c_str(), b.gen_index_str().c_str()); + printf("\n"); + printf("OBJECT_SHARED Models/MNUAV/%s %.6f %.6f ALT_IN_METERS 0.00\n", + model, cen_lon, cen_lat); + return 1; +} + + +void usage( char *prog ) { + printf("Usage: %s photo.rgb ll_lon ll_lat lr_lon lr_lat ur_lon ur_lat ul_lon ul_lat model.ac\n", prog); + printf("Usage: %s photo.rgb left_lon right_lon lower_lat upper_lat model.ac\n", prog); + + exit( 0 ); +} + + +int main( int argc, char **argv ) { + if ( argc == 11 ) { + make_model( argv[1], + atof(argv[2]), atof(argv[3]), atof(argv[4]), atof(argv[5]), + atof(argv[6]), atof(argv[7]), atof(argv[8]), atof(argv[9]), + argv[10] ); + } else if ( argc == 7 ) { + make_model( argv[1], + atof(argv[2]), atof(argv[4]), atof(argv[3]), atof(argv[4]), + atof(argv[3]), atof(argv[5]), atof(argv[2]), atof(argv[5]), + argv[6] ); + } else { + usage( argv[0] ); + } + + return 0; +}