00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "TEveFrameBoxGL.h"
00013 #include "TEveFrameBox.h"
00014
00015 #include "TGLIncludes.h"
00016 #include "TGLUtil.h"
00017
00018 #include "TMath.h"
00019
00020
00021
00022
00023
00024
00025 ClassImp(TEveFrameBoxGL);
00026
00027
00028 void TEveFrameBoxGL::RenderFrame(const TEveFrameBox& b, Bool_t fillp)
00029 {
00030
00031
00032 const Float_t * p = b.fFramePoints;
00033 Float_t normal[3];
00034
00035 if (b.fFrameType == TEveFrameBox::kFT_Quad)
00036 {
00037 if (fillp)
00038 {
00039 TMath::Normal2Plane(p, p+3, p+6, normal);
00040 glNormal3fv(normal);
00041 glBegin(GL_POLYGON);
00042 }
00043 else
00044 {
00045 glBegin(GL_LINE_LOOP);
00046 }
00047 Int_t nPoints = b.fFrameSize / 3;
00048 for (Int_t i = 0; i < nPoints; ++i, p += 3)
00049 glVertex3fv(p);
00050 glEnd();
00051 }
00052 else if (b.fFrameType == TEveFrameBox::kFT_Box)
00053 {
00054 if (fillp)
00055 {
00056 glBegin(GL_QUADS);
00057 TMath::Normal2Plane(p, p+3, p+6, normal);
00058 glNormal3fv(normal);
00059 glVertex3fv(p); glVertex3fv(p + 3);
00060 glVertex3fv(p + 6); glVertex3fv(p + 9);
00061
00062 TMath::Normal2Plane(p+21, p+18, p+15, normal);
00063 glNormal3fv(normal);
00064 glVertex3fv(p + 21); glVertex3fv(p + 18);
00065 glVertex3fv(p + 15); glVertex3fv(p + 12);
00066
00067 TMath::Normal2Plane(p, p+12, p+15, normal);
00068 glNormal3fv(normal);
00069 glVertex3fv(p); glVertex3fv(p + 12);
00070 glVertex3fv(p + 15); glVertex3fv(p + 3);
00071
00072 TMath::Normal2Plane(p+9, p+6, p+18, normal);
00073 glNormal3fv(normal);
00074 glVertex3fv(p + 9); glVertex3fv(p + 6);
00075 glVertex3fv(p + 18); glVertex3fv(p + 21);
00076
00077 TMath::Normal2Plane(p, p+9, p+21, normal);
00078 glNormal3fv(normal);
00079 glVertex3fv(p); glVertex3fv(p + 9);
00080 glVertex3fv(p + 21); glVertex3fv(p + 12);
00081
00082 TMath::Normal2Plane(p+3, p+15, p+18, normal);
00083 glNormal3fv(normal);
00084 glVertex3fv(p + 3); glVertex3fv(p + 15);
00085 glVertex3fv(p + 18); glVertex3fv(p + 6);
00086 glEnd();
00087 }
00088 else
00089 {
00090 glBegin(GL_LINE_STRIP);
00091 glVertex3fv(p); glVertex3fv(p + 3);
00092 glVertex3fv(p + 6); glVertex3fv(p + 9);
00093 glVertex3fv(p);
00094 glVertex3fv(p + 12); glVertex3fv(p + 15);
00095 glVertex3fv(p + 18); glVertex3fv(p + 21);
00096 glVertex3fv(p + 12);
00097 glEnd();
00098 glBegin(GL_LINES);
00099 glVertex3fv(p + 3); glVertex3fv(p + 15);
00100 glVertex3fv(p + 6); glVertex3fv(p + 18);
00101 glVertex3fv(p + 9); glVertex3fv(p + 21);
00102 glEnd();
00103 }
00104 }
00105 }
00106
00107
00108 void TEveFrameBoxGL::Render(const TEveFrameBox* box)
00109 {
00110
00111
00112 const TEveFrameBox& b = *box;
00113
00114 glPushAttrib(GL_POLYGON_BIT | GL_LINE_BIT | GL_ENABLE_BIT);
00115
00116 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
00117 glEnable(GL_COLOR_MATERIAL);
00118 glDisable(GL_CULL_FACE);
00119
00120 if (b.fDrawBack)
00121 {
00122 GLboolean lmts;
00123 glGetBooleanv(GL_LIGHT_MODEL_TWO_SIDE, &lmts);
00124 if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
00125
00126 glEnable(GL_POLYGON_OFFSET_FILL);
00127 glPolygonOffset(2, 2);
00128 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00129
00130 if (b.fBackRGBA[3] < 255)
00131 {
00132 glEnable(GL_BLEND);
00133 glDepthMask(GL_FALSE);
00134 }
00135
00136 TGLUtil::Color4ubv(b.fBackRGBA);
00137 RenderFrame(b, kTRUE);
00138
00139 if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
00140 }
00141
00142 glDisable(GL_LIGHTING);
00143 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00144 glEnable(GL_BLEND);
00145 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00146 glEnable(GL_LINE_SMOOTH);
00147
00148 TGLUtil::LineWidth(b.fFrameWidth);
00149 TGLUtil::Color4ubv(b.fFrameRGBA);
00150 RenderFrame(b, b.fFrameFill);
00151
00152 glPopAttrib();
00153 }