| [5d30c1] | 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 | }
|
|---|