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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1216
youdaiHGIMG4の.xmlをXMLパーサーで読み込みたい1未解決


youdai

リンク

2021/12/16(Thu) 18:58:17|NO.94711

●HGIMG4の.xmlをXMLパーサーで読み込みたい

HSP3.6に添付されているHGIMG4の GPB converter ver.0.6 から出力された3Dのジオメトリが記述された.xmlを、
XMLパーサーを使ってHSP3上で読み込みたいと思いました。

(HGIMG4のGPBの.xmlはHGIMG4ツールの「構造をXMLに出力」をチェックしてFBXを変換すると出力できます)

XMLパーサーをHSP3から使用する方法については、HSP3の同梱モジュールの mod_rss.as がサンプルになると思うのですが、
これは名前の通り、rss用のモジュールで、多目的には設計されていないようなのです。

mod_rss.as


#ifndef __mod_rss__ #define __mod_rss__ #module "rssmod" #deffunc rssload array _v1, array _v2, str _p1, int _p2 ; ; XMLパーサー(MSXML)を使用してRSSを読み込む ; rssload 変数1,変数2,パス,個数 ; ; 変数1,2 = 文字列型配列変数として結果が代入されます ; (変数1はRSSの内容、変数2はリンク先) ; パス = URLまたはファイルパスを指定します ; 個数 = 読み込むRSSフィールドの数を指定します ; (0または省略時は5個になります) ; newcom oDom,"Microsoft.XMLDOM" oDom("async")="FALSE" ; 同期読み込みを行う oDom->"load" _p1 oRoot = oDom("documentElement") if varuse(oRoot)=0 : return 1 rsstag = getpath(""+oRoot("tagName"),16) if rsstag="rdf:rdf" : goto *rsspick if rsstag="rss" : goto *rsspick delcom oRoot delcom oDom return *rsspick maxnum=_p2 if maxnum<=0 : maxnum=5 comres elm_ch oDom->"getElementsByTagName" "title" comres elm_link oDom->"getElementsByTagName" "link" max=elm_ch("length") if max>maxnum : max=maxnum sdim _v1, 64, max sdim _v2, 64, max repeat max i=cnt node = elm_ch("item",i) node2 = node("firstChild") _v1.i = node2("nodeValue") node = elm_link("item",i) node2 = node("firstChild") _v2.i = node2("nodeValue") loop delcom node delcom node2 delcom elm_ch delcom elm_link delcom oRoot delcom oDom return 0 #global #endif

これをGPB converter ver.0.6から出力される.xmlを読み込むためのパーサーにスクリプトを改造できないでしょうか?

例えば、頂点についてのタグは、<vertices></vertices>であるようです。
形式としては


<vertices count=頂点数> // position vec3(x,y,z) // normal vec3(x,y,z) // texCoord vec2(s,t) // blendWeights vec4(x,y,z,w) // blendIndices vec4(x,y,z,w) </vertices>

という順序で羅列されているように読めます。
//という部分はおそらくコメント行で、区切り記号は半角スペースなのか、改行なのかはよく分かりませんでした。

これを例えば、要素ごとに整数変数や実数型配列変数へ出力できないでしょうか?
頂点数ならcount、positionならposition、nomalならnormal用の配列変数へ、という具合にです。

アドバイスお願い致します。



この記事に返信する


youdai

リンク

2021/12/17(Fri) 15:43:00|NO.94715

まだ命令の体裁ではありませんが、参考になるかもしれないので作成途中の命令を載せます。
対象の.xmlの詳細資料が存在しないため、手探りの段階です。

タグの名前と、属性の名前を#defineで羅列してあります。


/* 対象の.xmlの構造について 大まかな構造 root <root> <RefTable></RefTable> <Mesh></Mesh> <Scene></Scene> <Animations id="__Animations__"></Animations> </root> 構造が混みあっていて、解析が難しい。 詳細の資料は存在しないが、ソースであれば恐らく、Gameplay3DのGithubに存在する。 今のところ、HGIMG4にとって何が何についての値なのかは不明。 */ #module "mod_gpbxml" ; tagの名前 ; 対象の.xmlの構造資料が存在しないため、出力した.xmlファイルを直接観察して名前を羅列した #define TAG_NAME_ROOT "root" #define TAG_NAME_REFTABLE "RefTable" #define TAG_NAME_REFERENCE "Reference" #define TAG_NAME_XREF "xref" #define TAG_NAME_TYPE "type" #define TAG_NAME_OFFSET "offset" #define TAG_NAME_MESH "Mesh" #define TAG_NAME_VERTEXELEMENT "VertexElement" #define TAG_NAME_USAGE "usage" #define TAG_NAME_SIZE "size" #define TAG_NAME_VERTICES "vertices" #define TAG_NAME_BOUNDS "bounds" #define TAG_NAME_MIN "min" #define TAG_NAME_MAX "max" #define TAG_NAME_CENTER "center" #define TAG_NAME_MESHPART "MeshPart" #define TAG_NAME_PRIMITIVETYPE "primitiveType" #define TAG_NAME_INDEXFORMAT "indexFormat" #define TAG_NAME_INDICES "indices" #define TAG_NAME_SCENE "Scene" #define TAG_NAME_NODE "Node" #define TAG_NAME_TRANSFORM "transform" #define TAG_NAME_MODEL "Model" #define TAG_NAME_MESHSKIN "MeshSkin" #define TAG_NAME_BINDSHAPE "bindShape" #define TAG_NAME_JOINTS "joints" #define TAG_NAME_BINDPOSES "bindPoses" #define TAG_NAME_MATERIAL "material" #define TAG_NAME_AMBIENTCOLOR "ambientColor" #define TAG_NAME_ANIMATIONS "Animations" #define TAG_NAME_ANIMATION "Animation" ; TAG_NAME_ANIMATIONS とは別のtag名であることに注意 #define TAG_NAME_ANIMATIONCHANNEL "AnimationChannel" #define TAG_NAME_TARGETID "targetId" #define TAG_NAME_TARGETATTRIB "targetAttrib" #define TAG_NAME_KEYTIMES "keytimes" #define TAG_NAME_VALUES "values" #define TAG_NAME_TANGENTSIN "tangentsIn" #define TAG_NAME_TANGENTSOUT "tangentsOut" #define TAG_NAME_INTERPOLATIONS "interpolations" ; 属性の名前 #define ATTRIBUTE_NAME_ID "id" #define ATTRIBUTE_NAME_COUNT "count" #define ATTRIBUTE_NAME_TYPE "type" ; マクロ #define getAttribute(%1) oDom->"getAttribute" %1 #define getAttributeNode(%1) oDom->"getAttributeNode" %1 #define getElementsByTagName(%1) oDom->"getElementsByTagName" %1 #define getNamedItem(%1) oDom->"getNamedItem" %1 #define domLoad(%1) oDom->"load" %1 #define domAsync(%1) oDom("async")= %1 /* #modinit str u_filename exist u_filename : filesize strsize if filesize == -1 : dialog "対象のxmlファイルが存在しません", 1, "mod_gpbxml error" newcom oDom,"Microsoft.XMLDOM" domAsync "FALSE" ; 同期読み込みを行う domLoad u_filename return */ #global



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