1 /********************************************************************
3 * Copyright (C) 2008 Tobia Zorzan
5 * This file is part of GoMoku3D.
7 * GoMoku3D is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * GoMoku3D is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GoMoku3D. If not, see <http://www.gnu.org/licenses/>.
20 *******************************************************************/
22 #include "RenderWidget.h"
25 * @class RenderWidget RenderWidget.h
26 * @brief RenderWidget fornisce un widget Qt con visuale 3D.
28 * RenderWidget è la classe a più alto livello della componente 3D dell'applicazione.
29 * I metodi di tale classe sono metodi usati dalle altre componenti, e quindi da
30 * reimplementare in caso si desidere fornire un'altro tipo di visuale del campo di
35 * Costruttore della classe.
36 * @param parent Puntatore al widget genitore.
37 * @param dim La dimensione della matrice di gioco. Se uguale a 0, non viene inizializzata
38 * la parte 3D ma viene inserita un'immagine segnaposto.
40 RenderWidget::RenderWidget(QWidget
*parent
, int dim
)
41 : QWidget(parent
), _renderarea(0), _layout(0), _imageLabel(0)
43 _layout
= new QVBoxLayout(this);
44 if (!_image
.load("./gomoku3d.png")) {
45 qWarning() << "Failed to load image file.";
53 setWhatsThis(tr("Here is displayed the game matrix. Possible interactions are:\n"
54 "- left mouse button click and drag: rotate the game matrix;\n"
55 "- left mouse button: select a cube;\n"
56 "- mouse wheel: zoom in and out;\n"
57 "- ENTER key: confirm a move for the current player;\n"
58 "- SPACE key: enable the explode function;\n"
59 "- UP, DOWN, LEFT, RIGHT arrows: change selected cube;\n"
60 "- W, S keys: change selected cube.\n"));
64 * Distruttore della classe.
65 * Dealloca gli oggetti puntati dai campi dato della classe al momento della distruzione.
67 RenderWidget::~RenderWidget()
78 * Inizializza la componente 3D e visualizza una matrice di gioco di dimensione uguale a \c dim.
79 * @param dim Dimensione della matrice di gioco da rappresentare.
81 void RenderWidget::init(int dim
)
84 _layout
->removeWidget(_imageLabel
);
88 Q_ASSERT(_renderarea
== 0);
89 _renderarea
= new CubeRenderArea(this, dim
);
90 _layout
->addWidget(_renderarea
->getWidget());
92 _defaultCubeColor
= settings
.defaultCubeColor();
93 this->setFocusProxy(_renderarea
->getWidget());
97 * Resetta il widget. Viene distrutta la componente 3D e sostituita con un'immagine segnaposto.
99 void RenderWidget::reset()
101 this->setFocusProxy(0);
103 _renderarea
->getWidget()->hide();
104 _layout
->removeWidget(_renderarea
->getWidget());
109 _imageLabel
= new QLabel();
110 _imageLabel
->setPixmap(_image
);
111 _layout
->addWidget(_imageLabel
, 0, Qt::AlignCenter
);
116 * Abilita e disabilita la possibilità di inviare mosse dall'interfaccia grafica.
117 * @param value Se \c true permette all'utente di inviare una mossa. Se \c false disabilita l'invio delle mosse.
119 void RenderWidget::acceptMove(bool value
)
122 _renderarea
->setAcceptMove(value
);
127 * Disegna una mossa in posizione indicata da \c p con il colore \c c.
128 * @param p La posizione da colorare.
129 * @param c Il colore da usare per rappresentare la mossa.
131 void RenderWidget::drawMove(Point p
, QColor c
)
135 _renderarea
->drawMove(p
, _renderarea
->convertColor(c
));
137 qWarning() << "RenderWidget::drawMove() :" << tr("invalid point");
143 * Disegna una serie di mosse contnute nelle liste parametro. Utilizzata principalmente
144 * per rispristinare una situazione di gioco precedente. Se il parametro \c colorsList è
145 * una lista vuota, per titti i punti da rappresentare viene usato il colore di default.
146 * @param pointsList Una lista di punti.
147 * @param colorsList Una lista di colori da utilizzare per le mosse.
149 void RenderWidget::uncheckedDraw(QList
<Point
> pointsList
, QList
<QColor
> colorsList
)
152 if (colorsList
.isEmpty()) {
153 // draw all points with the default color
154 SbColor4f color
= _renderarea
->convertColor(_defaultCubeColor
);
156 foreach(point
, pointsList
) {
157 _renderarea
->drawMove(point
, color
);
160 Q_ASSERT(pointsList
.size() == colorsList
.size());
161 for (int i
= 0; i
< pointsList
.size(); i
++) {
162 _renderarea
->drawMove(pointsList
.at(i
), _renderarea
->convertColor(colorsList
.at(i
)));
169 * Imposta il colore di sfondo della scena.
170 * Viene utilizzato il colore impostato nelle preferenze.
172 void RenderWidget::updateBackground()
175 GUISettings settings
;
177 (_renderarea
->convertColor(settings
.backgroundColor())).getRGB(background
);
178 _renderarea
->setBackgroundColor(background
);
183 * Imposta il valore della funzione di antialiasing.
184 * @param value Intero \c >=0 \c <= 6 . Più alto è il valore, maggiore è la qualità dello smussamento.
186 void RenderWidget::setAntialiasing(int value
)
189 qDebug() << "Setting antialiasing to:" << value
;
193 * Ritorna il valore del campo dato privato \c _renderarea .
195 CubeRenderArea
*RenderWidget::renderarea()
201 * Seleziona una particolare posizione nella visuale 3D.
202 * @param p La posizione da selezionare.
204 void RenderWidget::highlightPoint(Point p
)
206 _renderarea
->selectCube(p
, SbColor(0.9, 0.9, 0));