/*
===========================================================================

Doom 3 GPL Source Code
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.

This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").

Doom 3 Source Code 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 3 of the License, or
(at your option) any later version.

Doom 3 Source Code 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 Doom 3 Source Code.  If not, see <http://www.gnu.org/licenses/>.

In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code.  If not, please request a copy in writing from id Software at the address below.

If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.

===========================================================================
*/

#include "tools/edit_gui_common.h"


#include "../../sys/win32/rc/AFEditor_resource.h"

#include "DialogAF.h"
#include "DialogAFView.h"

// DialogAFView dialog

toolTip_t DialogAFView::toolTips[] = {
	{ IDC_CHECK_VIEW_BODIES, "show bodies" },
	{ IDC_CHECK_VIEW_BODYNAMES, "show body names" },
	{ IDC_CHECK_VIEW_BODYMASS, "show body mass" },
	{ IDC_CHECK_VIEW_TOTALMASS, "show total mass" },
	{ IDC_CHECK_VIEW_INERTIATENSOR, "show body inertia tensor" },
	{ IDC_CHECK_VIEW_VELOCITY, "show body velocity" },
	{ IDC_CHECK_VIEW_CONSTRAINTNAMES, "show constraint names" },
	{ IDC_CHECK_VIEW_CONSTRAINTS, "show constraints" },
	{ IDC_CHECK_VIEW_PRIMARYONLY, "show only primary constraints" },
	{ IDC_CHECK_VIEW_LIMITS, "show constraint limits" },
	{ IDC_CHECK_VIEW_CONSTRAINEDBODIES, "show bodies constrained by current constraint (body1 = cyan, body2 = blue)" },
	{ IDC_CHECK_VIEW_TREES, "show tree structures" },
	{ IDC_CHECK_MD5_SKELETON, "show md5 with skeleton" },
	{ IDC_CHECK_MD5_SKELETONONLY, "show only the md5 skeleton" },
	{ IDC_CHECK_LINES_DEPTHTEST, "zbuffer lines" },
	{ IDC_CHECK_LINES_USEARROWS, "use arrows" },
	{ IDC_CHECK_PHYSICS_NOFRICTION, "disable all friction" },
	{ IDC_CHECK_PHYSICS_NOLIMITS, "disable all joint limits" },
	{ IDC_CHECK_PHYSICS_NOGRAVITY, "disable gravity" },
	{ IDC_CHECK_PHYSICS_NOSELFCOLLISION, "disable self collision detection" },
	{ IDC_CHECK_PHYSICS_TIMING, "show performance timings" },
	{ IDC_CHECK_PHYSICS_DRAG_ENTITIES, "drag entities" },
	{ IDC_CHECK_PHYSICS_SHOW_DRAG_SELECTION, "show selection box around the entity selected for dragging" },
	{ 0, NULL }
};

IMPLEMENT_DYNAMIC(DialogAFView, CDialog)

/*
================
DialogAFView::DialogAFView
================
*/
DialogAFView::DialogAFView(CWnd* pParent /*=NULL*/)
	: CDialog(DialogAFView::IDD, pParent)

{
	m_showBodies = cvarSystem->GetCVarBool( "af_showBodies" );
	m_showBodyNames = cvarSystem->GetCVarBool( "af_showBodyNames" );
	m_showMass = cvarSystem->GetCVarBool( "af_showMass" );
	m_showTotalMass = cvarSystem->GetCVarBool( "af_showTotalMass" );
	m_showInertia = cvarSystem->GetCVarBool( "af_showInertia" );
	m_showVelocity = cvarSystem->GetCVarBool( "af_showVelocity" );
	m_showConstraints = cvarSystem->GetCVarBool( "af_showConstraints" );
	m_showConstraintNames = cvarSystem->GetCVarBool( "af_showConstraintNames" );
	m_showPrimaryOnly = cvarSystem->GetCVarBool( "af_showPrimaryOnly" );
	m_showLimits = cvarSystem->GetCVarBool( "af_showLimits" );
	m_showConstrainedBodies = cvarSystem->GetCVarBool( "af_showConstrainedBodies" );
	m_showTrees = cvarSystem->GetCVarBool( "af_showTrees" );
	m_showSkeleton = cvarSystem->GetCVarInteger( "af_showSkel" ) == 1;
	m_showSkeletonOnly = cvarSystem->GetCVarInteger( "af_showSkel" ) == 2;
	m_debugLineDepthTest = cvarSystem->GetCVarBool( "r_debugLineDepthTest" );
	m_debugLineUseArrows = cvarSystem->GetCVarInteger( "r_debugArrowStep" ) != 0;
	m_noFriction = cvarSystem->GetCVarBool( "af_skipFriction" );
	m_noLimits = cvarSystem->GetCVarBool( "af_skipLimits" );
	m_gravity = cvarSystem->GetCVarFloat( "g_gravity" );
	m_noGravity = ( m_gravity == 0.0f );
	m_noSelfCollision = cvarSystem->GetCVarBool( "af_skipSelfCollision" );
	m_showTimings = cvarSystem->GetCVarBool( "af_showTimings" );
	m_dragEntity = cvarSystem->GetCVarBool( "g_dragEntity" );
	m_dragShowSelection = cvarSystem->GetCVarBool( "g_dragShowSelection" );

	Create( IDD_DIALOG_AF_VIEW, pParent );
	EnableToolTips( TRUE );
}

/*
================
DialogAFView::~DialogAFView
================
*/
DialogAFView::~DialogAFView() {
}

/*
================
DialogAFView::DoDataExchange
================
*/
void DialogAFView::DoDataExchange(CDataExchange* pDX) {
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DialogAFView)
	DDX_Check(pDX, IDC_CHECK_VIEW_BODIES, m_showBodies);
	DDX_Check(pDX, IDC_CHECK_VIEW_BODYNAMES, m_showBodyNames);
	DDX_Check(pDX, IDC_CHECK_VIEW_BODYMASS, m_showMass);
	DDX_Check(pDX, IDC_CHECK_VIEW_TOTALMASS, m_showTotalMass);
	DDX_Check(pDX, IDC_CHECK_VIEW_INERTIATENSOR, m_showInertia);
	DDX_Check(pDX, IDC_CHECK_VIEW_VELOCITY, m_showVelocity);
	DDX_Check(pDX, IDC_CHECK_VIEW_CONSTRAINTS, m_showConstraints);
	DDX_Check(pDX, IDC_CHECK_VIEW_CONSTRAINTNAMES, m_showConstraintNames);
	DDX_Check(pDX, IDC_CHECK_VIEW_PRIMARYONLY, m_showPrimaryOnly);
	DDX_Check(pDX, IDC_CHECK_VIEW_LIMITS, m_showLimits);
	DDX_Check(pDX, IDC_CHECK_VIEW_CONSTRAINEDBODIES, m_showConstrainedBodies);
	DDX_Check(pDX, IDC_CHECK_VIEW_TREES, m_showTrees);
	DDX_Check(pDX, IDC_CHECK_MD5_SKELETON, m_showSkeleton);
	DDX_Check(pDX, IDC_CHECK_MD5_SKELETONONLY, m_showSkeletonOnly);
	DDX_Check(pDX, IDC_CHECK_LINES_DEPTHTEST, m_debugLineDepthTest);
	DDX_Check(pDX, IDC_CHECK_LINES_USEARROWS, m_debugLineUseArrows);
	DDX_Check(pDX, IDC_CHECK_PHYSICS_NOFRICTION, m_noFriction);
	DDX_Check(pDX, IDC_CHECK_PHYSICS_NOLIMITS, m_noLimits);
	DDX_Check(pDX, IDC_CHECK_PHYSICS_NOGRAVITY, m_noGravity);
	DDX_Check(pDX, IDC_CHECK_PHYSICS_NOSELFCOLLISION, m_noSelfCollision);
	DDX_Check(pDX, IDC_CHECK_PHYSICS_TIMING, m_showTimings);
	DDX_Check(pDX, IDC_CHECK_PHYSICS_DRAG_ENTITIES, m_dragEntity);
	DDX_Check(pDX, IDC_CHECK_PHYSICS_SHOW_DRAG_SELECTION, m_dragShowSelection);
	//}}AFX_DATA_MAP
}

/*
================
DialogAFView::OnToolHitTest
================
*/
INT_PTR DialogAFView::OnToolHitTest( CPoint point, TOOLINFO* pTI ) const {
	CDialog::OnToolHitTest( point, pTI );
	return DefaultOnToolHitTest( toolTips, this, point, pTI );
}

BEGIN_MESSAGE_MAP(DialogAFView, CDialog)
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
	ON_BN_CLICKED(IDC_CHECK_VIEW_BODIES, OnBnClickedCheckViewBodies)
	ON_BN_CLICKED(IDC_CHECK_VIEW_BODYNAMES, OnBnClickedCheckViewBodynames)
	ON_BN_CLICKED(IDC_CHECK_VIEW_BODYMASS, OnBnClickedCheckViewBodyMass)
	ON_BN_CLICKED(IDC_CHECK_VIEW_TOTALMASS, OnBnClickedCheckViewTotalMass)
	ON_BN_CLICKED(IDC_CHECK_VIEW_INERTIATENSOR, OnBnClickedCheckViewInertiatensor)
	ON_BN_CLICKED(IDC_CHECK_VIEW_VELOCITY, OnBnClickedCheckViewVelocity)
	ON_BN_CLICKED(IDC_CHECK_VIEW_CONSTRAINTS, OnBnClickedCheckViewConstraints)
	ON_BN_CLICKED(IDC_CHECK_VIEW_CONSTRAINTNAMES, OnBnClickedCheckViewConstraintnames)
	ON_BN_CLICKED(IDC_CHECK_VIEW_PRIMARYONLY, OnBnClickedCheckViewPrimaryonly)
	ON_BN_CLICKED(IDC_CHECK_VIEW_LIMITS, OnBnClickedCheckViewLimits)
	ON_BN_CLICKED(IDC_CHECK_VIEW_CONSTRAINEDBODIES, OnBnClickedCheckViewConstrainedBodies)
	ON_BN_CLICKED(IDC_CHECK_VIEW_TREES, OnBnClickedCheckViewTrees)
	ON_BN_CLICKED(IDC_CHECK_MD5_SKELETON, OnBnClickedCheckMd5Skeleton)
	ON_BN_CLICKED(IDC_CHECK_MD5_SKELETONONLY, OnBnClickedCheckMd5Skeletononly)
	ON_BN_CLICKED(IDC_CHECK_LINES_DEPTHTEST, OnBnClickedCheckLinesDepthtest)
	ON_BN_CLICKED(IDC_CHECK_LINES_USEARROWS, OnBnClickedCheckLinesUsearrows)
	ON_BN_CLICKED(IDC_CHECK_PHYSICS_NOFRICTION, OnBnClickedCheckPhysicsNofriction)
	ON_BN_CLICKED(IDC_CHECK_PHYSICS_NOLIMITS, OnBnClickedCheckPhysicsNolimits)
	ON_BN_CLICKED(IDC_CHECK_PHYSICS_NOGRAVITY, OnBnClickedCheckPhysicsNogravity)
	ON_BN_CLICKED(IDC_CHECK_PHYSICS_NOSELFCOLLISION, OnBnClickedCheckPhysicsNoselfcollision)
	ON_BN_CLICKED(IDC_CHECK_PHYSICS_TIMING, OnBnClickedCheckPhysicsTiming)
	ON_BN_CLICKED(IDC_CHECK_PHYSICS_DRAG_ENTITIES, OnBnClickedCheckPhysicsDragEntities)
	ON_BN_CLICKED(IDC_CHECK_PHYSICS_SHOW_DRAG_SELECTION, OnBnClickedCheckPhysicsShowDragSelection)
END_MESSAGE_MAP()


// DialogAFView message handlers

BOOL DialogAFView::OnToolTipNotify( UINT id, NMHDR *pNMHDR, LRESULT *pResult ) {
	return DefaultOnToolTipNotify( toolTips, id, pNMHDR, pResult );
}

void DialogAFView::OnBnClickedCheckViewBodies() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showBodies", m_showBodies != FALSE );
}

void DialogAFView::OnBnClickedCheckViewBodynames() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showBodyNames", m_showBodyNames != FALSE );
}

void DialogAFView::OnBnClickedCheckViewBodyMass() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showMass", m_showMass != FALSE );
}

void DialogAFView::OnBnClickedCheckViewTotalMass() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showTotalMass", m_showTotalMass != FALSE );
}

void DialogAFView::OnBnClickedCheckViewInertiatensor() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showInertia", m_showInertia != FALSE );
}

void DialogAFView::OnBnClickedCheckViewVelocity() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showVelocity", m_showVelocity != FALSE );
}

void DialogAFView::OnBnClickedCheckViewConstraints() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showConstraints", m_showConstraints != FALSE );
}

void DialogAFView::OnBnClickedCheckViewConstraintnames() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showConstraintNames", m_showConstraintNames != FALSE );
}

void DialogAFView::OnBnClickedCheckViewPrimaryonly() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showPrimaryOnly", m_showPrimaryOnly != FALSE );
}

void DialogAFView::OnBnClickedCheckViewLimits() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showLimits", m_showLimits != FALSE );
}

void DialogAFView::OnBnClickedCheckViewConstrainedBodies() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showConstrainedBodies", m_showConstrainedBodies != FALSE );
}

void DialogAFView::OnBnClickedCheckViewTrees() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showTrees", m_showTrees != FALSE );
}

void DialogAFView::OnBnClickedCheckMd5Skeleton() {
	UpdateData(TRUE);
	if ( !m_showSkeletonOnly ) {
		if ( m_showSkeleton ) {
			cvarSystem->SetCVarInteger( "r_showSkel", 1 );
		} else {
			cvarSystem->SetCVarInteger( "r_showSkel", 0 );
		}
	}
}

void DialogAFView::OnBnClickedCheckMd5Skeletononly() {
	UpdateData(TRUE);
	if ( m_showSkeletonOnly ) {
		cvarSystem->SetCVarInteger( "r_showSkel", 2 );
	} else {
		if ( m_showSkeleton ) {
			cvarSystem->SetCVarInteger( "r_showSkel", 1 );
		} else {
			cvarSystem->SetCVarInteger( "r_showSkel", 0 );
		}
	}
}

void DialogAFView::OnBnClickedCheckLinesDepthtest() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "r_debugLineDepthTest", m_debugLineDepthTest != FALSE );
}

void DialogAFView::OnBnClickedCheckLinesUsearrows() {
	UpdateData(TRUE);
	if ( m_debugLineUseArrows ) {
		cvarSystem->SetCVarInteger( "r_debugArrowStep", 120 );
	} else {
		cvarSystem->SetCVarInteger( "r_debugArrowStep", 0 );
	}
}

void DialogAFView::OnBnClickedCheckPhysicsNofriction() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_skipFriction", m_noFriction != FALSE );
}

void DialogAFView::OnBnClickedCheckPhysicsNolimits() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_skipLimits", m_noLimits != FALSE );
}

void DialogAFView::OnBnClickedCheckPhysicsNogravity() {
	UpdateData(TRUE);
	cvarSystem->SetCVarFloat( "g_gravity", m_noGravity ? 0.0f : m_gravity );
}

void DialogAFView::OnBnClickedCheckPhysicsNoselfcollision() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_skipSelfCollision", m_noSelfCollision != FALSE );
}

void DialogAFView::OnBnClickedCheckPhysicsTiming() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "af_showTimings", m_showTimings != FALSE );
}

void DialogAFView::OnBnClickedCheckPhysicsDragEntities() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "g_dragEntity", m_dragEntity != FALSE );
}

void DialogAFView::OnBnClickedCheckPhysicsShowDragSelection() {
	UpdateData(TRUE);
	cvarSystem->SetCVarBool( "g_dragShowSelection", m_dragShowSelection != FALSE );
}