void PostProcess::update(Actor* actor) { _screen = getScreenRect(*actor); OX_ASSERT(actor->_getStage()); _rt = getRTManager().get(_rt, _screen.getWidth(), _screen.getHeight(), _format); _transform = actor->computeGlobalTransform().inverted(); IVideoDriver* driver = IVideoDriver::instance; driver->setRenderTarget(_rt); Rect vp = _screen; vp.pos = Point(0, 0); driver->setViewport(vp); driver->clear(0); RenderState rs; STDMaterial* mat = STDMaterial::instance; STDRenderer* renderer = mat->getRenderer(); rs.material = mat; RectF clip = vp.cast<RectF>(); rs.clip = &clip; renderer->initCoordinateSystem(vp.getWidth(), vp.getHeight(), true); rs.transform = actor->getParent()->computeGlobalTransform(); if (!(_options._flags & PostProcessOptions::flag_fullscreen)) { AffineTransform offset; offset.identity(); offset.translate(-_screen.pos); rs.transform = rs.transform * offset; } mat->Material::render(actor, rs); mat->finish(); }
Vector2 convertPosUp(Actor* src, Actor* dest, const Vector2& pos, bool direction) { Vector2 locPos = pos; AffineTransform t; t.identity(); //t = src->getTransform(); while (src != dest && src) { t = src->getTransform() * t; src = src->getParent(); } if (direction) { t.x = 0; t.y = 0; } locPos = t.transform(locPos); return locPos; }