100 SCREEN 0:DIM V_NO(3),V_ID(100,2),E(2),CX(2),CY(2) 110 CX(0)=320/4*3:CY(0)=180/4:CX(1)=CX(0):CY(1)=180/4*3:CX(2)=320/4:CY(2)=CY(1) 120 FOR I=0 TO 14 : L$=L$+CHR$(I) : NEXT 130 L$=L$+"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ":FONT_MAX=LEN(L$) 140 FONT_PTR = 11 150 ' 160 ' テクスチャ作成 170 ' 180 SCREEN 0 190 FOR I=0 TO 63:FOR J=0 TO 63 200 Y=(RND(0)+I+J)/4:R=(RND(0)+I+J)/4:PSET (I,J),RGBADD(RGBADD(0,Y,Y,Y*.7),R,0,0) 210 NEXT J,I:GCOPY (0,0)-(63,63) TO A$:CLS 0 220 ' 230 ' メインループ 240 ' 250 *MAIN 260 SCREEN 0:SPRWINDOW 0,0,159,95,,320/4,224/4 270 WIDTH 4,1,37,27:CAMERA (0,0,-130) TO (0,0,0) 280 TEX_ID=0:SETTEX TEX_ID,64,64,32768,RIGHT$(A$,64*64*2): 'テクスチャ定義 290 FONT_NO = ASC(MID$(L$,FONT_PTR+1,1)): 'フォント番号をセット 300 POLY_ID = POLYGONID(-1): 'ポリゴンIDを取得 310 VERT_ID = VERTEXID(-1): '頂点IDを取得 320 ATR_NO = ATRID(-1): 'アトリビュートIDを取得 330 SETPFONT 1,FONT_NO: 'FONT_NOのポリゴンを定義 340 OBJ(1,@XP)=0,0:OBJ(1,@XRV)=.001,.0015,.0013 350 FACES = POLYGONID(POLY_ID): 'ポリゴンの面の数を取得 360 CUR_FACE = 0: '現在表示中の面番号 370 VERTEXES = VERTEXID(VERT_ID): ' 頂点の数を取得 380 ' 390 ' CUR_FACE番めのポリゴンのみ半透明にして残りにはテクスチャを張る 400 ' 410 *TEXTURE_CHANGE 420 SETATR ATR_NO,FACES 430 FOR I=0 TO FACES-1 440 IF I=CUR_FACE THEN SETATR (4,1,3,0,RGB(0,31,0),64+3) ELSE SETATR (0,1,3,TEX_ID, 0,64+8+3) 450 NEXT 460 ' 470 ' 法線ベクトルの再計算 480 ' 490 *VECTOR_CALC 500 SETPOLYGON POLY_ID,FACES,VERT_ID 510 FOR I=0 TO FACES-1 520 VER_ID = POLYGONID(POLY_ID,I) 530 FOR J=0 TO 3 540 V_NO(J)=POLYGONID(POLY_ID,I,J):NEXT 550 SETPOLYGON,(V_NO(0),V_NO(1),V_NO(2),V_NO(3)):NEXT 560 ' 570 ' 頂点読み出し & 三面図描画 580 ' 590 CZ=1:CLS 0:FOR I=0 TO VERTEXES-1:FOR J=0 TO 2 600 V_ID(I,J)=VERTEXID(VERT_ID,I,J):NEXT J,I 610 FOR I=0 TO FACES-1 620 FOR J=0 TO 3 630 V_NO(J)=POLYGONID(POLY_ID,I,J):NEXT 640 FOR K=0 TO 2:K2=K:K1=(K+2)MOD 3:IF K=1 THEN SWAP K1,K2 650 FOR J=0 TO 3 660 LINE (V_ID(V_NO(J),K2)*CZ+CX(K),V_ID(V_NO(J),K1)*CZ+CY(K))-(V_ID(V_NO((J+1)AND 3),K2)*CZ+CX(K),V_ID(V_NO((J+1)AND 3),K1)*CZ+CY(K)),RGB(0,31,0):NEXT J,K,I 670 ' 680 ' テキスト描画 690 ' 700 *TEXT_DRAW 710 LOCATE 0,22 720 PRINT "FONT No.";FONT_NO 730 PRINT "FACES ";FACES 740 PRINT "CUR.FACE";CUR_FACE 750 VER_ID = POLYGONID(POLY_ID,CUR_FACE) 760 PRINT "VERTEXES";VERTEXES 770 FOR I=0 TO 3:LOCATE 15,I+22 780 V_NO(I)=POLYGONID(POLY_ID,CUR_FACE,I) 790 PRINT USING "## (";V_NO(I);:FOR J=0 TO 2 800 PRINT USING "####";VERTEXID(VERT_ID,V_NO(I),J);:NEXT :PRINT ")":NEXT 810 ' 820 ' カーソル表示 830 ' 840 *PUT_CURSOR 850 LINE (OLD_X*32+184,OLD_Y*8+184)-(OLD_X*32+215,OLD_Y*8+191),0,BF 860 LINE (NEW_X*32+184,NEW_Y*8+184)-(NEW_X*32+215,NEW_Y*8+191),RGB(0,0,31),BF 870 OLD_X=NEW_X:OLD_Y=NEW_Y:VSYNC 10 880 ' 890 ' PAD 入力 900 ' 910 *GETPAD 920 P=PAD(0,1):IF P THEN ELSE 920 930 IF P AND @PAD_L THEN FONT_PTR=(FONT_PTR-1+FONT_MAX)MOD FONT_MAX : GOTO *MAIN 940 IF P AND @PAD_R THEN FONT_PTR=(FONT_PTR+1 )MOD FONT_MAX : GOTO *MAIN 950 IF P AND @PAD_Y THEN CUR_FACE=(CUR_FACE-1+FACES)MOD FACES : GOTO *TEXTURE_CHANGE 960 IF P AND @PAD_Z THEN CUR_FACE=(CUR_FACE+1 )MOD FACES : GOTO *TEXTURE_CHANGE 970 IF P AND @PAD_UP THEN NEW_Y=(NEW_Y-1) AND 3 : GOTO *PUT_CURSOR 980 IF P AND @PAD_DOWN THEN NEW_Y=(NEW_Y+1) AND 3 : GOTO *PUT_CURSOR 990 IF P AND @PAD_LEFT THEN NEW_X=(NEW_X+2) MOD 3 : GOTO *PUT_CURSOR 1000 IF P AND @PAD_RIGHT THEN NEW_X=(NEW_X+1) MOD 3 : GOTO *PUT_CURSOR 1010 IF P AND @PAD_B THEN GOSUB *GET_VID:E(NEW_X)=E(NEW_X)-1: GOTO *SET_VTX 1020 IF P AND @PAD_C THEN GOSUB *GET_VID:E(NEW_X)=E(NEW_X)+1: GOTO *SET_VTX 1030 GOTO *GETPAD 1040 *GET_VID 1050 FOR I=0 TO 2:E(I)=VERTEXID(VERT_ID,V_NO(NEW_Y),I):NEXT :RETURN 1060 *SET_VTX 1070 SETVERTEX VERT_ID,VERTEXES,@V_NO(NEW_Y),(E(0),E(1),E(2)) 1080 GOTO *VECTOR_CALC