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 | }
|
---|