00001 #include "X3DComposedGeometryNode.h" 00002 #include "RenderingNodes.h" 00003 00004 #include <iostream> 00005 00006 using namespace X3DTK; 00007 using namespace std; 00008 00009 X3DComposedGeometryNode::X3DComposedGeometryNode() 00010 : X3DGeometry3DNode(), color_(0), coord_(0), normal_(0), texCoord_(0), ccw_(true), colorPerVertex_(true), normalPerVertex_(true), solid_(true) 00011 { 00012 defineTagName("X3DComposedGeometryNode"); 00013 } 00014 00015 X3DComposedGeometryNode::X3DComposedGeometryNode(const X3DColorNode *color, const X3DCoordinateNode *coord, const X3DNormalNode *normal, const X3DTextureCoordinateNode *texCoord, SFBool ccw, SFBool colorPerVertex, SFBool normalPerVertex, SFBool solid) 00016 : X3DGeometry3DNode(), color_((SFNode)color), coord_((SFNode)coord), normal_((SFNode)normal), texCoord_((SFNode)texCoord), ccw_(ccw), colorPerVertex_(colorPerVertex), normalPerVertex_(normalPerVertex), solid_(solid) 00017 { 00018 defineTagName("X3DComposedGeometryNode"); 00019 } 00020 00021 00022 X3DComposedGeometryNode::X3DComposedGeometryNode(const X3DComposedGeometryNode &N) 00023 : X3DGeometry3DNode(N), color_(N.color_), coord_(N.coord_), normal_(N.normal_), texCoord_(N.texCoord_), ccw_(N.ccw_), colorPerVertex_(N.colorPerVertex_), normalPerVertex_(N.normalPerVertex_), solid_(N.solid_) 00024 { 00025 defineTagName("X3DComposedGeometryNode"); 00026 } 00027 00028 SFNode X3DComposedGeometryNode::clone() const 00029 { 00030 return 0; 00031 } 00032 00033 X3DComposedGeometryNode::~X3DComposedGeometryNode() 00034 { 00035 } 00036 00037 void X3DComposedGeometryNode::setColor(const X3DColorNode *color) 00038 { 00039 removeLink(this, color_); 00040 color_ = (SFNode)color; 00041 addLink(this, color_); 00042 } 00043 00044 void X3DComposedGeometryNode::setCoord(const X3DCoordinateNode *coord) 00045 { 00046 removeLink(this, coord_); 00047 coord_ = (SFNode)coord; 00048 addLink(this, coord_); 00049 } 00050 00051 void X3DComposedGeometryNode::setNormal(const X3DNormalNode *normal) 00052 { 00053 removeLink(this, normal_); 00054 normal_ = (SFNode)normal; 00055 addLink(this, normal_); 00056 } 00057 00058 void X3DComposedGeometryNode::setTexCoord(const X3DTextureCoordinateNode *texCoord) 00059 { 00060 removeLink(this, texCoord_); 00061 texCoord_ = (SFNode)texCoord; 00062 addLink(this, texCoord_); 00063 } 00064 00065 void X3DComposedGeometryNode::setCcw(SFBool ccw) 00066 { 00067 ccw_= ccw; 00068 } 00069 00070 void X3DComposedGeometryNode::setColorPerVertex(SFBool colorPerVertex) 00071 { 00072 colorPerVertex_ = colorPerVertex; 00073 } 00074 00075 void X3DComposedGeometryNode::setNormalPerVertex(SFBool normalPerVertex) 00076 { 00077 normalPerVertex_ = normalPerVertex; 00078 } 00079 00080 void X3DComposedGeometryNode::setSolid(SFBool solid) 00081 { 00082 solid_ = solid; 00083 } 00084 00085 bool X3DComposedGeometryNode::addChild(const SFNode &N) 00086 { 00087 if (dynamic_cast<X3DColorNode *>(N) != 0) 00088 { 00089 if (color_ != 0) 00090 return false; 00091 00092 setColor(static_cast<X3DColorNode *>(N)); 00093 return true; 00094 } 00095 00096 if (dynamic_cast<X3DCoordinateNode *>(N) != 0) 00097 { 00098 if (coord_ != 0) 00099 return false; 00100 00101 setCoord(static_cast<X3DCoordinateNode *>(N)); 00102 return true; 00103 } 00104 00105 if (dynamic_cast<X3DNormalNode *>(N) != 0) 00106 { 00107 if (normal_ != 0) 00108 return false; 00109 00110 setNormal(static_cast<X3DNormalNode *>(N)); 00111 return true; 00112 } 00113 00114 if (dynamic_cast<X3DNode *>(N) != 0) 00115 { 00116 if (texCoord_ != 0) 00117 return false; 00118 00119 setTexCoord(static_cast<X3DTextureCoordinateNode *>(N)); 00120 return true; 00121 } 00122 return false; 00123 } 00124 00125 bool X3DComposedGeometryNode::setChild(const SFNode &N) 00126 { 00127 if (dynamic_cast<X3DColorNode *>(N) != 0) 00128 { 00129 setColor(static_cast<X3DColorNode *>(N)); 00130 return true; 00131 } 00132 00133 if (dynamic_cast<X3DCoordinateNode *>(N) != 0) 00134 { 00135 setCoord(static_cast<X3DCoordinateNode *>(N)); 00136 return true; 00137 } 00138 00139 if (dynamic_cast<X3DNormalNode *>(N) != 0) 00140 { 00141 setNormal(static_cast<X3DNormalNode *>(N)); 00142 return true; 00143 } 00144 00145 if (dynamic_cast<X3DTextureCoordinateNode *>(N) != 0) 00146 { 00147 setTexCoord(static_cast<X3DTextureCoordinateNode *>(N)); 00148 return true; 00149 } 00150 00151 cerr << "X3DComposedGeometryNode::addChild : a node of type " << N->getTypeName() << " cannot be a child!" << endl; 00152 return false; 00153 } 00154 00155 bool X3DComposedGeometryNode::removeChild(const SFNode &N) 00156 { 00157 if (color_ == N) 00158 { 00159 setColor(0); 00160 return true; 00161 } 00162 00163 if (coord_ == N) 00164 { 00165 setCoord(0); 00166 return true; 00167 } 00168 00169 if (normal_ == N) 00170 { 00171 setNormal(0); 00172 return true; 00173 } 00174 00175 if (texCoord_ == N) 00176 { 00177 setTexCoord(0); 00178 return true; 00179 } 00180 00181 cerr << "X3DComposedGeometryNode::removeChild : a node of type " << N->getTypeName() << " cannot be a child!" << endl; 00182 return false; 00183 } 00184 00185 void X3DComposedGeometryNode::loadAttributes(const X3DFileElement *element) 00186 { 00187 int index; 00188 index = element->getIndexAttribute("ccw"); 00189 if (index != -1) 00190 ccw_ = (element->getAttribute(index).upper() == "TRUE"); 00191 00192 index = element->getIndexAttribute("colorPerVertex"); 00193 if (index != -1) 00194 colorPerVertex_ = (element->getAttribute(index).upper() == "TRUE"); 00195 00196 index = element->getIndexAttribute("normalPerVertex"); 00197 if (index != -1) 00198 normalPerVertex_ = (element->getAttribute(index).upper() == "TRUE"); 00199 00200 index = element->getIndexAttribute("solid"); 00201 if (index != -1) 00202 solid_ = (element->getAttribute(index).upper() == "TRUE"); 00203 } 00204 00205 SFString X3DComposedGeometryNode::writeAttributes() const 00206 { 00207 SFString attr; 00208 if (!ccw_) 00209 attr += " ccw=\"FALSE\""; 00210 if (!colorPerVertex_) 00211 attr += " colorPerVertex=\"FALSE\""; 00212 if (!normalPerVertex_) 00213 attr += " normalPerVertex=\"FALSE\""; 00214 if (!solid_) 00215 attr += " solid=\"FALSE\""; 00216 00217 return attr; 00218 } 00219 00220 void X3DComposedGeometryNode::removeScenesToChildren(const MFScene &sceneList) 00221 { 00222 removeScenes(color_, sceneList); 00223 removeScenes(coord_, sceneList); 00224 removeScenes(normal_, sceneList); 00225 removeScenes(texCoord_, sceneList); 00226 } 00227 00228 void X3DComposedGeometryNode::addScenesToChildren(const MFScene &sceneList) 00229 { 00230 addScenes(color_, sceneList); 00231 addScenes(coord_, sceneList); 00232 addScenes(normal_, sceneList); 00233 addScenes(texCoord_, sceneList); 00234 }