From beb9fa96dc4db648a3e50084b78c27b407e3a4f5 Mon Sep 17 00:00:00 2001 From: dfighter1985 Date: Sat, 16 Jun 2012 02:55:19 +0200 Subject: [PATCH] CHANGED: #1471 CCtrlPolygon is now in the NELGUI library and is under NLGUI. --HG-- branch : gui-refactoring --- code/nel/include/nel/gui/ctrl_polygon.h | 94 ++++++ code/nel/src/gui/ctrl_polygon.cpp | 306 ++++++++++++++++++ .../client/src/interface_v3/ctrl_polygon.cpp | 305 ----------------- .../client/src/interface_v3/ctrl_polygon.h | 88 ----- code/ryzom/client/src/main_loop.cpp | 2 +- .../client/src/r2/displayer_visual_group.cpp | 2 +- code/ryzom/client/src/r2/prim_render.cpp | 2 +- code/ryzom/client/src/r2/prim_render.h | 2 +- 8 files changed, 404 insertions(+), 397 deletions(-) create mode 100644 code/nel/include/nel/gui/ctrl_polygon.h create mode 100644 code/nel/src/gui/ctrl_polygon.cpp delete mode 100644 code/ryzom/client/src/interface_v3/ctrl_polygon.cpp delete mode 100644 code/ryzom/client/src/interface_v3/ctrl_polygon.h diff --git a/code/nel/include/nel/gui/ctrl_polygon.h b/code/nel/include/nel/gui/ctrl_polygon.h new file mode 100644 index 000000000..dc785e250 --- /dev/null +++ b/code/nel/include/nel/gui/ctrl_polygon.h @@ -0,0 +1,94 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +#ifndef RZ_CTRL_POLYGON_H +#define RZ_CTRL_POLYGON_H + +#include "nel/gui/ctrl_base.h" +#include "nel/gui/view_renderer.h" +#include "nel/misc/geom_ext.h" +#include "nel/misc/polygon.h" + +namespace NLMISC +{ + class CVector2f; +} + +namespace NLGUI +{ + + /** Display of an arbitrary polygon in the ui. + * polygons are clipped & batched. + * + * Derives from CCtrlBase in order to provide button / tooltip capability + * + * \author Nicolas Vizerie + * \author Nevrax France + * \date 1/2006 + */ + class CCtrlPolygon : public CCtrlBase + { + public: + CCtrlPolygon(); + virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); } + virtual void updateCoords(); + virtual void draw(); + /** Change the vertices. This is costly because concav / complex polys are split in a list of triangles + */ + void setVertices(const std::vector &vertices); + const std::vector &getVertices() const { return _Poly.Vertices; } + // test if current position in inside the current (transformed) poly (in window space) + bool contains(const NLMISC::CVector2f &pos) const; + // color + void setColorRGBA(NLMISC::CRGBA col) { _Color = col; } + NLMISC::CRGBA getColorRGBA() const { return _Color; } + // from CViewBase + virtual sint32 getAlpha() const { return (sint32) _Color.A; } + virtual void setAlpha(sint32 a); + /** Change the matrix for this poly. Changing the matrix is usually cheaper than changing + * The vertices because complex poly do not have to be split again + */ + //void setMatrix(const NLMISC::CMatrix &mat); + //const NLMISC::CMatrix &getMatrix() const { return _Matrix; } + // test if last call to 'setVertices' was for a valid poly (e.g one that doesn't overlapp itself) + bool isValid() const { return _Valid; } + virtual bool handleEvent (const NLGUI::CEventDescriptor &event); + + // no capturable by default (just tooltip capability wanted) + virtual bool isCapturable() const { return false; } + private: + NLMISC::CPolygon _Poly; + NLMISC::CPolygon2D _XFormPoly; + //NLMISC::CMatrix _Matrix; + bool _Valid; + bool _Touched; + NLMISC::CRGBA _Color; + std::vector _Tris; + std::vector _RealTris; // clipped tris in screen coordinates + private: + void updateBoudingRect(); + protected: + // TMP TMP : have to solve matrix imprecision for display in map -> do the full computation for now ... + virtual void computeScaledVertex(NLMISC::CVector2f &dest, const NLMISC::CVector2f &src); + public: + void touch(); + }; + +} + + +#endif diff --git a/code/nel/src/gui/ctrl_polygon.cpp b/code/nel/src/gui/ctrl_polygon.cpp new file mode 100644 index 000000000..8280f292a --- /dev/null +++ b/code/nel/src/gui/ctrl_polygon.cpp @@ -0,0 +1,306 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "nel/gui/ctrl_polygon.h" +#include "nel/gui/widget_manager.h" +#include "nel/gui/view_renderer.h" +#include "nel/gui/interface_group.h" + +using namespace NLMISC; + +namespace NLGUI +{ + + // ********************************************************************************* + CCtrlPolygon::CCtrlPolygon() : CCtrlBase(TCtorParam()) + { + // Construct + _Color = CRGBA::White; + //_Matrix = CMatrix::Identity; + _Valid = true; + } + + // ********************************************************************************* + void CCtrlPolygon::updateBoudingRect() + { + H_AUTO(Rz_CCtrlPolygon_updateBoudingRect) + if (_Poly.Vertices.empty()) + { + setX(0); + setY(0); + setW(0); + setH(0); + return; + } + // + sint32 xmin = INT_MAX; + sint32 ymin = INT_MAX; + sint32 xmax = INT_MIN; + sint32 ymax = INT_MIN; + uint numVerts = (uint)_Poly.Vertices.size(); + _XFormPoly.Vertices.resize(numVerts); + for(uint k = 0; k < numVerts; ++k) + { + CVector2f &finalPos = _XFormPoly.Vertices[k]; + //finalPos = _Matrix * _Poly.Vertices[k]; + computeScaledVertex(finalPos, CVector2f(_Poly.Vertices[k].x, _Poly.Vertices[k].y)); + xmin = std::min(xmin, (sint32) floorf(finalPos.x)); + xmax = std::max(xmax, (sint32) ceilf(finalPos.x)); + ymin = std::min(ymin, (sint32) floorf(finalPos.y)); + ymax = std::max(ymax, (sint32) ceilf(finalPos.y)); + } + setX(xmin); + setY(ymin); + setW(xmax - xmin); + setH(ymax - ymin); + } + + // ********************************************************************************* + bool CCtrlPolygon::contains(const CVector2f &pos) const + { + H_AUTO(Rz_CCtrlPolygon_contains) + if (!_Valid) return false; + return _XFormPoly.contains(pos, false); + } + + // ********************************************************************************* + void CCtrlPolygon::setVertices(const std::vector &vertices) + { + H_AUTO(Rz_CCtrlPolygon_setVertices) + if (vertices.size() == _Poly.Vertices.size() && + std::equal(vertices.begin(), vertices.end(), _Poly.Vertices.begin())) return; // remains unchanged + + + //TTicks startTime = CTime::getPerformanceTime(); + + _Poly.Vertices = vertices; + _Tris.clear(); + std::list polys; + bool splitDone = _Poly.toConvexPolygons(polys, NLMISC::CMatrix::Identity); + if (!splitDone) + { + polys.clear(); + // maybe wrong orientation + std::reverse(_Poly.Vertices.begin(), _Poly.Vertices.end()); + splitDone = _Poly.toConvexPolygons(polys, NLMISC::CMatrix::Identity); + std::reverse(_Poly.Vertices.begin(), _Poly.Vertices.end()); + } + _Tris.clear(); + if (splitDone) + { + for(std::list::iterator it = polys.begin(); it != polys.end(); ++it) + { + it->toTriFan(_Tris); + } + } + _Touched = true; + updateBoudingRect(); + _Valid = splitDone; + + //TTicks endTime = CTime::getPerformanceTime(); + //nlinfo("%d ms for CCtrlPolygon::setVertices", (int) (1000 * CTime::ticksToSecond(endTime - startTime))); + } + + + static inline bool totallyInside(const CVector &minCorner, const CVector &maxCorner, sint32 cx, sint32 cy, sint32 cw, sint32 ch) + { + return (sint32) maxCorner.x < (cx + cw) && + (sint32) minCorner.x >= cx && + (sint32) maxCorner.y < (cy + ch) && + (sint32) minCorner.y >= cy; + } + + static inline bool totallyOutside(const CVector &minCorner, const CVector &maxCorner, sint32 cx, sint32 cy, sint32 cw, sint32 ch) + { + return (sint32) minCorner.x >= (cx + cw) || + (sint32) maxCorner.x < cx || + (sint32) minCorner.y >= (cy + ch) || + (sint32) maxCorner.y < cy; + } + + + // ********************************************************************************* + /*void CCtrlPolygon::setMatrix(const NLMISC::CMatrix &mat) + { + const float *lhs = mat.get(); + const float *rhs = _Matrix.get(); + if (std::equal(lhs, lhs + 16, rhs)) return; // unmodified... + _Matrix = mat; + updateBoudingRect(); + _Touched = true; + }*/ + + + // ********************************************************************************* + void CCtrlPolygon::draw() + { + H_AUTO(Rz_CCtrlPolygon_draw) + if (_Tris.empty()) return; + if (!_Parent) return; + CViewRenderer &vr = *CViewRenderer::getInstance(); + if (_Touched) + { + _RealTris.clear(); + uint numTris = (uint)_Tris.size(); + sint32 cornerX, cornerY; + static std::vector winTris; + winTris.resize(numTris); + _Parent->getCorner(cornerX, cornerY, _ParentPosRef); + /*CMatrix m = _Matrix; + m.setPos(m.getPos() + CVector((float) cornerX, (float) cornerY, 0.f));*/ + for(uint k = 0; k < numTris; ++k) + { + /*winTris[k].V0 = m * _Tris[k].V0; + winTris[k].V1 = m * _Tris[k].V1; + winTris[k].V2 = m * _Tris[k].V2;*/ + + CVector2f result; + computeScaledVertex(result, _Tris[k].V0); + winTris[k].V0.set(result.x + cornerX, result.y + cornerY, 0.f); + computeScaledVertex(result, _Tris[k].V1); + winTris[k].V1.set(result.x + cornerX, result.y + cornerY, 0.f); + computeScaledVertex(result, _Tris[k].V2); + winTris[k].V2.set(result.x + cornerX, result.y + cornerY, 0.f); + } + // recompute & reclip poly + _RealTris.clear(); + sint32 cx, cy, cw, ch; + vr.getClipWindow(cx, cy, cw, ch); + // per tri clip + NLMISC::CVector minCorner; + NLMISC::CVector maxCorner; + for(uint k = 0; k < numTris; ++k) + { + winTris[k].getMinCorner(minCorner); + winTris[k].getMaxCorner(maxCorner); + if (totallyOutside(minCorner, maxCorner, cx, cy, cw, ch)) continue; + if (totallyInside(minCorner, maxCorner, cx, cy, cw, ch)) + { + _RealTris.push_back(winTris[k]); + } + else + { + const uint maxNumCorners = 8; + static CVector outPos0[maxNumCorners]; + static CVector outPos1[maxNumCorners]; + // + outPos0[0] = winTris[k].V0; + outPos0[1] = winTris[k].V1; + outPos0[2] = winTris[k].V2; + // + CVector *pPos0 = outPos0; + CVector *pPos1 = outPos1; + // + sint count = 3; + // + if ((sint32) minCorner.x < cx) + { + // clip left + CPlane clipper(-1.f, 0.f, 0.f, (float) cx); + count = clipper.clipPolygonBack(pPos0, pPos1, count); + std::swap(pPos0, pPos1); + } + if ((sint32) maxCorner.x > cx + cw) + { + // clip right + CPlane clipper(1.f, 0.f, 0.f, - (float) (cx + cw)); + count = clipper.clipPolygonBack(pPos0, pPos1, count); + std::swap(pPos0, pPos1); + } + // + if ((sint32) minCorner.y < cy) + { + // clip bottom + CPlane clipper(0.f, -1.f, 0.f, (float) cy); + count = clipper.clipPolygonBack(pPos0, pPos1, count); + std::swap(pPos0, pPos1); + } + if ((sint32) maxCorner.y > cy + ch) + { + // clip top + CPlane clipper(0.f, 1.f, 0.f, - (float) (cy + ch)); + count = clipper.clipPolygonBack(pPos0, pPos1, count); + std::swap(pPos0, pPos1); + } + nlassert(count <= 8); + if (count >= 3) + { + for(uint k = 0; k < (uint) (count - 2); ++k) + { + _RealTris.push_back(NLMISC::CTriangle(pPos0[0], pPos0[k + 1], pPos0[k + 2])); + } + } + } + } + _Touched = false; + } + if (_RealTris.empty()) return; + CRGBA col; + if(getModulateGlobalColor()) + { + col.modulateFromColor (_Color, CWidgetManager::getInstance()->getGlobalColorForContent()); + } + else + { + col= _Color; + col.A = (uint8)(((sint32)col.A*((sint32)CWidgetManager::getInstance()->getGlobalColorForContent().A+1))>>8); + } + vr.drawUnclippedTriangles(_RenderLayer, _RealTris, col); + } + + // ********************************************************************************* + void CCtrlPolygon::updateCoords() + { + H_AUTO(Rz_CCtrlPolygon_updateCoords) + CCtrlBase::updateCoords(); + updateBoudingRect(); + // assume that clipping will have to be done again, real update of triangle will be done at render time + _Touched = true; + } + + // ********************************************************************************* + void CCtrlPolygon::setAlpha(sint32 a) + { + H_AUTO(Rz_CCtrlPolygon_setAlpha) + _Color.A = (uint8) a; + } + + // ********************************************************************************* + bool CCtrlPolygon::handleEvent(const NLGUI::CEventDescriptor &/* event */) + { + H_AUTO(Rz_CCtrlPolygon_handleEvent) + return false; + } + + // ********************************************************************************* + // TMP TMP + void CCtrlPolygon::computeScaledVertex(NLMISC::CVector2f &dest, const NLMISC::CVector2f &src) + { + H_AUTO(Rz_CCtrlPolygon_computeScaledVertex) + dest.set(src.x, src.y); + } + + // ********************************************************************************* + // TMP TMP + void CCtrlPolygon::touch() + { + H_AUTO(Rz_CCtrlPolygon_touch) + updateBoudingRect(); + _Touched = true; + } + +} + diff --git a/code/ryzom/client/src/interface_v3/ctrl_polygon.cpp b/code/ryzom/client/src/interface_v3/ctrl_polygon.cpp deleted file mode 100644 index 1b28fea13..000000000 --- a/code/ryzom/client/src/interface_v3/ctrl_polygon.cpp +++ /dev/null @@ -1,305 +0,0 @@ -// Ryzom - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -#include "stdpch.h" -#include "ctrl_polygon.h" -#include "nel/gui/view_renderer.h" -#include "interface_manager.h" - - -using namespace NLMISC; - -// ********************************************************************************* -CCtrlPolygon::CCtrlPolygon() : CCtrlBase(TCtorParam()) -{ - // Construct - _Color = CRGBA::White; - //_Matrix = CMatrix::Identity; - _Valid = true; -} - -// ********************************************************************************* -void CCtrlPolygon::updateBoudingRect() -{ - H_AUTO(Rz_CCtrlPolygon_updateBoudingRect) - if (_Poly.Vertices.empty()) - { - setX(0); - setY(0); - setW(0); - setH(0); - return; - } - // - sint32 xmin = INT_MAX; - sint32 ymin = INT_MAX; - sint32 xmax = INT_MIN; - sint32 ymax = INT_MIN; - uint numVerts = (uint)_Poly.Vertices.size(); - _XFormPoly.Vertices.resize(numVerts); - for(uint k = 0; k < numVerts; ++k) - { - CVector2f &finalPos = _XFormPoly.Vertices[k]; - //finalPos = _Matrix * _Poly.Vertices[k]; - computeScaledVertex(finalPos, CVector2f(_Poly.Vertices[k].x, _Poly.Vertices[k].y)); - xmin = std::min(xmin, (sint32) floorf(finalPos.x)); - xmax = std::max(xmax, (sint32) ceilf(finalPos.x)); - ymin = std::min(ymin, (sint32) floorf(finalPos.y)); - ymax = std::max(ymax, (sint32) ceilf(finalPos.y)); - } - setX(xmin); - setY(ymin); - setW(xmax - xmin); - setH(ymax - ymin); -} - -// ********************************************************************************* -bool CCtrlPolygon::contains(const CVector2f &pos) const -{ - H_AUTO(Rz_CCtrlPolygon_contains) - if (!_Valid) return false; - return _XFormPoly.contains(pos, false); -} - -// ********************************************************************************* -void CCtrlPolygon::setVertices(const std::vector &vertices) -{ - H_AUTO(Rz_CCtrlPolygon_setVertices) - if (vertices.size() == _Poly.Vertices.size() && - std::equal(vertices.begin(), vertices.end(), _Poly.Vertices.begin())) return; // remains unchanged - - - //TTicks startTime = CTime::getPerformanceTime(); - - _Poly.Vertices = vertices; - _Tris.clear(); - std::list polys; - bool splitDone = _Poly.toConvexPolygons(polys, NLMISC::CMatrix::Identity); - if (!splitDone) - { - polys.clear(); - // maybe wrong orientation - std::reverse(_Poly.Vertices.begin(), _Poly.Vertices.end()); - splitDone = _Poly.toConvexPolygons(polys, NLMISC::CMatrix::Identity); - std::reverse(_Poly.Vertices.begin(), _Poly.Vertices.end()); - } - _Tris.clear(); - if (splitDone) - { - for(std::list::iterator it = polys.begin(); it != polys.end(); ++it) - { - it->toTriFan(_Tris); - } - } - _Touched = true; - updateBoudingRect(); - _Valid = splitDone; - - //TTicks endTime = CTime::getPerformanceTime(); - //nlinfo("%d ms for CCtrlPolygon::setVertices", (int) (1000 * CTime::ticksToSecond(endTime - startTime))); -} - - -static inline bool totallyInside(const CVector &minCorner, const CVector &maxCorner, sint32 cx, sint32 cy, sint32 cw, sint32 ch) -{ - return (sint32) maxCorner.x < (cx + cw) && - (sint32) minCorner.x >= cx && - (sint32) maxCorner.y < (cy + ch) && - (sint32) minCorner.y >= cy; -} - -static inline bool totallyOutside(const CVector &minCorner, const CVector &maxCorner, sint32 cx, sint32 cy, sint32 cw, sint32 ch) -{ - return (sint32) minCorner.x >= (cx + cw) || - (sint32) maxCorner.x < cx || - (sint32) minCorner.y >= (cy + ch) || - (sint32) maxCorner.y < cy; -} - - -// ********************************************************************************* -/*void CCtrlPolygon::setMatrix(const NLMISC::CMatrix &mat) -{ - const float *lhs = mat.get(); - const float *rhs = _Matrix.get(); - if (std::equal(lhs, lhs + 16, rhs)) return; // unmodified... - _Matrix = mat; - updateBoudingRect(); - _Touched = true; -}*/ - - -// ********************************************************************************* -void CCtrlPolygon::draw() -{ - H_AUTO(Rz_CCtrlPolygon_draw) - if (_Tris.empty()) return; - if (!_Parent) return; - CInterfaceManager *im = CInterfaceManager::getInstance(); - CViewRenderer &vr = *CViewRenderer::getInstance(); - if (_Touched) - { - _RealTris.clear(); - uint numTris = (uint)_Tris.size(); - sint32 cornerX, cornerY; - static std::vector winTris; - winTris.resize(numTris); - _Parent->getCorner(cornerX, cornerY, _ParentPosRef); - /*CMatrix m = _Matrix; - m.setPos(m.getPos() + CVector((float) cornerX, (float) cornerY, 0.f));*/ - for(uint k = 0; k < numTris; ++k) - { - /*winTris[k].V0 = m * _Tris[k].V0; - winTris[k].V1 = m * _Tris[k].V1; - winTris[k].V2 = m * _Tris[k].V2;*/ - - CVector2f result; - computeScaledVertex(result, _Tris[k].V0); - winTris[k].V0.set(result.x + cornerX, result.y + cornerY, 0.f); - computeScaledVertex(result, _Tris[k].V1); - winTris[k].V1.set(result.x + cornerX, result.y + cornerY, 0.f); - computeScaledVertex(result, _Tris[k].V2); - winTris[k].V2.set(result.x + cornerX, result.y + cornerY, 0.f); - } - // recompute & reclip poly - _RealTris.clear(); - sint32 cx, cy, cw, ch; - vr.getClipWindow(cx, cy, cw, ch); - // per tri clip - NLMISC::CVector minCorner; - NLMISC::CVector maxCorner; - for(uint k = 0; k < numTris; ++k) - { - winTris[k].getMinCorner(minCorner); - winTris[k].getMaxCorner(maxCorner); - if (totallyOutside(minCorner, maxCorner, cx, cy, cw, ch)) continue; - if (totallyInside(minCorner, maxCorner, cx, cy, cw, ch)) - { - _RealTris.push_back(winTris[k]); - } - else - { - const uint maxNumCorners = 8; - static CVector outPos0[maxNumCorners]; - static CVector outPos1[maxNumCorners]; - // - outPos0[0] = winTris[k].V0; - outPos0[1] = winTris[k].V1; - outPos0[2] = winTris[k].V2; - // - CVector *pPos0 = outPos0; - CVector *pPos1 = outPos1; - // - sint count = 3; - // - if ((sint32) minCorner.x < cx) - { - // clip left - CPlane clipper(-1.f, 0.f, 0.f, (float) cx); - count = clipper.clipPolygonBack(pPos0, pPos1, count); - std::swap(pPos0, pPos1); - } - if ((sint32) maxCorner.x > cx + cw) - { - // clip right - CPlane clipper(1.f, 0.f, 0.f, - (float) (cx + cw)); - count = clipper.clipPolygonBack(pPos0, pPos1, count); - std::swap(pPos0, pPos1); - } - // - if ((sint32) minCorner.y < cy) - { - // clip bottom - CPlane clipper(0.f, -1.f, 0.f, (float) cy); - count = clipper.clipPolygonBack(pPos0, pPos1, count); - std::swap(pPos0, pPos1); - } - if ((sint32) maxCorner.y > cy + ch) - { - // clip top - CPlane clipper(0.f, 1.f, 0.f, - (float) (cy + ch)); - count = clipper.clipPolygonBack(pPos0, pPos1, count); - std::swap(pPos0, pPos1); - } - nlassert(count <= 8); - if (count >= 3) - { - for(uint k = 0; k < (uint) (count - 2); ++k) - { - _RealTris.push_back(NLMISC::CTriangle(pPos0[0], pPos0[k + 1], pPos0[k + 2])); - } - } - } - } - _Touched = false; - } - if (_RealTris.empty()) return; - CRGBA col; - if(getModulateGlobalColor()) - { - col.modulateFromColor (_Color, CWidgetManager::getInstance()->getGlobalColorForContent()); - } - else - { - col= _Color; - col.A = (uint8)(((sint32)col.A*((sint32)CWidgetManager::getInstance()->getGlobalColorForContent().A+1))>>8); - } - vr.drawUnclippedTriangles(_RenderLayer, _RealTris, col); -} - -// ********************************************************************************* -void CCtrlPolygon::updateCoords() -{ - H_AUTO(Rz_CCtrlPolygon_updateCoords) - CCtrlBase::updateCoords(); - updateBoudingRect(); - // assume that clipping will have to be done again, real update of triangle will be done at render time - _Touched = true; -} - -// ********************************************************************************* -void CCtrlPolygon::setAlpha(sint32 a) -{ - H_AUTO(Rz_CCtrlPolygon_setAlpha) - _Color.A = (uint8) a; -} - -// ********************************************************************************* -bool CCtrlPolygon::handleEvent(const NLGUI::CEventDescriptor &/* event */) -{ - H_AUTO(Rz_CCtrlPolygon_handleEvent) - return false; -} - -// ********************************************************************************* -// TMP TMP -void CCtrlPolygon::computeScaledVertex(NLMISC::CVector2f &dest, const NLMISC::CVector2f &src) -{ - H_AUTO(Rz_CCtrlPolygon_computeScaledVertex) - dest.set(src.x, src.y); -} - -// ********************************************************************************* -// TMP TMP -void CCtrlPolygon::touch() -{ - H_AUTO(Rz_CCtrlPolygon_touch) - updateBoudingRect(); - _Touched = true; -} - - - diff --git a/code/ryzom/client/src/interface_v3/ctrl_polygon.h b/code/ryzom/client/src/interface_v3/ctrl_polygon.h deleted file mode 100644 index 78b852ba4..000000000 --- a/code/ryzom/client/src/interface_v3/ctrl_polygon.h +++ /dev/null @@ -1,88 +0,0 @@ -// Ryzom - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - - -#ifndef RZ_CTRL_POLYGON_H -#define RZ_CTRL_POLYGON_H - -#include "nel/gui/ctrl_base.h" -#include "nel/gui/view_renderer.h" -#include "nel/misc/geom_ext.h" -#include "nel/misc/polygon.h" - -namespace NLMISC -{ - class CVector2f; -} - -/** Display of an arbitrary polygon in the ui. - * polygons are clipped & batched. - * - * Derives from CCtrlBase in order to provide button / tooltip capability - * - * \author Nicolas Vizerie - * \author Nevrax France - * \date 1/2006 - */ -class CCtrlPolygon : public CCtrlBase -{ -public: - CCtrlPolygon(); - virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); } - virtual void updateCoords(); - virtual void draw(); - /** Change the vertices. This is costly because concav / complex polys are split in a list of triangles - */ - void setVertices(const std::vector &vertices); - const std::vector &getVertices() const { return _Poly.Vertices; } - // test if current position in inside the current (transformed) poly (in window space) - bool contains(const NLMISC::CVector2f &pos) const; - // color - void setColorRGBA(NLMISC::CRGBA col) { _Color = col; } - NLMISC::CRGBA getColorRGBA() const { return _Color; } - // from CViewBase - virtual sint32 getAlpha() const { return (sint32) _Color.A; } - virtual void setAlpha(sint32 a); - /** Change the matrix for this poly. Changing the matrix is usually cheaper than changing - * The vertices because complex poly do not have to be split again - */ - //void setMatrix(const NLMISC::CMatrix &mat); - //const NLMISC::CMatrix &getMatrix() const { return _Matrix; } - // test if last call to 'setVertices' was for a valid poly (e.g one that doesn't overlapp itself) - bool isValid() const { return _Valid; } - virtual bool handleEvent (const NLGUI::CEventDescriptor &event); - - // no capturable by default (just tooltip capability wanted) - virtual bool isCapturable() const { return false; } -private: - NLMISC::CPolygon _Poly; - NLMISC::CPolygon2D _XFormPoly; - //NLMISC::CMatrix _Matrix; - bool _Valid; - bool _Touched; - NLMISC::CRGBA _Color; - std::vector _Tris; - std::vector _RealTris; // clipped tris in screen coordinates -private: - void updateBoudingRect(); -protected: - // TMP TMP : have to solve matrix imprecision for display in map -> do the full computation for now ... - virtual void computeScaledVertex(NLMISC::CVector2f &dest, const NLMISC::CVector2f &src); -public: - void touch(); -}; - -#endif diff --git a/code/ryzom/client/src/main_loop.cpp b/code/ryzom/client/src/main_loop.cpp index ab53744c3..61dda28bd 100644 --- a/code/ryzom/client/src/main_loop.cpp +++ b/code/ryzom/client/src/main_loop.cpp @@ -125,7 +125,7 @@ #include "nel/misc/check_fpu.h" // TMP TMP -#include "interface_v3/ctrl_polygon.h" +#include "nel/gui/ctrl_polygon.h" // TMP TMP #include "game_share/scenario_entry_points.h" #include "nel/3d/driver.h" diff --git a/code/ryzom/client/src/r2/displayer_visual_group.cpp b/code/ryzom/client/src/r2/displayer_visual_group.cpp index d4daa2e67..5197398a7 100644 --- a/code/ryzom/client/src/r2/displayer_visual_group.cpp +++ b/code/ryzom/client/src/r2/displayer_visual_group.cpp @@ -33,7 +33,7 @@ #include "../global.h" #include "../misc.h" #include "../landscape_poly_drawer.h" -#include "../interface_v3/ctrl_polygon.h" +#include "nel/gui/ctrl_polygon.h" #include "nel/gui/ctrl_quad.h" #include "../time_client.h" // diff --git a/code/ryzom/client/src/r2/prim_render.cpp b/code/ryzom/client/src/r2/prim_render.cpp index 19b987e09..e7f881c0a 100644 --- a/code/ryzom/client/src/r2/prim_render.cpp +++ b/code/ryzom/client/src/r2/prim_render.cpp @@ -24,7 +24,7 @@ // #include "../interface_v3/view_bitmap.h" #include "nel/gui/ctrl_quad.h" -#include "../interface_v3/ctrl_polygon.h" +#include "nel/gui/ctrl_polygon.h" #include "../interface_v3/interface_manager.h" #include "nel/gui/view_renderer.h" #include "../interface_v3/group_map.h" diff --git a/code/ryzom/client/src/r2/prim_render.h b/code/ryzom/client/src/r2/prim_render.h index bab97d5f6..18817b46f 100644 --- a/code/ryzom/client/src/r2/prim_render.h +++ b/code/ryzom/client/src/r2/prim_render.h @@ -27,10 +27,10 @@ namespace NLGUI { class CLuaObject; + class CCtrlPolygon; } class CEntityCL; -class CCtrlPolygon; namespace R2 {