www.pudn.com > etree_src.zip > ControlPane.cpp
//****************************************************************************
// ControlPane.cpp : implementation file of the CControlPane class.
//
// Copyright (c) Boris J. Wang (e_boris2002@hotmail.com) 2002 - 2003
// From Institute of Computing Technology, Chinese Academy of Sciences
// Beijing 100871, China
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//****************************************************************************
#include "stdafx.h"
#include "opengl.h"
#include "branch.h"
#include "Enviroment.h"
#include "Leaf.h"
#include "Tree.h"
#include "OpenGLWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CControlPane dialog
const CControlPane::CCtrlParam CControlPane::AllCtrlParam[CP_ITEMCOUNTS] =
{
{true,4,30.0,&CTree::TreeDepth,_T("Tree Total Depth")},
{true,0.0,90.0,&CSegment::SegExpand,_T("SEG. Expand Angle")},
{true,0.1,0.99,&CSegment::SegScaleLen,_T("SEG. Len. Attenuate")},
{true,0.1,0.99,&CSegment::SegScaleRad,_T("SEG. Rad. Attenuate")},
{true,0.0,180.0,&CSegment::SegTwistInc,_T("SEG. Twist Angle")},
{true,0.0,180.0,&CSegment::SegSideExpand,_T("SSE. Bifurcate Angle")},
{true,0.1,1.0,&CSegment::SegSideScaleDepth,_T("SSE. Dep. Attenuate")},
{true,0.1,1.0,&CSegment::SegSideScale,_T("SSE. Scale Attenuate")},
{true,0.1,4.0,&CSegment::SegLeafSize,_T("Leaf Size")},
{true,0.0,90.0,&CSegment::LeafExpand,_T("Leaf Expand Angle")},
{false,0.5,5.0,&CTree::TreeShadowLength,_T("Tree Shadow Length")},
{false,0.0,1.0,&CTree::BranchShadowDensity,_T("Brush Shad. Density")},
{false,0.0,1.0,&CTree::LeafShadowDensity,_T("Leaf Shadow Density")}
};
CControlPane::CControlPane(CWnd* pParent /*=NULL*/)
: CDialog(CControlPane::IDD, pParent)
, bAutoClose(FALSE)
{
//{{AFX_DATA_INIT(CControlPane)
sCurrent = sMax = sMin = _T("n/a");
iSlider = 0;
sInfo = _T("");
//}}AFX_DATA_INIT
Initialized = false;
CurrentItem = LB_ERR;
wgl = NULL;
}
void CControlPane::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CControlPane)
DDX_Control(pDX, IDC_Slider, wSlider);
DDX_Control(pDX, IDC_ControlItem, wItemList);
DDX_Text(pDX, IDC_Max, sMax);
DDX_Text(pDX, IDC_Min, sMin);
DDX_Slider(pDX, IDC_Slider, iSlider);
DDX_Text(pDX, IDC_Status, sInfo);
DDX_Text(pDX, IDC_Current, sCurrent);
//}}AFX_DATA_MAP
DDX_Check(pDX, IDC_AUTO, bAutoClose);
}
BEGIN_MESSAGE_MAP(CControlPane, CDialog)
//{{AFX_MSG_MAP(CControlPane)
ON_LBN_SELCHANGE(IDC_ControlItem, OnSelchangeControlItem)
ON_WM_LBUTTONDOWN()
ON_NOTIFY(NM_CUSTOMDRAW, IDC_Slider, OnCustomdrawSlider)
//}}AFX_MSG_MAP
// ON_WM_KILLFOCUS()
// ON_WM_SETFOCUS()
ON_WM_ACTIVATE()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CControlPane message handlers
const LPCTSTR CControlPane::lpszNumFormat = _T("%3.2f");
void CControlPane::OnSelchangeControlItem()
{
CurrentItem = wItemList.GetCurSel();
if(CurrentItem != LB_ERR)
{
ASSERT(CurrentItem >=0 && CurrentItem < CP_ITEMCOUNTS);
Initialized = false;
UpdateParam(false);
Initialized = true;
}
sMax.Format(lpszNumFormat,AllCtrlParam[CurrentItem].Max);
sMin.Format(lpszNumFormat,AllCtrlParam[CurrentItem].Min);
sCurrent.Format(lpszNumFormat,*AllCtrlParam[CurrentItem].Target);
UpdateData(false);
}
BOOL CControlPane::OnInitDialog()
{
CDialog::OnInitDialog();
wSlider.SetRange(0,1000);
Initialized = true;
for(int i = 0;i=0 );
if(IsGet)
{
if(!Initialized)return;
UpdateData();
(* AllCtrlParam[CurrentItem].Target) = (AllCtrlParam[CurrentItem].Max - AllCtrlParam[CurrentItem].Min)*(1000 - iSlider)/1000 + AllCtrlParam[CurrentItem].Min;
if(AllCtrlParam[CurrentItem].NeedRebuild)
{
wgl->RebuildTreeModel();
}
wgl->Render();
}
else
{
iSlider = 1000*(1.0 - ((* AllCtrlParam[CurrentItem].Target - AllCtrlParam[CurrentItem].Min)/(AllCtrlParam[CurrentItem].Max - AllCtrlParam[CurrentItem].Min)));
UpdateData(false);
}
}
void CControlPane::OnLButtonDown(UINT nFlags, CPoint point)
{
PostMessage(WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM(point.x,point.y));
}
void CControlPane::OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult)
{
if(!Initialized || CurrentItem == LB_ERR)return;
UpdateParam();
sCurrent.Format(lpszNumFormat,*AllCtrlParam[CurrentItem].Target);
UpdateData(false);
*pResult = 0;
}
void CControlPane::DisplayStatus(CString &str)
{
if(!Initialized)return;
UpdateData();
sInfo = str;
UpdateData(false);
}
void CControlPane::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialog::OnActivate(nState, pWndOther, bMinimized);
UpdateData();
if(WA_INACTIVE == nState && bAutoClose)ShowWindow(SW_HIDE);
}