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