<?xml version="1.0" encoding="UTF-8"?>
<X3D>
<Scene>
<Viewpoint/>
<NavigationInfo
type='"EXAMINE"'
/>
<!-- 箱 -->
<Group>
<Shape>
<Appearance>
<PixelTexture DEF='PT'/>
<Material diffuseColor='1 1 1'/>
</Appearance>
<Box size='5 5 5'/>
</Shape>
<TouchSensor DEF='ThS'/>
</Group>
<!-- 点描画スクリプト -->
<Script DEF='Sc'>
<field accessType='inputOnly' type='SFVec2f' name='set_hitTexCoord'/>
<field accessType='inputOnly' type='SFBool' name='penUpDowned'/>
<field accessType='outputOnly' type='SFImage' name='image'/>
<field accessType='initializeOnly' type='SFInt32' name='dt' value='64'/>
<field accessType='initializeOnly' type='MFInt32' name='ary'/>
<field accessType='initializeOnly' type='SFVec2f' name='hitPoint' value='0 0'/>
<field accessType='initializeOnly' type='SFInt32' name='penColor' value='16776960'/> <!-- value='0xFFFF00' -->
<field accessType='initializeOnly' type='SFInt32' name='bgColor' value='255'/> <!-- value='0x0000FF' -->
<![CDATA[ecmascript:
// SFVec2fオブジェクトで示されたテクスチャー座標に penColor を適応させる為の関数。
function pset(v) {
var tv = v.multiply ( dt );
var s = Math.floor( tv.x );
var t = Math.floor( tv.y );
s = Math.max ( 0, Math.min( dt - 1, s ));
t = Math.max ( 0, Math.min( dt - 1, t ));
ary[ s + t * dt ] = penColor;
}
function initialize () {
var px = dt * dt;
// テクスチャー全体を bgColor で塗りつぶして、ary を初期化する。
for ( var i = 0; i < px; i++ ) ary[i] = bgColor;
image = new SFImage ( dt, dt, 3, ary );
}
function set_hitTexCoord (v) {
// キャンバス上のポインタが触れている座標を hitPoint にセットする。
hitPoint = v;
}
function penUpDowned (active) {
if (active) {
// キャンバス上でポインタのボタンが押されたら、ポインタの座標に点を描く。
pset( hitPoint );
image = new SFImage ( dt, dt, 3, ary );
}
}
]]>
</Script>
<ROUTE fromNode='Sc' fromField='image' toNode='PT' toField='image'/>
<ROUTE fromNode='ThS' fromField='hitTexCoord_changed' toNode='Sc' toField='set_hitTexCoord'/>
<ROUTE fromNode='ThS' fromField='isActive' toNode='Sc' toField='penUpDowned'/>
</Scene>
</X3D>