00001 #include "glwx.h"
00002
00003 GUIClippedRectangle::GUIClippedRectangle(int size)
00004 {
00005 setTextureRectangle(0,0,1,1);
00006 setBordersColor(0.0f, 0.9f, 0.0f);
00007 setClipSize(size);
00008 setBGColor(0.413f, 0.7f, 0.52f, 0.75f);
00009
00010 drawBackground = false;
00011 drawBounds = false;
00012 }
00013
00014 void GUIClippedRectangle::setClipSize(int clipSizeArg)
00015 {
00016 clipSize = clamp(clipSizeArg, 0, 100);
00017 }
00018
00019 int GUIClippedRectangle::getClipSize()
00020 {
00021 return clipSize;
00022 }
00023
00024 void GUIClippedRectangle::setVisibleBounds(bool visibleArg)
00025 {
00026 drawBounds = visibleArg;
00027 }
00028
00029 bool GUIClippedRectangle::boundsVisible()
00030 {
00031 return drawBounds;
00032 }
00033
00034 bool GUIClippedRectangle::loadXMLClippedRectangleInfo(const TiXmlElement *element)
00035 {
00036 if(!element)
00037 return false;
00038
00039 const TiXmlElement *absolutePriority = XMLArbiter::getChildElementByName(element, "Texture");
00040 setVisibleBounds(XMLArbiter::analyzeBooleanAttr(element, "drawBounds", drawBounds));
00041 enableBGColor(XMLArbiter::analyzeBooleanAttr(element, "drawBackground", drawBackground));
00042 setClipSize(XMLArbiter::fillComponents1i(element, "clipSize", clipSize));
00043
00044 if(absolutePriority)
00045 texture.loadXMLSettings(absolutePriority);
00046
00047 for(const TiXmlElement *child = element->FirstChildElement();
00048 child;
00049 child = child->NextSiblingElement() )
00050 {
00051 const char * value = child->Value();
00052
00053 if(!value)
00054 continue;
00055
00056 if(!strcmp(value, "TextureRectangle"))
00057 setTextureRectangle(XMLArbiter::fillComponents4f(child, textureRectangle));
00058
00059 if(!strcmp(value, "BordersColor"))
00060 setBordersColor(XMLArbiter::fillComponents3f(child, bordersColor));
00061
00062 if(!strcmp(value, "BGColor"))
00063 setBGColor(XMLArbiter::fillComponents4f(child, bgColor));
00064 }
00065
00066 return true;
00067 }
00068
00069 void GUIClippedRectangle::setBGColor(const Tuple4f& color)
00070 {
00071 setBGColor(color.x, color.y, color.z, color.w);
00072 }
00073
00074 void GUIClippedRectangle::setBGColor(float r, float g, float b, float a)
00075 {
00076 bgColor.set(clamp(r, 0.0f, 255.0f),
00077 clamp(g, 0.0f, 255.0f),
00078 clamp(b, 0.0f, 255.0f),
00079 clamp(a, 0.0f, 255.0f));
00080
00081 bgColor.x /= (bgColor.x > 1.0) ? 255.0f : 1.0f;
00082 bgColor.y /= (bgColor.y > 1.0) ? 255.0f : 1.0f;
00083 bgColor.z /= (bgColor.z > 1.0) ? 255.0f : 1.0f;
00084 bgColor.w /= (bgColor.w > 1.0) ? 255.0f : 1.0f;
00085 }
00086
00087 void GUIClippedRectangle::setBordersColor(const Tuple3f& color)
00088 {
00089 setBordersColor(color.x, color.y, color.z);
00090 }
00091
00092 const Tuple3f &GUIClippedRectangle::getBordersColor()
00093 {
00094 return bordersColor;
00095 }
00096
00097 void GUIClippedRectangle::setBordersColor(float r, float g, float b)
00098 {
00099 bordersColor.set(clamp(r, 0.0f, 255.0f),
00100 clamp(g, 0.0f, 255.0f),
00101 clamp(b, 0.0f, 255.0f));
00102 bordersColor.x /= (bordersColor.x > 1.0) ? 255.0f : 1.0f;
00103 bordersColor.y /= (bordersColor.y > 1.0) ? 255.0f : 1.0f;
00104 bordersColor.z /= (bordersColor.z > 1.0) ? 255.0f : 1.0f;
00105 }
00106
00107 void GUIClippedRectangle::renderClippedBounds()
00108 {
00109 if(drawBackground || drawBounds)
00110 {
00111 glVertexPointer(2, GL_INT, 0, vertices[0]);
00112 glEnableClientState(GL_VERTEX_ARRAY);
00113
00114 if(texture.getID() && drawBackground)
00115 {
00116 glTexCoordPointer(2, GL_FLOAT, 0, texCoords[0]) ;
00117 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00118 texture.activate();
00119 }
00120 }
00121
00122 if(drawBackground)
00123 {
00124 glEnable(GL_BLEND);
00125 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00126 glColor4fv(bgColor);
00127 glDrawArrays(GL_TRIANGLE_FAN, 0, 7);
00128 glDisable(GL_BLEND);
00129
00130 if(texture.getID())
00131 {
00132 texture.deactivate();
00133 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00134 }
00135 }
00136
00137 if(drawBounds)
00138 {
00139 glColor3fv(bordersColor);
00140 glDrawArrays(GL_LINE_STRIP, 0, 7);
00141 }
00142
00143 glColor3f(1,1,1);
00144 glDisableClientState(GL_VERTEX_ARRAY);
00145 }
00146
00147 void GUIClippedRectangle::computeClippedBounds(const Tuple4i &windowBounds)
00148 {
00149 float yTexOffset = float(clipSize)/(windowBounds.w - windowBounds.y),
00150 xTexOffset = float(clipSize)/(windowBounds.z - windowBounds.x);
00151
00152 xTexOffset *= textureRectangle.z - textureRectangle.x;
00153 yTexOffset *= textureRectangle.w - textureRectangle.y;
00154
00155 vertices[0].set(windowBounds.x, windowBounds.y + clipSize);
00156 vertices[1].set(windowBounds.x, windowBounds.w);
00157 vertices[2].set(windowBounds.z - clipSize, windowBounds.w);
00158 vertices[3].set(windowBounds.z, windowBounds.w - clipSize);
00159 vertices[4].set(windowBounds.z, windowBounds.y);
00160 vertices[5].set(windowBounds.x + clipSize, windowBounds.y);
00161 vertices[6].set(windowBounds.x, windowBounds.y + clipSize);
00162
00163 texCoords[0].set(textureRectangle.x , textureRectangle.w - yTexOffset);
00164 texCoords[1].set(textureRectangle.x , textureRectangle.y);
00165 texCoords[2].set(textureRectangle.z - xTexOffset, textureRectangle.y );
00166 texCoords[3].set(textureRectangle.z , textureRectangle.y + yTexOffset);
00167 texCoords[4].set(textureRectangle.z , textureRectangle.w);
00168 texCoords[5].set(textureRectangle.x + xTexOffset, textureRectangle.w );
00169 texCoords[6].set(textureRectangle.x , textureRectangle.w - yTexOffset);
00170 }
00171
00172 void GUIClippedRectangle::enableBGColor(bool enable)
00173 {
00174 drawBackground = enable;
00175 }
00176
00177 void GUIClippedRectangle::setTextureRectangle(const Tuple4f &tr)
00178 {
00179 setTextureRectangle(tr.x, tr.y, tr.z, tr.w);
00180 }
00181
00182 void GUIClippedRectangle::setTextureRectangle(float x, float y, float z, float w)
00183 {
00184 if(x > 1.0f || y > 1.0f || z > 1.0f || w > 1.0f)
00185 if(texture.getID())
00186 {
00187 x = clamp(x, 0.0f, float(texture.getWidth() ));
00188 y = clamp(y, 0.0f, float(texture.getHeight()));
00189 z = clamp(z, 0.0f, float(texture.getWidth() ));
00190 w = clamp(w, 0.0f, float(texture.getHeight()));
00191
00192 x /= texture.getWidth();
00193 z /= texture.getWidth();
00194
00195 w /= texture.getHeight();
00196 y /= texture.getHeight();
00197
00198 }
00199
00200 textureRectangle.set(clamp(x, 0.0f, 1.0f),
00201 clamp(y, 0.0f, 1.0f),
00202 clamp(z, 0.0f, 1.0f),
00203 clamp(w, 0.0f, 1.0f));
00204 }
00205
00206 const Tuple4f &GUIClippedRectangle::getTextureRectangle()
00207 {
00208 return textureRectangle;
00209 }
00210
00211 Texture &GUIClippedRectangle::getTexture()
00212 {
00213 return texture;
00214 }
00215
00216 void GUIClippedRectangle::setTexture(const Texture & textureArg)
00217 {
00218 texture = textureArg;
00219 }
00220
00221 bool GUIClippedRectangle::isBGColorOn()
00222 {
00223 return drawBackground;
00224 }
00225
00226 const Tuple4f &GUIClippedRectangle::getBGColor()
00227 {
00228 return bgColor;
00229 }
00230
00231 const Tuple2i *GUIClippedRectangle::getVertices() const
00232 {
00233 return vertices;
00234 }
00235
00236 const Tuple2f *GUIClippedRectangle::getTexCoords() const
00237 {
00238 return texCoords;
00239 }