xsample_gcube.hsp

sample\d3module\xsample_gcube.hsp » Plain Format

;============================================================
;                                                 2006/--/--
	title "S.Programs Glass-Cube"
;	version 1.0/sample_ver
;                               http://sprocket.babyblue.jp/
;============================================================
/*
・Glass-Cube

ガラスのキューブがバウンドしながら転がっていく様子を描画します。
単一のオブジェクトをローカル座標変換して、回転させたり、鏡像にしたり、影にしたりして描画しています。

↑/↓ : キューブの回転速度の増減
[Enter] : フルスクリーン切り替え
[Esc] : 終了

*/

#include "d3m.hsp"

;============================================================
;	main
;============================================================

;------------------------------------------------------------
; init
	ve = 200.0
	po = 0.0

	t_start = d3timer()


;------------------------------------------------------------
*mainloop


	;------------------------------------------------------------
	; full-screen ctrlr (toggle : Enter)

	stick ky_inp, 15
	if ky_inp & 128 : end
	if ky_inp & 32 {
		mode_fsc ^= 1
		chgdisp mode_fsc ; (default : 640, 480)
		if mode_fsc {
			bgscr 2
			gsel 2, 2
			mouse -1
		} else {
			gsel 2, -1
			gsel
			mouse
		}
	}


	;------------------------------------------------------------
	; timers

	sec = 0.001 * d3timer()
	dt  = sec - ot
	ot  = sec

	; a-v-p
	ve += dt * 100 * ((ky_inp=2)-(ky_inp=8))
	po += dt * ve

	; uso バウンド
	h  = absf(sin(sec))

	; starting-efct divisor
	div = (d3timer() - t_start + 1000)


	;------------------------------------------------------------
	; drw init

	redraw 0
	color : boxf
;	gmode 6, , , 128 : gcopy 0, , , ginfo_winx, ginfo_winy
	hsvcolor sec, 128, 224 - 224000 / div


	;------------------------------------------------------------
	; setcam

	r = 3000000 / div + 700

	d3setcam cos(sec/5)*r, sin(sec/5)*r, sin(sec/6)*300 + r/2,  0,0,h*140


	;------------------------------------------------------------
	; global
	repeat 16
		x = ((cnt * 64 + po) & 1023) - 512
		repeat 16
			y = cnt * 64 - 512

			r = h * 150 + 400
			a = (1.0 - 0.4 * h) * ( (r-sqrt(x*x + y*y)) / r) * (rnd(160) + 160)
			if a > 0 {
				r = 28
				x0 = x-r, x+r, x+r, x-r
				y0 = y-r, y-r, y+r, y+r
				z0 =   0,   0,   0,   0

				gmode 5, , , a
				d3square  x0, y0, z0
			}

		loop
	loop


	;------------------------------------------------------------
	; local object
	repeat 3
		randomize 0

		if cnt = 0 {
			; shadow
			alp = sqrt(h) * 0.1
			gm  = 6
			rr  = h * 0.5 + 1
			zz  = -0.05
		}
		if cnt = 1 {
			; reflex
			alp = 0.3 - h * 0.2
			gm  = 5
			rr  = 1
			zz  = -0.9
		}
		if cnt = 2 {
			; real
			alp = 1
			zz  = 1
		}

		r0 = 64 : r1 = 58 : r2 = 4

		; set local
		th = -po / 170
		d3setlocal 0,0,(h*300 + 70)*zz,  sin(th)*rr,0,cos(th)*rr,  0,rr,0,  cos(th)*zz,0,-sin(th)*zz

		; glass-cube
		repeat 2
			z = r0 * (cnt*2-1), z, z, z

			repeat 4
				s1 = (cnt\2*2-1)
				s2 = (cnt/2*2-1)

				x = r2*s1, r2*s1, r1*s1, r1*s1
				y = r2*s2, r1*s2, r1*s2, r2*s2

				gmode gm, , , alp * (rnd(160) + 96)
				d3square  x, y, z
				d3square  z, x, y
				d3square  y, z, x
			loop
		loop
	loop


	;------------------------------------------------------------
	redraw
	await ;10

	goto *mainloop