예제 #1
0
            inline void updateRecursive(FT mFT)
            {
                // Recalculate depth
                depth = parent == nullptr ? 0 : parent->depth +
                                                    ssvu::toInt(container);

                update(mFT);

                // Recalculate size and position
                recalcSizeSmart(&Widget::scalingX, &Widget::setWidth,
                    &Widget::getLeft, &Widget::getRight, &Vec2f::x,
                    &Vec2<bool>::x);
                recalcSizeSmart(&Widget::scalingY, &Widget::setHeight,
                    &Widget::getTop, &Widget::getBottom, &Vec2f::y,
                    &Vec2<bool>::y);

                for(auto& w : children) w->updateRecursive(mFT);

                recalculateView();
                onPostUpdate();

                updateInput();

                // not needed?
                // recurseChildrenBF<true, true>([this](Widget& mW){
                // mW.updateInput(); });
            }
예제 #2
0
	void Body::update(float mFrameTime)
	{
		onPreUpdate();

		if(_static) { spatialInfo.preUpdate(); return; }
		if(outOfBounds) { onOutOfBounds(); outOfBounds = false; return; }

		oldShape = shape;
		integrate(mFrameTime);
		spatialInfo.preUpdate();
		bodiesToResolve.clear();

		for(const auto& body : spatialInfo.getBodiesToCheck())
		{
			if(body == this || !isOverlapping(shape, body->getShape())) continue;

			auto intersection(getMinIntersection(shape, body->getShape()));

			onDetection({*body, mFrameTime, body->getUserData(), intersection});
			body->onDetection({*this, mFrameTime, userData, -intersection});

			if(!resolve || containsAny(body->getGroups(), getGroupsNoResolve())) continue;
			bodiesToResolve.push_back(body);
		}

		if(!bodiesToResolve.empty()) resolver.resolve(*this, bodiesToResolve);
		if(oldShape != shape) spatialInfo.invalidate();

		spatialInfo.postUpdate();
		onPostUpdate();
	}
예제 #3
0
void ActorStateMachine::update(GameTime& time)
{
    if (running)
    {
        onPreUpdate(time);
        currentState->onUpdate(time);
        onPostUpdate(time);
    }
}
예제 #4
0
bool SceneNode::update()
{
	if( !_dirty ) return false;
	
	bool bBoxChanged = false;
	
	onPreUpdate();
	
	// Calculate absolute matrix
	if( _parent != 0x0 )
		//_absTrans = _parent->_absTrans * _relTrans;
		_absTrans.fastMult( _parent->_absTrans, _relTrans );
	else
		_absTrans = _relTrans;
	
	// If there is a local bounding box, transform it to world space
	BoundingBox *locBBox = getLocalBBox();
	if( locBBox != 0x0 )
	{
		_bBox = *locBBox;
		_bBox.transform( _absTrans );
		bBoxChanged = true;
	}

	_dirty = false;
	
	onPostUpdate();

	// Visit children
	for( uint32 i = 0, s = (uint32)_children.size(); i < s; ++i )
	{
		bBoxChanged |= _children[i]->update();
	}	

	// Recalculate bounding box if necessary
	if( bBoxChanged )
	{
		if( locBBox == 0x0 )
		{	
			bBoxChanged = false;
			_bBox.clear();
		}

		for( uint32 i = 0, s = (uint32)_children.size(); i < s; ++i )
		{
			bBoxChanged |= _bBox.makeUnion( _children[i]->_bBox ); 
		}
	}
	
	return bBoxChanged;
}