HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0910
ひろかずhgimg3のhgrotate命令で奇数サイズのコピーが出来ません6解決


ひろかず

リンク

2019/9/10(Tue) 23:27:57|NO.88404

hgimg3で使用出来る画像コピー命令であるhgrotateですが、奇数サイズのコピーが
出来なくて困っております。
例えば15x15ドットの画像をコピーした場合、14x14ドットでコピーされてしまいます。
これはバグなのでしょうか? それとも仕様なのでしょうか?

HSP命令リファレンスを読むと、hgrotateの説明文には
「hgrotate命令は、標準命令のgrotate命令と同じ動作をHGIMG3の画面に対して行ないます。」
と明記されています。

しかしながら、grotate命令では奇数サイズのコピーは全く問題無く出来ております。
やはり、バグという解釈でよろしいのでしょうか?

よろしくお願い申し上げます。



この記事に返信する


法貴優雅

リンク

2019/9/11(Wed) 18:49:45|NO.88406

私の環境では、特にそういった現象は見られないですね。
下記スクリプトを実行しても、サイズが14x14になるのでしょうか?

#include "hgimg3.as" hgini buffer 1, 16, 16, 0 repeat 8 if ((cnt \ 3) == 0):color 255, 0, 0 if ((cnt \ 3) == 1):color 0, 255, 0 if ((cnt \ 3) == 2):color 0, 0, 255 boxf cnt, cnt, 15 - cnt, 15 -cnt loop settex 16, 16, 0, -1 TEX = stat screen 0, 640, 480, 0 clscolor 0x000000 *main hgdraw pos 320, 240 n = 15 // サイズ gmode 2, n, n hgrotate TEX, 0, 0, 0.0f, n * 8, n * 8 // 見やすくするため8倍している hgsync 0 await (1000 / 60) goto *main



暇人

リンク

2019/9/11(Wed) 20:09:07|NO.88407

あぁ、忘れてたけどそんな問題があったな・・・

描画されたサイズが必ず偶数になる
これはhgrectや2Dスプライトでも同様
特に偶数固定の説明も無いのでバグだと思ってる・・・


作ってる物によっては使えるか分からないけど
addplateのモデルを2D表示っぽく使う事は出来る
こっちは1ドット単位で表示可能だけど
hgrotateみたいに直接スクリーン座標を指定できる訳じゃない・・・



法貴優雅

リンク

2019/9/11(Wed) 20:40:33|NO.88408

失礼しました、私の環境でも偶数になっていました。
拡大したら意味がなかったのですね、すいません。



ひろかず

リンク

2019/9/12(Thu) 22:24:51|NO.88415

>>法貴優雅さん
>>暇人さん

 検証、及びご返信頂き、誠に有り難うございます。
やはりバグなんですね。了解いたしました。

作者のおにたまさんには、HSP 3.6の開発でお忙しいかとは思いますが、
可能であれば修正をお願いしたいと思います。

何卒、ご検討の程、よろしくお願い申し上げます。



暇人

リンク

2019/9/16(Mon) 16:54:00|NO.88437

hgrotateと同様の使い方が出来るdxgrotate命令を追加するモジュール
hgimg3側に登録したテクスチャをdxgrotateで使用するには
RegDxTexidで予めIDを登録する必要が有る以外同じ使い方が出来る。

追加される命令、マクロ
>RegDxTexid dx_tid ;HGIMG3側で確保したテクスチャをdxgrotate用にIDを登録
>GetDxTexSizeX() ;RegDxTexidで登録したIDを使用してテクスチャのサイズ取得
>GetDxTexSizeY() ;RegDxTexidで登録したIDを使用してテクスチャのサイズ取得
>dxgrotate dx_tid ,lux ,luy ,rz ,csx ,csy ,dif ;矩形画像の直接描画


#include "hgimg3.as" //hgimg3の命令が使われているのでhgimg3.asの下に配置 #module "dx8_grot" //このモジュールは一部d3dx9_39.dllの命令を使用しています。 //そのため最低一回はDirectXの更新が必要です↓。(OSインストールやPC購入後一回してればOK) //https://www.microsoft.com/ja-jp/download/details.aspx?id=35& #uselib "d3dx9_39.dll" #func D3DXMatrixLookAtLH "D3DXMatrixLookAtLH" int,int,int,int #func D3DXMatrixPerspectiveFovLH "D3DXMatrixPerspectiveFovLH" int,float,float,float,float #func D3DXMatrixRotationX "D3DXMatrixRotationX" int,float #func D3DXMatrixRotationY "D3DXMatrixRotationY" int,float #func D3DXMatrixRotationZ "D3DXMatrixRotationZ" int,float #func D3DXMatrixScaling "D3DXMatrixScaling" int,float,float,float #func D3DXMatrixMultiply "D3DXMatrixMultiply" int,int,int #usecom IDirect3DDevice8 "{7385E5DF-8FE8-41D5-86B6-D7B48547B6CF}" #comfunc IDirect3DDevice8_AddRef 1 #comfunc IDirect3DDevice8_BeginScene 34 #comfunc IDirect3DDevice8_EndScene 35 #comfunc IDirect3DDevice8_CreateVertexBuffer 23 int,int,int,int,int #comfunc IDirect3DDevice8_CreateIndexBuffer 24 int,int,int,int,int #comfunc IDirect3DDevice8_SetTransform 37 int,int #comfunc IDirect3DDevice8_SetRenderState 50 int,int #comfunc IDirect3DDevice8_GetRenderState 51 int,var #comfunc IDirect3DDevice8_SetTexture 61 int,comobj #comfunc IDirect3DDevice8_DrawPrimitive 70 int,int,int #comfunc IDirect3DDevice8_DrawPrimitiveUP 72 int,int,int,int #comfunc IDirect3DDevice8_SetVertexShader 76 int,int #comfunc IDirect3DDevice8_SetStreamSource 83 int,comobj,int #comfunc IDirect3DDevice8_SetIndices 85 comobj,int #comfunc IDirect3DDevice8_DrawIndexedPrimitive 71 int,int,int,int,int #usecom IID_IDirect3D8 "{1DD9E8DA-1C77-4d40-B0CF-98FEFDFF9512}" #comfunc IDirect3D8_AddRef 1 #usecom IID_IDirect3DTexture8 "{E4CDD575-2866-4f01-B12E-7EECE1EC9358}" #comfunc IDirect3DTexture8_AddRef 1 #usecom IID_IDirect3DVertexBuffer8 "{8AEEEAC7-05F9-44d4-B591-000B0DF1CB95}" #comfunc IDirect3DVertexBuffer8_Lock 11 int,int,int,int #comfunc IDirect3DVertexBuffer8_UnLock 12 #usecom IID_IDirect3DIndexBuffer8 "{0E689C9A-053D-44a0-9D92-DB0E3D750F86}" #comfunc IDirect3DIndexBuffer8_QueryInterface 0 int,int #comfunc IDirect3DIndexBuffer8_AddRef 1 #comfunc IDirect3DIndexBuffer8_Release 2 #comfunc IDirect3DIndexBuffer8_GetDevice 3 int #comfunc IDirect3DIndexBuffer8_SetPrivateData 4 int,int,int,int #comfunc IDirect3DIndexBuffer8_GetPrivateData 5 int,int,int #comfunc IDirect3DIndexBuffer8_FreePrivateData 6 int #comfunc IDirect3DIndexBuffer8_SetPriority 7 int #comfunc IDirect3DIndexBuffer8_GetPriority 8 #comfunc IDirect3DIndexBuffer8_PreLoad 9 #comfunc IDirect3DIndexBuffer8_GetType 10 #comfunc IDirect3DIndexBuffer8_Lock 11 int,int,int,int #comfunc IDirect3DIndexBuffer8_Unlock 12 #uselib "User32.dll" #func setFloat4 "SetRect" var,float,float,float,float #define MAX_PARTICLES 4 //[---モジュールの初期化---最初のRegDxTexid実行時にこの命令が使用されるので通常は実行する必要なし] //dx8_grot_init@dx8_grot //必ずhginiの後に実行 #deffunc local dx8_grot_init if dx8_grot_init_f=0 { dx8_grot_init_f=1 hggetreq ret,SYSREQ_PTRD3D newcom g_pd3d, , -1, ret IDirect3D8_AddRef g_pd3d hggetreq ret,SYSREQ_PTRD3DDEV newcom g_pd3dDev, , -1, ret IDirect3DDevice8_AddRef g_pd3dDev //HGIMG3側のRelease回数と数が合わなくなるっぽいので増やしとく dupptr dup_ptrd3ddev,ret,4*25,4 //デバイスのメモリを直接参照用 hggetreq TEXTID_MAX,SYSREQ_MAXTEX dim float4,4 dup float_0,float4(0) dup float_1,float4(1) dup float_2,float4(2) dup float_3,float4(3) mref BMSCR,67 dupptr dup_color,varptr(BMSCR(40)),4,4 dupptr dup_gmode_m,varptr(BMSCR(35)),4,4 dupptr dup_gmode_x,varptr(BMSCR(33)),4,4 dupptr dup_gmode_y,varptr(BMSCR(34)),4,4 dupptr dup_gmode_a,varptr(BMSCR(65)),4,4 dupptr dup_cpx,varptr(BMSCR(27)),4,4 dupptr dup_cpy,varptr(BMSCR(28)),4,4 dim blend_emode,5,10 blend_emode(0,0)=1,0,5,6,0 blend_emode(0,1)=1,0,5,6,0 blend_emode(0,2)=1,1,5,6,1 blend_emode(0,3)=1,1,5,6,1 blend_emode(0,4)=1,1,5,6,1 blend_emode(0,5)=1,1,5,2,1 blend_emode(0,6)=1,1,1,6,1 blend_emode(0,7)=0,0,5,6,1 dim phgText,TEXTID_MAX dimtype com_hgText,6,TEXTID_MAX dim tex_sizex,TEXTID_MAX dim tex_sizey,TEXTID_MAX ddim tex_dotx,TEXTID_MAX ddim tex_doty,TEXTID_MAX #define global D3DFVF_XYZ 0x002 #define global D3DFVF_DIFFUSE 0x040 #define global D3DFVF_SPECULAR 0x080 #define global D3DFVF_TEX1 0x100 #define global D3DFVF_XYZRHW 0x004 #define global D3DFVF ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 ) argbp=4 D3DFVF_size=((argbp+1+2)*4) fvf_l=D3DFVF_size/4 dim particle, fvf_l * MAX_PARTICLES } return //RegDxTexidで登録したIDを使用してテクスチャのサイズ取得 // Size = GetDxTexSizeX(dx_tid) #define global ctype GetDxTexSizeX(%1) tex_sizex@dx8_grot(%1) #define global ctype GetDxTexSizeY(%1) tex_sizey@dx8_grot(%1) //[一番最近作成されたテクスチャに対してのみ有効] // 「HGIMG3側で確保したテクスチャ(XファイルモデルのテクスチャもOK)をdxgrotate用にIDを登録」 //RegDxTexid dx_tid // dx_tid =登録するID //登録が成功したら1、0は登録出来るテクスチャが無かった、-1はデバイスロストかIDが登録出来ない数値だった #define global RegDxTexid(%1) _RegDxTexid %1 #deffunc _RegDxTexid int dx_tid if dx8_grot_init_f=0 {dx8_grot_init@dx8_grot} hggetreq DevLost,SYSREQ_DEVLOST if DevLost<0 or dx_tid<0 or dx_tidcnt>=TEXTID_MAX {return -1} ptrd3ddev_adl=dup_ptrd3ddev(14) Exist_id=phgText(dx_tid)>0 add_id=0 repeat dup_ptrd3ddev(11) if ptrd3ddev_adl=0{break} dupptr dup_ptrd3ddev_adl,ptrd3ddev_adl,4*30,4 if dup_ptrd3ddev_adl(18)>0 and dup_ptrd3ddev_adl(7)>0 and (dup_ptrd3ddev_adl(21)>=20 and dup_ptrd3ddev_adl(21)<=34){ _phgText=ptrd3ddev_adl+18*4 add_id=1 phgText(dx_tid)=_phgText newcom com_hgText(dx_tid), , -1, phgText(dx_tid) IDirect3DTexture8_AddRef com_hgText(dx_tid) tex_sizex(dx_tid)=dup_ptrd3ddev_adl(27) tex_sizey(dx_tid)=dup_ptrd3ddev_adl(28) tex_dotx(dx_tid)=1.0/tex_sizex(dx_tid) tex_doty(dx_tid)=1.0/tex_sizey(dx_tid) dx_tid_list(textidcnt)=dx_tid if Exist_id=0 { dx_tid_list(textidcnt)=dx_tid:textidcnt++} break } ptrd3ddev_adl=dup_ptrd3ddev_adl(14) await 0 loop return add_id //dxgrotate dx_tid ,lux ,luy ,rz ,csx ,csy ,dif // dx_tid=0〜(0) : RegDxTexidで登録したテクスチャID // lux=0〜(0) : コピー元の左上X座標 // luy=0〜(0) : コピー元の左上Y座標 // rz=0〜(0.0): 回転角度(単位はラジアン) // csx=0〜(?) : Xサイズ(省略時gmodeのコピーする大きさX) // csy=0〜(?) : Yサイズ(省略時gmodeのコピーする大きさY) // dif=0〜1(0) : 1の時に標準命令の color を頂点色として使用(gmode2以上はgmodeのp4も有効になる) //テクスチャIDがRegDxTexidで登録したIDを使用する以外使い方は hgrotate と同じ //hgrotateと違い奇数サイズも表示可能 //半透明やパラメータ省略時の動作も同じにしたつもり //但しgmode7はテクスチャのアルファ値0以外を不透明として描画 #define global dxgrotate(%1,%2=0.0,%3=0.0,%4=0.0,%5=dup_gmode_x@dx8_grot,%6=dup_gmode_y@dx8_grot,%7=0) _dxgrotate %1,%2,%3,%4,%5,%6,%7 #deffunc _dxgrotate int dx_tid,double lux,double luy,double rz,int csx,int csy,int dif if dx8_grot_init_f=0 {RegDxTexid dx_tid:if stat<=0 {dialog "使用できるテクスチャが\n登録されていません":end}} fvset fvlu,0.0,0.0,-rz fvdir fvlu,-0.5*csx,-0.5*csy,0.0 fvset fvld,0.0,0.0,-rz fvdir fvld,-0.5*csx,0.5*csy,0.0 setFloat4 particle ,fvlu+dup_cpx,fvlu(1)+dup_cpy,0.0,1.0 setFloat4 particle(fvf_l) ,fvld+dup_cpx,fvld(1)+dup_cpy,0.0,1.0 setFloat4 particle(fvf_l*2),-fvlu+dup_cpx,-fvlu(1)+dup_cpy,0.0,1.0 setFloat4 particle(fvf_l*3),-fvld+dup_cpx,-fvld(1)+dup_cpy,0.0,1.0 dup dup_tex_dotx,tex_dotx(dx_tid) dup dup_tex_doty,tex_doty(dx_tid) stu=dup_tex_dotx*lux stv=dup_tex_doty*luy setFloat4 float4, stu,stv, dup_tex_dotx*dup_gmode_x+stu,dup_tex_doty*dup_gmode_y+stv if dif { poke argb,0,peek(dup_color,2) poke argb,1,peek(dup_color,1) poke argb,2,peek(dup_color,0) poke argb,3,dup_gmode_a }else{ if dup_gmode_m>2 {argb=(dup_gmode_a<<24) | $ffffff}else{argb=$ffffffff} } particle(argbp) =argb,float_0,float_1 particle(fvf_l +argbp) =argb,float_0,float_3 particle(fvf_l*2+argbp)=argb,float_2,float_3 particle(fvf_l*3+argbp)=argb,float_2,float_1 dup blend_emode_dup,blend_emode(0,dup_gmode_m) IDirect3DDevice8_SetRenderState g_pd3dDev,171,blend_emode_dup //D3DRS_BLENDOP IDirect3DDevice8_SetRenderState g_pd3dDev,27,blend_emode_dup(1) //D3DRS_ALPHABLENDENABLE IDirect3DDevice8_SetRenderState g_pd3dDev,19,blend_emode_dup(2) //D3DRS_SRCBLEND IDirect3DDevice8_SetRenderState g_pd3dDev,20,blend_emode_dup(3) //D3DRS_DESTBLEND IDirect3DDevice8_SetRenderState g_pd3dDev,15,blend_emode_dup(4) //D3DRS_ALPHATESTENABLE IDirect3DDevice8_SetTexture g_pd3dDev, 0, com_hgText(dx_tid) IDirect3DDevice8_SetVertexShader g_pd3dDev,D3DFVF IDirect3DDevice8_DrawPrimitiveUP g_pd3dDev, 6, 2,varptr(particle),D3DFVF_size return #deffunc dx8_grot_exit onexit repeat textidcnt if vartype(com_hgText(dx_tid_list(cnt)))== 6 {delcom com_hgText(dx_tid_list(cnt))} loop return #global *main hgsetreq SYSREQ_FPUPRESERVE,1 hgini texload dir_exe+"\\sample\\hgimg3\\chrome.bmp" tid=stat //一番最近texload等(addxfile,texmake等も含む)でテクスチャ登録された物にdxgrotate用のIDを登録します RegDxTexid tid //dxgrotateで使用できるようにID登録(IDはhg側のものと同じにする必要は無い) texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ftid=stat RegDxTexid ftid //dxgrotateで使用できるようにID登録 f="HGIMG3 dxgrotate test" repeat strlen(f) a(cnt)=cnt*10 loop clscolor $4444 *_Main hgdraw stick k,127 if k&128 : goto *_Exit ; [ESC]で終了 gmode 0,63,64,255 //横奇数サイズ指定 pos 320,240+20 dxgrotate tid pos 320,240-20 gmode 6,63,64,255 //1ドット足りないのが見やすいように色減算合成モード hgrotate tid //頂点色変更テスト pos 50,50 gmode 2,16,16,a(cnt) r=-0.5 repeat strlen(f) gmode 2,16,16,a(cnt) a(cnt)-- r+0.05 color rnd(255),rnd(255),rnd(255) pos 40+cnt*28,100 dxgrotate ftid,(peek(f,cnt)\16)*16,(peek(f,cnt)/16)*16,r,48,48,1 loop hgsync 16 goto *_Main *_Exit end

hgrotateよりは重いので毎フレーム数百回使用すると
負荷の違いが問題になるかも・・・



ひろかず

リンク

2019/9/17(Tue) 00:09:42|NO.88441

>>暇人さん
モジュールを作成して頂き、誠に有り難うございます。
早速実行し、奇数サイズのコピーが出来る事を確認しました。

サンプルプログラムが付いていたので使用法もすぐに理解する事が出来ました。
有り難うございました。感謝申し上げます。



ONION software Copyright 1997-2021(c) All rights reserved.