This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/freestyle/intern/application/AppView.h

276 lines
5.9 KiB
C++

/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __APPVIEW_H__
#define __APPVIEW_H__
/** \file
* \ingroup freestyle
*/
#include "AppConfig.h"
#include "../geometry/Geom.h"
#include "../geometry/BBox.h"
#include "../scene_graph/NodeDrawingStyle.h"
#include "../system/Precision.h"
#include "BLI_math.h"
#ifdef WITH_CXX_GUARDEDALLOC
# include "MEM_guardedalloc.h"
#endif
namespace Freestyle {
using namespace Geometry;
class AppView {
public:
AppView(const char *iName = 0);
virtual ~AppView();
public:
// inherited
inline unsigned int width()
{
return _width;
}
inline unsigned int height()
{
return _height;
}
inline BBox<Vec2i> border()
{
return _border;
}
inline float thickness()
{
return _thickness;
}
inline void setWidth(unsigned int width)
{
_width = width;
}
inline void setHeight(unsigned int height)
{
_height = height;
}
inline void setBorder(int xmin, int ymin, int xmax, int ymax)
{
_border = BBox<Vec2i>(Vec2i(xmin, ymin), Vec2i(xmax, ymax));
}
inline void setThickness(float thickness)
{
_thickness = thickness;
}
protected:
unsigned int _width, _height;
BBox<Vec2i> _border;
float _thickness;
public:
/*! Sets the model to draw in the viewer
* iModel
* The Root Node of the model
*/
inline void setModel(NodeGroup *iModel)
{
if (0 != _ModelRootNode->numberOfChildren()) {
_ModelRootNode->DetachChildren();
_ModelRootNode->clearBBox();
}
AddModel(iModel);
}
/*! Adds a model for displaying in the viewer */
inline void AddModel(NodeGroup *iModel)
{
_ModelRootNode->AddChild(iModel);
_ModelRootNode->UpdateBBox();
_minBBox = std::min(
std::min(_ModelRootNode->bbox().getMin()[0], _ModelRootNode->bbox().getMin()[1]),
_ModelRootNode->bbox().getMin()[2]);
_maxBBox = std::max(
std::max(_ModelRootNode->bbox().getMax()[0], _ModelRootNode->bbox().getMax()[1]),
_ModelRootNode->bbox().getMax()[2]);
_maxAbs = std::max(rabs(_minBBox), rabs(_maxBBox));
_minAbs = std::min(rabs(_minBBox), rabs(_maxBBox));
}
inline void AddSilhouette(NodeGroup *iSilhouette)
{
_SilhouetteRootNode->AddChild(iSilhouette);
}
inline void Add2DSilhouette(NodeGroup * /*iSilhouette*/)
{
//_pFENode->AddChild(iSilhouette);
}
inline void Add2DVisibleSilhouette(NodeGroup * /*iVSilhouette*/)
{
//_pVisibleSilhouetteNode->AddChild(iVSilhouette);
}
inline void setDebug(NodeGroup *iDebug)
{
if (0 != _DebugRootNode->numberOfChildren()) {
_DebugRootNode->DetachChildren();
_DebugRootNode->clearBBox();
}
AddDebug(iDebug);
}
inline void AddDebug(NodeGroup *iDebug)
{
_DebugRootNode->AddChild(iDebug);
}
inline void DetachModel(Node *iModel)
{
_ModelRootNode->DetachChild(iModel);
_ModelRootNode->UpdateBBox();
_minBBox = std::min(
std::min(_ModelRootNode->bbox().getMin()[0], _ModelRootNode->bbox().getMin()[1]),
_ModelRootNode->bbox().getMin()[2]);
_maxBBox = std::max(
std::max(_ModelRootNode->bbox().getMax()[0], _ModelRootNode->bbox().getMax()[1]),
_ModelRootNode->bbox().getMax()[2]);
_maxAbs = std::max(rabs(_minBBox), rabs(_maxBBox));
_minAbs = std::min(rabs(_minBBox), rabs(_maxBBox));
}
inline void DetachModel()
{
_ModelRootNode->DetachChildren();
_ModelRootNode->clearBBox();
#if 0
// 2D Scene
_p2DNode.DetachChildren();
_pFENode->DetachChildren();
_pVisibleSilhouetteNode->DetachChildren();
#endif
}
inline void DetachSilhouette()
{
_SilhouetteRootNode->DetachChildren();
#if 0
_pFENode->DetachChildren();
_pVisibleSilhouetteNode->DetachChildren();
#endif
_p2DSelectionNode->destroy();
}
inline void DetachVisibleSilhouette()
{
//_pVisibleSilhouetteNode->DetachChildren();
_p2DSelectionNode->destroy();
}
inline void DetachDebug()
{
_DebugRootNode->DetachChildren();
}
real distanceToSceneCenter();
real GetFocalLength();
inline real GetAspect() const
{
return ((real)_width / (real)_height);
}
void setHorizontalFov(float hfov)
{
_Fovy = 2.0 * atan(tan(hfov / 2.0) / GetAspect());
}
inline real GetFovyRadian() const
{
return _Fovy;
}
inline real GetFovyDegrees() const
{
return _Fovy * 180.0 / M_PI; // TODO Use RAD2DEG here too?
}
BBox<Vec3r> scene3DBBox() const
{
return _ModelRootNode->bbox();
}
real znear();
real zfar();
public:
/*! Core scene drawing */
void DrawScene(SceneVisitor *iRenderer);
/*! 2D Scene Drawing */
void Draw2DScene(SceneVisitor *iRenderer);
protected:
/*! fabs or abs */
inline int rabs(int x)
{
return abs(x);
}
inline real rabs(real x)
{
return fabs(x);
}
protected:
float _Fovy;
// The root node container
NodeGroup _RootNode;
NodeDrawingStyle *_ModelRootNode;
NodeDrawingStyle *_SilhouetteRootNode;
NodeDrawingStyle *_DebugRootNode;
NodeGroup _Light;
real _minBBox;
real _maxBBox;
real _maxAbs;
real _minAbs;
// 2D Scene
bool _Draw2DScene;
bool _Draw3DScene;
NodeGroup _p2DNode;
NodeDrawingStyle *_p2DSelectionNode;
#ifdef WITH_CXX_GUARDEDALLOC
MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:AppView")
#endif
};
} /* namespace Freestyle */
#endif // __APPVIEW_H__