@prefix : . @prefix owl: . @prefix rdf: . @prefix rdfs: . @prefix schema: . @prefix dcterms: . @prefix xsd: . @prefix x3d: . @prefix x3do: . :X3D a owl:NamedIndividual, x3do:X3D ; x3do:hasHead :head ; x3do:hasScene :Scene ; x3do:profile 'Immersive' ; x3do:version '3.0' ; x3do:noNamespaceSchemaLocation 'https://www.web3d.org/specifications/x3d-3.0.xsd' . :head a owl:NamedIndividual, x3do:head ; x3do:hasParent :X3D ; x3do:hasMeta :meta_1_1, :meta_1_2, :meta_1_3, :meta_1_4, :meta_1_5, :meta_1_6, :meta_1_7, :meta_1_8, :meta_1_9 . :meta_1_1 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'MaterialChoicePrototype.x3d' ; x3do:name 'title' . :meta_1_2 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'Prototype definition for toggle-able Material node that can choose among an array of material nodes, and is switchable at run time. This prototype also demonstrates why it is important that only the first node in a ProtoBody can render: so that it can serve as a special node type (such as Material).' ; x3do:name 'description' . :meta_1_3 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'Don Brutzman and MV4205 class' ; x3do:name 'creator' . :meta_1_4 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content '29 April 2004' ; x3do:name 'created' . :meta_1_5 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content '28 November 2019' ; x3do:name 'modified' . :meta_1_6 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'MaterialChoiceExample.x3d' ; x3do:name 'reference' . :meta_1_7 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'https://savage.nps.edu/Savage/Tools/Animation/MaterialChoicePrototype.x3d' ; x3do:name 'identifier' . :meta_1_8 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'X3D-Edit 3.2, https://savage.nps.edu/X3D-Edit' ; x3do:name 'generator' . :meta_1_9 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content '../../license.html' ; x3do:name 'license' . :meta dcterms:title "MaterialChoicePrototype.x3d" . :meta dcterms:description "Prototype definition for toggle-able Material node that can choose among an array of material nodes, and is switchable at run time. This prototype also demonstrates why it is important that only the first node in a ProtoBody can render: so that it can serve as a special node type (such as Material)." . :meta dcterms:creator "Don Brutzman and MV4205 class" . :meta dcterms:created "29 April 2004" . :meta dcterms:modified "28 November 2019" . :meta dcterms:reference "MaterialChoiceExample.x3d" . :meta dcterms:identifier "https://savage.nps.edu/Savage/Tools/Animation/MaterialChoicePrototype.x3d" . :meta dcterms:generator "X3D-Edit 3.2, https://savage.nps.edu/X3D-Edit" . :meta dcterms:license "../../license.html" . :Scene a owl:NamedIndividual, x3do:Scene ; x3do:hasParent :X3D ; x3do:hasChildren :WorldInfo_2_1, :Anchor_2_3 ; x3do:hasProtoDeclare :ProtoDeclare_2_2 . :WorldInfo_2_1 a owl:NamedIndividual, x3do:WorldInfo ; x3do:hasParent :Scene ; x3do:title 'MaterialChoicePrototype.x3d' . :ProtoDeclare_2_2 a owl:NamedIndividual, x3do:ProtoDeclare ; x3do:hasParent :Scene ; x3do:hasProtoInterface :ProtoInterface_2_2_1 ; x3do:hasProtoBody :ProtoBody_2_2_2 ; x3do:appinfo 'MaterialChoice selects one of several different Material values' ; x3do:name 'MaterialChoice' . :ProtoInterface_2_2_1 a owl:NamedIndividual, x3do:ProtoInterface ; x3do:hasParent :ProtoDeclare_2_2 ; x3do:hasField :field_2_2_1_1, :field_2_2_1_2, :field_2_2_1_3, :field_2_2_1_4, :field_2_2_1_5, :field_2_2_1_6, :field_2_2_1_7, :field_2_2_1_8, :field_2_2_1_9, :field_2_2_1_10, :field_2_2_1_11 . :field_2_2_1_1 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOnly' ; x3do:name 'set_index' ; x3do:type 'SFInt32' . :field_2_2_1_2 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'initializeOnly' ; x3do:appinfo 'which Material node is chosen, with array index starting at 0' ; x3do:name 'index' ; x3do:type 'SFInt32' ; x3do:value 0 . :field_2_2_1_3 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'outputOnly' ; x3do:name 'index_changed' ; x3do:type 'SFInt32' . :field_2_2_1_4 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOnly' ; x3do:name 'set_fraction' ; x3do:type 'SFFloat' . :field_2_2_1_5 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'initializeOnly' ; x3do:appinfo 'fraction to interpolate between current and next Material node (if any) across all field values.' ; x3do:name 'fraction' ; x3do:type 'SFFloat' ; x3do:value 0 . :field_2_2_1_6 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOnly' ; x3do:appinfo 'Trigger next Material node' ; x3do:name 'next' ; x3do:type 'SFBool' . :field_2_2_1_7 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOnly' ; x3do:appinfo 'Trigger previous Material node' ; x3do:name 'previous' ; x3do:type 'SFBool' . :field_2_2_1_8 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'initializeOnly' ; x3do:appinfo 'array of available Material nodes defaults to zeroth Material' ; x3do:name 'materials' ; x3do:type 'MFNode' . :field_2_2_1_9 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOnly' ; x3do:appinfo 'append another Material node to materials array' ; x3do:name 'appendMaterial' ; x3do:type 'SFNode' . :field_2_2_1_10 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOnly' ; x3do:appinfo 'delete Material node indicated by input index value' ; x3do:name 'deleteMaterial' ; x3do:type 'SFInt32' . :field_2_2_1_11 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOnly' ; x3do:appinfo 'deletes all Material nodes resets scene to default Material values defined in X3D Specification' ; x3do:name 'deleteAllMaterials' ; x3do:type 'SFBool' . :ProtoBody_2_2_2 a owl:NamedIndividual, x3do:ProtoBody ; x3do:hasParent :ProtoDeclare_2_2 ; x3do:hasMaterial :ViewedMaterialNode ; x3do:hasChildren :MaterialAnimationScript . :ViewedMaterialNode a owl:NamedIndividual, x3do:Material ; x3do:hasParent :ProtoBody_2_2_2 ; x3do:DEF 'ViewedMaterialNode' . :MaterialAnimationScript a owl:NamedIndividual, x3do:Script ; x3do:hasParent :ProtoBody_2_2_2 ; x3do:hasField :field_2_2_2_2_1, :field_2_2_2_2_2, :field_2_2_2_2_3, :field_2_2_2_2_4, :field_2_2_2_2_5, :field_2_2_2_2_6, :field_2_2_2_2_7, :field_2_2_2_2_8, :field_2_2_2_2_9, :field_2_2_2_2_10, :field_2_2_2_2_11, :field_2_2_2_2_12, :field_2_2_2_2_13, :field_2_2_2_2_14, :field_2_2_2_2_15 ; x3do:hasIS :IS_2_2_2_2_16 ; x3do:DEF 'MaterialAnimationScript' ; x3do:directOutput true ; x3do:sourceCode """ ecmascript: function initialize () { tracePrint ('initialize() begin...'); if (materials[index] != null) { viewedMaterial.diffuseColor = materials[index].diffuseColor; viewedMaterial.emissiveColor = materials[index].emissiveColor; viewedMaterial.specularColor = materials[index].specularColor; viewedMaterial.shininess = materials[index].shininess; viewedMaterial.ambientIntensity = materials[index].ambientIntensity; viewedMaterial.transparency = materials[index].transparency; interpolateMaterialValues(); } else alwaysPrint ('warning: no initialization Material node provided for materials[' + index + ']' + ', materials.length=' + materials.length); tracePrint ('initialize() complete'); } function set_index (value, timestamp) { if (value == index) return; else if ((value >= 0) && (value < materials.length)) { index = value; viewedMaterial.diffuseColor = materials[index].diffuseColor; viewedMaterial.emissiveColor = materials[index].emissiveColor; viewedMaterial.specularColor = materials[index].specularColor; viewedMaterial.shininess = materials[index].shininess; viewedMaterial.ambientIntensity = materials[index].ambientIntensity; viewedMaterial.transparency = materials[index].transparency; interpolateMaterialValues(); index_changed = value; // chain input event to output event tracePrint ('set_index(' + value + ') complete'); } else if (value == -1) { tracePrint ('set_index(' + value + ') out of range, use default Material values'); index = value; viewedMaterial.diffuseColor = defaultMaterial.diffuseColor; viewedMaterial.emissiveColor = defaultMaterial.emissiveColor; viewedMaterial.specularColor = defaultMaterial.specularColor; viewedMaterial.shininess = defaultMaterial.shininess; viewedMaterial.ambientIntensity = defaultMaterial.ambientIntensity; viewedMaterial.transparency = defaultMaterial.transparency; index_changed = value; // chain input event to output event } else if (priorBadIndex != value) { alwaysPrint ('set_index(' + value + ') out of range (only ' + materials.length + ' Material nodes)'); priorBadIndex = value; } } function set_fraction(value, timestamp) { tracePrint ('set_fraction(' + value + ')'); if (fraction != value) // only update if value is changed { fraction = value; interpolateMaterialValues(); } } function interpolateMaterialValues() { f = fraction % 1; // nonzero remainder (modulo 1) within range [0..1] tracePrint ('interpolateMaterialValues(index=' + index + ', fraction=' + fraction + ', f=' + f + ')'); // reset Material index if fraction is above 1 if (Math.floor(fraction) >= 1) { index = Math.floor(fraction); tracePrint ('index=' + index + ' (reset from fraction)'); } fraction = f; // no need to retain integral part of fraction once index is set correspondingly // check OK to proceed if (index < 0) return; // avoid index underflow if (index >= materials.length - 1) return; // avoid index overflow if (f == 0.0) return; // avoid zero interpolation viewedMaterial.diffuseColor.r = materials[index].diffuseColor.r + f * (materials[index+1].diffuseColor.r - materials[index].diffuseColor.r); viewedMaterial.diffuseColor.g = materials[index].diffuseColor.g + f * (materials[index+1].diffuseColor.g - materials[index].diffuseColor.g); viewedMaterial.diffuseColor.b = materials[index].diffuseColor.r + f * (materials[index+1].diffuseColor.b - materials[index].diffuseColor.b); tracePrint ('viewedMaterial.diffuseColor=' + viewedMaterial.diffuseColor); viewedMaterial.emissiveColor.r = materials[index].emissiveColor.r + f * (materials[index+1].emissiveColor.r - materials[index].emissiveColor.r); viewedMaterial.emissiveColor.g = materials[index].emissiveColor.r + f * (materials[index+1].emissiveColor.g - materials[index].emissiveColor.g); viewedMaterial.emissiveColor.b = materials[index].emissiveColor.b + f * (materials[index+1].emissiveColor.b - materials[index].emissiveColor.b); viewedMaterial.specularColor.r = materials[index].specularColor.r + f * (materials[index+1].specularColor.r - materials[index].specularColor.r); viewedMaterial.specularColor.g = materials[index].specularColor.g + f * (materials[index+1].specularColor.g - materials[index].specularColor.g); viewedMaterial.specularColor.b = materials[index].specularColor.b + f * (materials[index+1].specularColor.b - materials[index].specularColor.b); viewedMaterial.shininess = materials[index].shininess + f * (materials[index+1].shininess - materials[index].shininess); viewedMaterial.ambientIntensity = materials[index].ambientIntensity + f * (materials[index+1].ambientIntensity - materials[index].ambientIntensity); viewedMaterial.transparency = materials[index].transparency + f * (materials[index+1].transparency - materials[index].transparency); } function next(trigger) { tracePrint ('next(' + trigger + ')'); if ((trigger == true) && (materials.length > 0)) { value = index + 1; if (value >= materials.length) value = 0; set_index (value); // update Material, test, etc. } } function previous(trigger) { tracePrint ('previous(' + trigger + ')'); if ((trigger == true) && (materials.length > 0)) { value = index - 1; if (value < 0) value = materials.length - 1; set_index (value); // update Material, test, etc. } } function appendMaterial(newMaterial) { tracePrint ('appendMaterial(' + newMaterial + ')'); newMaterialCopy = new SFNode ('Material {}'); tracePrint ('newMaterial.diffuseColor=' + newMaterial.diffuseColor); newMaterialCopy.diffuseColor = newMaterial.diffuseColor; newMaterialCopy.emissiveColor = newMaterial.emissiveColor; newMaterialCopy.specularColor = newMaterial.specularColor; newMaterialCopy.shininess = newMaterial.shininess; newMaterialCopy.ambientIntensity = newMaterial.ambientIntensity; newMaterialCopy.transparency = newMaterial.transparency; materials[materials.length] = newMaterialCopy; set_index (materials.length-1); // update Material, test, etc. } function deleteAllMaterials(trigger) { if ((trigger == true) && (materials.length > 0)) { materials.length = 0; // deletes all objects in materials MFNode array index = 0; // must be different to trigger node reset by set_index() set_index (-1); tracePrint ('deleteAllMaterials() materials.length=' + materials.length); } } function deleteMaterial(materialIndex) { if ((materialIndex >= materials.length) || materialIndex < 0) alwaysPrint ('deleteMaterial(materialIndex=' + materialIndex + ') out of range, materials.length=' + materials.length); else { for (i = materialIndex; i <= materials.length - 2; i++) { materials[i] = materials[i+1]; } materials.length = materials.length - 1; if ((index == 0) && (materialIndex == 0) && (materials.length > 0)) { index = -1; // allow reset back to 0 set_index (0); } else if (index >= materialIndex) set_index (index-1); // decrement to remain same tracePrint ('deleteMaterial(materialIndex=' + materialIndex + ') complete, materials.length=' + materials.length); } } function tracePrint(outputString) { if (traceEnabled) Browser.println ('[MaterialChoice] ' + outputString); } function alwaysPrint(outputString) { Browser.println ('[MaterialChoice] ' + outputString); } """ . :field_2_2_2_2_1 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'initializeOnly' ; x3do:name 'traceEnabled' ; x3do:type 'SFBool' ; x3do:value false . :field_2_2_2_2_2 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'inputOnly' ; x3do:name 'set_index' ; x3do:type 'SFInt32' . :field_2_2_2_2_3 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'initializeOnly' ; x3do:name 'index' ; x3do:type 'SFInt32' . :field_2_2_2_2_4 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'outputOnly' ; x3do:name 'index_changed' ; x3do:type 'SFInt32' . :field_2_2_2_2_5 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'inputOnly' ; x3do:name 'set_fraction' ; x3do:type 'SFFloat' . :field_2_2_2_2_6 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'initializeOnly' ; x3do:name 'fraction' ; x3do:type 'SFFloat' . :field_2_2_2_2_7 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'inputOnly' ; x3do:name 'next' ; x3do:type 'SFBool' . :field_2_2_2_2_8 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'inputOnly' ; x3do:name 'previous' ; x3do:type 'SFBool' . :field_2_2_2_2_9 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:hasMaterial :ViewedMaterialNode-USE-1 ; x3do:accessType 'initializeOnly' ; x3do:name 'viewedMaterial' ; x3do:type 'SFNode' . :ViewedMaterialNode-USE-1 a owl:NamedIndividual, x3do:Material ; x3do:hasParent :field_2_2_2_2_9 ; owl:sameAs :ViewedMaterialNode . # DEF matching this USE :field_2_2_2_2_10 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:hasMaterial :Material_2_2_2_2_10_1 ; x3do:accessType 'initializeOnly' ; x3do:name 'defaultMaterial' ; x3do:type 'SFNode' . :Material_2_2_2_2_10_1 a owl:NamedIndividual, x3do:Material ; x3do:hasParent :field_2_2_2_2_10 . :field_2_2_2_2_11 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'initializeOnly' ; x3do:name 'materials' ; x3do:type 'MFNode' . :field_2_2_2_2_12 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'inputOnly' ; x3do:appinfo 'append another Material node to materials array' ; x3do:name 'appendMaterial' ; x3do:type 'SFNode' . :field_2_2_2_2_13 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'inputOnly' ; x3do:appinfo 'delete Material node indicated by input index value' ; x3do:name 'deleteMaterial' ; x3do:type 'SFInt32' . :field_2_2_2_2_14 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'inputOnly' ; x3do:appinfo 'deletes all Material nodes resets scene to default Material values defined in X3D Specification' ; x3do:name 'deleteAllMaterials' ; x3do:type 'SFBool' . :field_2_2_2_2_15 a owl:NamedIndividual, x3do:field ; x3do:hasParent :MaterialAnimationScript ; x3do:accessType 'initializeOnly' ; x3do:name 'priorBadIndex' ; x3do:type 'SFInt32' ; x3do:value -1 . :IS_2_2_2_2_16 a owl:NamedIndividual, x3do:IS ; x3do:hasParent :MaterialAnimationScript ; x3do:hasConnect :connect_2_2_2_2_16_1, :connect_2_2_2_2_16_2, :connect_2_2_2_2_16_3, :connect_2_2_2_2_16_4, :connect_2_2_2_2_16_5, :connect_2_2_2_2_16_6, :connect_2_2_2_2_16_7, :connect_2_2_2_2_16_8, :connect_2_2_2_2_16_9, :connect_2_2_2_2_16_10, :connect_2_2_2_2_16_11 . :connect_2_2_2_2_16_1 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'set_index' ; x3do:protoField 'set_index' . :connect_2_2_2_2_16_2 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'index' ; x3do:protoField 'index' . :connect_2_2_2_2_16_3 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'index_changed' ; x3do:protoField 'index_changed' . :connect_2_2_2_2_16_4 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'set_fraction' ; x3do:protoField 'set_fraction' . :connect_2_2_2_2_16_5 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'fraction' ; x3do:protoField 'fraction' . :connect_2_2_2_2_16_6 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'next' ; x3do:protoField 'next' . :connect_2_2_2_2_16_7 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'previous' ; x3do:protoField 'previous' . :connect_2_2_2_2_16_8 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'materials' ; x3do:protoField 'materials' . :connect_2_2_2_2_16_9 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'appendMaterial' ; x3do:protoField 'appendMaterial' . :connect_2_2_2_2_16_10 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'deleteMaterial' ; x3do:protoField 'deleteMaterial' . :connect_2_2_2_2_16_11 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_16 ; x3do:nodeField 'deleteAllMaterials' ; x3do:protoField 'deleteAllMaterials' . :Anchor_2_3 a owl:NamedIndividual, x3do:Anchor ; x3do:hasParent :Scene ; x3do:hasChildren :Shape_2_3_1 ; x3do:description 'MaterialChoiceExample' ; x3do:url '"MaterialChoiceExample.x3d" "https://savage.nps.edu/Savage/Tools/Animation/MaterialChoiceExample.x3d" "MaterialChoiceExample.wrl" "https://savage.nps.edu/Savage/Tools/Animation/MaterialChoiceExample.wrl"' . :Shape_2_3_1 a owl:NamedIndividual, x3do:Shape ; x3do:hasParent :Anchor_2_3 ; x3do:hasGeometry :Text_2_3_1_1 ; x3do:hasAppearance :Appearance_2_3_1_2 . :Text_2_3_1_1 a owl:NamedIndividual, x3do:Text ; x3do:hasParent :Shape_2_3_1 ; x3do:hasFontStyle :FontStyle_2_3_1_1_1 ; x3do:string '"MaterialChoicePrototype" "defines a prototype" "" "Click text to see example scene" "MaterialChoiceExample"' . :FontStyle_2_3_1_1_1 a owl:NamedIndividual, x3do:FontStyle ; x3do:hasParent :Text_2_3_1_1 ; x3do:justify '"MIDDLE" "MIDDLE"' ; x3do:size 0.9 . :Appearance_2_3_1_2 a owl:NamedIndividual, x3do:Appearance ; x3do:hasParent :Shape_2_3_1 ; x3do:hasMaterial :Material_2_3_1_2_1 . :Material_2_3_1_2_1 a owl:NamedIndividual, x3do:Material ; x3do:hasParent :Appearance_2_3_1_2 ; x3do:diffuseColor ( 1 1 0.2 ) .