示例#1
0
void Surface::surface_commit(Resource *)
{
    m_damage = m_pending.damage;

    if (m_pending.buffer || m_pending.newlyAttached) {
        setBackBuffer(m_pending.buffer);
        m_bufferRef = QWaylandBufferRef(m_buffer);

        if (m_attacher)
            m_attacher->attach(m_bufferRef);
        emit m_waylandSurface->configure(m_bufferRef);
    }

    m_pending.buffer = 0;
    m_pending.offset = QPoint();
    m_pending.newlyAttached = false;
    m_pending.damage = QRegion();

    if (m_buffer)
        m_buffer->setCommitted();

    m_frameCallbacks << m_pendingFrameCallbacks;
    m_pendingFrameCallbacks.clear();

    emit m_waylandSurface->redraw();
}
示例#2
0
void MMSWindowClass::setAttributesFromTAFF(MMSTaffFile *tafff, string *path, bool reset_paths) {
    MMSFBColor color;

    if ((reset_paths)&&(path)&&(*path!="")) {
    	// unset my paths
    	unsetBgImagePath();
    }

	startTAFFScan
	{
        switch (attrid) {
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_alignment:
            setAlignment(getAlignmentFromString(attrval_str));
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_dx:
            setDx(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_dy:
            setDy(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_w:
            setWidth(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_h:
            setHeight(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor:
            setBgColor(MMSFBColor((unsigned int)attrval_int));
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor_a:
			color.a = color.r = color.g = color.b = 0;
            if (isBgColor()) getBgColor(color);
            color.a = attrval_int;
            setBgColor(color);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor_r:
			color.a = color.r = color.g = color.b = 0;
            if (isBgColor()) getBgColor(color);
            color.r = attrval_int;
            setBgColor(color);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor_g:
			color.a = color.r = color.g = color.b = 0;
            if (isBgColor()) getBgColor(color);
            color.g = attrval_int;
            setBgColor(color);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor_b:
			color.a = color.r = color.g = color.b = 0;
            if (isBgColor()) getBgColor(color);
            color.b = attrval_int;
            setBgColor(color);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgimage:
            if (*attrval_str)
                setBgImagePath("");
            else
                setBgImagePath((path)?*path:"");
            setBgImageName(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgimage_path:
            if (*attrval_str)
                setBgImagePath(attrval_str);
            else
                setBgImagePath((path)?*path:"");
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgimage_name:
            setBgImageName(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_opacity:
            setOpacity(attrval_int);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_fadein:
            setFadeIn((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_fadeout:
            setFadeOut((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_debug:
            setDebug((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_margin:
            setMargin(attrval_int);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_up_arrow:
            setUpArrow(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_down_arrow:
            setDownArrow(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_left_arrow:
            setLeftArrow(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_right_arrow:
            setRightArrow(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_navigate_up:
            setNavigateUp(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_navigate_down:
            setNavigateDown(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_navigate_left:
            setNavigateLeft(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_navigate_right:
            setNavigateRight(attrval_str);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_own_surface:
#ifdef __HAVE_DIRECTFB__
			if(attrval_int) {
				MMSConfigData config;
				if(config.getBackend() == MMSFB_BE_DFB) {
					cerr << "Warning: DirectFB backend does not support own_surface=true (ignored)" << endl;
					break;
				}
			}
#endif
            setOwnSurface((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_movein:
            setMoveIn(getDirectionFromString(attrval_str));
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_moveout:
            setMoveOut(getDirectionFromString(attrval_str));
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_modal:
            setModal((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_static_zorder:
            setStaticZOrder((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_always_on_top:
            setAlwaysOnTop((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_focusable:
            setFocusable((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_backbuffer:
            setBackBuffer((attrval_int) ? true : false);
            break;
		case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_initial_load:
            setInitialLoad((attrval_int) ? true : false);
            break;
		}
	}
	endTAFFScan

    if ((reset_paths)&&(path)&&(*path!="")) {
    	// set my paths
    	if (!isBgImagePath())
    		setBgImagePath(*path);
    }
}
//-----------------------------------------------------------------------------
//! 描画
//-----------------------------------------------------------------------------
void TaskFilterLensFlare::render()
{

	static const s32	SHADER_STANDARD	   = SystemShader::SHADER_FILTER;
	static const s32	SHADER_SUBTRACT	   = SystemShader::SHADER_SUBTRACT;
	static const s32	SHADER_EXPAND_BLUR = SystemShader::SHADER_EXPAND_BLUR;

	//-------------------------------------------------------------
	// (1) バックバッファからワークバッファにコピー
	// グレアの場合はぼかすので1/2バッファの縮小しておくことで
	// 後段パスが軽量化される(バイリニアで4ピクセル平均)
	//-------------------------------------------------------------
	copyToWorkTexture(SHADER_STANDARD, 0);

	// 半透明無効化
	setBlendMode(BM_NONE);
	//-------------------------------------------------------------
	// (2)高輝度の成分を抽出
	// 画像から閾値(Threshold)の分を減算
	//-------------------------------------------------------------
	s32 index = 1;
	s32 mip	  = 0;
	

	//static float threshold = 0.9f;	// タイトルで確認する時用
	static float threshold = 2.5f;
	//static float threshold = 9.1f;
	static float scale = 1000.0f;

	Controller* control = GmControlMan()->getController(1);

	if(control->GetPadState(Controller::PAD_RB)){

		threshold += 0.01f;

	}else if (control->GetPadState(Controller::PAD_LB)){
		threshold -= 0.01f;
	}

	threshold = max(0.0f, threshold);

	GmShader()->changeShader(SystemShader::SHADER_SUBTRACT);

	GmShader()->setUniform1fv("gThreshold", (GLfloat*)&threshold);
	GmShader()->setUniform1fv("scale", (GLfloat*)&scale);

	setRenderTarget(index, mip);
	//setBackBuffer();
	put(0, 0);	// texuter[0] mip=0 : SUBTRACT


	GmShader()->beginPrevShader();

	GmRender()->saveBackBuffer("レンズフレア差分");


	//-------------------------------------------------------------
	// (3) アナモルフィックレンズのゴースト作成(線対称)
	//-------------------------------------------------------------
	/*GmShader()->changeShader(SystemShader::SHADER_LENS_FLARE);

	GmShader()->bindTexture("lensColorTex", _lensColorTex->getTextureHandle(), 1, GL_TEXTURE_1D);

	GmShader()->setUniform1i("isAnamolphic", (GLint)true);

	setRenderTarget(index ^ 1, mip);
	put(index, mip);
	index ^= 1;

	GmShader()->unbindTexture(GL_TEXTURE_1D);

	GmRender()->saveBackBuffer("レンズフレア作成後");
*/

	
	

	//-------------------------------------------------------------
	// (3) 横方向ブラー&青着色
	//-------------------------------------------------------------
	//// 左右にブラーを掛けるため二回している
	//for (s32 d = 0; d<2; ++d){

	//	// 光の方向を指定
	//	f32 x = 1;
	//	f32 y = 0.0f;

	//	if(d == 1) {
	//		x = -1;
	//		//---- 一時保存しておいたテクスチャからコピー
	//		setRenderTarget(index, mip);
	//		put(_stockTexture, mip, SHADER_STANDARD);
	//	}

	//	GmShader()->changeShader(SystemShader::SHADER_GLARE);

	//	// ブラー方向設定
	//	GmShader()->setUniform1f("gAttenuation", 0.99f);

	//	// ブラー方向設定
	//	GmShader()->setUniform2fv("gDir2D", (GLfloat*)&Vector3(x, y, 0.0f));


	//	for (s32 i = 0; i<3; i++)
	//	{

	//		// ピクセルの間隔(1, 8, 64)
	//		GmShader()->setUniform1f("gStride", (GLfloat)(pow(8, (f32)i)));

	//		//---- 水平ブラー
	//		setRenderTarget(index ^ 1, mip);
	//		put(index, mip);
	//		index ^= 1;
	//	}

	//	// 元に戻す
	//	GmShader()->beginPrevShader();

	//	// 蓄積テクスチャに保存
	//	GmRender()->setRenderTarget(_accumTexture, Float2(0, 0), 0);

	//	if(d==0){
	//		glClear(GL_COLOR_BUFFER_BIT);
	//	}

	//	setBlendMode(BM_ADD_NOALPHA);
	//	put(index, mip, SHADER_STANDARD);
	//}


	// 光の方向を指定
	f32 x = 1;
	f32 y = 0.0f;

	GmShader()->changeShader(SystemShader::SHADER_ANAMOLPHIC_FLARE);

	// ブラー方向設定
	GmShader()->setUniform1f("gAttenuation", 0.98f);

	// ブラー方向設定
	GmShader()->setUniform2fv("gDir2D", (GLfloat*)&Vector3(x, y, 0.0f));


	for (s32 i = 0; i<3; i++)
	{

		// ピクセルの間隔(1, 8, 64)
		GmShader()->setUniform1f("gStride", (GLfloat)(pow(8, (f32)i)));

		//---- 水平ブラー
		setRenderTarget(index ^ 1, mip);
		put(index, mip);
		index ^= 1;
	}

	// 元に戻す
	GmShader()->beginPrevShader();

	GmRender()->saveBackBuffer("レンズフレアブラー後 1/4サイズ");

	//---- 2倍にバイリニアで拡大
	{
		GmRender()->setRenderTarget(_bilenarExpandTex[0], Float2(0, 0), 0);
		put(index, mip, SHADER_EXPAND_BLUR);
		GmRender()->saveBackBuffer("バイリニアで2倍に拡大");
		//---- 実行確認のため保存
		GmRender()->setRenderTarget(_stockTexture, Float2(0, 0), 0);
		put(_bilenarExpandTex[0], mip, SHADER_STANDARD);
		GmRender()->saveBackBuffer("バイリニアで4倍に拡大");
	}

	//---- 4点0.25フェッチでわずかにぼかしてバイリニアで拡大
	{
		static f32 offset = 0.5f;

		if (GetKeyState(VK_OEM_PLUS) & 0x80){
			offset += 0.01f;
		}
		else if (GetKeyState(VK_OEM_MINUS) & 0x80){
			offset -= 0.01f;
		}

		GmShader()->changeShader(SystemShader::SHADER_EXPAND_BLUR);
		
		GmShader()->setUniform1f("gUVOffset", offset);
		GmRender()->setRenderTarget(_stockTexture, Float2(0, 0), 0);
		put(_bilenarExpandTex[0], mip);
		GmRender()->saveBackBuffer("ストックテクスチャ");

		GmShader()->beginPrevShader();
	}

	//-------------------------------------------------------------
	// (3) 通常レンズでのフレア&HALO作成
	//-------------------------------------------------------------


	
#if 0 
	GmShader()->changeShader(SystemShader::SHADER_LENS_FLARE);
	
	GmShader()->bindTexture("lensColorTex", _lensColorTex->getTextureHandle(), 1, GL_TEXTURE_1D);

	GmShader()->setUniform1i("isAnamolphic", (GLint)true);

	setRenderTarget(index^1, mip);
	put(index, mip);
	index ^= 1;

	GmShader()->unbindTexture(GL_TEXTURE_1D);

	GmRender()->saveBackBuffer("レンズフレア作成後");

#endif
	
	//-------------------------------------------------------------
	// (4) ガウシアンブラー→縮小を繰り返し、多段バッファ生成
	//-------------------------------------------------------------
# if 0
	//---- 水平ブラー
	setRenderTarget(index ^ 1, mip);
	put(index, mip, SystemShader::SHADER_GAUSSIAN_3X3_H);
	index ^= 1;

	//---- 垂直ブラー
	setRenderTarget(index ^ 1, mip);
	put(index, mip, SystemShader::SHADER_GAUSSIAN_3X3_V);
	index ^= 1;

	while (mip<4) {

		//---- ミップ段数を一段下にコピー
		setRenderTarget(index, mip + 1);
		put(index, mip, SHADER_STANDARD);
		mip++;

		//---- 水平ブラー
		setRenderTarget(index ^ 1, mip);
		put(index, mip, SystemShader::SHADER_GAUSSIAN_3X3_H);
		index ^= 1;

		////---- 垂直ブラー
		//setRenderTarget(index ^ 1, mip);
		//put(index, mip, SystemShader::SHADER_GAUSSIAN_3X3_V);
		//index ^= 1;

	}
#endif

#define IS_DIRT_AND_BURST 0
	//-------------------------------------------------------------
	// (5) レンズ汚れ、スターバーストをつける
	//-------------------------------------------------------------
#if IS_DIRT_AND_BURST
	GmShader()->changeShader(SystemShader::SHADER_LENS_DIRT_STAR);

	Matrix	viewMatrix		= GmScene()->getViewMatrix();
	Vector3 right			=  Vector3(viewMatrix._m[0]);
	Vector3 viewDir			= -Vector3(viewMatrix._m[2]);

	float	camRot			= Vector3::dot(right, Vector3(0,0,1)) + Vector3::dot(viewDir, Vector3(0,1,0));

	Matrix	cameraRotZMat	= Matrix::rotateZ(Radian(camRot));

	static Matrix scaleBias1 = Matrix(
		2.0f, 0.0f, -1.0f, 0.0f,
		0.0f, 2.0f, -1.0f, 0.0f,
		0.0f, 0.0f,  1.0f, 0.0f,
		0.0f, 0.0f,  0.0f, 1.0f
	);
	static Matrix scaleBias2 = Matrix(
		0.5f, 0.0f, 0.5f, 0.0f,
		0.0f, 0.5f, 0.5f, 0.0f,
		0.0f, 0.0f, 1.0f, 0.0f,
		0.0f, 0.0f, 0.0f, 1.0f
	);

	Matrix lensStarMatrix = scaleBias2 * cameraRotZMat * scaleBias1;
	//Matrix lensStarMatrix = cameraRotZMat;

	GmShader()->setMatrix4x4("lensStarMatrix", 1, GL_TRUE, (GLfloat*)&lensStarMatrix);
	
	
	GmShader()->bindTexture("lensStarTex", _lensStarBurstTex->getTextureHandle(), 3);
	GmShader()->bindTexture("lensDirtTex", _lensDirtTex->getTextureHandle(), 2);
	

	// 汚れテクスチャはmip 0 でやらないとぼやけてしまうため mip 0に対して行っている
	setRenderTarget(index^1, 0);
	put(index, mip);
	index ^= 1;

	GmShader()->unbindTexture();
	GmShader()->beginPrevShader();


#endif

	//-------------------------------------------------------------
	// (6) 加算合成で全てをバックバッファに合成する
	//-------------------------------------------------------------
	setBackBuffer();

	s32	workTextureIndex = index;
	s32 mipLevel = mip;

	// 汚れフィルタを通る場合はmipLevel 0でやっているためmipLevelを変更
	if (IS_DIRT_AND_BURST == 1) {
		mipLevel		 = 0;
	}

	static bool isResult = false;

	// BACKボタンでレンズフレアのみ描画か加算合成かを切り替え
	if (control->GetPushState(Controller::PAD_BACK)){
		isResult ^= true;
	}

	if (isResult){
		setBlendMode(BM_NONE);
		//put(workTextureIndex, mipLevel, SHADER_STANDARD);
		put(_stockTexture, mipLevel, SHADER_STANDARD);
	}else{
		setBlendMode(BM_ADD_NOALPHA);
		put(_stockTexture, mipLevel, SHADER_STANDARD);
		setBlendMode(BM_NONE);
	}
	

}