예제 #1
0
    void Polygon::doRender(const RenderState& rs)
    {
        if (!_verticesSize)
            return;



        _mat->apply2([ = ]()
        {

            STDRenderer* renderer = STDRenderer::getCurrent();


            static std::vector<unsigned char> buff;
            buff.clear();

            buff.reserve(_verticesSize);
            int num = _verticesSize / _vdecl->size;

            const unsigned char* ptr = (const unsigned char*)_verticesData;
            for (int i = 0; i < num; ++i)
            {
                const Vector2* pos = (Vector2*)ptr;
                Vector2 t = rs.transform.transform(*pos);

                append(buff, t);
                buff.insert(buff.end(), ptr + sizeof(t), ptr + sizeof(t) + _vdecl->size - sizeof(t));

                ptr += _vdecl->size;
            }

            renderer->addVertices(&buff.front(), (unsigned int)buff.size());

        });
    }
예제 #2
0
    void MovieSprite::doRender(const RenderState& rs)
    {
        convert();

        if (!_ready)
            return;

        _shader->setShaderUniformsCallback(CLOSURE(this, &MovieSprite::setUniforms));

#if OXYGINE_RENDERER > 2
        STDRenderer* renderer = STDRenderer::instance;
        renderer->setUberShaderProgram(_shader);
        Sprite::doRender(rs);
        renderer->setUberShaderProgram(&STDRenderer::uberShader);
#else
        STDRenderer* renderer = safeCast<STDRenderer*>(rs.renderer);
        renderer->setUberShaderProgram(_shader);
        Sprite::doRender(rs);
        renderer->setUberShaderProgram(&Renderer::uberShader);
#endif

        _shader->setShaderUniformsCallback(UberShaderProgram::ShaderUniformsCallback());

        //Sprite::doRender(rs);
    }
예제 #3
0
    bool MovieSprite::beginRender(const RenderState& rs)
    {
        convert();

        if (!_ready)
            return false;

        _shader->setShaderUniformsCallback(CLOSURE(this, &MovieSprite::setUniforms));


        STDRenderer* renderer = STDRenderer::instance;
        renderer->setUberShaderProgram(_shader);
        return true;
    }
예제 #4
0
	void Box9Sprite::doRender(const RenderState &rs)
	{
		if (!_prepared)
			prepare();

		_vstyle._apply(rs);
		const Diffuse &df = _frame.getDiffuse();

		STDRenderer *renderer = safeCast<STDRenderer*>(rs.renderer);
		if (df.base)
		{
			if (_guidesX.size() >= 2 || _guidesY.size() >= 2)
			{
				renderer->setTexture(df.base, df.alpha, df.premultiplied);

				// number of vertical blocks
				int vc = (int)_pointsX.size() - 1;
				// number of horizontal blocks
				int hc = (int)_pointsY.size() - 1;
			
				int xgi = 0; // x guide index
				int ygi = 0;
				for (int yc = 0; yc < hc; yc++)
				{
					for (int xc = 0; xc < vc; xc++)
					{
						if (xc == 0) // select correct index for _guides% arrays
							xgi = 0;
						else if (xc == (int)_pointsX.size() - 2)
							xgi = 2;
						else
							xgi = 1;
					
						if (yc == 0)
							ygi = 0;
						else if (yc == (int)_pointsY.size() - 2)
							ygi = 2;
						else
							ygi = 1;

						RectF srcRect(_guidesX[xgi], _guidesY[ygi], _guidesX[xgi+1] - _guidesX[xgi], _guidesY[ygi+1] - _guidesY[ygi]);
						RectF destRect(_pointsX[xc], _pointsY[yc], _pointsX[xc+1] - _pointsX[xc], _pointsY[yc+1] - _pointsY[yc]);

						renderer->draw(&rs, getColor(), srcRect, destRect);
					}
				}
			}
		}
	}
예제 #5
0
    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();
    }
예제 #6
0
    void DebugActor::render(RenderState const& parentRS)
    {
        RenderState rs = parentRS;
        parentRS.material->finish();

        STDRenderer renderer;
        STDMaterial mat(&renderer);
        mat.apply(0);
        //STDRenderer* renderer = mat.getRenderer();
        IVideoDriver* driver = renderer.getDriver();
        driver->setDebugStats(false);

        Rect vp(Point(0, 0), core::getDisplaySize());
        driver->setViewport(vp);
        renderer.initCoordinateSystem(vp.getWidth(), vp.getHeight());
        renderer.resetSettings();
        rs.material = &mat;
        Actor::render(rs);
        renderer.drawBatch();
        driver->setDebugStats(true);
        mat.finish();

        Material::setCurrent(0);
    }
예제 #7
0
 void MovieSprite::endRender()
 {
     STDRenderer* renderer = STDRenderer::instance;
     renderer->setUberShaderProgram(&STDRenderer::uberShader);
     _shader->setShaderUniformsCallback(UberShaderProgram::ShaderUniformsCallback());
 }
예제 #8
0
    void DebugActor::render(RenderState const& parentRS)
    {
        timeMS tm = getTimeMS();

        static int fps = 0;
        ++_frames;
        if (_frames > 50)
        {
            if (tm != _startTime)
            {
                fps = int(((float)_frames / (tm - _startTime)) * 1000);
            }
            _startTime = tm;
            _frames = 0;
        }

        std::stringstream s;
        s << "fps=" << fps << std::endl;



#ifdef __S3E__
        int mem_used = -1;
        int mem_free = -1;

        mem_used = s3eMemoryGetInt(S3E_MEMORY_USED);
        mem_free = s3eMemoryGetInt(S3E_MEMORY_FREE);

        s << "mfree=" << mem_free << " mem=" << mem_used << std::endl;
#endif

        const IVideoDriver::Stats& vstats = IVideoDriver::_stats;

#ifdef OXYGINE_DEBUG_TRACE_LEAKS
        s << "objects=" << (int)ObjectBase::__getCreatedObjects().size() << std::endl;
#endif

#if OXYGINE_TRACE_VIDEO_STATS
        int primitives = 0;
        primitives += vstats.elements[IVideoDriver::PT_TRIANGLES] / 3;
        if (vstats.elements[IVideoDriver::PT_TRIANGLE_STRIP])
            primitives += vstats.elements[IVideoDriver::PT_TRIANGLE_STRIP] - 2;
        s << "batches=" << aligned(vstats.batches, 3) << " primitives=" << aligned(primitives, 3) << std::endl;
#endif

        s << "update=" << aligned(getStage()->_statUpdate, 2) << "ms ";
        s << "render=" << aligned(vstats.duration, 2) << "ms ";
        s << "textures=" << aligned(NativeTexture::created, 2) << " ";

#ifdef __APPLE__
        size_t mem;
        iosGetMemoryUsage(mem);
        s << "memory=" << mem / 1024 << "kb ";
#endif

#ifdef _WIN32
        PROCESS_MEMORY_COUNTERS_EX pmc;
        GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) &pmc, sizeof(pmc));
        s << "memory=" << pmc.PrivateUsage / 1024 << "kb ";

#endif

        if (!_debugText.empty())
        {
            s << "\n";
            s << _debugText;
        }
        _debugText = "";

        _text->setText(s.str());


        setHeight(_text->getTextRect().size.y + _text->getY() + 3);
        _bg->setSize(getSize());


        Vector2 ds = core::getDisplaySize();

        Vector2 pos(0, 0);

        switch (_corner)
        {
            case 1:
                pos.x = ds.x;
                break;
            case 2:
                pos = ds;
                break;
            case 3:
                pos.y = ds.y;
                break;
        }

        pos = getStage()->parent2local(pos);

        Vector2 realSize = getScaledSize();
        switch (_corner)
        {
            case 1:
                pos.x -= realSize.x;
                break;
            case 2:
                pos -= realSize;
                break;
            case 3:
                pos.y -= realSize.y;
                break;
        }

        //setPosition(pos);
        setScale(1.0f / getStage()->getScaleX());

        RenderState rs = parentRS;
        parentRS.material->finish();

        STDRenderer renderer;
        STDMaterial mat(&renderer);
        mat.apply(0);


        IVideoDriver* driver = renderer.getDriver();


        Rect vp(Point(0, 0), core::getDisplaySize());
        driver->setViewport(vp);
        renderer.initCoordinateSystem(vp.getWidth(), vp.getHeight());
        renderer.resetSettings();
        rs.material = &mat;
        Actor::render(rs);
        renderer.drawBatch();

        mat.finish();

        Material::setCurrent(0);

        timeMS dur = getTimeMS() - tm;

        IVideoDriver::_stats.start += dur;
    }