? P3D (Page 1) ● SmileBASIC Source Forums

Sign In

Register
*Usernames are case-sensitive
Forgot my password
This is the development website, where we test out new features. This isn't the place you're looking for! Go here

P3D

  • #1 ✎ 243 Lumage Head Admin Gardening I like to garden! Hobbies Reading I like to read books! Hobbies Drawing I like to draw! Hobbies   [7 � ' cappuci-z80 cappuci-z80 e e ' 'P3D-ENGINE VERSION 1.0  '[DATE] Feb.,2015-  '[AUTHER] Bugtaro  '[NOTE] SPRITE POLYGON 3D SYSTEM.  ' GOSUB @P3D_STARTUP END ' 'P3D START UP ' @P3D_STARTUP GOSUB @P3D_SET_GVAR GOSUB @P3D_LOGO RETURN ' 'SETUP GLOBAL VARIABLES ' @P3D_SET_GVAR OPTION STRICT VAR gP3D_DISP%=0 'DISPLAY(0=UPPER,1=LOWER) VAR gP3D_SPTOP%=0 'SPRITE TOP NUMBER VAR gP3D_SPEND%=0 'SPRITE END NUMBER VAR gP3D_SPMAX%=0 'SPRITE MAXIMUM VAR gP3D_SPNOW%=0 'SPRITE NOW NUMBER VAR gP3D_SPCNT%=0 'SPRITE COUNTER VAR gP3D_FOVY#=40 'PERSPECTIVE FOVY VAR gP3D_ISLGT%=0 'LIGHT FLAG VAR gP3D_DLC_R#=0 'DIR. LIGHT COLOR R. VAR gP3D_DLC_G#=0 'DIR. LIGHT COLOR G. VAR gP3D_DLC_B#=0 'DIR. LIGHT COLOR B. VAR gP3D_ABC_R#=0 'AMBIENT LIGHT COLOR R. VAR gP3D_ABC_G#=0 'AMBIENT LIGHT COLOR G. VAR gP3D_ABC_B#=0 'AMBIENT LIGHT COLOR B. 'CURRENT MATRIX STACK BUFFER DIM gP3D_CMST#[0] 'P3D MATRIX VARIABLES 'CURRENT MATRIX VAR CM00#=1,CM04#=0,CM08#=0,CM12#=0 VAR CM01#=0,CM05#=1,CM09#=0,CM13#=0 VAR CM02#=0,CM06#=0,CM10#=1,CM14#=0 VAR CM03#=0,CM07#=0,CM11#=0,CM15#=1 'PROJECTION MATIX VAR PM00#=1,PM04#=0,PM08#=0,PM12#=0 VAR PM01#=0,PM05#=1,PM09#=0,PM13#=0 VAR PM02#=0,PM06#=0,PM10#=1,PM14#=0 VAR PM03#=0,PM07#=0,PM11#=0,PM15#=1 'VIEW MATIX VAR VM00#=1,VM04#=0,VM08#=0,VM12#=0 VAR VM01#=0,VM05#=1,VM09#=0,VM13#=0 VAR VM02#=0,VM06#=0,VM10#=1,VM14#=0 VAR VM03#=0,VM07#=0,VM11#=0,VM15#=1 'PROJECTION VIEW MATIX VAR PVM00#=1,PVM04#=0,PVM08#=0,PVM12#=0 VAR PVM01#=0,PVM05#=1,PVM09#=0,PVM13#=0 VAR PVM02#=0,PVM06#=0,PVM10#=1,PVM14#=0 VAR PVM03#=0,PVM07#=0,PVM11#=0,PVM15#=1 'DEPTH RANGE VAR gP3D_HALF_D%=100 'ETC. VAR gP3D_EPSILON#=0.0001 VAR gP3D_LMAX#=800*800 'LIGHT VECTOR VAR gP3D_DLVX#=0,gP3D_DLVY#=0,gP3D_DLVZ#=0 'LOOKAT VECTOR VAR gP3D_LKVX#=0,gP3D_LKVY#=0,gP3D_LKVZ#=0 'SCREEN VARIABLES VAR gP3D_W%=400 'SCREEN WIDTH VAR gP3D_H%=240 'SCREEN HEIGHT VAR gP3D_HALF_W%=gP3D_W%/2 'SCREEN HALF_W VAR gP3D_HALF_H%=gP3D_H%/2 'SCREEN HALF_H RETURN ' 'P3D SYSTEM ' '-------------------------------------------- '[DEF] P3D_DEFAULT_INIT '[IN] SPTOP .. スプライトカイシナンバー '[IN] SPEND .. スプライトエンドナンバー '[IN] DISP .. DISPLAYバンゴウ(0=ウエ、1=シタ) '[IN] FOVY .. スイチョク ガカク '[NOTE] デフォルトセッテイ デ P3Dヲ ショキカ シマス '-------------------------------------------- COMMON DEF P3D_DEFAULT_INIT SPTOP,SPEND,DISP,FOVY P3D_INIT SPTOP,SPEND P3D_DISP DISP P3D_SET_PROJECTION FOVY,1,500 P3D_SET_LIGHT -1,1,1,RGB(255,255,255),RGB(8,8,8) VAR VE[3],VT[3],VU[3] VEC_SET 0, 0,15,VE VEC_SET 0, 0, 0,VT VEC_SET 0, 1, 0,VU P3D_LOOKAT VE,VT,VU END '-------------------------------------------- '[DEF] P3D_INIT '[IN] SPTOP .. スプライトカイシナンバー '[IN] SPEND .. スプライトエンドナンバー '[NOTE] P3Dデ シヨウスル スプライトカンリバンゴウ ヲ シテイ '-------------------------------------------- COMMON DEF P3D_INIT SPTOP,SPEND gP3D_SPTOP%=SPTOP gP3D_SPEND%=SPEND gP3D_SPMAX%=SPEND-SPTOP+1 gP3D_SPCNT%=0 'CREATE TRIANGLE SPRITE P3D_CREATE_POLY_PATTERN 'INITIALIZE SPRITE VAR I% FOR I%=gP3D_SPTOP% TO gP3D_SPEND% SPSET I%,4064 SPHIDE I% NEXT END '-------------------------------------------- '[DEF] P3D_DISP '[IN] DISP .. DISPLAYバンゴウ(0=ウエ、1=シタ) '-------------------------------------------- COMMON DEF P3D_DISP DISP DISPLAY DISP gP3D_DISP%=DISP IF DISP==0 THEN '- UPPER SCREEN - gP3D_W%=400 gP3D_H%=240 ELSE '- LOWER SCREEN - gP3D_W%=320 gP3D_H%=240 ENDIF gP3D_HALF_W%=gP3D_W%/2 gP3D_HALF_H%=gP3D_H%/2 END '-------------------------------------------- '[DEF] P3D_BEGIN_SCENE '[NOTE] ビョウガコマンド ノ ジュンビ ヲ オコナイマス '-------------------------------------------- COMMON DEF P3D_BEGIN_SCENE 'RESET SPRITE COUNTER gP3D_SPCNT%=0 END '-------------------------------------------- '[DEF] P3D_END_SCENE '[NOTE] トウロク サレタ ポリゴン ヲ ヒョウジシマス '-------------------------------------------- COMMON DEF P3D_END_SCENE VAR I%,J% VAR N%=gP3D_SPMAX%-gP3D_SPCNT% IF N%>0 THEN J%=gP3D_SPNOW% FOR I%=0 TO N%-1 SPHIDE J% J%=J%+1 IF J%>gP3D_SPEND% THEN J%=gP3D_SPTOP% NEXT ENDIF END '-------------------------------------------- '[DEF] P3D_GET_PJMTX '[OUT] MO[] .. PROJECTION MATRIX '-------------------------------------------- COMMON DEF P3D_GET_PJMTX MO[] MO[ 0]=PM00# MO[ 1]=PM01# MO[ 2]=PM02# MO[ 3]=PM03# MO[ 4]=PM04# MO[ 5]=PM05# MO[ 6]=PM06# MO[ 7]=PM07# MO[ 8]=PM08# MO[ 9]=PM09# MO[10]=PM10# MO[11]=PM11# MO[12]=PM12# MO[13]=PM13# MO[14]=PM14# MO[15]=PM15# END '-------------------------------------------- '[DEF] P3D_GET_VWMTX '[OUT] MO[] .. VIEW MATRIX '-------------------------------------------- COMMON DEF P3D_GET_VWMTX MO[] MO[ 0]=VM00# MO[ 1]=VM01# MO[ 2]=VM02# MO[ 3]=VM03# MO[ 4]=VM04# MO[ 5]=VM05# MO[ 6]=VM06# MO[ 7]=VM07# MO[ 8]=VM08# MO[ 9]=VM09# MO[10]=VM10# MO[11]=VM11# MO[12]=VM12# MO[13]=VM13# MO[14]=VM14# MO[15]=VM15# END '-------------------------------------------- '[DEF] P3D_GET_PVMTX '[OUT] MO[] .. PROJECTION VIEW MATRIX '-------------------------------------------- COMMON DEF P3D_GET_PVMTX MO[] MO[ 0]=PVM00# MO[ 1]=PVM01# MO[ 2]=PVM02# MO[ 3]=PVM03# MO[ 4]=PVM04# MO[ 5]=PVM05# MO[ 6]=PVM06# MO[ 7]=PVM07# MO[ 8]=PVM08# MO[ 9]=PVM09# MO[10]=PVM10# MO[11]=PVM11# MO[12]=PVM12# MO[13]=PVM13# MO[14]=PVM14# MO[15]=PVM15# END '-------------------------------------------- '[DEF] P3D_CREATE_POLY_PATTERN '-------------------------------------------- COMMON DEF P3D_CREATE_POLY_PATTERN GPAGE 0,4 GFILL 0,480,511,511,0 'DRAW TRIANGLE PATTERN VAR I%,J%,K%,C%,XX#,XN#,U%,V% C%=RGB(255,255,255,255) FOR I%=0 TO 15 XX#=I% XN#=-I%/32 FOR J%=0 TO 31 FOR K%=0 TO J% GPSET I%*32+ROUND(XX#)+K%,480+J%,C% NEXT XX#=XX#+XN# NEXT SPDEF 4064+I%,I%*32,480,32,32,0,32,0 NEXT 'SET H-FLIP TRIANGLE PATTERN FOR I%=15 TO 0 STEP -1 U%=I%*32 V%=480 SPDEF 4095-I%,U%,V%,32,32,0,32,8 NEXT GPAGE 0,0 SPPAGE 4 END '-------------------------------------------- '[DEF] P3D_CREATE_TEXTURE '[IN] SU .. TEX_U POSITION(0~512-SZ) '[IN] SV .. TEX_V POSITION(0~480-SZ) '[IN] SZ .. TEX SIZE(8,16,24,32) '[IN] ID .. SPDEF BEGIN ID '[IN] QF .. QUAD FLAG(1=セイホウケイTEXヲサクセイ) '[IN] AT .. ATTRIBUTE '[NOTE] イメージ ヲ テクスチャマップ ヨウ ニ ヘンカン シマス。 ' 1マイ ニ ツキ SZ*SZ*SZ*3ピクセル シヨウ シマス。 ' セイホウケイ ノ バアイ SZ*SZ*SZ*6ピクセル シヨウ シマス。 '-------------------------------------------- COMMON DEF P3D_CREATE_TEXTURE SU%,SV%,SZ%,ID%,QF%,AT% VAR I%,J%,K%,PX%,PY%,GX%,GY%,XX#,XN# VAR C% VAR SRC%[SZ%,SZ%] GPAGE 0,4 'COPY SOURCE IMAGE FOR J%=0 TO SZ%-1 FOR I%=0 TO SZ%-1 C%=GSPOIT(SU%+I%,SV%+J%) SRC%[I%,J%]=C% NEXT NEXT 'CREATE TEXTURE PX%=SU%:PY%=SV% FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK GFILL PX%,PY%,PX%+SZ%-1,PY%+SZ%-1,0 SPDEF ID%,PX%,PY%,SZ%,SZ%,0,SZ%,AT% ID%=ID%+1 XX#=I% XN#=-I%/SZ% FOR J%=0 TO SZ%-1 GX%=0:GY%=J% FOR K%=0 TO J% C%=SRC%[GX%+K%,GY%] GPSET PX%+ROUND(XX#)+K%,PY%+J%,C% NEXT XX#=XX#+XN# NEXT PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK GFILL PX%,PY%,PX%+SZ%-1,PY%+SZ%-1,0 SPDEF ID%,PX%,PY%,SZ%,SZ%,0,SZ%,AT% ID%=ID%+1 XX#=I% XN#=-I%/SZ% FOR J%=0 TO SZ%-1 GX%=(SZ%-1)-J%:GY%=(SZ%-1)-J% FOR K%=0 TO J% C%=SRC%[GX%,GY%+K%] GPSET PX%+ROUND(XX#)+K%,PY%+J%,C% NEXT XX#=XX#+XN# NEXT PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK GFILL PX%,PY%,PX%+SZ%-1,PY%+SZ%-1,0 SPDEF ID%,PX%,PY%,SZ%,SZ%,0,SZ%,AT% ID%=ID%+1 XX#=I% XN#=-I%/SZ% FOR J%=0 TO SZ%-1 GX%=J%:GY%=(SZ%-1) FOR K%=0 TO J% C%=SRC%[GX%-K%,GY%-K%] GPSET PX%+ROUND(XX#)+K%,PY%+J%,C% NEXT XX#=XX#+XN# NEXT PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT 'CHECK QUAD FLAG IF QF% THEN FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK GFILL PX%,PY%,PX%+SZ%-1,PY%+SZ%-1,0 SPDEF ID%,PX%,PY%,SZ%,SZ%,0,SZ%,AT% ID%=ID%+1 XX#=I% XN#=-I%/SZ% FOR J%=0 TO SZ%-1 GX%=SZ%-1:GY%=(SZ%-1)-J% FOR K%=0 TO J% C%=SRC%[GX%-K%,GY%] GPSET PX%+ROUND(XX#)+K%,PY%+J%,C% NEXT XX#=XX#+XN# NEXT PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK GFILL PX%,PY%,PX%+SZ%-1,PY%+SZ%-1,0 SPDEF ID%,PX%,PY%,SZ%,SZ%,0,SZ%,AT% ID%=ID%+1 XX#=I% XN#=-I%/SZ% FOR J%=0 TO SZ%-1 GX%=J%:GY%=J% FOR K%=0 TO J% C%=SRC%[GX%,GY%-K%] GPSET PX%+ROUND(XX#)+K%,PY%+J%,C% NEXT XX#=XX#+XN# NEXT PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK GFILL PX%,PY%,PX%+SZ%-1,PY%+SZ%-1,0 SPDEF ID%,PX%,PY%,SZ%,SZ%,0,SZ%,AT% ID%=ID%+1 XX#=I% XN#=-I%/SZ% FOR J%=0 TO SZ%-1 GX%=(SZ%-1)-J%:GY%=0 FOR K%=0 TO J% C%=SRC%[GX%+K%,GY%+K%] GPSET PX%+ROUND(XX#)+K%,PY%+J%,C% NEXT XX#=XX#+XN# NEXT PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT ENDIF GPAGE 0,0 SPPAGE 4 END '-------------------------------------------- '[DEF] P3D_SET_HFLIP_TEXTURE '[IN] SU .. TEX_U POSITION(0~512-SZ) '[IN] SV .. TEX_V POSITION(0~480-SZ) '[IN] SZ .. TEX SIZE(8,16,24,32) '[IN] ID .. SPDEF BEGIN ID '[IN] QF .. QUAD FLAG(1=セイホウケイTEXヲサクセイ) '[IN] AT .. ATTRIBUTE '[NOTE] ヘンカンズミテクスチャ カラ サユウハンテン バン ノ ' SPDEF ヲ セッテイ シマス '-------------------------------------------- COMMON DEF P3D_SET_HFLIP_TEXTURE SU%,SV%,SZ%,ID%,QF%,AT% VAR I%,J%,PX%,PY% PX%=SU%:PY%=SV% J%=ID%+SZ%*3-1 FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK SPDEF J%,PX%,PY%,SZ%,SZ%,0,SZ%,8+AT% J%=J%-1 PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK SPDEF J%,PX%,PY%,SZ%,SZ%,0,SZ%,8+AT% J%=J%-1 PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK SPDEF J%,PX%,PY%,SZ%,SZ%,0,SZ%,8+AT% J%=J%-1 PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT 'CHECK QUAD FLAG IF QF% THEN J%=ID%+SZ%*6-1 FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK SPDEF J%,PX%,PY%,SZ%,SZ%,0,SZ%,8+AT% J%=J%-1 PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK SPDEF J%,PX%,PY%,SZ%,SZ%,0,SZ%,8+AT% J%=J%-1 PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT FOR I%=0 TO SZ%-1 IF PY%>480-SZ% THEN BREAK SPDEF J%,PX%,PY%,SZ%,SZ%,0,SZ%,8+AT% J%=J%-1 PX%=PX%+SZ%:IF PX%>512-SZ% THEN PX%=0:PY%=PY%+SZ% NEXT ENDIF END '-------------------------------------------- '[DEF] P3D_LOAD_MODEL '[IN] FN$ .. FILE NAME '[IN] DT .. DATA BUFFER '-------------------------------------------- COMMON DEF P3D_LOAD_MODEL FN$,DT[] VAR MFN$ PUSH MFN$,"DAT:" PUSH MFN$,FN$ PUSH MFN$,"_MDL" LOAD MFN$,DT,FALSE END '-------------------------------------------- '[DEF] P3D_LOAD_TEXTURE '[IN] FN$ .. FILE NAME '-------------------------------------------- COMMON DEF P3D_LOAD_TEXTURE FN$ '-- LOAD TEXDEF -- VAR TDFN$ VAR TDDT[0] PUSH TDFN$,"DAT:" PUSH TDFN$,FN$ PUSH TDFN$,"_TEX" LOAD TDFN$,TDDT,FALSE IF LEN(TDDT)<=0 THEN RETURN 'GET HEADER PARAMETER VAR MGC=TDDT[0] IF MGC!=&H54455800 THEN RETURN VAR TCT=TDDT[1]+1 IF TCT>1 THEN 'GET SPDEF PARAMETER VAR P,TDF,TI,SZ,I,J,U,V,W,H,HX,HY,A P=4 FOR I=1 TO TCT-1 TDF=TDDT[P]:P=P+1 SZ=(TDF >> 16) AND &HFF TI=TDF AND &H0FFF FOR J=0 TO SZ*3-1 U =TDDT[P]:P=P+1 V =TDDT[P]:P=P+1 W =TDDT[P]:P=P+1 H =TDDT[P]:P=P+1 HX =TDDT[P]:P=P+1 HY =TDDT[P]:P=P+1 A =TDDT[P]:P=P+1 SPDEF TI,U,V,W,H,HX,HY,A TI=TI+1 NEXT NEXT ENDIF '-- LOAD IMAGE -- VAR TIFN$ PUSH TIFN$,"GRP4:" PUSH TIFN$,FN$ PUSH TIFN$,"_IMG" LOAD TIFN$,FALSE 'FINISH P3D_CREATE_POLY_PATTERN END ' 'P3D-VECTORMATH  '[AUTHER] Bugtaro  '[NOTE] MATRIX,VECTOR,ETC. LIBRARY  ' ' 'MATRIX DEFS ' '-------------------------------------------- '[DEF] MTX_COPY '[IN] MS[] .. SRC-MATRIX4x4 '[OUT] MD[] .. DST-MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_COPY MS[],MD[] VAR I% FOR I%=0 TO 15 MD[I%]=MS[I%] NEXT END '-------------------------------------------- '[DEF] MTX_IDENTITY '[I/O] M[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_IDENTITY M[] M[ 0]=1:M[ 4]=0:M[ 8]=0:M[12]=0 M[ 1]=0:M[ 5]=1:M[ 9]=0:M[13]=0 M[ 2]=0:M[ 6]=0:M[10]=1:M[14]=0 M[ 3]=0:M[ 7]=0:M[11]=0:M[15]=1 END '-------------------------------------------- '[DEF] MTX_SET_TRANSLATE '[IN] V[] .. VECTOR3 '[OUT] M[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_SET_TRANSLATE V[],M[] M[12]=V[0] M[13]=V[1] M[14]=V[2] END '-------------------------------------------- '[DEF] MTX_GET_TRANSLATE '[IN] M[] .. MATRIX4x4 '[OUT] V[] .. VECTOR3 '-------------------------------------------- COMMON DEF MTX_GET_TRANSLATE M[],V[] V[0]=M[12] V[1]=M[13] V[2]=M[14] END '-------------------------------------------- '[DEF] MTX_SET_ROTATE '[IN] V[] .. VECTOR3 '[IN] R .. RADIAN ANGLE '[OUT] M[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_SET_ROTATE V[],R,M[] VAR NV[3] VEC_NORMALIZE V,NV VAR X=NV[0]:VAR Y=NV[1]:VAR Z=NV[2] VAR C=COS(R) VAR S=SIN(R) VAR T=1-C VAR TXX=T*X*X VAR TXY=T*X*Y VAR TXZ=T*X*Z VAR TYY=T*Y*Y VAR TYZ=T*Y*Z VAR TZZ=T*Z*Z VAR SX=S*X VAR SY=S*Y VAR SZ=S*Z M[ 0]=TXX+C M[ 1]=TXY-SZ M[ 2]=TXZ+SY M[ 3]=0 M[ 4]=TXY+SZ M[ 5]=TYY+C M[ 6]=TYZ-SX M[ 7]=0 M[ 8]=TXZ-SY M[ 9]=TYZ+SX M[10]=TZZ+C M[11]=0 M[12]=0 M[13]=0 M[14]=0 M[15]=1 END '-------------------------------------------- '[DEF] MTX_SET_ROT_X '[IN] R .. RADIAN ANGLE '[OUT] M[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_SET_ROT_X R,M[] VAR V[3] V[0]=1:V[1]=0:V[2]=0 MTX_SET_ROTATE V,R,M END '-------------------------------------------- '[DEF] MTX_SET_ROT_Y '[IN] R .. RADIAN ANGLE '[OUT] M[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_SET_ROT_Y R,M[] VAR V[3] V[0]=0:V[1]=1:V[2]=0 MTX_SET_ROTATE V,R,M END '-------------------------------------------- '[DEF] MTX_SET_ROT_Z '[IN] R .. RADIAN ANGLE '[OUT] M[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_SET_ROT_Z R,M[] VAR V[3] V[0]=0:V[1]=0:V[2]=1 MTX_SET_ROTATE V,R,M END '-------------------------------------------- '[DEF] MTX_TRANSLATE '[IN] V[] .. VECTOR3 '[I/O] M[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_TRANSLATE V[],M[] VAR TX=V[0] VAR TY=V[1] VAR TZ=V[2] M[12]=M[12]+(M[ 0]*TX+M[ 4]*TY+M[ 8]*TZ) M[13]=M[13]+(M[ 1]*TX+M[ 5]*TY+M[ 9]*TZ) M[14]=M[14]+(M[ 2]*TX+M[ 6]*TY+M[10]*TZ) M[15]=M[15]+(M[ 3]*TX+M[ 7]*TY+M[11]*TZ) END '-------------------------------------------- '[DEF] MTX_SCALE '[IN] M[] .. MATRIX4x4 '[IN] V[] .. VECTOR3 '[OUT] O[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_SCALE M[],V[],O[] VAR SX=V[0] VAR SY=V[1] VAR SZ=V[2] O[ 0]=M[ 0]*SX:O[ 4]=M[ 4]*SY:O[ 8]=M[ 8]*SZ O[ 1]=M[ 1]*SX:O[ 5]=M[ 5]*SY:O[ 9]=M[ 9]*SZ O[ 2]=M[ 2]*SX:O[ 6]=M[ 6]*SY:O[10]=M[10]*SZ END '-------------------------------------------- '[DEF] MTX_INVERT '[IN] M[] .. MATRIX4x4 '[OUT] O[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_INVERT M[],O[] ' ' ※INVERT MATRIX REFERENCE SITE  ' stackoverflow Q1148309  ' VAR IV[16] IV[ 0]= M[ 5]*M[10]*M[15]- M[ 5]*M[11]*M[14]- M[ 9]*M[ 6]*M[15]+ M[ 9]*M[ 7]*M[14]+ M[13]*M[ 6]*M[11]- M[13]*M[ 7]*M[10] IV[ 4]=-M[ 4]*M[10]*M[15]+ M[ 4]*M[11]*M[14]+ M[ 8]*M[ 6]*M[15]- M[ 8]*M[ 7]*M[14]- M[12]*M[ 6]*M[11]+ M[12]*M[ 7]*M[10] IV[ 8]= M[ 4]*M[ 9]*M[15]- M[ 4]*M[11]*M[13]- M[ 8]*M[ 5]*M[15]+ M[ 8]*M[ 7]*M[13]+ M[12]*M[ 5]*M[11]- M[12]*M[ 7]*M[ 9] IV[12]=-M[ 4]*M[ 9]*M[14]+ M[ 4]*M[10]*M[13]+ M[ 8]*M[ 5]*M[14]- M[ 8]*M[ 7]*M[13]- M[12]*M[ 5]*M[10]+ M[12]*M[ 7]*M[ 9] IV[ 1]=-M[ 1]*M[10]*M[15]+ M[ 1]*M[11]*M[14]+ M[ 9]*M[ 2]*M[15]- M[ 9]*M[ 3]*M[14]- M[13]*M[ 2]*M[11]+ M[13]*M[ 3]*M[10] IV[ 5]= M[ 0]*M[10]*M[15]- M[ 0]*M[11]*M[14]- M[ 8]*M[ 2]*M[15]+ M[ 8]*M[ 3]*M[14]+ M[12]*M[ 2]*M[11]- M[12]*M[ 3]*M[10] IV[ 9]=-M[ 0]*M[ 9]*M[15]+ M[ 0]*M[11]*M[13]+ M[ 8]*M[ 1]*M[15]- M[ 8]*M[ 3]*M[13]- M[12]*M[ 1]*M[11]+ M[12]*M[ 3]*M[ 9] IV[13]= M[ 0]*M[ 9]*M[14]- M[ 0]*M[10]*M[13]- M[ 8]*M[ 1]*M[14]+ M[ 8]*M[ 2]*M[13]+ M[12]*M[ 1]*M[10]- M[12]*M[ 2]*M[ 9] IV[ 2]= M[ 1]*M[ 6]*M[15]- M[ 1]*M[ 7]*M[14]- M[ 5]*M[ 2]*M[15]+ M[ 5]*M[ 3]*M[14]+ M[13]*M[ 2]*M[ 7]- M[13]*M[ 3]*M[ 6] IV[ 6]=-M[ 0]*M[ 6]*M[15]+ M[ 0]*M[ 7]*M[14]+ M[ 4]*M[ 2]*M[15]- M[ 4]*M[ 3]*M[14]- M[12]*M[ 2]*M[ 7]+ M[12]*M[ 3]*M[ 6] IV[10]= M[ 0]*M[ 5]*M[15]- M[ 0]*M[ 7]*M[13]- M[ 4]*M[ 1]*M[15]+ M[ 4]*M[ 3]*M[13]+ M[12]*M[ 1]*M[ 7]- M[12]*M[ 3]*M[ 5] IV[14]=-M[ 0]*M[ 5]*M[14]+ M[ 0]*M[ 6]*M[13]+ M[ 4]*M[ 1]*M[14]- M[ 4]*M[ 2]*M[13]- M[12]*M[ 1]*M[ 6]+ M[12]*M[ 2]*M[ 5] IV[ 3]=-M[ 1]*M[ 6]*M[11]+ M[ 1]*M[ 7]*M[10]+ M[ 5]*M[ 2]*M[11]- M[ 5]*M[ 3]*M[10]- M[ 9]*M[ 2]*M[ 7]+ M[ 9]*M[ 3]*M[ 6] IV[ 7]= M[ 0]*M[ 6]*M[11]- M[ 0]*M[ 7]*M[10]- M[ 4]*M[ 2]*M[11]+ M[ 4]*M[ 3]*M[10]+ M[ 8]*M[ 2]*M[ 7]- M[ 8]*M[ 3]*M[ 6] IV[11]=-M[ 0]*M[ 5]*M[11]+ M[ 0]*M[ 7]*M[ 9]+ M[ 4]*M[ 1]*M[11]- M[ 4]*M[ 3]*M[ 9]- M[ 8]*M[ 1]*M[ 7]+ M[ 8]*M[ 3]*M[ 5] IV[15]= M[ 0]*M[ 5]*M[10]- M[ 0]*M[ 6]*M[ 9]- M[ 4]*M[ 1]*M[10]+ M[ 4]*M[ 2]*M[ 9]+ M[ 8]*M[ 1]*M[ 6]- M[ 8]*M[ 2]*M[ 5] VAR DET=M[0]*IV[0]+M[1]*IV[4]+M[2]*IV[8]+M[3]*IV[12] IF DET==0 THEN RETURN VAR I% FOR I%=0 TO 15 O[I%]=IV[I%]/DET NEXT END '-------------------------------------------- '[DEF] MTX_TRANSPOSE '[I/O] M[] .. MATRIX4x4 '-------------------------------------------- COMMON DEF MTX_TRANSPOSE M[] SWAP M[ 1],M[ 4] SWAP M[ 2],M[ 8] SWAP M[ 3],M[12] SWAP M[ 6],M[ 9] SWAP M[ 7],M[13] SWAP M[11],M[14] END '-------------------------------------------- '[DEF] MTX_ADD '[IN] M1[] .. MATRIX4x4 '[IN] M2[] .. MATRIX4x4 '[OUT] MO[] .. MATRIX4x4 '[NOTE] MO=M1+M2 '-------------------------------------------- COMMON DEF MTX_ADD M1[],M2[],MO[] VAR I% FOR I%=0 TO 15 MO[I%]=M1[I%]+M2[I%] NEXT END '-------------------------------------------- '[DEF] MTX_SUB '[IN] M1[] .. MATRIX4x4 '[IN] M2[] .. MATRIX4x4 '[OUT] MO[] .. MATRIX4x4 '[NOTE] MO=M1-M2 '-------------------------------------------- COMMON DEF MTX_SUB M1[],M2[],MO[] VAR I% FOR I%=0 TO 15 MO[I%]=M1[I%]-M2[I%] NEXT END '-------------------------------------------- '[DEF] MTX_MUL '[IN] M1[] .. MATRIX4x4 '[IN] M2[] .. MATRIX4x4 '[OUT] MO[] .. MATRIX4x4 '[NOTE] MO=M1*M2 '-------------------------------------------- COMMON DEF MTX_MUL M1[],M2[],MO[] VAR M00,M04,M08,M12 VAR M01,M05,M09,M13 VAR M02,M06,M10,M14 VAR M03,M07,M11,M15 VAR N00,N04,N08,N12 VAR N01,N05,N09,N13 VAR N02,N06,N10,N14 VAR N03,N07,N11,N15 M00=M1[ 0]:M04=M1[ 4]:M08=M1[ 8]:M12=M1[12] M01=M1[ 1]:M05=M1[ 5]:M09=M1[ 9]:M13=M1[13] M02=M1[ 2]:M06=M1[ 6]:M10=M1[10]:M14=M1[14] M03=M1[ 3]:M07=M1[ 7]:M11=M1[11]:M15=M1[15] N00=M2[ 0]:N04=M2[ 4]:N08=M2[ 8]:N12=M2[12] N01=M2[ 1]:N05=M2[ 5]:N09=M2[ 9]:N13=M2[13] N02=M2[ 2]:N06=M2[ 6]:N10=M2[10]:N14=M2[14] N03=M2[ 3]:N07=M2[ 7]:N11=M2[11]:N15=M2[15] MO[00]=M00*N00+M04*N01+M08*N02+M12*N03 MO[01]=M01*N00+M05*N01+M09*N02+M13*N03 MO[02]=M02*N00+M06*N01+M10*N02+M14*N03 MO[03]=M03*N00+M07*N01+M11*N02+M15*N03 MO[04]=M00*N04+M04*N05+M08*N06+M12*N07 MO[05]=M01*N04+M05*N05+M09*N06+M13*N07 MO[06]=M02*N04+M06*N05+M10*N06+M14*N07 MO[07]=M03*N04+M07*N05+M11*N06+M15*N07 MO[08]=M00*N08+M04*N09+M08*N10+M12*N11 MO[09]=M01*N08+M05*N09+M09*N10+M13*N11 MO[10]=M02*N08+M06*N09+M10*N10+M14*N11 MO[11]=M03*N08+M07*N09+M11*N10+M15*N11 MO[12]=M00*N12+M04*N13+M08*N14+M12*N15 MO[13]=M01*N12+M05*N13+M09*N14+M13*N15 MO[14]=M02*N12+M06*N13+M10*N14+M14*N15 MO[15]=M03*N12+M07*N13+M11*N14+M15*N15 END ' 'VECTOR DEFS ' '-------------------------------------------- '[DEF] VEC_SET '[IN] VX .. X '[IN] VY .. Y '[IN] VZ .. Z '[OUT] V[] .. VECTOR3 '-------------------------------------------- COMMON DEF VEC_SET VX,VY,VZ,V[] V[0]=VX V[1]=VY V[2]=VZ END '-------------------------------------------- '[DEF] VEC_COPY '[IN] VS[] .. SRC-VECTOE3 '[OUT] VD[] .. DST-VECTOR3 '-------------------------------------------- COMMON DEF VEC_COPY VS[],VD[] VD[0]=VS[0] VD[1]=VS[1] VD[2]=VS[2] END '-------------------------------------------- '[DEF] VEC_ADD '[IN] V1[] .. VECTOE3 '[IN] V2[] .. VECTOR3 '[OUT] VO[] .. VECTOR3 '[NOTE] VO=V1+V2 '-------------------------------------------- COMMON DEF VEC_ADD V1[],V2[],VO[] VO[0]=V1[0]+V2[0] VO[1]=V1[1]+V2[1] VO[2]=V1[2]+V2[2] END '-------------------------------------------- '[DEF] VEC_SUB '[IN] V1[] .. VECTOE3 '[IN] V2[] .. VECTOR3 '[OUT] VO[] .. VECTOR3 '[NOTE] VO=V1-V2 '-------------------------------------------- COMMON DEF VEC_SUB V1[],V2[],VO[] VO[0]=V1[0]-V2[0] VO[1]=V1[1]-V2[1] VO[2]=V1[2]-V2[2] END '-------------------------------------------- '[DEF] VEC_SCALE '[IN] V[] .. VECTOE3 '[IN] S .. SCALE '[OUT] VO[] .. VECTOR3 '[NOTE] VO=V*S '-------------------------------------------- COMMON DEF VEC_SCALE V[],S,VO[] VO[0]=V[0]*S VO[1]=V[1]*S VO[2]=V[2]*S END '-------------------------------------------- '[DEF] VEC_NORMALIZE '[IN] V[] .. VECTOR3 '[OUT] VO[] .. VECTOR3 '-------------------------------------------- COMMON DEF VEC_NORMALIZE V[],VO[] VAR X=V[0]:VAR Y=V[1]:VAR Z=V[2] VAR L=SQR(X*X+Y*Y+Z*Z) IF L>0 THEN VO[0]=X/L VO[1]=Y/L VO[2]=Z/L ELSE VO[0]=0 VO[1]=0 VO[2]=0 ENDIF END '-------------------------------------------- '[DEF] VEC_FAST_NORMALIZE '[IN] IX,IY,IZ .. VECTOR3 '[OUT] OX,OY,OZ .. VECTOR3 '-------------------------------------------- COMMON DEF VEC_FAST_NORMALIZE IX,IY,IZ OUT OX,OY,OZ VAR L=SQR(IX*IX+IY*IY+IZ*IZ) IF L>0 THEN OX=IX/L OY=IY/L OZ=IZ/L ELSE OX=0 OY=0 OZ=0 ENDIF END '-------------------------------------------- '[DEF] VEC_CROSS '[IN] V1[] .. VECTOR3 '[IN] V2[] .. VECTOR3 '[OUT] VO[] .. VECTOR3 '-------------------------------------------- COMMON DEF VEC_CROSS V1[],V2[],VO[] VAR VX=V1[1]*V2[2]-V1[2]*V2[1] VAR VY=V1[2]*V2[0]-V1[0]*V2[2] VAR VZ=V1[0]*V2[1]-V1[1]*V2[0] VO[0]=VX:VO[1]=VY:VO[2]=VZ END '-------------------------------------------- '[DEF] VEC_FAST_CROSS '[IN] V1X,V1Y,V1Z .. VECTOR3 '[IN] V2X,V2Y,V2Z .. VECTOR3 '[OUT] OX,OY,OZ .. VECTOR3 '-------------------------------------------- COMMON DEF VEC_FAST_CROSS V1X,V1Y,V1Z,V2X,V2Y,V2Z OUT OX,OY,OZ OX=V1Y*V2Z-V1Z*V2Y OY=V1Z*V2X-V1X*V2Z OZ=V1X*V2Y-V1Y*V2X END '-------------------------------------------- '[DEF] VEC_DOT '[IN] V1[] .. VECTOR3 '[IN] V2[] .. VECTOR3 '[RET] DOT PRODUCT '-------------------------------------------- COMMON DEF VEC_DOT(V1[],V2[]) RETURN (V1[0]*V2[0]+V1[1]*V2[1]+V1[2]*V2[2]) END '-------------------------------------------- '[DEF] VEC_EQUAL '[IN] V1[] .. VECTOR3 '[IN] V2[] .. VECTOR3 '[RET] 0=FALSE/1=TRUE '-------------------------------------------- COMMON DEF VEC_EQUAL(V1[],V2[]) IF V1[0]==V2[0] && V1[1]==V2[1] && V1[2]==V2[2] THEN RETURN 1 RETURN 0 END '-------------------------------------------- '[DEF] VEC_LENGTH '[IN] V[] .. VECTOR3 '[RET] LENGTH '-------------------------------------------- COMMON DEF VEC_LENGTH(V[]) RETURN SQR(V[0]*V[0]+V[1]*V[1]+V[2]*V[2]) END '-------------------------------------------- '[DEF] VEC_LENGTH2 '[IN] V[] .. VECTOR3 '[RET] LENGTH2 '-------------------------------------------- COMMON DEF VEC_LENGTH2(V[]) RETURN (V[0]*V[0]+V[1]*V[1]+V[2]*V[2]) END '-------------------------------------------- '[DEF] VEC_TRANSFORM_V '[IN] V[] .. VECTOR3 '[IN] M[] .. MATRIX4x4 '[OUT] VO[] .. VECTOR3 '-------------------------------------------- COMMON DEF VEC_TRANSFORM_V V[],M[],VO[] VAR VX=V[0]*M[0]+V[1]*M[4]+V[2]*M[8] VAR VY=V[0]*M[1]+V[1]*M[5]+V[2]*M[9] VAR VZ=V[0]*M[2]+V[1]*M[6]+V[2]*M[10] VO[0]=VX:VO[1]=VY:VO[2]=VZ END '-------------------------------------------- '[DEF] VEC_TRANSFORM_P '[IN] P[] .. POINT3 '[IN] M[] .. MATRIX4x4 '[OUT] PO[] .. POINT3 '-------------------------------------------- COMMON DEF VEC_TRANSFORM_P P[],M[],PO[] VAR VX=P[0]*M[0]+P[1]*M[4]+P[2]*M[8]+M[12] VAR VY=P[0]*M[1]+P[1]*M[5]+P[2]*M[9]+M[13] VAR VZ=P[0]*M[2]+P[1]*M[6]+P[2]*M[10]+M[14] PO[0]=VX:PO[1]=VY:PO[2]=VZ END '-------------------------------------------- '[DEF] VEC_TRANSFORM_V4 '[IN] V[] .. VECTOR4 '[IN] M[] .. MATRIX4x4 '[OUT] VO[] .. VECTOR4 '-------------------------------------------- COMMON DEF VEC_TRANSFORM_V4 V[],M[],VO[] VAR VX=V[0]*M[0]+V[1]*M[4]+V[2]*M[8]+V[3]*M[12] VAR VY=V[0]*M[1]+V[1]*M[5]+V[2]*M[9]+V[3]*M[13] VAR VZ=V[0]*M[2]+V[1]*M[6]+V[2]*M[10]+V[3]*M[14] VAR VW=V[0]*M[3]+V[1]*M[7]+V[2]*M[11]+V[3]*M[15] VO[0]=VX:VO[1]=VY:VO[2]=VZ:VO[3]=VW END ' 'PROJECTION VIEW DEFS ' '-------------------------------------------- '[DEF] P3D_SET_PROJECTION '[IN] FOVY .. スイチョク ガカク '[IN] NEAR .. ニアクリップ '[IN] FAR .. ファークリップ '-------------------------------------------- COMMON DEF P3D_SET_PROJECTION FOVY,NEAR,FAR VAR ASP=gP3D_W%/gP3D_H% VAR S=NEAR*TAN(RAD(FOVY/2)) VAR R=S*ASP VAR L=-R VAR T=S VAR B=-T VAR N2=NEAR*2 VAR D=FAR-NEAR gP3D_FOVY#=FOVY gP3D_HALF_D%=D/2 PM00#=N2/(R-L) PM01#=0 PM02#=0 PM03#=0 PM04#=0 PM05#=N2/(T-B) PM06#=0 PM07#=0 PM08#=(R+L)/(R-L) PM09#=(T+B)/(T-B) PM10#=-(FAR+NEAR)/D PM11#=-1 PM12#=0 PM13#=0 PM14#=-2*FAR*NEAR/D PM15#=0 END '-------------------------------------------- '[DEF] P3D_LOOKAT '[IN] VE[] .. VECTOR3 シテン ザヒョウ '[IN] VT[] .. VECTOR3 チュウシテン ザヒョウ '[IN] VU[] .. VECTOR3 アップベクトル '-------------------------------------------- COMMON DEF P3D_LOOKAT VE[],VT[],VU[] VAR AX[3],AY[3],AZ[3] VEC_SUB VT,VE,AZ VEC_NORMALIZE AZ,AZ gP3D_LKVX#=AZ[0] gP3D_LKVY#=AZ[1] gP3D_LKVZ#=AZ[2] VEC_CROSS AZ,VU,AX VEC_NORMALIZE AX,AX VEC_CROSS AX,AZ,AY VM00#=AX[0] VM04#=AX[1] VM08#=AX[2] VM12#=0 VM01#=AY[0] VM05#=AY[1] VM09#=AY[2] VM13#=0 VM02#=-AZ[0] VM06#=-AZ[1] VM10#=-AZ[2] VM14#=0 VM03#=0 VM07#=0 VM11#=0 VM15#=1 VAR TX,TY,TZ TX=-VE[0] TY=-VE[1] TZ=-VE[2] VM12#=VM12#+(VM00#*TX+VM04#*TY+VM08#*TZ) VM13#=VM13#+(VM01#*TX+VM05#*TY+VM09#*TZ) VM14#=VM14#+(VM02#*TX+VM06#*TY+VM10#*TZ) VM15#=VM15#+(VM03#*TX+VM07#*TY+VM11#*TZ) 'UPDATE PROJECTION VIEW MATRIX P3D_CALC_PVMTX END '-------------------------------------------- '[DEF] P3D_FAST_LOOKAT '[IN] EX,EY,EZ .. シテン ザヒョウ '[IN] LX,LY,LZ .. チュウシテン ザヒョウ '[NOTE] アップベクトル ハ(0,1,0)コテイ デス '-------------------------------------------- COMMON DEF P3D_FAST_LOOKAT EX,EY,EZ,LX,LY,LZ VAR AXX,AXY,AXZ VAR AYX,AYY,AYZ VAR AZX,AZY,AZZ AZX=LX-EX:AZY=LY-EY:AZZ=LZ-EZ VEC_FAST_NORMALIZE AZX,AZY,AZZ OUT AZX,AZY,AZZ gP3D_LKVX#=AZX gP3D_LKVY#=AZY gP3D_LKVZ#=AZZ VEC_FAST_CROSS AZX,AZY,AZZ,0,1,0 OUT AXX,AXY,AXZ VEC_FAST_NORMALIZE AXX,AXY,AXZ OUT AXX,AXY,AXZ VEC_FAST_CROSS AXX,AXY,AXZ,AZX,AZY,AZZ OUT AYX,AYY,AYZ VM00#=AXX VM04#=AXY VM08#=AXZ VM12#=0 VM01#=AYX VM05#=AYY VM09#=AYZ VM13#=0 VM02#=-AZX VM06#=-AZY VM10#=-AZZ VM14#=0 VM03#=0 VM07#=0 VM11#=0 VM15#=1 VAR TX,TY,TZ TX=-EX TY=-EY TZ=-EZ VM12#=VM12#+(VM00#*TX+VM04#*TY+VM08#*TZ) VM13#=VM13#+(VM01#*TX+VM05#*TY+VM09#*TZ) VM14#=VM14#+(VM02#*TX+VM06#*TY+VM10#*TZ) VM15#=VM15#+(VM03#*TX+VM07#*TY+VM11#*TZ) 'UPDATE PROJECTION VIEW MATRIX P3D_CALC_PVMTX END '-------------------------------------------- '[DEF] P3D_CALC_PVMTX '[NOTE] プロジェクションビューマトリクス ノ ケイサン '-------------------------------------------- COMMON DEF P3D_CALC_PVMTX PVM00#=PM00#*VM00#+PM04#*VM01#+PM08#*VM02#+PM12#*VM03# PVM01#=PM01#*VM00#+PM05#*VM01#+PM09#*VM02#+PM13#*VM03# PVM02#=PM02#*VM00#+PM06#*VM01#+PM10#*VM02#+PM14#*VM03# PVM03#=PM03#*VM00#+PM07#*VM01#+PM11#*VM02#+PM15#*VM03# PVM04#=PM00#*VM04#+PM04#*VM05#+PM08#*VM06#+PM12#*VM07# PVM05#=PM01#*VM04#+PM05#*VM05#+PM09#*VM06#+PM13#*VM07# PVM06#=PM02#*VM04#+PM06#*VM05#+PM10#*VM06#+PM14#*VM07# PVM07#=PM03#*VM04#+PM07#*VM05#+PM11#*VM06#+PM15#*VM07# PVM08#=PM00#*VM08#+PM04#*VM09#+PM08#*VM10#+PM12#*VM11# PVM09#=PM01#*VM08#+PM05#*VM09#+PM09#*VM10#+PM13#*VM11# PVM10#=PM02#*VM08#+PM06#*VM09#+PM10#*VM10#+PM14#*VM11# PVM11#=PM03#*VM08#+PM07#*VM09#+PM11#*VM10#+PM15#*VM11# PVM12#=PM00#*VM12#+PM04#*VM13#+PM08#*VM14#+PM12#*VM15# PVM13#=PM01#*VM12#+PM05#*VM13#+PM09#*VM14#+PM13#*VM15# PVM14#=PM02#*VM12#+PM06#*VM13#+PM10#*VM14#+PM14#*VM15# PVM15#=PM03#*VM12#+PM07#*VM13#+PM11#*VM14#+PM15#*VM15# END '-------------------------------------------- '[DEF] P3D_CALC_POLY_NORM '[IN] P1[] .. POINT3 '[IN] P2[] .. POINT3 '[IN] P3[] .. POINT3 '[OUT] VO[] .. VECTOR3 '[NOTE] ポリゴン ノ ホウセン ヲ ケイサン '-------------------------------------------- COMMON DEF P3D_CALC_POLY_NORM P1[],P2[],P3[],VO[] VAR T1[3],T2[3],N[3] VEC_SUB P2,P1,T1 VEC_SUB P3,P1,T2 VEC_CROSS T1,T2,N VEC_NORMALIZE N,N VO[0]=N[0] VO[1]=N[1] VO[2]=N[2] END '-------------------------------------------- '[DEF] P3D_CALC_SCREEN '[IN] PI[] .. POINT3 '[OUT] PO[] .. POINT3 '[NOTE] ワールドザヒョウ ヲ スクリーンザヒョウ ニ ヘンカン '-------------------------------------------- COMMON DEF P3D_CALC_SCREEN PI[],PO[] VAR PTX,PTY,PTZ PTX=PI[0] PTY=PI[1] PTZ=PI[2] VAR VX=(PTX*PVM00#)+(PTY*PVM04#)+(PTZ*PVM08#)+PVM12# VAR VY=(PTX*PVM01#)+(PTY*PVM05#)+(PTZ*PVM09#)+PVM13# VAR VZ=(PTX*PVM02#)+(PTY*PVM06#)+(PTZ*PVM10#)+PVM14# VAR VW=(PTX*PVM03#)+(PTY*PVM07#)+(PTZ*PVM11#)+PVM15# VAR W=FLOOR(VW*100)*0.01 IF W THEN VX=VX/W VY=VY/W VZ=VZ/W ELSE VX=0 VY=0 VZ=0 ENDIF PO[0]=VX*gP3D_HALF_W%+gP3D_HALF_W% PO[1]=-VY*gP3D_HALF_H%+gP3D_HALF_H% PO[2]=VZ*gP3D_HALF_D%+gP3D_HALF_D% END '-------------------------------------------- '[DEF] P3D_FAST_CALC_SCREEN '[IN] IX,IY,IZ .. POINT3 '[OUT] OX,OY,OZ,OW .. POINT4 '[NOTE] ワールドザヒョウ ヲ スクリーンザヒョウ ニ ヘンカン '-------------------------------------------- COMMON DEF P3D_FAST_CALC_SCREEN IX,IY,IZ OUT OX,OY,OZ,OW VAR VX#=(IX*PVM00#)+(IY*PVM04#)+(IZ*PVM08#)+PVM12# VAR VY#=(IX*PVM01#)+(IY*PVM05#)+(IZ*PVM09#)+PVM13# VAR VZ#=(IX*PVM02#)+(IY*PVM06#)+(IZ*PVM10#)+PVM14# VAR VW#=(IX*PVM03#)+(IY*PVM07#)+(IZ*PVM11#)+PVM15# IF VW# THEN VX#=VX#/VW# VY#=VY#/VW# VZ#=VZ#/VW# ELSE VX#=0 VY#=0 VZ#=0 ENDIF OX=VX#*gP3D_HALF_W%+gP3D_HALF_W% OY=-VY#*gP3D_HALF_H%+gP3D_HALF_H% OZ=VZ#*gP3D_HALF_D%+gP3D_HALF_D% OW=VW# END '-------------------------------------------- '[DEF] P3D_CALC_WORLD '[IN] PI[] .. POINT3 '[OUT] PO[] .. POINT3 '[NOTE] スクリーンザヒョウ ヲ ワールドザヒョウ ニ ヘンカン '-------------------------------------------- COMMON DEF P3D_CALC_WORLD PI[],PO[] VAR X=gP3D_HALF_W% VAR Y=gP3D_HALF_H% VAR Z=gP3D_HALF_D% VAR PTX,PTY,PTZ,M[16],IPVM[16] PTX=(PI[0]-X)/X PTY=-(PI[1]-Y)/Y PTZ=(PI[2]-Z)/Z P3D_GET_PVMTX M MTX_INVERT M,IPVM VAR VX=(PTX*IPVM[0])+(PTY*IPVM[4])+(PTZ*IPVM[8])+IPVM[12] VAR VY=(PTX*IPVM[1])+(PTY*IPVM[5])+(PTZ*IPVM[9])+IPVM[13] VAR VZ=(PTX*IPVM[2])+(PTY*IPVM[6])+(PTZ*IPVM[10])+IPVM[14] VAR VW=(PTX*IPVM[3])+(PTY*IPVM[7])+(PTZ*IPVM[11])+IPVM[15] VAR W=FLOOR(VW*1000)*0.001 IF W THEN PO[0]=VX/W PO[1]=VY/W PO[2]=VZ/W ENDIF END '-------------------------------------------- '[DEF] P3D_SCALE_MODEL '[IN] SL .. SCALE '[IN] DT[] .. MODEL DATA '[NOTE] P3Dモデル ノ チョウテンデータ ヲ ジゼン ニ スケーリング シマス '-------------------------------------------- COMMON DEF P3D_SCALE_MODEL SL,DT[] VAR I%,J% VAR VCT% VCT%=DT[1] 'GET VERTEX COUNT 'CALC SCALE VERTEX DATA J%=4 FOR I%=0 TO VCT%-1 DT[J%]=DT[J%]*SL DT[J%+1]=DT[J%+1]*SL DT[J%+2]=DT[J%+2]*SL J%=J%+4 NEXT END '-------------------------------------------- '[DEF] P3D_CLONE_MODEL '[IN] DT[] .. MODEL DATA '[IN] CD[] .. CLONE DATA BUFFER '[NOTE] P3Dモデル ノ クローン ヲ サクセイ シマス '-------------------------------------------- COMMON DEF P3D_CLONE_MODEL DT[],CD[] VAR LN%=LEN(DT) VAR I% FOR I%=0 TO LN%-1 PUSH CD,DT[I%] NEXT END ' 'LIGHTING DEFS ' '-------------------------------------------- '[DEF] P3D_SET_LIGHT '[IN] LX .. POSITION X '[IN] LY .. POSITION Y '[IN] LZ .. POSITION Z '[IN] LC .. LIGHT COLOR(RGB) '[IN] AC .. AMBIENT COLOR(RGB) '[NOTE] ヘイコウコウゲン ト アンビエントカラー ノ セッテイ '-------------------------------------------- COMMON DEF P3D_SET_LIGHT LX,LY,LZ,LC,AC 'CALC LIGHT VECTOR VAR L=SQR(LX*LX+LY*LY+LZ*LZ) IF L>0 THEN gP3D_DLVX#=LX/L gP3D_DLVY#=LY/L gP3D_DLVZ#=LZ/L ELSE gP3D_DLVX#=0 gP3D_DLVY#=0 gP3D_DLVZ#=-1 ENDIF 'SET AMBIENT COLOR gP3D_ABC_R#=((AC>>16) AND 255) gP3D_ABC_G#=((AC>>8) AND 255) gP3D_ABC_B#=(AC AND 255) 'SET DIRECTIONAL LIGHT COLOR gP3D_DLC_R#=(((LC>>16) AND 255)-gP3D_ABC_R#)/255 gP3D_DLC_G#=(((LC>>8) AND 255)-gP3D_ABC_G#)/255 gP3D_DLC_B#=((LC AND 255)-gP3D_ABC_B#)/255 'ENABLED LIGHT SWITCH gP3D_ISLGT%=1 END '-------------------------------------------- '[DEF] P3D_LIGHT_SWITCH '[IN] SWT .. ライト スイッチ(1=ON/0=OFF) '-------------------------------------------- COMMON DEF P3D_LIGHT_SWITCH SWT gP3D_ISLGT%=SWT END '-------------------------------------------- '[DEF] P3D_BAKE_LIGHT '[IN] DT[] .. MODEL DATA '[NOTE] ライティングコウカ ヲ ヤキツケマス '-------------------------------------------- COMMON DEF P3D_BAKE_LIGHT DT[] VAR I%,J% VAR VCT%,PCT% VCT%=DT[1] 'GET VERTEX COUNT PCT%=DT[2] 'GET POLYGON COUNT 'SKIP VERTEX DATA J%=VCT%*4+4 'GET INDEX,NORMAL,COLOR DATA VAR NX,NY,NZ,CL VAR D,L,AA,RR,GG,BB FOR I%=0 TO PCT%-1 'NORMAL NX=DT[J%+3] NY=DT[J%+4] NZ=DT[J%+5] 'SET BAKE FLAG DT[J%+7]=DT[J%+7] OR &H8000 'CALC COLOR CL=DT[J%+6] AA=(CL AND &HFF000000) RR=(CL>>16) AND 255 GG=(CL>>8) AND 255 BB=CL AND 255 IF AA THEN 'CALC LIGHTING D=(NX*gP3D_DLVX#+NY*gP3D_DLVY#+NZ*gP3D_DLVZ#) L=(D+1)/2 RR=RR*gP3D_DLC_R#*L+gP3D_ABC_R# GG=GG*gP3D_DLC_G#*L+gP3D_ABC_G# BB=BB*gP3D_DLC_B#*L+gP3D_ABC_B# CL=(RR<<16)+(GG<<8)+BB+AA ENDIF 'OUTPUT COLOR DT[J%+6]=CL 'NEXT J%=J%+10 NEXT END ' 'DRAW DEFS ' '-------------------------------------------- '[DEF] P3D_DRAW_TRIANGLE '[IN] V1[] .. SCREEN POINT3 '[IN] V2[] .. SCREEN POINT3 '[IN] V3[] .. SCREEN POINT3 '[IN] N[] .. VECTOR3(POLY NORMAL) '[IN] CL .. COLOR(ARGB) '[IN] TI .. TEXDEF ID '[IN] ST .. SORT TYPE(0=CENT,1=NEAR,2=FAR) '[RET] 1=DRAW/0=NO DRAW '[NOTE] スクリーンザヒョウ デ トライアングル ヲ 1マイヒョウジ '-------------------------------------------- COMMON DEF P3D_DRAW_TRIANGLE(V1[],V2[],V3[],N[],CL%,TI%,ST%) VAR SC%=gP3D_SPNOW% VAR S1X#,S1Y#,S1Z# VAR S2X#,S2Y#,S2Z# VAR S3X#,S3Y#,S3Z# VAR NMX#,NMY#,NMZ# VAR T1X#,T1Y# VAR T2X#,T2Y# VAR T3X#,T3Y# VAR L1#,L2#,L3#,NZ#,PT# VAR X#,Y#,Z#,R#,D#,LI# VAR A%,O%,AA%,RR%,GG%,BB% VAR TSZ%,TXF% IF TI% THEN TSZ%=(TI%>>16) TI%=TI% AND &HFFF TXF%=1 ELSE TI%=4064 TSZ%=32 TXF%=0 ENDIF S1X#=V1[0]:S1Y#=V1[1]:S1Z#=V1[2] S2X#=V2[0]:S2Y#=V2[1]:S2Z#=V2[2] S3X#=V3[0]:S3Y#=V3[1]:S3Z#=V3[2] ON ST% GOTO @PDT_S00,@PDT_S01,@PDT_S02 @PDT_S00 Z#=(S1Z#+S2Z#+S3Z#)/3 GOTO @PDT_S03 @PDT_S01 Z#=MIN(S1Z#,S2Z#,S3Z#) GOTO @PDT_S03 @PDT_S02 Z#=MAX(S1Z#,S2Z#,S3Z#) @PDT_S03 IF Z#<-255 || Z#>1024 THEN RETURN 0 'VEC_SUB ヲ インラインテンカイ T1X#=S2X#-S1X# T1Y#=S2Y#-S1Y# 'VEC_SUB ヲ インラインテンカイ T2X#=S3X#-S2X# T2Y#=S3Y#-S2Y# 'VEC_SUB ヲ インラインテンカイ T3X#=S1X#-S3X# T3Y#=S1Y#-S3Y# L1#=(T1X#*T1X#+T1Y#*T1Y#) L2#=(T2X#*T2X#+T2Y#*T2Y#) L3#=(T3X#*T3X#+T3Y#*T3Y#) IF L1#*L2#*L3#==0 THEN RETURN 0 A%=(L1# Posted Edited by Lumage