drowing_1_00.x3d source
<?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='128'/>
<field accessType='initializeOnly' type='MFInt32' name='ary'/>
<field accessType='initializeOnly' type='SFVec2f' name='hitPoint' value='0 0'/>
<field accessType='initializeOnly' type='SFVec2f' name='startPoint' value='0 0'/>
<field accessType='initializeOnly' type='SFInt32' name='penColor' value='16776960'/>
<field accessType='initializeOnly' type='SFInt32' name='bgColor' value='255'/>
<field accessType='initializeOnly' type='SFBool' name='penDownd' value='FALSE'/>
<field accessType='initializeOnly' type='SFFloat' name='segmentLength' value='0.02'/>
<![CDATA[ecmascript:

function blend (i0,i1,rt) {

var i0r = ( i0 & 0xFF0000 ) >> 16;
var i0g = ( i0 & 0x00FF00 ) >> 8;
var i0b = i0 & 0x0000FF;

var i1r = ( i1 & 0xFF0000 ) >> 16;
var i1g = ( i1 & 0x00FF00 ) >> 8;
var i1b = i1 & 0x0000FF;

var rt1 = 1 - rt;

var r = Math.floor( i0r * rt + i1r * rt1 ) << 16;
var g = Math.floor( i0g * rt + i1g * rt1 ) << 8;
var b = Math.floor( i0b * rt + i1b * rt1 );

return r + g + b;

}

function psetAA(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 ));

for ( var y = -1; y <= 1; y++ ) {
for ( var x = -1; x <= 1; x++ ) {

var sx = s + x;
var ty = t + y;
if ( sx < 0 || sx >= dt ) continue;
if ( ty < 0 || ty >= dt ) continue;

var dc = new SFVec2f ( sx + 0.5, ty + 0.5 );
var rate = 1 - tv.subtract( dc ).length();
if ( rate <= 0 ) continue;

var baseColor = ary[ sx + ty * dt ];
ary[ sx + ty * dt ] = blend ( penColor, baseColor, rate );

}
}

}

function linesetAA(v0,v1) {

var v01 = v1.subtract( v0 );
var v01len = v01.length();

if ( v01len == 0 ) {

psetAA( v0 );

}
else {

var dv = v01.normalize().divide( dt * 2 );
var v2 = new SFVec2f ( v0.x, v0.y );
var n = v01len / dv.length();

for ( var i = 0; i <= n; i++ ) {

psetAA ( v2 );
v2 = v2.add ( dv );

}

}

}

function initialize () {

var px = dt * dt;

for ( var i = 0; i < px; i++ ) ary[i] = bgColor;

image = new SFImage ( dt, dt, 3, ary );

}

function set_hitTexCoord (v) {

hitPoint = v;

if ( penDownd && v.subtract(startPoint).length() >= segmentLength ) {

linesetAA( startPoint, v );
image = new SFImage ( dt, dt, 3, ary );
startPoint = v;

}

}

function penUpDowned (active) {

penDownd = active;

if (active) {

// pen downed
startPoint = hitPoint;

}
else {

// pen uped
linesetAA( startPoint, 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>