protected OgexGeometryNode toGeometryNode( DataStructure ds, Map<BaseStructure, Object> index ) {
               
        OgexGeometryNode geom = new OgexGeometryNode();
        configureNode(geom, ds, index, false);

        if( "false".equals(ds.getProperty("visible")) ) {
            geom.setVisible(false);
        }
        if( "false".equals(ds.getProperty("shadow")) ) {
            geom.setShadow(false);
        }
        if( "false".equals(ds.getProperty("motionBlur")) ) {
            geom.setMotionBlur(false);
        }
    
        for( BaseStructure child : ds ) {
            String type = child.getType();
            if( BASE_NODE_CHILDREN.contains(type) ) {
                continue;
            } else if( StructTypes.MATERIAL_REF.equals(type) ) {
                        
                BaseStructure[] array = (BaseStructure[])child.getData();
                // A geom node can contain more than one material
                for( BaseStructure ref : array ) {
                    geom.addMaterial(toMaterial((DataStructure)ref, index));
                }
            } else if( StructTypes.OBJECT_REF.equals(type) ) {
                geom.setGeometry(toGeometry((DataStructure)child.getValue(), index));
            } else {
                log.warn("Unhandled structure type:" + child.getType() + ", from:" + child.location());
            }
        }
 
        return geom;        
    }