| 164 | | // front face |
| 165 | | vertices->push_back(origin); |
| 166 | | vertices->push_back(origin+dx); |
| 167 | | vertices->push_back(origin+dx+dz); |
| 168 | | vertices->push_back(origin+dz); |
| 169 | | normals->push_back(ny); |
| 170 | | normals->push_back(ny); |
| 171 | | normals->push_back(ny); |
| 172 | | normals->push_back(ny); |
| 173 | | |
| 174 | | // front face |
| 175 | | vertices->push_back(origin+dy); |
| 176 | | vertices->push_back(origin+dy+dz); |
| 177 | | vertices->push_back(origin+dy+dx+dz); |
| 178 | | vertices->push_back(origin+dy+dx); |
| 179 | | normals->push_back(py); |
| 180 | | normals->push_back(py); |
| 181 | | normals->push_back(py); |
| 182 | | normals->push_back(py); |
| 183 | | |
| 184 | | // left face |
| 185 | | vertices->push_back(origin+dy); |
| 186 | | vertices->push_back(origin); |
| 187 | | vertices->push_back(origin+dz); |
| 188 | | vertices->push_back(origin+dy+dz); |
| 189 | | normals->push_back(nx); |
| 190 | | normals->push_back(nx); |
| 191 | | normals->push_back(nx); |
| 192 | | normals->push_back(nx); |
| 193 | | |
| 194 | | // right face |
| 195 | | vertices->push_back(origin+dx+dy); |
| 196 | | vertices->push_back(origin+dx+dy+dz); |
| 197 | | vertices->push_back(origin+dx+dz); |
| 198 | | vertices->push_back(origin+dx); |
| 199 | | normals->push_back(px); |
| 200 | | normals->push_back(px); |
| 201 | | normals->push_back(px); |
| 202 | | normals->push_back(px); |
| 203 | | |
| 204 | | // top face |
| 205 | | vertices->push_back(origin+dz); |
| 206 | | vertices->push_back(origin+dz+dx); |
| 207 | | vertices->push_back(origin+dz+dx+dy); |
| 208 | | vertices->push_back(origin+dz+dy); |
| 209 | | normals->push_back(pz); |
| 210 | | normals->push_back(pz); |
| 211 | | normals->push_back(pz); |
| 212 | | normals->push_back(pz); |
| 213 | | |
| 214 | | // bottom face |
| 215 | | vertices->push_back(origin); |
| 216 | | vertices->push_back(origin+dy); |
| 217 | | vertices->push_back(origin+dx+dy); |
| 218 | | vertices->push_back(origin+dx); |
| 219 | | normals->push_back(nz); |
| 220 | | normals->push_back(nz); |
| 221 | | normals->push_back(nz); |
| 222 | | normals->push_back(nz); |
| 223 | | |
| | 175 | if (mask & FRONT_FACE) |
| | 176 | { |
| | 177 | // front face |
| | 178 | vertices->push_back(origin); |
| | 179 | vertices->push_back(origin+dx); |
| | 180 | vertices->push_back(origin+dx+dz); |
| | 181 | vertices->push_back(origin+dz); |
| | 182 | normals->push_back(ny); |
| | 183 | normals->push_back(ny); |
| | 184 | normals->push_back(ny); |
| | 185 | normals->push_back(ny); |
| | 186 | } |
| | 187 | |
| | 188 | if (mask & BACK_FACE) |
| | 189 | { |
| | 190 | // back face |
| | 191 | vertices->push_back(origin+dy); |
| | 192 | vertices->push_back(origin+dy+dz); |
| | 193 | vertices->push_back(origin+dy+dx+dz); |
| | 194 | vertices->push_back(origin+dy+dx); |
| | 195 | normals->push_back(py); |
| | 196 | normals->push_back(py); |
| | 197 | normals->push_back(py); |
| | 198 | normals->push_back(py); |
| | 199 | } |
| | 200 | |
| | 201 | if (mask & LEFT_FACE) |
| | 202 | { |
| | 203 | // left face |
| | 204 | vertices->push_back(origin+dy); |
| | 205 | vertices->push_back(origin); |
| | 206 | vertices->push_back(origin+dz); |
| | 207 | vertices->push_back(origin+dy+dz); |
| | 208 | normals->push_back(nx); |
| | 209 | normals->push_back(nx); |
| | 210 | normals->push_back(nx); |
| | 211 | normals->push_back(nx); |
| | 212 | } |
| | 213 | |
| | 214 | if (mask & RIGHT_FACE) |
| | 215 | { |
| | 216 | // right face |
| | 217 | vertices->push_back(origin+dx+dy); |
| | 218 | vertices->push_back(origin+dx+dy+dz); |
| | 219 | vertices->push_back(origin+dx+dz); |
| | 220 | vertices->push_back(origin+dx); |
| | 221 | normals->push_back(px); |
| | 222 | normals->push_back(px); |
| | 223 | normals->push_back(px); |
| | 224 | normals->push_back(px); |
| | 225 | } |
| | 226 | |
| | 227 | if (mask & TOP_FACE) |
| | 228 | { |
| | 229 | // top face |
| | 230 | vertices->push_back(origin+dz); |
| | 231 | vertices->push_back(origin+dz+dx); |
| | 232 | vertices->push_back(origin+dz+dx+dy); |
| | 233 | vertices->push_back(origin+dz+dy); |
| | 234 | normals->push_back(pz); |
| | 235 | normals->push_back(pz); |
| | 236 | normals->push_back(pz); |
| | 237 | normals->push_back(pz); |
| | 238 | } |
| | 239 | |
| | 240 | if (mask & BOTTOM_FACE) |
| | 241 | { |
| | 242 | // bottom face |
| | 243 | vertices->push_back(origin); |
| | 244 | vertices->push_back(origin+dy); |
| | 245 | vertices->push_back(origin+dx+dy); |
| | 246 | vertices->push_back(origin+dx); |
| | 247 | normals->push_back(nz); |
| | 248 | normals->push_back(nz); |
| | 249 | normals->push_back(nz); |
| | 250 | normals->push_back(nz); |
| | 251 | } |
| | 252 | |
| | 256 | } |
| | 257 | |
| | 258 | class SwitchHandler : public osgGA::GUIEventHandler |
| | 259 | { |
| | 260 | public: |
| | 261 | |
| | 262 | SwitchHandler(): |
| | 263 | _childNum(0), |
| | 264 | _frameNum(0) {} |
| | 265 | |
| | 266 | virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv) |
| | 267 | { |
| | 268 | osg::Switch* sw = dynamic_cast<osg::Switch*>(object); |
| | 269 | if (!sw) return false; |
| | 270 | |
| | 271 | if (nv->getFrameStamp()) |
| | 272 | { |
| | 273 | if (nv->getFrameStamp()->getFrameNumber()==_frameNum) return false; |
| | 274 | _frameNum = nv->getFrameStamp()->getFrameNumber(); |
| | 275 | } |
| | 276 | |
| | 277 | switch(ea.getEventType()) |
| | 278 | { |
| | 279 | case(osgGA::GUIEventAdapter::KEYDOWN): |
| | 280 | { |
| | 281 | if (ea.getKey()=='n') |
| | 282 | { |
| | 283 | |
| | 284 | ++_childNum; |
| | 285 | if (_childNum >= sw->getNumChildren()) _childNum = 0; |
| | 286 | |
| | 287 | osg::notify(osg::NOTICE)<<"selecting "<<_childNum<<std::endl; |
| | 288 | |
| | 289 | sw->setSingleChildOn(_childNum); |
| | 290 | return true; |
| | 291 | } |
| | 292 | break; |
| | 293 | } |
| | 294 | default: |
| | 295 | break; |
| | 296 | } |
| | 297 | return false; |
| | 298 | } |
| | 299 | |
| | 300 | protected: |
| | 301 | |
| | 302 | virtual ~SwitchHandler() {} |
| | 303 | unsigned int _childNum; |
| | 304 | int _frameNum; |
| | 305 | |
| | 306 | }; |
| | 307 | |
| | 308 | osg::Node* createTestModel() |
| | 309 | { |
| | 310 | osg::Switch* sw = new osg::Switch; |
| | 311 | sw->setEventCallback(new SwitchHandler); |
| | 312 | |
| | 313 | sw->addChild(createCube(FRONT_FACE), true); |
| | 314 | sw->addChild(createCube(FRONT_FACE | BACK_FACE), false); |
| | 315 | sw->addChild(createCube(FRONT_FACE | BACK_FACE | LEFT_FACE), false); |
| | 316 | sw->addChild(createCube(FRONT_FACE | BACK_FACE | LEFT_FACE | RIGHT_FACE), false); |
| | 317 | sw->addChild(createCube(FRONT_FACE | BACK_FACE | LEFT_FACE | RIGHT_FACE | TOP_FACE), false); |
| | 318 | sw->addChild(createCube(FRONT_FACE | BACK_FACE | LEFT_FACE | RIGHT_FACE | TOP_FACE | BOTTOM_FACE), false); |
| | 319 | |
| | 320 | return sw; |