<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D profile='Immersive' version='3.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.0.xsd'>
  <head>
    <meta content='ExplodingBuildingPrototype.x3d' name='title'/>
    <meta content='A simple prototype for exploding structure components, experimenting with the "Hello World" of explosions. This prototype demonstrates a simplified and scalable approach for modeling explosions. Each chunk of geometry inside an Exploder prototype is given initial/final position/orientation. Intermediate heights for each polygon are at the same height as the distance traveled over ground.' name='description'/>
    <meta content='Don Brutzman' name='creator'/>
    <meta content='1 January 2001' name='created'/>
    <meta content='28 November 2019' name='modified'/>
    <meta content='Exploding building schematic layout diagram:' name='reference'/>
    <meta content='ExplodingBuildingLayout.pdf' name='Image'/>
    <meta content='ExplodingBuildingSnapshots.pdf' name='Image'/>
    <meta content='ExplodingBuildingMontage.png' name='Image'/>
    <meta content='ExplodingBuildingExampleVideo.mov' name='MovingImage'/>
    <meta content='ExplodingBuildingLargeExample.wrl' name='reference'/>
    <meta content='Rotation calculations performed using the Dizzy utility from Vapour Technologies by James Smith.' name='reference'/>
    <meta content='http://www.vapourtech.com' name='reference'/>
    <meta content='DIS-Java-VRML Working Group' name='reference'/>
    <meta content='https://www.web3d.org/WorkingGroups/vrtp/dis-java-vrml' name='reference'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Savage/Tools/Explosions/ExplodingBuildingPrototype.x3d' name='identifier'/>
    <meta content='X3D-Edit 3.2, https://www.web3d.org/x3d/tools/X3D-Edit' name='generator'/>
    <meta content='../../license.html' name='license'/>
  </head>
  <Scene>
    <WorldInfo title='ExplodingBuildingPrototype.x3d'/>
    <ProtoDeclare appinfo='Explode contained geometry through animation on demand' name='Exploder'>
      <ProtoInterface>
        <field accessType='initializeOnly' appinfo='geometry node, to be used inside a Shape' name='geometry' type='SFNode'>
          <!-- initialization node (if any) goes here -->
        </field>
        <field accessType='initializeOnly' appinfo='Material node for this geometry, to be used inside a Shape' name='material' type='SFNode'>
          <!-- initialization node (if any) goes here -->
        </field>
        <field accessType='initializeOnly' appinfo='starting point' name='initialPosition' type='SFVec3f' value='0 0 0'/>
        <field accessType='initializeOnly' appinfo='finish point' name='finalPosition' type='SFVec3f' value='0 0 0'/>
        <field accessType='initializeOnly' appinfo='starting point orientation' name='initialOrientation' type='SFRotation' value='0 1 0 0'/>
        <field accessType='initializeOnly' appinfo='finish point orientation' name='finalOrientation' type='SFRotation' value='0 1 0 0'/>
        <field accessType='inputOnly' appinfo='animation input' name='set_fraction' type='SFFloat'/>
      </ProtoInterface>
      <ProtoBody>
        <Transform DEF='LocationTransform'>
          <IS>
            <connect nodeField='translation' protoField='initialPosition'/>
          </IS>
          <Transform DEF='RotationTransform'>
            <IS>
              <connect nodeField='rotation' protoField='initialOrientation'/>
            </IS>
            <Shape DEF='AnimatedShape'>
              <IS>
                <connect nodeField='geometry' protoField='geometry'/>
              </IS>
              <Appearance DEF='AnimatedShapeAppearance'>
                <IS>
                  <connect nodeField='material' protoField='material'/>
                </IS>
              </Appearance>
            </Shape>
          </Transform>
        </Transform>
        <!-- only initial node in ProtoBody is rendered -->
        <Script DEF='ProtoAnimationScript'>
          <field accessType='initializeOnly' name='initialPosition' type='SFVec3f'/>
          <field accessType='initializeOnly' name='finalPosition' type='SFVec3f'/>
          <field accessType='initializeOnly' name='initialOrientation' type='SFRotation'/>
          <field accessType='initializeOnly' name='finalOrientation' type='SFRotation'/>
          <field accessType='outputOnly' name='position_changeds' type='MFVec3f'/>
          <field accessType='outputOnly' name='rotationValues' type='MFRotation'/>
          <IS>
            <connect nodeField='initialPosition' protoField='initialPosition'/>
            <connect nodeField='finalPosition' protoField='finalPosition'/>
            <connect nodeField='initialOrientation' protoField='initialOrientation'/>
            <connect nodeField='finalOrientation' protoField='finalOrientation'/>
          </IS>
          <![CDATA[
ecmascript:

function initialize ()
{
	dx = finalPosition.x - initialPosition.x;
	dy = finalPosition.y - initialPosition.y;
	dz = finalPosition.z - initialPosition.z;
//	Browser.println ('dx=' + dx + ', dy=' + dy + ', dz=' + dz);
	distance = Math.sqrt (dx*dx + dy*dy + dz*dz);
//	Browser.println ('distance          =' + distance);
	quarterPoint   = initialPosition.add (new SFVec3f (  dx/4,   dy/4 + 0.707*distance,     dz/4));
	halfwaypoint   = initialPosition.add (new SFVec3f (  dx/2,   dy/2 +       distance,     dz/2));
	three4thsPoint = initialPosition.add (new SFVec3f (3*dx/4, 3*dy/4 + 0.707*distance/2, 3*dz/4));
	position_changeds = new MFVec3f (initialPosition, initialPosition, quarterPoint, halfwaypoint, three4thsPoint, finalPosition);
//	Browser.println ('position_changeds    =' + position_changeds);
	rotationValues = new MFRotation (initialOrientation, finalOrientation);

//	Browser.println ('initialPosition   =' + initialPosition);
//	Browser.println ('finalPosition     =' + finalPosition);
//	Browser.println ('position_changeds    =' + position_changeds);
//	Browser.println ('initialOrientation=' + initialOrientation);
//	Browser.println ('finalOrientation  =' + finalOrientation);
//	Browser.println ('rotationValues=' + rotationValues);
}
]]>
        </Script>
        <!-- keyValue arrays for following interpolators get recalculated and reset by ProtoAnimationScript -->
        <PositionInterpolator DEF='ProtoPositionInterpolator' key='0 0.2 0.4 0.6 0.8 1' keyValue='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'>
          <IS>
            <connect nodeField='set_fraction' protoField='set_fraction'/>
          </IS>
        </PositionInterpolator>
        <OrientationInterpolator DEF='ProtoOrientationInterpolator' key='0 1' keyValue='0 1 0 0 0 1 0 0'>
          <IS>
            <connect nodeField='set_fraction' protoField='set_fraction'/>
          </IS>
        </OrientationInterpolator>
        <ROUTE fromField='value_changed' fromNode='ProtoPositionInterpolator' toField='translation' toNode='LocationTransform'/>
        <ROUTE fromField='value_changed' fromNode='ProtoOrientationInterpolator' toField='rotation' toNode='RotationTransform'/>
        <ROUTE fromField='position_changeds' fromNode='ProtoAnimationScript' toField='keyValue' toNode='ProtoPositionInterpolator'/>
        <ROUTE fromField='rotationValues' fromNode='ProtoAnimationScript' toField='keyValue' toNode='ProtoOrientationInterpolator'/>
      </ProtoBody>
    </ProtoDeclare>
    <!-- ============================ -->
    <Viewpoint description='ExplodingBuilding Prototype' position='0 0 12'/>
    <Background groundAngle='1.57' groundColor='0.6 0.9 0.6 0.6 0.9 0.6' skyColor='0.6 0.6 0.9'/>
    <Anchor description='ExplodingBuilding Example' parameter='"target=_blank"' url='"ExplodingBuildingExample.x3d" "https://www.web3d.org/x3d/content/examples/Savage/Tools/Explosions/ExplodingBuildingExample.x3d" "ExplodingBuildingExample.wrl" "https://www.web3d.org/x3d/content/examples/Savage/Tools/Explosions/ExplodingBuildingExample.wrl"'>
      <Shape>
        <Text string='"ExplodingBuildingPrototype" "is a prototype definition file" "" "Click this text to see" "ExplodingBuildingExample"'>
          <FontStyle justify='"MIDDLE" "MIDDLE"'/>
        </Text>
        <Appearance>
          <Material diffuseColor='0.2 0.2 0.8'/>
        </Appearance>
      </Shape>
    </Anchor>
  </Scene>
</X3D>