2017-03-15 19:29:34 +00:00
|
|
|
// 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/>.
|
|
|
|
|
|
|
|
#include "std_afx.h"
|
|
|
|
#include "object_viewer.h"
|
|
|
|
#include "nel/3d/ps_particle.h"
|
|
|
|
#include "tail_particle_dlg.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CTailParticleDlg dialog
|
|
|
|
|
|
|
|
|
|
|
|
CTailParticleDlg::CTailParticleDlg(CParticleWorkspace::CNode *ownerNode, NL3D::CPSTailParticle *tp)
|
|
|
|
{
|
|
|
|
nlassert(tp);
|
|
|
|
_TailParticle = tp;
|
|
|
|
_Node = ownerNode;
|
|
|
|
//{{AFX_DATA_INIT(CTailParticleDlg)
|
|
|
|
m_TailFade = tp->getColorFading();
|
|
|
|
m_TailPersistAfterDeath = FALSE;
|
|
|
|
//}}AFX_DATA_INIT
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CTailParticleDlg::init(CWnd *pParent, sint x, sint y)
|
|
|
|
{
|
|
|
|
Create(IDD_TAIL_PARTICLE, pParent);
|
|
|
|
RECT r;
|
|
|
|
GetClientRect(&r);
|
|
|
|
r.top += y; r.bottom += y;
|
|
|
|
r.right += x; r.left += x;
|
|
|
|
MoveWindow(&r);
|
|
|
|
|
|
|
|
if (!dynamic_cast<NL3D::CPSRibbon *>(_TailParticle))
|
|
|
|
{
|
|
|
|
m_TailShape.EnableWindow(FALSE);
|
|
|
|
m_TailShape.ShowWindow(FALSE);
|
|
|
|
m_TailPersistAfterDeathCtrl.EnableWindow(FALSE);
|
|
|
|
m_TailPersistAfterDeathCtrl.ShowWindow(FALSE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/// m_TailPersistAfterDeath = (dynamic_cast<NL3D::CPSRibbon *>(_TailParticle))->getPersistAfterDeath();
|
|
|
|
}
|
|
|
|
NL3D::CPSRibbon *ribbon = dynamic_cast<NL3D::CPSRibbon *>(_TailParticle);
|
|
|
|
if (ribbon)
|
|
|
|
{
|
|
|
|
((CComboBox *) GetDlgItem(IDC_RIBBON_ORIENTATION))->SetCurSel(ribbon->getOrientation());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
GetDlgItem(IDC_RIBBON_ORIENTATION)->ShowWindow(SW_HIDE);
|
|
|
|
}
|
|
|
|
UpdateData();
|
|
|
|
ShowWindow(SW_SHOW);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTailParticleDlg::DoDataExchange(CDataExchange* pDX)
|
|
|
|
{
|
|
|
|
CDialog::DoDataExchange(pDX);
|
|
|
|
//{{AFX_DATA_MAP(CTailParticleDlg)
|
|
|
|
DDX_Control(pDX, IDC_TAIL_SHAPE, m_TailShape);
|
|
|
|
DDX_Control(pDX, IDC_TAIL_PERSIST_AFTER_DEATH, m_TailPersistAfterDeathCtrl);
|
|
|
|
DDX_Check(pDX, IDC_TAIL_FADE, m_TailFade);
|
|
|
|
DDX_Check(pDX, IDC_TAIL_PERSIST_AFTER_DEATH, m_TailPersistAfterDeath);
|
|
|
|
//}}AFX_DATA_MAP
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CTailParticleDlg, CDialog)
|
|
|
|
//{{AFX_MSG_MAP(CTailParticleDlg)
|
|
|
|
ON_BN_CLICKED(IDC_TAIL_FADE, OnTailFade)
|
|
|
|
ON_BN_CLICKED(IDC_TAIL_PERSIST_AFTER_DEATH, OnTailPersistAfterDeath)
|
|
|
|
ON_CBN_SELCHANGE(IDC_TAIL_SHAPE, OnSelchangeTailShape)
|
|
|
|
ON_WM_PAINT()
|
|
|
|
ON_CBN_SELCHANGE(IDC_RIBBON_ORIENTATION, OnSelchangeRibbonOrientation)
|
|
|
|
//}}AFX_MSG_MAP
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CTailParticleDlg message handlers
|
|
|
|
|
|
|
|
void CTailParticleDlg::OnTailFade()
|
|
|
|
{
|
|
|
|
UpdateData();
|
|
|
|
_TailParticle->setColorFading(m_TailFade ? true : false);
|
|
|
|
_Node->setModified(true);
|
|
|
|
UpdateData(FALSE);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CTailParticleDlg::OnTailPersistAfterDeath()
|
|
|
|
{
|
|
|
|
UpdateData();
|
|
|
|
nlassert(dynamic_cast<NL3D::CPSRibbon *>(_TailParticle));
|
|
|
|
/// (dynamic_cast<NL3D::CPSRibbon *>(_TailParticle))->setPersistAfterDeath(m_TailPersistAfterDeath ? true : false);
|
|
|
|
_Node->setModified(true);
|
|
|
|
UpdateData(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTailParticleDlg::OnSelchangeTailShape()
|
|
|
|
{
|
|
|
|
UpdateData();
|
|
|
|
NL3D::CPSRibbon *r = dynamic_cast<NL3D::CPSRibbon *>(_TailParticle);
|
|
|
|
nlassert(r);
|
|
|
|
switch (m_TailShape.GetCurSel() )
|
|
|
|
{
|
|
|
|
case 0: // triangle
|
|
|
|
r->setShape(NL3D::CPSRibbon::Triangle, NL3D::CPSRibbon::NbVerticesInTriangle);
|
|
|
|
break;
|
|
|
|
case 1: // quad
|
|
|
|
r->setShape(NL3D::CPSRibbon::Losange, NL3D::CPSRibbon::NbVerticesInLosange);
|
|
|
|
break;
|
|
|
|
case 2: // octogon
|
|
|
|
r->setShape(NL3D::CPSRibbon::HeightSides, NL3D::CPSRibbon::NbVerticesInHeightSide);
|
|
|
|
break;
|
|
|
|
case 3: // pentagram
|
|
|
|
r->setShape(NL3D::CPSRibbon::Pentagram, NL3D::CPSRibbon::NbVerticesInPentagram);
|
|
|
|
break;
|
|
|
|
case 4: // simple segment x
|
|
|
|
r->setShape(NL3D::CPSRibbon::SimpleSegmentX, NL3D::CPSRibbon::NbVerticesInSimpleSegmentX, true);
|
|
|
|
break;
|
|
|
|
case 5: // simple segment y
|
|
|
|
r->setShape(NL3D::CPSRibbon::SimpleSegmentY, NL3D::CPSRibbon::NbVerticesInSimpleSegmentY, true);
|
|
|
|
break;
|
|
|
|
case 6: // simple segment z
|
|
|
|
r->setShape(NL3D::CPSRibbon::SimpleSegmentZ, NL3D::CPSRibbon::NbVerticesInSimpleSegmentZ, true);
|
|
|
|
break;
|
|
|
|
case 7: // simple brace
|
|
|
|
r->setShape(NL3D::CPSRibbon::SimpleBrace, NL3D::CPSRibbon::NbVerticesInSimpleBrace, true);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
_Node->setModified(true);
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTailParticleDlg::OnPaint()
|
|
|
|
{
|
|
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
|
|
|
|
NL3D::CPSRibbon *r = dynamic_cast<NL3D::CPSRibbon *>(_TailParticle);
|
|
|
|
// if we're dealing with a ribbon, we draw the shape used for extrusion
|
|
|
|
if (r)
|
|
|
|
{
|
|
|
|
const uint x = 270, y = 15, size = 32;
|
|
|
|
|
|
|
|
|
|
|
|
dc.FillSolidRect(x, y, size, size, 0xffffff);
|
|
|
|
|
|
|
|
std::vector<NLMISC::CVector> verts;
|
|
|
|
verts.resize(r->getNbVerticesInShape() );
|
|
|
|
r->getShape(&verts[0]);
|
|
|
|
|
|
|
|
CPen p;
|
|
|
|
p.CreatePen(PS_SOLID, 1, (COLORREF) 0);
|
|
|
|
CPen *old = dc.SelectObject(&p);
|
|
|
|
|
|
|
|
if (r->getBraceMode())
|
|
|
|
{
|
|
|
|
for(uint k = 0; k < verts.size() / 2; ++k)
|
|
|
|
{
|
|
|
|
dc.MoveTo((int) (x + (size / 2) * (1 + verts[2 * k].x)), (int) (y + (size / 2) * (1 - verts[2 * k].y)));
|
|
|
|
dc.LineTo((int) (x + (size / 2) * (1 + verts[2 * k + 1].x)), (int) (y + (size / 2) * (1 - verts[2 * k + 1].y)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dc.MoveTo((int) (x + (size / 2) * (1 + verts[0].x)), (int) (y + (size / 2) * (1 - verts[0].y)));
|
|
|
|
for (std::vector<NLMISC::CVector>::const_iterator it = verts.begin(); it != verts.end(); ++it)
|
|
|
|
{
|
|
|
|
dc.LineTo((int) (x + (size / 2) * (1 + it->x)), (int) (y + (size / 2) * (1 - it->y)));
|
|
|
|
}
|
|
|
|
dc.LineTo((int) (x + (size / 2) * (1 + verts[0].x)), (int) (y + (size / 2) * (1 - verts[0].y)));
|
|
|
|
}
|
|
|
|
dc.SelectObject(old);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTailParticleDlg::OnSelchangeRibbonOrientation()
|
|
|
|
{
|
|
|
|
NL3D::CPSRibbon *r = dynamic_cast<NL3D::CPSRibbon *>(_TailParticle);
|
|
|
|
nlassert(r);
|
|
|
|
r->setOrientation((NL3D::CPSRibbon::TOrientation) ((CComboBox *) GetDlgItem(IDC_RIBBON_ORIENTATION))->GetCurSel());
|
|
|
|
_Node->setModified(true);
|
|
|
|
}
|