Path: blob/main/src/utils/gui/images/GUITexturesHelper.cpp
169685 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2004-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GUITexturesHelper.cpp14/// @author Daniel Krajzewicz15/// @author Michael Behrisch16/// @author Jakob Erdmann17/// @date Mon, 08.03.200418///19// Global storage for textures; manages and draws them20/****************************************************************************/21#include <config.h>2223#include <iostream>24#include <utils/foxtools/fxheader.h>25#include <utils/foxtools/MFXImageHelper.h>26#include <utils/gui/globjects/GUIGlObject.h>27#include <utils/gui/globjects/GLIncludes.h>28#include <utils/gui/windows/GUIMainWindow.h>29#include <utils/options/OptionsCont.h>30#include <utils/common/MsgHandler.h>3132#include "GUITexturesHelper.h"3334// ===========================================================================35// definition of static variables36// ===========================================================================37std::map<std::string, int> GUITexturesHelper::myTextures;38bool GUITexturesHelper::myAllowTextures = true;394041// ===========================================================================42// method definitions43// ===========================================================================44int45GUITexturesHelper::getMaxTextureSize() {46int max;47glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);48return max;49}505152GUIGlID53GUITexturesHelper::add(FXImage* i) {54GUIGlID id;55glGenTextures(1, &id);56glBindTexture(GL_TEXTURE_2D, id);57glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,58i->getWidth(), i->getHeight(), 0,59GL_RGBA, GL_UNSIGNED_BYTE, i->getData());60glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);61glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);62glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);63glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);64glBindTexture(GL_TEXTURE_2D, 0);65return id;66}676869void70GUITexturesHelper::drawTexturedBox(int which, double size) {71drawTexturedBox(which, size, size, -size, -size);72}737475void76GUITexturesHelper::drawTexturedBox(int which, double sizeX1, double sizeY1, double sizeX2, double sizeY2) {77// first check that textures are allowed78if (!myAllowTextures) {79return;80}81glEnable(GL_TEXTURE_2D);82glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);83glDisable(GL_CULL_FACE);84//glDisable(GL_DEPTH_TEST); // without DEPTH_TEST vehicles may be drawn below roads85glDisable(GL_LIGHTING);86glDisable(GL_COLOR_MATERIAL);87glDisable(GL_TEXTURE_GEN_S);88glDisable(GL_TEXTURE_GEN_T);89glDisable(GL_ALPHA_TEST);90glEnable(GL_BLEND);91glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);92glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);93glBindTexture(GL_TEXTURE_2D, which);94glBegin(GL_TRIANGLE_STRIP);95glTexCoord2f(0, 1);96glVertex2d(sizeX1, sizeY1);97glTexCoord2f(0, 0);98glVertex2d(sizeX1, sizeY2);99glTexCoord2f(1, 1);100glVertex2d(sizeX2, sizeY1);101glTexCoord2f(1, 0);102glVertex2d(sizeX2, sizeY2);103glEnd();104glBindTexture(GL_TEXTURE_2D, 0);105glEnable(GL_DEPTH_TEST);106}107108109int110GUITexturesHelper::getTextureID(const std::string& filename, const bool mirrorX) {111if (myTextures.count(filename) == 0) {112try {113// load image114FXImage* i = MFXImageHelper::loadImage(GUIMainWindow::getInstance()->getApp(), filename);115if (mirrorX) {116i->mirror(false, true);117}118MFXImageHelper::scalePower2(i, getMaxTextureSize());119// Create GL structure using texture120GUIGlID id = add(i);121// delete texture after creating GL Structure122delete i;123myTextures[filename] = (int)id;124} catch (InvalidArgument& e) {125WRITE_ERROR("Could not load '" + filename + "'.\n" + e.what());126myTextures[filename] = -1;127}128}129return myTextures[filename];130}131132133void134GUITexturesHelper::clearTextures() {135myTextures.clear();136}137138139/****************************************************************************/140141142