69 FXIMPLEMENT(
GNELane, FXDelegator, 0, 0)
85 myParentEdge(*static_cast<
GNEEdge*>(0)),
99 int noLinks = (int)cons.size();
109 for (
int i = noLinks; --i >= 0;) {
110 double x2 = x1 - (double)(w / 2.);
112 cons[lefthand ? noLinks - 1 - i : i]);
123 int noLinks = (int)cons.size();
133 for (
int i = noLinks; --i >= 0;) {
134 double x2 = x1 - (double)(w / 2.);
135 int linkNo = cons[lefthand ? noLinks - 1 - i : i].tlLinkNo;
152 double rot = (double) atan2((end.
x() - f.
x()), (f.
y() - end.
y())) * (double) 180.0 / (
double)
PI;
157 glTranslated(end.
x(), end.
y(), 0);
158 glRotated(rot, 0, 0, 1);
163 for (std::vector<NBEdge::Connection>::const_iterator i = edgeCons.begin(); i != edgeCons.end(); ++i) {
164 if ((*i).fromLane ==
myIndex) {
206 glTranslated(0, 5, 0);
208 glTranslated(0, -5, 0);
226 for (std::vector<NBEdge::Connection>::iterator it = connections.begin(); it != connections.end(); it++) {
240 glColor3d(.4, .4, .4);
243 glColor3d(.7, .4, .4);
246 glColor3d(.7, .7, .7);
249 glColor3d(.7, .7, 1);
251 glColor3d(.75, .5, 0.25);
256 const Position& endPos = it->toEdge->getLaneShape(it->toLane)[0];
258 glVertex2d(startPos.
x(), startPos.
y());
259 glVertex2d(endPos.
x(), endPos.
y());
298 const double selectionScale = selected || selectedEdge ? s.
selectionScale : 1;
305 glGetFloatv(GL_CURRENT_COLOR, color);
309 }
else if (s.
scale * exaggeration < 1.) {
321 const double halfRailWidth = 0.725 * exaggeration;
333 glTranslated(0, 0, .1);
339 drawCrossties(0.3 * exaggeration, 1 * exaggeration, 1 * exaggeration);
352 if (exaggeration == 1) {
372 double iconWidth = 1;
387 glRotated(90, 0, 0, 1);
415 int e = (int)
getShape().size() - 1;
416 for (
int i = 0; i < e; ++i) {
421 const double length =
MIN2((
double)3, myShapeLengths[i] - t);
424 glVertex2d(-mw, -t - length);
425 glVertex2d(halfWidth * 0.5 * scale, -t - length);
426 glVertex2d(halfWidth * 0.5 * scale, -t);
435 glTranslated(0, 0, 0.2);
482 FXMenuPane* addSpecialLanes =
new FXMenuPane(ret);
484 FXMenuPane* removeSpecialLanes =
new FXMenuPane(ret);
486 FXMenuPane* transformSlanes =
new FXMenuPane(ret);
503 new FXMenuCascade(ret, (
"remove special" +
toString(
SUMO_TAG_LANE) +
"s").c_str(), 0, removeSpecialLanes);
504 new FXMenuCascade(ret, (
"transform to special" +
toString(
SUMO_TAG_LANE) +
"s").c_str(), 0, transformSlanes);
512 FXMenuPane* addSpecialLanes =
new FXMenuPane(ret);
514 FXMenuPane* removeSpecialLanes =
new FXMenuPane(ret);
516 FXMenuPane* transformSlanes =
new FXMenuPane(ret);
519 FXMenuCommand* addSidewalk =
new FXMenuCommand(addSpecialLanes,
"Sidewalk", pedestrianIcon, &parent,
MID_GNE_ADD_LANE_SIDEWALK);
520 FXMenuCommand* addBikelane =
new FXMenuCommand(addSpecialLanes,
"Bikelane", bikeIcon, &parent,
MID_GNE_ADD_LANE_BIKE);
521 FXMenuCommand* addBuslane =
new FXMenuCommand(addSpecialLanes,
"Buslane", busIcon, &parent,
MID_GNE_ADD_LANE_BUS);
523 FXMenuCommand* removeSidewalk =
new FXMenuCommand(removeSpecialLanes,
"Sidewalk", pedestrianIcon, &parent,
MID_GNE_REMOVE_LANE_SIDEWALK);
524 removeSidewalk->disable();
525 FXMenuCommand* removeBikelane =
new FXMenuCommand(removeSpecialLanes,
"Bikelane", bikeIcon, &parent,
MID_GNE_REMOVE_LANE_BIKE);
526 removeBikelane->disable();
527 FXMenuCommand* removeBuslane =
new FXMenuCommand(removeSpecialLanes,
"Buslane", busIcon, &parent,
MID_GNE_REMOVE_LANE_BUS);
528 removeBuslane->disable();
531 FXMenuCommand* transformLaneToBikelane =
new FXMenuCommand(transformSlanes,
"Bikelane", bikeIcon, &parent,
MID_GNE_TRANSFORM_LANE_BIKE);
532 FXMenuCommand* transformLaneToBuslane =
new FXMenuCommand(transformSlanes,
"Buslane", busIcon, &parent,
MID_GNE_TRANSFORM_LANE_BUS);
533 FXMenuCommand* revertTransformation =
new FXMenuCommand(transformSlanes,
"revert transformation", 0, &parent,
MID_GNE_REVERT_TRANSFORMATION);
535 FXMenuCascade* cascadeAddSpecialLane =
new FXMenuCascade(ret, (
"add special" +
toString(
SUMO_TAG_LANE)).c_str(), 0, addSpecialLanes);
536 FXMenuCascade* cascadeRemoveSpecialLane =
new FXMenuCascade(ret, (
"remove special" +
toString(
SUMO_TAG_LANE)).c_str(), 0, removeSpecialLanes);
537 new FXMenuCascade(ret, (
"transform to special" +
toString(
SUMO_TAG_LANE)).c_str(), 0, transformSlanes);
539 if (edgeHasSidewalk) {
540 transformLaneToSidewalk->disable();
541 addSidewalk->disable();
542 removeSidewalk->enable();
544 if (edgeHasBikelane) {
545 transformLaneToBikelane->disable();
546 addBikelane->disable();
547 removeBikelane->enable();
549 if (edgeHasBuslane) {
550 transformLaneToBuslane->disable();
551 addBuslane->disable();
552 removeBuslane->enable();
555 if (edgeHasSidewalk && edgeHasBikelane && edgeHasBuslane) {
556 cascadeAddSpecialLane->disable();
558 if (!edgeHasSidewalk && !edgeHasBikelane && !edgeHasBuslane) {
559 cascadeRemoveSpecialLane->disable();
563 revertTransformation->enable();
565 revertTransformation->disable();
571 new FXMenuCommand(ret,
"Select state for all links from this edge:", 0, 0, 0);
573 for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
575 FXMenuRadio* mc =
new FXMenuRadio(ret, (*it).c_str(),
this, FXDataTarget::ID_OPTION + state);
581 FXMenuCommand* mc =
new FXMenuCommand(ret,
"Additional options available in 'Inspect Mode'", 0, 0, 0);
582 mc->handle(&parent, FXSEL(SEL_COMMAND, FXWindow::ID_DISABLE), 0);
585 new FXMenuSeparator(ret);
588 new FXMenuCommand(ret, (
"Shape pos: " +
toString(pos)).c_str(), 0, 0, 0);
590 new FXMenuCommand(ret, (
"Height: " +
toString(height)).c_str(), 0, 0, 0);
595 (
dynamic_cast<GNEViewNet&
>(parent)).markPopupPosition();
626 const std::vector<double>&
632 const std::vector<double>&
655 int segments = (int)
getShape().size() - 1;
659 for (
int i = 0; i < segments; ++i) {
663 myShapeRotations.push_back((
double) atan2((s.
x() - f.
x()), (f.
y() - s.
y())) * (double) 180.0 / (
double)
PI);
668 (*i)->updateGeometry();
674 for (std::vector<GNEConnection*>::iterator i = incomingConnections.begin(); i != incomingConnections.end(); i++) {
675 (*i)->updateGeometry();
679 for (std::vector<GNEConnection*>::iterator i = outGoingConnections.begin(); i != outGoingConnections.end(); i++) {
680 (*i)->updateGeometry();
742 if (*i == additional) {
767 const std::vector<GNEAdditional*>&
838 return canParse<double>(value);
843 if (value ==
"default") {
849 return canParse<double>(value);
851 return canParse<bool>(value);
889 if (value ==
"default") {
911 switch (activeScheme) {
927 switch (activeScheme) {
929 for (PositionVector::const_iterator ii =
getShape().begin(); ii !=
getShape().end() - 1; ++ii) {
934 for (
int ii = 1; ii < (int)
getShape().size(); ++ii) {
951 switch (activeScheme) {
953 switch (myPermissions) {
974 return (
double)myPermissions;
1016 glTranslated(0, 0, 0.1);
1017 int e = (int)
getShape().size() - 1;
1018 for (
int i = 0; i < e; ++i) {
1024 glVertex2d(-halfWidth, -t);
1025 glVertex2d(-halfWidth, -t - length);
1026 glVertex2d(halfWidth, -t - length);
1027 glVertex2d(halfWidth, -t);
1039 glColor3d(0.3, 0.3, 0.3);
1042 int e = (int)
getShape().size() - 1;
1043 for (
int i = 0; i < e; ++i) {
1048 const double length =
MIN2(width * 0.5, myShapeLengths[i] - t);
1049 glBegin(GL_TRIANGLES);
1050 glVertex2d(0, -t - length);
1051 glVertex2d(-width * 0.25, -t);
1052 glVertex2d(+width * 0.25, -t);
1083 std::vector<GNEConnection*>
1086 std::vector<GNEConnection*> incomingConnections;
1089 if (junctionSource) {
1093 for (std::vector<GNEConnection*>::const_iterator j = (*i)->getGNEConnections().begin(); j != (*i)->getGNEConnections().end(); j++) {
1094 if ((*j)->getNBEdgeConnection().fromLane ==
getIndex()) {
1095 incomingConnections.push_back(*j);
1100 return incomingConnections;
1104 std::vector<GNEConnection*>
1108 std::vector<GNEConnection*> outcomingConnections;
1110 for (std::vector<GNEConnection*>::const_iterator i = edgeConnections.begin(); i != edgeConnections.end(); i++) {
1111 if ((*i)->getNBEdgeConnection().fromLane ==
getIndex()) {
1112 outcomingConnections.push_back(*i);
1115 return outcomingConnections;
1123 for (std::vector<GNEConnection*>::iterator i = incomingConnections.begin(); i != incomingConnections.end(); i++) {
1128 for (std::vector<GNEConnection*>::iterator i = outcomingConnections.begin(); i != outcomingConnections.end(); i++) {
bool drawAsWaterway(const GUIVisualizationSettings &s) const
whether to draw this lane as a waterways
static void drawTexturedBox(int which, double size)
Draws a named texture as a box with the given size.
double getPositionRelativeToParametricLength(double position) const
double getLaneShapeLength() const
returns the length of the lane's shape
EditMode getCurrentEditMode() const
get the current edit mode
The link is a partial left direction.
std::string getVehicleClassNames(SVCPermissions permissions, bool expand)
Returns the ids of the given classes, divided using a ' '.
double z() const
Returns the z-position.
std::vector< double > myShapeLengths
The lengths of the shape parts.
bool controlsEdge(GNEEdge &edge) const
whether the given edge is controlled by the currently edited tlDef
const std::string & getParentName() const
Returns the name of the parent object (if any)
double scale
information about a lane's width (temporary, used for a single view)
double laneWidthExaggeration
The lane exaggeration (upscale thickness)
GNEJunction * getGNEJunctionSource() const
returns the source-junction
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
PositionVector shape
The lane's shape.
GNENet * myNet
the net to inform about updates
GNETLSEditorFrame * myTLSEditor
the tls-editor for setting multiple links in TLS-mode
static void drawBoxLines(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double width, int cornerDetail=0, double offset=0)
Draws thick lines.
AdditionalVector myAdditionals
list with the additionals vinculated with this lane
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
begin/end of the description of a single lane
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types...
void setEndOffset(int lane, double offset)
set lane specific end-offset (negative lane implies set for all lanes)
const RGBColor * mySpecialColor
optional special color
static const RGBColor selectedLaneColor
color of selected lane
static void drawTextAtEnd(const std::string &text, const PositionVector &shape, double x, double size, RGBColor color)
draw text and the end of shape
static RGBColor fromHSV(double h, double s, double v)
Converts the given hsv-triplet to rgb.
std::vector< Connection > getConnectionsFromLane(int lane) const
Returns connections from a given lane.
static GUIGlID getTexture(GUITexture which)
returns a texture previously defined in the enum GUITexture
double getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
int getConnectionIndex(const NBEdge *from, const NBEdge::Connection &con) const
return the index of the given connection
void setSpeed(int lane, double speed)
set lane specific speed (negative lane implies set for all lanes)
GUIColorer laneColorer
The lane colorer.
double x() const
Returns the x-position.
Stores the information about how to visualize structures.
This is an uncontrolled, minor link, has to stop.
bool isRestricted(SUMOVehicleClass vclass) const
check if this lane is restricted
const std::vector< GNEAdditional * > & getAdditionalChilds() const
get additional childs of lane
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
void removeAdditionalChild(GNEAdditional *additional)
remove additional child to this lane
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
The representation of a single edge during network building.
bool showRails
Information whether rails shall be drawn.
The link is a 180 degree turn.
static RGBColor colorForLinksState(FXuint state)
return the color for each linkstate
bool hasRestrictedLane(SUMOVehicleClass vclass) const
check if edge has a restricted lane
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
bool setFunctionalColor(int activeScheme) const
sets the color according to the current scheme index and some lane function
double getColorValue(int activeScheme) const
return value for lane coloring according to the given scheme
bool isSelected(GUIGlObjectType type, GUIGlID id)
Returns the information whether the object with the given type and id is selected.
void setPermissions(SVCPermissions permissions, int lane=-1)
set allowed/disallowed classes for the given lane or for all lanes if -1 is given ...
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
int editMode
the current NETEDIT mode (temporary)
bool showLaneDirection
Whether to show direction indicators for lanes.
Copy edge name (for lanes only)
bool setMultiColor(const GUIColorer &c) const
sets multiple colors according to the current scheme index and some lane function ...
double endOffset
This lane's offset to the intersection begin.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
std::vector< RGBColor > myShapeColors
The color of the shape parts (cached)
This is an uncontrolled, right-before-left link.
const double SUMO_const_laneOffset
const std::vector< GNEConnection * > & getGNEConnections()
returns a reference to the GNEConnection vector
void handleMultiChange(GNELane *lane, FXObject *obj, FXSelector sel, void *data)
update phase definition for the current traffic light and phase
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
Lane & getLaneStruct(int lane)
The link is controlled by a tls which is off, not blinking, may pass.
transform lane to bikelane
This is an uncontrolled, all-way stop link.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to copy the cursor position if geo projection is used, also builds an entry for copying the geo-position.
Boundary getBoundary() const
returns the boundry (including lanes)
int getIndex() const
returns the index of the lane
GUIGlID getGlID() const
Returns the numerical id of the object.
static const double UNSPECIFIED_WIDTH
unspecified lane width
A class that stores a 2D geometrical boundary.
int myIndex
The index of this lane.
This is an uncontrolled, zipper-merge link.
The link is a (hard) left direction.
static OptionsCont & getOptions()
Retrieves the options.
bool accelRamp
Whether this lane is an acceleration lane.
void setAcceleration(int lane, bool accelRamp)
marks one lane as acceleration lane
std::vector< double > myLaneRestrictedTextureRotations
Rotations of textures of restricted lanes.
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)...
std::vector< std::string > getStrings() const
The link is a straight direction.
virtual const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
double getSpeed() const
returns the current speed of lane
void p_add(GNEChange_Attribute *cmd)
special method, avoid empty changes, always execute
bool drawAsRailway(const GUIVisualizationSettings &s) const
whether to draw this lane as a railway
void drawDirectionIndicators() const
direction indicators for lanes
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
static double naviDegree(const double angle)
set non-default geometry endpoint
void drawLane2LaneConnections() const
draw lane to lane connections
double getLaneWidth() const
Returns the default width of lanes of this edge.
void drawArrows() const
draw arrows
int getPriority() const
Returns the priority of the edge.
transform lane to busLane
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
GNEEdge & getParentEdge()
Returns underlying parent edge.
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
void drawTLSLinkNo(const GUIVisualizationSettings &s) const
draw TLS Link Number
This is an uncontrolled, minor link, has to brake.
A point in 2D or 3D with translation and scaling methods.
const std::vector< double > & getShapeRotations() const
returns the vector with the shape rotations
void addAdditionalChild(GNEAdditional *additional)
add additional child to this lane
bool isLogicValid()
whether this junction has a valid logic
bool isWaterway(SVCPermissions permissions)
Returns whether an edge with the given permission is a waterway edge.
std::vector< double > myShapeRotations
friend class GNEChange_Attribute
declare friend class
double y() const
Returns the y-position.
std::vector< GNEConnection * > getGNEIncomingConnections()
returns a vector with the incoming GNEConnections of this lane
int getNumLanes() const
Returns the number of lanes.
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic, in MSLink and GNEInternalLane.
const T getColor(const double value) const
double length() const
Returns the length.
transform lane to sidewalk
GUIVisualizationTextSettings drawLinkTLIndex
static void drawOutlineCircle(double width, double iwidth, int steps=8)
Draws an unfilled circle around (0,0)
The link is a (hard) right direction.
LinkState getLinkState(const NBEdge *incoming, NBEdge *outgoing, int fromLane, int toLane, bool mayDefinitelyPass, const std::string &tlID) const
get link state
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
Boundary & grow(double by)
extends the boundary by the given amount
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
void drawMarkings(const bool &selectedEdge, double scale) const
draw lane markings
static void drawLine(const Position &beg, double rot, double visLength)
Draws a thin line.
const std::string getID() const
function to support debugging
std::vector< GNEConnection * > getGNEOutcomingConnections()
returns a vector with the outgoing GNEConnections of this lane
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
std::vector< Connection > myConnections
List of connections to following edges.
restore geometry endpoint to node position
double laneMinSize
The minimum visual lane width for drawing.
The link is a partial right direction.
double width
This lane's width.
vehicle is a passenger car (a "normal" car)
void updateGeometry()
update pre-computed geometry information
begin/end of the description of an edge
bool canParseVehicleClasses(const std::string &classes)
Checks whether the given string contains only known vehicle classes.
std::string getAttribute(SumoXMLAttr key) const
A road/street connecting two junctions (netedit-version)
const std::vector< double > & getShapeLengths() const
returns the vector with the shape lengths
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
void drawLinkRules() const
draw link rules
GNEEdge & myParentEdge
The Edge that to which this lane belongs.
double getLaneSpeed(int lane) const
get lane speed
NBNode * getToNode() const
Returns the destination node of the edge.
double getLength() const
Returns the computed length of the edge.
const PositionVector & getShape() const
returns the shape of the lane
double selectionScale
the current selection scaling in NETEDIT (temporary)
void updateConnectionIDs()
long onDefault(FXObject *, FXSelector, void *)
multiplexes message to two targets
virtual void setMicrosimID(const std::string &newID)
Changes the microsimID of the object.
double getPositionRelativeToShapeLength(double position) const
An Element which don't belongs to GNENet but has influency in the simulation.
The link is controlled by a tls which is off and blinks, has to brake.
std::vector< Position > myLaneRestrictedTexturePositions
Position of textures of restricted lanes.
void setSpecialColor(const RGBColor *Color2)
This is an uncontrolled, major link, may pass.
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
static const StringBijection< FXuint > LinkStateNames
long names for link states
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
Represents a single node (junction) during network building.
T get(const std::string &str) const
The link is a 180 degree turn (left-hand network)
SumoXMLTag getTag() const
get XML Tag assigned to this object
GUIVisualizationSettings * getVisualisationSettings() const
get visualitation settings
static void drawTriangleAtEnd(const Position &p1, const Position &p2, double tLength, double tWidth)
Draws a triangle at the end of the given line.
void drawCrossties(double length, double spacing, double halfWidth) const
draw crossties for railroads
std::string getLaneID(int lane) const
get Lane ID (Secure)
const std::vector< GNEEdge * > & getGNEIncomingEdges() const
Returns incoming GNEEdges.
static const RGBColor selectionColor
color of selection
mode for connecting lanes
mode for creating new edges
static void drawBoxLine(const Position &beg, double rot, double visLength, double width, double offset=0)
Draws a thick line.
bool isValid(SumoXMLAttr key, const std::string &value)
NBEdge * getNBEdge()
returns the internal NBEdge
Position getPositionInformation() const
Returns the cursor's x/y position within the network.
double getLaneParametricLength() const
returns the parameteric length of the lane
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
void mkItem(const char *name, bool dynamic, ValueSource< unsigned > *src)
Adds a row which obtains its value from an unsigned-ValueSource.
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
GUISelectedStorage gSelected
A global holder of selected objects.
void closeBuilding()
Closes the building of the table.
A window containing a gl-object's parameter.
GNEViewNet * getViewNet() const
get view net
static FXIcon * getIcon(GUIIcon which)
returns a icon previously defined in the enum GUIIcon
GUIVisualizationTextSettings drawLinkJunctionIndex
const PositionVector & getLaneShape(int i) const
Returns the shape of the nth lane.
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
void setLaneWidth(int lane, double width)
set lane specific width (negative lane implies set for all lanes)
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
void drawLinkNo(const GUIVisualizationSettings &s) const
draw link Number
The link has no direction (is a dead end link)
GNEJunction * getGNEJunctionDestiny() const
returns the destination-junction
static RGBColor getColor()
gets the gl-color