static OT empty_value() noexcept { return OT(); }
d(AND), {m(PREFIX_SEGOVR),ES}, {m(DAA)}, d(SUB), {m(PREFIX_SEGOVR),CS}, {m(DAS)}, // 30-3F d(XOR), {m(PREFIX_SEGOVR),SS}, {m(AAA)}, d(CMP), {m(PREFIX_SEGOVR),DS}, {m(AAS)}, #undef d #define d(a)\ {m(a),eAX}, {m(a),eCX}, {m(a),eDX}, {m(a),eBX},\ {m(a),eSP}, {m(a),eBP}, {m(a),eSI}, {m(a),eDI} // 40-5F d(INC), d(DEC), d(PUSH), d(POP), #undef d // 60-6F {m(PUSHA)}, {m(POPA)}, {m(BOUND),G,M|OT(ADDR)}, {m(ARPL),E|OT(WORD),G|OT(WORD)}, {m(PREFIX_SEGOVR),FS}, {m(PREFIX_SEGOVR),GS}, {m(PREFIX_OPROVR)}, {m(PREFIX_ADROVR)}, // IMUL(G,I,E) is G=E*I {m(PUSH),I}, {m(IMUL),G,I,0,E}, {m(PUSH),I|OT(BYTE)}, {m(IMUL),G,I|OT(BYTE),0,E}, {m(INSB),Y,eDX}, {m(INS),Y,eDX}, {m(OUTSB),eDX,X}, {m(OUTS),eDX,X}, // 70-7F {m(JO),J|OT(BYTE)}, {m(JNO),J|OT(BYTE)}, {m(JB),J|OT(BYTE)}, {m(JAE),J|OT(BYTE)}, {m(JZ),J|OT(BYTE)}, {m(JNZ),J|OT(BYTE)}, {m(JBE),J|OT(BYTE)}, {m(JA),J|OT(BYTE)}, {m(JS),J|OT(BYTE)}, {m(JNS),J|OT(BYTE)}, {m(JP),J|OT(BYTE)}, {m(JNP),I|OT(BYTE)},
void Diamond::refreshDrawable() { // the primitive set may have already been refreshed (due to double-parenting) if ( !_drawableDirty ) return; // this level does not generate primitive sets if ( _level < _mesh->_minGeomLevel ) return; if ( !_hasGeometry ) { OE_WARN << "ILLEGAL: refreshPrimitiveSet called on Diamond at no-geom level " << _level << std::endl; return; } // figure out the subrange transformation. osg::Vec2f offset( 0.0, 0.0 ); double span = 1.0; const TileKey& ssaKey = _currentStateSetOwner->_key; if ( _level > _currentStateSetOwner->_level ) //_currentStateSetOwner != _targetStateSetOwner ) { span = 1.0/(double)(1 << ((_level-_currentStateSetOwner->_level)/2)); offset.x() = (_key.getExtent().xMin()-ssaKey.getExtent().xMin())/ssaKey.getExtent().width(); offset.y() = (_key.getExtent().yMin()-ssaKey.getExtent().yMin())/ssaKey.getExtent().height(); } int o = _orientation; // Start by clearing out the old primitive set: _amrDrawable->_triangles.clear(); //if ( false ) //!_isSplit ) // took this out to preserve the diamond center point. //{ // // if the diamond is not split, simply draw the two triangles. // _amrDrawable->add( new AMRTriangle( // _a[GDPARENT]->coord(), _a[GDPARENT]->vert(), offset + OT(T_GDPARENT,o) * span, // _a[QUADTREE]->coord(), _a[QUADTREE]->vert(), offset + OT(T_QUADTREE,o) * span, // _a[PARENT_R]->coord(), _a[PARENT_R]->vert(), offset + OT(T_PARENT_R,o) * span ) ); // _amrDrawable->add( new AMRTriangle( // _a[GDPARENT]->coord(), _a[GDPARENT]->vert(), offset + OT(T_GDPARENT,o) * span, // _a[PARENT_L]->coord(), _a[PARENT_L]->vert(), offset + OT(T_PARENT_L,o) * span, // _a[QUADTREE]->coord(), _a[QUADTREE]->vert(), offset + OT(T_QUADTREE,o) * span ) ); //} //else { // find this diamond's four quadtree descendants: Diamond* q0 = _c[0].valid() ? _c[0]->_c[1].get() : 0L; Diamond* q1 = _c[1].valid() ? _c[1]->_c[3].get() : 0L; Diamond* q2 = _c[2].valid() ? _c[2]->_c[1].get() : 0L; Diamond* q3 = _c[3].valid() ? _c[3]->_c[3].get() : 0L; osg::Vec2f center = osg::Vec2f(.5,.5); if ( !_c[0].valid() || !_c[0]->_isSplit ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _a[QUADTREE]->node(), offset + OT(T_QUADTREE,o) * span, _a[PARENT_R]->node(), offset + OT(T_PARENT_R,o) * span ) ); } else { if ( !q0 ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _a[QUADTREE]->node(), offset + OT(T_QUADTREE,o) * span, _c[0]->node(), offset + OT(T_CHILD_0,o) * span ) ); } if ( !q1 ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _c[0]->node(), offset + OT(T_CHILD_0,o) * span, _a[PARENT_R]->node(), offset + OT(T_PARENT_R,o) * span ) ); } } if ( !_c[1].valid() || !_c[1]->_isSplit ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _a[PARENT_R]->node(), offset + OT(T_PARENT_R,o) * span, _a[GDPARENT]->node(), offset + OT(T_GDPARENT,o) * span ) ); } else { if ( !q1 ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _a[PARENT_R]->node(), offset + OT(T_PARENT_R,o) * span, _c[1]->node(), offset + OT(T_CHILD_1,o) * span ) ); } if ( !q2 ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _c[1]->node(), offset + OT(T_CHILD_1,o) * span, _a[GDPARENT]->node(), offset + OT(T_GDPARENT,o) * span ) ); } } if ( !_c[2].valid() || !_c[2]->_isSplit ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _a[GDPARENT]->node(), offset + OT(T_GDPARENT,o) * span, _a[PARENT_L]->node(), offset + OT(T_PARENT_L,o) * span ) ); } else { if ( !q2 ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _a[GDPARENT]->node(), offset + OT(T_GDPARENT,o) * span, _c[2]->node(), offset + OT(T_CHILD_2,o) * span ) ); } if ( !q3 ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _c[2]->node(), offset + OT(T_CHILD_2,o) * span, _a[PARENT_L]->node(), offset + OT(T_PARENT_L,o) * span ) ); } } if ( !_c[3].valid() || !_c[3]->_isSplit ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _a[PARENT_L]->node(), offset + OT(T_PARENT_L,o) * span, _a[QUADTREE]->node(), offset + OT(T_QUADTREE,o) * span ) ); } else { if ( !q3 ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _a[PARENT_L]->node(), offset + OT(T_PARENT_L,o) * span, _c[3]->node(), offset + OT(T_CHILD_3,o) * span ) ); } if ( !q0 ) { _amrDrawable->add( new AMRTriangle( node(), offset + center * span, _c[3]->node(), offset + OT(T_CHILD_3,o) * span, _a[QUADTREE]->node(), offset + OT(T_QUADTREE,o) * span ) ); } } } // dirty the underlying element buffer object _drawableDirty = false; }
inline void OT(int a) { if(a>=10) OT(a/10); putchar(a%10+'0'); }