source: tags/arb_5.5/RNA3D/RNA3D_Renderer.cxx

Last change on this file was 5390, checked in by westram, 16 years ago
  • TAB-Ex
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.0 KB
Line 
1#include "RNA3D_GlobalHeader.hxx"
2#include "RNA3D_Global.hxx"
3#include "RNA3D_Textures.hxx"
4#include "RNA3D_Renderer.hxx"
5#include "RNA3D_StructureData.hxx"
6#include "RNA3D_OpenGLGraphics.hxx"
7#include "RNA3D_Graphics.hxx"
8
9using namespace std;
10
11// OpenGLGraphics *G = new OpenGLGraphics();
12// ColorRGBf ApplicationBGColor = ColorRGBf(0,0,0);
13
14GLRenderer::GLRenderer(void){
15    fSkeletonSize = 0.5;
16    iBackBone = iColorise = 0;
17    ObjectSize = 8.0;
18    iDisplayBases = iBaseMode = 0;
19    iBaseHelix  = iBaseUnpairHelix  = iBaseNonHelix  = 0;
20    iShapeHelix = iShapeUnpairHelix = iShapeNonHelix = 0;
21    iDisplayHelix = iHelixMidPoint = iHelixBackBone = iHelixNrs = 0;
22    iDispTerInt = 0;
23    iStartHelix  = 1;
24    iEndHelix    = 101;
25    fHelixSize = 1.0;
26    iDispPos = 0;
27    iDispCursorPos = 0;
28    iMapSpecies = iMapSpeciesBase = iMapSpeciesPos = 0;
29    iMapSpeciesDels = iMapSpeciesMiss = 0;
30    iMapSpeciesIns = iMapSpeciesInsInfo = 0;
31
32    G                  = new OpenGLGraphics();
33}
34
35GLRenderer::~GLRenderer(void){
36}
37
38void GLRenderer::DisplayHelices(void){
39    G->SetColor(RNA3D_GC_HELIX);
40    glLineWidth(fHelixSize);
41    for(int i = iStartHelix; i <= iEndHelix; i++) {
42        glBegin(GL_LINES);
43        glListBase(RNA3D->cStructure->HelixBase);
44        glCallList(RNA3D->cStructure->HelixBase+i);
45        glEnd();
46    }
47}
48
49void GLRenderer::DisplayHelixBackBone(void){
50    G->SetColor(RNA3D_GC_HELIX_SKELETON);
51    glLineWidth(0.5);
52
53    glPushAttrib(GL_LIST_BIT);
54    glListBase(RNA3D->cStructure->HelixBase);
55
56    int rnaType = RNA3D->cStructure->FindTypeOfRNA();
57
58    switch (rnaType) {
59        case LSU_23S:
60            for(int i = 1; i <= 101; i++) {
61                glBegin(GL_LINES);
62                glCallList(RNA3D->cStructure->HelixBase+i);
63                glEnd();
64            }
65            break;
66        case LSU_5S:
67            for(int i = 1; i <= 5; i++) {
68                glBegin(GL_LINES);
69                glCallList(RNA3D->cStructure->HelixBase+i);
70                glEnd();
71            }
72            break;
73        case SSU_16S:
74            for(int i = 1; i <= 50; i++) {
75                glBegin(GL_LINES);
76                glCallList(RNA3D->cStructure->HelixBase+i);
77                glEnd();
78            }
79            break;
80    }
81
82    glPopAttrib();
83}
84
85void GLRenderer::DisplayBasePositions(void){
86
87    G->SetColor(RNA3D_GC_MOL_BACKBONE);
88    glCallList(STRUCTURE_POS_ANCHOR);
89
90    G->SetColor(RNA3D_GC_MOL_POS);
91    glCallList(STRUCTURE_POS);
92
93}
94
95void GLRenderer::DisplayMappedSpInsertions(void){
96
97    G->SetColor(RNA3D_GC_INSERTION);
98    glCallList(MAP_SPECIES_INSERTION_BASES_ANCHOR);
99
100    G->SetColor(RNA3D_GC_INSERTION);
101    glCallList(MAP_SPECIES_INSERTION_BASES);
102}
103
104void GLRenderer::DisplayMappedSpBasePositions(void){
105
106    G->SetColor(RNA3D_GC_MOL_BACKBONE);
107    glCallList(MAP_SPECIES_BASE_DIFFERENCE_POS_ANCHOR);
108
109    G->SetColor(RNA3D_GC_MAPPED_SPECIES);
110    glCallList(MAP_SPECIES_BASE_DIFFERENCE_POS);
111}
112
113void GLRenderer::DisplayHelixMidPoints(Texture2D *cImages){
114    glPointSize(fHelixSize + 5); // size will be propotional to the Helix Thickness specified !!
115    glBindTexture(GL_TEXTURE_2D, cImages->texture[CIRCLE]);
116    G->SetColor(RNA3D_GC_HELIX_MIDPOINT);
117    glCallList(HELIX_NUMBERS_POINTS);
118}
119
120void GLRenderer::DisplayHelixNumbers(void){
121    G->SetColor(RNA3D_GC_FOREGROUND);
122    glCallList(HELIX_NUMBERS);
123}
124
125void GLRenderer::DoHelixMapping(void) {
126    if (iDisplayHelix) {
127        if (iHelixNrs) {
128            DisplayHelixNumbers();
129        }
130        if (iHelixBackBone) {
131            DisplayHelixBackBone();
132        }
133        DisplayHelices();
134    }
135    // Displaying Tertiary Interactions of E.coli 16S ribosomal RNA
136    if(iDispTerInt) {
137        glLineWidth(fHelixSize + 1); // Thicker than the normal Helix Strands
138        G->SetColor(RNA3D_GC_PSEUDOKNOT);
139        glCallList(ECOLI_TERTIARY_INTRACTION_PSEUDOKNOTS);
140        G->SetColor(RNA3D_GC_TRIPLE_BASE);
141        glCallList(ECOLI_TERTIARY_INTRACTION_TRIPLE_BASES);
142    }
143}
144
145void GLRenderer::DisplayMoleculeName(int /*w*/, int /*h*/, Structure3D *cStr){
146    char *pSpeciesName;
147
148    if(cStr->iMapEnable && iMapSpecies) {
149        pSpeciesName = RNA3D->root->awar(AWAR_3D_SELECTED_SPECIES)->read_string();
150    }
151    else {
152        pSpeciesName = (char *) "Eschericia Coli : Master Template";
153    }
154
155    float x, y,z;     x=1.1; y=z=1.0;
156    float line = 0.05;
157
158    glPushMatrix();
159    G->SetColor(RNA3D_GC_FOREGROUND);
160    G->PrintString(x, y, z, pSpeciesName, GLUT_BITMAP_8_BY_13);
161
162    char buf[25];
163    if (cStr->iMapEnable && iMapSpecies){
164        G->SetColor(RNA3D_GC_MAPPED_SPECIES);
165        sprintf(buf, "Mutations  = %d", cStr->iTotalSubs);
166        G->PrintString(x, (y-(1*line)), z, buf, GLUT_BITMAP_8_BY_13);
167        sprintf(buf, "Deletions  = %d", cStr->iTotalDels);
168        G->PrintString(x, (y-(2*line)), z, buf, GLUT_BITMAP_8_BY_13);
169        sprintf(buf, "Insertions = %d", cStr->iTotalIns);
170        G->PrintString(x, (y-(3*line)), z, buf, GLUT_BITMAP_8_BY_13);
171    }
172
173    //     {
174    //         if (RNA3D->bDisplayComments) {
175    //             G->SetColor(RNA3D_GC_COMMENTS);
176    //             G->PrintString(x-w/2.5, y, 0, "[Escape switches off the comments]", GLUT_BITMAP_8_BY_13);
177    //             G->PrintString(x-w/2.5, y-10, 0, "||||||||||||||||||||||||||||||||||", GLUT_BITMAP_8_BY_13);
178    //             G->PrintComment(x-w/2.5, y-10, 0, globalComment);
179    //         }
180    //     }
181    glPopMatrix();
182}
183
184void GLRenderer::DisplayMoleculeMask(int w, int h){
185    // displays a rectangular mask cutting thru the centre of the molecule
186    glPushMatrix();
187    glScalef(0.5, 0.5, 0.5);
188
189    if (RNA3D->bDisplayMask) {
190        G->SetColor(RNA3D_GC_MASK);
191        G->DrawBox(0,0,w,h);
192    }
193    glPopMatrix();
194}
195
196void GLRenderer::DisplayMolecule(Structure3D *cStr) {
197    glLineWidth(fSkeletonSize);
198
199    static ColorRGBf HelixOldColor         = G->GetColor(RNA3D_GC_BASES_HELIX);
200    static ColorRGBf UnpairedHelixOldColor = G->GetColor(RNA3D_GC_BASES_UNPAIRED_HELIX);
201    static ColorRGBf NonHelixOldColor      = G->GetColor(RNA3D_GC_BASES_NON_HELIX);
202
203    if(iColorise){
204        ColorRGBf HelixNewColor         = G->GetColor(RNA3D_GC_BASES_HELIX);
205        ColorRGBf UnpairedHelixNewColor = G->GetColor(RNA3D_GC_BASES_UNPAIRED_HELIX);
206        ColorRGBf NonHelixNewColor      = G->GetColor(RNA3D_GC_BASES_NON_HELIX);
207
208        if ((HelixOldColor == HelixNewColor) &&
209            (UnpairedHelixOldColor == UnpairedHelixNewColor) &&
210            (NonHelixOldColor == NonHelixNewColor))
211        {
212            glCallList(STRUCTURE_BACKBONE_CLR);
213        }
214        else {
215            HelixOldColor         = HelixNewColor;
216            UnpairedHelixOldColor = UnpairedHelixNewColor;
217            NonHelixOldColor      = NonHelixNewColor;
218
219            glDeleteLists(STRUCTURE_BACKBONE_CLR,1);
220            cStr->GenerateMoleculeSkeleton();
221            glCallList(STRUCTURE_BACKBONE_CLR);
222        }
223    }
224    else if (iBackBone) {
225        G->SetColor(RNA3D_GC_MOL_BACKBONE);
226        glCallList(STRUCTURE_BACKBONE);
227    }
228
229    if(iDispPos) {
230        DisplayBasePositions();
231    }
232
233    if(cStr->iMapEnable) {
234        if (cStr->iMapSearch) {
235            glLineWidth(ObjectSize/3);
236            glCallList(MAP_SEARCH_STRINGS_BACKBONE);
237        }
238        if(iMapSpecies) {
239            if (iMapSpeciesIns && iMapSpeciesInsInfo) {
240                DisplayMappedSpInsertions();
241            }
242            if(iMapSpeciesPos) {
243                DisplayMappedSpBasePositions();
244            }
245        }
246    }
247}
248
249void GLRenderer::BeginTexturizer(){
250    glDisable(GL_CULL_FACE);
251    glDisable(GL_LIGHTING);
252    glDisable(GL_POINT_SMOOTH);
253    glDepthMask(GL_TRUE);
254    glEnable(GL_TEXTURE_2D);
255
256    if (RNA3D->bPointSpritesSupported) {
257        glEnable(GL_ALPHA_TEST);
258        glAlphaFunc(GL_GREATER, 0.1);
259        glEnable(GL_BLEND);
260        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
261
262        float quadratic[] =  { 0.0f, 0.0f, 1.0f };
263        glPointParameterfvEXT( GL_DISTANCE_ATTENUATION_EXT, quadratic );
264
265        // Query for the max point size supported by the hardware
266        float maxSize = 0.0f;
267        glGetFloatv( GL_POINT_SIZE_MAX_EXT, &maxSize );
268        glPointSize(MIN(ObjectSize,maxSize) );
269
270        glPointParameterfEXT( GL_POINT_SIZE_MIN_EXT, 1.0f );
271        glPointParameterfEXT( GL_POINT_SIZE_MAX_EXT, MIN(65,maxSize));
272
273        glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
274        glEnable(GL_POINT_SPRITE_ARB);
275    }
276}
277
278void GLRenderer::EndTexturizer(){
279    //    glDisable(GL_TEXTURE_2D);
280    if (RNA3D->bPointSpritesSupported) {
281        float defaultAttenuation[3] = { 1.0f, 0.0f, 0.0f };
282        glPointParameterfvEXT( GL_DISTANCE_ATTENUATION_EXT, defaultAttenuation );
283
284        glDisable(GL_POINT_SPRITE_ARB);
285        glDisable(GL_BLEND);
286        glDisable(GL_ALPHA_TEST);
287    }
288}
289
290#define POLOFFON  glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1,1); glDepthFunc(GL_LESS);
291#define POLOFFOFF glDepthFunc(GL_LEQUAL); glPolygonOffset(0,0); glDisable(GL_POLYGON_OFFSET_FILL);
292
293void GLRenderer::TexturizeStructure(Texture2D *cImages, Structure3D *cStructure) {
294
295    if (cStructure->iMapEnable ) {
296        glPointSize(ObjectSize*2);
297        if (cStructure->iMapSAI) {
298            glBindTexture(GL_TEXTURE_2D, cImages->texture[HEXAGON]);
299            glCallList(MAP_SAI_TO_STRUCTURE);
300        }
301        if (cStructure->iMapSearch) {
302            glPointSize(ObjectSize*1.5);
303            glBindTexture(GL_TEXTURE_2D, cImages->texture[CIRCLE]);
304            glCallList(MAP_SEARCH_STRINGS_TO_STRUCTURE);
305        }
306    }
307
308    if(iDispCursorPos) {
309        glPointSize(ObjectSize+8);
310        G->SetColor(RNA3D_GC_CURSOR_POSITION);
311        glBindTexture(GL_TEXTURE_2D, cImages->texture[DIAMOND]);
312        glCallList(ECOLI_CURSOR_POSITION);
313    }
314
315    glPointSize(ObjectSize);
316    if (iDisplayBases)
317    {
318        switch(iBaseMode) {
319            case CHARACTERS: {
320
321                POLOFFON
322                {  // Print Background textures
323                    ColorRGBf& ApplicationBGColor = G->ApplicationBGColor;
324                    glColor4f(ApplicationBGColor.red, ApplicationBGColor.green, ApplicationBGColor.blue, 1);
325                    glBindTexture(GL_TEXTURE_2D, cImages->texture[CIRCLE]);
326
327                    if(iBaseHelix) {
328                        glCallList(HELIX_A);
329                        glCallList(HELIX_G);
330                        glCallList(HELIX_C);
331                        glCallList(HELIX_U);
332                    }
333
334                    if(iBaseUnpairHelix) {
335                        glCallList(UNPAIRED_HELIX_A);
336                        glCallList(UNPAIRED_HELIX_G);
337                        glCallList(UNPAIRED_HELIX_C);
338                        glCallList(UNPAIRED_HELIX_U);
339                    }
340
341                    if(iBaseNonHelix) {
342                        glCallList(NON_HELIX_A);
343                        glCallList(NON_HELIX_G);
344                        glCallList(NON_HELIX_C);
345                        glCallList(NON_HELIX_U);
346                    }
347                }
348                POLOFFOFF
349
350                {  // Print textures representing the actual bases
351                    glBindTexture(GL_TEXTURE_2D, cImages->texture[LETTER_A]);
352                    {
353                        if(iBaseHelix) {
354                            G->SetColor(RNA3D_GC_BASES_HELIX);
355                            glCallList(HELIX_A);
356                        }
357                        if(iBaseUnpairHelix) {
358                            G->SetColor(RNA3D_GC_BASES_UNPAIRED_HELIX);
359                            glCallList(UNPAIRED_HELIX_A);
360                        }
361                        if(iBaseNonHelix) {
362                            G->SetColor(RNA3D_GC_BASES_NON_HELIX);
363                            glCallList(NON_HELIX_A);
364                        }
365                    }
366
367                    glBindTexture(GL_TEXTURE_2D, cImages->texture[LETTER_G]);
368                    {
369                        if(iBaseHelix) {
370                            G->SetColor(RNA3D_GC_BASES_HELIX);
371                            glCallList(HELIX_G);
372                        }
373                        if(iBaseUnpairHelix) {
374                            G->SetColor(RNA3D_GC_BASES_UNPAIRED_HELIX);
375                            glCallList(UNPAIRED_HELIX_G);
376                        }
377                        if(iBaseNonHelix) {
378                            G->SetColor(RNA3D_GC_BASES_NON_HELIX);
379                            glCallList(NON_HELIX_G);
380                        }
381                    }
382
383                    glBindTexture(GL_TEXTURE_2D, cImages->texture[LETTER_C]);
384                    {
385                        if(iBaseHelix) {
386                            G->SetColor(RNA3D_GC_BASES_HELIX);
387                            glCallList(HELIX_C);
388                        }
389                        if(iBaseUnpairHelix) {
390                            G->SetColor(RNA3D_GC_BASES_UNPAIRED_HELIX);
391                            glCallList(UNPAIRED_HELIX_C);
392                        }
393                        if(iBaseNonHelix) {
394                            G->SetColor(RNA3D_GC_BASES_NON_HELIX);
395                            glCallList(NON_HELIX_C);
396                        }
397                    }
398
399                    glBindTexture(GL_TEXTURE_2D, cImages->texture[LETTER_U]);
400                    {
401                        if(iBaseHelix) {
402                            G->SetColor(RNA3D_GC_BASES_HELIX);
403                            glCallList(HELIX_U);
404                        }
405                        if(iBaseUnpairHelix) {
406                            G->SetColor(RNA3D_GC_BASES_UNPAIRED_HELIX);
407                            glCallList(UNPAIRED_HELIX_U);
408                        }
409                        if(iBaseNonHelix) {
410                            G->SetColor(RNA3D_GC_BASES_NON_HELIX);
411                            glCallList(NON_HELIX_U);
412                        }
413                    }
414                }
415                break;
416            }
417            case SHAPES:
418                if(iBaseHelix) {
419                    glBindTexture(GL_TEXTURE_2D, cImages->texture[iShapeHelix]);
420                    G->SetColor(RNA3D_GC_BASES_HELIX);
421                    glCallList(HELIX_A); glCallList(HELIX_G); glCallList(HELIX_C); glCallList(HELIX_U);
422                }
423                if(iBaseUnpairHelix) {
424                    glBindTexture(GL_TEXTURE_2D, cImages->texture[iShapeUnpairHelix]);
425                    G->SetColor(RNA3D_GC_BASES_UNPAIRED_HELIX);
426                    glCallList(UNPAIRED_HELIX_A); glCallList(UNPAIRED_HELIX_G); glCallList(UNPAIRED_HELIX_C); glCallList(UNPAIRED_HELIX_U);
427                }
428                if(iBaseNonHelix) {
429                    glBindTexture(GL_TEXTURE_2D, cImages->texture[iShapeNonHelix]);
430                    G->SetColor(RNA3D_GC_BASES_NON_HELIX);
431                    glCallList(NON_HELIX_A); glCallList(NON_HELIX_G); glCallList(NON_HELIX_C); glCallList(NON_HELIX_U);
432                }
433                break;
434        }
435    }
436
437    if (iDisplayHelix && iHelixMidPoint) {
438        DisplayHelixMidPoints(cImages);  // Draw circles at the midpoint of each Helix
439    }
440
441    if (cStructure->iMapEnable && iMapSpecies) {
442        if(iMapSpeciesBase) {
443            glBindTexture(GL_TEXTURE_2D, cImages->texture[CIRCLE]);
444
445            glPointSize(ObjectSize+4);
446            G->SetColor(RNA3D_GC_MAPPED_SPECIES);
447            glCallList(MAP_SPECIES_BASE_A); glCallList(MAP_SPECIES_BASE_U);
448            glCallList(MAP_SPECIES_BASE_G); glCallList(MAP_SPECIES_BASE_C);
449
450            glPointSize(ObjectSize);
451            G->SetColor(RNA3D_GC_FOREGROUND);
452            glCallList(MAP_SPECIES_BASE_A); glCallList(MAP_SPECIES_BASE_U);
453            glCallList(MAP_SPECIES_BASE_G); glCallList(MAP_SPECIES_BASE_C);
454
455            glPointSize(ObjectSize);
456            G->SetColor(RNA3D_GC_MAPPED_SPECIES);
457            glBindTexture(GL_TEXTURE_2D, cImages->texture[LETTER_A]);  glCallList(MAP_SPECIES_BASE_A);
458            glBindTexture(GL_TEXTURE_2D, cImages->texture[LETTER_G]);  glCallList(MAP_SPECIES_BASE_G);
459            glBindTexture(GL_TEXTURE_2D, cImages->texture[LETTER_C]);  glCallList(MAP_SPECIES_BASE_C);
460            glBindTexture(GL_TEXTURE_2D, cImages->texture[LETTER_U]);  glCallList(MAP_SPECIES_BASE_U);
461        }
462
463        if(iMapSpeciesMiss) {
464            glPointSize(ObjectSize);
465            G->SetColor(RNA3D_GC_MAPPED_SPECIES);
466            glBindTexture(GL_TEXTURE_2D, cImages->texture[CIRCLE]);
467            glCallList(MAP_SPECIES_MISSING);
468            glPointSize(ObjectSize-2);
469            G->SetColor(RNA3D_GC_FOREGROUND);
470            glBindTexture(GL_TEXTURE_2D, cImages->texture[QUESTION]);
471            glCallList(MAP_SPECIES_MISSING);
472        }
473
474        if(iMapSpeciesDels) {
475            glPointSize(ObjectSize);
476            G->SetColor(RNA3D_GC_DELETION);
477            glBindTexture(GL_TEXTURE_2D, cImages->texture[CIRCLE]);
478            glCallList(MAP_SPECIES_DELETION);
479            glPointSize(ObjectSize-2);
480            G->SetColor(RNA3D_GC_FOREGROUND);
481            glBindTexture(GL_TEXTURE_2D, cImages->texture[DANGER]);
482            glCallList(MAP_SPECIES_DELETION);
483        }
484
485        if(iMapSpeciesIns) {
486            glPointSize(ObjectSize*3);
487            G->SetColor(RNA3D_GC_INSERTION);
488            glBindTexture(GL_TEXTURE_2D, cImages->texture[CONE_DOWN]);
489            glCallList(MAP_SPECIES_INSERTION_POINTS);
490        }
491    }
492}
Note: See TracBrowser for help on using the repository browser.