Copyright (C) 2001  Sony Computer Entertainment Inc.

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

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

EE Core$B$N$_$rMQ$$$F9TNs1i;;!"F);kJQ49Ey$r9T$&?t3X4X?t$r<BAu$7!"(B3D$B%0%i%U%#%C(B
$B%/%9$KI,MW$J?t3X$N4pAC$K$D$$$FM}2r$r?<$a$^$9!#$^$?!"$3$N$h$&$J?t3X4X?t$r(B
vu0, vu1$B$K<BAu$9$k:]$N<j=u$1$H$J$k$h$&!"(Bbasic3d vu0$BHG$*$h$S(Bvu1$BHG$GMQ$$$F(B
$B$$$k4X?t$HF1Ey$N4X?t$r<B8=$7$^$9!#$5$i$K!"1i;;7k2L$rD>@\(BGS$B$KEO$9%Q%1%C%H(B
$B$r:n@.$9$k$3$H$K$h$j!"(BDMA$B$NF0:n$H$H$b$K(BGS$B$NF0:n$N4pK\;EMM$K$D$$$F3NG'$7(B
$B$^$9!#(B

<$B%U%!%$%k(B>
	core.c		$B%a%$%s%W%m%0%i%`(B
	mathfunc.c	$BF);kJQ49Ey$N9TNs1i;;4X?t(B(Core$BHG(B)
	mathfunc.h	$BF);kJQ49Ey$N9TNs1i;;4X?t$N%X%C%@%U%!%$%k(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)
	flower.dsm	$B%F%/%9%A%c%G!<%?(B

<$B%3%s%Q%$%kJ}K!(B>
	% make

<$B5/F0J}K!(B>
	% make run

<$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
        (select$B%\%?%s$G@Z$jBX$((B)

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

<$B%3%s%H%m!<%i$NA`:nJ}K!(B>
	$B","-(B($BJ}8~%-!<(B) : $B%*%V%8%'%/%H$N(Bx$B<42sE>(B
        $B"+"*(B	       : $B%*%V%8%'%/%H$N(By$B<42sE>(B
        L1L2$B%\%?%s(B     : $B%*%V%8%'%/%H$N(Bz$B<42sE>(B
        $B""!{%\%?%s(B     : $B%o!<%k%I:BI87O$KBP$9$k%+%a%i$N(By$B<42sE>(B
        $B"$!_%\%?%s(B     : $B%o!<%k%I:BI87O$KBP$9$k%+%a%i$N(Bx$B<42sE>(B
        R1R2$B%\%?%s(B     : $B%+%a%i$NA0?J8eB`2sE>(B
        SELECT$B%\%?%s(B   : $B%*%V%8%'%/%H@Z$jBX$((B

<$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
                     (CPUcore$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)
--------------------------------------------------------------------------

$B!&JQ?t!?9=B$BN!?4X?t(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%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$k9=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%Y%/%H%k(B
        obj_rot         :$B%*%V%8%'%/%H$N2sE>%Y%/%H%k(B

        local_world     :$B%*%V%8%'%/%H(BLocal$B:BI8$r(BWorld$B:BI87O$KJQ49$9$k9TNs(B
        world_view      :World$B:BI87O$r(BView$B:BI87O$KJQ49$9$k9TNs(B
        view_screen     :View$B:BI87O$r(BScreen$B:BI87O$KJQ49$9$k9TNs(B
        local_screen    :Local$B:BI8$r(BScreen$B:BI8$KJQ49$9$k9TNs(B($B>e#39TNs$N@Q(B)

        normal_light    :World$B: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%/%H%k$,%;%C%H$5$l$k(B)
        local_light     :normal_light$B9TNs$K(Blocal_world$B9TNs$r3]$1$F!"(B
                         Local$B:BI87O$K$*$1$kD:E@$NK!@~%Y%/%H%k$H(B
                         $B%i%$%H$NJ}8~%Y%/%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(B
                         $B@8@.$5$l$?Fb@Q%Y%/%H%k$K3F%i%$%H$N?'(B(3$B?'!\4D6-8w(B)
                         $B$r3]$1$FOB$r$H$k9TNs(B
        local_color     :local_light$B$H(Blight_color$B$N@Q$r<h$C$?9TNs(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_gs_image    g_img   :$B%F%/%9%A%c$r(BGS$B%m!<%+%k%a%b%j$KE>Aw$9$k$?(B
                                 $B$a$N9=B$BN(B
        TexEnv          texenv  :$B%F%/%9%A%c%G!<%?$rE>Aw$9$k$?$a$N%Q%1%C%H(B
                                 $B$r:n@.$9$k9=B$BN(B

        LoadObj(ObjData *o, __u32 *Head)
                        :$B%a%b%j>e$KE83+$7$?%*%V%8%'%/%H%G!<%?$r(BObjData$B9=(B
                         $BB$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$I(B
                         $B$r9T$$!"(BGS$B$KE>Aw$9$k%Q%1%C%H$r@8@.$9$k4X?t(B

$B!&(Bmain $B4X?tFb$NJQ?t(B

        frame           :$B%@%V%k%P%C%U%!$G%U%j%C%W$r9T$&$?$a$N%9%$%C%A(B
        delta           :$B2sE>3Q$r@_Dj$9$k$?$a$NJQ?t(B
        obj[2]          :$B%*%V%8%'%/%H$rEPO?$9$k$?$a$NJQ?t(B(cube&torus)
        obj_switch      :$B%*%V%8%'%/%H$r@Z$jBX$($k$?$a$N%H%0%k%9%$%C%A(B
        toggle          :select$B%\%?%s$NFI$_9~$_$r%H%0%k$G@)8f$9$kJQ?t(B

$B!&(Bmathfunc.c $B$G%5%]!<%H$9$kJQ?t$*$h$S4X?t(B

        ps2Samp0IVECTOR[4]      :128bit$B6-3&$GG[CV$9$k(Bint$B7?$NG[Ns(B($BMWAG(B4)
        ps2Samp0FVECTOR[4]      :128bit$B6-3&$GG[CV$9$k(Bfloat$B7?$NG[Ns(B($BMWAG(B4)
        ps2Samp0FMATRIX[4][4]   :128bit$B6-3&$GG[CV$9$k(Bfloat$B7?$NG[Ns(B($BMWAG(B4x4)

$B!!4X?t$K$D$$$F$N>\$7$$@bL@$O(Bmathfunc.c$B$K$"$j$^$9$N$G$=$A$i$r;2>H$7$F$/$@(B
$B$5$$!#(Bmathfunc.c$B$G<BAu$5$l$k4X?t$N$[$H$s$I$O(BVu0$B%^%/%m$G<BAu$5$l!"(Blibvu0
$B$K$h$jDs6!$7$F$$$^$9!#(BCore$BHG$G<BAu$9$k4X?tL>$O(Bps2Samp0*()$B$G$9$,!"(BVU0$BHG$G(B
$B$O(Bps2_vu0_*()$B$H$J$C$F$$$^$9!#(B

$B!!$J$*!"(BCore$BHG$H(BVU0$BHG(B/VU1$BHG$G$O9TNs$NG[Ns7A<0$,0[$J$j$^$9$N$GCm0U$7$F$/(B
$B$@$5$$!#(BCore$BHG$G$O0lHLE*$JG[Ns$G$9$,!"(BVU0/1$BHG$G$O(BVU$B$N1i;;5!G=$rM-8z$KMx(B
$BMQ$9$k$?$a!"$=$NE>CV7A<0$K$J$C$F$$$^$9!#(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%5%s%W%k$GMxMQ$9$k%*%V%8%'%/%H%G!<%?$r!"(BSampleCubeDataHead$B$*$h$S(B
	SampleCubeDataHead$B$+$i(BObjData$B9=B$BN$KFI$_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);	// $B%@%V%k%P%C%U%!$N@_Dj$r$*$3$J$&(B
    *(__u64 *)&g_db.clear0.rgbaq = PS2_GS_SETREG_RGBAQ(0x10, 0x10, 0x18, 0x80,
				                       0x3f800000);
    *(__u64 *)&g_db.clear1.rgbaq = PS2_GS_SETREG_RGBAQ(0x10, 0x10, 0x18, 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(BLoadImage
	$B$N>pJs$r@_Dj$7$^$9!#$=$N8e!"(Bps2_gs_load_image()$B$r<B9T$9$k$3$H$G!"(B
	$B;XDj$5$l$?%$%a!<%8$,(BGS$B$N%m!<%+%k%a%b$j$KE>Aw$5$l$^$9!#(B
	$B2>A[%3%s%=!<%k$r%5%]!<%H$9$k$?$a!"$=$N@Z$jBX$($N%?%$%_%s%0$G$b%m!<(B
	$B%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%`$N2r@b!J%a%$%s%k!<%WItJ,!K(B
--------------------------------------------------------------------------

$B!&(BView-Screen$B%^%H%j%/%9$N@8@.(B
    ps2Samp0ViewScreenMatrix(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);

	ps2Samp0ViewScreenMatrix()$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%C%/%9(B($B2sE>$N$_(B)$B$N@8@.(B
    ps2Samp0UnitMatrix(work);                   // $BC10L9TNs(B
    ps2Samp0RotMatrix(local_world, work, rot);  // $B2sE>9TNs(B

	Local-World$B%^%H%j%/%9$O!"(BLocal$B:BI8$GJ];}$5$l$F$$$k%*%V%8%'%/%H$4$H(B
	$B$K5a$a$kI,MW$,$"$j$^$9!#2sE>!"J?9T0\F0$H$$$C$?%"%U%#%sJQ49$,MQ$$$i(B
	$B$l$^$9!#(B
	$B$3$N%5%s%W%k$G$O!"2sE>%^%H%j%C%/%9$*$h$SJ?9T0\F0%^%H%j%/%9$r7W;;$7(B
	$B$F!"$=$l$i$r>h;;$7$?$b$N$r(BLocal-World$B%^%H%j%C%/%9$H$7$FMQ$$$F$$$^(B
	$B$9!#(B
	$B$?$@$7$3$N%5%s%W%k$G$O!"(B3$B9TL\$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(B4$BNs$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(B4$BMWAG$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$5(B
	$B$l$F$$$F!"%<%m0J30$NCM$G$O$3$l$rJQ$($F$7$^$&$3$H$K$J$k$?$a$G$9!#(B

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

	ps2Samp0NormalLightMatrix()$B$rMQ$$$F!"(B3$B$D$N8w8;$+$i(BNormal-Light$B%^%H(B
	$B%j%/%9$r5a$a$^$9!#$5$i$K!"(BLocal-World$B%^%H%j%/%9$H3]$19g$o$;$F!"(B
	Local-Light$B%^%H%j%/%9$r@8@.$7$^$9!#A0=R$7$?$h$&$K!"$3$N$H$-3]$1$k(B
	Local_World$B%^%H%j%/%9$O!"(Bobj_trans$B$,%;%C%H$5$l$F$$$F$O$$$1$^$;$s!#(B

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

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

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

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

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

	Local_Light$B$N%^%H%j%/%9$N@8@.$,=*N;$7$?$N$G!"(BLocal_World$B%^%H%j%/%9(B
	$B$KJ?9T0\F0MWAG(B(obj_trans)$B$r2C$($F!"??$N(BLocal_World$B%^%H%j%/%9$r@8@.(B
	$B$7$^$9!#(B

$B!&(BLocal-Screen$B%^%H%j%C%/%9$N@8@.(B
    ps2Samp0MulMatrix(world_screen, view_screen, world_view);
    ps2Samp0MulMatrix(local_screen, world_screen, local_world);

	$B$3$3$^$G$K5a$a$i$l$?(BView-Screen$B%^%H%j%/%9!"(BWorld-View$B%^%H%j%/%9$r(B
	$BMQ$$$F!"$^$:(BWorld-Screen$B%^%H%j%/%9$r5a$a$^$9!#$5$i$K(BLocal-World$B%^(B
	$B%H%j%/%9$r3]$19g$o$;$k$3$H$G!"(BLocal-Screen$B%^%H%j%C%/%9$,5a$a$i$l$^(B
	$B$9!#(B
	$B$3$N;~E@$G3]$19g$o$;$k(BLocal_World$B%^%H%j%/%9$O!"2sE>$HJ?9T0\F0$NMW(B
	$BAG$,@5$7$/%;%C%H$5$l$?$b$N$G$"$kI,MW$,$"$j$^$9!#(B

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

	$B%Q%1%C%H$N@8@.$O!"(BMakePacket()$B$NFbIt$G9T$o$l$^$9!#0z?t(Bobj$B$O!"I=<((B
	$B$9$k%*%V%8%'%/%H$N(BObjData$B9=B$BN$X$N%]%$%s%?$G$9!#$3$l$r@Z$jBX$($k(B
	$B$3$H$G4JC1$KI=<(%*%V%8%'%/%H$rJQ99$9$k$3$H$,$G$-$^$9!#(B

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

	$B%Q%1%C%H$N=q$-9~$_%"%I%l%9$r(Bs_spr$B$K;XDj$7$F$$$^$9!#(B
	$B%a%$%s%a%b%j$K%Q%1%C%H$r@8@.$9$k>l9g$G$b!"(BDMA$B$NE>Aw;~$K(BQWC$B$K@_Dj(B
	$B$G$-$kCM$K@)8B$,$"$j$^$9$N$G!"%Q%1%C%H$N%5%$%:$O(B1MB$B0J>e$K$J$i$J(B
	$B$$$h$&$KCm0U$7$F$/$@$5$$!#$3$N%5%s%W%k$K$*$1$k%H!<%i%9%G!<%?$O!"(B
	VU1$BHG$G(BVUMem1$B$N%@%V%k%P%C%U%!$r;HMQ$7$F$$$^$9!#(B

$B!&(BDMAtag$B!"(BGIFtag$B$N@8@.!!!J(BMakePacket()$B!K(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!&F);kJQ49!!!J(BMakePacket()$B!K(B
    Q = ps2Samp0RotTransPers(v01, local_screen, vertex[j], 1);
    ps2Samp0ScaleVector(tex, texUV[j], Q); //for Perspective correction

	ps2Samp0RotTransPers()$B4X?t$OF);kJQ49$r9T$&4X?t$G$9!#>\$7$$@bL@$O(B
	mathfunc.c$BFb$K=q$$$F$"$j$^$9!#=PNO7k2L(B(v01)$B$O(Bint$B7?G[Ns$G!"(BGS$B$KD>@\(B
	$BEO$;$k7A<0(B(GS$B$N:BI87O(B)$B$K$J$C$F$$$^$9!#$^$?!"JV$jCM(BQ$B$O(Bv01$B$NBh(B4$BMWAG(B
	$B$N5U?t$G!"(Bfloat$B7?$G$9!#$3$l$O%Q!<%9%Z%/%F%#%VJd@5$KMQ$$$k$b$N$G!"(B
	$B%F%/%9%A%c:BI8(B(S, T, Q)$B$KMQ$$$^$9!#(B
        texUV$B$O%F%/%9%A%c$N(BUV$B:BI8(B(U, V, 1.0 ,0)$B$,%;%C%H$5$l$F$$$^$9!#$3$l(B
	$B$i$NCM$K(BQ$B$r3]$1$k$3$H$G(BSTQ$B%F%/%9%A%c:BI8$,5a$^$j$^$9!#(B

$B!&8w8;7W;;!!!J(BMakePacket()$B!K(B
    ps2Samp0NormalColorVector(c01, local_light, light_color, normal[j],
			      color[j]);

	$BD:E@$NK!@~%Y%/%H%k!&?'>pJs$H!"%i%$%H$N%Y%/%H%k!&?'>pJs$+$i8w8;7W;;(B
	$B8e$ND:E@$N?'$r7hDj$7$^$9!#$3$l$b(BGS$B$KD>@\EO$;$k7A<0$GCM$,5"$C$F$-$^(B
	$B$9!#(B
	$B4X?tFbIt$G$O!"%i%$%H$N%Y%/%H%k$HD:E@$NK!@~%Y%/%H%k$H$NFb@Q$r5a$a$?(B
	$B;~E@$G!"0lEYFb@QCM$r(B0.0$B!A(B1.0$B$N4V$G%/%j%C%T%s%0$7$^$9!#$5$i$K#3$D$N(B
	$B8w8;$N1F6A$rB-$7$"$o$;$?8e!"$5$i$K(B0.0$B!A(B255.0$B$N4V$G%/%j%C%T%s%0$r9T(B
	$B$C$F$$$^$9!#(B

$B!&%Q%1%C%H$X$N3JG<!!!J(BMakePacket()$B!K(B
    pack->buf[pack->size++].ul128 = *((__u128*)tex);
    pack->buf[pack->size++].ul128 = *((__u128*)c01);
    pack->buf[pack->size++].ul128 = *((__u128*)v01);

	$B5a$a$i$l$?3FCM$r(B(S,T,Q) (R,G,B,A) (X,Y,Z,F) $B$N=g$G%Q%1%C%H$K5M$a9~(B
	$B$_$^$9!#(B

$B!&(BGS$B$X$NE>Aw(B
    MakePacket(&obj[obj_switch], i);
    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!"(BPATH3$B7PM3$N(BDMA
	$B$GE>Aw$7$^$9!#$3$l$r%*%V%8%'%/%H$NJ,3d%V%m%C%/$N8D?tJ,$@$17+$jJV(B
	$B$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
