1/******************************************************************************
2	NintendoWare for CTR Maya Plugin
3
4	File:         NW4C_SetBillboard.mel
5	Description:  set billboard
6	Date:         2010/04/26
7
8	Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
9******************************************************************************/
10
11// UpdateWindow DoSearch
12
13/******************************************************************************
14	is scene anim object
15******************************************************************************/
16proc int IsSceneAnimObject(string $node)
17{
18	string $type = nodeType($node);
19	string $childs[] = `listRelatives -pa -s $node`;
20	if (size(`ls -cameras -lights -typ environmentFog $childs`) > 0 ||
21		$type == "lookAt")
22	{
23		return true;
24	}
25	return false;
26}
27
28/******************************************************************************
29	get selected transform (except camera & light)
30
31		return node size
32******************************************************************************/
33proc int GetSelectedXform(string $xforms[])
34{
35	clear($xforms);
36
37	string $nodes[] = `ls -sl -typ transform`;
38	for ($node in $nodes)
39	{
40		if (!IsSceneAnimObject($node))
41		{
42			$xforms[size($xforms)] = $node;
43		}
44	}
45
46	return size($xforms);
47}
48
49/******************************************************************************
50	billboard
51******************************************************************************/
52global proc int nw4cSetBillboard_Get_Billboard(string $node)
53{
54	return (`attributeQuery -n $node -ex "nw4cBillboard"`) ?
55		`getAttr ($node + ".nw4cBillboard")` : 0;
56}
57
58global proc nw4cSetBillboard_Add_Billboard(string $node)
59{
60	if (!`attributeQuery -n $node -ex "nw4cBillboard"`)
61	{
62		addAttr -ln "nw4cBillboard" -at "enum"
63			-en ("Off=0:World=1:World Viewpoint=2:"
64				+ "Screen=3:Screen Viewpoint=4:"
65				+ "Y Axial=5:Y Axial Viewpoint=6")
66			-dv 0 -h 1 $node;
67	}
68}
69
70global proc nw4cSetBillboard_Set_Billboard(string $node, int $val)
71{
72	nw4cSetBillboard_Add_Billboard($node);
73	setAttr ($node + ".nw4cBillboard") $val;
74}
75
76proc SetJob_Billboard(string $node)
77{
78	if (!`attributeQuery -n $node -ex "nw4cBillboard"`)
79	{
80		return;
81	}
82	scriptJob -p nw4cSetBillboard_Billboard -rp -ac ($node + ".nw4cBillboard")
83		("optionMenuGrp -e -sl (`nw4cSetBillboard_Get_Billboard "
84			+ $node + "` + 1) nw4cSetBillboard_Billboard");
85}
86
87global proc nw4cSetBillboard_BillboardCB(string $mainNode)
88{
89	string $xforms[];
90	GetSelectedXform($xforms);
91	int $val = `optionMenuGrp -q -sl nw4cSetBillboard_Billboard` - 1;
92	for ($node in $xforms)
93	{
94		nw4cSetBillboard_Set_Billboard($node, $val);
95	}
96	SetJob_Billboard($mainNode);
97}
98
99/******************************************************************************
100	update window
101******************************************************************************/
102global proc nw4cSetBillboard_UpdateWindow()
103{
104	//-----------------------------------------------------------------------------
105	// get selection
106	string $xforms[];
107	GetSelectedXform($xforms);
108	int $enableFlag = (size($xforms) > 0);
109
110	//-----------------------------------------------------------------------------
111	// set node name
112	string $nodesName;
113	if ($enableFlag)
114	{
115		$nodesName = $xforms[0];
116		int $nodeSize = size($xforms);
117		for ($inode = 1; $inode < $nodeSize; ++$inode)
118		{
119			if ($inode == 3)
120			{
121				$nodesName += ", ... (" + $nodeSize + ")";
122				break;
123			}
124			$nodesName += ",  " + $xforms[$inode];
125		}
126	}
127	else
128	{
129		$nodesName = "(None)";
130	}
131	text -e -l $nodesName nw4cSetBillboard_NodeName;
132
133	//-----------------------------------------------------------------------------
134	// set current attr & change command
135	if ($enableFlag)
136	{
137		string $node = $xforms[0];
138
139		optionMenuGrp -e -sl (`nw4cSetBillboard_Get_Billboard $node` + 1)
140			-cc ("nw4cSetBillboard_BillboardCB " + $node)
141			nw4cSetBillboard_Billboard;
142
143		SetJob_Billboard($node);
144	}
145
146	//-----------------------------------------------------------------------------
147	// set enable state
148	control -e -en $enableFlag nw4cSetBillboard_Billboard;
149}
150
151/******************************************************************************
152	search check CB
153******************************************************************************/
154global proc nw4cSetBillboard_SearchCheckCB()
155{
156	control -e -en
157		(`checkBoxGrp -q -v1 nw4cSetBillboard_SearchCheck1` ||
158		 `checkBoxGrp -q -v2 nw4cSetBillboard_SearchCheck1` ||
159		 `checkBoxGrp -q -v1 nw4cSetBillboard_SearchCheck2` ||
160		 `checkBoxGrp -q -v2 nw4cSetBillboard_SearchCheck2` ||
161		 `checkBoxGrp -q -v1 nw4cSetBillboard_SearchCheck3` ||
162		 `checkBoxGrp -q -v2 nw4cSetBillboard_SearchCheck3`)
163		nw4cSetBillboard_SearchBtn;
164}
165
166/******************************************************************************
167	do search
168******************************************************************************/
169global proc nw4cSetBillboard_DoSearch()
170{
171	int $searchVal1 = `checkBoxGrp -q -v1 nw4cSetBillboard_SearchCheck1` ?
172		1 : -1;
173	int $searchVal2 = `checkBoxGrp -q -v2 nw4cSetBillboard_SearchCheck1` ?
174		2 : -1;
175	int $searchVal3 = `checkBoxGrp -q -v1 nw4cSetBillboard_SearchCheck2` ?
176		3 : -1;
177	int $searchVal4 = `checkBoxGrp -q -v2 nw4cSetBillboard_SearchCheck2` ?
178		4 : -1;
179	int $searchVal5 = `checkBoxGrp -q -v1 nw4cSetBillboard_SearchCheck3` ?
180		5 : -1;
181	int $searchVal6 = `checkBoxGrp -q -v2 nw4cSetBillboard_SearchCheck3` ?
182		6 : -1;
183
184	int $nodeCount = 0;
185	select -cl;
186	string $xforms[] = `ls -typ transform`;
187	for ($node in $xforms)
188	{
189		if (IsSceneAnimObject($node))
190		{
191			continue;
192		}
193		int $val = nw4cSetBillboard_Get_Billboard($node);
194		if ($val == $searchVal1 ||
195			$val == $searchVal2 ||
196			$val == $searchVal3 ||
197			$val == $searchVal4 ||
198			$val == $searchVal5 ||
199			$val == $searchVal6)
200		{
201			select -add $node;
202			++$nodeCount;
203		}
204	}
205
206	if ($nodeCount == 0)
207	{
208		print "Not found\n";
209	}
210	else
211	{
212		string $msg = "Found: " + $nodeCount + " transform node";
213		if ($nodeCount >= 2)
214		{
215			$msg += "s";
216		}
217		print ($msg + "\n");
218	}
219}
220
221/******************************************************************************
222	main
223******************************************************************************/
224global proc NW4C_SetBillboard()
225{
226	//-----------------------------------------------------------------------------
227	// create window
228	int $wd = 400;
229	int $ht = 340;
230	if (!`window -exists nw4cSetBillboard_Win`)
231	{
232		window -t "NW4C Set Billboard" -wh $wd $ht -mxb 0 -mb 1
233			nw4cSetBillboard_Win;
234		menu -l "Help";
235		menuItem -l ("Help on " + `window -q -t nw4cSetBillboard_Win` + "...")
236			-c "NW4C_ShowHelp \"html/NW4C_SetBillboard.html\" \"\"";
237
238		columnLayout -adj 1 -cat "both" 4 -cal "center" -rs 4;
239
240		//-----------------------------------------------------------------------------
241		// node name
242		frameLayout -l "Selected Transform Node" -cll 0 -cl 0 -bv 1 -bs "etchedIn";
243			columnLayout -adj 1 -cal "center" -rs 8;
244
245			text -l "" nw4cSetBillboard_NodeName;
246
247			setParent ..; // columnLayout
248		setParent ..; // formLayout
249
250		//-----------------------------------------------------------------------------
251		// set
252		frameLayout -l "Set" -cll 0 -cl 0 -bv 1 -bs "etchedIn";
253			columnLayout -adj 1 -rs 8;
254
255			optionMenuGrp -l "Billboard"
256				-cw 1 130 -rat 1 "both" 4 -cal 1 "right"
257				nw4cSetBillboard_Billboard;
258				menuItem -l "Off";
259				menuItem -l "World";
260				menuItem -l "World Viewpoint";
261				menuItem -l "Screen";
262				menuItem -l "Screen Viewpoint";
263				menuItem -l "Y Axial";
264				menuItem -l "Y Axial Viewpoint";
265
266			setParent ..; // columnLayout
267		setParent ..; // formLayout
268
269		//-----------------------------------------------------------------------------
270		// search
271		frameLayout -l "Search" -cll 0 -cl 0 -bv 1 -bs "etchedIn";
272			columnLayout -adj 1 -rs 8;
273
274			checkBoxGrp -l "" -ncb 2 -cw3 80 110 110
275				-la2 "World" "World Viewpoint"
276				-cc "nw4cSetBillboard_SearchCheckCB"
277				nw4cSetBillboard_SearchCheck1;
278			checkBoxGrp -l "" -ncb 2 -cw3 80 110 110
279				-la2 "Screen" "Screen Viewpoint"
280				-cc "nw4cSetBillboard_SearchCheckCB"
281				nw4cSetBillboard_SearchCheck2;
282			checkBoxGrp -l "" -ncb 2 -cw3 80 110 110
283				-la2 "Y Axial" "Y Axial Viewpoint"
284				-cc "nw4cSetBillboard_SearchCheckCB"
285				nw4cSetBillboard_SearchCheck3;
286			rowColumnLayout -nc 2 -cw 1 220 -cw 2 150;
287				text -l ""; // dummy
288				button -l "Search"
289					-c "nw4cSetBillboard_DoSearch"
290					nw4cSetBillboard_SearchBtn;
291			setParent ..; // rowColumnLayout
292
293			setParent ..; // columnLayout
294		setParent ..; // formLayout
295
296		//-----------------------------------------------------------------------------
297		// close button
298		string $closeCmd = "deleteUI nw4cSetBillboard_Win";
299		string $form = `formLayout -nd 100`;
300			string $closeBtn       = `button -h 26 -l "Close" -c $closeCmd`;
301			formLayout -e
302				-af $closeBtn "top" 0
303				-af $closeBtn "left" 0
304				-af $closeBtn "bottom" 0
305				-af $closeBtn "right" 0
306				$form;
307		setParent ..; // formLayout
308
309		setParent ..; // columnLayout
310
311		setFocus $closeBtn;
312
313		//-----------------------------------------------------------------------------
314		// set selection change job
315		scriptJob -p nw4cSetBillboard_Win
316			-e "SelectionChanged" "nw4cSetBillboard_UpdateWindow";
317	}
318	if (`window -q -w nw4cSetBillboard_Win` < $wd)
319	{
320		window -e -w $wd nw4cSetBillboard_Win;
321	}
322	if (`window -q -h nw4cSetBillboard_Win` < $ht)
323	{
324		window -e -h $ht nw4cSetBillboard_Win;
325	}
326	//window -e -wh $wd $ht nw4cSetBillboard_Win;
327
328	//-----------------------------------------------------------------------------
329	// update window
330	nw4cSetBillboard_UpdateWindow;
331	nw4cSetBillboard_SearchCheckCB;
332
333	//-----------------------------------------------------------------------------
334	// show window
335	showWindow nw4cSetBillboard_Win;
336}
337