Exemple #1
0
 static OT empty_value() noexcept { return OT(); }
Exemple #2
0
	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)},
Exemple #3
0
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');
}