obaqme.hsp

sample\obaq\obaqme.hsp » Plain Format

#include "obaq.as"
#include "hspda.as"

#packopt name "obaqme"

	;	OBAQ Model Editor
	;	onitama 2009/12-
	;
	goto *boot


#deffunc toolinit

	maxdata=256
	wx=800:wy=448+64
	tlx=640:tly=0
	dvx=16:dvy=16
	bgid=4
	toolmsg="Ready."

	dim fl,maxdata
	dim ax,maxdata
	dim ay,maxdata
	dim az,maxdata
	dim acol,maxdata
	aent=0
	aedit=0

	buffer bgid,tlx,wy
	color 0,0,64:boxf
	ix=tlx/dvx:iy=wy/dvy
	repeat iy
	if cnt&3 : color 64,64,255 : else : color 64,160,255
	y=cnt*dvy:boxf 0,y,tlx,y
	loop
	repeat ix
	if cnt&3 : color 64,64,255 : else : color 64,160,255
	x=cnt*dvx:boxf x,0,x,wy
	loop

	centerx=20
	centery=16
	cenx=centerx*dvx
	ceny=centery*dvy
	color 255,0,0
	circle cenx-4,ceny-4,cenx+4,ceny+4

	return

#deffunc tooldraw

	redraw 0
	pos 0,0:gmode 0,tlx,wy:gcopy bgid
	syscolor 15
	boxf tlx,tly,wx,tly+64
	color 0,0,0:sysfont 17:pos tlx+8,tly+8
	mes toolmsg

	color 255,255,255
	i=0:x=-1:y=-1:fx=-2:fy=-2
	repeat
	if i>=aent : break

	xx=ax(i):yy=ay(i)
	i++
	if x>=0 {
		line x,y,xx,yy
		if (fx=xx)&(fy=yy) : xx=-1
	} else{
		fx=xx:fy=yy	; 始点
	}
	x=xx:y=yy

	loop

	color 255,255,255
	if curx<tlx {
		boxf curx-4,cury-4,curx+4,cury+4
	}

	redraw 1
	return

#deffunc toolcnv var myid

	ddim mdldata,1024
	i=0
	repeat aent
		mdldata(i)=(ax(cnt)-cenx)/dvx
		i++
		mdldata(i)=(ay(cnt)-ceny)/dvy
		i++
	loop

	qaddmodel myid, mdldata, i, 96.0, 20.0, 0.0, 1.0, 1.0, colsw_none

	return

	;-----------------------------------------------------------------------

#deffunc qvxcnv str _qvbfn

	qvxmax=aent*2
	dim mdldata,qvxmax
	qvxent=0
	repeat aent
		mdldata(qvxent)=(ax(cnt)-cenx)/dvx
		qvxent++
		mdldata(qvxent)=(ay(cnt)-ceny)/dvy
		qvxent++
	loop
	bsave _qvbfn,mdldata,qvxent*4
	return

	;-----------------------------------------------------------------------

*boot
	;	ウインドゥサイズの設定
	;
	screen 0,640,480,0
	cls 4
	title "Sample"

	;	初期設定
	;
	toolinit
	screen 1,wx,wy,0
	title "OBAQ Model Editor ver0.1"
	syscolor 15
	boxf tlx,tly,wx,wy

	objsize 120,24
	pos tlx+16,tly+120
	color 0,0,0:sysfont 17

	button "TEST",*execobaq
	button gosub "SAVE",*datasave
	button gosub "LOAD",*dataload
	button gosub "CONVERT",*cnvbuild
	mes "\n※左回りで作成してください\n"
	button "END",*owari

	modflag=0

*toolmain
	if ginfo_act!=1 : goto *noact

	stick key,$40
	if invclk {			; クリック無視
		if ( key&$300 ) {
			tooldraw
			goto *noact
		}
		invclk=0
	}

	if key&$40 {
		if modflag=0 : gosub *chkae
		toolmsg="Modify #"+aedit
		if key&4 {
			aedit++
			if aedit>=aent : aedit--
		}
		if key&$1 {
			aedit--
			if aedit<0 : aedit=0
		}
		if key&$100 : gosub *editaxis
		if key&$200 : gosub *delaxis
		curx=ax(aedit)
		cury=ay(aedit)
		modflag=1
	} else {
		curx=mousex/dvx*dvx
		cury=mousey/dvy*dvy
		toolmsg="Add #"+aent
		if key&$100 : gosub *regaxis
		modflag=0
	}

	tooldraw
*noact
	await 12			; 時間待ち
	goto *toolmain

*chkae
	x=mousex/dvx*dvx
	y=mousey/dvy*dvy
	i=0
	repeat
	if i>=aent : break
	if (ax(i)=x)&(ay(i)=y) : aedit=i
	i++
	loop
	return

*regaxis
	if curx>=tlx : return
	ax(aent)=curx
	ay(aent)=cury
	az(aent)=0
	aent++
	return
*editaxis
	curx=mousex/dvx*dvx
	cury=mousey/dvy*dvy
	if curx>=tlx : return
	ax(aedit)=curx
	ay(aedit)=cury
	az(aedit)=0
	return
*delaxis
	x=mousex/dvx*dvx
	y=mousey/dvy*dvy
	if x!=curx|y!=cury : return
	i=aedit
	repeat
	if i>=aent : break
	ax(i)=ax(i+1)
	ay(i)=ay(i+1)
	az(i)=az(i+1)
	i++
	loop
	aent--
	return

*cnvbuild
	invclk=1
	dialog "qvb",17,"QVB Data"
	if stat=0 : return
	fname = refstr
	exname=getpath(fname,2)		; ファイル名の拡張子を取得
	if exname="" : fname+=".qvb"	; 拡張子がなければ追加
	;
	qvxcnv fname
	;
	dialog "["+getpath(fname,8)+"]を保存しました"
	;
	return

*datasave
	invclk=1
	dialog "qvd",17,"OBAQ Vector Data"
	if stat=0 : return
	fname = refstr
	exname=getpath(fname,2)		; ファイル名の拡張子を取得
	if exname="" : fname+=".qvd"	; 拡張子がなければ追加
	;
	vsave_start
	vsave_put aent
	vsave_put fl
	vsave_put ax
	vsave_put ay
	vsave_put az
	vsave_put acol
	vsave_end fname
	;
	return

*dataload
	invclk=1
	dialog "qvd",16,"OBAQ Vector Data"
	if stat=0 : return
	fname = refstr
	;
	vload_start fname
	vload_get aent
	vload_get fl
	vload_get ax
	vload_get ay
	vload_get az
	vload_get acol
	vload_end
	;
	return

*execobaq
	invclk=1
	gsel 0,1
	qreset			; OBAQの初期化
	rot = 0.0
	toolcnv my

*main
	;	描画メイン
	;
	if ginfo_act=1 : gsel 1 : goto *toolmain

	redraw 0		; 画面の更新を開始
	color 0,0,0:boxf	; 画面をクリア
	qexec			; OBAQによるオブジェクトの更新
	qdraw			; オブジェクトの描画
	redraw 1		; 画面の更新を終了
	await 12		; 一定時間待つ
	goto *main

*owari
	end