464 lines
14 KiB
C++
464 lines
14 KiB
C++
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
// 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 <http://www.gnu.org/licenses/>.
|
|
|
|
#if !defined(AFX_ATTRIB_DLG_H__DF35743E_C8B4_4218_9C42_A3DF4126BEF2__INCLUDED_)
|
|
#define AFX_ATTRIB_DLG_H__DF35743E_C8B4_4218_9C42_A3DF4126BEF2__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
|
|
#include "nel/misc/rgba.h"
|
|
#include "nel/3d/ps_plane_basis.h"
|
|
#include "nel/3d/ps_attrib_maker.h"
|
|
#include "editable_range.h"
|
|
#include "popup_notify.h"
|
|
#include "particle_workspace.h"
|
|
|
|
namespace NL3D
|
|
{
|
|
class CPSAttribMakerBase;
|
|
}
|
|
|
|
using NLMISC::CRGBA;
|
|
|
|
|
|
|
|
class CEditAttribDlg;
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAttribDlg dialog
|
|
|
|
class CAttribDlg : public CDialog, public IPopupNotify
|
|
{
|
|
// Construction
|
|
public:
|
|
/** construct the dialog
|
|
* \param : valueID : an unique id for this dialog
|
|
* \param : enableConstantValue when false, only a scheme is available
|
|
*/
|
|
CAttribDlg(const std::string &valueID, CParticleWorkspace::CNode *ownerNode, bool enableConstantValue = true); // standard constructor
|
|
CAttribDlg::~CAttribDlg();
|
|
|
|
|
|
/// must be called before init, disable constant value usage
|
|
void disableConstantValue(void) { _EnableConstantValue = false; }
|
|
|
|
// close window if being edited
|
|
void closeEditWindow();
|
|
|
|
// Dialog Data
|
|
//{{AFX_DATA(CAttribDlg)
|
|
enum { IDD = IDD_ATTRIB_DLG };
|
|
CButton m_PutScheme;
|
|
CButton m_GetScheme;
|
|
CButton m_EditUserParam;
|
|
CComboBox m_SchemeInput;
|
|
CStatic m_CstValuePos;
|
|
CStatic m_NbCyclePos;
|
|
CButton m_AttrBitmap;
|
|
CButton m_ClampCtrl;
|
|
CButton m_EditScheme;
|
|
CComboBox m_UseScheme;
|
|
CComboBox m_Scheme;
|
|
CString m_AttribName;
|
|
BOOL m_Clamp;
|
|
//}}AFX_DATA
|
|
|
|
|
|
/// init the dialog with the given bitmap
|
|
void init(HBITMAP bitmap, sint x, sint y, CWnd *pParent = NULL);
|
|
|
|
// force to update dialog content
|
|
void update();
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CAttribDlg)
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//}}AFX_VIRTUAL
|
|
|
|
public:
|
|
|
|
/// enable the srcInput
|
|
void enableSrcInput(bool enable = true) { _SrcInputEnabled = enable; }
|
|
bool isSrcInputEnabled() const { return _SrcInputEnabled; }
|
|
|
|
|
|
/** Disable the possibility to choose a scheme that has memory. (for example, a scheme for lifetime of a located has no sense
|
|
* because located have already some memory to store it)
|
|
*/
|
|
void enableMemoryScheme(bool enabled = true) { _DisableMemoryScheme = !enabled; }
|
|
|
|
/** tells wether memory schemes are enables
|
|
* \see enableMemoryScheme()
|
|
*/
|
|
bool isMemorySchemeEnabled() const { return !_DisableMemoryScheme; }
|
|
|
|
/// enable Nb Cycle tuning
|
|
void enableNbCycles(bool enabled = true) { _NbCycleEnabled = enabled; }
|
|
bool isNbCycleEnabled() const { return _NbCycleEnabled; }
|
|
|
|
|
|
public:
|
|
// private usage (not private because accessed by a static function) : return the nbCycles parameter of the scheme (e.g the input multiplier).
|
|
virtual float getSchemeNbCycles(void) const = 0;
|
|
|
|
// private usage (not private because accessed by a static function) : set the nbCycles parameter of the scheme (e.g the input multiplier)
|
|
virtual void setSchemeNbCycles(float nbCycles) = 0;
|
|
|
|
BOOL EnableWindow( BOOL bEnable = TRUE );
|
|
|
|
// Implementation
|
|
protected:
|
|
|
|
/// bool : true is src input are allowed
|
|
bool _SrcInputEnabled;
|
|
|
|
// true if constant values are allowed
|
|
bool _EnableConstantValue;
|
|
|
|
// change the dialog for constant values
|
|
void cstValueUpdate();
|
|
|
|
/// enable / disable the 'edit input' button, when input can be edited
|
|
void inputValueUpdate(void);
|
|
|
|
|
|
// toggle back from scheme to cst value
|
|
virtual void resetCstValue(void) = 0;
|
|
|
|
// change the dialog for scheme usage
|
|
void schemeValueUpdate();
|
|
|
|
// return true if a scheme is used
|
|
virtual bool useScheme(void) const = 0;
|
|
|
|
|
|
// get the number of attributes makers (schemes) that are available
|
|
virtual uint getNumScheme(void) const = 0;
|
|
|
|
// get the text associated with an attribute maker
|
|
virtual std::string getSchemeName(uint index) const = 0;
|
|
|
|
// edit the current scheme. And return a window on it
|
|
virtual CWnd *editScheme(void) = 0;
|
|
|
|
// set the current scheme
|
|
virtual void setCurrentScheme(uint index) = 0;
|
|
|
|
// set the current scheme ptr
|
|
virtual void setCurrentSchemePtr(NL3D::CPSAttribMakerBase *) = 0;
|
|
|
|
// get the current scheme, -1 if the scheme is unknow (created outside the editor ?)
|
|
virtual sint getCurrentScheme(void) const = 0;
|
|
|
|
/// get a pointer on the current scheme base class
|
|
virtual NL3D::CPSAttribMakerBase *getCurrentSchemePtr(void) const = 0;
|
|
|
|
|
|
// this must return the right dialog for a constant value (created with nex)
|
|
virtual CEditAttribDlg *createConstantValueDlg() = 0;
|
|
|
|
|
|
// tells wether the scheme supports custom input
|
|
virtual bool hasSchemeCustomInput(void) const = 0;
|
|
// retrieve the scheme input id
|
|
virtual NL3D::CPSInputType getSchemeInput(void) const = 0;
|
|
// set the scheme input id
|
|
virtual void setSchemeInput(const NL3D::CPSInputType &input) = 0;
|
|
|
|
// tells wether the scheme input value is clamped or not
|
|
virtual bool isSchemeClamped(void) const = 0;
|
|
// clamp / unclamp the scheme
|
|
virtual void clampScheme(bool clamped = true) = 0;
|
|
// return true if clamping is supported
|
|
virtual bool isClampingSupported(void) const = 0;
|
|
|
|
/// inherited from IPopupNotify
|
|
virtual void childPopupClosed(CWnd *child);
|
|
|
|
|
|
// the dialog used to tune the nb cycles param (when available)
|
|
CEditableRangeFloat *_NbCyclesDlg;
|
|
// this is equal to true when memory schemes are not permitted
|
|
bool _DisableMemoryScheme;
|
|
/// true to enable 'nb cycles' control
|
|
bool _NbCycleEnabled;
|
|
// wrapper to tune the number of cycles
|
|
struct CNbCyclesWrapper : public IPSWrapperFloat
|
|
{
|
|
CAttribDlg *Dlg;
|
|
float get(void) const { return Dlg->getSchemeNbCycles(); }
|
|
void set(const float &v) { Dlg->setSchemeNbCycles(v); }
|
|
} _NbCyclesWrapper;
|
|
// true when created, it is set to false once a constant, or scheme dialog has bee shown
|
|
bool _FirstDrawing;
|
|
// the dialog used to tune a constant value
|
|
CEditAttribDlg *_CstValueDlg;
|
|
|
|
// the current dialog for scheme edition
|
|
CWnd *_SchemeEditionDlg;
|
|
std::string _ValueID;
|
|
CParticleWorkspace::CNode *_Node;
|
|
|
|
// Generated message map functions
|
|
//{{AFX_MSG(CAttribDlg)
|
|
afx_msg void OnSelchangeUseScheme();
|
|
afx_msg void OnSelchangeScheme();
|
|
afx_msg void OnEditScheme();
|
|
afx_msg void OnSelchangeSchemeInput();
|
|
afx_msg void OnClampAttrib();
|
|
afx_msg void OnEditInput();
|
|
afx_msg void OnGetScheme();
|
|
afx_msg void OnPutScheme();
|
|
afx_msg void OnDestroy();
|
|
afx_msg void OnClose();
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* a template class that helps to specialize the attrib maker edition dialog with various types
|
|
*/
|
|
template <typename T> class CAttribDlgT : public CAttribDlg
|
|
{
|
|
public:
|
|
CAttribDlgT(const std::string &valueID, CParticleWorkspace::CNode *node) : CAttribDlg(valueID, node),
|
|
_Wrapper(NULL),
|
|
_SchemeWrapper(NULL)
|
|
{
|
|
}
|
|
void setWrapper(IPSWrapper<T> *wrapper) { nlassert(wrapper); _Wrapper = wrapper; _Wrapper->OwnerNode = _Node; }
|
|
void setSchemeWrapper(IPSSchemeWrapper<T> *schemeWrapper) { nlassert(schemeWrapper); _SchemeWrapper = schemeWrapper; _SchemeWrapper->OwnerNode = _Node; }
|
|
|
|
// inherited from CAttribDlg
|
|
virtual uint getNumScheme(void) const = 0;
|
|
virtual std::string getSchemeName(uint index) const = 0;
|
|
virtual CWnd *editScheme(void) = 0;
|
|
virtual void setCurrentScheme(uint index) = 0;
|
|
virtual sint getCurrentScheme(void) const = 0;
|
|
|
|
virtual void resetCstValue(void)
|
|
{
|
|
_Wrapper->setAndUpdateModifiedFlag(_Wrapper->get()); // reuse current color
|
|
}
|
|
|
|
virtual bool hasSchemeCustomInput(void) const { return _SchemeWrapper->getScheme()->hasCustomInput(); }
|
|
virtual NL3D::CPSInputType getSchemeInput(void) const { return _SchemeWrapper->getScheme()->getInput(); }
|
|
virtual void setSchemeInput(const NL3D::CPSInputType &input) { _SchemeWrapper->getScheme()->setInput(input); }
|
|
|
|
|
|
virtual float getSchemeNbCycles(void) const { return _SchemeWrapper->getScheme()->getNbCycles(); }
|
|
virtual void setSchemeNbCycles(float nbCycles) { _SchemeWrapper->getScheme()->setNbCycles(nbCycles); }
|
|
|
|
|
|
|
|
virtual bool isSchemeClamped(void) const { return _SchemeWrapper->getScheme()->getClamping(); }
|
|
virtual void clampScheme(bool clamped = true) { _SchemeWrapper->getScheme()->setClamping(clamped); }
|
|
virtual bool isClampingSupported(void) const { return _SchemeWrapper->getScheme()->isClampingSupported(); };
|
|
virtual NL3D::CPSAttribMakerBase *getCurrentSchemePtr(void) const { return _SchemeWrapper->getScheme(); }
|
|
virtual void setCurrentSchemePtr(NL3D::CPSAttribMakerBase *s)
|
|
{
|
|
_SchemeWrapper->setSchemeAndUpdateModifiedFlag(NLMISC::safe_cast<NL3D::CPSAttribMaker<T> *>(s));
|
|
}
|
|
|
|
|
|
protected:
|
|
virtual bool useScheme(void) const
|
|
{
|
|
nlassert(_SchemeWrapper);
|
|
return(_SchemeWrapper->getScheme() != NULL);
|
|
}
|
|
public:
|
|
// wrapper to set/get a constant float
|
|
IPSWrapper<T> *_Wrapper;
|
|
// wrapper to set/get a scheme
|
|
IPSSchemeWrapper<T> *_SchemeWrapper ;
|
|
};
|
|
|
|
/** an attribute editor specialized for float values
|
|
*/
|
|
|
|
class CAttribDlgFloat : public CAttribDlgT<float>, public CBoundCheckerFloat
|
|
{
|
|
public:
|
|
/** ctor
|
|
* \param valueID an unique id for the constant value editable range dialog
|
|
* \param minValue : the min value for the editable range dlg(for constant value)
|
|
* \param maxValue : the min value for the editable range dlg (for constant value)
|
|
*/
|
|
CAttribDlgFloat(const std::string &valueID, CParticleWorkspace::CNode *node, float minValue = 0, float maxValue = 10);
|
|
|
|
|
|
// inherited from CAttribDlg
|
|
virtual uint getNumScheme(void) const;
|
|
virtual std::string getSchemeName(uint index) const;
|
|
virtual CWnd *editScheme(void);
|
|
virtual void setCurrentScheme(uint index);
|
|
virtual sint getCurrentScheme(void) const;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual CEditAttribDlg *createConstantValueDlg();
|
|
// ID for the cst float value edition dialog
|
|
std::string _CstValueId;
|
|
float _MinRange, _MaxRange;
|
|
};
|
|
|
|
|
|
/** an attribute editor specialized for unsigned int values
|
|
*/
|
|
|
|
class CAttribDlgUInt : public CAttribDlgT<uint32>, public CBoundCheckerUInt
|
|
{
|
|
public:
|
|
/** ctor
|
|
* \param valueID an unique id for the constant value editable range dialog
|
|
* \param minValue : the min value for the editable range dlg(for constant value)
|
|
* \param maxValue : the min value for the editable range dlg (for constant value)
|
|
*/
|
|
CAttribDlgUInt(const std::string &valueID, CParticleWorkspace::CNode *node, uint32 minValue = 0, uint32 maxValue = 10);
|
|
|
|
|
|
// inherited from CAttribDlg
|
|
virtual uint getNumScheme(void) const;
|
|
virtual std::string getSchemeName(uint index) const;
|
|
virtual CWnd *editScheme(void);
|
|
virtual void setCurrentScheme(uint index);
|
|
virtual sint getCurrentScheme(void) const;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual CEditAttribDlg *createConstantValueDlg();
|
|
// ID for the cst float value edition dialog
|
|
std::string _CstValueId;
|
|
uint32 _MinRange, _MaxRange;
|
|
};
|
|
|
|
|
|
|
|
/** an attribute editor specialized for signed int values
|
|
*/
|
|
|
|
class CAttribDlgInt : public CAttribDlgT<sint32>, public CBoundCheckerInt
|
|
{
|
|
public:
|
|
/** ctor
|
|
* \param valueID an unique id for the constant value editable range dialog
|
|
* \param minValue : the min value for the editable range dlg(for constant value)
|
|
* \param maxValue : the min value for the editable range dlg (for constant value)
|
|
*/
|
|
CAttribDlgInt(const std::string &valueID, CParticleWorkspace::CNode *node, sint32 minValue = 0, sint32 maxValue = 10);
|
|
|
|
|
|
// inherited from CAttribDlg
|
|
virtual uint getNumScheme(void) const;
|
|
virtual std::string getSchemeName(uint index) const;
|
|
virtual CWnd *editScheme(void);
|
|
virtual void setCurrentScheme(uint index);
|
|
virtual sint getCurrentScheme(void) const;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual CEditAttribDlg *createConstantValueDlg();
|
|
// ID for the cst float value edition dialog
|
|
std::string _CstValueId;
|
|
sint32 _MinRange, _MaxRange;
|
|
};
|
|
|
|
|
|
|
|
|
|
/** an attribute editor specialized for RGB values
|
|
*/
|
|
|
|
class CAttribDlgRGBA : public CAttribDlgT<CRGBA>
|
|
{
|
|
public:
|
|
/** ctor
|
|
* \param valueID an unique id for the constant value editable range dialog
|
|
*/
|
|
CAttribDlgRGBA(const std::string &valueID, CParticleWorkspace::CNode *node);
|
|
|
|
|
|
// inherited from CAttribDlg
|
|
virtual uint getNumScheme(void) const;
|
|
virtual std::string getSchemeName(uint index) const;
|
|
virtual CWnd *editScheme(void);
|
|
virtual void setCurrentScheme(uint index);
|
|
virtual sint getCurrentScheme(void) const;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual CEditAttribDlg *createConstantValueDlg();
|
|
// ID for the cst float value edition dialog
|
|
std::string _CstValueId;
|
|
};
|
|
|
|
|
|
/** an attribute editor specialized for plane basis values
|
|
*/
|
|
|
|
class CAttribDlgPlaneBasis : public CAttribDlgT<NL3D::CPlaneBasis>
|
|
{
|
|
public:
|
|
/** ctor
|
|
* \param valueID an unique id for the constant value editable range dialog
|
|
*/
|
|
CAttribDlgPlaneBasis(const std::string &valueID, CParticleWorkspace::CNode *node);
|
|
|
|
|
|
// inherited from CAttribDlg
|
|
virtual uint getNumScheme(void) const;
|
|
virtual std::string getSchemeName(uint index) const;
|
|
virtual CWnd *editScheme(void);
|
|
virtual void setCurrentScheme(uint index);
|
|
virtual sint getCurrentScheme(void) const;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual CEditAttribDlg *createConstantValueDlg();
|
|
// ID for the cst float value edition dialog
|
|
std::string _CstValueId;
|
|
};
|
|
|
|
|
|
|
|
//{{AFX_INSERT_LOCATION}}
|
|
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
|
|
|
#endif // !defined(AFX_ATTRIB_DLG_H__DF35743E_C8B4_4218_9C42_A3DF4126BEF2__INCLUDED_)
|