Copyright (C) 2001  Sony Computer Entertainment Inc.

$B%Y!<%7%C%/%5%s%W%k(B basic3d VU0$BHG(B
================================

<$B%5%s%W%k$N2r@b(B>

basic3d Core$BHG$K$*$$$F9TNs1i;;!"F);kJQ49Ey$r9T$&?t3X4X?t!"(B3D$B%0%i%U%#%C%/(B
$B%9$KI,MW$J?t3X$N4pAC$K$D$$$FM}2r$r?<$a$?8e$K!"9bB.2=$NBh0l%9%F%C%W$H$7$F(B
VU0$B%^%/%mL?Na$X$N=q$-49$(Nc$r<($7$^$9!#(BVU0$B%^%/%mL?Na$O!"%3%W%m%;%C%5L?Na(B
$B$G$9$N$G(BCPU$B$NL?Na$H$7$F%"%;%s%V%i7A<0$G$N5-=R$,2DG=$G$9!#$^$?!"F1;~$K:GBg(B
$B#4$D$N%G!<%?$r=hM}$9$k$3$H$,$G$-$k$?$a!"9TNs1i;;!"%Y%/%H%k1i;;$H$N?FOB@-(B
$B$,9b$/$J$C$F$$$^$9!#$3$N(Bbasic3d VU0$BHG$O!"(BCore$BHG$N9TNs1i;;Ey$r(BVU0$B%^%/%mL?(B
$BNa$GCV$-49$($kNc$r<($9$3$H$G!"(BVU0$B%^%/%mL?Na$NMxMQK!$K$D$$$F$NM}2r$r?<$a$k(B
$B$3$H$rL\E*$H$7$F$$$^$9!#$=$7$F!"$5$i$J$k9bB.2=$N$?$a$K(BVU0$B%^%$%/%mL?Na$"$k(B
$B$$$O(BVU1$B%^%$%/%mL?Na$rMxMQ$9$k:]$N66EO$7$H$J$k$3$H$r4|BT$7$F$$$^$9!#(B

<$B%U%!%$%k(B>
	main.c		$B%a%$%s%W%m%0%i%`(B
	vu0.c		$B:BI8JQ49!"F);kJQ49Ey$N9TNs1i;;4X?t(B
	cube.s		$B%*%V%8%'%/%H%G!<%?(B($BN)J}BN(B)
	sjoy.c		$B%3%s%H%m!<%iFI$_9~$_4X?t(B
	sjoy.h		$B%3%s%H%m!<%iFI$_9~$_4X?t$N%X%C%@%U%!%$%k(B
	torus1.s	$B%*%V%8%'%/%H%G!<%?(B($B%H!<%i%9(B $B%G!<%?J,3d(B)
	torus.s		$B%*%V%8%'%/%H%G!<%?(B($B%H!<%i%9(B $B%G!<%?J,3d(B)
	flower.dsm	$B%F%/%9%A%c%G!<%?(B

<$B5/F0J}K!(B>
	% make		$B!'%3%s%Q%$%k(B
	% make run	$B!'<B9T(B

<$B%3%s%H%m!<%i$NA`:nJ}K!(B>
	$B","-(B($BJ}8~%-!<(B) : x$B<42sE>(B($B%*%V%8%'%/%H(B)
	$B"+"*(B	$B!!!!!!(B : y$B<42sE>(B($B%*%V%8%'%/%H(B)
	L1L2$B%\%?%s!!!!(B : z$B<42sE>(B($B%*%V%8%'%/%H(B)

	$B"$!_%\%?%s!!!!(B : x$B<42sE>(B($B;kE@(B)
	$B""!{%\%?%s!!!!(B : y$B<42sE>(B($B;kE@(B)
	R1R2$B%\%?%s!!!!(B : z$B<40\F0(B($B;kE@(B)

	SELECT$B%\%?%s!!(B : $B%*%V%8%'%/%H$N@ZBX$((B(CUBE/TORUS)

<$B;EMM(B>
	$B%F%/%9%A%cIU$-(BTriangle Strip$B$N%-%e!<%V$rI=<($9$k!#(B
	$B%F%/%9%A%cIU$-(BTriangle$B$N%H!<%i%9$rI=<($9$k!#(B

	Z$B%P%C%U%!$O(B24bit
	$B8w8;$O(B3$B$D(B
	$B%F%/%9%A%c$O(B32bit

<$B=hM}35N,(B>
	1. $B%F%/%9%A%c$r%m!<%I(B
	2. $B%Q%C%I%*!<%W%s(B
	3. $BF);kJQ499TNs!&8w8;7W;;9TNs$J$I$r@_Dj(B
	4. $BF);kJQ49!&8w8;7W;;$r9T$$!"(BGS$B$KEO$9%Q%1%C%H$r@8@.(B
	6. GS$B$X$N(BDMA kick
	7. 2$B$KLa$k(B


$B%G!<%?%U%m!<(B
--------------------------------------------------------------------------

<$B=i4|2=2aDx(B>
$B%a%$%s(BRAM                          GS$BFbB"(BRAM(4M)
  $B%F%/%9%A%c%G!<%?(B ----------------> $B%F%/%9%A%c%G!<%?E83+(B
  $B%*%V%8%'%/%H%G!<%?E83+(B
  $BF);kJQ499TNsEy$NE83+(B

<$B<B9T=hM}2aDx(B>
$B%a%$%s(BRAM
  $B%*%V%8%'%/%H%G!<%?(B --------------------> GS$BE>AwMQ%Q%1%C%H%G!<%?E83+(B
                     $BF);kJQ49!"8w8;7W;;(B    ($B%W%j%_%F%#%V%G!<%?(B
                     (VU0$B%8%*%a%H%j(B)        (STQ, RGBA, XYZF)$BG[Ns(B)
                                                    |
                                                    |
GS$BFbB"(BRAM(4M) <-------------------------------------+
  $B%U%l!<%`!u(BZ$B%P%C%U%!=q$-9~$_(B         DMA$BE>Aw(B(DMAtag,GIFtag$BIU2C(B)
  ($B%l%s%@%j%s%0(B)


$B%W%m%0%i%`$N@bL@(B($B>\:Y(B)
--------------------------------------------------------------------------

<$BJQ?t!&9=B$BN!&4X?t(B>$B!!(B(mathfunc.c$B$N4X?t$r=|$/(B)

	SampleCubeDataHead[]   :$B%*%V%8%'%/%H%G!<%?(B($BN)J}BN(B)$B$X$N%]%$%s%?(B
	SampleTorus1DataHead[] :$B%*%V%8%'%/%H%G!<%?(B($B%H!<%i%9(B)$B$X$N%]%$%s%?(B
	My_texture1[]	       :$B%F%/%9%A%c%G!<%?$X$N%]%$%s%?(B

	TexEnv	  :ps2_gs_texenv$B9=B$BN$rE>Aw$9$k$?$a$N%Q%1%C%H:n@.$N9=B$BN(B
	QWdata	  :128bit$B%G!<%?$r07$$0W$/$9$k$?$a$N6&MQBN(B
	GifPacket :Gif(GS)$B$KE>Aw$9$k%Q%1%C%H$r@8@.$9$k$?$a$N9=B$BN(B
	ObjData	  :$B%a%b%j$KE83+$7$?%*%V%8%'%/%H%G!<%?$r4IM}$9$k$?$a$N9=B$BN(B

	camera_p   :$B%+%a%i0LCV(B
	camera_zd  :$B%+%a%i$N;k@~J}8~%Y%/%H%k(B
	camera_yd  :$B%+%a%i$N2<J}8~%Y%/%H%k(B
	camera_rot :$B%+%a%i$N2sE>MQ%Y%/%H%k(B

	light0 :$B%i%$%H(B0
	light1 :$B%i%$%H(B1
	light2 :$B%i%$%H(B2
	color0 :$B%i%$%H(B0$B$N?'(B
	color1 :$B%i%$%H(B1$B$N?'(B
	color2 :$B%i%$%H(B2$B$N?'(B

	ambient :$B4D6-8w(B

	obj_trans :$B%*%V%8%'%/%H$N0\F0(B
	obj_rot	  :$B%*%V%8%'%/%H$N2sE>(B

	local_world :$B%*%V%8%'%/%H%m!<%+%k:BI8$r(Bworld$B:BI87O$KJQ49$9$k(B
			 $B9TNs(B
	world_view   :world$B:BI87O$r;kE@:BI87O$KJQ49$9$k9TNs(B
	view_screen  :$B;kE@:BI87O$r%9%/%j!<%s:BI87O$KJQ49$9$k9TNs(B
	local_screen :$B%m!<%+%k:BI8$r%9%/%j!<%s:BI8$KJQ49$9$k9TNs(B
		      ($B>e#39TNs$N@Q(B)

	normal_light :$B%o!<%k%I:BI87O$K$*$1$kD:E@$NK!@~%Y%/%H%k$H%i%$%H$N(B
		      $BJ}8~%Y%/%H%k$NFb@Q$r<h$k$?$a$N9TNs(B($B%i%$%H$NJ}8~%Y(B
		      $B%/%H%k$,%;%C%H$5$l$k(B)
	local_light :normal_light$B9TNs$K(Blocal_world$B9TNs$r3]$1$F!"%m!<%+%k(B
		     $B:BI87O$K$*$1$kD:E@$NK!@~%Y%/%H%k$H%i%$%H$NJ}8~%Y%/(B
		     $B%H%k$NFb@Q$r<h$l$k$h$&$K$9$k9TNs(B
	light_color :local_light$B9TNs$HD:E@$NK!@~%Y%/%H%k$N@Q$K$h$j@8@.$5(B
		     $B$l$?Fb@Q%Y%/%H%k$K!"3F%i%$%H$N?'(B(3$B?'!\4D6-8w(B)$B$r3]$1(B
		     $B$FOB$r$H$k9TNs(B
	local_color :local_light$B$H(Blight_color$B$N@Q$r<h$C$?9TNs(B($BFb@Q%Y%/%H(B
		     $B%k$r@8@.$7$?8e$K!"3FFb@QCM$r(B0.0$B!A(B1.0$B$NHO0O$G%/%j%C(B
		     $B%T%s%0$9$kI,MW$,$"$k$?$a!"<B:]$O;H$($J$$(B)
	work	    :$B0l;~E*$J:n6H$N$?$a$N9TNs(B

	ps2_gs_dbuff g_db :$B%@%V%k%P%C%U%!$r<BAu$9$k$?$a$N9=B$BN(B
	ps2_image g_img   :$B%F%/%9%A%c$r(BGS$B%m!<%+%k%a%b%j$KE>Aw$9$k$N$KMQ$$(B
			   $B$k9=B$BN(B
	TexEnv texenv	  :$B%F%/%9%A%c%G!<%?$rE>Aw$9$k$?$a$N%Q%1%C%H$r:n(B
			   $B@.$9$k9=B$BN(B

	LoadObj(ObjData *o, __u32 *Head)
			:$B%a%$%s%a%b%j$KE83+$7$?%*%V%8%'%/%H%G!<%?$r(B
			 ObjData$B9=B$BN$KEPO?$7!"A`:n$9$k$?$a$N4X?t(B

	ReleaseObj(ObjData *o)
			:$BEPO?$7$?%*%V%8%'%/%H%G!<%?$r3+J|$9$k$?$a$N4X?t(B

	MakePacket(ObjData *obj, int num)
			:$B%*%V%8%'%/%H%G!<%?$KBP$7$FF);kJQ49!&8w8;7W;;$J(B
			 $B$I$r9T$$!"(BGS$B$KE>Aw$9$k%Q%1%C%H$r@8@.$9$k4X?t(B

<main$B4X?tFb$NJQ?t(B>
	frame :$B%@%V%k%P%C%U%!$G%U%j%C%W$r9T$&$?$a$N%H%0%k%9%$%C%A(B
	delta :$B2sE>3Q$r@_Dj$9$k$?$a$NJQ?t(B
	obj   :$B%*%V%8%'%/%H$rEPO?$9$k$?$a$NJQ?t(B


$B%W%m%0%i%`2r@b!J=i4|2=ItJ,!K(B
--------------------------------------------------------------------------

$B!&%*%V%8%'%/%H%G!<%?$NFI$_9~$_(B
    LoadObj(&obj[0], SampleCubeDataHead);
    LoadObj(&obj[1], SampleTorus1DataHead);

	$B%*%V%8%'%/%H%G!<%?$r(BSampleCubeDataHead$B!"(BSampleTorus1DataHead$B$+(B
	$B$iFI$_9~$_$^$9!#(B

$B!&%G%P%$%9$N=i4|2=(B
    ps2_gs_open();		// GS $B$N%*!<%W%s!#(B
    ps2_gs_vc_graphicsmode();	// $B2>A[%3%s%=!<%k$r%0%i%U%#%C%/%b!<%I$K!#(B
    ps2_gs_reset(0, g_inter, g_out_mode, g_ff_mode, g_resolution,
		 g_refresh_rate); // GS$B$r=i4|2=$9$k(B

	$B%W%m%0%i%`$N@hF,$G!";HMQ$9$k%G%P%$%9$N=i4|2=$r9T$$$^$9!#(B

$B!&IA2h4D6-$N@_Dj(B
    ps2_gs_set_dbuff(&g_db, g_psm, gp->width, gp->height,
		     (g_zbits == 0) ? 0 : PS2_GS_ZGREATER,
		      g_zpsm, 1);
    *(__u64 *)&g_db.clear0.rgbaq = PS2_GS_SETREG_RGBAQ(0x10, 0x10, 0x10, 0x80,
						       0x3f800000);
    *(__u64 *)&g_db.clear1.rgbaq = PS2_GS_SETREG_RGBAQ(0x10, 0x10, 0x10, 0x80,
						       0x3f800000);

	GS$B$NIA2h4D6-$N@_Dj$r9T$$$^$9!#(B

$B!&%F%/%9%A%cMQ$N%$%a!<%8E>Aw(B
    load_teximages(void);
	| ps2_gs_set_image(&g_img, g_textop64, IMAGE_SIZE / 64, PS2_GS_PSMCT32,
	| 		 0, 0, IMAGE_SIZE, IMAGE_SIZE, My_texture1);
	| ps2_gs_load_image(&g_img);

	$B%F%/%9%A%cMQ$N%$%a!<%8$r(BGS$B%m!<%+%k%a%b$j$KE>Aw$9$k$?$a$K(B
	LoadImage$B$N>pJs$r@_Dj$7$^$9!#$=$N8e!"(Bps2_gs_load_image()$B$r<B9T(B
	$B$9$k$3$H$G!";XDj$5$l$?%$%a!<%8$,(BGS$B$N%m!<%+%k%a%b$j$KE>Aw$5$l$^(B
	$B$9!#2>A[%3%s%=!<%k$r%5%]!<%H$9$k$?$a!"$=$N@Z$jBX$($N%?%$%_%s%0(B
	$B$G$b%m!<%I$7D>$7$^$9!#(B

$B!&%F%/%9%A%c$N4D6-@_DjMQ%Q%1%C%H$N@8@.(B
    texenv.size = ps2_gs_set_texenv(&texenv.gs_tex, 0, &g_img, 8, 8, 0, 0,
				    0, 0, 1);
    PS2_GIFTAG_CLEAR_TAG(&texenv.giftag);
    texenv.giftag.NLOOP = texenv.size;
    texenv.giftag.EOP = 1;
    texenv.giftag.PRE = 0;
    texenv.giftag.NREG = 1;
    texenv.giftag.REGS0 = PS2_GIFTAG_REGS_AD;
    *(__u64 *)&texenv.gs_tex.clamp1 = PS2_GS_SETREG_CLAMP(0, 0, 0, 0, 0, 0);

	ps2_gs_texenv()$B$rMQ$$$F!"%F%/%9%A%c4XO"$N(BGS$BHFMQ%l%8%9%?(BTEX0_1,
	TEX0_1, CLAMP_1$B$N@_Dj$r9T$&%Q%1%C%H$r:n@.$7$^$9!#(B

$B!&%F%/%9%A%c$N4D6-@_DjMQ%Q%1%C%H$NE>Aw(B
    ps2_dma_start_n(g_fd_gs, &texenv.giftag, texenv.size + 1);

	$B@8@.$5$l$?%F%/%9%A%c4D6-@_DjMQ$N%Q%1%C%H$r!"(BDMA$B$r<B9T$7$FE>Aw$7(B
	$B$^$9!#(B

$B!&%3%s%H%m!<%i$N=i4|2=(B
    sjoy_open();

	$B%3%s%H%m!<%i$r;H$&$?$a$N=i4|2=$r9T$$$^$9!#(B($BDL>o$N%8%g%$%9%F%#%C(B
	$B%/$H$7$F07$&$3$H$,$G$-$^$9(B) $B0J8e$O(Bsjoy_get_ps2_button()$B$rMQ$$$F(B
	$B$=$N>uBV$r<hF@$7$^$9!#%3%s%H%m!<%i$N%G!<%?$N99?7$O(Bsjoy_poll()$B$N(B
	$B8F$S=P$7$G9T$o$l$^$9!#(B


$B%W%m%0%i%`2r@b!J%a%$%s%k!<%WItJ,!K(B
--------------------------------------------------------------------------

$B0J2<!"%a%$%s%k!<%W$NCf$G9T$o$l$k!"%3%s%H%m!<%i$N>pJs<hF@!"%^%H%j%C%/%9(B
$B$N@8@.!"%Q%1%C%H@8@.(B($B:BI8JQ49!"F);kJQ49!"(BUV->STQ$BJQ49!"8w8;7W;;(B)$B!"%Q%1%C(B
$B%H$N@8@.$K$D$$$F@bL@$7$F$$$-$^$9!#(B

$B!&(BView-Screen$B%^%H%j%C%/%9$N@8@.(B
    ps2_vu0_view_screen_matrix(view_screen, 512.0f, 1.0f, gp->pixel_ratio,
			   gp->center_x, gp->center_y,
			   1.0f, (g_zbits == 0) ? 2 : ((1 << g_zbits) - 1),
			   1.0f, 65536.0f);

	ps2_vu0_view_screen_matrix()$B$rMQ$$$F!"(BView-Screen$B%^%H%j%C%/%9$r(B
	$B5a$a$^$9!#$3$3$G$O!";kE@$+$iEj1F%9%/!<%j%s$^$G$N5wN%$r(B512$B!"2hLL(B
	$B$N%"%9%Z%/%HHf$r(Bgp->pixel_ratio$B!"2hLL$NCf?4$r(B(gp->center_x,
	gp->center_y)$B!"(BZ$B%P%C%U%!$NCM$r;HMQ$9$k(BZ$B%P%C%U%!$GI=$9$3$H$,$G$-(B
	$B$k:GBgCM!"(BZ$B$NCM$r(B1.0$B!A(B65536.0$B$H$7$?(BView-Screen$B%^%H%j%/%9$r5a$a$F(B
	$B$$$^$9!#(B

$B!&2>A[%3%s%=!<%k$N%m%C%/(B
    ps2_gs_vc_lock();

	$B2>A[%3%s%=!<%k$r%m%C%/$7!"JL$N%"%W%j%1!<%7%g%s$K@Z$jBX$o$k$N$r6X(B
	$B;_$7$^$9!#(BGS/VPU0/VPU1$BEy$N%3%s%F%-%9%H$OA4$FJ]B8$5$l$J$$$N$G2>A[(B
	$B%3%s%=!<%k@Z$jBX$($r%5%]!<%H$9$k>l9g$O$=$N%a%s%F%J%s%9$,I,MW$G$9!#(B
		
$B!&IA2h4D6-$N@Z$jBX$((B
    ps2_gs_set_half_offset((frame & 1) ? &g_db.draw1 : &g_db.draw0, odev);
    ps2_gs_swap_dbuff(&g_db, frame);

	NTSC$B$N%$%s%?!<%l!<%9%b!<%I$N>l9g$O(B0.5$B%T%/%;%kJ,$:$i$7$?IA2h4D6-(B
	$B$rMQ0U$7$^$9!#(B

$B!&%3%s%H%m!<%i$N>pJs<hF@(B
    // --- read pad ---
    sjoy_poll();
    paddata = sjoy_get_ps2_button(0);

    // --- object rotate & change view point ---
    if (paddata & SJOY_PS2_L_DOWN) {
	obj_rot[0] += delta;
	    :	:
	    :	:

	$B%3%s%H%m!<%i$N%\%?%s>pJs$O!"(Bsjoy_get_ps2_button()$B$rMQ$$$F<hF@$7$^$9!#(B
	$B$3$3$G$OF@$i$l$?%G!<%?$r$b$H$K!"%*%V%8%'%/%H!"%+%a%iAPJ}$N2sE>3Q!"(B
	$B0\F0NL$r99?7$7$F$$$^$9!#%3%s%H%m!<%i$N:8<jB&$,%*%V%8%'%/%H!"1&<jB&(B
	$B$N%\%?%s$,%+%a%i$NA`:n$H$J$C$F$$$^$9!#$^$?!"(Bselect$B%\%?%s$,%*%V%8%'(B
	$B%/%H$N@Z$jBX$($G$9!#(B

$B!&(BLocal-World$B%^%H%j%/%9(B($B2sE>$N$_(B)$B$N@8@.(B
    ps2_vu0_unit_matrix(work);                       //$BC10L9TNs(B
    ps2_vu0_rot_matrix(local_world, work, obj_rot);  //$B2sE>9TNs(B

	Local-World$B%^%H%j%9$O!"(BLocal$B:BI8$GJ];}$5$l$F$$$k%*%V%8%'%/%H$4$H$K(B
	$B5a$a$kI,MW$,$"$j$^$9!#2sE>!"J?9T0\F0$H$$$C$?%"%U%#%sJQ49$,MQ$$$i$l(B
	$B$^$9!#(B
	$B$3$N%5%s%W%k$G$O!"2sE>%^%H%j%/%9$*$h$SJ?9T0\F0%^%H%j%/%9$r7W;;$7$F(B
	$B$=$l$i$r>h;;$7$?$b$N$r(BLocal-World$B%^%H%j%/%9$H$7$FMQ$$$F$$$^$9!#(B
	$B$?$@$7$3$N%5%s%W%k$G$O!"#39TL\$NJ?9T0\F0(B(obj_trans)$B$r@_Dj$9$kA0$K(B
        local_light$B%^%H%j%/%9$r@_Dj$9$kI,MW$,$"$j$^$9!#J?9T0\F0$r2CL#$7$?(B
	$B9TNs$rMQ$$$F(Blocal_light$B%^%H%j%/%9$r@8@.$9$k$H!"4D6-8w$N7W;;$,@5$7(B
	$B$/9T$($^$;$s!#$3$l$OJ?9T0\F0!"4D6-8w$$$:$l$b9TNs$NBh#4Ns$rMQ$$$F7W(B
	$B;;$9$k$?$a$G$9!#$7$?$,$C$F2sE>9TNs$r@_Dj$7$?D>8e$K!"(Blocal_light$B%^(B
	$B%H%j%/%9$r:n$C$F$/$@$5$$!#(B
	$B$b$&$R$H$DCm0UE@$H$7$F!"(Bobj_trans$B$NBh#4MWAG$K$OI,$:%<%m$r@_Dj$7$F(B
	$B$/$@$5$$!#%^%H%j%/%9$N(B[4,4]$BMWAG$K$OHs>o$K%/%j%F%#%+%k$JCM$,%;%C%H(B
	$B$5$l$F$$$^$9$,!"%<%m0J30$NCM$G$O$3$l$rJQ$($F$7$^$&$3$H$K$J$j$^$9!#(B

$B!&%m!<%+%k%i%$%H%^%H%j%/%9$N@8@.(B
    ps2_vu0_normal_light_matrix;( normal_light, light0,light1,light2);
    ps2_vu0_mul_matrix(local_light, normal_light,local_world);

	ps2_vu0_normal_light_matrix()$B$rMQ$$$F!"#3$D$N8w8;$+$i(B
	Normal-Light$B%^%H%j%/%9$r5a$a$^$9!#$5$i$K(BLocal-World$B%^%H%j%/%9$r(B
	$B>h;;$7$F!"(BLocal-Light$B%^%H%j%/%9$r@8@.$7$^$9!#A0=R$7$?$h$&$K!"$3(B
	$B$N$H$-3]$1$k(Blocal_world$B$O!"2sE>$N$_$,@_Dj$5$l$?%^%H%j%/%9$G$"$k(B
	$BI,MW$,$"$j$^$9!#(B

$B!&%i%$%H%+%i!<%^%H%j%/%9$N@8@.(B
    ps2_vu0_light_color_matrix( light_color, color0, color1, color2, ambient);

	$B8w8;?'$*$h$S4D6-?'$h$j(Bps2_vu0_light_color_matrix()$B$rMQ$$$F%i%$%H(B
	$B%+%i!<%^%H%j%/%9$r5a$a$^$9!#8w8;7W;;;~$K!"3F8w8;$N1F6A?'$,5a$^$C(B
	$B$?8e$K!"%i%$%H%+%i!<%^%H%j%/%9$r>h;;$7$F!":G=*E*$J%9%/%j!<%s>e$G(B
	$B$ND:E@?'$,7hDj$7$^$9!#(B

$B!&(BLocal-World$B%^%H%j%/%9(B($B2sE>!uJ?9T0\F0(B)$B$N@8@.(B
    ps2_vu0_trans_matrix(local_world, local_world, obj_trans);
					//$B2sE>!uJ?9T0\F09TNs(B

	local_light$B$N%^%H%j%/%9@8@.$,=*N;$7$?$N$G!"(Blocal_screen$B%^%H%j%/(B
	$B%9$r:n@.$9$kA0$KJ?9T0\F0$NMWAG$r(Blocal_world$B$K2C$($^$9!#(B

$B!&(BWorld-View$B%^%H%j%/%9$N@8@.(B
    vu0_rot_camera_matrix(world_view, camera_p, camera_zd,camera_yd,
							camera_rot);

	$B$3$N4X?t$O!"FbIt$G(Bps2_vu0_camera_matrix()$B$r8F$S=P$7$^$9!#$3$N(B
	ps2_vu0_camera_matrix()$BMQ$$$F!"(BWorld-View$B%^%H%j%/%9$r5a$a$^$9!#(B
	View$B:BI87O$O;kE@(B(eye)$B$r86E@(B(0,0,0)$B$H$7!";k@~J}8~$,(BZ+$B!"1&<jJ}8~$,(B
	X+$B!"B-J}8~$,(BY+$B$H$J$C$F$$$^$9(B($B1&<j:BI87O!K!#$3$3$G$O!"(Bworld$B$KBP$7(B
	$B$F;kE@(Bcamera_p$B$r(B(0,0,-25)$B!";k@~(Bcamera_zd$B$r(B(0,0,1)$B$H?bD>J}8~(B
	camera_yd$B$r(B(0,1,0)$B$H$7!"$3$l$r4p=`$K(BWorld-View$B%^%H%j%/%9$r@8@.$7(B
	$B$^$9!#(Bvu0_rot_camera_matrix()$B4X?tFbIt$G$O$3$l$i$N%Y%/%H%k$r(B
	camera_rot $B$K$h$C$F2sE>$7!"$=$N7k2L$r(Bps2_vu0_camera_matrix()$B$KEO(B
	$B$7$F$$$^$9!#(B

$B!&(BLocal-Screen$B%^%H%j%/%9$N@8@.(B
    ps2_vu0_mul_matrix(work, world_view, local_world);	 //Local-View
    ps2_vu0_mul_matrix(local_screen, view_screen, work); //Local-Screen

	$B$3$3$^$G$K5a$a$i$l$?(BWorld-View$B%^%H%j%/%9!"(BLocal-World$B%^%H%j%/%9(B
	$B$rMQ$$$F!"$^$:(BLocal-View$B%^%H%j%/%9$r5a$a$^$9!#$5$i$K!"(B
	View-Screen$B%^%H%j%/%9$r>h;;$9$k$3$H$G(BLocal-Screen$B%^%H%j%/%9$,5a(B
	$B$a$i$l$^$9!#(B

$B!&%Q%1%C%H$N@8@.(B
    MakePacket(&obj[obj_switch], i);

	$B%Q%1%C%H$N@8@.$O!"(BMakePacke()$B$NFbIt$G9T$o$l$^$9!#>\$7$/$O8e$G2r(B
	$B@b$7$^$9!#(B

$B!&(BGS$B$X$N%Q%1%C%HE>Aw(B
    ps2_dma_start(g_fd_gs, vfd, (ps2_dmatag *)obj[obj_switch].pack[i].buf);

	MakePacket()$B$G@8@.$5$l$?%W%j%_%F%#%V$N%Q%1%C%H$r(BDMA$B$r<B9T$7$FE>(B
	$BAw$7$^$9!#(B

$B!&2>A[%3%s%=!<%k%m%C%/$N2r=|(B
    ps2_gs_vc_unlock();

	$B2>A[%3%s%=!<%k$N%m%C%/$r2r=|$7!"JL$N%"%W%j%1!<%7%g%s$K@Z$jBX$($r(B
	$B5v2D$7$^$9!#(B


$B%W%m%0%i%`2r@b!J%Q%1%C%H@8@.!K(B
--------------------------------------------------------------------------

$B!!0J2<$K(BMakePacket()$B$G9T$&%Q%1%C%H@8@.=hM}$NFbMF$r@bL@$7$^$9!#(B

$B!&%Q%1%C%H=i4|@_Dj(B
    pack->size = 0;
    pack->buf = (QWdata *)s_spr;

	$B%Q%1%C%H$N=q$-9~$_0LCV$r@hF,$K;}$C$F$-$^$9!#(B
	$B%Q%1%C%H$r@8@.$9$kNN0h$r!"$3$3$G$O(Bs_spr$B$N@hF,$K@_Dj$7$F$$$^$9!#(B
	DMA$B$NE>Aw;~$K(BQWC$B$K@_Dj$G$-$kCM$K@)8B$,$"$j$^$9$N$G!"%Q%1%C%H$N%5(B
	$B%$%:$,(B1MB$B0J>e$K$J$i$J$$$h$&$KCm0U$7$F$/$@$5$$!#(B

$B!&(BDMAtag$B!"(BGIFtag$B$N@8@.(B
    // add DMAtag
    pack->buf[pack->size].ul128 = 0;
    dmatag = (ps2_dmatag *)&pack->buf[pack->size].ul128;
    dmatag->ID = PS2_DMATAG_END;
    dmatag->QWC = obj->vertexNum[num] * 3 + 1;
    pack->size++;
    
    // add vertex info(GIFtag, STQ & RGBA & XYZ)
    giftag = (ps2_giftag *)&pack->buf[pack->size++];
    giftag->NLOOP = obj->vertexNum[num];
    giftag->EOP = 1;
    giftag->PRE = 1;
    giftag->PRIM = obj->prim;
    giftag->FLG = PS2_GIFTAG_FLG_PACKED;
    giftag->NREG = 3;
    giftag->REGS0 = PS2_GIFTAG_REGS_ST;
    giftag->REGS1 = PS2_GIFTAG_REGS_RGBAQ;
    giftag->REGS2 = PS2_GIFTAG_REGS_XYZ2;

	$B%Q%1%C%H@hF,$K$O!"(BDMAtag$B$*$h$S(BGIFtag$B$r$D$1$kI,MW$,$"$j$^$9!#(B
	$BAw?.$9$k%Q%1%C%H$N%5%$%:$OD:E@?t!_(B3(STQ,RGBA,XYZF2)+1(GIFtag)$B!"(B
	DMAtag$B$N(BID$B$O(Bend(PS2_DMATAG_END)$B$G$9!J(BDMA$B%Q%1%C%H$,$R$H$D$@$1$J$N(B
	$B$G!K!#(BGIF$B$O(BPACKED mode(PS2_GIFTAG_FLG_PACKED)$B$r;HMQ$7!"%W%j%_%F%#(B
	$B%V$N@_Dj$b(BGIFtag$B$NCf$G9T$&$h$&$K$7$F$$$^$9(B(obj->prim)$B!#(BREGS0$B!A(B2
	$B$KE>Aw$9$k%l%8%9%?(B(STQ,RGBA,XYZF2)$B$r;XDj$7$F$$$^$9!#(B

$B!&(BSTQ$B!"(BRGBA$B!"(BXYZ$B$N@8@.(B
    vu0_rot_trans_pers_n_clip_col(&pack->buf[pack->size].ul128,
				  local_screen, vertex,normal,
				  texUV,color, local_light,light_color, 
				  obj->vertexNum[num]);

	vu0_rot_trans_pers_n_clip_col()$B$rMQ$$$F%Q%1%C%H$NCf?H(B(STQ$B!"(BRGBA$B!"(B
	XYZ)$B$r5a$a$F$$$^$9!#(B


$B%W%m%0%i%`2r@b!J(BVU0$B%^%/%mL?Na!K(B
--------------------------------------------------------------------------

$B0J2<!"(Bvu0_rot_trans_pers_n_clip_col()$B$N=hM}$K$D$$$F@bL@$7$^$9!#(BVU0$B$N%^%/(B
$B%mL?Na$rMQ$$$F:BI8JQ49!&F);kJQ49!&8w8;7W;;$J$I$r9T$&4X?t$G!"K\%5%s%W%k$N(B
$B3K$H$J$kItJ,$G$9!#(Bvu0.c$B$r;2>H$7$F$/$@$5$$!#(B

$B!&%^%H%j%C%/%9$N@_Dj(B
    # Local-World$B%^%H%j%C%/%9$N@_Dj(B
    lqc2	vf4,0x0(%1)	#set local_world matrix[0]
    lqc2	vf5,0x10(%1)	#set local_world matrix[1]
    lqc2	vf6,0x20(%1)	#set local_world matrix[2]
    lqc2	vf7,0x30(%1)	#set local_world matrix[3]
    # Local-Light$B%^%H%j%C%/%9$N@_Dj(B
    lqc2	$vf17,0x0(%6)	#set local_light matirix[0]
    lqc2	$vf18,0x10(%6)	#set local_light matirix[1]
    lqc2	$vf19,0x20(%6)	#set local_light matirix[2]
    # Light-Color$B%^%H%j%C%/%9$N@_Dj(B
    lqc2	$vf21,0x0(%7)	#set light_color matrix[0]
    lqc2	$vf22,0x10(%7)	#set light_color matrix[1]	
    lqc2	$vf23,0x20(%7)	#set light_color matrix[2]
    lqc2	$vf20,0x30(%7)	#set light_color matrix[3]		

	$B:G=i$K!"(BVU0$B$N(BVF$B%l%8%9%?$K!"(BLocal-World$B%^%H%j%/%9!"(BNormal-Light$B%^(B
	$B%H%j%/%9!"(BLight-Color$B%^%H%j%/%9$r@_Dj$7$^$9!#(B

$B!&D:E@!?K!@~!?D:E@?'!?(BST$B$NFI$_9~$_(B
    lqc2	vf8,0x0(%2)	#load XYZ
    lqc2	$vf24,0x0(%4)	#load NORMAL
    lqc2	$vf25,0x0(%5)	#load COLOR
    lqc2	$vf27,0x0(%8)	#load ST

	$B%Q%1%C%H@8@.$KI,MW$JD:E@:BI8!"K!@~!"D:E@?'!"%F%/%9%A%c:BI8$r%l%8(B
	$B%9%?$KFI$_9~$_$^$9!#(B

$B!&:BI8JQ49(B
    # (X0,Y0,Z0,W0)=[SCREEN/LOCAL]*(X,Y,Z,1)
    vmulax.xyzw     ACC, vf4,vf8
    vmadday.xyzw    ACC, vf5,vf8
    vmaddaz.xyzw    ACC, vf6,vf8
    vmaddw.xyzw     vf12,vf7,vf8

	Local-Screen$B%^%H%j%/%9$HD:E@:BI8$r>h;;$7$F!"%9%/%j!<%s:BI8$r5a$a(B
	$B$^$9!#$3$N$H$-$N(BW$B$NCM$O!"(BView$B:BI87O$G$N(BZ$B$NCM$HEy$7$/$J$j$^$9!#(B

$B!&F);kJQ49(B
    # (X1,Y1,Z1,1)=(X0/W0,Y0/W0,Z0/W0,W0/W0)
    vdiv    Q,vf0w,vf12w
    vwaitq
    vmulq.xyzw	vf12,vf12,Q
    vftoi4.xyzw	vf13,vf12

	$B%9%/%j!<%s:BI8$r(B1/W$B$H>h;;$7$^$9!#$5$i$K!"(BGIF$B%Q%1%C%HMQ$K8GDj>.?t(B
	$BCM$KJQ49$7$^$9!#$3$3$G7W;;$7$?(B1/W$B$O!"8e$K%F%/%9%A%c:BI8$H>h;;$9(B
	$B$k$?$aJ];}$7$F$*$-$^$9!#(B

$B!&8w8;$N1F6A$r5a$a$k(B
    # (L1,L2,L3)=[LLM](Nx,Ny,Nz)
    # LLM:$B%m!<%+%k%i%$%H%^%H%j%C%/%9(B
    # L1,L2,L3:$B8w8;$N1F6A(B
    # Nx,Ny,Nz:$BK!@~%Y%/%H%k(B
    vmulax.xyzw    ACC, $vf17,$vf24
    vmadday.xyzw   ACC, $vf18,$vf24
    vmaddz.xyzw    $vf24,$vf19,$vf24
    vmaxx.xyz      $vf24,$vf24,$vf0 #$BIi$NCM$O(B0$B$K$9$k(B

	$B%m!<%+%k%i%$%H%^%H%j%/%9$HK!@~%Y%/%H%k$r>h;;$7$F!"8w8;$N1F6A$r5a(B
	$B$a$^$9!#8w8;$NJ}8~$HK!@~%Y%/%H%k$N8~$-$,F1$8>l9g!"7k2L$,Ii$NCM$r(B
	$B$H$k$N$G$3$l$i$O(B0$B%5%A%e%l!<%H$7$^$9!#(B

$B!&8w8;$N1F6A?'$r5a$a$k(B
    # (LTr,LTg,LTb,LTw)=[LCM](L1,L2,L3,1)
    # LCM:$B%i%$%H%+%i!<%^%H%j%C%/%9(B
    # LTr,LTg,LTb:$B8w8;$N1F6A?'(B
    vmulax.xyzw    ACC, $vf21,$vf24
    vmadday.xyzw   ACC, $vf22,$vf24
    vmaddaz.xyzw   ACC, $vf23,$vf24
    vmaddw.xyzw    $vf24,$vf20,$vf0	

	$B%i%$%H%+%i!<%^%H%j%/%9$H8w8;$N1F6A$r>h;;$7$F!"8w8;$N1F6A?'$r5a$a(B
	$B$^$9!#(B

$B!&%9%/%j!<%s>e$ND:E@?'$r5a$a$k(B
    # (RR,GG,BB) = (R,G,B)*(LTr,LTg,LTb)
    # R,G,B:$BD:E@?'(B
    # RR,GG,BB:$B%9%/%j!<%sD:E@?'(B
    vmul.xyzw	$vf26,$vf24,$vf25
    # [0..255] $B%5%A%e%l!<%7%g%s(B
    vmaxx.xyz	$vf26,$vf26,$vf0
    lui		$2,0x437f
    ctc2	$2,$vi21
    vnop
    vnop
    vminii.xyz	$vf26,$vf26,I
    vftoi0.xyzw	$vf26,$vf26

	$B8w8;$N1F6A?'$HD:E@?'$r>h;;$9$k$3$H$G!"%9%/%j!<%s>e$ND:E@?'$,5a$^(B
	$B$j$^$9!#7k2L$O!"(B0-255$B$NHO0O$G$J$1$l$P$J$j$^$;$s$N$G!"$=$NHO0O$G(B
	$B$N%5%A%e%l!<%7%g%s$r9T$$$^$9!#$5$i$K!"(BGIF$B%Q%1%C%HMQ$K8GDj>.?tCM(B
	$B$KJQ49$7$^$9!#(B

$B!&(BST$B$r5a$a$k(B
    # (S,T,Q) = (s,t,1)/w
    vmulq.xyz	$vf28,$vf27,Q

	$B%Q!<%9%Z%/%F%#%V%3%l%/%7%g%s$N$?$a$K!"F);kJQ49;~$KJ];}$7$F$*$$$?(B
	1/W$B$NCM$r$+$1$^$9!#(B

$B!&(BSTQ$B!"(BRGBA$B!"(BXYZ$B$NCM$rJ]B8$9$k(B
    sqc2	$vf28,0x0(%0)		#store STQ 
    addi	%0,0x10
    sqc2	$vf26,0x0(%0)		#store RGBA 
    addi	%0,0x10
    sqc2	vf13,0x0(%0)		#store XYZ 
    addi	%0,0x10
    #
    addi	%3,-1
    addi	%2,0x10
    addi	%4,0x10
    addi	%5,0x10
    addi	%8,0x10
    bne		$0,%3,_rotTPNCC_loop

	GIFtag$B$NCf$G@_Dj$5$l$F$$$k=g=x$K$7$?$,$C$F!"(BSTQ$B!"(BRGBA$B!"(BXYZ$B$NCM$r(B
	$B%Q%1%C%H$KJ]B8$7$F$$$-$^$9!#(BGIF$B$GAw$k>l9g!"(BRGBAQ$BL?Na$K$*$1$k(BQ$B$N(B
	$BCM$OD>A0$N(BST$BL?Na$GFbIt%l%8%9%?$KJ]B8$5$l$?CM$,@_Dj$5$l$^$9$N$G!"(B
	$B=g=x$K$OCm0U$7$F$/$@$5$$!#(B
	$B0J>e$G!"(Bvu0_rot_trans_pers_n_clip_col()$B$N%a%$%s%k!<%W$O=*N;$7$^(B
	$B$9!#;XDj$5$l$?D:E@?t$K$J$k$^$G!"3F%"%I%l%9$r%$%s%/%j%a%s%H$7$J$,(B
	$B$i!"D:E@%G!<%?FI$_9~$_0J9_$N=hM}$r7+$jJV$7$^$9!#(B
