| 1 | 
 | 
|---|
| 2 | #include <stdio.h>
 | 
|---|
| 3 | #include <util/keyval/keyval.h>
 | 
|---|
| 4 | #include <util/render/render.h>
 | 
|---|
| 5 | #include <util/render/oogl.h>
 | 
|---|
| 6 | #include <util/render/object.h>
 | 
|---|
| 7 | #include <math/isosurf/surf.h>
 | 
|---|
| 8 | #include <chemistry/molecule/molecule.h>
 | 
|---|
| 9 | #include <chemistry/molecule/molrender.h>
 | 
|---|
| 10 | #include <chemistry/molecule/molshape.h>
 | 
|---|
| 11 | 
 | 
|---|
| 12 | #include <util/state/linkage.h>
 | 
|---|
| 13 | 
 | 
|---|
| 14 | using namespace sc;
 | 
|---|
| 15 | 
 | 
|---|
| 16 | int
 | 
|---|
| 17 | main(int argc, char** argv)
 | 
|---|
| 18 | {
 | 
|---|
| 19 |   int i;
 | 
|---|
| 20 |   const char* model = "stick";
 | 
|---|
| 21 |   const char* keyword = "molecule";
 | 
|---|
| 22 |   const char* inputfile = "molrender.in";
 | 
|---|
| 23 |   int level = 3;
 | 
|---|
| 24 |   enum InputType { PDB, KEYVAL } input = KEYVAL;
 | 
|---|
| 25 |   const char* render = 0;
 | 
|---|
| 26 |   int quiet = 0;
 | 
|---|
| 27 | 
 | 
|---|
| 28 |   for (i=1; i<argc; i++) {
 | 
|---|
| 29 |       if (!strcmp(argv[i], "-model")) {
 | 
|---|
| 30 |           i++;
 | 
|---|
| 31 |           model = argv[i];
 | 
|---|
| 32 |         }
 | 
|---|
| 33 |       else if (!strcmp(argv[i], "-quiet")) {
 | 
|---|
| 34 |           quiet = 1;
 | 
|---|
| 35 |         }
 | 
|---|
| 36 |       else if (!strcmp(argv[i], "-render")) {
 | 
|---|
| 37 |           i++;
 | 
|---|
| 38 |           render = argv[i];
 | 
|---|
| 39 |         }
 | 
|---|
| 40 |       else if (!strcmp(argv[i], "-keyword")) {
 | 
|---|
| 41 |           i++;
 | 
|---|
| 42 |           keyword = argv[i];
 | 
|---|
| 43 |         }
 | 
|---|
| 44 |       else if (!strcmp(argv[i], "-pdb")) {
 | 
|---|
| 45 |           i++;
 | 
|---|
| 46 |           input = PDB;
 | 
|---|
| 47 |           inputfile = argv[i];
 | 
|---|
| 48 |         }
 | 
|---|
| 49 |       else if (!strcmp(argv[i], "-keyval")) {
 | 
|---|
| 50 |           i++;
 | 
|---|
| 51 |           input = KEYVAL;
 | 
|---|
| 52 |           inputfile = argv[i];
 | 
|---|
| 53 |         }
 | 
|---|
| 54 |       else if (!strcmp(argv[i], "-level")) {
 | 
|---|
| 55 |           i++;
 | 
|---|
| 56 |           level = atoi(argv[i]);
 | 
|---|
| 57 |         }
 | 
|---|
| 58 |       else {
 | 
|---|
| 59 |           fprintf(stderr,"%s: unknown option: \"%s\"\n", argv[0], argv[i]);
 | 
|---|
| 60 |           abort();
 | 
|---|
| 61 |         }
 | 
|---|
| 62 |     }
 | 
|---|
| 63 | 
 | 
|---|
| 64 |   // Find the molecule.
 | 
|---|
| 65 |   Ref<Molecule> mol;
 | 
|---|
| 66 |   if (input == PDB) {
 | 
|---|
| 67 |       Ref<AssignedKeyVal> keyval = new AssignedKeyVal();
 | 
|---|
| 68 |       keyval->assign("pdb_file", inputfile);
 | 
|---|
| 69 |       mol = new Molecule(keyval.pointer());
 | 
|---|
| 70 |     }
 | 
|---|
| 71 |   else {
 | 
|---|
| 72 |       Ref<KeyVal> keyval = new ParsedKeyVal(inputfile);
 | 
|---|
| 73 |       mol = new Molecule(new PrefixKeyVal(keyval, keyword));
 | 
|---|
| 74 |     }
 | 
|---|
| 75 | 
 | 
|---|
| 76 |   // Set up the rendered molecule object.
 | 
|---|
| 77 |   Ref<AssignedKeyVal> tmpkv = new AssignedKeyVal();
 | 
|---|
| 78 |   Ref<AssignedKeyVal> keyval = new AssignedKeyVal();
 | 
|---|
| 79 | 
 | 
|---|
| 80 |   keyval->assign("molecule", mol.pointer());
 | 
|---|
| 81 |   keyval->assign("model", model);
 | 
|---|
| 82 | 
 | 
|---|
| 83 |   Ref<DescribedClass> atominfo = new AtomInfo(tmpkv.pointer());
 | 
|---|
| 84 |   keyval->assign("atominfo", atominfo);
 | 
|---|
| 85 |   tmpkv->clear();
 | 
|---|
| 86 | 
 | 
|---|
| 87 |   Ref<RenderedObject> molobject;
 | 
|---|
| 88 |   if (!strcmp(model,"stick")) {
 | 
|---|
| 89 |       molobject = new RenderedStickMolecule(keyval.pointer());
 | 
|---|
| 90 |     }
 | 
|---|
| 91 |   else if (!strcmp(model,"ball")) {
 | 
|---|
| 92 |       molobject = new RenderedBallMolecule(keyval.pointer());
 | 
|---|
| 93 |     }
 | 
|---|
| 94 |   else if (!strcmp(model,"connolly")) {
 | 
|---|
| 95 |       tmpkv->assign("molecule", mol.pointer());
 | 
|---|
| 96 |       tmpkv->assign("atominfo", atominfo);
 | 
|---|
| 97 |       Ref<DescribedClass> volume = new ConnollyShape(tmpkv.pointer());
 | 
|---|
| 98 |       tmpkv->clear();
 | 
|---|
| 99 |       tmpkv->assignboolean("verbose", !quiet);
 | 
|---|
| 100 |       Ref<DescribedClass> trisurf = new TriangulatedSurface(tmpkv.pointer());
 | 
|---|
| 101 |       tmpkv->clear();
 | 
|---|
| 102 |       tmpkv->assign("surface", trisurf);
 | 
|---|
| 103 |       tmpkv->assign("volume", volume);
 | 
|---|
| 104 |       tmpkv->assign("resolution", 1.0);
 | 
|---|
| 105 |       tmpkv->assignboolean("remove_short_edges", 0);
 | 
|---|
| 106 |       tmpkv->assignboolean("remove_slender_edges", 0);
 | 
|---|
| 107 |       Ref<DescribedClass> surface
 | 
|---|
| 108 |           = new TriangulatedImplicitSurface(tmpkv.pointer());
 | 
|---|
| 109 |       tmpkv->clear();
 | 
|---|
| 110 |       keyval->assign("surface", surface);
 | 
|---|
| 111 |       molobject = new RenderedMolecularSurface(keyval.pointer());
 | 
|---|
| 112 |     }
 | 
|---|
| 113 |   else {
 | 
|---|
| 114 |       fprintf(stderr,"%s: unknown model \"%s\"\n", argv[0], model);
 | 
|---|
| 115 |       abort();
 | 
|---|
| 116 |     }
 | 
|---|
| 117 | 
 | 
|---|
| 118 |   Ref<RenderedObjectSet> object;
 | 
|---|
| 119 | 
 | 
|---|
| 120 |   if (render) {
 | 
|---|
| 121 |       object = new RenderedObjectSet;
 | 
|---|
| 122 |       object->add(molobject);
 | 
|---|
| 123 |       Ref<Appearance> appearance = new Appearance;
 | 
|---|
| 124 |       appearance->level().set(level);
 | 
|---|
| 125 |       object->appearance(appearance);
 | 
|---|
| 126 |       if (object.null()) {
 | 
|---|
| 127 |           fprintf(stderr,"%s: got a null object to render\n",argv[0]);
 | 
|---|
| 128 |           abort();
 | 
|---|
| 129 |         }
 | 
|---|
| 130 | 
 | 
|---|
| 131 |       // Set up the renderer.
 | 
|---|
| 132 |       Ref<Render> renderer;
 | 
|---|
| 133 |       if (!strcmp("oogl", render)) {
 | 
|---|
| 134 |           renderer = new OOGLRender;
 | 
|---|
| 135 |         }
 | 
|---|
| 136 |       else {
 | 
|---|
| 137 |           fprintf(stderr,"%s: unknown renderer: \"%s\"\n", argv[0], render);
 | 
|---|
| 138 |         }
 | 
|---|
| 139 | 
 | 
|---|
| 140 |       // Render the object.
 | 
|---|
| 141 |       renderer->render(object.pointer());
 | 
|---|
| 142 |     }
 | 
|---|
| 143 | 
 | 
|---|
| 144 |   if (!quiet) {
 | 
|---|
| 145 |       ConnollyShape::print_counts();
 | 
|---|
| 146 |       CS2Sphere::print_counts();
 | 
|---|
| 147 |     }
 | 
|---|
| 148 | 
 | 
|---|
| 149 |   fflush(stdout);
 | 
|---|
| 150 |   fflush(stderr);
 | 
|---|
| 151 |   return 0;
 | 
|---|
| 152 | }
 | 
|---|